diff --git a/Jenkinsfile2 b/Jenkinsfile2 index 165d203a22..f308db759d 100644 --- a/Jenkinsfile2 +++ b/Jenkinsfile2 @@ -424,7 +424,7 @@ pipeline { echo "${WKDIR}/restore.sh -p ${BRANCH_NAME} -n ${BUILD_ID} -c {container name}" } catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { - timeout(time: 130, unit: 'MINUTES'){ + timeout(time: 150, unit: 'MINUTES'){ pre_test() script { sh ''' diff --git a/deps/arm/dm_static/libdmodule.a b/deps/arm/dm_static/libdmodule.a index f71b97dc2b..dd2afa9037 100644 Binary files a/deps/arm/dm_static/libdmodule.a and b/deps/arm/dm_static/libdmodule.a differ diff --git a/deps/darwin/arm/dm_static/libdmodule.a b/deps/darwin/arm/dm_static/libdmodule.a index 22d14a84d0..d1f37cf4f4 100644 Binary files a/deps/darwin/arm/dm_static/libdmodule.a and b/deps/darwin/arm/dm_static/libdmodule.a differ diff --git a/deps/darwin/x64/dm_static/libdmodule.a b/deps/darwin/x64/dm_static/libdmodule.a index 9853fe6571..da082d9224 100644 Binary files a/deps/darwin/x64/dm_static/libdmodule.a and b/deps/darwin/x64/dm_static/libdmodule.a differ diff --git a/deps/win/x64/dm_static/dmodule.lib b/deps/win/x64/dm_static/dmodule.lib index 52b8cd407d..36ce1d81d3 100644 Binary files a/deps/win/x64/dm_static/dmodule.lib and b/deps/win/x64/dm_static/dmodule.lib differ diff --git a/deps/x86/dm_static/libdmodule.a b/deps/x86/dm_static/libdmodule.a index 348568f8d1..c7286f316d 100644 Binary files a/deps/x86/dm_static/libdmodule.a and b/deps/x86/dm_static/libdmodule.a differ diff --git a/docs/en/12-taos-sql/10-function.md b/docs/en/12-taos-sql/10-function.md index 340a3e917b..18c7ffc345 100644 --- a/docs/en/12-taos-sql/10-function.md +++ b/docs/en/12-taos-sql/10-function.md @@ -483,6 +483,91 @@ return_timestamp: { - The precision of the returned timestamp is same as the precision set for the current data base in use - return_timestamp indicates whether the returned value type is TIMESTAMP or not. If this parameter set to 1, function will return TIMESTAMP type. Otherwise function will return BIGINT type. If parameter is omitted, default return value type is BIGINT. +#### TO_CHAR + +```sql +TO_CHAR(ts, format_str_literal) +``` + +**Description**: Convert a ts column to string as the format specified + +**Return value type**: VARCHAR + +**Applicable column types**: TIMESTAMP + +**Nested query**: It can be used in both the outer query and inner query in a nested query. + +**Applicable table types**: standard tables and supertables + +**Supported Formats** + +| **Format** | **Comment**| **example** | +| --- | --- | --- | +|AM,am,PM,pm| Meridiem indicator(without periods) | 07:00:00am| +|A.M.,a.m.,P.M.,p.m.| Meridiem indicator(with periods)| 07:00:00a.m.| +|YYYY,yyyy|year, 4 or more digits| 2023-10-10| +|YYY,yyy| year, last 3 digits| 023-10-10| +|YY,yy| year, last 2 digits| 23-10-10| +|Y,y| year, last digit| 3-10-10| +|MONTH|full uppercase of month| 2023-JANUARY-01| +|Month|full capitalized month| 2023-January-01| +|month|full lowercase of month| 2023-january-01| +|MON| abbreviated uppercase of month(3 char)| JAN, SEP| +|Mon| abbreviated capitalized month| Jan, Sep| +|mon|abbreviated lowercase of month| jan, sep| +|MM,mm|month number 01-12|2023-01-01| +|DD,dd|month day, 01-31|| +|DAY|full uppercase of week day|MONDAY| +|Day|full capitalized week day|Monday| +|day|full lowercase of week day|monday| +|DY|abbreviated uppercase of week day|MON| +|Dy|abbreviated capitalized week day|Mon| +|dy|abbreviated lowercase of week day|mon| +|DDD|year day, 001-366|| +|D,d|week day number, 1-7, Sunday(1) to Saturday(7)|| +|HH24,hh24|hour of day, 00-23|2023-01-30 23:59:59| +|hh12,HH12, hh, HH| hour of day, 01-12|2023-01-30 12:59:59PM| +|MI,mi|minute, 00-59|| +|SS,ss|second, 00-59|| +|MS,ms|milli second, 000-999|| +|US,us|micro second, 000000-999999|| +|NS,ns|nano second, 000000000-999999999|| +|TZH,tzh|time zone hour|2023-01-30 11:59:59PM +08| + +**More explanations**: +- The output format of `Month`, `Day` are left aligined, like`2023-OCTOBER -01`, `2023-SEPTEMBER-01`, `September` is the longest, no paddings. Week days are slimilar. +- When `ms`,`us`,`ns` are used in `to_char`, like `to_char(ts, 'yyyy-mm-dd hh:mi:ss.ms.us.ns')`, The time of `ms`,`us`,`ns` corresponds to the same fraction seconds. When ts is `1697182085123`, the output of `ms` is `123`, `us` is `123000`, `ns` is `123000000`. +- If we want to output some characters of format without converting, surround it with double quotes. `to_char(ts, 'yyyy-mm-dd "is formated by yyyy-mm-dd"')`. If want to output double quotes, add a back slash before double quote, like `to_char(ts, '\"yyyy-mm-dd\"')` will output `"2023-10-10"`. +- For formats that output digits, the uppercase and lowercase formats are the same. +- It's recommended to put time zone in the format, if not, the default time zone zone will be that in server or client. + +#### TO_TIMESTAMP + +```sql +TO_TIMESTAMP(ts_str_literal, format_str_literal) +``` + +**Description**: Convert a formated timestamp string to a timestamp + +**Return value type**: TIMESTAMP + +**Applicable column types**: VARCHAR + +**Nested query**: It can be used in both the outer query and inner query in a nested query. + +**Applicable table types**: standard tables and supertables + +**Supported Formats**: The same as `TO_CHAR`. + +**More explanations**: +- When `ms`, `us`, `ns` are used in `to_timestamp`, if multi of them are specified, the results are accumulated. For example, `to_timestamp('2023-10-10 10:10:10.123.000456.000000789', 'yyyy-mm-dd hh:mi:ss.ms.us.ns')` will output the timestamp of `2023-10-10 10:10:10.123456789`. +- The uppercase or lowercase of `MONTH`, `MON`, `DAY`, `DY` and formtas that output digits have same effect when used in `to_timestamp`, like `to_timestamp('2023-JANUARY-01', 'YYYY-month-dd')`, `month` can be replaced by `MONTH`, or `month`. The cases are ignored. +- If multi times are specified for one component, the previous will be overwritten. Like `to_timestamp('2023-22-10-10', 'yyyy-yy-MM-dd')`, the output year will be `2022`. +- To avoid unexpected time zone used during the convertion, it's recommended to put time zone in the ts string, e.g. '2023-10-10 10:10:10+08'. If time zone not specified, default will be that in server or client. +- The default timestamp if some components are not specified will be: `1970-01-01 00:00:00` with specified or default local timezone. +- If `AM` or `PM` is specified in formats, the Hour must between `1-12`. +- In some cases, `to_timestamp` can convert correctly even the format and the timestamp string are not totally matched. Like `to_timetamp('200101/2', 'yyyyMM1/dd')`, the digit `1` in format string are ignored, and the output timestsamp is `2001-01-02 00:00:00`. Spaces and tabs in formats and tiemstamp string are also ignored automatically. + ### Time and Date Functions diff --git a/docs/zh/12-taos-sql/10-function.md b/docs/zh/12-taos-sql/10-function.md index 8b87a18e54..4371124623 100644 --- a/docs/zh/12-taos-sql/10-function.md +++ b/docs/zh/12-taos-sql/10-function.md @@ -483,6 +483,91 @@ return_timestamp: { - 返回的时间戳精度与当前 DATABASE 设置的时间精度一致。 - return_timestamp 指定函数返回值是否为时间戳类型,设置为1时返回 TIMESTAMP 类型,设置为0时返回 BIGINT 类型。如不指定缺省返回 BIGINT 类型。 +#### TO_CHAR + +```sql +TO_CHAR(ts, format_str_literal) +``` + +**功能说明**: 将timestamp类型按照指定格式转换为字符串 + +**返回结果数据类型**: VARCHAR + +**应用字段**: TIMESTAMP + +**嵌套子查询支持**: 适用于内层查询和外层查询 + +**适用于**: 表和超级表 + +**支持的格式** + +| **格式** | **说明**| **例子** | +| --- | --- | --- | +|AM,am,PM,pm| 无点分隔的上午下午 | 07:00:00am| +|A.M.,a.m.,P.M.,p.m.| 有点分隔的上午下午| 07:00:00a.m.| +|YYYY,yyyy|年, 4个及以上数字| 2023-10-10| +|YYY,yyy| 年, 最后3位数字| 023-10-10| +|YY,yy| 年, 最后2位数字| 23-10-10| +|Y,y|年, 最后一位数字| 3-10-10| +|MONTH|月, 全大写| 2023-JANUARY-01| +|Month|月, 首字母大写| 2023-January-01| +|month|月, 全小写| 2023-january-01| +|MON| 月, 缩写, 全大写(三个字符)| JAN, SEP| +|Mon| 月, 缩写, 首字母大写| Jan, Sep| +|mon|月, 缩写, 全小写| jan, sep| +|MM,mm|月, 数字 01-12|2023-01-01| +|DD,dd|月日, 01-31|| +|DAY|周日, 全大写|MONDAY| +|Day|周日, 首字符大写|Monday| +|day|周日, 全小写|monday| +|DY|周日, 缩写, 全大写|MON| +|Dy|周日, 缩写, 首字符大写|Mon| +|dy|周日, 缩写, 全小写|mon| +|DDD|年日, 001-366|| +|D,d|周日, 数字, 1-7, Sunday(1) to Saturday(7)|| +|HH24,hh24|小时, 00-23|2023-01-30 23:59:59| +|hh12,HH12, hh, HH| 小时, 01-12|2023-01-30 12:59:59PM| +|MI,mi|分钟, 00-59|| +|SS,ss|秒, 00-59|| +|MS,ms|毫秒, 000-999|| +|US,us|微秒, 000000-999999|| +|NS,ns|纳秒, 000000000-999999999|| +|TZH,tzh|时区小时|2023-01-30 11:59:59PM +08| + +**使用说明**: +- `Month`, `Day`等的输出格式是左对齐的, 右侧添加空格, 如`2023-OCTOBER -01`, `2023-SEPTEMBER-01`, 9月是月份中英文字母数最长的, 因此9月没有空格. 星期类似. +- 使用`ms`, `us`, `ns`时, 以上三种格式的输出只在精度上不同, 比如ts为 `1697182085123`, `ms` 的输出为 `123`, `us` 的输出为 `123000`, `ns` 的输出为 `123000000`. +- 时间格式中无法匹配规则的内容会直接输出. 如果想要在格式串中指定某些能够匹配规则的部分不做转换, 可以使用双引号, 如`to_char(ts, 'yyyy-mm-dd "is formated by yyyy-mm-dd"')`. 如果想要输出双引号, 那么在双引号之前加一个反斜杠, 如 `to_char(ts, '\"yyyy-mm-dd\"')` 将会输出 `"2023-10-10"`. +- 那些输出是数字的格式, 如`YYYY`, `DD`, 大写与小写意义相同, 即`yyyy` 和 `YYYY` 可以互换. +- 推荐在时间格式中带时区信息,如果不带则默认输出的时区为服务端或客户端所配置的时区. + +#### TO_TIMESTAMP + +```sql +TO_TIMESTAMP(ts_str_literal, format_str_literal) +``` + +**功能说明**: 将字符串按照指定格式转化为时间戳. + +**返回结果数据类型**: TIMESTAMP + +**应用字段**: VARCHAR + +**嵌套子查询支持**: 适用于内层查询和外层查询 + +**适用于**: 表和超级表 + +**支持的格式**: 与`to_char`相同 + +**使用说明**: +- 若`ms`, `us`, `ns`同时指定, 那么结果时间戳包含上述三个字段的和. 如 `to_timestamp('2023-10-10 10:10:10.123.000456.000000789', 'yyyy-mm-dd hh:mi:ss.ms.us.ns')` 输出是 `2023-10-10 10:10:10.123456789`. +- `MONTH`, `MON`, `DAY`, `DY` 以及其他输出为数字的格式的大小写意义相同, 如 `to_timestamp('2023-JANUARY-01', 'YYYY-month-dd')`, `month`可以被替换为`MONTH` 或者`Month`. +- 如果同一字段被指定了多次, 那么前面的指定将会被覆盖. 如 `to_timestamp('2023-22-10-10', 'yyyy-yy-MM-dd')`, 输出年份是`2022`. +- 为避免转换时使用了非预期的时区,推荐在时间中携带时区信息,例如'2023-10-10 10:10:10+08',如果未指定时区则默认时区为服务端或客户端指定的时区。 +- 如果没有指定完整的时间,那么默认时间值为指定或默认时区的 `1970-01-01 00:00:00`, 未指定部分使用该默认值中的对应部分. +- 如果格式串中有`AM`, `PM`等, 那么小时必须是12小时制, 范围必须是01-12. +- `to_timestamp`转换具有一定的容错机制, 在格式串和时间戳串不完全对应时, 有时也可转换, 如: `to_timestamp('200101/2', 'yyyyMM1/dd')`, 格式串中多出来的1会被丢弃. 格式串与时间戳串中多余的空格字符(空格, tab等)也会被 自动忽略. 如`to_timestamp(' 23 年 - 1 月 - 01 日 ', 'yy 年-MM月-dd日')` 可以被成功转换. 虽然`MM`等字段需要两个数字对应(只有一位时前面补0), 在`to_timestamp`时, 一个数字也可以成功转换. + ### 时间和日期函数 diff --git a/include/client/taos.h b/include/client/taos.h index f75a84baa8..45dc85f6d9 100644 --- a/include/client/taos.h +++ b/include/client/taos.h @@ -338,8 +338,11 @@ typedef struct tmq_raw_data { DLL_EXPORT int32_t tmq_get_raw(TAOS_RES *res, tmq_raw_data *raw); DLL_EXPORT int32_t tmq_write_raw(TAOS *taos, tmq_raw_data raw); DLL_EXPORT int taos_write_raw_block(TAOS *taos, int numOfRows, char *pData, const char *tbname); +DLL_EXPORT int taos_write_raw_block_with_reqid(TAOS *taos, int numOfRows, char *pData, const char *tbname, int64_t reqid); DLL_EXPORT int taos_write_raw_block_with_fields(TAOS *taos, int rows, char *pData, const char *tbname, TAOS_FIELD *fields, int numFields); +DLL_EXPORT int taos_write_raw_block_with_fields_with_reqid(TAOS *taos, int rows, char *pData, const char *tbname, + TAOS_FIELD *fields, int numFields, int64_t reqid); DLL_EXPORT void tmq_free_raw(tmq_raw_data raw); // Returning null means error. Returned result need to be freed by tmq_free_json_meta diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 3e29703070..1d0da9e150 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -195,7 +195,8 @@ extern int64_t tsWalFsyncDataSizeLimit; // internal extern int32_t tsTransPullupInterval; extern int32_t tsMqRebalanceInterval; -extern int32_t tsStreamCheckpointTickInterval; +extern int32_t tsStreamCheckpointInterval; +extern float tsSinkDataRate; extern int32_t tsStreamNodeCheckInterval; extern int32_t tsTtlUnit; extern int32_t tsTtlPushIntervalSec; @@ -204,9 +205,6 @@ extern int32_t tsTrimVDbIntervalSec; extern int32_t tsGrantHBInterval; extern int32_t tsUptimeInterval; -extern int32_t tsRpcRetryLimit; -extern int32_t tsRpcRetryInterval; - extern bool tsDisableStream; extern int64_t tsStreamBufferSize; extern bool tsFilterScalarMode; diff --git a/include/common/tgrant.h b/include/common/tgrant.h index cfc6c13c48..f06fca8014 100644 --- a/include/common/tgrant.h +++ b/include/common/tgrant.h @@ -51,11 +51,7 @@ typedef enum { } EGrantType; int32_t grantCheck(EGrantType grant); -#ifndef TD_GRANT_OPTIMIZE -int32_t grantAlterActiveCode(const char* old, const char* newer, char* out, int8_t type); -#else int32_t grantAlterActiveCode(int32_t did, const char* old, const char* newer, char* out, int8_t type); -#endif #ifndef GRANTS_CFG #ifdef TD_ENTERPRISE diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 18b10a1749..07eb8a461a 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -451,7 +451,7 @@ typedef struct SRetention { int8_t keepUnit; } SRetention; -#define RETENTION_VALID(r) (((r)->freq > 0) && ((r)->keep > 0)) +#define RETENTION_VALID(l, r) ((((l) == 0 && (r)->freq >= 0) || ((r)->freq > 0)) && ((r)->keep > 0)) #pragma pack(push, 1) @@ -1568,6 +1568,7 @@ typedef struct { typedef struct { int32_t id; int8_t isMnode; + int8_t offlineReason; SEp ep; char active[TSDB_ACTIVE_KEY_LEN]; char connActive[TSDB_CONN_ACTIVE_KEY_LEN]; diff --git a/include/common/ttime.h b/include/common/ttime.h index 37e3045817..306b5105d0 100644 --- a/include/common/ttime.h +++ b/include/common/ttime.h @@ -90,6 +90,34 @@ int32_t convertStringToTimestamp(int16_t type, char* inputData, int64_t timePrec void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t ts, int32_t precision); +struct STm { + struct tm tm; + int64_t fsec; // in NANOSECOND +}; + +int32_t taosTs2Tm(int64_t ts, int32_t precision, struct STm* tm); +int32_t taosTm2Ts(struct STm* tm, int64_t* ts, int32_t precision); + +/// @brief convert a timestamp to a formatted string +/// @param format the timestamp format, must null terminated +/// @param [in,out] formats the formats array pointer generated. Shouldn't be NULL. +/// If (*formats == NULL), [format] will be used and [formats] will be updated to the new generated +/// formats array; If not NULL, [formats] will be used instead of [format] to skip parse formats again. +/// @param out output buffer, should be initialized by memset +/// @notes remember to free the generated formats +void taosTs2Char(const char* format, SArray** formats, int64_t ts, int32_t precision, char* out, int32_t outLen); +/// @brief convert a formatted timestamp string to a timestamp +/// @param format must null terminated +/// @param [in, out] formats, see taosTs2Char +/// @param tsStr must null terminated +/// @retval 0 for success, otherwise error occured +/// @notes remember to free the generated formats even when error occured +int32_t taosChar2Ts(const char* format, SArray** formats, const char* tsStr, int64_t* ts, int32_t precision, char* errMsg, + int32_t errMsgLen); + +void TEST_ts2char(const char* format, int64_t ts, int32_t precision, char* out, int32_t outLen); +int32_t TEST_char2ts(const char* format, int64_t* ts, int32_t precision, const char* tsStr); + #ifdef __cplusplus } #endif diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 28c6eba09b..72099aaaf2 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -246,120 +246,121 @@ #define TK_INSERT 227 #define TK_NULL 228 #define TK_NK_QUESTION 229 -#define TK_NK_ARROW 230 -#define TK_ROWTS 231 -#define TK_QSTART 232 -#define TK_QEND 233 -#define TK_QDURATION 234 -#define TK_WSTART 235 -#define TK_WEND 236 -#define TK_WDURATION 237 -#define TK_IROWTS 238 -#define TK_ISFILLED 239 -#define TK_CAST 240 -#define TK_NOW 241 -#define TK_TODAY 242 -#define TK_TIMEZONE 243 -#define TK_CLIENT_VERSION 244 -#define TK_SERVER_VERSION 245 -#define TK_SERVER_STATUS 246 -#define TK_CURRENT_USER 247 -#define TK_CASE 248 -#define TK_WHEN 249 -#define TK_THEN 250 -#define TK_ELSE 251 -#define TK_BETWEEN 252 -#define TK_IS 253 -#define TK_NK_LT 254 -#define TK_NK_GT 255 -#define TK_NK_LE 256 -#define TK_NK_GE 257 -#define TK_NK_NE 258 -#define TK_MATCH 259 -#define TK_NMATCH 260 -#define TK_CONTAINS 261 -#define TK_IN 262 -#define TK_JOIN 263 -#define TK_INNER 264 -#define TK_SELECT 265 -#define TK_NK_HINT 266 -#define TK_DISTINCT 267 -#define TK_WHERE 268 -#define TK_PARTITION 269 -#define TK_BY 270 -#define TK_SESSION 271 -#define TK_STATE_WINDOW 272 -#define TK_EVENT_WINDOW 273 -#define TK_SLIDING 274 -#define TK_FILL 275 -#define TK_VALUE 276 -#define TK_VALUE_F 277 -#define TK_NONE 278 -#define TK_PREV 279 -#define TK_NULL_F 280 -#define TK_LINEAR 281 -#define TK_NEXT 282 -#define TK_HAVING 283 -#define TK_RANGE 284 -#define TK_EVERY 285 -#define TK_ORDER 286 -#define TK_SLIMIT 287 -#define TK_SOFFSET 288 -#define TK_LIMIT 289 -#define TK_OFFSET 290 -#define TK_ASC 291 -#define TK_NULLS 292 -#define TK_ABORT 293 -#define TK_AFTER 294 -#define TK_ATTACH 295 -#define TK_BEFORE 296 -#define TK_BEGIN 297 -#define TK_BITAND 298 -#define TK_BITNOT 299 -#define TK_BITOR 300 -#define TK_BLOCKS 301 -#define TK_CHANGE 302 -#define TK_COMMA 303 -#define TK_CONCAT 304 -#define TK_CONFLICT 305 -#define TK_COPY 306 -#define TK_DEFERRED 307 -#define TK_DELIMITERS 308 -#define TK_DETACH 309 -#define TK_DIVIDE 310 -#define TK_DOT 311 -#define TK_EACH 312 -#define TK_FAIL 313 -#define TK_FILE 314 -#define TK_FOR 315 -#define TK_GLOB 316 -#define TK_ID 317 -#define TK_IMMEDIATE 318 -#define TK_IMPORT 319 -#define TK_INITIALLY 320 -#define TK_INSTEAD 321 -#define TK_ISNULL 322 -#define TK_KEY 323 -#define TK_MODULES 324 -#define TK_NK_BITNOT 325 -#define TK_NK_SEMI 326 -#define TK_NOTNULL 327 -#define TK_OF 328 -#define TK_PLUS 329 -#define TK_PRIVILEGE 330 -#define TK_RAISE 331 -#define TK_RESTRICT 332 -#define TK_ROW 333 -#define TK_SEMI 334 -#define TK_STAR 335 -#define TK_STATEMENT 336 -#define TK_STRICT 337 -#define TK_STRING 338 -#define TK_TIMES 339 -#define TK_VALUES 340 -#define TK_VARIABLE 341 -#define TK_VIEW 342 -#define TK_WAL 343 +#define TK_NK_ALIAS 230 +#define TK_NK_ARROW 231 +#define TK_ROWTS 232 +#define TK_QSTART 233 +#define TK_QEND 234 +#define TK_QDURATION 235 +#define TK_WSTART 236 +#define TK_WEND 237 +#define TK_WDURATION 238 +#define TK_IROWTS 239 +#define TK_ISFILLED 240 +#define TK_CAST 241 +#define TK_NOW 242 +#define TK_TODAY 243 +#define TK_TIMEZONE 244 +#define TK_CLIENT_VERSION 245 +#define TK_SERVER_VERSION 246 +#define TK_SERVER_STATUS 247 +#define TK_CURRENT_USER 248 +#define TK_CASE 249 +#define TK_WHEN 250 +#define TK_THEN 251 +#define TK_ELSE 252 +#define TK_BETWEEN 253 +#define TK_IS 254 +#define TK_NK_LT 255 +#define TK_NK_GT 256 +#define TK_NK_LE 257 +#define TK_NK_GE 258 +#define TK_NK_NE 259 +#define TK_MATCH 260 +#define TK_NMATCH 261 +#define TK_CONTAINS 262 +#define TK_IN 263 +#define TK_JOIN 264 +#define TK_INNER 265 +#define TK_SELECT 266 +#define TK_NK_HINT 267 +#define TK_DISTINCT 268 +#define TK_WHERE 269 +#define TK_PARTITION 270 +#define TK_BY 271 +#define TK_SESSION 272 +#define TK_STATE_WINDOW 273 +#define TK_EVENT_WINDOW 274 +#define TK_SLIDING 275 +#define TK_FILL 276 +#define TK_VALUE 277 +#define TK_VALUE_F 278 +#define TK_NONE 279 +#define TK_PREV 280 +#define TK_NULL_F 281 +#define TK_LINEAR 282 +#define TK_NEXT 283 +#define TK_HAVING 284 +#define TK_RANGE 285 +#define TK_EVERY 286 +#define TK_ORDER 287 +#define TK_SLIMIT 288 +#define TK_SOFFSET 289 +#define TK_LIMIT 290 +#define TK_OFFSET 291 +#define TK_ASC 292 +#define TK_NULLS 293 +#define TK_ABORT 294 +#define TK_AFTER 295 +#define TK_ATTACH 296 +#define TK_BEFORE 297 +#define TK_BEGIN 298 +#define TK_BITAND 299 +#define TK_BITNOT 300 +#define TK_BITOR 301 +#define TK_BLOCKS 302 +#define TK_CHANGE 303 +#define TK_COMMA 304 +#define TK_CONCAT 305 +#define TK_CONFLICT 306 +#define TK_COPY 307 +#define TK_DEFERRED 308 +#define TK_DELIMITERS 309 +#define TK_DETACH 310 +#define TK_DIVIDE 311 +#define TK_DOT 312 +#define TK_EACH 313 +#define TK_FAIL 314 +#define TK_FILE 315 +#define TK_FOR 316 +#define TK_GLOB 317 +#define TK_ID 318 +#define TK_IMMEDIATE 319 +#define TK_IMPORT 320 +#define TK_INITIALLY 321 +#define TK_INSTEAD 322 +#define TK_ISNULL 323 +#define TK_KEY 324 +#define TK_MODULES 325 +#define TK_NK_BITNOT 326 +#define TK_NK_SEMI 327 +#define TK_NOTNULL 328 +#define TK_OF 329 +#define TK_PLUS 330 +#define TK_PRIVILEGE 331 +#define TK_RAISE 332 +#define TK_RESTRICT 333 +#define TK_ROW 334 +#define TK_SEMI 335 +#define TK_STAR 336 +#define TK_STATEMENT 337 +#define TK_STRICT 338 +#define TK_STRING 339 +#define TK_TIMES 340 +#define TK_VALUES 341 +#define TK_VARIABLE 342 +#define TK_VIEW 343 +#define TK_WAL 344 diff --git a/include/libs/function/functionMgt.h b/include/libs/function/functionMgt.h index 48c2210f46..865f1b2295 100644 --- a/include/libs/function/functionMgt.h +++ b/include/libs/function/functionMgt.h @@ -94,6 +94,8 @@ typedef enum EFunctionType { FUNCTION_TYPE_TO_ISO8601, FUNCTION_TYPE_TO_UNIXTIMESTAMP, FUNCTION_TYPE_TO_JSON, + FUNCTION_TYPE_TO_TIMESTAMP, + FUNCTION_TYPE_TO_CHAR, // date and time function FUNCTION_TYPE_NOW = 2500, diff --git a/include/libs/scalar/scalar.h b/include/libs/scalar/scalar.h index 2e6652f860..789ba554e2 100644 --- a/include/libs/scalar/scalar.h +++ b/include/libs/scalar/scalar.h @@ -80,6 +80,8 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); int32_t toUnixtimestampFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); int32_t toJsonFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); +int32_t toTimestampFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); +int32_t toCharFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); int32_t timeDiffFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); int32_t nowFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput); diff --git a/include/libs/stream/tstream.h b/include/libs/stream/tstream.h index 629efa00b3..5e145d8fbb 100644 --- a/include/libs/stream/tstream.h +++ b/include/libs/stream/tstream.h @@ -38,16 +38,25 @@ extern "C" { #define TASK_DOWNSTREAM_READY 0x0 #define TASK_DOWNSTREAM_NOT_READY 0x1 #define TASK_DOWNSTREAM_NOT_LEADER 0x2 -#define TASK_SELF_NEW_STAGE 0x3 +#define TASK_UPSTREAM_NEW_STAGE 0x3 #define NODE_ROLE_UNINIT 0x1 #define NODE_ROLE_LEADER 0x2 #define NODE_ROLE_FOLLOWER 0x3 -typedef struct SStreamTask SStreamTask; -typedef struct SStreamQueue SStreamQueue; +#define HAS_RELATED_FILLHISTORY_TASK(_t) ((_t)->hTaskInfo.id.taskId != 0) +#define CLEAR_RELATED_FILLHISTORY_TASK(_t) \ + do { \ + (_t)->hTaskInfo.id.taskId = 0; \ + (_t)->hTaskInfo.id.streamId = 0; \ + } while (0) + +typedef struct SStreamTask SStreamTask; +typedef struct SStreamQueue SStreamQueue; +typedef struct SStreamTaskSM SStreamTaskSM; #define SSTREAM_TASK_VER 2 + enum { STREAM_STATUS__NORMAL = 0, STREAM_STATUS__STOP, @@ -58,7 +67,7 @@ enum { }; typedef enum ETaskStatus { - TASK_STATUS__NORMAL = 0, + TASK_STATUS__READY = 0, TASK_STATUS__DROPPING, TASK_STATUS__UNINIT, // not used, an placeholder TASK_STATUS__STOP, @@ -66,6 +75,7 @@ typedef enum ETaskStatus { TASK_STATUS__HALT, // pause, but not be manipulated by user command TASK_STATUS__PAUSE, // pause TASK_STATUS__CK, // stream task is in checkpoint status, no data are allowed to put into inputQ anymore + TASK_STATUS__STREAM_SCAN_HISTORY, } ETaskStatus; enum { @@ -118,6 +128,22 @@ enum { STREAM_META_OK_TO_STOP = 2, }; +typedef enum EStreamTaskEvent { + TASK_EVENT_INIT = 0x1, + TASK_EVENT_INIT_SCANHIST = 0x2, + TASK_EVENT_INIT_STREAM_SCANHIST = 0x3, + TASK_EVENT_SCANHIST_DONE = 0x4, + TASK_EVENT_STOP = 0x5, + TASK_EVENT_GEN_CHECKPOINT = 0x6, + TASK_EVENT_CHECKPOINT_DONE = 0x7, + TASK_EVENT_PAUSE = 0x8, + TASK_EVENT_RESUME = 0x9, + TASK_EVENT_HALT = 0xA, + TASK_EVENT_DROPPING = 0xB, + TASK_EVENT_SCAN_TSDB = 0xC, + TASK_EVENT_SCAN_WAL = 0xD, +} EStreamTaskEvent; + typedef struct { int8_t type; } SStreamQueueItem; @@ -155,11 +181,6 @@ typedef struct { SSDataBlock* pBlock; } SStreamRefDataBlock; -typedef struct { - int8_t type; - SSDataBlock* pBlock; -} SStreamTrigger; - typedef struct SStreamQueueNode SStreamQueueNode; struct SStreamQueueNode { @@ -215,6 +236,11 @@ typedef struct { SUseDbRsp dbInfo; } STaskDispatcherShuffle; +typedef struct { + int32_t nodeId; + SEpSet epset; +} SDownstreamTaskEpset; + typedef struct { int64_t stbUid; char stbFullName[TSDB_TABLE_FNAME_LEN]; @@ -265,14 +291,15 @@ typedef struct SCheckpointInfo { } SCheckpointInfo; typedef struct SStreamStatus { - int8_t taskStatus; - int8_t downstreamReady; // downstream tasks are all ready now, if this flag is set - int8_t schedStatus; - int8_t keepTaskStatus; - bool appendTranstateBlock; // has append the transfer state data block already, todo: remove it - int8_t pauseAllowed; // allowed task status to be set to be paused - int32_t timerActive; // timer is active - int32_t inScanHistorySentinel; + SStreamTaskSM* pSM; + int8_t taskStatus; + int8_t downstreamReady; // downstream tasks are all ready now, if this flag is set + int8_t schedStatus; + int8_t keepTaskStatus; + bool appendTranstateBlock; // has append the transfer state data block already, todo: remove it + int8_t pauseAllowed; // allowed task status to be set to be paused + int32_t timerActive; // timer is active + int32_t inScanHistorySentinel; } SStreamStatus; typedef struct SDataRange { @@ -305,15 +332,10 @@ typedef struct SDispatchMsgInfo { void* pTimer; // used to dispatch data after a given time duration } SDispatchMsgInfo; -typedef struct STaskOutputQueue { +typedef struct STaskQueue { int8_t status; SStreamQueue* queue; -} STaskOutputQueue; - -typedef struct STaskInputInfo { - int8_t status; - SStreamQueue* queue; -} STaskInputInfo; +} STaskQueue; typedef struct STaskSchedInfo { int8_t status; @@ -349,6 +371,7 @@ typedef struct SHistoryTaskInfo { int32_t tickCount; int32_t retryTimes; int32_t waitInterval; + int64_t haltVer; // offset in wal when halt the stream task } SHistoryTaskInfo; typedef struct STaskOutputInfo { @@ -361,6 +384,7 @@ typedef struct STaskOutputInfo { }; int8_t type; STokenBucket* pTokenBucket; + SArray* pDownstreamUpdateList; } STaskOutputInfo; typedef struct SUpstreamInfo { @@ -372,8 +396,8 @@ struct SStreamTask { int64_t ver; SStreamTaskId id; SSTaskBasicInfo info; - STaskOutputQueue outputq; - STaskInputInfo inputInfo; + STaskQueue outputq; + STaskQueue inputq; STaskSchedInfo schedInfo; STaskOutputInfo outputInfo; SDispatchMsgInfo msgInfo; @@ -408,38 +432,43 @@ struct SStreamTask { typedef struct STaskStartInfo { int64_t startTs; int64_t readyTs; - int32_t startedAfterNodeUpdate; + int32_t startAllTasksFlag; SHashObj* pReadyTaskSet; // tasks that are all ready for running stream processing int32_t elapsedTime; } STaskStartInfo; +typedef struct STaskUpdateInfo { + SHashObj* pTasks; + int32_t transId; +} STaskUpdateInfo; + // meta typedef struct SStreamMeta { - char* path; - TDB* db; - TTB* pTaskDb; - TTB* pCheckpointDb; - SHashObj* pTasksMap; - SArray* pTaskList; // SArray - void* ahandle; - TXN* txn; - FTaskExpand* expandFunc; - int32_t vgId; - int64_t stage; - int32_t role; - STaskStartInfo startInfo; - SRWLatch lock; - int32_t walScanCounter; - void* streamBackend; - int64_t streamBackendRid; - SHashObj* pTaskBackendUnique; - TdThreadMutex backendMutex; - SMetaHbInfo* pHbInfo; - SHashObj* pUpdateTaskSet; - int32_t numOfStreamTasks; // this value should be increased when a new task is added into the meta - int32_t numOfPausedTasks; - int32_t chkptNotReadyTasks; - int64_t rid; + char* path; + TDB* db; + TTB* pTaskDb; + TTB* pCheckpointDb; + SHashObj* pTasksMap; + SArray* pTaskList; // SArray + void* ahandle; + TXN* txn; + FTaskExpand* expandFunc; + int32_t vgId; + int64_t stage; + int32_t role; + STaskStartInfo startInfo; + SRWLatch lock; + int32_t walScanCounter; + void* streamBackend; + int64_t streamBackendRid; + SHashObj* pTaskBackendUnique; + TdThreadMutex backendMutex; + SMetaHbInfo* pHbInfo; + STaskUpdateInfo updateInfo; + int32_t numOfStreamTasks; // this value should be increased when a new task is added into the meta + int32_t numOfPausedTasks; + int32_t chkptNotReadyTasks; + int64_t rid; int64_t chkpId; SArray* chkpSaved; @@ -617,7 +646,8 @@ typedef struct STaskStatusEntry { typedef struct SStreamHbMsg { int32_t vgId; int32_t numOfTasks; - SArray* pTaskStatus; // SArray + SArray* pTaskStatus; // SArray + SArray* pUpdateNodes; // SArray, needs update the epsets in stream tasks for those nodes. } SStreamHbMsg; int32_t tEncodeStreamHbMsg(SEncoder* pEncoder, const SStreamHbMsg* pRsp); @@ -641,6 +671,7 @@ typedef struct SNodeUpdateInfo { } SNodeUpdateInfo; typedef struct SStreamTaskNodeUpdateMsg { + int32_t transId; // to identify the msg int64_t streamId; int32_t taskId; SArray* pNodeList; // SArray @@ -686,24 +717,36 @@ SStreamChildEpInfo* streamTaskGetUpstreamTaskEpInfo(SStreamTask* pTask, int32_t void streamTaskInputFail(SStreamTask* pTask); int32_t streamExecTask(SStreamTask* pTask); int32_t streamSchedExec(SStreamTask* pTask); -bool streamTaskShouldStop(const SStreamStatus* pStatus); -bool streamTaskShouldPause(const SStreamStatus* pStatus); +bool streamTaskShouldStop(const SStreamTask* pStatus); +bool streamTaskShouldPause(const SStreamTask* pStatus); bool streamTaskIsIdle(const SStreamTask* pTask); +bool streamTaskReadyToRun(const SStreamTask* pTask, char** pStatus); + +char* createStreamTaskIdStr(int64_t streamId, int32_t taskId); +ETaskStatus streamTaskGetStatus(const SStreamTask* pTask, char** pStr); +const char* streamTaskGetStatusStr(ETaskStatus status); +void streamTaskResetStatus(SStreamTask* pTask); +void streamTaskSetStatusReady(SStreamTask* pTask); void initRpcMsg(SRpcMsg* pMsg, int32_t msgType, void* pCont, int32_t contLen); -char* createStreamTaskIdStr(int64_t streamId, int32_t taskId); - // recover and fill history void streamTaskCheckDownstream(SStreamTask* pTask); -int32_t streamTaskStartScanHistory(SStreamTask* pTask); +int32_t onNormalTaskReady(SStreamTask* pTask); +int32_t onScanhistoryTaskReady(SStreamTask* pTask); + int32_t streamTaskCheckStatus(SStreamTask* pTask, int32_t upstreamTaskId, int32_t vgId, int64_t stage); int32_t streamTaskUpdateEpsetInfo(SStreamTask* pTask, SArray* pNodeList); void streamTaskResetUpstreamStageInfo(SStreamTask* pTask); bool streamTaskAllUpstreamClosed(SStreamTask* pTask); bool streamTaskSetSchedStatusWait(SStreamTask* pTask); int8_t streamTaskSetSchedStatusActive(SStreamTask* pTask); -int8_t streamTaskSetSchedStatusInActive(SStreamTask* pTask); +int8_t streamTaskSetSchedStatusInactive(SStreamTask* pTask); +int32_t streamTaskClearHTaskAttr(SStreamTask* pTask); + +int32_t streamTaskHandleEvent(SStreamTaskSM* pSM, EStreamTaskEvent event); +int32_t streamTaskOnHandleEventSuccess(SStreamTaskSM* pSM, EStreamTaskEvent event); +void streamTaskRestoreStatus(SStreamTask* pTask); int32_t streamTaskStop(SStreamTask* pTask); int32_t streamSendCheckRsp(const SStreamMeta* pMeta, const SStreamTaskCheckReq* pReq, SStreamTaskCheckRsp* pRsp, @@ -714,16 +757,11 @@ int32_t streamTaskScanHistoryDataComplete(SStreamTask* pTask); int32_t streamStartScanHistoryAsync(SStreamTask* pTask, int8_t igUntreated); bool streamHistoryTaskSetVerRangeStep2(SStreamTask* pTask, int64_t latestVer); int32_t streamQueueGetNumOfItems(const SStreamQueue* pQueue); -int32_t streamQueueGetAvailableSpace(const SStreamQueue* pQueue, int32_t* availNum, double* availSize); // common int32_t streamRestoreParam(SStreamTask* pTask); -int32_t streamSetStatusNormal(SStreamTask* pTask); -int32_t streamSetStatusUnint(SStreamTask* pTask); -const char* streamGetTaskStatusStr(int32_t status); void streamTaskPause(SStreamTask* pTask, SStreamMeta* pMeta); -void streamTaskResume(SStreamTask* pTask, SStreamMeta* pMeta); -void streamTaskResumeFromHalt(SStreamTask* pTask); +void streamTaskResume(SStreamTask* pTask); void streamTaskDisablePause(SStreamTask* pTask); void streamTaskEnablePause(SStreamTask* pTask); int32_t streamTaskSetUpstreamInfo(SStreamTask* pTask, const SStreamTask* pUpstreamTask); @@ -759,7 +797,6 @@ int32_t streamMetaRemoveTask(SStreamMeta* pMeta, STaskId* pKey); int32_t streamMetaRegisterTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask, bool* pAdded); int32_t streamMetaUnregisterTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId); int32_t streamMetaGetNumOfTasks(SStreamMeta* pMeta); -int32_t streamMetaGetNumOfStreamTasks(SStreamMeta* pMeta); SStreamTask* streamMetaAcquireTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId); void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask); int32_t streamMetaReopen(SStreamMeta* pMeta); @@ -768,12 +805,13 @@ int32_t streamMetaLoadAllTasks(SStreamMeta* pMeta); void streamMetaNotifyClose(SStreamMeta* pMeta); void streamMetaStartHb(SStreamMeta* pMeta); void streamMetaInitForSnode(SStreamMeta* pMeta); +bool streamMetaTaskInTimer(SStreamMeta* pMeta); +int32_t streamMetaUpdateTaskReadyInfo(SStreamTask* pTask); // checkpoint int32_t streamProcessCheckpointSourceReq(SStreamTask* pTask, SStreamCheckpointSourceReq* pReq); int32_t streamProcessCheckpointReadyMsg(SStreamTask* pTask); void streamTaskClearCheckInfo(SStreamTask* pTask); - int32_t streamAlignTransferState(SStreamTask* pTask); int32_t streamBuildAndSendDropTaskMsg(SMsgCb* pMsgCb, int32_t vgId, SStreamTaskId* pTaskId); int32_t streamAddCheckpointSourceRspMsg(SStreamCheckpointSourceReq* pReq, SRpcHandleInfo* pRpcInfo, SStreamTask* pTask, diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index ad525a2aa7..a19b249bc7 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -46,6 +46,7 @@ extern "C" { #define SYNC_HEARTBEAT_SLOW_MS 1500 #define SYNC_HEARTBEAT_REPLY_SLOW_MS 1500 #define SYNC_SNAP_RESEND_MS 1000 * 60 +#define SYNC_SNAP_TIMEOUT_MS 1000 * 600 #define SYNC_VND_COMMIT_MIN_MS 3000 diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 6fbe4422ac..8748ea99a2 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -332,6 +332,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_MND_INVALID_REPLICA TAOS_DEF_ERROR_CODE(0, 0x03B7) #define TSDB_CODE_MND_DNODE_IN_CREATING TAOS_DEF_ERROR_CODE(0, 0x03B8) #define TSDB_CODE_MND_DNODE_IN_DROPPING TAOS_DEF_ERROR_CODE(0, 0x03B9) +#define TSDB_CODE_MND_NO_ENOUGH_VNODES TAOS_DEF_ERROR_CODE(0, 0x03BA) // mnode-stable-part2 #define TSDB_CODE_MND_NAME_CONFLICT_WITH_TOPIC TAOS_DEF_ERROR_CODE(0, 0x03C0) @@ -657,6 +658,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_PAR_CORRESPONDING_STABLE_ERR TAOS_DEF_ERROR_CODE(0, 0x2618) #define TSDB_CODE_PAR_INVALID_DB_OPTION TAOS_DEF_ERROR_CODE(0, 0x2619) #define TSDB_CODE_PAR_INVALID_TABLE_OPTION TAOS_DEF_ERROR_CODE(0, 0x261A) +#define TSDB_CODE_PAR_INTER_VALUE_TOO_BIG TAOS_DEF_ERROR_CODE(0, 0x261B) #define TSDB_CODE_PAR_GROUPBY_WINDOW_COEXIST TAOS_DEF_ERROR_CODE(0, 0x2624) #define TSDB_CODE_PAR_AGG_FUNC_NESTING TAOS_DEF_ERROR_CODE(0, 0x2627) #define TSDB_CODE_PAR_INVALID_STATE_WIN_TYPE TAOS_DEF_ERROR_CODE(0, 0x2628) @@ -739,6 +741,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_FUNC_FUNTION_PARA_VALUE TAOS_DEF_ERROR_CODE(0, 0x2803) #define TSDB_CODE_FUNC_NOT_BUILTIN_FUNTION TAOS_DEF_ERROR_CODE(0, 0x2804) #define TSDB_CODE_FUNC_DUP_TIMESTAMP TAOS_DEF_ERROR_CODE(0, 0x2805) +#define TSDB_CODE_FUNC_TO_TIMESTAMP_FAILED TAOS_DEF_ERROR_CODE(0, 0x2806) //udf #define TSDB_CODE_UDF_STOPPING TAOS_DEF_ERROR_CODE(0, 0x2901) diff --git a/include/util/tconfig.h b/include/util/tconfig.h index aaad467737..34798f3816 100644 --- a/include/util/tconfig.h +++ b/include/util/tconfig.h @@ -65,7 +65,6 @@ typedef struct SConfigItem { union { bool bval; float fval; - double dval; int32_t i32; int64_t i64; char *str; @@ -104,7 +103,6 @@ int32_t cfgAddBool(SConfig *pCfg, const char *name, bool defaultVal, int8_t scop int32_t cfgAddInt32(SConfig *pCfg, const char *name, int32_t defaultVal, int64_t minval, int64_t maxval, int8_t scope); int32_t cfgAddInt64(SConfig *pCfg, const char *name, int64_t defaultVal, int64_t minval, int64_t maxval, int8_t scope); int32_t cfgAddFloat(SConfig *pCfg, const char *name, float defaultVal, float minval, float maxval, int8_t scope); -int32_t cfgAddDouble(SConfig *pCfg, const char *name, double defaultVal, double minval, double maxval, int8_t scope); int32_t cfgAddString(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope); int32_t cfgAddDir(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope); int32_t cfgAddLocale(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope); diff --git a/include/util/tdef.h b/include/util/tdef.h index 7f8fe22340..e891ac4a2a 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -109,6 +109,15 @@ extern const int32_t TYPE_BYTES[21]; #define TSDB_INS_USER_STABLES_DBNAME_COLID 2 +static const int64_t TICK_PER_SECOND[] = { + 1000LL, // MILLISECOND + 1000000LL, // MICROSECOND + 1000000000LL, // NANOSECOND + 0LL, // HOUR + 0LL, // MINUTE + 1LL // SECOND +}; + #define TSDB_TICK_PER_SECOND(precision) \ ((int64_t)((precision) == TSDB_TIME_PRECISION_MILLI \ ? 1000LL \ @@ -294,6 +303,8 @@ typedef enum ELogicConditionType { #define TSDB_SYNC_APPLYQ_SIZE_LIMIT 512 #define TSDB_SYNC_NEGOTIATION_WIN 512 +#define TSDB_SYNC_SNAP_BUFFER_SIZE 2048 + #define TSDB_TBNAME_COLUMN_INDEX (-1) #define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta @@ -316,7 +327,7 @@ typedef enum ELogicConditionType { #define TSDB_MAX_DAYS_PER_FILE (3650 * 1440) #define TSDB_DEFAULT_DAYS_PER_FILE (10 * 1440) #define TSDB_MIN_DURATION_PER_FILE 60 // unit minute -#define TSDB_MAX_DURATION_PER_FILE (3650 * 1440) +#define TSDB_MAX_DURATION_PER_FILE (90 * 1440) #define TSDB_DEFAULT_DURATION_PER_FILE (10 * 1440) #define TSDB_MIN_KEEP (1 * 1440) // data in db to be reserved. unit minute #define TSDB_MAX_KEEP (365000 * 1440) // data in db to be reserved. diff --git a/include/util/tqueue.h b/include/util/tqueue.h index 503d15e793..9f09bd2930 100644 --- a/include/util/tqueue.h +++ b/include/util/tqueue.h @@ -101,6 +101,9 @@ struct STaosQall { STaosQnode *current; STaosQnode *start; int32_t numOfItems; + int64_t memOfItems; + int32_t unAccessedNumOfItems; + int64_t unAccessMemOfItems; }; STaosQueue *taosOpenQueue(); @@ -123,6 +126,9 @@ int32_t taosReadAllQitems(STaosQueue *queue, STaosQall *qall); int32_t taosGetQitem(STaosQall *qall, void **ppItem); void taosResetQitems(STaosQall *qall); int32_t taosQallItemSize(STaosQall *qall); +int64_t taosQallMemSize(STaosQall *qll); +int64_t taosQallUnAccessedItemSize(STaosQall *qall); +int64_t taosQallUnAccessedMemSize(STaosQall *qall); STaosQset *taosOpenQset(); void taosCloseQset(STaosQset *qset); @@ -135,8 +141,6 @@ int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, SQueueInfo *qinfo) int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, SQueueInfo *qinfo); void taosResetQsetThread(STaosQset *qset, void *pItem); -extern int64_t tsRpcQueueMemoryAllowed; - #ifdef __cplusplus } #endif diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c index e7ba30d78c..a12dc8d839 100644 --- a/source/client/src/clientRawBlockWrite.c +++ b/source/client/src/clientRawBlockWrite.c @@ -1338,6 +1338,11 @@ end: int taos_write_raw_block_with_fields(TAOS* taos, int rows, char* pData, const char* tbname, TAOS_FIELD* fields, int numFields) { + return taos_write_raw_block_with_fields_with_reqid(taos, rows, pData, tbname, fields, numFields, 0); +} + +int taos_write_raw_block_with_fields_with_reqid(TAOS *taos, int rows, char *pData, const char *tbname, + TAOS_FIELD *fields, int numFields, int64_t reqid){ if (!taos || !pData || !tbname) { return TSDB_CODE_INVALID_PARA; } @@ -1347,7 +1352,7 @@ int taos_write_raw_block_with_fields(TAOS* taos, int rows, char* pData, const ch SHashObj* pVgHash = NULL; uDebug("taos_write_raw_block_with_fields called"); - SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0); + SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, reqid); if (!pRequest) { uError("WriteRaw:createRequest error request is null"); code = terrno; @@ -1427,6 +1432,10 @@ end: } int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname) { + return taos_write_raw_block_with_reqid(taos, rows, pData, tbname, 0); +} + +int taos_write_raw_block_with_reqid(TAOS* taos, int rows, char* pData, const char* tbname, int64_t reqid) { if (!taos || !pData || !tbname) { return TSDB_CODE_INVALID_PARA; } @@ -1436,7 +1445,7 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname) SHashObj* pVgHash = NULL; uDebug("taos_write_raw_block called"); - SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0); + SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, reqid); if (!pRequest) { uError("WriteRaw:createRequest error request is null"); code = terrno; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index a170e5436e..3d1a1ccb16 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -104,13 +104,21 @@ uint16_t tsAuditPort = 6043; bool tsEnableAuditCreateTable = true; // telem +#ifdef TD_ENTERPRISE +bool tsEnableTelem = false; +#else bool tsEnableTelem = true; +#endif int32_t tsTelemInterval = 43200; char tsTelemServer[TSDB_FQDN_LEN] = "telemetry.tdengine.com"; uint16_t tsTelemPort = 80; char *tsTelemUri = "/report"; +#ifdef TD_ENTERPRISE +bool tsEnableCrashReport = false; +#else bool tsEnableCrashReport = true; +#endif char *tsClientCrashReportUri = "/ccrashreport"; char *tsSvrCrashReportUri = "/dcrashreport"; @@ -246,7 +254,8 @@ int32_t tsTtlBatchDropNum = 10000; // number of tables dropped per batch // internal int32_t tsTransPullupInterval = 2; int32_t tsMqRebalanceInterval = 2; -int32_t tsStreamCheckpointTickInterval = 300; +int32_t tsStreamCheckpointInterval = 60; +float tsSinkDataRate = 2.0; int32_t tsStreamNodeCheckInterval = 30; int32_t tsTtlUnit = 86400; int32_t tsTtlPushIntervalSec = 10; @@ -275,8 +284,6 @@ int32_t tsS3BlockSize = 4096; // number of tsdb pages int32_t tsS3BlockCacheSize = 16; // number of blocks int32_t tsS3UploadDelaySec = 60 * 60; -int32_t tsCheckpointInterval = 300; - #ifndef _STORAGE int32_t taosSetTfsCfg(SConfig *pCfg) { SConfigItem *pItem = cfgGetItem(pCfg, "dataDir"); @@ -506,11 +513,11 @@ static int32_t taosAddSystemCfg(SConfig *pCfg) { if (cfgAddBool(pCfg, "enableCoreFile", 1, CFG_SCOPE_BOTH) != 0) return -1; if (cfgAddFloat(pCfg, "numOfCores", tsNumOfCores, 1, 100000, CFG_SCOPE_BOTH) != 0) return -1; - if (cfgAddBool(pCfg, "SSE42", tsSSE42Enable, CFG_SCOPE_BOTH) != 0) return -1; - if (cfgAddBool(pCfg, "AVX", tsAVXEnable, CFG_SCOPE_BOTH) != 0) return -1; - if (cfgAddBool(pCfg, "AVX2", tsAVX2Enable, CFG_SCOPE_BOTH) != 0) return -1; - if (cfgAddBool(pCfg, "FMA", tsFMAEnable, CFG_SCOPE_BOTH) != 0) return -1; - if (cfgAddBool(pCfg, "SIMD-builtins", tsSIMDBuiltins, CFG_SCOPE_BOTH) != 0) return -1; + if (cfgAddBool(pCfg, "ssd42", tsSSE42Enable, CFG_SCOPE_BOTH) != 0) return -1; + if (cfgAddBool(pCfg, "avx", tsAVXEnable, CFG_SCOPE_BOTH) != 0) return -1; + if (cfgAddBool(pCfg, "avx2", tsAVX2Enable, CFG_SCOPE_BOTH) != 0) return -1; + if (cfgAddBool(pCfg, "fma", tsFMAEnable, CFG_SCOPE_BOTH) != 0) return -1; + if (cfgAddBool(pCfg, "simdEnable", tsSIMDBuiltins, CFG_SCOPE_BOTH) != 0) return -1; if (cfgAddBool(pCfg, "tagFilterCache", tsTagFilterCache, CFG_SCOPE_BOTH) != 0) return -1; if (cfgAddInt64(pCfg, "openMax", tsOpenMax, 0, INT64_MAX, CFG_SCOPE_BOTH) != 0) return -1; @@ -667,19 +674,18 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { if (cfgAddBool(pCfg, "disableStream", tsDisableStream, CFG_SCOPE_SERVER) != 0) return -1; if (cfgAddInt64(pCfg, "streamBufferSize", tsStreamBufferSize, 0, INT64_MAX, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddInt64(pCfg, "checkpointInterval", tsStreamCheckpointTickInterval, 60, 1200, CFG_SCOPE_SERVER) != 0) - return -1; + if (cfgAddInt64(pCfg, "checkpointInterval", tsStreamCheckpointInterval, 60, 1200, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddFloat(pCfg, "streamSinkDataRate", tsSinkDataRate, 0.1, 5, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddInt32(pCfg, "cacheLazyLoadThreshold", tsCacheLazyLoadThreshold, 0, 100000, CFG_SCOPE_SERVER) != 0) - return -1; + if (cfgAddInt32(pCfg, "cacheLazyLoadThreshold", tsCacheLazyLoadThreshold, 0, 100000, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddString(pCfg, "LossyColumns", tsLossyColumns, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddFloat(pCfg, "FPrecision", tsFPrecision, 0.0f, 100000.0f, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddDouble(pCfg, "DPrecision", tsDPrecision, 0.0f, 1000000.0f, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddInt32(pCfg, "MaxRange", tsMaxRange, 0, 65536, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddInt32(pCfg, "CurRange", tsCurRange, 0, 65536, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddBool(pCfg, "IfAdtFse", tsIfAdtFse, CFG_SCOPE_SERVER) != 0) return -1; - if (cfgAddString(pCfg, "Compressor", tsCompressor, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddString(pCfg, "lossyColumns", tsLossyColumns, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddFloat(pCfg, "fPrecision", tsFPrecision, 0.0f, 100000.0f, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddFloat(pCfg, "dPrecision", tsDPrecision, 0.0f, 1000000.0f, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddInt32(pCfg, "maxRange", tsMaxRange, 0, 65536, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddInt32(pCfg, "curRange", tsCurRange, 0, 65536, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddBool(pCfg, "ifAdtFse", tsIfAdtFse, CFG_SCOPE_SERVER) != 0) return -1; + if (cfgAddString(pCfg, "compressor", tsCompressor, CFG_SCOPE_SERVER) != 0) return -1; if (cfgAddBool(pCfg, "filterScalarMode", tsFilterScalarMode, CFG_SCOPE_SERVER) != 0) return -1; if (cfgAddInt32(pCfg, "maxStreamBackendCache", tsMaxStreamBackendCache, 16, 1024, CFG_SCOPE_SERVER) != 0) return -1; @@ -1044,7 +1050,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { tsNumOfSnodeWriteThreads = cfgGetItem(pCfg, "numOfSnodeUniqueThreads")->i32; tsRpcQueueMemoryAllowed = cfgGetItem(pCfg, "rpcQueueMemoryAllowed")->i64; - tsSIMDBuiltins = (bool)cfgGetItem(pCfg, "SIMD-builtins")->bval; + tsSIMDBuiltins = (bool)cfgGetItem(pCfg, "simdEnable")->bval; tsTagFilterCache = (bool)cfgGetItem(pCfg, "tagFilterCache")->bval; tsEnableMonitor = cfgGetItem(pCfg, "monitor")->bval; @@ -1103,16 +1109,18 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { tsCacheLazyLoadThreshold = cfgGetItem(pCfg, "cacheLazyLoadThreshold")->i32; - tstrncpy(tsLossyColumns, cfgGetItem(pCfg, "LossyColumns")->str, sizeof(tsLossyColumns)); - tsFPrecision = cfgGetItem(pCfg, "FPrecision")->fval; - tsDPrecision = cfgGetItem(pCfg, "DPrecision")->dval; - tsMaxRange = cfgGetItem(pCfg, "MaxRange")->i32; - tsCurRange = cfgGetItem(pCfg, "CurRange")->i32; - tsIfAdtFse = cfgGetItem(pCfg, "IfAdtFse")->bval; - tstrncpy(tsCompressor, cfgGetItem(pCfg, "Compressor")->str, sizeof(tsCompressor)); + tstrncpy(tsLossyColumns, cfgGetItem(pCfg, "lossyColumns")->str, sizeof(tsLossyColumns)); + tsFPrecision = cfgGetItem(pCfg, "fPrecision")->fval; + tsDPrecision = cfgGetItem(pCfg, "dPrecision")->fval; + tsMaxRange = cfgGetItem(pCfg, "maxRange")->i32; + tsCurRange = cfgGetItem(pCfg, "curRange")->i32; + tsIfAdtFse = cfgGetItem(pCfg, "ifAdtFse")->bval; + tstrncpy(tsCompressor, cfgGetItem(pCfg, "compressor")->str, sizeof(tsCompressor)); tsDisableStream = cfgGetItem(pCfg, "disableStream")->bval; tsStreamBufferSize = cfgGetItem(pCfg, "streamBufferSize")->i64; + tsStreamCheckpointInterval = cfgGetItem(pCfg, "checkpointInterval")->i32; + tsSinkDataRate = cfgGetItem(pCfg, "streamSinkDataRate")->fval; tsFilterScalarMode = cfgGetItem(pCfg, "filterScalarMode")->bval; tsMaxStreamBackendCache = cfgGetItem(pCfg, "maxStreamBackendCache")->i32; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index bd6eb46bad..137633ec13 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -8405,7 +8405,7 @@ void tDestroySubmitTbData(SSubmitTbData *pTbData, int32_t flag) { } else { tDestroySVCreateTbReq(pTbData->pCreateTbReq, TSDB_MSG_FLG_DECODE); } - taosMemoryFree(pTbData->pCreateTbReq); + taosMemoryFreeClear(pTbData->pCreateTbReq); } if (pTbData->flags & SUBMIT_REQ_COLUMN_DATA_FORMAT) { diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c index 723298f256..6b5bb8680e 100644 --- a/source/common/src/ttime.c +++ b/source/common/src/ttime.c @@ -25,7 +25,6 @@ #include "tlog.h" - // ==== mktime() kernel code =================// static int64_t m_deltaUtc = 0; @@ -682,7 +681,7 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) { } // The following code handles the y/n time duration - int64_t numOfMonth = (unit == 'y')? duration*12:duration; + int64_t numOfMonth = (unit == 'y') ? duration * 12 : duration; int64_t fraction = t % TSDB_TICK_PER_SECOND(precision); struct tm tm; @@ -725,7 +724,7 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) { * Total num of windows is ret + 1(the first window) */ int32_t taosTimeCountIntervalForFill(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision, - int32_t order) { + int32_t order) { if (ekey < skey) { int64_t tmp = ekey; ekey = skey; @@ -768,7 +767,6 @@ int64_t taosTimeTruncate(int64_t ts, const SInterval* pInterval) { int32_t precision = pInterval->precision; if (IS_CALENDAR_TIME_DURATION(pInterval->slidingUnit)) { - start /= (int64_t)(TSDB_TICK_PER_SECOND(precision)); struct tm tm; time_t tt = (time_t)start; @@ -799,7 +797,7 @@ int64_t taosTimeTruncate(int64_t ts, const SInterval* pInterval) { int64_t newe = taosTimeAdd(news, pInterval->interval, pInterval->intervalUnit, precision) - 1; if (newe < ts) { // move towards the greater endpoint - while(newe < ts && news < ts) { + while (newe < ts && news < ts) { news += pInterval->sliding; newe = taosTimeAdd(news, pInterval->interval, pInterval->intervalUnit, precision) - 1; } @@ -978,3 +976,947 @@ void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precision) tstrncpy(buf, ts, bufLen); } + +int32_t taosTs2Tm(int64_t ts, int32_t precision, struct STm* tm) { + tm->fsec = ts % TICK_PER_SECOND[precision] * (TICK_PER_SECOND[TSDB_TIME_PRECISION_NANO] / TICK_PER_SECOND[precision]); + time_t t = ts / TICK_PER_SECOND[precision]; + taosLocalTime(&t, &tm->tm, NULL); + return TSDB_CODE_SUCCESS; +} + +int32_t taosTm2Ts(struct STm* tm, int64_t* ts, int32_t precision) { + *ts = taosMktime(&tm->tm); + *ts *= TICK_PER_SECOND[precision]; + *ts += tm->fsec / (TICK_PER_SECOND[TSDB_TIME_PRECISION_NANO] / TICK_PER_SECOND[precision]); + return TSDB_CODE_SUCCESS; +} + +typedef struct { + const char* name; + int len; + int id; + bool isDigit; +} TSFormatKeyWord; + +typedef enum { + // TSFKW_AD, // BC AD + // TSFKW_A_D, // A.D. B.C. + TSFKW_AM, // AM, PM + TSFKW_A_M, // A.M., P.M. + // TSFKW_BC, // BC AD + // TSFKW_B_C, // B.C. A.D. + TSFKW_DAY, // MONDAY, TUESDAY ... + TSFKW_DDD, // Day of year 001-366 + TSFKW_DD, // Day of month 01-31 + TSFKW_Day, // Sunday, Monday + TSFKW_DY, // MON, TUE + TSFKW_Dy, // Mon, Tue + TSFKW_D, // 1-7 -> Sunday(1) -> Saturday(7) + TSFKW_HH24, + TSFKW_HH12, + TSFKW_HH, + TSFKW_MI, // minute + TSFKW_MM, + TSFKW_MONTH, // JANUARY, FEBRUARY + TSFKW_MON, + TSFKW_Month, + TSFKW_Mon, + TSFKW_MS, + TSFKW_NS, + //TSFKW_OF, + TSFKW_PM, + TSFKW_P_M, + TSFKW_SS, + TSFKW_TZH, + // TSFKW_TZM, + // TSFKW_TZ, + TSFKW_US, + TSFKW_YYYY, + TSFKW_YYY, + TSFKW_YY, + TSFKW_Y, + // TSFKW_a_d, + // TSFKW_ad, + TSFKW_am, + TSFKW_a_m, + // TSFKW_b_c, + // TSFKW_bc, + TSFKW_day, + TSFKW_ddd, + TSFKW_dd, + TSFKW_dy, // mon, tue + TSFKW_d, + TSFKW_hh24, + TSFKW_hh12, + TSFKW_hh, + TSFKW_mi, + TSFKW_mm, + TSFKW_month, + TSFKW_mon, + TSFKW_ms, + TSFKW_ns, + TSFKW_pm, + TSFKW_p_m, + TSFKW_ss, + TSFKW_tzh, + // TSFKW_tzm, + // TSFKW_tz, + TSFKW_us, + TSFKW_yyyy, + TSFKW_yyy, + TSFKW_yy, + TSFKW_y, + TSFKW_last_ +} TSFormatKeywordId; + +// clang-format off +static const TSFormatKeyWord formatKeyWords[] = { + //{"AD", 2, TSFKW_AD, false}, + //{"A.D.", 4, TSFKW_A_D}, + {"AM", 2, TSFKW_AM, false}, + {"A.M.", 4, TSFKW_A_M, false}, + //{"BC", 2, TSFKW_BC, false}, + //{"B.C.", 4, TSFKW_B_C, false}, + {"DAY", 3, TSFKW_DAY, false}, + {"DDD", 3, TSFKW_DDD, true}, + {"DD", 2, TSFKW_DD, true}, + {"Day", 3, TSFKW_Day, false}, + {"DY", 2, TSFKW_DY, false}, + {"Dy", 2, TSFKW_Dy, false}, + {"D", 1, TSFKW_D, true}, + {"HH24", 4, TSFKW_HH24, true}, + {"HH12", 4, TSFKW_HH12, true}, + {"HH", 2, TSFKW_HH, true}, + {"MI", 2, TSFKW_MI, true}, + {"MM", 2, TSFKW_MM, true}, + {"MONTH", 5, TSFKW_MONTH, false}, + {"MON", 3, TSFKW_MON, false}, + {"Month", 5, TSFKW_Month, false}, + {"Mon", 3, TSFKW_Mon, false}, + {"MS", 2, TSFKW_MS, true}, + {"NS", 2, TSFKW_NS, true}, + //{"OF", 2, TSFKW_OF, false}, + {"PM", 2, TSFKW_PM, false}, + {"P.M.", 4, TSFKW_P_M, false}, + {"SS", 2, TSFKW_SS, true}, + {"TZH", 3, TSFKW_TZH, false}, + //{"TZM", 3, TSFKW_TZM}, + //{"TZ", 2, TSFKW_TZ}, + {"US", 2, TSFKW_US, true}, + {"YYYY", 4, TSFKW_YYYY, true}, + {"YYY", 3, TSFKW_YYY, true}, + {"YY", 2, TSFKW_YY, true}, + {"Y", 1, TSFKW_Y, true}, + //{"a.d.", 4, TSFKW_a_d, false}, + //{"ad", 2, TSFKW_ad, false}, + {"am", 2, TSFKW_am, false}, + {"a.m.", 4, TSFKW_a_m, false}, + //{"b.c.", 4, TSFKW_b_c, false}, + //{"bc", 2, TSFKW_bc, false}, + {"day", 3, TSFKW_day, false}, + {"ddd", 3, TSFKW_DDD, true}, + {"dd", 2, TSFKW_DD, true}, + {"dy", 2, TSFKW_dy, false}, + {"d", 1, TSFKW_D, true}, + {"hh24", 4, TSFKW_HH24, true}, + {"hh12", 4, TSFKW_HH12, true}, + {"hh", 2, TSFKW_HH, true}, + {"mi", 2, TSFKW_MI, true}, + {"mm", 2, TSFKW_MM, true}, + {"month", 5, TSFKW_month, false}, + {"mon", 3, TSFKW_mon, false}, + {"ms", 2, TSFKW_MS, true}, + {"ns", 2, TSFKW_NS, true}, + //{"of", 2, TSFKW_OF, false}, + {"pm", 2, TSFKW_pm, false}, + {"p.m.", 4, TSFKW_p_m, false}, + {"ss", 2, TSFKW_SS, true}, + {"tzh", 3, TSFKW_TZH, false}, + //{"tzm", 3, TSFKW_TZM}, + //{"tz", 2, TSFKW_tz}, + {"us", 2, TSFKW_US, true}, + {"yyyy", 4, TSFKW_YYYY, true}, + {"yyy", 3, TSFKW_YYY, true}, + {"yy", 2, TSFKW_YY, true}, + {"y", 1, TSFKW_Y, true}, + {NULL, 0, 0} +}; +// clang-format on + +#define TS_FROMAT_KEYWORD_INDEX_SIZE ('z' - 'A' + 1) +static const int TSFormatKeywordIndex[TS_FROMAT_KEYWORD_INDEX_SIZE] = { + /*A*/ TSFKW_AM, -1, -1, + /*D*/ TSFKW_DAY, -1, -1, -1, + /*H*/ TSFKW_HH24, -1, -1, -1, -1, + /*M*/ TSFKW_MI, + /*N*/ TSFKW_NS, -1, + /*P*/ TSFKW_PM, -1, -1, + /*S*/ TSFKW_SS, + /*T*/ TSFKW_TZH, + /*U*/ TSFKW_US, -1, -1, -1, + /*Y*/ TSFKW_YYYY, -1, + /*[ \ ] ^ _ `*/ -1, -1, -1, -1, -1, -1, + /*a*/ TSFKW_am, -1, -1, + /*d*/ TSFKW_day, -1, -1, -1, + /*h*/ TSFKW_hh24, -1, -1, -1, -1, + /*m*/ TSFKW_mi, + /*n*/ TSFKW_ns, -1, + /*p*/ TSFKW_pm, -1, -1, + /*s*/ TSFKW_ss, + /*t*/ TSFKW_tzh, + /*u*/ TSFKW_us, -1, -1, -1, + /*y*/ TSFKW_yyyy, -1}; + +typedef struct { + uint8_t type; + const char* c; + int32_t len; + const TSFormatKeyWord* key; +} TSFormatNode; + +static const char* const weekDays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday", "NULL"}; +static const char* const shortWeekDays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "NULL"}; +static const char* const fullMonths[] = {"January", "February", "March", "April", "May", "June", "July", + "August", "September", "October", "November", "December", NULL}; +static const char* const months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", + "Aug", "Sep", "Oct", "Nov", "Dec", NULL}; +#define A_M_STR "A.M." +#define a_m_str "a.m." +#define AM_STR "AM" +#define am_str "am" +#define P_M_STR "P.M." +#define p_m_str "p.m." +#define PM_STR "PM" +#define pm_str "pm" +static const char* const apms[] = {AM_STR, PM_STR, am_str, pm_str, NULL}; +static const char* const long_apms[] = {A_M_STR, P_M_STR, a_m_str, p_m_str, NULL}; + +#define TS_FORMAT_NODE_TYPE_KEYWORD 1 +#define TS_FORMAT_NODE_TYPE_SEPARATOR 2 +#define TS_FORMAT_NODE_TYPE_CHAR 3 + +static const TSFormatKeyWord* keywordSearch(const char* str) { + if (*str < 'A' || *str > 'z' || (*str > 'Z' && *str < 'a')) return NULL; + int32_t idx = TSFormatKeywordIndex[str[0] - 'A']; + if (idx < 0) return NULL; + const TSFormatKeyWord* key = &formatKeyWords[idx++]; + while (key->name && str[0] == key->name[0]) { + if (0 == strncmp(key->name, str, key->len)) { + return key; + } + key = &formatKeyWords[idx++]; + } + return NULL; +} + +static bool isSeperatorChar(char c) { + return (c > 0x20 && c < 0x7F && !(c >= 'A' && c <= 'Z') && !(c >= 'a' && c <= 'z') && !(c >= '0' && c <= '9')); +} + +static void parseTsFormat(const char* formatStr, SArray* formats) { + TSFormatNode* lastOtherFormat = NULL; + while (*formatStr) { + const TSFormatKeyWord* key = keywordSearch(formatStr); + if (key) { + TSFormatNode format = {.key = key, .type = TS_FORMAT_NODE_TYPE_KEYWORD}; + taosArrayPush(formats, &format); + formatStr += key->len; + lastOtherFormat = NULL; + } else { + if (*formatStr == '"') { + lastOtherFormat = NULL; + // for double quoted string + formatStr++; + TSFormatNode* last = NULL; + while (*formatStr) { + if (*formatStr == '"') { + formatStr++; + break; + } + if (*formatStr == '\\' && *(formatStr + 1)) { + formatStr++; + last = NULL; // stop expanding last format, create new format + } + if (last) { + // expand + assert(last->type == TS_FORMAT_NODE_TYPE_CHAR); + last->len++; + formatStr++; + } else { + // create new + TSFormatNode format = {.type = TS_FORMAT_NODE_TYPE_CHAR, .key = NULL}; + format.c = formatStr; + format.len = 1; + taosArrayPush(formats, &format); + formatStr++; + last = taosArrayGetLast(formats); + } + } + } else { + // for other strings + if (*formatStr == '\\' && *(formatStr + 1)) { + formatStr++; + lastOtherFormat = NULL; // stop expanding + } else { + if (lastOtherFormat && !isSeperatorChar(*formatStr)) { + // expanding + } else { + // create new + lastOtherFormat = NULL; + } + } + if (lastOtherFormat) { + assert(lastOtherFormat->type == TS_FORMAT_NODE_TYPE_CHAR); + lastOtherFormat->len++; + formatStr++; + } else { + TSFormatNode format = { + .type = isSeperatorChar(*formatStr) ? TS_FORMAT_NODE_TYPE_SEPARATOR : TS_FORMAT_NODE_TYPE_CHAR, + .key = NULL}; + format.c = formatStr; + format.len = 1; + taosArrayPush(formats, &format); + formatStr++; + if (format.type == TS_FORMAT_NODE_TYPE_CHAR) lastOtherFormat = taosArrayGetLast(formats); + } + } + } + } +} + +static void tm2char(const SArray* formats, const struct STm* tm, char* s, int32_t outLen) { + int32_t size = taosArrayGetSize(formats); + const char* start = s; + for (int32_t i = 0; i < size; ++i) { + TSFormatNode* format = taosArrayGet(formats, i); + if (format->type != TS_FORMAT_NODE_TYPE_KEYWORD) { + if (s - start + format->len + 1 > outLen) break; + strncpy(s, format->c, format->len); + s += format->len; + continue; + } + if (s - start + 16 > outLen) break; + + switch (format->key->id) { + case TSFKW_AM: + case TSFKW_PM: + sprintf(s, tm->tm.tm_hour % 24 >= 12 ? "PM" : "AM"); + s += 2; + break; + case TSFKW_A_M: + case TSFKW_P_M: + sprintf(s, tm->tm.tm_hour % 24 >= 12 ? "P.M." : "A.M."); + s += 4; + break; + case TSFKW_am: + case TSFKW_pm: + sprintf(s, tm->tm.tm_hour % 24 >= 12 ? "pm" : "am"); + s += 2; + break; + case TSFKW_a_m: + case TSFKW_p_m: + sprintf(s, tm->tm.tm_hour % 24 >= 12 ? "p.m." : "a.m."); + s += 4; + break; + case TSFKW_DDD: + sprintf(s, "%d", tm->tm.tm_yday); + s += strlen(s); + break; + case TSFKW_DD: + sprintf(s, "%02d", tm->tm.tm_mday); + s += 2; + break; + case TSFKW_D: + sprintf(s, "%d", tm->tm.tm_wday + 1); + s += 1; + break; + case TSFKW_DAY: { + // MONDAY, TUESDAY... + const char* wd = weekDays[tm->tm.tm_wday]; + char buf[10] = {0}; + for (int32_t i = 0; i < strlen(wd); ++i) buf[i] = toupper(wd[i]); + sprintf(s, "%-9s", buf); + s += strlen(s); + break; + } + case TSFKW_Day: + // Monday, TuesDay... + sprintf(s, "%-9s", weekDays[tm->tm.tm_wday]); + s += strlen(s); + break; + case TSFKW_day: { + const char* wd = weekDays[tm->tm.tm_wday]; + char buf[10] = {0}; + for (int32_t i = 0; i < strlen(wd); ++i) buf[i] = tolower(wd[i]); + sprintf(s, "%-9s", buf); + s += strlen(s); + break; + } + case TSFKW_DY: { + // MON, TUE + const char* wd = shortWeekDays[tm->tm.tm_wday]; + char buf[8] = {0}; + for (int32_t i = 0; i < strlen(wd); ++i) buf[i] = toupper(wd[i]); + sprintf(s, "%3s", buf); + s += 3; + break; + } + case TSFKW_Dy: + // Mon, Tue + sprintf(s, "%3s", shortWeekDays[tm->tm.tm_wday]); + s += 3; + break; + case TSFKW_dy: { + // mon, tue + const char* wd = shortWeekDays[tm->tm.tm_wday]; + char buf[8] = {0}; + for (int32_t i = 0; i < strlen(wd); ++i) buf[i] = tolower(wd[i]); + sprintf(s, "%3s", buf); + s += 3; + break; + } + case TSFKW_HH24: + sprintf(s, "%02d", tm->tm.tm_hour); + s += 2; + break; + case TSFKW_HH: + case TSFKW_HH12: + // 0 or 12 o'clock in 24H coresponds to 12 o'clock (AM/PM) in 12H + sprintf(s, "%02d", tm->tm.tm_hour % 12 == 0 ? 12 : tm->tm.tm_hour % 12); + s += 2; + break; + case TSFKW_MI: + sprintf(s, "%02d", tm->tm.tm_min); + s += 2; + break; + case TSFKW_MM: + sprintf(s, "%02d", tm->tm.tm_mon + 1); + s += 2; + break; + case TSFKW_MONTH: { + const char* mon = fullMonths[tm->tm.tm_mon]; + char buf[10] = {0}; + for (int32_t i = 0; i < strlen(mon); ++i) buf[i] = toupper(mon[i]); + sprintf(s, "%-9s", buf); + s += strlen(s); + break; + } + case TSFKW_MON: { + const char* mon = months[tm->tm.tm_mon]; + char buf[10] = {0}; + for (int32_t i = 0; i < strlen(mon); ++i) buf[i] = toupper(mon[i]); + sprintf(s, "%s", buf); + s += strlen(s); + break; + } + case TSFKW_Month: + sprintf(s, "%-9s", fullMonths[tm->tm.tm_mon]); + s += strlen(s); + break; + case TSFKW_month: { + const char* mon = fullMonths[tm->tm.tm_mon]; + char buf[10] = {0}; + for (int32_t i = 0; i < strlen(mon); ++i) buf[i] = tolower(mon[i]); + sprintf(s, "%-9s", buf); + s += strlen(s); + break; + } + case TSFKW_Mon: + sprintf(s, "%s", months[tm->tm.tm_mon]); + s += strlen(s); + break; + case TSFKW_mon: { + const char* mon = months[tm->tm.tm_mon]; + char buf[10] = {0}; + for (int32_t i = 0; i < strlen(mon); ++i) buf[i] = tolower(mon[i]); + sprintf(s, "%s", buf); + s += strlen(s); + break; + } + case TSFKW_SS: + sprintf(s, "%02d", tm->tm.tm_sec); + s += 2; + break; + case TSFKW_MS: + sprintf(s, "%03" PRId64, tm->fsec / 1000000L); + s += 3; + break; + case TSFKW_US: + sprintf(s, "%06" PRId64, tm->fsec / 1000L); + s += 6; + break; + case TSFKW_NS: + sprintf(s, "%09" PRId64, tm->fsec); + s += 9; + break; + case TSFKW_TZH: + sprintf(s, "%s%02d", tsTimezone < 0 ? "-" : "+", tsTimezone); + s += strlen(s); + break; + case TSFKW_YYYY: + sprintf(s, "%04d", tm->tm.tm_year + 1900); + s += strlen(s); + break; + case TSFKW_YYY: + sprintf(s, "%03d", (tm->tm.tm_year + 1900) % 1000); + s += strlen(s); + break; + case TSFKW_YY: + sprintf(s, "%02d", (tm->tm.tm_year + 1900) % 100); + s += strlen(s); + break; + case TSFKW_Y: + sprintf(s, "%01d", (tm->tm.tm_year + 1900) % 10); + s += strlen(s); + break; + default: + break; + } + } +} + +/// @brief find s in arr case insensitively +/// @retval the index in arr if found, -1 if not found +static int32_t strArrayCaseSearch(const char* const* arr, const char* s) { + if (!*s) return -1; + const char* const* fmt = arr; + for (; *fmt; ++fmt) { + const char *l, *r; + for (l = fmt[0], r = s;; l++, r++) { + if (*l == '\0') return fmt - arr; + if (*r == '\0' || tolower(*l) != tolower(*r)) break; + } + } + return -1; +} + +static const char* tsFormatStr2Int32(int32_t* dest, const char* str, int32_t len, bool needMoreDigit) { + char* last; + int64_t res; + const char* s = str; + if ('\0' == str[0]) return NULL; + if (len <= 0) { + res = taosStr2Int64(s, &last, 10); + s = last; + } else { + char buf[16] = {0}; + strncpy(buf, s, len); + int32_t copiedLen = strlen(buf); + if (copiedLen < len) { + if (!needMoreDigit) { + // digits not enough, that's ok, cause we do not need more digits + // '2023-1' 'YYYY-MM' + // '202a' 'YYYY' -> 202 + res = taosStr2Int64(s, &last, 10); + s += copiedLen; + } else { + // bytes not enough, and there are other digit formats to match + // '2023-1' 'YYYY-MMDD' + return NULL; + } + } else { + if (needMoreDigit) { + res = taosStr2Int64(buf, &last, 10); + // bytes enough, but digits not enough, like '202a12' 'YYYYMM', YYYY needs four digits + if (last - buf < len) return NULL; + s += last - buf; + } else { + res = taosStr2Int64(s, &last, 10); + s = last; + } + } + } + if (s == str) { + // no integers found + return NULL; + } + if (errno == ERANGE || res > INT32_MAX || res < INT32_MIN) { + // out of range + return NULL; + } + *dest = res; + return s; +} + +static int32_t adjustYearTo2020(int32_t year) { + if (year < 70) return year + 2000; // 2000 - 2069 + if (year < 100) return year + 1900; // 1970 - 1999 + if (year < 520) return year + 2000; // 2100 - 2519 + if (year < 1000) return year + 1000; // 1520 - 1999 + return year; +} + +static bool checkTm(const struct tm* tm) { + if (tm->tm_mon < 0 || tm->tm_mon > 11) return false; + if (tm->tm_wday < 0 || tm->tm_wday > 6) return false; + if (tm->tm_yday < 0 || tm->tm_yday > 365) return false; + if (tm->tm_mday < 0 || tm->tm_mday > 31) return false; + if (tm->tm_hour < 0 || tm->tm_hour > 23) return false; + if (tm->tm_min < 0 || tm->tm_min > 59) return false; + if (tm->tm_sec < 0 || tm->tm_sec > 60) return false; + return true; +} + +static bool needMoreDigits(SArray* formats, int32_t curIdx) { + if (curIdx == taosArrayGetSize(formats) - 1) return false; + TSFormatNode* pNextNode = taosArrayGet(formats, curIdx + 1); + if (pNextNode->type == TS_FORMAT_NODE_TYPE_SEPARATOR) { + return false; + } else if (pNextNode->type == TS_FORMAT_NODE_TYPE_KEYWORD) { + return pNextNode->key->isDigit; + } else { + return isdigit(pNextNode->c[0]); + } +} + +/// @brief convert a formatted time str to timestamp +/// @param[in] s the formatted timestamp str +/// @param[in] formats array of TSFormatNode, output of parseTsFormat +/// @param[out] ts output timestamp +/// @param precision the timestamp precision to convert to, sec/milli/micro/nano +/// @param[out] sErrPos if not NULL, when err occured, points to the failed position of s, only set when ret is -1 +/// @param[out] fErrIdx if not NULL, when err occured, the idx of the failed format idx, only set when ret is -1 +/// @retval 0 for success +/// @retval -1 for format and s mismatch error +/// @retval -2 if datetime err, like 2023-13-32 25:61:69 +static int32_t char2ts(const char* s, SArray* formats, int64_t* ts, int32_t precision, const char** sErrPos, + int32_t* fErrIdx) { + int32_t size = taosArrayGetSize(formats); + int32_t pm = 0; // default am + int32_t hour12 = 0; // default HH24 + int32_t year = 0, mon = 0, yd = 0, md = 1, wd = 0; + int32_t hour = 0, min = 0, sec = 0, us = 0, ms = 0, ns = 0; + int32_t tzSign = 1, tz = tsTimezone; + int32_t err = 0; + + for (int32_t i = 0; i < size && *s != '\0'; ++i) { + while (isspace(*s) && *s != '\0') { + s++; + } + if (!s) break; + TSFormatNode* node = taosArrayGet(formats, i); + if (node->type == TS_FORMAT_NODE_TYPE_SEPARATOR) { + // separator matches any character + if (isSeperatorChar(s[0])) s += node->len; + continue; + } + if (node->type == TS_FORMAT_NODE_TYPE_CHAR) { + int32_t pos = 0; + // skip leading spaces + while (isspace(node->c[pos]) && node->len > 0) pos++; + while (pos < node->len && *s != '\0') { + if (!isspace(node->c[pos++])) { + while (isspace(*s) && *s != '\0') s++; + if (*s != '\0') s++; // forward together + } + } + continue; + } + assert(node->type == TS_FORMAT_NODE_TYPE_KEYWORD); + switch (node->key->id) { + case TSFKW_A_M: + case TSFKW_P_M: + case TSFKW_a_m: + case TSFKW_p_m: { + int32_t idx = strArrayCaseSearch(long_apms, s); + if (idx >= 0) { + s += 4; + pm = idx % 2; + hour12 = 1; + } else { + err = -1; + } + } break; + case TSFKW_AM: + case TSFKW_PM: + case TSFKW_am: + case TSFKW_pm: { + int32_t idx = strArrayCaseSearch(apms, s); + if (idx >= 0) { + s += 2; + pm = idx % 2; + hour12 = 1; + } else { + err = -1; + } + } break; + case TSFKW_HH: + case TSFKW_HH12: { + const char* newPos = tsFormatStr2Int32(&hour, s, 2, needMoreDigits(formats, i)); + if (NULL == newPos || hour > 12 || hour <= 0) { + err = -1; + } else { + hour12 = 1; + s = newPos; + } + } break; + case TSFKW_HH24: { + const char* newPos = tsFormatStr2Int32(&hour, s, 2, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + hour12 = 0; + s = newPos; + } + } break; + case TSFKW_MI: { + const char* newPos = tsFormatStr2Int32(&min, s, 2, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + s = newPos; + } + } break; + case TSFKW_SS: { + const char* newPos = tsFormatStr2Int32(&sec, s, 2, needMoreDigits(formats, i)); + if (NULL == newPos) + err = -1; + else + s = newPos; + } break; + case TSFKW_MS: { + const char* newPos = tsFormatStr2Int32(&ms, s, 3, needMoreDigits(formats, i)); + if (NULL == newPos) + err = -1; + else { + int32_t len = newPos - s; + ms *= len == 1 ? 100 : len == 2 ? 10 : 1; + s = newPos; + } + } break; + case TSFKW_US: { + const char* newPos = tsFormatStr2Int32(&us, s, 6, needMoreDigits(formats, i)); + if (NULL == newPos) + err = -1; + else { + int32_t len = newPos - s; + us *= len == 1 ? 100000 : len == 2 ? 10000 : len == 3 ? 1000 : len == 4 ? 100 : len == 5 ? 10 : 1; + s = newPos; + } + } break; + case TSFKW_NS: { + const char* newPos = tsFormatStr2Int32(&ns, s, 9, needMoreDigits(formats, i)); + if (NULL == newPos) + err = -1; + else { + int32_t len = newPos - s; + ns *= len == 1 ? 100000000 + : len == 2 ? 10000000 + : len == 3 ? 1000000 + : len == 4 ? 100000 + : len == 5 ? 10000 + : len == 6 ? 1000 + : len == 7 ? 100 + : len == 8 ? 10 + : 1; + s = newPos; + } + } break; + case TSFKW_TZH: { + tzSign = *s == '-' ? -1 : 1; + const char* newPos = tsFormatStr2Int32(&tz, s, -1, needMoreDigits(formats, i)); + if (NULL == newPos) + err = -1; + else { + s = newPos; + } + } break; + case TSFKW_MONTH: + case TSFKW_Month: + case TSFKW_month: { + int32_t idx = strArrayCaseSearch(fullMonths, s); + if (idx >= 0) { + s += strlen(fullMonths[idx]); + mon = idx; + } else { + err = -1; + } + } break; + case TSFKW_MON: + case TSFKW_Mon: + case TSFKW_mon: { + int32_t idx = strArrayCaseSearch(months, s); + if (idx >= 0) { + s += strlen(months[idx]); + mon = idx; + } else { + err = -1; + } + } break; + case TSFKW_MM: { + const char* newPos = tsFormatStr2Int32(&mon, s, 2, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + s = newPos; + mon -= 1; + } + } break; + case TSFKW_DAY: + case TSFKW_Day: + case TSFKW_day: { + int32_t idx = strArrayCaseSearch(weekDays, s); + if (idx >= 0) { + s += strlen(weekDays[idx]); + wd = idx; + } else { + err = -1; + } + } break; + case TSFKW_DY: + case TSFKW_Dy: + case TSFKW_dy: { + int32_t idx = strArrayCaseSearch(shortWeekDays, s); + if (idx >= 0) { + s += strlen(shortWeekDays[idx]); + wd = idx; + } else { + err = -1; + } + } break; + case TSFKW_DDD: { + const char* newPos = tsFormatStr2Int32(&yd, s, 3, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + s = newPos; + } + } break; + case TSFKW_DD: { + const char* newPos = tsFormatStr2Int32(&md, s, 2, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + s = newPos; + } + } break; + case TSFKW_D: { + const char* newPos = tsFormatStr2Int32(&wd, s, 1, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + s = newPos; + } + } break; + case TSFKW_YYYY: { + const char* newPos = tsFormatStr2Int32(&year, s, 4, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + s = newPos; + } + } break; + case TSFKW_YYY: { + const char* newPos = tsFormatStr2Int32(&year, s, 3, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + year = adjustYearTo2020(year); + s = newPos; + } + } break; + case TSFKW_YY: { + const char* newPos = tsFormatStr2Int32(&year, s, 2, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + year = adjustYearTo2020(year); + s = newPos; + } + } break; + case TSFKW_Y: { + const char* newPos = tsFormatStr2Int32(&year, s, 1, needMoreDigits(formats, i)); + if (NULL == newPos) { + err = -1; + } else { + year = adjustYearTo2020(year); + s = newPos; + } + } break; + default: + break; + } + if (err) { + if (sErrPos) *sErrPos = s; + if (fErrIdx) *fErrIdx = i; + return err; + } + } + struct STm tm = {0}; + tm.tm.tm_year = year - 1900; + tm.tm.tm_mon = mon; + tm.tm.tm_yday = yd; + tm.tm.tm_mday = md; + tm.tm.tm_wday = wd; + if (hour12) { + if (pm && hour < 12) + tm.tm.tm_hour = hour + 12; + else if (!pm && hour == 12) + tm.tm.tm_hour = 0; + else + tm.tm.tm_hour = hour; + } else { + tm.tm.tm_hour = hour; + } + tm.tm.tm_min = min; + tm.tm.tm_sec = sec; + if (!checkTm(&tm.tm)) return -2; + if (tz < -12 || tz > 12) return -2; + tm.fsec = ms * 1000000 + us * 1000 + ns; + int32_t ret = taosTm2Ts(&tm, ts, precision); + *ts += 60 * 60 * (tsTimezone - tz) * TICK_PER_SECOND[precision]; + return ret; +} + +void taosTs2Char(const char* format, SArray** formats, int64_t ts, int32_t precision, char* out, int32_t outLen) { + if (!*formats) { + *formats = taosArrayInit(8, sizeof(TSFormatNode)); + parseTsFormat(format, *formats); + } + struct STm tm; + taosTs2Tm(ts, precision, &tm); + tm2char(*formats, &tm, out, outLen); +} + +int32_t taosChar2Ts(const char* format, SArray** formats, const char* tsStr, int64_t* ts, int32_t precision, char* errMsg, + int32_t errMsgLen) { + const char* sErrPos; + int32_t fErrIdx; + if (!*formats) { + *formats = taosArrayInit(4, sizeof(TSFormatNode)); + parseTsFormat(format, *formats); + } + int32_t code = char2ts(tsStr, *formats, ts, precision, &sErrPos, &fErrIdx); + if (code == -1) { + TSFormatNode* fNode = (taosArrayGet(*formats, fErrIdx)); + snprintf(errMsg, errMsgLen, "mismatch format for: %s and %s", sErrPos, + fErrIdx < taosArrayGetSize(*formats) ? ((TSFormatNode*)taosArrayGet(*formats, fErrIdx))->key->name : ""); + } else if (code == -2) { + snprintf(errMsg, errMsgLen, "timestamp format error: %s -> %s", tsStr, format); + } + return code; +} + +void TEST_ts2char(const char* format, int64_t ts, int32_t precision, char* out, int32_t outLen) { + SArray* formats = taosArrayInit(4, sizeof(TSFormatNode)); + parseTsFormat(format, formats); + struct STm tm; + taosTs2Tm(ts, precision, &tm); + tm2char(formats, &tm, out, outLen); + taosArrayDestroy(formats); +} + +int32_t TEST_char2ts(const char* format, int64_t* ts, int32_t precision, const char* tsStr) { + const char* sErrPos; + int32_t fErrIdx; + SArray* formats = taosArrayInit(4, sizeof(TSFormatNode)); + parseTsFormat(format, formats); + int32_t code = char2ts(tsStr, formats, ts, precision, &sErrPos, &fErrIdx); + if (code == -1) { + printf("failed position: %s\n", sErrPos); + printf("failed format: %s\n", ((TSFormatNode*)taosArrayGet(formats, fErrIdx))->key->name); + } + taosArrayDestroy(formats); + return code; +} diff --git a/source/common/test/commonTests.cpp b/source/common/test/commonTests.cpp index 8a77087d23..dc320ebcb2 100644 --- a/source/common/test/commonTests.cpp +++ b/source/common/test/commonTests.cpp @@ -13,6 +13,7 @@ #include "tdatablock.h" #include "tdef.h" #include "tvariant.h" +#include "ttime.h" namespace { // @@ -260,4 +261,234 @@ TEST(testCase, var_dataBlock_split_test) { } } -#pragma GCC diagnostic pop \ No newline at end of file +void check_tm(const STm* tm, int32_t y, int32_t mon, int32_t d, int32_t h, int32_t m, int32_t s, int64_t fsec) { + ASSERT_EQ(tm->tm.tm_year, y); + ASSERT_EQ(tm->tm.tm_mon, mon); + ASSERT_EQ(tm->tm.tm_mday, d); + ASSERT_EQ(tm->tm.tm_hour, h); + ASSERT_EQ(tm->tm.tm_min, m); + ASSERT_EQ(tm->tm.tm_sec, s); + ASSERT_EQ(tm->fsec, fsec); +} + +void test_timestamp_tm_conversion(int64_t ts, int32_t precision, int32_t y, int32_t mon, int32_t d, int32_t h, int32_t m, int32_t s, int64_t fsec) { + int64_t ts_tmp; + char buf[128] = {0}; + struct STm tm; + taosFormatUtcTime(buf, 128, ts, precision); + printf("formated ts of %ld, precision: %d is: %s\n", ts, precision, buf); + taosTs2Tm(ts, precision, &tm); + check_tm(&tm, y, mon, d, h, m, s, fsec); + taosTm2Ts(&tm, &ts_tmp, precision); + ASSERT_EQ(ts, ts_tmp); +} + +TEST(timeTest, timestamp2tm) { + const char* ts_str_ns = "2023-10-12T11:29:00.775726171+0800"; + const char* ts_str_us = "2023-10-12T11:29:00.775726+0800"; + const char* ts_str_ms = "2023-10-12T11:29:00.775+0800"; + int64_t ts, tmp_ts = 0; + struct STm tm; + + ASSERT_EQ(TSDB_CODE_SUCCESS, taosParseTime(ts_str_ns, &ts, strlen(ts_str_ns), TSDB_TIME_PRECISION_NANO, 0)); + test_timestamp_tm_conversion(ts, TSDB_TIME_PRECISION_NANO, 2023 - 1900, 9 /* mon start from 0*/, 12, 11, 29, 0, + 775726171L); + + ASSERT_EQ(TSDB_CODE_SUCCESS, taosParseTime(ts_str_us, &ts, strlen(ts_str_us), TSDB_TIME_PRECISION_MICRO, 0)); + test_timestamp_tm_conversion(ts, TSDB_TIME_PRECISION_MICRO, 2023 - 1900, 9 /* mon start from 0*/, 12, 11, 29, 0, + 775726000L); + + ASSERT_EQ(TSDB_CODE_SUCCESS, taosParseTime(ts_str_ms, &ts, strlen(ts_str_ms), TSDB_TIME_PRECISION_MILLI, 0)); + test_timestamp_tm_conversion(ts, TSDB_TIME_PRECISION_MILLI, 2023 - 1900, 9 /* mon start from 0*/, 12, 11, 29, 0, + 775000000L); + + ts = -5364687943000; // milliseconds since epoch, Wednesday, January 1, 1800 1:00:00 AM GMT+08:06 + test_timestamp_tm_conversion(ts, TSDB_TIME_PRECISION_MILLI, 1800 - 1900, 0 /* mon start from 0*/, 1, 1, 0, 0, + 000000000L); + + ts = 0; + test_timestamp_tm_conversion(ts, TSDB_TIME_PRECISION_MILLI, 1970 - 1900, 0 /* mon start from 0*/, 1, 8, 0, 0, + 000000000L); + + ts = -62198784343000; // milliseconds before epoch, Friday, January 1, -0001 12:00:00 AM GMT+08:06 + test_timestamp_tm_conversion(ts, TSDB_TIME_PRECISION_MILLI, -1 - 1900, 0 /* mon start from 0*/, 1, + 0 /* hour start from 0*/, 0, 0, 000000000L); +} + +void test_ts2char(int64_t ts, const char* format, int32_t precison, const char* expected) { + char buf[256] = {0}; + TEST_ts2char(format, ts, precison, buf, 256); + printf("ts: %ld format: %s res: [%s], expected: [%s]\n", ts, format, buf, expected); + ASSERT_STREQ(expected, buf); +} + +TEST(timeTest, ts2char) { + osDefaultInit(); + if (tsTimezone != TdEastZone8) GTEST_SKIP(); + int64_t ts; + const char* format = "YYYY-MM-DD"; + ts = 0; + test_ts2char(ts, format, TSDB_TIME_PRECISION_MILLI, "1970-01-01"); + test_ts2char(ts, format, TSDB_TIME_PRECISION_MICRO, "1970-01-01"); + test_ts2char(ts, format, TSDB_TIME_PRECISION_NANO, "1970-01-01"); + test_ts2char(ts, format, TSDB_TIME_PRECISION_SECONDS, "1970-01-01"); + + ts = 1697163517; + test_ts2char(ts, "YYYY-MM-DD", TSDB_TIME_PRECISION_SECONDS, "2023-10-13"); + ts = 1697163517000; + test_ts2char(ts, "YYYY-MM-DD-Day-DAY", TSDB_TIME_PRECISION_MILLI, "2023-10-13-Friday -FRIDAY "); +#ifndef WINDOWS + // double quoted: year, month, day are not parsed + test_ts2char(ts, + "YYYY-YYY-YY-Y-yyyy-yyy-yy-y-\"年\"-MONTH-MON-Month-Mon-month-mon-\"月\"-DDD-DD-D-ddd-dd-d-DAY-Day-" + "day-\"日\"", + TSDB_TIME_PRECISION_MILLI, + "2023-023-23-3-2023-023-23-3-年-OCTOBER -OCT-October -Oct-october " + "-oct-月-285-13-6-285-13-6-FRIDAY -Friday -friday -日"); +#endif + ts = 1697182085123L; // Friday, October 13, 2023 3:28:05.123 PM GMT+08:00 + test_ts2char(ts, "HH24:hh24:HH12:hh12:HH:hh:MI:mi:SS:ss:MS:ms:US:us:NS:ns:PM:AM:pm:am", TSDB_TIME_PRECISION_MILLI, + "15:15:03:03:03:03:28:28:05:05:123:123:123000:123000:123000000:123000000:PM:PM:pm:pm"); + + // double quotes normal output + test_ts2char(ts, "\\\"HH24:hh24:HH12:hh12:HH:hh:MI:mi:SS:ss:MS:ms:US:us:NS:ns:PM:AM:pm:am\\\"", TSDB_TIME_PRECISION_MILLI, + "\"15:15:03:03:03:03:28:28:05:05:123:123:123000:123000:123000000:123000000:PM:PM:pm:pm\""); + test_ts2char(ts, "\\\"HH24:hh24:HH12:hh12:HH:hh:MI:mi:SS:ss:MS:ms:US:us:NS:ns:PM:AM:pm:am", TSDB_TIME_PRECISION_MILLI, + "\"15:15:03:03:03:03:28:28:05:05:123:123:123000:123000:123000000:123000000:PM:PM:pm:pm"); + // double quoted strings recognized as literal string, parsing skipped + test_ts2char(ts, "\"HH24:hh24:HH12:hh12:HH:hh:MI:mi:SS:ss:MS:ms:US:us:NS:ns:PM:AM:pm:am", TSDB_TIME_PRECISION_MILLI, + "HH24:hh24:HH12:hh12:HH:hh:MI:mi:SS:ss:MS:ms:US:us:NS:ns:PM:AM:pm:am"); + test_ts2char(ts, "yyyy-mm-dd hh24:mi:ss.nsamaaa", TSDB_TIME_PRECISION_MILLI, "2023-10-13 15:28:05.123000000pmaaa"); + test_ts2char(ts, "aaa--yyyy-mm-dd hh24:mi:ss.nsamaaa", TSDB_TIME_PRECISION_MILLI, "aaa--2023-10-13 15:28:05.123000000pmaaa"); + test_ts2char(ts, "add--yyyy-mm-dd hh24:mi:ss.nsamaaa", TSDB_TIME_PRECISION_MILLI, "a13--2023-10-13 15:28:05.123000000pmaaa"); + + ts = 1693946405000; + test_ts2char(ts, "Day, Month dd, YYYY hh24:mi:ss AM TZH:tzh", TSDB_TIME_PRECISION_MILLI, "Wednesday, September 06, 2023 04:40:05 AM +08:+08"); + + ts = -62198784343000; // milliseconds before epoch, Friday, January 1, -0001 12:00:00 AM GMT+08:06 + test_ts2char(ts, "Day, Month dd, YYYY hh12:mi:ss AM", TSDB_TIME_PRECISION_MILLI, "Friday , January 01, -001 12:00:00 AM"); +} + +TEST(timeTest, char2ts) { + osDefaultInit(); + if (tsTimezone != TdEastZone8) GTEST_SKIP(); + int64_t ts; + int32_t code = + TEST_char2ts("YYYY-DD-MM HH12:MI:SS:MSPM", &ts, TSDB_TIME_PRECISION_MILLI, "2023-10-10 12:00:00.000AM"); + ASSERT_EQ(code, 0); + ASSERT_EQ(ts, 1696867200000LL); + + // 2009-1-1 00:00:00 + ASSERT_EQ(0, TEST_char2ts("YYYY-YYY-YY-Y", &ts, TSDB_TIME_PRECISION_MILLI, "2023-123-23-9")); + ASSERT_EQ(1230739200000LL, ts); + // 2023-1-1 + ASSERT_EQ(0, TEST_char2ts("YYYY-YYY-YY", &ts, TSDB_TIME_PRECISION_MILLI, "2023-123-23-9")); + ASSERT_EQ(ts, 1672502400000LL); + + // 2123-1-1, the second year(123) is used, which converted to 2123 + ASSERT_EQ(0, TEST_char2ts("YYYY-YYY", &ts, TSDB_TIME_PRECISION_MILLI, "2023-123-23-9")); + ASSERT_EQ(ts, 4828176000000LL); + // 2023-1-1 12:10:10am + ASSERT_EQ(0, TEST_char2ts("yyyy-mm-dd HH12:MI:SSAM", &ts, TSDB_TIME_PRECISION_MILLI, "2023-1-1 12:10:10am")); + ASSERT_EQ(ts, 1672503010000LL); + + // 2023-1-1 21:10:10.123 + ASSERT_EQ(0, TEST_char2ts("yy-MM-dd HH12:MI:ss.msa.m.", &ts, TSDB_TIME_PRECISION_MILLI, "23-1-01 9:10:10.123p.m.")); + ASSERT_EQ(ts, 1672578610123LL); + + // 2023-1-1 21:10:10.123456789 + ASSERT_EQ(0, TEST_char2ts("yy-MM-dd HH:MI:ss.ms.us.nsa.m.", &ts, TSDB_TIME_PRECISION_NANO, + "23-1-01 9:10:10.123.000456.000000789p.m.")); + ASSERT_EQ(ts, 1672578610123456789LL); + + // 2023-1-1 21:10:10.120450780 + ASSERT_EQ(0, TEST_char2ts("yy-MM-dd HH24:MI:SS.ms.us.ns", &ts, TSDB_TIME_PRECISION_NANO, + " 23 - 1 - 01 \t 21:10:10 . 12 . \t 00045 . 00000078 \t")); + ASSERT_EQ(ts, 1672578610120450780LL); + +#ifndef WINDOWS + // 2023-1-1 21:10:10.120450780 + ASSERT_EQ(0, TEST_char2ts("yy \"年\"-MM 月-dd \"日 子\" HH24:MI:ss.ms.us.ns TZH", &ts, TSDB_TIME_PRECISION_NANO, + " 23 年 - 1 月 - 01 日 子 \t 21:10:10 . 12 . \t 00045 . 00000078 \t+08")); + ASSERT_EQ(ts, 1672578610120450780LL); +#endif + + // 2023-1-1 19:10:10.123456789+06 -> 2023-1-1 21:10:10.123456789+08 + ASSERT_EQ(0, TEST_char2ts("yy-MM-dd HH:MI:ss.ms.us.nsa.m.TZH", &ts, TSDB_TIME_PRECISION_NANO, + "23-1-01 7:10:10.123.000456.000000789p.m.6")); + ASSERT_EQ(ts, 1672578610123456789LL); + + // 2023-1-1 12:10:10.123456789-01 -> 2023-1-1 21:10:10.123456789+08 + ASSERT_EQ(0, TEST_char2ts("yy-MM-dd HH24:MI:ss.ms.us.nsTZH", &ts, TSDB_TIME_PRECISION_NANO, + "23-1-01 12:10:10.123.000456.000000789-1")); + ASSERT_EQ(ts, 1672578610123456789LL); + + // 2100-01-01 11:10:10.124456+08 + ASSERT_EQ( + 0, TEST_char2ts("yyyy-MM-dd HH24:MI:ss.usTZH", &ts, TSDB_TIME_PRECISION_MICRO, "2100-01-01 11:10:10.124456+08")); + ASSERT_EQ(ts, 4102456210124456LL); + + // 2100-01-01 11:10:10.124456+08 Firday + ASSERT_EQ(0, TEST_char2ts("yyyy/MONTH/dd DAY HH24:MI:ss.usTZH", &ts, TSDB_TIME_PRECISION_MICRO, + "2100/january/01 friday 11:10:10.124456+08")); + ASSERT_EQ(ts, 4102456210124456LL); + + ASSERT_EQ(0, TEST_char2ts("yyyy/Month/dd Day HH24:MI:ss.usTZH", &ts, TSDB_TIME_PRECISION_MICRO, + "2100/january/01 FRIDAY 11:10:10.124456+08")); + ASSERT_EQ(ts, 4102456210124456LL); + ASSERT_EQ(0, TEST_char2ts("yyyy/Month/dd Dy HH24:MI:ss.usTZH", &ts, TSDB_TIME_PRECISION_MICRO, + "2100/january/01 Fri 11:10:10.124456+08:00")); + ASSERT_EQ(ts, 4102456210124456LL); + + ASSERT_EQ(0, TEST_char2ts("yyyy/month/dd day HH24:MI:ss.usTZH", &ts, TSDB_TIME_PRECISION_MICRO, + "2100/january/01 Friday 11:10:10.124456+08")); + ASSERT_EQ(ts, 4102456210124456LL); + + // 2100-02-01 11:10:10.124456+08 Firday + ASSERT_EQ(0, TEST_char2ts("yyyy/mon/dd DY HH24:MI:ss.usTZH", &ts, TSDB_TIME_PRECISION_MICRO, + "2100/Feb/01 Mon 11:10:10.124456+08")); + ASSERT_EQ(ts, 4105134610124456LL); + + // 2100-02-01 11:10:10.124456+08 Firday + ASSERT_EQ(0, TEST_char2ts("yyyy/mon/dd DY DDD-DD-D HH24:MI:ss.usTZH", &ts, TSDB_TIME_PRECISION_MICRO, + "2100/Feb/01 Mon 100-1-01 11:10:10.124456+08")); + ASSERT_EQ(ts, 4105134610124456LL); + + ASSERT_EQ(0, TEST_char2ts("yyyyMMdd ", &ts, TSDB_TIME_PRECISION_MICRO, "21000101")); + + // What is Fe? + ASSERT_EQ(-1, TEST_char2ts("yyyy/mon/dd ", &ts, TSDB_TIME_PRECISION_MICRO, "2100/Fe/01")); + // '/' cannot convert to MM + ASSERT_EQ(-1, TEST_char2ts("yyyyMMdd ", &ts, TSDB_TIME_PRECISION_MICRO, "2100/2/1")); + // nothing to be converted to dd + ASSERT_EQ(0, TEST_char2ts("yyyyMMdd ", &ts, TSDB_TIME_PRECISION_MICRO, "210012")); + ASSERT_EQ(ts, 4131273600000000LL); // 2100-12-1 + ASSERT_EQ(-1, TEST_char2ts("yyyyMMdd ", &ts, TSDB_TIME_PRECISION_MICRO, "21001")); + ASSERT_EQ(-1, TEST_char2ts("yyyyMM-dd ", &ts, TSDB_TIME_PRECISION_MICRO, "23a1-1")); + + // 2100-1-2 + ASSERT_EQ(0, TEST_char2ts("yyyyMM/dd ", &ts, TSDB_TIME_PRECISION_MICRO, "21001/2")); + ASSERT_EQ(ts, 4102502400000000LL); + + // default to 1970-1-1 00:00:00+08 -> 1969-12-31 16:00:00+00 + ASSERT_EQ(0, TEST_char2ts("YYYY", &ts, TSDB_TIME_PRECISION_SECONDS, "1970")); + ASSERT_EQ(ts, -1 * tsTimezone * 60 * 60); + + ASSERT_EQ(0, TEST_char2ts("yyyyMM1/dd ", &ts, TSDB_TIME_PRECISION_MICRO, "210001/2")); + ASSERT_EQ(ts, 4102502400000000LL); + + ASSERT_EQ(-2, TEST_char2ts("yyyyMM/dd ", &ts, TSDB_TIME_PRECISION_MICRO, "210013/2")); + ASSERT_EQ(-2, TEST_char2ts("yyyyMM/dd ", &ts, TSDB_TIME_PRECISION_MICRO, "210011/32")); + ASSERT_EQ(-1, TEST_char2ts("HH12:MI:SS", &ts, TSDB_TIME_PRECISION_MICRO, "21:12:12")); + ASSERT_EQ(-1, TEST_char2ts("yyyy/MM1/dd ", &ts, TSDB_TIME_PRECISION_MICRO, "2100111111111/11/2")); + ASSERT_EQ(-2, TEST_char2ts("yyyy/MM1/ddTZH", &ts, TSDB_TIME_PRECISION_MICRO, "23/11/2-13")); + ASSERT_EQ(0, TEST_char2ts("yyyy年 MM/ddTZH", &ts, TSDB_TIME_PRECISION_MICRO, "1970年1/1+0")); + ASSERT_EQ(ts, 0); + ASSERT_EQ(-1, TEST_char2ts("yyyy年a MM/dd", &ts, TSDB_TIME_PRECISION_MICRO, "2023年1/2")); + ASSERT_EQ(0, TEST_char2ts("yyyy年 MM/ddTZH", &ts, TSDB_TIME_PRECISION_MICRO, "1970年 1/1+0")); + ASSERT_EQ(ts, 0); + ASSERT_EQ(0, TEST_char2ts("yyyy年 a a a MM/ddTZH", &ts, TSDB_TIME_PRECISION_MICRO, "1970年 a a a 1/1+0")); + ASSERT_EQ(0, TEST_char2ts("yyyy年 a a a a a a a a a a a a a a a MM/ddTZH", &ts, TSDB_TIME_PRECISION_MICRO, "1970年 a ")); +} + +#pragma GCC diagnostic pop diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c index d5488da770..f3f8d2a27f 100644 --- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c +++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c @@ -163,7 +163,7 @@ SArray *mmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_STREAM, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_PAUSE_STREAM, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_RESUME_STREAM, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; - + if (dmSetMgmtHandle(pArray, TDMT_MND_GRANT_RSP, mmPutMsgToReadQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_RETRIEVE_IP_WHITE, mmPutMsgToReadQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_GET_USER_WHITELIST, mmPutMsgToReadQueue, 0) == NULL) goto _OVER; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index cc542f51ce..c4d525a871 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -137,7 +137,7 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) { SRetention *pRetention = &pCfg->tsdbCfg.retentions[i]; memcpy(pRetention, taosArrayGet(pCreate->pRetensions, i), sizeof(SRetention)); if (i == 0) { - if ((pRetention->freq > 0 && pRetention->keep > 0)) pCfg->isRsma = 1; + if ((pRetention->freq >= 0 && pRetention->keep > 0)) pCfg->isRsma = 1; } } diff --git a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h index 20789772e5..36097438a2 100644 --- a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h +++ b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h @@ -97,7 +97,7 @@ int32_t dmMarkWrapper(SMgmtWrapper *pWrapper); void dmReleaseWrapper(SMgmtWrapper *pWrapper); int32_t dmInitVars(SDnode *pDnode); void dmClearVars(SDnode *pDnode); -int32_t dmInitModule(SDnode *pDnode); +int32_t dmInitModule(SDnode *pDnode, SMgmtWrapper *wrappers); bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper); SMgmtInputOpt dmBuildMgmtInputOpt(SMgmtWrapper *pWrapper); void dmSetStatus(SDnode *pDnode, EDndRunStatus stype); @@ -119,7 +119,7 @@ int32_t dmInitStatusClient(SDnode *pDnode); void dmCleanupClient(SDnode *pDnode); void dmCleanupStatusClient(SDnode *pDnode); SMsgCb dmGetMsgcb(SDnode *pDnode); -int32_t dmInitMsgHandle(SDnode *pDnode); +int32_t dmInitMsgHandle(SDnode *pDnode, SMgmtWrapper *wrappers); int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg); // dmMonitor.c diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c index 5164d60ba6..409ee45cd3 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c @@ -66,7 +66,7 @@ int32_t dmInitDnode(SDnode *pDnode) { goto _OVER; } - if (dmInitModule(pDnode) != 0) { + if (dmInitModule(pDnode, pDnode->wrappers) != 0) { goto _OVER; } @@ -107,6 +107,75 @@ void dmCleanupDnode(SDnode *pDnode) { dDebug("dnode is closed, ptr:%p", pDnode); } +int32_t dmInitVars(SDnode *pDnode) { + SDnodeData *pData = &pDnode->data; + pData->dnodeId = 0; + pData->clusterId = 0; + pData->dnodeVer = 0; + pData->engineVer = 0; + pData->updateTime = 0; + pData->rebootTime = taosGetTimestampMs(); + pData->dropped = 0; + pData->stopped = 0; + + pData->dnodeHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK); + if (pData->dnodeHash == NULL) { + dError("failed to init dnode hash"); + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + if (dmReadEps(pData) != 0) { + dError("failed to read file since %s", terrstr()); + return -1; + } + + if (pData->dropped) { + dError("dnode will not start since its already dropped"); + return -1; + } + + taosThreadRwlockInit(&pData->lock, NULL); + taosThreadMutexInit(&pDnode->mutex, NULL); + return 0; +} + +void dmClearVars(SDnode *pDnode) { + for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) { + SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype]; + taosMemoryFreeClear(pWrapper->path); + taosThreadRwlockDestroy(&pWrapper->lock); + } + if (pDnode->lockfile != NULL) { + taosUnLockFile(pDnode->lockfile); + taosCloseFile(&pDnode->lockfile); + pDnode->lockfile = NULL; + } + + SDnodeData *pData = &pDnode->data; + taosThreadRwlockWrlock(&pData->lock); + if (pData->oldDnodeEps != NULL) { + if (dmWriteEps(pData) == 0) { + dmRemoveDnodePairs(pData); + } + taosArrayDestroy(pData->oldDnodeEps); + pData->oldDnodeEps = NULL; + } + if (pData->dnodeEps != NULL) { + taosArrayDestroy(pData->dnodeEps); + pData->dnodeEps = NULL; + } + if (pData->dnodeHash != NULL) { + taosHashCleanup(pData->dnodeHash); + pData->dnodeHash = NULL; + } + taosThreadRwlockUnlock(&pData->lock); + + taosThreadRwlockDestroy(&pData->lock); + taosThreadMutexDestroy(&pDnode->mutex); + memset(&pDnode->mutex, 0, sizeof(pDnode->mutex)); +} + void dmSetStatus(SDnode *pDnode, EDndRunStatus status) { if (pDnode->status != status) { dDebug("dnode status set from %s to %s", dmStatStr(pDnode->status), dmStatStr(status)); diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index ce6b21dd56..ad5ca2cecf 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -251,11 +251,11 @@ _OVER: dmReleaseWrapper(pWrapper); } -int32_t dmInitMsgHandle(SDnode *pDnode) { +int32_t dmInitMsgHandle(SDnode *pDnode, SMgmtWrapper *wrappers) { SDnodeTrans *pTrans = &pDnode->trans; for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) { - SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype]; + SMgmtWrapper *pWrapper = wrappers + ntype; SArray *pArray = (*pWrapper->func.getHandlesFp)(); if (pArray == NULL) return -1; diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 50e5ec46b8..6d77a48110 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -397,6 +397,7 @@ void mndGetDnodeData(SMnode *pMnode, SArray *pDnodeInfo) { SDnodeInfo dInfo; dInfo.id = pDnode->id; dInfo.ep.port = pDnode->port; + dInfo.offlineReason = pDnode->offlineReason; tstrncpy(dInfo.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN); tstrncpy(dInfo.active, pDnode->active, TSDB_ACTIVE_KEY_LEN); tstrncpy(dInfo.connActive, pDnode->connActive, TSDB_CONN_ACTIVE_KEY_LEN); @@ -781,11 +782,7 @@ static int32_t mndConfigDnode(SMnode *pMnode, SRpcMsg *pReq, SMCfgDnodeReq *pCfg SDnodeObj tmpDnode = *pDnode; if (action == DND_ACTIVE_CODE) { -#ifndef TD_GRANT_OPTIMIZE - if (grantAlterActiveCode(pDnode->active, pCfgReq->value, tmpDnode.active, 0) != 0) { -#else if (grantAlterActiveCode(pDnode->id, pDnode->active, pCfgReq->value, tmpDnode.active, 0) != 0) { -#endif if (TSDB_CODE_DUP_KEY != terrno) { mError("dnode:%d, config dnode:%d, app:%p config:%s value:%s failed since %s", pDnode->id, pCfgReq->dnodeId, pReq->info.ahandle, pCfgReq->config, pCfgReq->value, terrstr()); @@ -801,11 +798,7 @@ static int32_t mndConfigDnode(SMnode *pMnode, SRpcMsg *pReq, SMCfgDnodeReq *pCfg goto _OVER; } } else if (action == DND_CONN_ACTIVE_CODE) { -#ifndef TD_GRANT_OPTIMIZE - if (grantAlterActiveCode(pDnode->connActive, pCfgReq->value, tmpDnode.connActive, 1) != 0) { -#else if (grantAlterActiveCode(pDnode->id, pDnode->connActive, pCfgReq->value, tmpDnode.connActive, 1) != 0) { -#endif if (TSDB_CODE_DUP_KEY != terrno) { mError("dnode:%d, config dnode:%d, app:%p config:%s value:%s failed since %s", pDnode->id, pCfgReq->dnodeId, pReq->info.ahandle, pCfgReq->config, pCfgReq->value, terrstr()); diff --git a/source/dnode/mnode/impl/src/mndGrant.c b/source/dnode/mnode/impl/src/mndGrant.c index 9f2ac68da5..c4e1894263 100644 --- a/source/dnode/mnode/impl/src/mndGrant.c +++ b/source/dnode/mnode/impl/src/mndGrant.c @@ -131,13 +131,9 @@ void grantAdd(EGrantType grant, uint64_t value) {} void grantRestore(EGrantType grant, uint64_t value) {} int32_t dmProcessGrantReq(void *pInfo, SRpcMsg *pMsg) { return TSDB_CODE_SUCCESS; } int32_t dmProcessGrantNotify(void *pInfo, SRpcMsg *pMsg) { return TSDB_CODE_SUCCESS; } -#ifndef TD_GRANT_OPTIMIZE -int32_t grantAlterActiveCode(const char *old, const char *new, char *out, int8_t type) { return TSDB_CODE_SUCCESS; } -#else int32_t grantAlterActiveCode(int32_t did, const char *old, const char *new, char *out, int8_t type) { return TSDB_CODE_SUCCESS; } -#endif #endif diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 1c87cde78a..08ad6cc909 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -281,7 +281,7 @@ static void *mndThreadFp(void *param) { mndCalMqRebalance(pMnode); } - if (sec % tsStreamCheckpointTickInterval == 0) { + if (sec % tsStreamCheckpointInterval == 0) { mndStreamCheckpointTick(pMnode, sec); } diff --git a/source/dnode/mnode/impl/src/mndScheduler.c b/source/dnode/mnode/impl/src/mndScheduler.c index 2931f6be6b..404198a523 100644 --- a/source/dnode/mnode/impl/src/mndScheduler.c +++ b/source/dnode/mnode/impl/src/mndScheduler.c @@ -569,6 +569,10 @@ static int32_t addSinkTasks(SArray* pTasksList, SMnode* pMnode, SStreamObj* pStr } static void setSinkTaskUpstreamInfo(SArray* pTasksList, const SStreamTask* pUpstreamTask) { + if (taosArrayGetSize(pTasksList) < SINK_NODE_LEVEL || pUpstreamTask == NULL) { + return; + } + SArray* pSinkTaskList = taosArrayGetP(pTasksList, SINK_NODE_LEVEL); for(int32_t i = 0; i < taosArrayGetSize(pSinkTaskList); ++i) { SStreamTask* pSinkTask = taosArrayGetP(pSinkTaskList, i); @@ -628,7 +632,9 @@ static int32_t doScheduleStream(SStreamObj* pStream, SMnode* pMnode, SQueryPlan* } setSinkTaskUpstreamInfo(pStream->tasks, pAggTask); - setSinkTaskUpstreamInfo(pStream->pHTasksList, pHAggTask); + if (pHAggTask != NULL) { + setSinkTaskUpstreamInfo(pStream->pHTasksList, pHAggTask); + } // source level return addSourceTasksForMultiLevelStream(pMnode, pPlan, pStream, pAggTask, pHAggTask, pEpset, nextWindowSkey); diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index 06c0e96c02..6f78f99302 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -42,22 +42,22 @@ typedef struct SNodeEntry { int64_t hbTimestamp; // second } SNodeEntry; -typedef struct SStreamExecNodeInfo { +typedef struct SStreamExecInfo { SArray *pNodeEntryList; int64_t ts; // snapshot ts int64_t activeCheckpoint; // active check point id SHashObj *pTaskMap; SArray *pTaskList; TdThreadMutex lock; -} SStreamExecNodeInfo; +} SStreamExecInfo; typedef struct SVgroupChangeInfo { SHashObj *pDBMap; SArray *pUpdateNodeList; // SArray } SVgroupChangeInfo; -static int32_t mndNodeCheckSentinel = 0; -static SStreamExecNodeInfo execNodeList; +static int32_t mndNodeCheckSentinel = 0; +static SStreamExecInfo execInfo; static int32_t mndStreamActionInsert(SSdb *pSdb, SStreamObj *pStream); static int32_t mndStreamActionDelete(SSdb *pSdb, SStreamObj *pStream); @@ -77,19 +77,21 @@ static int32_t mndBuildStreamCheckpointSourceReq2(void **pBuf, int32_t *pLen, in int64_t streamId, int32_t taskId); static int32_t mndProcessNodeCheck(SRpcMsg *pReq); static int32_t mndProcessNodeCheckReq(SRpcMsg *pMsg); +static SArray *extractNodeListFromStream(SMnode *pMnode); +static SArray *mndTakeVgroupSnapshot(SMnode *pMnode, bool* allReady); -static SArray *extractNodeListFromStream(SMnode *pMnode); -static SArray *mndTakeVgroupSnapshot(SMnode *pMnode); static SVgroupChangeInfo mndFindChangedNodeInfo(SMnode *pMnode, const SArray *pPrevNodeList, const SArray *pNodeList); static STrans *doCreateTrans(SMnode *pMnode, SStreamObj *pStream, const char *name); static int32_t mndPersistTransLog(SStreamObj *pStream, STrans *pTrans); -static void initTransAction(STransAction *pAction, void *pCont, int32_t contLen, int32_t msgType, const SEpSet *pEpset); -static int32_t createStreamUpdateTrans(SMnode *pMnode, SStreamObj *pStream, SVgroupChangeInfo *pInfo); - -static void removeStreamTasksInBuf(SStreamObj* pStream, SStreamExecNodeInfo * pExecNode); -static void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecNodeInfo *pExecNode); +static void initTransAction(STransAction *pAction, void *pCont, int32_t contLen, int32_t msgType, const SEpSet *pEpset, + int32_t retryCode); +static int32_t createStreamUpdateTrans(SStreamObj *pStream, SVgroupChangeInfo *pInfo, STrans *pTrans); +static void removeStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode); +static void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode); static int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot); +static int32_t doKillActiveCheckpointTrans(SMnode *pMnode); +static int32_t setNodeEpsetExpiredFlag(const SArray* pNodeList); int32_t mndInitStream(SMnode *pMnode) { SSdbTable table = { @@ -129,18 +131,18 @@ int32_t mndInitStream(SMnode *pMnode) { mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STREAM_TASKS, mndRetrieveStreamTask); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STREAM_TASKS, mndCancelGetNextStreamTask); - taosThreadMutexInit(&execNodeList.lock, NULL); - execNodeList.pTaskMap = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK); - execNodeList.pTaskList = taosArrayInit(4, sizeof(STaskId)); + taosThreadMutexInit(&execInfo.lock, NULL); + execInfo.pTaskMap = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK); + execInfo.pTaskList = taosArrayInit(4, sizeof(STaskId)); return sdbSetTable(pMnode->pSdb, table); } void mndCleanupStream(SMnode *pMnode) { - taosArrayDestroy(execNodeList.pTaskList); - taosHashCleanup(execNodeList.pTaskMap); - taosThreadMutexDestroy(&execNodeList.lock); - mDebug("mnd stream cleanup"); + taosArrayDestroy(execInfo.pTaskList); + taosHashCleanup(execInfo.pTaskMap); + taosThreadMutexDestroy(&execInfo.lock); + mDebug("mnd stream exec info cleanup"); } SSdbRaw *mndStreamActionEncode(SStreamObj *pStream) { @@ -286,7 +288,7 @@ void mndReleaseStream(SMnode *pMnode, SStreamObj *pStream) { static void mndShowStreamStatus(char *dst, SStreamObj *pStream) { int8_t status = atomic_load_8(&pStream->status); if (status == STREAM_STATUS__NORMAL) { - strcpy(dst, "normal"); + strcpy(dst, "ready"); } else if (status == STREAM_STATUS__STOP) { strcpy(dst, "stop"); } else if (status == STREAM_STATUS__FAILED) { @@ -294,7 +296,7 @@ static void mndShowStreamStatus(char *dst, SStreamObj *pStream) { } else if (status == STREAM_STATUS__RECOVER) { strcpy(dst, "recover"); } else if (status == STREAM_STATUS__PAUSE) { - strcpy(dst, "pause"); + strcpy(dst, "paused"); } } @@ -516,7 +518,7 @@ int32_t mndPersistTaskDeployReq(STrans *pTrans, SStreamTask *pTask) { STransAction action = {0}; action.mTraceId = pTrans->mTraceId; - initTransAction(&action, buf, tlen, TDMT_STREAM_TASK_DEPLOY, &pTask->info.epSet); + initTransAction(&action, buf, tlen, TDMT_STREAM_TASK_DEPLOY, &pTask->info.epSet, 0); if (mndTransAppendRedoAction(pTrans, &action) != 0) { taosMemoryFree(buf); return -1; @@ -688,7 +690,7 @@ static int32_t mndPersistTaskDropReq(STrans *pTrans, SStreamTask *pTask) { pReq->streamId = pTask->id.streamId; STransAction action = {0}; - initTransAction(&action, pReq, sizeof(SVDropStreamTaskReq), TDMT_STREAM_TASK_DROP, &pTask->info.epSet); + initTransAction(&action, pReq, sizeof(SVDropStreamTaskReq), TDMT_STREAM_TASK_DROP, &pTask->info.epSet, 0); if (mndTransAppendRedoAction(pTrans, &action) != 0) { taosMemoryFree(pReq); return -1; @@ -847,10 +849,10 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) { mndTransDrop(pTrans); - taosThreadMutexLock(&execNodeList.lock); + taosThreadMutexLock(&execInfo.lock); mDebug("register to stream task node list"); - keepStreamTasksInBuf(&streamObj, &execNodeList); - taosThreadMutexUnlock(&execNodeList.lock); + keepStreamTasksInBuf(&streamObj, &execInfo); + taosThreadMutexUnlock(&execInfo.lock); code = TSDB_CODE_ACTION_IN_PROGRESS; @@ -882,9 +884,8 @@ static int32_t mndProcessStreamCheckpointTmr(SRpcMsg *pReq) { return 0; } - int64_t checkpointId = taosGetTimestampMs(); SMStreamDoCheckpointMsg *pMsg = rpcMallocCont(sizeof(SMStreamDoCheckpointMsg)); - pMsg->checkpointId = checkpointId; + pMsg->checkpointId = taosGetTimestampMs(); int32_t size = sizeof(SMStreamDoCheckpointMsg); SRpcMsg rpcMsg = {.msgType = TDMT_MND_STREAM_BEGIN_CHECKPOINT, .pCont = pMsg, .contLen = size}; @@ -936,7 +937,7 @@ static int32_t mndBuildStreamCheckpointSourceReq2(void **pBuf, int32_t *pLen, in } // static int32_t mndProcessStreamCheckpointTrans(SMnode *pMnode, SStreamObj *pStream, int64_t checkpointId) { // int64_t timestampMs = taosGetTimestampMs(); -// if (timestampMs - pStream->checkpointFreq < tsStreamCheckpointTickInterval * 1000) { +// if (timestampMs - pStream->checkpointFreq < tsStreamCheckpointInterval * 1000) { // return -1; // } @@ -1069,7 +1070,7 @@ static int32_t mndAddStreamCheckpointToTrans(STrans *pTrans, SStreamObj *pStream STransAction action = {0}; SEpSet epset = mndGetVgroupEpset(pMnode, pVgObj); - initTransAction(&action, buf, tlen, TDMT_VND_STREAM_CHECK_POINT_SOURCE, &epset); + initTransAction(&action, buf, tlen, TDMT_VND_STREAM_CHECK_POINT_SOURCE, &epset, TSDB_CODE_SYN_PROPOSE_NOT_READY); mndReleaseVgroup(pMnode, pVgObj); if (mndTransAppendRedoAction(pTrans, &action) != 0) { @@ -1084,6 +1085,7 @@ static int32_t mndAddStreamCheckpointToTrans(STrans *pTrans, SStreamObj *pStream pStream->checkpointId = chkptId; pStream->checkpointFreq = taosGetTimestampMs(); pStream->currentTick = 0; + // 3. commit log: stream checkpoint info pStream->version = pStream->version + 1; @@ -1133,31 +1135,37 @@ static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) { { // check if the node update happens or not int64_t ts = taosGetTimestampSec(); - if (execNodeList.pNodeEntryList == NULL || (taosArrayGetSize(execNodeList.pNodeEntryList) == 0)) { - if (execNodeList.pNodeEntryList != NULL) { - execNodeList.pNodeEntryList = taosArrayDestroy(execNodeList.pNodeEntryList); + if (execInfo.pNodeEntryList == NULL || (taosArrayGetSize(execInfo.pNodeEntryList) == 0)) { + if (execInfo.pNodeEntryList != NULL) { + execInfo.pNodeEntryList = taosArrayDestroy(execInfo.pNodeEntryList); } - execNodeList.pNodeEntryList = extractNodeListFromStream(pMnode); + execInfo.pNodeEntryList = extractNodeListFromStream(pMnode); } - if (taosArrayGetSize(execNodeList.pNodeEntryList) == 0) { + if (taosArrayGetSize(execInfo.pNodeEntryList) == 0) { mDebug("stream task node change checking done, no vgroups exist, do nothing"); - execNodeList.ts = ts; + execInfo.ts = ts; return 0; } - for(int32_t i = 0; i < taosArrayGetSize(execNodeList.pNodeEntryList); ++i) { - SNodeEntry* pNodeEntry = taosArrayGet(execNodeList.pNodeEntryList, i); + for(int32_t i = 0; i < taosArrayGetSize(execInfo.pNodeEntryList); ++i) { + SNodeEntry* pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, i); if (pNodeEntry->stageUpdated) { mDebug("stream task not ready due to node update detected, checkpoint not issued"); return 0; } } - SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode); + bool allReady = true; + SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode, &allReady); + if (!allReady) { + mWarn("not all vnodes are ready, ignore the checkpoint") + taosArrayDestroy(pNodeSnapshot); + return 0; + } - SVgroupChangeInfo changeInfo = mndFindChangedNodeInfo(pMnode, execNodeList.pNodeEntryList, pNodeSnapshot); + SVgroupChangeInfo changeInfo = mndFindChangedNodeInfo(pMnode, execInfo.pNodeEntryList, pNodeSnapshot); bool nodeUpdated = (taosArrayGetSize(changeInfo.pUpdateNodeList) > 0); taosArrayDestroy(changeInfo.pUpdateNodeList); taosHashCleanup(changeInfo.pDBMap); @@ -1169,26 +1177,25 @@ static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) { } } - { // check if all tasks are in TASK_STATUS__NORMAL status + { // check if all tasks are in TASK_STATUS__READY status bool ready = true; - taosThreadMutexLock(&execNodeList.lock); - for (int32_t i = 0; i < taosArrayGetSize(execNodeList.pTaskList); ++i) { - STaskId *p = taosArrayGet(execNodeList.pTaskList, i); - STaskStatusEntry* pEntry = taosHashGet(execNodeList.pTaskMap, p, sizeof(*p)); + taosThreadMutexLock(&execInfo.lock); + for (int32_t i = 0; i < taosArrayGetSize(execInfo.pTaskList); ++i) { + STaskId *p = taosArrayGet(execInfo.pTaskList, i); + STaskStatusEntry* pEntry = taosHashGet(execInfo.pTaskMap, p, sizeof(*p)); if (pEntry == NULL) { continue; } - if (pEntry->status != TASK_STATUS__NORMAL) { + if (pEntry->status != TASK_STATUS__READY) { mDebug("s-task:0x%" PRIx64 "-0x%x (nodeId:%d) status:%s not ready, checkpoint msg not issued", - pEntry->id.streamId, (int32_t)pEntry->id.taskId, 0, streamGetTaskStatusStr(pEntry->status)); + pEntry->id.streamId, (int32_t)pEntry->id.taskId, 0, streamTaskGetStatusStr(pEntry->status)); ready = false; break; } } - taosThreadMutexUnlock(&execNodeList.lock); - + taosThreadMutexUnlock(&execInfo.lock); if (!ready) { return 0; } @@ -1202,7 +1209,8 @@ static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) { mError("failed to trigger checkpoint, reason: %s", tstrerror(TSDB_CODE_OUT_OF_MEMORY)); return -1; } - mDebug("start to trigger checkpoint, checkpointId: %" PRId64 "", checkpointId); + + mDebug("start to trigger checkpoint, checkpointId: %" PRId64, checkpointId); const char *pDb = mndGetStreamDB(pMnode); mndTransSetDbName(pTrans, pDb, "checkpoint"); @@ -1228,11 +1236,16 @@ static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) { if (code == 0) { if (mndTransPrepare(pMnode, pTrans) != 0) { - mError("failed to prepre trans rebalance since %s", terrstr()); + mError("failed to prepare trans rebalance since %s", terrstr()); } } mndTransDrop(pTrans); + + // only one trans here + taosThreadMutexLock(&execInfo.lock); + execInfo.activeCheckpoint = checkpointId; + taosThreadMutexUnlock(&execInfo.lock); return code; } @@ -1310,7 +1323,7 @@ static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) { return -1; } - removeStreamTasksInBuf(pStream, &execNodeList); + removeStreamTasksInBuf(pStream, &execInfo); SName name = {0}; tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB); @@ -1561,12 +1574,12 @@ static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock char status[20 + VARSTR_HEADER_SIZE] = {0}; STaskId id = {.streamId = pTask->id.streamId, .taskId = pTask->id.taskId}; - STaskStatusEntry* pe = taosHashGet(execNodeList.pTaskMap, &id, sizeof(id)); + STaskStatusEntry* pe = taosHashGet(execInfo.pTaskMap, &id, sizeof(id)); if (pe == NULL) { continue; } - const char* pStatus = streamGetTaskStatusStr(pe->status); + const char* pStatus = streamTaskGetStatusStr(pe->status); STR_TO_VARSTR(status, pStatus); // status @@ -1641,7 +1654,7 @@ static int32_t mndPauseStreamTask(STrans *pTrans, SStreamTask *pTask) { pReq->streamId = pTask->id.streamId; STransAction action = {0}; - initTransAction(&action, pReq, sizeof(SVPauseStreamTaskReq), TDMT_STREAM_TASK_PAUSE, &pTask->info.epSet); + initTransAction(&action, pReq, sizeof(SVPauseStreamTaskReq), TDMT_STREAM_TASK_PAUSE, &pTask->info.epSet, 0); if (mndTransAppendRedoAction(pTrans, &action) != 0) { taosMemoryFree(pReq); return -1; @@ -1774,7 +1787,7 @@ static int32_t mndResumeStreamTask(STrans *pTrans, SStreamTask *pTask, int8_t ig pReq->igUntreated = igUntreated; STransAction action = {0}; - initTransAction(&action, pReq, sizeof(SVResumeStreamTaskReq), TDMT_STREAM_TASK_RESUME, &pTask->info.epSet); + initTransAction(&action, pReq, sizeof(SVResumeStreamTaskReq), TDMT_STREAM_TASK_RESUME, &pTask->info.epSet, 0); if (mndTransAppendRedoAction(pTrans, &action) != 0) { taosMemoryFree(pReq); return -1; @@ -1878,18 +1891,19 @@ static int32_t mndProcessResumeStreamReq(SRpcMsg *pReq) { return TSDB_CODE_ACTION_IN_PROGRESS; } -static void initNodeUpdateMsg(SStreamTaskNodeUpdateMsg *pMsg, const SVgroupChangeInfo *pInfo, int64_t streamId, - int32_t taskId) { - pMsg->streamId = streamId; - pMsg->taskId = taskId; +static void initNodeUpdateMsg(SStreamTaskNodeUpdateMsg *pMsg, const SVgroupChangeInfo *pInfo, SStreamTaskId *pId, + int32_t transId) { + pMsg->streamId = pId->streamId; + pMsg->taskId = pId->taskId; + pMsg->transId = transId; pMsg->pNodeList = taosArrayInit(taosArrayGetSize(pInfo->pUpdateNodeList), sizeof(SNodeUpdateInfo)); taosArrayAddAll(pMsg->pNodeList, pInfo->pUpdateNodeList); } static int32_t doBuildStreamTaskUpdateMsg(void **pBuf, int32_t *pLen, SVgroupChangeInfo *pInfo, int32_t nodeId, - int64_t streamId, int32_t taskId) { + SStreamTaskId* pId, int32_t transId) { SStreamTaskNodeUpdateMsg req = {0}; - initNodeUpdateMsg(&req, pInfo, streamId, taskId); + initNodeUpdateMsg(&req, pInfo, pId, transId); int32_t code = 0; int32_t blen; @@ -1953,20 +1967,19 @@ int32_t mndPersistTransLog(SStreamObj *pStream, STrans *pTrans) { return 0; } -void initTransAction(STransAction *pAction, void *pCont, int32_t contLen, int32_t msgType, const SEpSet *pEpset) { +void initTransAction(STransAction *pAction, void *pCont, int32_t contLen, int32_t msgType, const SEpSet *pEpset, + int32_t retryCode) { pAction->epSet = *pEpset; pAction->contLen = contLen; pAction->pCont = pCont; pAction->msgType = msgType; + pAction->retryCode = retryCode; } // todo extract method: traverse stream tasks // build trans to update the epset -static int32_t createStreamUpdateTrans(SMnode *pMnode, SStreamObj *pStream, SVgroupChangeInfo *pInfo) { - STrans* pTrans = doCreateTrans(pMnode, pStream, "stream-task-update"); - if (pTrans == NULL) { - return terrno; - } +static int32_t createStreamUpdateTrans(SStreamObj *pStream, SVgroupChangeInfo *pInfo, STrans *pTrans) { + mDebug("start to build stream:0x%" PRIx64 " tasks epset update", pStream->uid); taosWLockLatch(&pStream->lock); int32_t numOfLevels = taosArrayGetSize(pStream->tasks); @@ -1981,38 +1994,20 @@ static int32_t createStreamUpdateTrans(SMnode *pMnode, SStreamObj *pStream, SVgr void *pBuf = NULL; int32_t len = 0; streamTaskUpdateEpsetInfo(pTask, pInfo->pUpdateNodeList); - doBuildStreamTaskUpdateMsg(&pBuf, &len, pInfo, pTask->info.nodeId, pTask->id.streamId, pTask->id.taskId); + doBuildStreamTaskUpdateMsg(&pBuf, &len, pInfo, pTask->info.nodeId, &pTask->id, pTrans->id); STransAction action = {0}; - initTransAction(&action, pBuf, len, TDMT_VND_STREAM_TASK_UPDATE, &pTask->info.epSet); + initTransAction(&action, pBuf, len, TDMT_VND_STREAM_TASK_UPDATE, &pTask->info.epSet, 0); if (mndTransAppendRedoAction(pTrans, &action) != 0) { taosMemoryFree(pBuf); taosWUnLockLatch(&pStream->lock); - mndTransDrop(pTrans); return -1; } } } taosWUnLockLatch(&pStream->lock); - - int32_t code = mndPersistTransLog(pStream, pTrans); - if (code != TSDB_CODE_SUCCESS) { - sdbRelease(pMnode->pSdb, pStream); - return -1; - } - - if (mndTransPrepare(pMnode, pTrans) != 0) { - mError("trans:%d, failed to prepare update stream trans since %s", pTrans->id, terrstr()); - sdbRelease(pMnode->pSdb, pStream); - mndTransDrop(pTrans); - return -1; - } - - sdbRelease(pMnode->pSdb, pStream); - mndTransDrop(pTrans); - - return TSDB_CODE_ACTION_IN_PROGRESS; + return 0; } static bool isNodeEpsetChanged(const SEpSet *pPrevEpset, const SEpSet *pCurrent) { @@ -2050,8 +2045,8 @@ static SVgroupChangeInfo mndFindChangedNodeInfo(SMnode *pMnode, const SArray *pP char buf[256] = {0}; EPSET_TO_STR(&pCurrent->epset, buf); - mDebug("nodeId:%d epset changed detected, old:%s:%d -> new:%s", pCurrent->nodeId, pPrevEp->fqdn, - pPrevEp->port, buf); + mDebug("nodeId:%d restart/epset changed detected, old:%s:%d -> new:%s, stageUpdate:%d", pCurrent->nodeId, + pPrevEp->fqdn, pPrevEp->port, buf, pPrevEntry->stageUpdated); SNodeUpdateInfo updateInfo = {.nodeId = pPrevEntry->nodeId}; epsetAssign(&updateInfo.prevEp, &pPrevEntry->epset); @@ -2071,11 +2066,12 @@ static SVgroupChangeInfo mndFindChangedNodeInfo(SMnode *pMnode, const SArray *pP return info; } -static SArray *mndTakeVgroupSnapshot(SMnode *pMnode) { +static SArray *mndTakeVgroupSnapshot(SMnode *pMnode, bool* allReady) { SSdb *pSdb = pMnode->pSdb; void *pIter = NULL; SVgObj *pVgroup = NULL; + *allReady = true; SArray *pVgroupListSnapshot = taosArrayInit(4, sizeof(SNodeEntry)); while (1) { @@ -2087,8 +2083,26 @@ static SArray *mndTakeVgroupSnapshot(SMnode *pMnode) { SNodeEntry entry = {0}; entry.epset = mndGetVgroupEpset(pMnode, pVgroup); entry.nodeId = pVgroup->vgId; - entry.hbTimestamp = -1; + entry.hbTimestamp = pVgroup->updateTime; + if (*allReady) { + for (int32_t i = 0; i < pVgroup->replica; ++i) { + if (!pVgroup->vnodeGid[i].syncRestore) { + *allReady = false; + break; + } + + ESyncState state = pVgroup->vnodeGid[i].syncState; + if (state == TAOS_SYNC_STATE_OFFLINE || state == TAOS_SYNC_STATE_ERROR) { + *allReady = false; + break; + } + } + } + + char buf[256] = {0}; + EPSET_TO_STR(&entry.epset, buf); + mDebug("take node snapshot, nodeId:%d %s", entry.nodeId, buf); taosArrayPush(pVgroupListSnapshot, &entry); sdbRelease(pSdb, pVgroup); } @@ -2102,27 +2116,63 @@ static int32_t mndProcessVgroupChange(SMnode *pMnode, SVgroupChangeInfo *pChange // check all streams that involved this vnode should update the epset info SStreamObj *pStream = NULL; void *pIter = NULL; + STrans *pTrans = NULL; + while (1) { pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream); if (pIter == NULL) { break; } + // here create only one trans + if (pTrans == NULL) { + pTrans = doCreateTrans(pMnode, pStream, "stream-task-update"); + if (pTrans == NULL) { + sdbRelease(pSdb, pStream); + sdbCancelFetch(pSdb, pIter); + return terrno; + } + } + void *p = taosHashGet(pChangeInfo->pDBMap, pStream->targetDb, strlen(pStream->targetDb)); void *p1 = taosHashGet(pChangeInfo->pDBMap, pStream->sourceDb, strlen(pStream->sourceDb)); if (p == NULL && p1 == NULL) { - mndReleaseStream(pMnode, pStream); + mDebug("stream:0x%" PRIx64 " %s not involved nodeUpdate, ignore", pStream->uid, pStream->name); + sdbRelease(pSdb, pStream); continue; } - mDebug("stream:0x%" PRIx64 " involved node changed, create update trans", pStream->uid); - int32_t code = createStreamUpdateTrans(pMnode, pStream, pChangeInfo); + mDebug("stream:0x%" PRIx64 " %s involved node changed, create update trans, transId:%d", pStream->uid, + pStream->name, pTrans->id); + + int32_t code = createStreamUpdateTrans(pStream, pChangeInfo, pTrans); + + // todo: not continue, drop all and retry again + if (code != TSDB_CODE_SUCCESS) { + mError("stream:0x%" PRIx64 " build nodeUpdate trans failed, ignore and continue, code:%s", pStream->uid, + tstrerror(code)); + sdbRelease(pSdb, pStream); + continue; + } + + code = mndPersistTransLog(pStream, pTrans); + sdbRelease(pSdb, pStream); + if (code != TSDB_CODE_SUCCESS) { sdbCancelFetch(pSdb, pIter); - return code; + return -1; } } + if (mndTransPrepare(pMnode, pTrans) != 0) { + mError("trans:%d, failed to prepare update stream trans since %s", pTrans->id, terrstr()); + sdbRelease(pMnode->pSdb, pStream); + mndTransDrop(pTrans); + return -1; + } + + sdbRelease(pMnode->pSdb, pStream); + mndTransDrop(pTrans); return 0; } @@ -2165,6 +2215,10 @@ static SArray *extractNodeListFromStream(SMnode *pMnode) { while ((pIter = taosHashIterate(pHash, pIter)) != NULL) { SNodeEntry *pEntry = (SNodeEntry *)pIter; taosArrayPush(plist, pEntry); + + char buf[256] = {0}; + EPSET_TO_STR(&pEntry->epset, buf); + mDebug("extract nodeInfo from stream obj, nodeId:%d, %s", pEntry->nodeId, buf); } taosHashCleanup(pHash); @@ -2182,28 +2236,31 @@ static void doExtractTasksFromStream(SMnode *pMnode) { break; } - keepStreamTasksInBuf(pStream, &execNodeList); + keepStreamTasksInBuf(pStream, &execInfo); sdbRelease(pSdb, pStream); } } -static int32_t doRemoveFromTask(SStreamExecNodeInfo* pExecNode, STaskId* pRemovedId) { +static int32_t doRemoveTasks(SStreamExecInfo *pExecNode, STaskId *pRemovedId) { void *p = taosHashGet(pExecNode->pTaskMap, pRemovedId, sizeof(*pRemovedId)); + if (p == NULL) { + return TSDB_CODE_SUCCESS; + } - if (p != NULL) { - taosHashRemove(pExecNode->pTaskMap, pRemovedId, sizeof(*pRemovedId)); + taosHashRemove(pExecNode->pTaskMap, pRemovedId, sizeof(*pRemovedId)); - for(int32_t k = 0; k < taosArrayGetSize(pExecNode->pTaskList); ++k) { - STaskId* pId = taosArrayGet(pExecNode->pTaskList, k); - if (pId->taskId == pRemovedId->taskId && pId->streamId == pRemovedId->streamId) { - taosArrayRemove(pExecNode->pTaskList, k); - mInfo("s-task:0x%x removed from buffer, remain:%d", (int32_t) pRemovedId->taskId, - (int32_t)taosArrayGetSize(pExecNode->pTaskList)); - break; - } + for (int32_t k = 0; k < taosArrayGetSize(pExecNode->pTaskList); ++k) { + STaskId *pId = taosArrayGet(pExecNode->pTaskList, k); + if (pId->taskId == pRemovedId->taskId && pId->streamId == pRemovedId->streamId) { + taosArrayRemove(pExecNode->pTaskList, k); + + int32_t num = taosArrayGetSize(pExecNode->pTaskList); + mInfo("s-task:0x%x removed from buffer, remain:%d", (int32_t)pRemovedId->taskId, num); + break; } } - return 0; + + return TSDB_CODE_SUCCESS; } static bool taskNodeExists(SArray* pList, int32_t nodeId) { @@ -2220,31 +2277,31 @@ static bool taskNodeExists(SArray* pList, int32_t nodeId) { } int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot) { - SArray* pRemoveTaskList = taosArrayInit(4, sizeof(STaskId)); + SArray* pRemovedTasks = taosArrayInit(4, sizeof(STaskId)); - int32_t numOfTask = taosArrayGetSize(execNodeList.pTaskList); + int32_t numOfTask = taosArrayGetSize(execInfo.pTaskList); for(int32_t i = 0; i < numOfTask; ++i) { - STaskId* pId = taosArrayGet(execNodeList.pTaskList, i); - STaskStatusEntry* pEntry = taosHashGet(execNodeList.pTaskMap, pId, sizeof(*pId)); + STaskId* pId = taosArrayGet(execInfo.pTaskList, i); + STaskStatusEntry* pEntry = taosHashGet(execInfo.pTaskMap, pId, sizeof(*pId)); bool existed = taskNodeExists(pNodeSnapshot, pEntry->nodeId); if (!existed) { - taosArrayPush(pRemoveTaskList, pId); + taosArrayPush(pRemovedTasks, pId); } } - for(int32_t i = 0; i < taosArrayGetSize(pRemoveTaskList); ++i) { - STaskId* pId = taosArrayGet(pRemoveTaskList, i); - doRemoveFromTask(&execNodeList, pId); + for(int32_t i = 0; i < taosArrayGetSize(pRemovedTasks); ++i) { + STaskId* pId = taosArrayGet(pRemovedTasks, i); + doRemoveTasks(&execInfo, pId); } - mDebug("remove invalid stream tasks:%d, remain:%d", (int32_t)taosArrayGetSize(pRemoveTaskList), - (int32_t) taosArrayGetSize(execNodeList.pTaskList)); + mDebug("remove invalid stream tasks:%d, remain:%d", (int32_t)taosArrayGetSize(pRemovedTasks), + (int32_t) taosArrayGetSize(execInfo.pTaskList)); int32_t size = taosArrayGetSize(pNodeSnapshot); SArray* pValidNodeEntryList = taosArrayInit(4, sizeof(SNodeEntry)); - for(int32_t i = 0; i < taosArrayGetSize(execNodeList.pNodeEntryList); ++i) { - SNodeEntry* p = taosArrayGet(execNodeList.pNodeEntryList, i); + for(int32_t i = 0; i < taosArrayGetSize(execInfo.pNodeEntryList); ++i) { + SNodeEntry* p = taosArrayGet(execInfo.pNodeEntryList, i); for(int32_t j = 0; j < size; ++j) { SNodeEntry* pEntry = taosArrayGet(pNodeSnapshot, j); @@ -2255,10 +2312,11 @@ int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot) { } } - execNodeList.pNodeEntryList = taosArrayDestroy(execNodeList.pNodeEntryList); - execNodeList.pNodeEntryList = pValidNodeEntryList; + execInfo.pNodeEntryList = taosArrayDestroy(execInfo.pNodeEntryList); + execInfo.pNodeEntryList = pValidNodeEntryList; - taosArrayDestroy(pRemoveTaskList); + mDebug("remain %d valid node entries", (int32_t) taosArrayGetSize(pValidNodeEntryList)); + taosArrayDestroy(pRemovedTasks); return 0; } @@ -2275,43 +2333,55 @@ static int32_t mndProcessNodeCheckReq(SRpcMsg *pMsg) { int64_t ts = taosGetTimestampSec(); SMnode *pMnode = pMsg->info.node; - if (execNodeList.pNodeEntryList == NULL || (taosArrayGetSize(execNodeList.pNodeEntryList) == 0)) { - if (execNodeList.pNodeEntryList != NULL) { - execNodeList.pNodeEntryList = taosArrayDestroy(execNodeList.pNodeEntryList); + if (execInfo.pNodeEntryList == NULL || (taosArrayGetSize(execInfo.pNodeEntryList) == 0)) { + if (execInfo.pNodeEntryList != NULL) { + execInfo.pNodeEntryList = taosArrayDestroy(execInfo.pNodeEntryList); } - - execNodeList.pNodeEntryList = extractNodeListFromStream(pMnode); + execInfo.pNodeEntryList = extractNodeListFromStream(pMnode); } - if (taosArrayGetSize(execNodeList.pNodeEntryList) == 0) { + if (taosArrayGetSize(execInfo.pNodeEntryList) == 0) { mDebug("end to do stream task node change checking, no vgroup exists, do nothing"); - execNodeList.ts = ts; + execInfo.ts = ts; atomic_store_32(&mndNodeCheckSentinel, 0); return 0; } - SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode); + bool allVnodeReady = true; + SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode, &allVnodeReady); + if (!allVnodeReady) { + taosArrayDestroy(pNodeSnapshot); + atomic_store_32(&mndNodeCheckSentinel, 0); + mWarn("not all vnodes are ready, ignore the exec nodeUpdate check"); + return 0; + } - taosThreadMutexLock(&execNodeList.lock); + taosThreadMutexLock(&execInfo.lock); removeExpirednodeEntryAndTask(pNodeSnapshot); - SVgroupChangeInfo changeInfo = mndFindChangedNodeInfo(pMnode, execNodeList.pNodeEntryList, pNodeSnapshot); + SVgroupChangeInfo changeInfo = mndFindChangedNodeInfo(pMnode, execInfo.pNodeEntryList, pNodeSnapshot); if (taosArrayGetSize(changeInfo.pUpdateNodeList) > 0) { + + // kill current active checkpoint transaction, since the transaction is vnode wide. + doKillActiveCheckpointTrans(pMnode); code = mndProcessVgroupChange(pMnode, &changeInfo); // keep the new vnode snapshot if (code == TSDB_CODE_SUCCESS || code == TSDB_CODE_ACTION_IN_PROGRESS) { mDebug("create trans successfully, update cached node list"); - taosArrayDestroy(execNodeList.pNodeEntryList); - execNodeList.pNodeEntryList = pNodeSnapshot; - execNodeList.ts = ts; + taosArrayDestroy(execInfo.pNodeEntryList); + execInfo.pNodeEntryList = pNodeSnapshot; + execInfo.ts = ts; + } else { + mDebug("unexpect code during create nodeUpdate trans, code:%s", tstrerror(code)); + taosArrayDestroy(pNodeSnapshot); } } else { mDebug("no update found in nodeList"); taosArrayDestroy(pNodeSnapshot); } - taosThreadMutexUnlock(&execNodeList.lock); + taosThreadMutexUnlock(&execInfo.lock); taosArrayDestroy(changeInfo.pUpdateNodeList); taosHashCleanup(changeInfo.pDBMap); @@ -2324,10 +2394,6 @@ typedef struct SMStreamNodeCheckMsg { int8_t placeHolder; // // to fix windows compile error, define place holder } SMStreamNodeCheckMsg; -typedef struct SMStreamTaskResetMsg { - int8_t placeHolder; -} SMStreamTaskResetMsg; - static int32_t mndProcessNodeCheck(SRpcMsg *pReq) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; @@ -2343,7 +2409,7 @@ static int32_t mndProcessNodeCheck(SRpcMsg *pReq) { return 0; } -void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecNodeInfo *pExecNode) { +void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode) { int32_t level = taosArrayGetSize(pStream->tasks); for (int32_t i = 0; i < level; i++) { @@ -2368,7 +2434,7 @@ void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecNodeInfo *pExecNode) { } } -void removeStreamTasksInBuf(SStreamObj* pStream, SStreamExecNodeInfo * pExecNode) { +void removeStreamTasksInBuf(SStreamObj* pStream, SStreamExecInfo * pExecNode) { int32_t level = taosArrayGetSize(pStream->tasks); for (int32_t i = 0; i < level; i++) { SArray *pLevel = taosArrayGetP(pStream->tasks, i); @@ -2399,7 +2465,7 @@ void removeStreamTasksInBuf(SStreamObj* pStream, SStreamExecNodeInfo * pExecNode ASSERT(taosHashGetSize(pExecNode->pTaskMap) == taosArrayGetSize(pExecNode->pTaskList)); } -static STrans* doCreateTrans(SMnode* pMnode, SStreamObj* pStream, const char* name) { +STrans *doCreateTrans(SMnode *pMnode, SStreamObj *pStream, const char *name) { STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, NULL, name); if (pTrans == NULL) { mError("failed to build trans:%s, reason: %s", name, tstrerror(TSDB_CODE_OUT_OF_MEMORY)); @@ -2451,7 +2517,7 @@ int32_t createStreamResetStatusTrans(SMnode* pMnode, SStreamObj* pStream) { pReq->streamId = pTask->id.streamId; STransAction action = {0}; - initTransAction(&action, pReq, sizeof(SVResetStreamTaskReq), TDMT_VND_STREAM_TASK_RESET, &pTask->info.epSet); + initTransAction(&action, pReq, sizeof(SVResetStreamTaskReq), TDMT_VND_STREAM_TASK_RESET, &pTask->info.epSet, 0); if (mndTransAppendRedoAction(pTrans, &action) != 0) { taosMemoryFree(pReq); taosWUnLockLatch(&pStream->lock); @@ -2482,29 +2548,26 @@ int32_t createStreamResetStatusTrans(SMnode* pMnode, SStreamObj* pStream) { return TSDB_CODE_ACTION_IN_PROGRESS; } -int32_t mndResetFromCheckpoint(SMnode* pMnode) { - // find the checkpoint trans id +int32_t doKillActiveCheckpointTrans(SMnode *pMnode) { int32_t transId = 0; + SSdb *pSdb = pMnode->pSdb; + STrans *pTrans = NULL; + void *pIter = NULL; - { - SSdb *pSdb = pMnode->pSdb; - STrans *pTrans = NULL; - void* pIter = NULL; - while (1) { - pIter = sdbFetch(pSdb, SDB_TRANS, pIter, (void **)&pTrans); - if (pIter == NULL) { - break; - } - - if (strncmp(pTrans->opername, MND_STREAM_CHECKPOINT_NAME, tListLen(pTrans->opername) - 1) == 0) { - transId = pTrans->id; - sdbRelease(pSdb, pTrans); - sdbCancelFetch(pSdb, pIter); - break; - } - - sdbRelease(pSdb, pTrans); + while (1) { + pIter = sdbFetch(pSdb, SDB_TRANS, pIter, (void **)&pTrans); + if (pIter == NULL) { + break; } + + if (strncmp(pTrans->opername, MND_STREAM_CHECKPOINT_NAME, tListLen(pTrans->opername) - 1) == 0) { + transId = pTrans->id; + sdbRelease(pSdb, pTrans); + sdbCancelFetch(pSdb, pIter); + break; + } + + sdbRelease(pSdb, pTrans); } if (transId == 0) { @@ -2512,8 +2575,16 @@ int32_t mndResetFromCheckpoint(SMnode* pMnode) { return TSDB_CODE_SUCCESS; } - STrans* pTrans = mndAcquireTrans(pMnode, transId); + pTrans = mndAcquireTrans(pMnode, transId); + mInfo("kill checkpoint trans:%d", transId); + mndKillTrans(pMnode, pTrans); + mndReleaseTrans(pMnode, pTrans); + return TSDB_CODE_SUCCESS; +} + +int32_t mndResetFromCheckpoint(SMnode* pMnode) { + doKillActiveCheckpointTrans(pMnode); // set all tasks status to be normal, refactor later to be stream level, instead of vnode level. SSdb *pSdb = pMnode->pSdb; @@ -2525,6 +2596,7 @@ int32_t mndResetFromCheckpoint(SMnode* pMnode) { break; } + // todo this transaction should exist be only one mDebug("stream:%s (0x%" PRIx64 ") reset checkpoint procedure, create reset trans", pStream->name, pStream->uid); int32_t code = createStreamResetStatusTrans(pMnode, pStream); if (code != TSDB_CODE_SUCCESS) { @@ -2536,6 +2608,43 @@ int32_t mndResetFromCheckpoint(SMnode* pMnode) { return 0; } +int32_t setNodeEpsetExpiredFlag(const SArray* pNodeList) { + int32_t num = taosArrayGetSize(pNodeList); + + for (int k = 0; k < num; ++k) { + int32_t* pVgId = taosArrayGet(pNodeList, k); + + int32_t numOfNodes = taosArrayGetSize(execInfo.pNodeEntryList); + for (int i = 0; i < numOfNodes; ++i) { + SNodeEntry* pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, i); + + if (pNodeEntry->nodeId == *pVgId) { + mInfo("vgId:%d expired in stream task, needs update nodeEp", *pVgId); + pNodeEntry->stageUpdated = true; + break; + } + } + } + + return TSDB_CODE_SUCCESS; +} + +static void updateStageInfo(STaskStatusEntry* pTaskEntry, int32_t stage) { + int32_t numOfNodes = taosArrayGetSize(execInfo.pNodeEntryList); + for(int32_t j = 0; j < numOfNodes; ++j) { + SNodeEntry* pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, j); + if (pNodeEntry->nodeId == pTaskEntry->nodeId) { + + mInfo("vgId:%d stage updated from %d to %d, nodeUpdate trigger by s-task:0x%" PRIx64, pTaskEntry->nodeId, + pTaskEntry->stage, stage, pTaskEntry->id.taskId); + + pNodeEntry->stageUpdated = true; + pTaskEntry->stage = stage; + break; + } + } +} + int32_t mndProcessStreamHb(SRpcMsg *pReq) { SMnode *pMnode = pReq->info.node; SStreamHbMsg req = {0}; @@ -2555,35 +2664,26 @@ int32_t mndProcessStreamHb(SRpcMsg *pReq) { mTrace("receive stream-meta hb from vgId:%d, active numOfTasks:%d", req.vgId, req.numOfTasks); - taosThreadMutexLock(&execNodeList.lock); - int32_t numOfExisted = taosHashGetSize(execNodeList.pTaskMap); + taosThreadMutexLock(&execInfo.lock); + int32_t numOfExisted = taosHashGetSize(execInfo.pTaskMap); if (numOfExisted == 0) { doExtractTasksFromStream(pMnode); } + setNodeEpsetExpiredFlag(req.pUpdateNodes); + for (int32_t i = 0; i < req.numOfTasks; ++i) { STaskStatusEntry *p = taosArrayGet(req.pTaskStatus, i); - STaskStatusEntry *pEntry = taosHashGet(execNodeList.pTaskMap, &p->id, sizeof(p->id)); - if (pEntry == NULL) { + STaskStatusEntry *pTaskEntry = taosHashGet(execInfo.pTaskMap, &p->id, sizeof(p->id)); + if (pTaskEntry == NULL) { mError("s-task:0x%" PRIx64 " not found in mnode task list", p->id.taskId); continue; } - if (p->stage != pEntry->stage && pEntry->stage != -1) { - int32_t numOfNodes = taosArrayGetSize(execNodeList.pNodeEntryList); - for(int32_t j = 0; j < numOfNodes; ++j) { - SNodeEntry* pNodeEntry = taosArrayGet(execNodeList.pNodeEntryList, j); - if (pNodeEntry->nodeId == pEntry->nodeId) { - mInfo("vgId:%d stage updated, from %d to %d, nodeUpdate trigger by s-task:0x%" PRIx64, - pEntry->nodeId, pEntry->stage, p->stage, pEntry->id.taskId); - - pNodeEntry->stageUpdated = true; - pEntry->stage = p->stage; - break; - } - } + if (pTaskEntry->stage != p->stage && pTaskEntry->stage != -1) { + updateStageInfo(pTaskEntry, p->stage); } else { - streamTaskStatusCopy(pEntry, p); + streamTaskStatusCopy(pTaskEntry, p); if (p->activeCheckpointId != 0) { if (activeCheckpointId != 0) { ASSERT(activeCheckpointId == p->activeCheckpointId); @@ -2597,26 +2697,32 @@ int32_t mndProcessStreamHb(SRpcMsg *pReq) { } } - pEntry->status = p->status; - if (p->status != TASK_STATUS__NORMAL) { - mDebug("received s-task:0x%"PRIx64" not in ready status:%s", p->id.taskId, streamGetTaskStatusStr(p->status)); + pTaskEntry->status = p->status; + if (p->status != TASK_STATUS__READY) { + mDebug("received s-task:0x%"PRIx64" not in ready status:%s", p->id.taskId, streamTaskGetStatusStr(p->status)); } } // current checkpoint is failed, rollback from the checkpoint trans // kill the checkpoint trans and then set all tasks status to be normal if (checkpointFailed && activeCheckpointId != 0) { - if (execNodeList.activeCheckpoint != activeCheckpointId) { - mInfo("checkpointId:%"PRId64" failed, issue task-reset trans to reset all tasks status", activeCheckpointId); - execNodeList.activeCheckpoint = activeCheckpointId; + bool allReady = true; + SArray* p = mndTakeVgroupSnapshot(pMnode, &allReady); + taosArrayDestroy(p); + + if (allReady) { + // if the execInfo.activeCheckpoint == 0, the checkpoint is restoring from wal + mInfo("checkpointId:%" PRId64 " failed, issue task-reset trans to reset all tasks status", + execInfo.activeCheckpoint); mndResetFromCheckpoint(pMnode); } else { - mDebug("checkpoint:%"PRId64" reset has issued already, ignore it", activeCheckpointId); + mInfo("not all vgroups are ready, wait for next HB from stream tasks"); } } - taosThreadMutexUnlock(&execNodeList.lock); + taosThreadMutexUnlock(&execInfo.lock); taosArrayDestroy(req.pTaskStatus); + taosArrayDestroy(req.pUpdateNodes); return TSDB_CODE_SUCCESS; } diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c index 7f6a0397ad..f46f33ac22 100644 --- a/source/dnode/mnode/impl/src/mndSync.c +++ b/source/dnode/mnode/impl/src/mndSync.c @@ -95,7 +95,11 @@ static int32_t mndTransValidatePrepareAction(SMnode *pMnode, STrans *pTrans, STr } _OUT: - taosMemoryFreeClear(pRow); + if (pRow) { + SdbDeleteFp deleteFp = pSdb->deleteFps[pRaw->type]; + if (deleteFp) (*deleteFp)(pSdb, pRow->pObj, false); + taosMemoryFreeClear(pRow); + } return code; } diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 417dcb0ce0..54e28948ef 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -754,10 +754,14 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup for (int32_t v = 0; v < pVgroup->replica; ++v) { SVnodeGid *pVgid = &pVgroup->vnodeGid[v]; SDnodeObj *pDnode = taosArrayGet(pArray, v); - if (pDnode == NULL || pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) { + if (pDnode == NULL) { terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES; return -1; } + if (pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) { + terrno = TSDB_CODE_MND_NO_ENOUGH_VNODES; + return -1; + } int64_t vgMem = mndGetVgroupMemory(pMnode, pDb, pVgroup); if (pDnode->memAvail - vgMem - pDnode->memUsed <= 0) { @@ -1180,10 +1184,14 @@ static int32_t mndAddVnodeToVgroup(SMnode *pMnode, STrans *pTrans, SVgObj *pVgro } if (used) continue; - if (pDnode == NULL || pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) { + if (pDnode == NULL) { terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES; return -1; } + if (pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) { + terrno = TSDB_CODE_MND_NO_ENOUGH_VNODES; + return -1; + } int64_t vgMem = mndGetVgroupMemory(pMnode, NULL, pVgroup); if (pDnode->memAvail - vgMem - pDnode->memUsed <= 0) { @@ -1912,7 +1920,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, if (numOfVnodes >= pNew1->numOfSupportVnodes) { mError("vgId:%d, no enough vnodes in dnode:%d, numOfVnodes:%d support:%d", newVg.vgId, pNew1->id, numOfVnodes, pNew1->numOfSupportVnodes); - terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES; + terrno = TSDB_CODE_MND_NO_ENOUGH_VNODES; goto _OVER; } @@ -1935,7 +1943,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, if (numOfVnodes >= pNew2->numOfSupportVnodes) { mError("vgId:%d, no enough vnodes in dnode:%d, numOfVnodes:%d support:%d", newVg.vgId, pNew2->id, numOfVnodes, pNew2->numOfSupportVnodes); - terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES; + terrno = TSDB_CODE_MND_NO_ENOUGH_VNODES; goto _OVER; } int64_t vgMem = mndGetVgroupMemory(pMnode, NULL, pVgroup); @@ -1956,7 +1964,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, if (numOfVnodes >= pNew3->numOfSupportVnodes) { mError("vgId:%d, no enough vnodes in dnode:%d, numOfVnodes:%d support:%d", newVg.vgId, pNew3->id, numOfVnodes, pNew3->numOfSupportVnodes); - terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES; + terrno = TSDB_CODE_MND_NO_ENOUGH_VNODES; goto _OVER; } int64_t vgMem = mndGetVgroupMemory(pMnode, NULL, pVgroup); diff --git a/source/dnode/snode/src/snode.c b/source/dnode/snode/src/snode.c index 6451dba2da..4e84b4cd26 100644 --- a/source/dnode/snode/src/snode.c +++ b/source/dnode/snode/src/snode.c @@ -92,11 +92,13 @@ int32_t sndExpandTask(SSnode *pSnode, SStreamTask *pTask, int64_t nextProcessVer } } - qInfo("snode:%d expand stream task, s-task:%s, checkpointId:%" PRId64 " checkpointVer:%" PRId64 " nextProcessVer:%" PRId64 - " child id:%d, level:%d, status:%s fill-history:%d, trigger:%" PRId64 " ms", + char* p = NULL; + streamTaskGetStatus(pTask, &p); + + qInfo("snode:%d expand stream task, s-task:%s, checkpointId:%" PRId64 " checkpointVer:%" PRId64 + " nextProcessVer:%" PRId64 " child id:%d, level:%d, status:%s fill-history:%d, trigger:%" PRId64 " ms", SNODE_HANDLE, pTask->id.idStr, pChkInfo->checkpointId, pChkInfo->checkpointVer, pChkInfo->nextProcessVer, - pTask->info.selfChildId, pTask->info.taskLevel, streamGetTaskStatusStr(pTask->status.taskStatus), - pTask->info.fillHistory, pTask->info.triggerParam); + pTask->info.selfChildId, pTask->info.taskLevel, p, pTask->info.fillHistory, pTask->info.triggerParam); return 0; } @@ -174,9 +176,15 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) { int32_t numOfTasks = streamMetaGetNumOfTasks(pSnode->pMeta); taosWUnLockLatch(&pSnode->pMeta->lock); - qDebug("snode:%d s-task:%s is deployed on snode and add into meta, status:%s, numOfTasks:%d", SNODE_HANDLE, pTask->id.idStr, - streamGetTaskStatusStr(pTask->status.taskStatus), numOfTasks); + char* p = NULL; + streamTaskGetStatus(pTask, &p); + + qDebug("snode:%d s-task:%s is deployed on snode and add into meta, status:%s, numOfTasks:%d", SNODE_HANDLE, + pTask->id.idStr, p, numOfTasks); + + EStreamTaskEvent event = (HAS_RELATED_FILLHISTORY_TASK(pTask)) ? TASK_EVENT_INIT_STREAM_SCANHIST : TASK_EVENT_INIT; + streamTaskHandleEvent(pTask->status.pSM, event); streamTaskCheckDownstream(pTask); return 0; } @@ -352,10 +360,10 @@ int32_t sndProcessStreamTaskCheckReq(SSnode *pSnode, SRpcMsg *pMsg) { if (pTask != NULL) { rsp.status = streamTaskCheckStatus(pTask, req.upstreamTaskId, req.upstreamNodeId, req.stage); streamMetaReleaseTask(pSnode->pMeta, pTask); - - const char* pStatus = streamGetTaskStatusStr(pTask->status.taskStatus); + char* p = NULL; + streamTaskGetStatus(pTask, &p); qDebug("s-task:%s status:%s, recv task check req(reqId:0x%" PRIx64 ") task:0x%x (vgId:%d), ready:%d", - pTask->id.idStr, pStatus, rsp.reqId, rsp.upstreamTaskId, rsp.upstreamNodeId, rsp.status); + pTask->id.idStr, p, rsp.reqId, rsp.upstreamTaskId, rsp.upstreamNodeId, rsp.status); } else { rsp.status = TASK_DOWNSTREAM_NOT_READY; qDebug("recv task check(taskId:0x%x not built yet) req(reqId:0x%" PRIx64 ") from task:0x%x (vgId:%d), rsp status %d", diff --git a/source/dnode/vnode/src/inc/tq.h b/source/dnode/vnode/src/inc/tq.h index 6ab2bc75c7..76d89be802 100644 --- a/source/dnode/vnode/src/inc/tq.h +++ b/source/dnode/vnode/src/inc/tq.h @@ -126,7 +126,6 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols, int8_t precision); int32_t tqSendDataRsp(STqHandle* pHandle, const SRpcMsg* pMsg, const SMqPollReq* pReq, const SMqDataRsp* pRsp, int32_t type, int32_t vgId); -//int32_t tqPushDataRsp(STqHandle* pHandle, int32_t vgId); int32_t tqPushEmptyDataRsp(STqHandle* pHandle, int32_t vgId); // tqMeta @@ -134,7 +133,6 @@ int32_t tqMetaOpen(STQ* pTq); int32_t tqMetaClose(STQ* pTq); int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle); int32_t tqMetaDeleteHandle(STQ* pTq, const char* key); -//int32_t tqMetaRestoreHandle(STQ* pTq); int32_t tqMetaSaveCheckInfo(STQ* pTq, const char* key, const void* value, int32_t vLen); int32_t tqMetaDeleteCheckInfo(STQ* pTq, const char* key); int32_t tqMetaRestoreCheckInfo(STQ* pTq); @@ -160,8 +158,8 @@ int32_t tqOffsetRestoreFromFile(STqOffsetStore* pStore, const char* fname); // tqStream int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver); int32_t tqScanWal(STQ* pTq); -int32_t tqCheckAndRunStreamTask(STQ* pTq); -int32_t tqStartStreamTasks(STQ* pTq); +int32_t tqStartStreamTask(STQ* pTq); +int32_t tqResetStreamTaskStatus(STQ* pTq); int32_t tqStopStreamTasks(STQ* pTq); // tq util @@ -171,6 +169,12 @@ int32_t tqDoSendDataRsp(const SRpcHandleInfo* pRpcHandleInfo, const SMqDataRsp* int32_t type, int64_t sver, int64_t ever); int32_t tqInitDataRsp(SMqDataRsp* pRsp, STqOffsetVal pOffset); void tqUpdateNodeStage(STQ* pTq, bool isLeader); +int32_t setDstTableDataPayload(uint64_t suid, const STSchema* pTSchema, int32_t blockIndex, SSDataBlock* pDataBlock, + SSubmitTbData* pTableData, const char* id); +int32_t doMergeExistedRows(SSubmitTbData* pExisted, const SSubmitTbData* pNew, const char* id); + +SVCreateTbReq* buildAutoCreateTableReq(const char* stbFullName, int64_t suid, int32_t numOfCols, + SSDataBlock* pDataBlock, SArray* pTagArray); #ifdef __cplusplus } diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 857aef78dc..ec69ae5ca7 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -309,7 +309,7 @@ int32_t tsdbTakeReadSnap2(STsdbReader *pReader, _query_reseek_func_t reseek, STs void tsdbUntakeReadSnap2(STsdbReader *pReader, STsdbReadSnap *pSnap, bool proactive); // tsdbMerge.c ============================================================================================== -int32_t tsdbMerge(void *arg); +int32_t tsdbSchedMerge(STsdb *tsdb, int32_t fid); // tsdbDiskData ============================================================================================== int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder); @@ -371,7 +371,7 @@ struct STsdb { char *path; SVnode *pVnode; STsdbKeepCfg keepCfg; - TdThreadRwlock rwLock; + TdThreadMutex mutex; SMemTable *mem; SMemTable *imem; STsdbFS fs; // old @@ -670,8 +670,8 @@ struct SDelFWriter { }; #include "tarray2.h" -//#include "tsdbFS2.h" -// struct STFileSet; +// #include "tsdbFS2.h" +// struct STFileSet; typedef struct STFileSet STFileSet; typedef TARRAY2(STFileSet *) TFileSetArray; diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 12e273c32d..89d70bfabb 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -231,7 +231,7 @@ int32_t tqProcessTaskCheckPointSourceReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg* pRsp) int32_t tqProcessTaskCheckpointReadyMsg(STQ* pTq, SRpcMsg* pMsg); int32_t tqProcessTaskUpdateReq(STQ* pTq, SRpcMsg* pMsg); int32_t tqProcessTaskResetReq(STQ* pTq, SRpcMsg* pMsg); -int32_t tqCheckAndRunStreamTaskAsync(STQ* pTq); +int32_t tqLaunchStreamTaskAsync(STQ* pTq); int tqCommit(STQ*); int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd); diff --git a/source/dnode/vnode/src/sma/smaOpen.c b/source/dnode/vnode/src/sma/smaOpen.c index 49f25c0b0a..633e096314 100644 --- a/source/dnode/vnode/src/sma/smaOpen.c +++ b/source/dnode/vnode/src/sma/smaOpen.c @@ -31,21 +31,21 @@ static int32_t rsmaRestore(SSma *pSma); } while (0) #define SMA_OPEN_RSMA_IMPL(v, l, force) \ - do { \ - SRetention *r = (SRetention *)VND_RETENTIONS(v) + l; \ - if (!RETENTION_VALID(r)) { \ - if (l == 0) { \ - code = TSDB_CODE_INVALID_PARA; \ - TSDB_CHECK_CODE(code, lino, _exit); \ - } \ - break; \ - } \ - code = smaSetKeepCfg(v, &keepCfg, pCfg, TSDB_TYPE_RSMA_L##l); \ - TSDB_CHECK_CODE(code, lino, _exit); \ + do { \ + SRetention *r = (SRetention *)VND_RETENTIONS(v) + l; \ + if (!RETENTION_VALID(l, r)) { \ + if (l == 0) { \ + code = TSDB_CODE_INVALID_PARA; \ + TSDB_CHECK_CODE(code, lino, _exit); \ + } \ + break; \ + } \ + code = smaSetKeepCfg(v, &keepCfg, pCfg, TSDB_TYPE_RSMA_L##l); \ + TSDB_CHECK_CODE(code, lino, _exit); \ if (tsdbOpen(v, &SMA_RSMA_TSDB##l(pSma), VNODE_RSMA##l##_DIR, &keepCfg, rollback, force) < 0) { \ - code = terrno; \ - TSDB_CHECK_CODE(code, lino, _exit); \ - } \ + code = terrno; \ + TSDB_CHECK_CODE(code, lino, _exit); \ + } \ } while (0) /** @@ -79,20 +79,18 @@ static int32_t smaEvalDays(SVnode *pVnode, SRetention *r, int8_t level, int8_t p freqDuration = convertTimeFromPrecisionToUnit((r + level)->freq, precision, TIME_UNIT_MINUTE); keepDuration = convertTimeFromPrecisionToUnit((r + level)->keep, precision, TIME_UNIT_MINUTE); - int32_t nFreqTimes = (r + level)->freq / (r + TSDB_RETENTION_L0)->freq; + int32_t nFreqTimes = (r + level)->freq / (60 * 1000); // use 60s for freq of 1st level days *= (nFreqTimes > 1 ? nFreqTimes : 1); - if (days > keepDuration) { - days = keepDuration; - } - - if (days > TSDB_MAX_DURATION_PER_FILE) { - days = TSDB_MAX_DURATION_PER_FILE; - } - if (days < freqDuration) { days = freqDuration; } + + int32_t maxKeepDuration = TMIN(keepDuration, TSDB_MAX_DURATION_PER_FILE); + if (days > maxKeepDuration) { + days = maxKeepDuration; + } + _exit: smaInfo("vgId:%d, evaluated duration for level %d is %d, raw val:%d", TD_VID(pVnode), level + 1, days, duration); return days; @@ -157,6 +155,7 @@ int32_t smaOpen(SVnode *pVnode, int8_t rollback, bool force) { _exit: if (code) { smaError("vgId:%d, %s failed at line %d since %s", TD_VID(pVnode), __func__, lino, tstrerror(code)); + terrno = code; } return code; } diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index 8da2fff5a6..14c5baa402 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -31,8 +31,6 @@ SSmaMgmt smaMgmt = { typedef struct SRSmaQTaskInfoItem SRSmaQTaskInfoItem; -extern int32_t tsdbDoRetention(STsdb *pTsdb, int64_t now); - static int32_t tdUidStorePut(STbUidStore *pStore, tb_uid_t suid, tb_uid_t *uid); static void tdUidStoreDestory(STbUidStore *pStore); static int32_t tdUpdateTbUidListImpl(SSma *pSma, tb_uid_t *suid, SArray *tbUids, bool isAdd); diff --git a/source/dnode/vnode/src/sma/smaTimeRange.c b/source/dnode/vnode/src/sma/smaTimeRange.c index 0c37008344..08ddc4bd7b 100644 --- a/source/dnode/vnode/src/sma/smaTimeRange.c +++ b/source/dnode/vnode/src/sma/smaTimeRange.c @@ -35,8 +35,8 @@ int32_t tdProcessTSmaInsert(SSma *pSma, int64_t indexUid, const char *msg) { return code; } -int32_t tdProcessTSmaCreate(SSma *pSma, int64_t version, const char *msg) { - int32_t code = tdProcessTSmaCreateImpl(pSma, version, msg); +int32_t tdProcessTSmaCreate(SSma *pSma, int64_t ver, const char *msg) { + int32_t code = tdProcessTSmaCreateImpl(pSma, ver, msg); return code; } @@ -109,7 +109,7 @@ _exit: * @param pMsg * @return int32_t */ -static int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg) { +static int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t ver, const char *pMsg) { int32_t code = 0; int32_t lino = 0; SSmaCfg *pCfg = (SSmaCfg *)pMsg; @@ -118,7 +118,7 @@ static int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char * if (TD_VID(pSma->pVnode) == pCfg->dstVgId) { // create tsma meta in dstVgId - if (metaCreateTSma(SMA_META(pSma), version, pCfg) < 0) { + if (metaCreateTSma(SMA_META(pSma), ver, pCfg) < 0) { code = terrno; TSDB_CHECK_CODE(code, lino, _exit); } @@ -130,7 +130,7 @@ static int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char * pReq.schemaRow = pCfg->schemaRow; pReq.schemaTag = pCfg->schemaTag; - if (metaCreateSTable(SMA_META(pSma), version, &pReq) < 0) { + if (metaCreateSTable(SMA_META(pSma), ver, &pReq) < 0) { code = terrno; TSDB_CHECK_CODE(code, lino, _exit); } @@ -154,94 +154,36 @@ _exit: return code; } -int32_t smaBlockToSubmit(SVnode *pVnode, const SArray *pBlocks, const STSchema *pTSchema, - SSchemaWrapper *pTagSchemaWrapper, bool createTb, int64_t suid, const char *stbFullName, - SBatchDeleteReq *pDeleteReq, void **ppData, int32_t *pLen) { +int32_t smaBlockToSubmit(SVnode *pVnode, const SArray *pBlocks, const STSchema *pTSchema, int64_t suid, + const char *stbFullName, SBatchDeleteReq *pDeleteReq, void **ppData, int32_t *pLen) { int32_t code = 0; int32_t lino = 0; void *pBuf = NULL; int32_t len = 0; SSubmitReq2 *pReq = NULL; SArray *tagArray = NULL; - SArray *createTbArray = NULL; - SArray *pVals = NULL; - int32_t sz = taosArrayGetSize(pBlocks); + int32_t numOfBlocks = taosArrayGetSize(pBlocks); tagArray = taosArrayInit(1, sizeof(STagVal)); - createTbArray = taosArrayInit(sz, POINTER_BYTES); pReq = taosMemoryCalloc(1, sizeof(SSubmitReq2)); - pReq->aSubmitTbData = taosArrayInit(1, sizeof(SSubmitTbData)); - if(!tagArray || !createTbArray || !pReq || !pReq->aSubmitTbData) { + if (!tagArray || !pReq) { code = terrno == TSDB_CODE_SUCCESS ? TSDB_CODE_OUT_OF_MEMORY : terrno; TSDB_CHECK_CODE(code, lino, _exit); } - // create table req - if (createTb) { - for (int32_t i = 0; i < sz; ++i) { - SSDataBlock *pDataBlock = taosArrayGet(pBlocks, i); - SVCreateTbReq *pCreateTbReq = NULL; - if (pDataBlock->info.type == STREAM_DELETE_RESULT) { - taosArrayPush(createTbArray, &pCreateTbReq); - continue; - } - - if (!(pCreateTbReq = taosMemoryCalloc(1, sizeof(SVCreateStbReq)))) { - code = TSDB_CODE_OUT_OF_MEMORY; - TSDB_CHECK_CODE(code, lino, _exit); - }; - - // don't move to the end of loop as to destroy in the end of func when error occur - taosArrayPush(createTbArray, &pCreateTbReq); - - // set const - pCreateTbReq->flags = 0; - pCreateTbReq->type = TSDB_CHILD_TABLE; - pCreateTbReq->ctb.suid = suid; - - // set super table name - SName name = {0}; - tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - pCreateTbReq->ctb.stbName = taosStrdup((char *)tNameGetTableName(&name)); // taosStrdup(stbFullName); - - // set tag content - taosArrayClear(tagArray); - STagVal tagVal = { - .cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1, - .type = TSDB_DATA_TYPE_UBIGINT, - .i64 = (int64_t)pDataBlock->info.id.groupId, - }; - taosArrayPush(tagArray, &tagVal); - pCreateTbReq->ctb.tagNum = taosArrayGetSize(tagArray); - - STag *pTag = NULL; - tTagNew(tagArray, 1, false, &pTag); - if (pTag == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - TSDB_CHECK_CODE(code, lino, _exit); - } - pCreateTbReq->ctb.pTag = (uint8_t *)pTag; - - // set tag name - SArray *tagName = taosArrayInit(1, TSDB_COL_NAME_LEN); - char tagNameStr[TSDB_COL_NAME_LEN] = {0}; - strcpy(tagNameStr, "group_id"); - taosArrayPush(tagName, tagNameStr); - pCreateTbReq->ctb.tagName = tagName; - - // set table name - if (pDataBlock->info.parTbName[0]) { - pCreateTbReq->name = taosStrdup(pDataBlock->info.parTbName); - } else { - pCreateTbReq->name = buildCtbNameByGroupId(stbFullName, pDataBlock->info.id.groupId); - } - } + pReq->aSubmitTbData = taosArrayInit(1, sizeof(SSubmitTbData)); + if (pReq->aSubmitTbData == NULL) { + code = terrno == TSDB_CODE_SUCCESS ? TSDB_CODE_OUT_OF_MEMORY : terrno; + TSDB_CHECK_CODE(code, lino, _exit); } + SHashObj *pTableIndexMap = + taosHashInit(numOfBlocks, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); + // SSubmitTbData req - for (int32_t i = 0; i < sz; ++i) { + for (int32_t i = 0; i < numOfBlocks; ++i) { SSDataBlock *pDataBlock = taosArrayGet(pBlocks, i); if (pDataBlock->info.type == STREAM_DELETE_RESULT) { pDeleteReq->suid = suid; @@ -250,62 +192,42 @@ int32_t smaBlockToSubmit(SVnode *pVnode, const SArray *pBlocks, const STSchema * continue; } - int32_t rows = pDataBlock->info.rows; + SSubmitTbData tbData = {.suid = suid, .uid = 0, .sver = pTSchema->version, .flags = SUBMIT_REQ_AUTO_CREATE_TABLE,}; - SSubmitTbData tbData = {0}; + int32_t cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1; + tbData.pCreateTbReq = buildAutoCreateTableReq(stbFullName, suid, cid, pDataBlock, tagArray); - if (!(tbData.aRowP = taosArrayInit(rows, sizeof(SRow *)))) { - code = terrno; - TSDB_CHECK_CODE(code, lino, _exit); - } - tbData.suid = suid; - tbData.uid = 0; // uid is assigned by vnode - tbData.sver = pTSchema->version; + { + uint64_t groupId = pDataBlock->info.id.groupId; - if (createTb) { - tbData.pCreateTbReq = taosArrayGetP(createTbArray, i); - if (tbData.pCreateTbReq) tbData.flags = SUBMIT_REQ_AUTO_CREATE_TABLE; - } + int32_t *index = taosHashGet(pTableIndexMap, &groupId, sizeof(groupId)); + if (index == NULL) { // no data yet, append it + code = setDstTableDataPayload(suid, pTSchema, i, pDataBlock, &tbData, ""); + if (code != TSDB_CODE_SUCCESS) { + continue; + } - if (!pVals && !(pVals = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal)))) { - taosArrayDestroy(tbData.aRowP); - code = terrno; - TSDB_CHECK_CODE(code, lino, _exit); - } + taosArrayPush(pReq->aSubmitTbData, &tbData); - for (int32_t j = 0; j < rows; ++j) { - taosArrayClear(pVals); - for (int32_t k = 0; k < pTSchema->numOfCols; k++) { - const STColumn *pCol = &pTSchema->columns[k]; - SColumnInfoData *pColData = taosArrayGet(pDataBlock->pDataBlock, k); - if (colDataIsNull_s(pColData, j)) { - SColVal cv = COL_VAL_NULL(pCol->colId, pCol->type); - taosArrayPush(pVals, &cv); - } else { - void *data = colDataGetData(pColData, j); - if (IS_STR_DATA_TYPE(pCol->type)) { - SValue sv = (SValue){.nData = varDataLen(data), .pData = varDataVal(data)}; // address copy, no value - SColVal cv = COL_VAL_VALUE(pCol->colId, pCol->type, sv); - taosArrayPush(pVals, &cv); - } else { - SValue sv; - memcpy(&sv.val, data, tDataTypes[pCol->type].bytes); - SColVal cv = COL_VAL_VALUE(pCol->colId, pCol->type, sv); - taosArrayPush(pVals, &cv); - } + int32_t size = (int32_t)taosArrayGetSize(pReq->aSubmitTbData) - 1; + taosHashPut(pTableIndexMap, &groupId, sizeof(groupId), &size, sizeof(size)); + } else { + code = setDstTableDataPayload(suid, pTSchema, i, pDataBlock, &tbData, ""); + if (code != TSDB_CODE_SUCCESS) { + continue; + } + + SSubmitTbData *pExisted = taosArrayGet(pReq->aSubmitTbData, *index); + code = doMergeExistedRows(pExisted, &tbData, "id"); + if (code != TSDB_CODE_SUCCESS) { + continue; } } - SRow *pRow = NULL; - if ((code = tRowBuild(pVals, (STSchema *)pTSchema, &pRow)) < 0) { - tDestroySubmitTbData(&tbData, TSDB_MSG_FLG_ENCODE); - TSDB_CHECK_CODE(code, lino, _exit); - } - taosArrayPush(tbData.aRowP, &pRow); } - - taosArrayPush(pReq->aSubmitTbData, &tbData); } + taosHashCleanup(pTableIndexMap); + // encode tEncodeSize(tEncodeSubmitReq, pReq, len, code); if (TSDB_CODE_SUCCESS == code) { @@ -327,11 +249,10 @@ int32_t smaBlockToSubmit(SVnode *pVnode, const SArray *pBlocks, const STSchema * } tEncoderClear(&encoder); } + _exit: - taosArrayDestroy(createTbArray); taosArrayDestroy(tagArray); - taosArrayDestroy(pVals); - if (pReq) { + if (pReq != NULL) { tDestroySubmitReq(pReq, TSDB_MSG_FLG_ENCODE); taosMemoryFree(pReq); } @@ -442,8 +363,8 @@ static int32_t tdProcessTSmaInsertImpl(SSma *pSma, int64_t indexUid, const char void *pSubmitReq = NULL; int32_t contLen = 0; - code = smaBlockToSubmit(pSma->pVnode, (const SArray *)msg, pTsmaStat->pTSchema, &pTsmaStat->pTSma->schemaTag, true, - pTsmaStat->pTSma->dstTbUid, pTsmaStat->pTSma->dstTbName, &deleteReq, &pSubmitReq, &contLen); + code = smaBlockToSubmit(pSma->pVnode, (const SArray *)msg, pTsmaStat->pTSchema, pTsmaStat->pTSma->dstTbUid, + pTsmaStat->pTSma->dstTbName, &deleteReq, &pSubmitReq, &contLen); TSDB_CHECK_CODE(code, lino, _exit); if ((terrno = tsmaProcessDelReq(pSma, indexUid, &deleteReq)) != 0) { diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index a5832d3c66..e1b27049af 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -20,6 +20,12 @@ typedef struct { int8_t inited; } STqMgmt; +typedef struct STaskUpdateEntry { + int64_t streamId; + int32_t taskId; + int32_t transId; +} STaskUpdateEntry; + static STqMgmt tqMgmt = {0}; // 0: not init @@ -820,28 +826,29 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t nextProcessVer) { } // sink - if (pTask->outputInfo.type == TASK_OUTPUT__SMA) { - pTask->outputInfo.smaSink.vnode = pTq->pVnode; - pTask->outputInfo.smaSink.smaSink = smaHandleRes; - } else if (pTask->outputInfo.type == TASK_OUTPUT__TABLE) { - pTask->outputInfo.tbSink.vnode = pTq->pVnode; - pTask->outputInfo.tbSink.tbSinkFunc = tqSinkDataIntoDstTable; + STaskOutputInfo* pOutputInfo = &pTask->outputInfo; + if (pOutputInfo->type == TASK_OUTPUT__SMA) { + pOutputInfo->smaSink.vnode = pTq->pVnode; + pOutputInfo->smaSink.smaSink = smaHandleRes; + } else if (pOutputInfo->type == TASK_OUTPUT__TABLE) { + pOutputInfo->tbSink.vnode = pTq->pVnode; + pOutputInfo->tbSink.tbSinkFunc = tqSinkDataIntoDstTable; int32_t ver1 = 1; SMetaInfo info = {0}; - code = metaGetInfo(pTq->pVnode->pMeta, pTask->outputInfo.tbSink.stbUid, &info, NULL); + code = metaGetInfo(pTq->pVnode->pMeta, pOutputInfo->tbSink.stbUid, &info, NULL); if (code == TSDB_CODE_SUCCESS) { ver1 = info.skmVer; } - SSchemaWrapper* pschemaWrapper = pTask->outputInfo.tbSink.pSchemaWrapper; - pTask->outputInfo.tbSink.pTSchema = tBuildTSchema(pschemaWrapper->pSchema, pschemaWrapper->nCols, ver1); - if (pTask->outputInfo.tbSink.pTSchema == NULL) { + SSchemaWrapper* pschemaWrapper = pOutputInfo->tbSink.pSchemaWrapper; + pOutputInfo->tbSink.pTSchema = tBuildTSchema(pschemaWrapper->pSchema, pschemaWrapper->nCols, ver1); + if (pOutputInfo->tbSink.pTSchema == NULL) { return -1; } - pTask->outputInfo.tbSink.pTblInfo = tSimpleHashInit(10240, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT)); - tSimpleHashSetFreeFp(pTask->outputInfo.tbSink.pTblInfo, freePtr); + pOutputInfo->tbSink.pTblInfo = tSimpleHashInit(10240, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT)); + tSimpleHashSetFreeFp(pOutputInfo->tbSink.pTblInfo, freePtr); } if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) { @@ -849,11 +856,11 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t nextProcessVer) { pTask->exec.pWalReader = walOpenReader(pTq->pVnode->pWal, &cond, pTask->id.taskId); } - // reset the task status from unfinished transaction - if (pTask->status.taskStatus == TASK_STATUS__PAUSE) { - tqWarn("s-task:%s reset task status to be normal, status kept in taskMeta: Paused", pTask->id.idStr); - pTask->status.taskStatus = TASK_STATUS__NORMAL; - } +// // reset the task status from unfinished transaction +// if (pTask->status.taskStatus == TASK_STATUS__PAUSE) { +// tqWarn("s-task:%s reset task status to be normal, status kept in taskMeta: Paused", pTask->id.idStr); +// pTask->status.taskStatus = TASK_STATUS__READY; +// } streamTaskResetUpstreamStageInfo(pTask); streamSetupScheduleTrigger(pTask); @@ -866,20 +873,23 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t nextProcessVer) { pChkInfo->checkpointId, pChkInfo->checkpointVer, pChkInfo->nextProcessVer); } + char* p = NULL; + streamTaskGetStatus(pTask, &p); + if (pTask->info.fillHistory) { tqInfo("vgId:%d expand stream task, s-task:%s, checkpointId:%" PRId64 " checkpointVer:%" PRId64 " nextProcessVer:%" PRId64 " child id:%d, level:%d, status:%s fill-history:%d, related stream task:0x%x trigger:%" PRId64 " ms", vgId, pTask->id.idStr, pChkInfo->checkpointId, pChkInfo->checkpointVer, pChkInfo->nextProcessVer, - pTask->info.selfChildId, pTask->info.taskLevel, streamGetTaskStatusStr(pTask->status.taskStatus), - pTask->info.fillHistory, (int32_t)pTask->streamTaskId.taskId, pTask->info.triggerParam); + pTask->info.selfChildId, pTask->info.taskLevel, p, pTask->info.fillHistory, + (int32_t)pTask->streamTaskId.taskId, pTask->info.triggerParam); } else { tqInfo("vgId:%d expand stream task, s-task:%s, checkpointId:%" PRId64 " checkpointVer:%" PRId64 " nextProcessVer:%" PRId64 " child id:%d, level:%d, status:%s fill-history:%d, related fill-task:0x%x trigger:%" PRId64 " ms", vgId, pTask->id.idStr, pChkInfo->checkpointId, pChkInfo->checkpointVer, pChkInfo->nextProcessVer, - pTask->info.selfChildId, pTask->info.taskLevel, streamGetTaskStatusStr(pTask->status.taskStatus), - pTask->info.fillHistory, (int32_t)pTask->hTaskInfo.id.taskId, pTask->info.triggerParam); + pTask->info.selfChildId, pTask->info.taskLevel, p, pTask->info.fillHistory, + (int32_t)pTask->hTaskInfo.id.taskId, pTask->info.triggerParam); } return 0; @@ -921,9 +931,10 @@ int32_t tqProcessTaskCheckReq(STQ* pTq, SRpcMsg* pMsg) { rsp.status = streamTaskCheckStatus(pTask, req.upstreamTaskId, req.upstreamNodeId, req.stage); streamMetaReleaseTask(pMeta, pTask); - const char* pStatus = streamGetTaskStatusStr(pTask->status.taskStatus); + char* p = NULL; + streamTaskGetStatus(pTask, &p); tqDebug("s-task:%s status:%s, stage:%d recv task check req(reqId:0x%" PRIx64 ") task:0x%x (vgId:%d), check_status:%d", - pTask->id.idStr, pStatus, rsp.oldStage, rsp.reqId, rsp.upstreamTaskId, rsp.upstreamNodeId, rsp.status); + pTask->id.idStr, p, rsp.oldStage, rsp.reqId, rsp.upstreamTaskId, rsp.upstreamNodeId, rsp.status); } else { rsp.status = TASK_DOWNSTREAM_NOT_READY; tqDebug("tq recv task check(taskId:0x%" PRIx64 "-0x%x not built yet) req(reqId:0x%" PRIx64 @@ -957,6 +968,12 @@ int32_t tqProcessTaskCheckRsp(STQ* pTq, SRpcMsg* pMsg) { tqDebug("tq task:0x%x (vgId:%d) recv check rsp(reqId:0x%" PRIx64 ") from 0x%x (vgId:%d) status %d", rsp.upstreamTaskId, rsp.upstreamNodeId, rsp.reqId, rsp.downstreamTaskId, rsp.downstreamNodeId, rsp.status); + if (!vnodeIsRoleLeader(pTq->pVnode)) { + tqError("vgId:%d not leader, task:0x%x not handle the check rsp, downstream:0x%x (vgId:%d)", vgId, + rsp.upstreamTaskId, rsp.downstreamTaskId, rsp.downstreamNodeId); + return code; + } + SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, rsp.streamId, rsp.upstreamTaskId); if (pTask == NULL) { tqError("tq failed to locate the stream task:0x%" PRIx64 "-0x%x (vgId:%d), it may have been destroyed or stopped", @@ -1026,11 +1043,9 @@ int32_t tqProcessTaskDeployReq(STQ* pTq, int64_t sversion, char* msg, int32_t ms SStreamTask* p = streamMetaAcquireTask(pStreamMeta, streamId, taskId); bool restored = pTq->pVnode->restored; - if (p != NULL && restored) { - p->execInfo.init = taosGetTimestampMs(); - tqDebug("s-task:%s set the init ts:%"PRId64, p->id.idStr, p->execInfo.init); - - streamTaskCheckDownstream(p); + if (p != NULL && restored && p->info.fillHistory == 0) { + EStreamTaskEvent event = (HAS_RELATED_FILLHISTORY_TASK(p)) ? TASK_EVENT_INIT_STREAM_SCANHIST : TASK_EVENT_INIT; + streamTaskHandleEvent(p->status.pSM, event); } else if (!restored) { tqWarn("s-task:%s not launched since vnode(vgId:%d) not ready", p->id.idStr, vgId); } @@ -1064,7 +1079,8 @@ int32_t tqProcessTaskScanHistory(STQ* pTq, SRpcMsg* pMsg) { // do recovery step1 const char* id = pTask->id.idStr; - const char* pStatus = streamGetTaskStatusStr(pTask->status.taskStatus); + char* pStatus = NULL; + streamTaskGetStatus(pTask, &pStatus); // avoid multi-thread exec while(1) { @@ -1117,8 +1133,8 @@ int32_t tqProcessTaskScanHistory(STQ* pTq, SRpcMsg* pMsg) { streamScanHistoryData(pTask); double el = (taosGetTimestampMs() - pTask->execInfo.step1Start) / 1000.0; - if (pTask->status.taskStatus == TASK_STATUS__PAUSE) { - int8_t status = streamTaskSetSchedStatusInActive(pTask); + if (streamTaskGetStatus(pTask, NULL) == TASK_STATUS__PAUSE) { + int8_t status = streamTaskSetSchedStatusInactive(pTask); tqDebug("s-task:%s is paused in the step1, elapsed time:%.2fs, sched-status:%d", pTask->id.idStr, el, status); atomic_store_32(&pTask->status.inScanHistorySentinel, 0); @@ -1127,12 +1143,11 @@ int32_t tqProcessTaskScanHistory(STQ* pTq, SRpcMsg* pMsg) { } // the following procedure should be executed, no matter status is stop/pause or not - tqDebug("s-task:%s scan-history stage(step 1) ended, elapsed time:%.2fs", id, el); + tqDebug("s-task:%s scan-history(step 1) ended, elapsed time:%.2fs", id, el); if (pTask->info.fillHistory) { SVersionRange* pRange = NULL; SStreamTask* pStreamTask = NULL; - bool done = false; // 1. get the related stream task pStreamTask = streamMetaAcquireTask(pMeta, pTask->streamTaskId.streamId, pTask->streamTaskId.taskId); @@ -1151,10 +1166,10 @@ int32_t tqProcessTaskScanHistory(STQ* pTq, SRpcMsg* pMsg) { } ASSERT(pStreamTask->info.taskLevel == TASK_LEVEL__SOURCE); - +#if 0 // 2. it cannot be paused, when the stream task in TASK_STATUS__SCAN_HISTORY status. Let's wait for the // stream task get ready for scan history data - while (pStreamTask->status.taskStatus == TASK_STATUS__SCAN_HISTORY) { + while (streamTaskGetStatus(pStreamTask, NULL) == TASK_STATUS__SCAN_HISTORY) { tqDebug( "s-task:%s level:%d related stream task:%s(status:%s) not ready for halt, wait for it and recheck in 100ms", id, pTask->info.taskLevel, pStreamTask->id.idStr, streamGetTaskStatusStr(pStreamTask->status.taskStatus)); @@ -1199,6 +1214,7 @@ int32_t tqProcessTaskScanHistory(STQ* pTq, SRpcMsg* pMsg) { pStreamTask->status.keepTaskStatus = status; pStreamTask->status.taskStatus = TASK_STATUS__HALT; + // wal scan not start yet, reset it to be the start position nextProcessedVer = walReaderGetCurrentVer(pStreamTask->exec.pWalReader); if (nextProcessedVer == -1) { nextProcessedVer = pStreamTask->dataRange.range.maxVer + 1; @@ -1211,21 +1227,26 @@ int32_t tqProcessTaskScanHistory(STQ* pTq, SRpcMsg* pMsg) { taosThreadMutexUnlock(&pStreamTask->lock); break; } +#endif + + streamTaskHandleEvent(pStreamTask->status.pSM, TASK_EVENT_HALT); + int64_t nextProcessedVer = pStreamTask->hTaskInfo.haltVer; // if it's an source task, extract the last version in wal. pRange = &pTask->dataRange.range; - done = streamHistoryTaskSetVerRangeStep2(pTask, nextProcessedVer); + bool done = streamHistoryTaskSetVerRangeStep2(pTask, nextProcessedVer); pTask->execInfo.step2Start = taosGetTimestampMs(); if (done) { qDebug("s-task:%s scan-history from WAL stage(step 2) ended, elapsed time:%.2fs", id, 0.0); streamTaskPutTranstateIntoInputQ(pTask); +// streamTaskRestoreStatus(pTask); - if (pTask->status.taskStatus == TASK_STATUS__PAUSE) { - pTask->status.keepTaskStatus = TASK_STATUS__NORMAL; - qDebug("s-task:%s prev status is %s, update the kept status to be:%s when after step 2", id, - streamGetTaskStatusStr(TASK_STATUS__PAUSE), streamGetTaskStatusStr(pTask->status.keepTaskStatus)); - } +// if (pTask->status.taskStatus == TASK_STATUS__PAUSE) { +// pTask->status.keepTaskStatus = TASK_STATUS__READY; +// qDebug("s-task:%s prev status is %s, update the kept status to be:%s when after step 2", id, +// streamGetTaskStatusStr(TASK_STATUS__PAUSE), streamGetTaskStatusStr(pTask->status.keepTaskStatus)); +// } streamExecTask(pTask); // exec directly } else { @@ -1245,35 +1266,24 @@ int32_t tqProcessTaskScanHistory(STQ* pTq, SRpcMsg* pMsg) { tqDebug("s-task:%s wal reader start scan WAL verRange:%" PRId64 "-%" PRId64 ", set sched-status:%d", id, dstVer, pTask->dataRange.range.maxVer, TASK_SCHED_STATUS__INACTIVE); - /*int8_t status = */streamTaskSetSchedStatusInActive(pTask); - - // the fill-history task starts to process data in wal, let's set it status to be normal now - if (pTask->info.fillHistory == 1 && !streamTaskShouldStop(&pTask->status)) { - streamSetStatusNormal(pTask); - } + /*int8_t status = */streamTaskSetSchedStatusInactive(pTask); + // now the fill-history task starts to scan data from wal files. + streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_SCANHIST_DONE); tqScanWalAsync(pTq, false); } streamMetaReleaseTask(pMeta, pStreamTask); } else { STimeWindow* pWindow = &pTask->dataRange.window; + ASSERT(HAS_RELATED_FILLHISTORY_TASK(pTask)); - if (pTask->hTaskInfo.id.taskId == 0) { - *pWindow = (STimeWindow){INT64_MIN, INT64_MAX}; - tqDebug( - "s-task:%s scan-history in stream time window completed, no related fill-history task, reset the time " - "window:%" PRId64 " - %" PRId64, - id, pWindow->skey, pWindow->ekey); - qStreamInfoResetTimewindowFilter(pTask->exec.pExecutor); - } else { - // when related fill-history task exists, update the fill-history time window only when the - // state transfer is completed. - tqDebug( - "s-task:%s scan-history in stream time window completed, now start to handle data from WAL, start " - "ver:%" PRId64 ", window:%" PRId64 " - %" PRId64, - id, pTask->chkInfo.nextProcessVer, pWindow->skey, pWindow->ekey); - } + // Not update the fill-history time window until the state transfer is completed if the related fill-history task + // exists. + tqDebug( + "s-task:%s scan-history in stream time window completed, now start to handle data from WAL, startVer:%" PRId64 + ", window:%" PRId64 " - %" PRId64, + id, pTask->chkInfo.nextProcessVer, pWindow->skey, pWindow->ekey); code = streamTaskScanHistoryDataComplete(pTask); } @@ -1352,7 +1362,7 @@ int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg) { int32_t vgId = TD_VID(pTq->pVnode); if (taskId == STREAM_EXEC_TASK_STATUS_CHECK_ID) { - tqCheckAndRunStreamTask(pTq); + tqStartStreamTask(pTq); return 0; } @@ -1362,17 +1372,16 @@ int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg) { } SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, pReq->streamId, taskId); - if (pTask != NULL) { - // even in halt status, the data in inputQ must be processed - int8_t st = pTask->status.taskStatus; - if (st == TASK_STATUS__NORMAL || st == TASK_STATUS__SCAN_HISTORY || st == TASK_STATUS__CK) { + if (pTask != NULL) { // even in halt status, the data in inputQ must be processed + char* p = NULL; + if (streamTaskReadyToRun(pTask, &p)) { tqDebug("vgId:%d s-task:%s start to process block from inputQ, next checked ver:%" PRId64, vgId, pTask->id.idStr, pTask->chkInfo.nextProcessVer); streamExecTask(pTask); } else { - int8_t status = streamTaskSetSchedStatusInActive(pTask); + int8_t status = streamTaskSetSchedStatusInactive(pTask); tqDebug("vgId:%d s-task:%s ignore run req since not in ready state, status:%s, sched-status:%d", vgId, - pTask->id.idStr, streamGetTaskStatusStr(st), status); + pTask->id.idStr, p, status); } streamMetaReleaseTask(pTq->pStreamMeta, pTask); @@ -1446,7 +1455,7 @@ int32_t tqProcessTaskDropReq(STQ* pTq, char* msg, int32_t msgLen) { SStreamTask* pTask = streamMetaAcquireTask(pMeta, pReq->streamId, pReq->taskId); if (pTask != NULL) { // drop the related fill-history task firstly - if (pTask->hTaskInfo.id.taskId != 0) { + if (HAS_RELATED_FILLHISTORY_TASK(pTask)) { STaskId* pHTaskId = &pTask->hTaskInfo.id; streamMetaUnregisterTask(pMeta, pHTaskId->streamId, pHTaskId->taskId); tqDebug("vgId:%d drop fill-history task:0x%x dropped firstly", vgId, (int32_t)pHTaskId->taskId); @@ -1486,7 +1495,7 @@ int32_t tqProcessTaskPauseReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg streamTaskPause(pTask, pMeta); SStreamTask* pHistoryTask = NULL; - if (pTask->hTaskInfo.id.taskId != 0) { + if (HAS_RELATED_FILLHISTORY_TASK(pTask)) { pHistoryTask = streamMetaAcquireTask(pMeta, pTask->hTaskInfo.id.streamId, pTask->hTaskInfo.id.taskId); if (pHistoryTask == NULL) { tqError("vgId:%d process pause req, failed to acquire fill-history task:0x%" PRIx64 @@ -1514,17 +1523,19 @@ int32_t tqProcessTaskResumeImpl(STQ* pTq, SStreamTask* pTask, int64_t sversion, return -1; } - // todo: handle the case: resume from halt to pause/ from halt to normal/ from pause to normal - streamTaskResume(pTask, pTq->pStreamMeta); + streamTaskResume(pTask); + ETaskStatus status = streamTaskGetStatus(pTask, NULL); int32_t level = pTask->info.taskLevel; if (level == TASK_LEVEL__SINK) { + if (status == TASK_STATUS__UNINIT) { + + } streamMetaReleaseTask(pTq->pStreamMeta, pTask); return 0; } - int8_t status = pTask->status.taskStatus; - if (status == TASK_STATUS__NORMAL || status == TASK_STATUS__SCAN_HISTORY || status == TASK_STATUS__CK) { + if (status == TASK_STATUS__READY || status == TASK_STATUS__SCAN_HISTORY || status == TASK_STATUS__CK) { // no lock needs to secure the access of the version if (igUntreated && level == TASK_LEVEL__SOURCE && !pTask->info.fillHistory) { // discard all the data when the stream task is suspended. @@ -1537,14 +1548,18 @@ int32_t tqProcessTaskResumeImpl(STQ* pTq, SStreamTask* pTask, int64_t sversion, vgId, pTask->id.idStr, pTask->chkInfo.nextProcessVer, sversion, pTask->status.schedStatus); } - if (level == TASK_LEVEL__SOURCE && pTask->info.fillHistory && - pTask->status.taskStatus == TASK_STATUS__SCAN_HISTORY) { + if (level == TASK_LEVEL__SOURCE && pTask->info.fillHistory && status == TASK_STATUS__SCAN_HISTORY) { streamStartScanHistoryAsync(pTask, igUntreated); - } else if (level == TASK_LEVEL__SOURCE && (streamQueueGetNumOfItems(pTask->inputInfo.queue) == 0)) { + } else if (level == TASK_LEVEL__SOURCE && (streamQueueGetNumOfItems(pTask->inputq.queue) == 0)) { tqScanWalAsync(pTq, false); } else { streamSchedExec(pTask); } + } else if (status == TASK_STATUS__UNINIT) { + if (pTask->info.fillHistory == 0) { + EStreamTaskEvent event = HAS_RELATED_FILLHISTORY_TASK(pTask) ? TASK_EVENT_INIT_STREAM_SCANHIST : TASK_EVENT_INIT; + streamTaskHandleEvent(pTask->status.pSM, event); + } } streamMetaReleaseTask(pTq->pStreamMeta, pTask); @@ -1683,7 +1698,6 @@ FAIL: return -1; } -// todo error code cannot be return, since this is invoked by an mnode-launched transaction. int32_t tqProcessTaskCheckPointSourceReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg* pRsp) { int32_t vgId = TD_VID(pTq->pVnode); SStreamMeta* pMeta = pTq->pStreamMeta; @@ -1694,7 +1708,6 @@ int32_t tqProcessTaskCheckPointSourceReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg* pRsp) // disable auto rsp to mnode pRsp->info.handle = NULL; - // todo: add counter to make sure other tasks would not be trapped in checkpoint state SStreamCheckpointSourceReq req = {0}; if (!vnodeIsRoleLeader(pTq->pVnode)) { tqDebug("vgId:%d not leader, ignore checkpoint-source msg", vgId); @@ -1725,6 +1738,7 @@ int32_t tqProcessTaskCheckPointSourceReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg* pRsp) } tDecoderClear(&decoder); + // todo handle failure to reset from checkpoint procedure SStreamTask* pTask = streamMetaAcquireTask(pMeta, req.streamId, req.taskId); if (pTask == NULL) { tqError("vgId:%d failed to find s-task:0x%x, ignore checkpoint msg. it may have been destroyed already", vgId, @@ -1735,6 +1749,7 @@ int32_t tqProcessTaskCheckPointSourceReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg* pRsp) return TSDB_CODE_SUCCESS; } + // todo handle failure to reset from checkpoint procedure // downstream not ready, current the stream tasks are not all ready. Ignore this checkpoint req. if (pTask->status.downstreamReady != 1) { pTask->chkInfo.failedId = req.checkpointId; // record the latest failed checkpoint id @@ -1750,8 +1765,11 @@ int32_t tqProcessTaskCheckPointSourceReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg* pRsp) return TSDB_CODE_SUCCESS; } + // todo save the checkpoint failed info taosThreadMutexLock(&pTask->lock); - if (pTask->status.taskStatus == TASK_STATUS__HALT) { + ETaskStatus status = streamTaskGetStatus(pTask, NULL); + + if (status == TASK_STATUS__HALT || status == TASK_STATUS__PAUSE) { qError("s-task:%s not ready for checkpoint, since it is halt, ignore this checkpoint:%" PRId64 ", set it failure", pTask->id.idStr, req.checkpointId); taosThreadMutexUnlock(&pTask->lock); @@ -1832,7 +1850,6 @@ int32_t tqProcessTaskUpdateReq(STQ* pTq, SRpcMsg* pMsg) { char* msg = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)); int32_t len = pMsg->contLen - sizeof(SMsgHead); SRpcMsg rsp = {.info = pMsg->info, .code = TSDB_CODE_SUCCESS}; - bool allStopped = false; SStreamTaskNodeUpdateMsg req = {0}; @@ -1863,17 +1880,43 @@ int32_t tqProcessTaskUpdateReq(STQ* pTq, SRpcMsg* pMsg) { } SStreamTask* pTask = *ppTask; - tqDebug("s-task:%s receive nodeEp update msg from mnode", pTask->id.idStr); + if (pMeta->updateInfo.transId != req.transId) { + pMeta->updateInfo.transId = req.transId; + tqDebug("s-task:%s receive new trans to update nodeEp msg from mnode, transId:%d", pTask->id.idStr, req.transId); + // info needs to be kept till the new trans to update the nodeEp arrived. + taosHashClear(pMeta->updateInfo.pTasks); + } else { + tqDebug("s-task:%s recv trans to update nodeEp from mnode, transId:%d", pTask->id.idStr, req.transId); + } + + STaskUpdateEntry entry = {.streamId = req.streamId, .taskId = req.taskId, .transId = req.transId}; + void* exist = taosHashGet(pMeta->updateInfo.pTasks, &entry, sizeof(STaskUpdateEntry)); + if (exist != NULL) { + tqDebug("s-task:%s (vgId:%d) already update in trans:%d, discard the nodeEp update msg", pTask->id.idStr, vgId, + req.transId); + rsp.code = TSDB_CODE_SUCCESS; + taosWUnLockLatch(&pMeta->lock); + taosArrayDestroy(req.pNodeList); + return rsp.code; + } + + taosWUnLockLatch(&pMeta->lock); + + // the following two functions should not be executed within the scope of meta lock to avoid deadlock streamTaskUpdateEpsetInfo(pTask, req.pNodeList); - streamSetStatusNormal(pTask); + streamTaskResetStatus(pTask); + + // continue after lock the meta again + taosWLockLatch(&pMeta->lock); SStreamTask** ppHTask = NULL; - if (pTask->hTaskInfo.id.taskId != 0) { + if (HAS_RELATED_FILLHISTORY_TASK(pTask)) { ppHTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &pTask->hTaskInfo.id, sizeof(pTask->hTaskInfo.id)); if (ppHTask == NULL || *ppHTask == NULL) { tqError("vgId:%d failed to acquire fill-history task:0x%x when handling update, it may have been dropped already", pMeta->vgId, req.taskId); + CLEAR_RELATED_FILLHISTORY_TASK(pTask); } else { tqDebug("s-task:%s fill-history task update nodeEp along with stream task", (*ppHTask)->id.idStr); streamTaskUpdateEpsetInfo(*ppHTask, req.pNodeList); @@ -1892,12 +1935,14 @@ int32_t tqProcessTaskUpdateReq(STQ* pTq, SRpcMsg* pMsg) { } streamTaskStop(pTask); - taosHashPut(pMeta->pUpdateTaskSet, &pTask->id, sizeof(pTask->id), NULL, 0); + + // keep the already handled info + taosHashPut(pMeta->updateInfo.pTasks, &entry, sizeof(entry), NULL, 0); if (ppHTask != NULL) { streamTaskStop(*ppHTask); tqDebug("s-task:%s task nodeEp update completed, streamTask and related fill-history task closed", pTask->id.idStr); - taosHashPut(pMeta->pUpdateTaskSet, &(*ppHTask)->id, sizeof(pTask->id), NULL, 0); + taosHashPut(pMeta->updateInfo.pTasks, &(*ppHTask)->id, sizeof(pTask->id), NULL, 0); } else { tqDebug("s-task:%s task nodeEp update completed, streamTask closed", pTask->id.idStr); } @@ -1906,25 +1951,30 @@ int32_t tqProcessTaskUpdateReq(STQ* pTq, SRpcMsg* pMsg) { // possibly only handle the stream task. int32_t numOfTasks = streamMetaGetNumOfTasks(pMeta); - int32_t updateTasks = taosHashGetSize(pMeta->pUpdateTaskSet); + int32_t updateTasks = taosHashGetSize(pMeta->updateInfo.pTasks); - pMeta->startInfo.startedAfterNodeUpdate = 1; + pMeta->startInfo.startAllTasksFlag = 1; if (updateTasks < numOfTasks) { tqDebug("vgId:%d closed tasks:%d, unclosed:%d, all tasks will be started when nodeEp update completed", vgId, updateTasks, (numOfTasks - updateTasks)); taosWUnLockLatch(&pMeta->lock); } else { - taosHashClear(pMeta->pUpdateTaskSet); - if (!pTq->pVnode->restored) { tqDebug("vgId:%d vnode restore not completed, not restart the tasks, clear the start after nodeUpdate flag", vgId); - pMeta->startInfo.startedAfterNodeUpdate = 0; + pMeta->startInfo.startAllTasksFlag = 0; taosWUnLockLatch(&pMeta->lock); } else { tqDebug("vgId:%d tasks are all updated and stopped, restart them", vgId); - terrno = 0; + taosWUnLockLatch(&pMeta->lock); + + while (streamMetaTaskInTimer(pMeta)) { + qDebug("vgId:%d some tasks in timer, wait for 100ms and recheck", pMeta->vgId); + taosMsleep(100); + } + + taosWLockLatch(&pMeta->lock); int32_t code = streamMetaReopen(pMeta); if (code != 0) { tqError("vgId:%d failed to reopen stream meta", vgId); @@ -1942,8 +1992,8 @@ int32_t tqProcessTaskUpdateReq(STQ* pTq, SRpcMsg* pMsg) { if (vnodeIsRoleLeader(pTq->pVnode) && !tsDisableStream) { vInfo("vgId:%d restart all stream tasks after all tasks being updated", vgId); - tqStartStreamTasks(pTq); - tqCheckAndRunStreamTaskAsync(pTq); + tqResetStreamTaskStatus(pTq); + tqLaunchStreamTaskAsync(pTq); } else { vInfo("vgId:%d, follower node not start stream tasks", vgId); } @@ -1970,10 +2020,10 @@ int32_t tqProcessTaskResetReq(STQ* pTq, SRpcMsg* pMsg) { tqDebug("s-task:%s receive task-reset msg from mnode, reset status and ready for data processing", pTask->id.idStr); // clear flag set during do checkpoint, and open inputQ for all upstream tasks - if (pTask->status.taskStatus == TASK_STATUS__CK) { + if (streamTaskGetStatus(pTask, NULL) == TASK_STATUS__CK) { streamTaskClearCheckInfo(pTask); taosArrayClear(pTask->pReadyMsgList); - streamSetStatusNormal(pTask); + streamTaskSetStatusReady(pTask); } streamMetaReleaseTask(pMeta, pTask); diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index 62952078bc..50ee52f45b 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -39,7 +39,7 @@ int32_t tqPushMsg(STQ* pTq, tmsg_t msgType) { int32_t numOfTasks = streamMetaGetNumOfTasks(pTq->pStreamMeta); taosRUnLockLatch(&pTq->pStreamMeta->lock); - tqDebug("handle submit, restore:%d, numOfTasks:%d", pTq->pVnode->restored, numOfTasks); +// tqTrace("vgId:%d handle submit, restore:%d, numOfTasks:%d", TD_VID(pTq->pVnode), pTq->pVnode->restored, numOfTasks); // push data for stream processing: // 1. the vnode has already been restored. diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c index 7d1c754005..51d51ebbef 100644 --- a/source/dnode/vnode/src/tq/tqSink.c +++ b/source/dnode/vnode/src/tq/tqSink.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include #include "tcommon.h" #include "tmsg.h" #include "tq.h" @@ -28,19 +29,19 @@ static bool hasOnlySubmitData(const SArray* pBlocks, int32_t numOfBlocks); static int32_t tsAscendingSortFn(const void* p1, const void* p2); static int32_t setDstTableDataUid(SVnode* pVnode, SStreamTask* pTask, SSDataBlock* pDataBlock, char* stbFullName, SSubmitTbData* pTableData); -static int32_t setDstTableDataPayload(SStreamTask* pTask, int32_t blockIndex, SSDataBlock* pDataBlock, - SSubmitTbData* pTableData); static int32_t doBuildAndSendDeleteMsg(SVnode* pVnode, char* stbFullName, SSDataBlock* pDataBlock, SStreamTask* pTask, int64_t suid); static int32_t doBuildAndSendSubmitMsg(SVnode* pVnode, SStreamTask* pTask, SSubmitReq2* pReq, int32_t numOfBlocks); static int32_t buildSubmitMsgImpl(SSubmitReq2* pSubmitReq, int32_t vgId, void** pMsg, int32_t* msgLen); -static int32_t doConvertRows(SSubmitTbData* pTableData, STSchema* pTSchema, SSDataBlock* pDataBlock, const char* id); +static int32_t doConvertRows(SSubmitTbData* pTableData, const STSchema* pTSchema, SSDataBlock* pDataBlock, const char* id); static int32_t doWaitForDstTableCreated(SVnode* pVnode, SStreamTask* pTask, STableSinkInfo* pTableSinkInfo, const char* dstTableName, int64_t* uid); static int32_t doPutIntoCache(SSHashObj* pSinkTableMap, STableSinkInfo* pTableSinkInfo, uint64_t groupId, const char* id); -static int32_t doMergeExistedRows(SSubmitTbData* pExisted, const SSubmitTbData* pNew, const char* id); static bool isValidDstChildTable(SMetaReader* pReader, int32_t vgId, const char* ctbName, int64_t suid); -static SVCreateTbReq* buildAutoCreateTableReq(char* stbFullName, int64_t suid, int32_t numOfCols, SSDataBlock* pDataBlock); +static int32_t initCreateTableMsg(SVCreateTbReq* pCreateTableReq, uint64_t suid, const char* stbFullName, int32_t numOfTags); +static SArray* createDefaultTagColName(); +static void setCreateTableMsgTableName(SVCreateTbReq* pCreateTableReq, SSDataBlock* pDataBlock, const char* stbFullName, + int64_t gid); int32_t tqBuildDeleteReq(const char* stbFullName, const SSDataBlock* pDataBlock, SBatchDeleteReq* deleteReq, const char* pIdStr) { @@ -138,61 +139,68 @@ static int32_t tqPutReqToQueue(SVnode* pVnode, SVCreateTbBatchReq* pReqs) { return TSDB_CODE_SUCCESS; } +int32_t initCreateTableMsg(SVCreateTbReq* pCreateTableReq, uint64_t suid, const char* stbFullName, int32_t numOfTags) { + pCreateTableReq->flags = 0; + pCreateTableReq->type = TSDB_CHILD_TABLE; + pCreateTableReq->ctb.suid = suid; + + // set super table name + SName name = {0}; + tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + pCreateTableReq->ctb.stbName = taosStrdup((char*)tNameGetTableName(&name)); + + pCreateTableReq->ctb.tagNum = numOfTags; + return TSDB_CODE_SUCCESS; +} + +SArray* createDefaultTagColName() { + SArray* pTagColNameList = taosArrayInit(1, TSDB_COL_NAME_LEN); + char tagNameStr[TSDB_COL_NAME_LEN] = "group_id"; + taosArrayPush(pTagColNameList, tagNameStr); + return pTagColNameList; +} + +void setCreateTableMsgTableName(SVCreateTbReq* pCreateTableReq, SSDataBlock* pDataBlock, const char* stbFullName, + int64_t gid) { + if (pDataBlock->info.parTbName[0]) { + pCreateTableReq->name = taosStrdup(pDataBlock->info.parTbName); + } else { + pCreateTableReq->name = buildCtbNameByGroupId(stbFullName, gid); + } +} + static int32_t doBuildAndSendCreateTableMsg(SVnode* pVnode, char* stbFullName, SSDataBlock* pDataBlock, SStreamTask* pTask, int64_t suid) { tqDebug("s-task:%s build create table msg", pTask->id.idStr); STSchema* pTSchema = pTask->outputInfo.tbSink.pTSchema; int32_t rows = pDataBlock->info.rows; - SArray* tagArray = NULL; + SArray* tagArray = taosArrayInit(4, sizeof(STagVal));; int32_t code = 0; SVCreateTbBatchReq reqs = {0}; - SArray* crTblArray = reqs.pArray = taosArrayInit(1, sizeof(SVCreateTbReq)); if (NULL == reqs.pArray) { + tqError("s-task:%s failed to init create table msg, code:%s", pTask->id.idStr, tstrerror(terrno)); goto _end; } for (int32_t rowId = 0; rowId < rows; rowId++) { SVCreateTbReq* pCreateTbReq = &((SVCreateTbReq){0}); - // set const - pCreateTbReq->flags = 0; - pCreateTbReq->type = TSDB_CHILD_TABLE; - pCreateTbReq->ctb.suid = suid; - - // set super table name - SName name = {0}; - tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - pCreateTbReq->ctb.stbName = taosStrdup((char*)tNameGetTableName(&name)); // taosStrdup(stbFullName); - - // set tag content int32_t size = taosArrayGetSize(pDataBlock->pDataBlock); - if (size == 2) { - tagArray = taosArrayInit(1, sizeof(STagVal)); - if (!tagArray) { - tdDestroySVCreateTbReq(pCreateTbReq); - goto _end; - } + int32_t numOfTags = TMAX(size - UD_TAG_COLUMN_INDEX, 1); + initCreateTableMsg(pCreateTbReq, suid, stbFullName, numOfTags); + taosArrayClear(tagArray); + + if (size == 2) { STagVal tagVal = { .cid = pTSchema->numOfCols + 1, .type = TSDB_DATA_TYPE_UBIGINT, .i64 = pDataBlock->info.id.groupId}; taosArrayPush(tagArray, &tagVal); - - // set tag name - SArray* tagName = taosArrayInit(1, TSDB_COL_NAME_LEN); - char tagNameStr[TSDB_COL_NAME_LEN] = "group_id"; - taosArrayPush(tagName, tagNameStr); - pCreateTbReq->ctb.tagName = tagName; + pCreateTbReq->ctb.tagName = createDefaultTagColName(); } else { - tagArray = taosArrayInit(size - 1, sizeof(STagVal)); - if (!tagArray) { - tdDestroySVCreateTbReq(pCreateTbReq); - goto _end; - } - for (int32_t tagId = UD_TAG_COLUMN_INDEX, step = 1; tagId < size; tagId++, step++) { SColumnInfoData* pTagData = taosArrayGet(pDataBlock->pDataBlock, tagId); @@ -209,29 +217,26 @@ static int32_t doBuildAndSendCreateTableMsg(SVnode* pVnode, char* stbFullName, S taosArrayPush(tagArray, &tagVal); } } - pCreateTbReq->ctb.tagNum = TMAX(size - UD_TAG_COLUMN_INDEX, 1); - STag* pTag = NULL; - tTagNew(tagArray, 1, false, &pTag); + tTagNew(tagArray, 1, false, (STag**)&pCreateTbReq->ctb.pTag); tagArray = taosArrayDestroy(tagArray); - if (pTag == NULL) { + if (pCreateTbReq->ctb.pTag == NULL) { tdDestroySVCreateTbReq(pCreateTbReq); code = TSDB_CODE_OUT_OF_MEMORY; goto _end; } - pCreateTbReq->ctb.pTag = (uint8_t*)pTag; - - // set table name - if (!pDataBlock->info.parTbName[0]) { + uint64_t gid = pDataBlock->info.id.groupId; + if (taosArrayGetSize(pDataBlock->pDataBlock) > UD_GROUPID_COLUMN_INDEX) { SColumnInfoData* pGpIdColInfo = taosArrayGet(pDataBlock->pDataBlock, UD_GROUPID_COLUMN_INDEX); + // todo remove this void* pGpIdData = colDataGetData(pGpIdColInfo, rowId); - pCreateTbReq->name = buildCtbNameByGroupId(stbFullName, *(uint64_t*)pGpIdData); - } else { - pCreateTbReq->name = taosStrdup(pDataBlock->info.parTbName); + ASSERT(gid == *(int64_t*)pGpIdData); } + setCreateTableMsgTableName(pCreateTbReq, pDataBlock, stbFullName, gid); + taosArrayPush(reqs.pArray, pCreateTbReq); tqDebug("s-task:%s build create table:%s msg complete", pTask->id.idStr, pCreateTbReq->name); } @@ -330,6 +335,9 @@ int32_t doMergeExistedRows(SSubmitTbData* pExisted, const SSubmitTbData* pNew, c tqTrace("s-task:%s rows merged, final rows:%d, uid:%" PRId64 ", existed auto-create table:%d, new-block:%d", id, (int32_t)taosArrayGetSize(pFinal), pExisted->uid, (pExisted->pCreateTbReq != NULL), (pNew->pCreateTbReq != NULL)); + + tdDestroySVCreateTbReq(pNew->pCreateTbReq); + taosMemoryFree(pNew->pCreateTbReq); return TSDB_CODE_SUCCESS; } @@ -390,60 +398,33 @@ bool isValidDstChildTable(SMetaReader* pReader, int32_t vgId, const char* ctbNam return true; } -SVCreateTbReq* buildAutoCreateTableReq(char* stbFullName, int64_t suid, int32_t numOfCols, SSDataBlock* pDataBlock) { - char* ctbName = pDataBlock->info.parTbName; - - SVCreateTbReq* pCreateTbReq = taosMemoryCalloc(1, sizeof(SVCreateStbReq)); +SVCreateTbReq* buildAutoCreateTableReq(const char* stbFullName, int64_t suid, int32_t numOfCols, + SSDataBlock* pDataBlock, SArray* pTagArray) { + SVCreateTbReq* pCreateTbReq = taosMemoryCalloc(1, sizeof(SVCreateTbReq)); if (pCreateTbReq == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } - // set tag content - SArray* tagArray = taosArrayInit(1, sizeof(STagVal)); - if (tagArray == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - tdDestroySVCreateTbReq(pCreateTbReq); - taosMemoryFreeClear(pCreateTbReq); - return NULL; - } - - // set const - pCreateTbReq->flags = 0; - pCreateTbReq->type = TSDB_CHILD_TABLE; - pCreateTbReq->ctb.suid = suid; - - // set super table name - SName name = {0}; - tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - pCreateTbReq->ctb.stbName = taosStrdup((char*)tNameGetTableName(&name)); + taosArrayClear(pTagArray); + initCreateTableMsg(pCreateTbReq, suid, stbFullName, 1); STagVal tagVal = { .cid = numOfCols, .type = TSDB_DATA_TYPE_UBIGINT, .i64 = pDataBlock->info.id.groupId}; - taosArrayPush(tagArray, &tagVal); - pCreateTbReq->ctb.tagNum = taosArrayGetSize(tagArray); + taosArrayPush(pTagArray, &tagVal); - STag* pTag = NULL; - tTagNew(tagArray, 1, false, &pTag); - taosArrayDestroy(tagArray); + tTagNew(pTagArray, 1, false, (STag**) &pCreateTbReq->ctb.pTag); - if (pTag == NULL) { + if (pCreateTbReq->ctb.pTag == NULL) { tdDestroySVCreateTbReq(pCreateTbReq); taosMemoryFreeClear(pCreateTbReq); terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } - pCreateTbReq->ctb.pTag = (uint8_t*)pTag; - - // set tag name - SArray* tagName = taosArrayInit(1, TSDB_COL_NAME_LEN); - char k[TSDB_COL_NAME_LEN] = "group_id"; - taosArrayPush(tagName, k); - - pCreateTbReq->ctb.tagName = tagName; + pCreateTbReq->ctb.tagName = createDefaultTagColName(); // set table name - pCreateTbReq->name = taosStrdup(ctbName); + setCreateTableMsgTableName(pCreateTbReq, pDataBlock, stbFullName, pDataBlock->info.id.groupId); return pCreateTbReq; } @@ -514,7 +495,7 @@ int32_t tsAscendingSortFn(const void* p1, const void* p2) { } } -int32_t doConvertRows(SSubmitTbData* pTableData, STSchema* pTSchema, SSDataBlock* pDataBlock, const char* id) { +int32_t doConvertRows(SSubmitTbData* pTableData, const STSchema* pTSchema, SSDataBlock* pDataBlock, const char* id) { int32_t numOfRows = pDataBlock->info.rows; int32_t code = TSDB_CODE_SUCCESS; @@ -592,7 +573,7 @@ int32_t doWaitForDstTableCreated(SVnode* pVnode, SStreamTask* pTask, STableSinkI const char* id = pTask->id.idStr; while (pTableSinkInfo->uid == 0) { - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { tqDebug("s-task:%s task will stop, quit from waiting for table:%s create", id, dstTableName); return TSDB_CODE_STREAM_EXEC_CANCELLED; } @@ -693,8 +674,13 @@ int32_t setDstTableDataUid(SVnode* pVnode, SStreamTask* pTask, SSDataBlock* pDat tqDebug("s-task:%s stream write into table:%s, table auto created", id, dstTableName); + SArray* pTagArray = taosArrayInit(pTSchema->numOfCols + 1, sizeof(STagVal)); + pTableData->flags = SUBMIT_REQ_AUTO_CREATE_TABLE; - pTableData->pCreateTbReq = buildAutoCreateTableReq(stbFullName, suid, pTSchema->numOfCols + 1, pDataBlock); + pTableData->pCreateTbReq = + buildAutoCreateTableReq(stbFullName, suid, pTSchema->numOfCols + 1, pDataBlock, pTagArray); + taosArrayDestroy(pTagArray); + if (pTableData->pCreateTbReq == NULL) { tqError("s-task:%s failed to build auto create table req, code:%s", id, tstrerror(terrno)); taosMemoryFree(pTableSinkInfo); @@ -724,17 +710,16 @@ int32_t setDstTableDataUid(SVnode* pVnode, SStreamTask* pTask, SSDataBlock* pDat return TSDB_CODE_SUCCESS; } -int32_t setDstTableDataPayload(SStreamTask* pTask, int32_t blockIndex, SSDataBlock* pDataBlock, - SSubmitTbData* pTableData) { - int32_t numOfRows = pDataBlock->info.rows; - const char* id = pTask->id.idStr; +int32_t setDstTableDataPayload(uint64_t suid, const STSchema *pTSchema, int32_t blockIndex, SSDataBlock* pDataBlock, + SSubmitTbData* pTableData, const char* id) { + int32_t numOfRows = pDataBlock->info.rows; tqDebug("s-task:%s sink data pipeline, build submit msg from %dth resBlock, including %d rows, dst suid:%" PRId64, - id, blockIndex + 1, numOfRows, pTask->outputInfo.tbSink.stbUid); + id, blockIndex + 1, numOfRows, suid); char* dstTableName = pDataBlock->info.parTbName; // convert all rows - int32_t code = doConvertRows(pTableData, pTask->outputInfo.tbSink.pTSchema, pDataBlock, id); + int32_t code = doConvertRows(pTableData, pTSchema, pDataBlock, id); if (code != TSDB_CODE_SUCCESS) { tqError("s-task:%s failed to convert rows from result block, code:%s", id, tstrerror(terrno)); return code; @@ -773,7 +758,7 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) { numOfBlocks); for(int32_t i = 0; i < numOfBlocks; ++i) { - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { return; } @@ -800,7 +785,7 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) { continue; } - code = setDstTableDataPayload(pTask, i, pDataBlock, &tbData); + code = setDstTableDataPayload(suid, pTSchema, i, pDataBlock, &tbData, id); if (code != TSDB_CODE_SUCCESS) { continue; } @@ -823,7 +808,7 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) { bool hasSubmit = false; for (int32_t i = 0; i < numOfBlocks; i++) { - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { taosHashCleanup(pTableIndexMap); tDestroySubmitReq(&submitReq, TSDB_MSG_FLG_ENCODE); return; @@ -847,7 +832,7 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) { continue; } - code = setDstTableDataPayload(pTask, i, pDataBlock, &tbData); + code = setDstTableDataPayload(suid, pTSchema, i, pDataBlock, &tbData, id); if (code != TSDB_CODE_SUCCESS) { continue; } @@ -857,7 +842,7 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) { int32_t size = (int32_t)taosArrayGetSize(submitReq.aSubmitTbData) - 1; taosHashPut(pTableIndexMap, &groupId, sizeof(groupId), &size, sizeof(size)); } else { - code = setDstTableDataPayload(pTask, i, pDataBlock, &tbData); + code = setDstTableDataPayload(suid, pTSchema, i, pDataBlock, &tbData, id); if (code != TSDB_CODE_SUCCESS) { continue; } diff --git a/source/dnode/vnode/src/tq/tqStreamTask.c b/source/dnode/vnode/src/tq/tqStreamTask.c index b9cb22e7a4..1f1dd61c3c 100644 --- a/source/dnode/vnode/src/tq/tqStreamTask.c +++ b/source/dnode/vnode/src/tq/tqStreamTask.c @@ -60,7 +60,7 @@ int32_t tqScanWal(STQ* pTq) { return 0; } -int32_t tqCheckAndRunStreamTask(STQ* pTq) { +int32_t tqStartStreamTask(STQ* pTq) { int32_t vgId = TD_VID(pTq->pVnode); SStreamMeta* pMeta = pTq->pStreamMeta; @@ -92,19 +92,19 @@ int32_t tqCheckAndRunStreamTask(STQ* pTq) { } if (pTask->status.downstreamReady == 1) { - tqDebug("s-task:%s downstream ready, no need to check downstream, check only related fill-history task", - pTask->id.idStr); - streamLaunchFillHistoryTask(pTask); + if (HAS_RELATED_FILLHISTORY_TASK(pTask)) { + tqDebug("s-task:%s downstream ready, no need to check downstream, check only related fill-history task", + pTask->id.idStr); + streamLaunchFillHistoryTask(pTask); + } + + streamMetaUpdateTaskReadyInfo(pTask); streamMetaReleaseTask(pMeta, pTask); continue; } - pTask->execInfo.init = taosGetTimestampMs(); - tqDebug("s-task:%s start check downstream tasks, set the init ts:%"PRId64, pTask->id.idStr, pTask->execInfo.init); - - streamSetStatusNormal(pTask); - streamTaskCheckDownstream(pTask); - + EStreamTaskEvent event = (HAS_RELATED_FILLHISTORY_TASK(pTask)) ? TASK_EVENT_INIT_STREAM_SCANHIST : TASK_EVENT_INIT; + streamTaskHandleEvent(pTask->status.pSM, event); streamMetaReleaseTask(pMeta, pTask); } @@ -112,9 +112,9 @@ int32_t tqCheckAndRunStreamTask(STQ* pTq) { return 0; } -int32_t tqCheckAndRunStreamTaskAsync(STQ* pTq) { - int32_t vgId = TD_VID(pTq->pVnode); +int32_t tqLaunchStreamTaskAsync(STQ* pTq) { SStreamMeta* pMeta = pTq->pStreamMeta; + int32_t vgId = pMeta->vgId; int32_t numOfTasks = taosArrayGetSize(pMeta->pTaskList); if (numOfTasks == 0) { @@ -228,7 +228,7 @@ int32_t tqStopStreamTasks(STQ* pTq) { return 0; } -int32_t tqStartStreamTasks(STQ* pTq) { +int32_t tqResetStreamTaskStatus(STQ* pTq) { SStreamMeta* pMeta = pTq->pStreamMeta; int32_t vgId = TD_VID(pTq->pVnode); int32_t numOfTasks = taosArrayGetSize(pMeta->pTaskList); @@ -243,11 +243,7 @@ int32_t tqStartStreamTasks(STQ* pTq) { STaskId id = {.streamId = pTaskId->streamId, .taskId = pTaskId->taskId}; SStreamTask** pTask = taosHashGet(pMeta->pTasksMap, &id, sizeof(id)); - - int8_t status = (*pTask)->status.taskStatus; - if (status == TASK_STATUS__STOP && (*pTask)->info.fillHistory != 1) { - streamSetStatusNormal(*pTask); - } + streamTaskResetStatus(*pTask); } return 0; @@ -328,15 +324,17 @@ static bool taskReadyForDataFromWal(SStreamTask* pTask) { } // not in ready state, do not handle the data from wal - int32_t status = pTask->status.taskStatus; - if (status != TASK_STATUS__NORMAL) { - tqTrace("s-task:%s not ready for submit block in wal, status:%s", pTask->id.idStr, streamGetTaskStatusStr(status)); +// int32_t status = pTask->status.taskStatus; + char* p = NULL; + int32_t status = streamTaskGetStatus(pTask, &p); + if (streamTaskGetStatus(pTask, &p) != TASK_STATUS__READY) { + tqTrace("s-task:%s not ready for submit block in wal, status:%s", pTask->id.idStr, p); return false; } // fill-history task has entered into the last phase, no need to anything if ((pTask->info.fillHistory == 1) && pTask->status.appendTranstateBlock) { - ASSERT(status == TASK_STATUS__NORMAL); + ASSERT(status == TASK_STATUS__READY); // the maximum version of data in the WAL has reached already, the step2 is done tqDebug("s-task:%s fill-history reach the maximum ver:%" PRId64 ", not scan wal anymore", pTask->id.idStr, pTask->dataRange.range.maxVer); @@ -344,13 +342,13 @@ static bool taskReadyForDataFromWal(SStreamTask* pTask) { } // check if input queue is full or not - if (streamQueueIsFull(pTask->inputInfo.queue)) { + if (streamQueueIsFull(pTask->inputq.queue)) { tqTrace("s-task:%s input queue is full, do nothing", pTask->id.idStr); return false; } // the input queue of downstream task is full, so the output is blocked, stopped for a while - if (pTask->inputInfo.status == TASK_INPUT_STATUS__BLOCKED) { + if (pTask->inputq.status == TASK_INPUT_STATUS__BLOCKED) { tqDebug("s-task:%s inputQ is blocked, do nothing", pTask->id.idStr); return false; } @@ -444,14 +442,15 @@ int32_t doScanWalForAllTasks(SStreamMeta* pStreamMeta, bool* pScanIdle) { continue; } - int32_t numOfItems = streamQueueGetNumOfItems(pTask->inputInfo.queue); + int32_t numOfItems = streamQueueGetNumOfItems(pTask->inputq.queue); int64_t maxVer = (pTask->info.fillHistory == 1) ? pTask->dataRange.range.maxVer : INT64_MAX; taosThreadMutexLock(&pTask->lock); - const char* pStatus = streamGetTaskStatusStr(pTask->status.taskStatus); - if (pTask->status.taskStatus != TASK_STATUS__NORMAL) { - tqDebug("s-task:%s not ready for submit block from wal, status:%s", pTask->id.idStr, pStatus); + char* p = NULL; + ETaskStatus status = streamTaskGetStatus(pTask, &p); + if (status != TASK_STATUS__READY) { + tqDebug("s-task:%s not ready for submit block from wal, status:%s", pTask->id.idStr, p); taosThreadMutexUnlock(&pTask->lock); streamMetaReleaseTask(pStreamMeta, pTask); continue; diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index b4c2c0a979..55ae25aee4 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -131,7 +131,7 @@ int32_t tsdbBegin(STsdb *pTsdb) { TSDB_CHECK_CODE(code, lino, _exit); // lock - if ((code = taosThreadRwlockWrlock(&pTsdb->rwLock))) { + if ((code = taosThreadMutexLock(&pTsdb->mutex))) { code = TAOS_SYSTEM_ERROR(code); TSDB_CHECK_CODE(code, lino, _exit); } @@ -139,7 +139,7 @@ int32_t tsdbBegin(STsdb *pTsdb) { pTsdb->mem = pMemTable; // unlock - if ((code = taosThreadRwlockUnlock(&pTsdb->rwLock))) { + if ((code = taosThreadMutexUnlock(&pTsdb->mutex))) { code = TAOS_SYSTEM_ERROR(code); TSDB_CHECK_CODE(code, lino, _exit); } @@ -152,11 +152,11 @@ _exit: } int32_t tsdbPrepareCommit(STsdb *pTsdb) { - taosThreadRwlockWrlock(&pTsdb->rwLock); + taosThreadMutexLock(&pTsdb->mutex); ASSERT(pTsdb->imem == NULL); pTsdb->imem = pTsdb->mem; pTsdb->mem = NULL; - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); return 0; } @@ -171,9 +171,9 @@ int32_t tsdbCommit(STsdb *pTsdb, SCommitInfo *pInfo) { // check if (pMemTable->nRow == 0 && pMemTable->nDel == 0) { - taosThreadRwlockWrlock(&pTsdb->rwLock); + taosThreadMutexLock(&pTsdb->mutex); pTsdb->imem = NULL; - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); tsdbUnrefMemTable(pMemTable, NULL, true); goto _exit; @@ -501,6 +501,7 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { int32_t lino = 0; STsdb *pTsdb = pCommitter->pTsdb; SDFileSet *pRSet = NULL; + // memory pCommitter->commitFid = tsdbKeyFid(pCommitter->nextKey, pCommitter->minutes, pCommitter->precision); pCommitter->expLevel = tsdbFidLevel(pCommitter->commitFid, &pCommitter->pTsdb->keepCfg, taosGetTimestampSec()); @@ -798,6 +799,7 @@ static int32_t tsdbCommitFileData(SCommitter *pCommitter) { int32_t lino = 0; STsdb *pTsdb = pCommitter->pTsdb; SMemTable *pMemTable = pTsdb->imem; + // commit file data start code = tsdbCommitFileDataStart(pCommitter); TSDB_CHECK_CODE(code, lino, _exit); @@ -1650,18 +1652,18 @@ int32_t tsdbFinishCommit(STsdb *pTsdb) { SMemTable *pMemTable = pTsdb->imem; // lock - taosThreadRwlockWrlock(&pTsdb->rwLock); + taosThreadMutexLock(&pTsdb->mutex); code = tsdbFSCommit(pTsdb); if (code) { - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); TSDB_CHECK_CODE(code, lino, _exit); } pTsdb->imem = NULL; // unlock - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); if (pMemTable) { tsdbUnrefMemTable(pMemTable, NULL, true); } diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit2.c b/source/dnode/vnode/src/tsdb/tsdbCommit2.c index 5357c52723..46e3aff0d4 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit2.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit2.c @@ -368,7 +368,12 @@ static int32_t tsdbCommitFileSetBegin(SCommitter2 *committer) { int32_t lino = 0; STsdb *tsdb = committer->tsdb; - committer->ctx->fid = tsdbKeyFid(committer->ctx->nextKey, committer->minutes, committer->precision); + int32_t fid = tsdbKeyFid(committer->ctx->nextKey, committer->minutes, committer->precision); + + // check if can commit + tsdbFSCheckCommit(tsdb, fid); + + committer->ctx->fid = fid; committer->ctx->expLevel = tsdbFidLevel(committer->ctx->fid, &tsdb->keepCfg, committer->ctx->now); tsdbFidKeyRange(committer->ctx->fid, committer->minutes, committer->precision, &committer->ctx->minKey, &committer->ctx->maxKey); @@ -576,11 +581,11 @@ _exit: } int32_t tsdbPreCommit(STsdb *tsdb) { - taosThreadRwlockWrlock(&tsdb->rwLock); + taosThreadMutexLock(&tsdb->mutex); ASSERT(tsdb->imem == NULL); tsdb->imem = tsdb->mem; tsdb->mem = NULL; - taosThreadRwlockUnlock(&tsdb->rwLock); + taosThreadMutexUnlock(&tsdb->mutex); return 0; } @@ -595,15 +600,13 @@ int32_t tsdbCommitBegin(STsdb *tsdb, SCommitInfo *info) { int64_t nDel = imem->nDel; if (nRow == 0 && nDel == 0) { - taosThreadRwlockWrlock(&tsdb->rwLock); + taosThreadMutexLock(&tsdb->mutex); tsdb->imem = NULL; - taosThreadRwlockUnlock(&tsdb->rwLock); + taosThreadMutexUnlock(&tsdb->mutex); tsdbUnrefMemTable(imem, NULL, true); } else { SCommitter2 committer[1]; - tsdbFSCheckCommit(tsdb->pFS); - code = tsdbOpenCommitter(tsdb, info, committer); TSDB_CHECK_CODE(code, lino, _exit); @@ -632,14 +635,14 @@ int32_t tsdbCommitCommit(STsdb *tsdb) { if (tsdb->imem == NULL) goto _exit; SMemTable *pMemTable = tsdb->imem; - taosThreadRwlockWrlock(&tsdb->rwLock); + taosThreadMutexLock(&tsdb->mutex); code = tsdbFSEditCommit(tsdb->pFS); if (code) { - taosThreadRwlockUnlock(&tsdb->rwLock); + taosThreadMutexUnlock(&tsdb->mutex); TSDB_CHECK_CODE(code, lino, _exit); } tsdb->imem = NULL; - taosThreadRwlockUnlock(&tsdb->rwLock); + taosThreadMutexUnlock(&tsdb->mutex); tsdbUnrefMemTable(pMemTable, NULL, true); _exit: @@ -667,4 +670,4 @@ _exit: tsdbInfo("vgId:%d %s done", TD_VID(pTsdb->pVnode), __func__); } return code; -} +} \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.c b/source/dnode/vnode/src/tsdb/tsdbFS2.c index 93a16b5502..38d221d978 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.c @@ -55,25 +55,11 @@ static int32_t create_fs(STsdb *pTsdb, STFileSystem **fs) { TARRAY2_INIT(fs[0]->fSetArr); TARRAY2_INIT(fs[0]->fSetArrTmp); - // background task queue - taosThreadMutexInit(fs[0]->mutex, NULL); - fs[0]->bgTaskQueue->next = fs[0]->bgTaskQueue; - fs[0]->bgTaskQueue->prev = fs[0]->bgTaskQueue; - - taosThreadMutexInit(&fs[0]->commitMutex, NULL); - taosThreadCondInit(&fs[0]->canCommit, NULL); - fs[0]->blockCommit = false; - return 0; } static int32_t destroy_fs(STFileSystem **fs) { if (fs[0] == NULL) return 0; - taosThreadMutexDestroy(&fs[0]->commitMutex); - taosThreadCondDestroy(&fs[0]->canCommit); - taosThreadMutexDestroy(fs[0]->mutex); - - ASSERT(fs[0]->bgTaskNum == 0); TARRAY2_DESTROY(fs[0]->fSetArr, NULL); TARRAY2_DESTROY(fs[0]->fSetArrTmp, NULL); @@ -264,10 +250,11 @@ static int32_t apply_commit(STFileSystem *fs) { if (fset1 && fset2) { if (fset1->fid < fset2->fid) { // delete fset1 - TARRAY2_REMOVE(fsetArray1, i1, tsdbTFileSetRemove); + tsdbTFileSetRemove(fset1); + i1++; } else if (fset1->fid > fset2->fid) { // create new file set with fid of fset2->fid - code = tsdbTFileSetInitDup(fs->tsdb, fset2, &fset1); + code = tsdbTFileSetInitCopy(fs->tsdb, fset2, &fset1); if (code) return code; code = TARRAY2_SORT_INSERT(fsetArray1, fset1, tsdbTFileSetCmprFn); if (code) return code; @@ -282,10 +269,11 @@ static int32_t apply_commit(STFileSystem *fs) { } } else if (fset1) { // delete fset1 - TARRAY2_REMOVE(fsetArray1, i1, tsdbTFileSetRemove); + tsdbTFileSetRemove(fset1); + i1++; } else { // create new file set with fid of fset2->fid - code = tsdbTFileSetInitDup(fs->tsdb, fset2, &fset1); + code = tsdbTFileSetInitCopy(fs->tsdb, fset2, &fset1); if (code) return code; code = TARRAY2_SORT_INSERT(fsetArray1, fset1, tsdbTFileSetCmprFn); if (code) return code; @@ -512,7 +500,8 @@ static int32_t tsdbFSDoSanAndFix(STFileSystem *fs) { TARRAY2_FOREACH(lvl->fobjArr, fobj) { code = tsdbFSDoScanAndFixFile(fs, fobj); if (code) { - fset->maxVerValid = (fobj->f->minVer <= fobj->f->maxVer) ? TMIN(fset->maxVerValid, fobj->f->minVer - 1) : -1; + fset->maxVerValid = + (fobj->f->minVer <= fobj->f->maxVer) ? TMIN(fset->maxVerValid, fobj->f->minVer - 1) : -1; corrupt = true; } } @@ -592,7 +581,7 @@ static int32_t tsdbFSDupState(STFileSystem *fs) { const STFileSet *fset1; TARRAY2_FOREACH(src, fset1) { STFileSet *fset2; - code = tsdbTFileSetInitDup(fs->tsdb, fset1, &fset2); + code = tsdbTFileSetInitCopy(fs->tsdb, fset1, &fset2); if (code) return code; code = TARRAY2_APPEND(dst, fset2); if (code) return code; @@ -665,12 +654,6 @@ static int32_t close_file_system(STFileSystem *fs) { return 0; } -static int32_t apply_edit(STFileSystem *pFS) { - int32_t code = 0; - ASSERTS(0, "TODO: Not implemented yet"); - return code; -} - static int32_t fset_cmpr_fn(const struct STFileSet *pSet1, const struct STFileSet *pSet2) { if (pSet1->fid < pSet2->fid) { return -1; @@ -710,10 +693,23 @@ static int32_t edit_fs(STFileSystem *fs, const TFileOpArray *opArray) { TSDB_CHECK_CODE(code, lino, _exit); } - // remove empty file set + // remove empty empty stt level and empty file set int32_t i = 0; while (i < TARRAY2_SIZE(fsetArray)) { fset = TARRAY2_GET(fsetArray, i); + + SSttLvl *lvl; + int32_t j = 0; + while (j < TARRAY2_SIZE(fset->lvlArr)) { + lvl = TARRAY2_GET(fset->lvlArr, j); + + if (TARRAY2_SIZE(lvl->fobjArr) == 0) { + TARRAY2_REMOVE(fset->lvlArr, j, tsdbSttLvlClear); + } else { + j++; + } + } + if (tsdbTFileSetIsEmpty(fset)) { TARRAY2_REMOVE(fsetArray, i, tsdbTFileSetClear); } else { @@ -753,13 +749,13 @@ _exit: static void tsdbDoWaitBgTask(STFileSystem *fs, STFSBgTask *task) { task->numWait++; - taosThreadCondWait(task->done, fs->mutex); + taosThreadCondWait(task->done, &fs->tsdb->mutex); task->numWait--; if (task->numWait == 0) { taosThreadCondDestroy(task->done); - if (task->free) { - task->free(task->arg); + if (task->destroy) { + task->destroy(task->arg); } taosMemoryFree(task); } @@ -770,8 +766,8 @@ static void tsdbDoDoneBgTask(STFileSystem *fs, STFSBgTask *task) { taosThreadCondBroadcast(task->done); } else { taosThreadCondDestroy(task->done); - if (task->free) { - task->free(task->arg); + if (task->destroy) { + task->destroy(task->arg); } taosMemoryFree(task); } @@ -780,23 +776,16 @@ static void tsdbDoDoneBgTask(STFileSystem *fs, STFSBgTask *task) { int32_t tsdbCloseFS(STFileSystem **fs) { if (fs[0] == NULL) return 0; - taosThreadMutexLock(fs[0]->mutex); - fs[0]->stop = true; - - if (fs[0]->bgTaskRunning) { - tsdbDoWaitBgTask(fs[0], fs[0]->bgTaskRunning); - } - taosThreadMutexUnlock(fs[0]->mutex); - + tsdbFSDisableBgTask(fs[0]); close_file_system(fs[0]); destroy_fs(fs); return 0; } int64_t tsdbFSAllocEid(STFileSystem *fs) { - taosThreadRwlockRdlock(&fs->tsdb->rwLock); + taosThreadMutexLock(&fs->tsdb->mutex); int64_t cid = ++fs->neid; - taosThreadRwlockUnlock(&fs->tsdb->rwLock); + taosThreadMutexUnlock(&fs->tsdb->mutex); return cid; } @@ -837,27 +826,34 @@ _exit: return code; } -static int32_t tsdbFSSetBlockCommit(STFileSystem *fs, bool block) { - taosThreadMutexLock(&fs->commitMutex); +static int32_t tsdbFSSetBlockCommit(STFileSet *fset, bool block) { if (block) { - fs->blockCommit = true; + fset->blockCommit = true; } else { - fs->blockCommit = false; - taosThreadCondSignal(&fs->canCommit); + fset->blockCommit = false; + if (fset->numWaitCommit > 0) { + taosThreadCondSignal(&fset->canCommit); + } } - taosThreadMutexUnlock(&fs->commitMutex); return 0; } -int32_t tsdbFSCheckCommit(STFileSystem *fs) { - taosThreadMutexLock(&fs->commitMutex); - while (fs->blockCommit) { - taosThreadCondWait(&fs->canCommit, &fs->commitMutex); +int32_t tsdbFSCheckCommit(STsdb *tsdb, int32_t fid) { + taosThreadMutexLock(&tsdb->mutex); + STFileSet *fset; + tsdbFSGetFSet(tsdb->pFS, fid, &fset); + if (fset) { + while (fset->blockCommit) { + fset->numWaitCommit++; + taosThreadCondWait(&fset->canCommit, &tsdb->mutex); + fset->numWaitCommit--; + } } - taosThreadMutexUnlock(&fs->commitMutex); + taosThreadMutexUnlock(&tsdb->mutex); return 0; } +// IMPORTANT: the caller must hold fs->tsdb->mutex int32_t tsdbFSEditCommit(STFileSystem *fs) { int32_t code = 0; int32_t lino = 0; @@ -867,36 +863,57 @@ int32_t tsdbFSEditCommit(STFileSystem *fs) { TSDB_CHECK_CODE(code, lino, _exit); // schedule merge - if (fs->tsdb->pVnode->config.sttTrigger > 1) { + int32_t sttTrigger = fs->tsdb->pVnode->config.sttTrigger; + if (sttTrigger > 1) { STFileSet *fset; - int32_t sttTrigger = fs->tsdb->pVnode->config.sttTrigger; - bool schedMerge = false; - bool blockCommit = false; - TARRAY2_FOREACH_REVERSE(fs->fSetArr, fset) { - if (TARRAY2_SIZE(fset->lvlArr) == 0) continue; + if (TARRAY2_SIZE(fset->lvlArr) == 0) { + tsdbFSSetBlockCommit(fset, false); + continue; + } SSttLvl *lvl = TARRAY2_FIRST(fset->lvlArr); - if (lvl->level != 0) continue; + if (lvl->level != 0) { + tsdbFSSetBlockCommit(fset, false); + continue; + } int32_t numFile = TARRAY2_SIZE(lvl->fobjArr); if (numFile >= sttTrigger) { - schedMerge = true; + // launch merge + code = tsdbSchedMerge(fs->tsdb, fset->fid); + TSDB_CHECK_CODE(code, lino, _exit); } if (numFile >= sttTrigger * BLOCK_COMMIT_FACTOR) { - blockCommit = true; + tsdbFSSetBlockCommit(fset, true); + } else { + tsdbFSSetBlockCommit(fset, false); } + } + } - if (schedMerge && blockCommit) break; + // clear empty level and fset + int32_t i = 0; + while (i < TARRAY2_SIZE(fs->fSetArr)) { + STFileSet *fset = TARRAY2_GET(fs->fSetArr, i); + + int32_t j = 0; + while (j < TARRAY2_SIZE(fset->lvlArr)) { + SSttLvl *lvl = TARRAY2_GET(fset->lvlArr, j); + + if (TARRAY2_SIZE(lvl->fobjArr) == 0) { + TARRAY2_REMOVE(fset->lvlArr, j, tsdbSttLvlClear); + } else { + j++; + } } - if (schedMerge) { - code = tsdbFSScheduleBgTask(fs, TSDB_BG_TASK_MERGER, tsdbMerge, NULL, fs->tsdb, NULL); - TSDB_CHECK_CODE(code, lino, _exit); + if (tsdbTFileSetIsEmpty(fset) && fset->bgTaskRunning == NULL) { + TARRAY2_REMOVE(fs->fSetArr, i, tsdbTFileSetClear); + } else { + i++; } - - tsdbFSSetBlockCommit(fs, blockCommit); } _exit: @@ -933,15 +950,15 @@ int32_t tsdbFSCreateCopySnapshot(STFileSystem *fs, TFileSetArray **fsetArr) { TARRAY2_INIT(fsetArr[0]); - taosThreadRwlockRdlock(&fs->tsdb->rwLock); + taosThreadMutexLock(&fs->tsdb->mutex); TARRAY2_FOREACH(fs->fSetArr, fset) { - code = tsdbTFileSetInitDup(fs->tsdb, fset, &fset1); + code = tsdbTFileSetInitCopy(fs->tsdb, fset, &fset1); if (code) break; code = TARRAY2_APPEND(fsetArr[0], fset1); if (code) break; } - taosThreadRwlockUnlock(&fs->tsdb->rwLock); + taosThreadMutexUnlock(&fs->tsdb->mutex); if (code) { TARRAY2_DESTROY(fsetArr[0], tsdbTFileSetClear); @@ -961,9 +978,9 @@ int32_t tsdbFSDestroyCopySnapshot(TFileSetArray **fsetArr) { } int32_t tsdbFSCreateRefSnapshot(STFileSystem *fs, TFileSetArray **fsetArr) { - taosThreadRwlockRdlock(&fs->tsdb->rwLock); + taosThreadMutexLock(&fs->tsdb->mutex); int32_t code = tsdbFSCreateRefSnapshotWithoutLock(fs, fsetArr); - taosThreadRwlockUnlock(&fs->tsdb->rwLock); + taosThreadMutexUnlock(&fs->tsdb->mutex); return code; } @@ -1017,7 +1034,7 @@ int32_t tsdbFSCreateCopyRangedSnapshot(STFileSystem *fs, TSnapRangeArray *pRange } } - taosThreadRwlockRdlock(&fs->tsdb->rwLock); + taosThreadMutexLock(&fs->tsdb->mutex); TARRAY2_FOREACH(fs->fSetArr, fset) { int64_t ever = VERSION_MAX; if (pHash) { @@ -1034,7 +1051,7 @@ int32_t tsdbFSCreateCopyRangedSnapshot(STFileSystem *fs, TSnapRangeArray *pRange code = TARRAY2_APPEND(fsetArr[0], fset1); if (code) break; } - taosThreadRwlockUnlock(&fs->tsdb->rwLock); + taosThreadMutexUnlock(&fs->tsdb->mutex); _out: if (code) { @@ -1089,7 +1106,7 @@ int32_t tsdbFSCreateRefRangedSnapshot(STFileSystem *fs, int64_t sver, int64_t ev } } - taosThreadRwlockRdlock(&fs->tsdb->rwLock); + taosThreadMutexLock(&fs->tsdb->mutex); TARRAY2_FOREACH(fs->fSetArr, fset) { int64_t sver1 = sver; int64_t ever1 = ever; @@ -1118,7 +1135,7 @@ int32_t tsdbFSCreateRefRangedSnapshot(STFileSystem *fs, int64_t sver, int64_t ev fsr1 = NULL; } - taosThreadRwlockUnlock(&fs->tsdb->rwLock); + taosThreadMutexUnlock(&fs->tsdb->mutex); if (code) { tsdbTSnapRangeClear(&fsr1); @@ -1137,59 +1154,69 @@ _out: const char *gFSBgTaskName[] = {NULL, "MERGE", "RETENTION", "COMPACT"}; static int32_t tsdbFSRunBgTask(void *arg) { - STFileSystem *fs = (STFileSystem *)arg; + STFSBgTask *task = (STFSBgTask *)arg; + STFileSystem *fs = task->fs; + STFileSet *fset; - ASSERT(fs->bgTaskRunning != NULL); + tsdbFSGetFSet(fs, task->fid, &fset); - fs->bgTaskRunning->launchTime = taosGetTimestampMs(); - fs->bgTaskRunning->run(fs->bgTaskRunning->arg); - fs->bgTaskRunning->finishTime = taosGetTimestampMs(); + ASSERT(fset != NULL && fset->bgTaskRunning == task); + + task->launchTime = taosGetTimestampMs(); + task->run(task->arg); + task->finishTime = taosGetTimestampMs(); tsdbDebug("vgId:%d bg task:%s task id:%" PRId64 " finished, schedule time:%" PRId64 " launch time:%" PRId64 " finish time:%" PRId64, - TD_VID(fs->tsdb->pVnode), gFSBgTaskName[fs->bgTaskRunning->type], fs->bgTaskRunning->taskid, - fs->bgTaskRunning->scheduleTime, fs->bgTaskRunning->launchTime, fs->bgTaskRunning->finishTime); + TD_VID(fs->tsdb->pVnode), gFSBgTaskName[task->type], task->taskid, task->scheduleTime, task->launchTime, + task->finishTime); - taosThreadMutexLock(fs->mutex); + taosThreadMutexLock(&fs->tsdb->mutex); // free last - tsdbDoDoneBgTask(fs, fs->bgTaskRunning); - fs->bgTaskRunning = NULL; + tsdbDoDoneBgTask(fs, task); + fset->bgTaskRunning = NULL; // schedule next - if (fs->bgTaskNum > 0) { + if (fset->bgTaskNum > 0) { if (fs->stop) { - while (fs->bgTaskNum > 0) { - STFSBgTask *task = fs->bgTaskQueue->next; - task->prev->next = task->next; - task->next->prev = task->prev; - fs->bgTaskNum--; - tsdbDoDoneBgTask(fs, task); + while (fset->bgTaskNum > 0) { + STFSBgTask *nextTask = fset->bgTaskQueue->next; + nextTask->prev->next = nextTask->next; + nextTask->next->prev = nextTask->prev; + fset->bgTaskNum--; + tsdbDoDoneBgTask(fs, nextTask); } } else { // pop task from head - fs->bgTaskRunning = fs->bgTaskQueue->next; - fs->bgTaskRunning->prev->next = fs->bgTaskRunning->next; - fs->bgTaskRunning->next->prev = fs->bgTaskRunning->prev; - fs->bgTaskNum--; - vnodeScheduleTaskEx(1, tsdbFSRunBgTask, arg); + fset->bgTaskRunning = fset->bgTaskQueue->next; + fset->bgTaskRunning->prev->next = fset->bgTaskRunning->next; + fset->bgTaskRunning->next->prev = fset->bgTaskRunning->prev; + fset->bgTaskNum--; + vnodeScheduleTaskEx(1, tsdbFSRunBgTask, fset->bgTaskRunning); } } - taosThreadMutexUnlock(fs->mutex); + taosThreadMutexUnlock(&fs->tsdb->mutex); return 0; } -static int32_t tsdbFSScheduleBgTaskImpl(STFileSystem *fs, EFSBgTaskT type, int32_t (*run)(void *), - void (*destroy)(void *), void *arg, int64_t *taskid) { +// IMPORTANT: the caller must hold the fs->tsdb->mutex +int32_t tsdbFSScheduleBgTask(STFileSystem *fs, int32_t fid, EFSBgTaskT type, int32_t (*run)(void *), + void (*destroy)(void *), void *arg, int64_t *taskid) { if (fs->stop) { if (destroy) { destroy(arg); } - return 0; // TODO: use a better error code + return 0; } - for (STFSBgTask *task = fs->bgTaskQueue->next; task != fs->bgTaskQueue; task = task->next) { + STFileSet *fset; + tsdbFSGetFSet(fs, fid, &fset); + + ASSERT(fset != NULL); + + for (STFSBgTask *task = fset->bgTaskQueue->next; task != fset->bgTaskQueue; task = task->next) { if (task->type == type) { if (destroy) { destroy(arg); @@ -1203,22 +1230,24 @@ static int32_t tsdbFSScheduleBgTaskImpl(STFileSystem *fs, EFSBgTaskT type, int if (task == NULL) return TSDB_CODE_OUT_OF_MEMORY; taosThreadCondInit(task->done, NULL); + task->fs = fs; + task->fid = fid; task->type = type; task->run = run; - task->free = destroy; + task->destroy = destroy; task->arg = arg; task->scheduleTime = taosGetTimestampMs(); task->taskid = ++fs->taskid; - if (fs->bgTaskRunning == NULL && fs->bgTaskNum == 0) { + if (fset->bgTaskRunning == NULL && fset->bgTaskNum == 0) { // launch task directly - fs->bgTaskRunning = task; - vnodeScheduleTaskEx(1, tsdbFSRunBgTask, fs); + fset->bgTaskRunning = task; + vnodeScheduleTaskEx(1, tsdbFSRunBgTask, task); } else { // add to the queue tail - fs->bgTaskNum++; - task->next = fs->bgTaskQueue; - task->prev = fs->bgTaskQueue->prev; + fset->bgTaskNum++; + task->next = fset->bgTaskQueue; + task->prev = fset->bgTaskQueue->prev; task->prev->next = task; task->next->prev = task; } @@ -1227,68 +1256,30 @@ static int32_t tsdbFSScheduleBgTaskImpl(STFileSystem *fs, EFSBgTaskT type, int return 0; } -int32_t tsdbFSScheduleBgTask(STFileSystem *fs, EFSBgTaskT type, int32_t (*run)(void *), void (*free)(void *), void *arg, - int64_t *taskid) { - taosThreadMutexLock(fs->mutex); - int32_t code = tsdbFSScheduleBgTaskImpl(fs, type, run, free, arg, taskid); - taosThreadMutexUnlock(fs->mutex); - return code; -} +int32_t tsdbFSDisableBgTask(STFileSystem *fs) { + taosThreadMutexLock(&fs->tsdb->mutex); + for (;;) { + fs->stop = true; + bool done = true; -int32_t tsdbFSWaitBgTask(STFileSystem *fs, int64_t taskid) { - STFSBgTask *task = NULL; - - taosThreadMutexLock(fs->mutex); - - if (fs->bgTaskRunning && fs->bgTaskRunning->taskid == taskid) { - task = fs->bgTaskRunning; - } else { - for (STFSBgTask *taskt = fs->bgTaskQueue->next; taskt != fs->bgTaskQueue; taskt = taskt->next) { - if (taskt->taskid == taskid) { - task = taskt; + STFileSet *fset; + TARRAY2_FOREACH(fs->fSetArr, fset) { + if (fset->bgTaskRunning) { + tsdbDoWaitBgTask(fs, fset->bgTaskRunning); + done = false; break; } } - } - if (task) { - tsdbDoWaitBgTask(fs, task); + if (done) break; } - - taosThreadMutexUnlock(fs->mutex); + taosThreadMutexUnlock(&fs->tsdb->mutex); return 0; } -int32_t tsdbFSWaitAllBgTask(STFileSystem *fs) { - taosThreadMutexLock(fs->mutex); - - while (fs->bgTaskRunning) { - taosThreadCondWait(fs->bgTaskRunning->done, fs->mutex); - } - - taosThreadMutexUnlock(fs->mutex); - return 0; -} - -static int32_t tsdbFSDoDisableBgTask(STFileSystem *fs) { - fs->stop = true; - - if (fs->bgTaskRunning) { - tsdbDoWaitBgTask(fs, fs->bgTaskRunning); - } - return 0; -} - -int32_t tsdbFSDisableBgTask(STFileSystem *fs) { - taosThreadMutexLock(fs->mutex); - int32_t code = tsdbFSDoDisableBgTask(fs); - taosThreadMutexUnlock(fs->mutex); - return code; -} - int32_t tsdbFSEnableBgTask(STFileSystem *fs) { - taosThreadMutexLock(fs->mutex); + taosThreadMutexLock(&fs->tsdb->mutex); fs->stop = false; - taosThreadMutexUnlock(fs->mutex); + taosThreadMutexUnlock(&fs->tsdb->mutex); return 0; -} +} \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.h b/source/dnode/vnode/src/tsdb/tsdbFS2.h index 31b98e5656..a3a8e2f575 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.h +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.h @@ -22,22 +22,11 @@ extern "C" { #endif -/* Exposed Handle */ -typedef struct STFileSystem STFileSystem; -typedef struct STFSBgTask STFSBgTask; -// typedef TARRAY2(STFileSet *) TFileSetArray; - typedef enum { TSDB_FEDIT_COMMIT = 1, // TSDB_FEDIT_MERGE } EFEditT; -typedef enum { - TSDB_BG_TASK_MERGER = 1, - TSDB_BG_TASK_RETENTION, - TSDB_BG_TASK_COMPACT, -} EFSBgTaskT; - typedef enum { TSDB_FCURRENT = 1, TSDB_FCURRENT_C, // for commit @@ -67,37 +56,17 @@ int32_t tsdbFSEditBegin(STFileSystem *fs, const TFileOpArray *opArray, EFEditT e int32_t tsdbFSEditCommit(STFileSystem *fs); int32_t tsdbFSEditAbort(STFileSystem *fs); // background task -int32_t tsdbFSScheduleBgTask(STFileSystem *fs, EFSBgTaskT type, int32_t (*run)(void *), void (*free)(void *), void *arg, - int64_t *taskid); -int32_t tsdbFSWaitBgTask(STFileSystem *fs, int64_t taskid); -int32_t tsdbFSWaitAllBgTask(STFileSystem *fs); +int32_t tsdbFSScheduleBgTask(STFileSystem *fs, int32_t fid, EFSBgTaskT type, int32_t (*run)(void *), + void (*destroy)(void *), void *arg, int64_t *taskid); int32_t tsdbFSDisableBgTask(STFileSystem *fs); int32_t tsdbFSEnableBgTask(STFileSystem *fs); // other int32_t tsdbFSGetFSet(STFileSystem *fs, int32_t fid, STFileSet **fset); -int32_t tsdbFSCheckCommit(STFileSystem *fs); +int32_t tsdbFSCheckCommit(STsdb *tsdb, int32_t fid); // utils int32_t save_fs(const TFileSetArray *arr, const char *fname); int32_t current_fname(STsdb *pTsdb, char *fname, EFCurrentT ftype); -struct STFSBgTask { - EFSBgTaskT type; - int32_t (*run)(void *arg); - void (*free)(void *arg); - void *arg; - - TdThreadCond done[1]; - int32_t numWait; - - int64_t taskid; - int64_t scheduleTime; - int64_t launchTime; - int64_t finishTime; - - struct STFSBgTask *prev; - struct STFSBgTask *next; -}; - /* Exposed Structs */ struct STFileSystem { STsdb *tsdb; @@ -109,17 +78,8 @@ struct STFileSystem { TFileSetArray fSetArrTmp[1]; // background task queue - TdThreadMutex mutex[1]; - bool stop; - int64_t taskid; - int32_t bgTaskNum; - STFSBgTask bgTaskQueue[1]; - STFSBgTask *bgTaskRunning; - - // block commit variables - TdThreadMutex commitMutex; - TdThreadCond canCommit; - bool blockCommit; + bool stop; + int64_t taskid; }; #ifdef __cplusplus diff --git a/source/dnode/vnode/src/tsdb/tsdbFSet2.c b/source/dnode/vnode/src/tsdb/tsdbFSet2.c index 620fcb3a47..642d555366 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFSet2.c +++ b/source/dnode/vnode/src/tsdb/tsdbFSet2.c @@ -342,11 +342,6 @@ int32_t tsdbTFileSetEdit(STsdb *pTsdb, STFileSet *fset, const STFileOp *op) { int32_t idx = TARRAY2_SEARCH_IDX(lvl->fobjArr, &tfobjp, tsdbTFileObjCmpr, TD_EQ); ASSERT(idx >= 0); TARRAY2_REMOVE(lvl->fobjArr, idx, tsdbSttLvlClearFObj); - - if (TARRAY2_SIZE(lvl->fobjArr) == 0) { - // TODO: remove the stt level if no file exists anymore - // TARRAY2_REMOVE(&fset->lvlArr, lvl - fset->lvlArr.data, tsdbSttLvlClear); - } } else { ASSERT(tsdbIsSameTFile(&op->of, fset->farr[op->of.type]->f)); tsdbTFileObjUnref(fset->farr[op->of.type]); @@ -454,10 +449,22 @@ int32_t tsdbTFileSetInit(int32_t fid, STFileSet **fset) { fset[0]->fid = fid; fset[0]->maxVerValid = VERSION_MAX; TARRAY2_INIT(fset[0]->lvlArr); + + // background task queue + fset[0]->bgTaskNum = 0; + fset[0]->bgTaskQueue->next = fset[0]->bgTaskQueue; + fset[0]->bgTaskQueue->prev = fset[0]->bgTaskQueue; + fset[0]->bgTaskRunning = NULL; + + // block commit variables + taosThreadCondInit(&fset[0]->canCommit, NULL); + fset[0]->numWaitCommit = 0; + fset[0]->blockCommit = false; + return 0; } -int32_t tsdbTFileSetInitDup(STsdb *pTsdb, const STFileSet *fset1, STFileSet **fset) { +int32_t tsdbTFileSetInitCopy(STsdb *pTsdb, const STFileSet *fset1, STFileSet **fset) { int32_t code = tsdbTFileSetInit(fset1->fid, fset); if (code) return code; @@ -588,21 +595,23 @@ int32_t tsdbTFileSetClear(STFileSet **fset) { TARRAY2_DESTROY(fset[0]->lvlArr, tsdbSttLvlClear); + taosThreadCondDestroy(&fset[0]->canCommit); taosMemoryFree(fset[0]); fset[0] = NULL; return 0; } -int32_t tsdbTFileSetRemove(STFileSet **fset) { +int32_t tsdbTFileSetRemove(STFileSet *fset) { + if (fset == NULL) return 0; + for (tsdb_ftype_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) { - if (fset[0]->farr[ftype] == NULL) continue; - tsdbTFileObjRemove(fset[0]->farr[ftype]); + if (fset->farr[ftype] == NULL) continue; + tsdbTFileObjRemove(fset->farr[ftype]); } - TARRAY2_DESTROY(fset[0]->lvlArr, tsdbSttLvlRemove); - taosMemoryFree(fset[0]); - fset[0] = NULL; + TARRAY2_DESTROY(fset->lvlArr, tsdbSttLvlRemove); + return 0; } diff --git a/source/dnode/vnode/src/tsdb/tsdbFSet2.h b/source/dnode/vnode/src/tsdb/tsdbFSet2.h index ea0f99f68e..34f174ade7 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFSet2.h +++ b/source/dnode/vnode/src/tsdb/tsdbFSet2.h @@ -28,6 +28,8 @@ typedef struct SSttLvl SSttLvl; typedef TARRAY2(STFileObj *) TFileObjArray; typedef TARRAY2(SSttLvl *) TSttLvlArray; typedef TARRAY2(STFileOp) TFileOpArray; +typedef struct STFileSystem STFileSystem; +typedef struct STFSBgTask STFSBgTask; typedef enum { TSDB_FOP_NONE = 0, @@ -41,10 +43,10 @@ typedef enum { // init/clear int32_t tsdbTFileSetInit(int32_t fid, STFileSet **fset); -int32_t tsdbTFileSetInitDup(STsdb *pTsdb, const STFileSet *fset1, STFileSet **fset); +int32_t tsdbTFileSetInitCopy(STsdb *pTsdb, const STFileSet *fset1, STFileSet **fset); int32_t tsdbTFileSetInitRef(STsdb *pTsdb, const STFileSet *fset1, STFileSet **fset); int32_t tsdbTFileSetClear(STFileSet **fset); -int32_t tsdbTFileSetRemove(STFileSet **fset); +int32_t tsdbTFileSetRemove(STFileSet *fset); int32_t tsdbTFileSetFilteredInitDup(STsdb *pTsdb, const STFileSet *fset1, int64_t ever, STFileSet **fset, TFileOpArray *fopArr); @@ -58,6 +60,7 @@ int32_t tsdbJsonToTFileSet(STsdb *pTsdb, const cJSON *json, STFileSet **fset); // cmpr int32_t tsdbTFileSetCmprFn(const STFileSet **fset1, const STFileSet **fset2); // edit +int32_t tsdbSttLvlClear(SSttLvl **lvl); int32_t tsdbTFileSetEdit(STsdb *pTsdb, STFileSet *fset, const STFileOp *op); int32_t tsdbTFileSetApplyEdit(STsdb *pTsdb, const STFileSet *fset1, STFileSet *fset); // max commit id @@ -70,6 +73,33 @@ bool tsdbTFileSetIsEmpty(const STFileSet *fset); int32_t tsdbSttLvlInit(int32_t level, SSttLvl **lvl); int32_t tsdbSttLvlClear(SSttLvl **lvl); +typedef enum { + TSDB_BG_TASK_MERGER = 1, + TSDB_BG_TASK_RETENTION, + TSDB_BG_TASK_COMPACT, +} EFSBgTaskT; + +struct STFSBgTask { + STFileSystem *fs; + int32_t fid; + + EFSBgTaskT type; + int32_t (*run)(void *arg); + void (*destroy)(void *arg); + void *arg; + + TdThreadCond done[1]; + int32_t numWait; + + int64_t taskid; + int64_t scheduleTime; + int64_t launchTime; + int64_t finishTime; + + struct STFSBgTask *prev; + struct STFSBgTask *next; +}; + struct STFileOp { tsdb_fop_t optype; int32_t fid; @@ -87,6 +117,16 @@ struct STFileSet { int64_t maxVerValid; STFileObj *farr[TSDB_FTYPE_MAX]; // file array TSttLvlArray lvlArr[1]; // level array + + // background task queue + int32_t bgTaskNum; + STFSBgTask bgTaskQueue[1]; + STFSBgTask *bgTaskRunning; + + // block commit variables + TdThreadCond canCommit; + int32_t numWaitCommit; + bool blockCommit; }; struct STSnapRange { diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index ee3abf7559..cc77474e79 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -191,7 +191,7 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid pMemTable->nDel++; pMemTable->minVer = TMIN(pMemTable->minVer, version); - pMemTable->maxVer = TMIN(pMemTable->maxVer, version); + pMemTable->maxVer = TMAX(pMemTable->maxVer, version); /* if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && tsdbKeyCmprFn(&lastKey, &pTbData->maxKey) >= 0) { tsdbCacheDeleteLastrow(pTsdb->lruCache, pTbData->uid, eKey); diff --git a/source/dnode/vnode/src/tsdb/tsdbMerge.c b/source/dnode/vnode/src/tsdb/tsdbMerge.c index e659cedba3..0c20a342d3 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMerge.c +++ b/source/dnode/vnode/src/tsdb/tsdbMerge.c @@ -15,11 +15,17 @@ #include "tsdbMerge.h" -#define TSDB_MAX_LEVEL 6 // means max level is 7 +#define TSDB_MAX_LEVEL 2 // means max level is 3 typedef struct { - STsdb *tsdb; - TFileSetArray *fsetArr; + STsdb *tsdb; + int32_t fid; +} SMergeArg; + +typedef struct { + STsdb *tsdb; + int32_t fid; + STFileSet *fset; int32_t sttTrigger; int32_t maxRow; @@ -313,7 +319,6 @@ static int32_t tsdbMergeFileSetBeginOpenWriter(SMerger *merger) { if (merger->ctx->fset->farr[ftype]) { config.files[ftype].exist = true; config.files[ftype].file = merger->ctx->fset->farr[ftype]->f[0]; - } else { config.files[ftype].exist = false; } @@ -397,13 +402,13 @@ static int32_t tsdbMergeFileSetEnd(SMerger *merger) { code = tsdbFSEditBegin(merger->tsdb->pFS, merger->fopArr, TSDB_FEDIT_MERGE); TSDB_CHECK_CODE(code, lino, _exit); - taosThreadRwlockWrlock(&merger->tsdb->rwLock); + taosThreadMutexLock(&merger->tsdb->mutex); code = tsdbFSEditCommit(merger->tsdb->pFS); if (code) { - taosThreadRwlockUnlock(&merger->tsdb->rwLock); + taosThreadMutexUnlock(&merger->tsdb->mutex); TSDB_CHECK_CODE(code, lino, _exit); } - taosThreadRwlockUnlock(&merger->tsdb->rwLock); + taosThreadMutexUnlock(&merger->tsdb->mutex); _exit: if (code) { @@ -478,30 +483,21 @@ _exit: } static int32_t tsdbDoMerge(SMerger *merger) { - int32_t code = 0; - int32_t lino = 0; + int32_t code = 0; + int32_t lino = 0; + SSttLvl *lvl = TARRAY2_FIRST(merger->fset->lvlArr); - STFileSet *fset; - TARRAY2_FOREACH(merger->fsetArr, fset) { - if (TARRAY2_SIZE(fset->lvlArr) == 0) continue; + if (TARRAY2_SIZE(merger->fset->lvlArr) == 0) return 0; + if (lvl->level != 0 || TARRAY2_SIZE(lvl->fobjArr) < merger->sttTrigger) return 0; - SSttLvl *lvl = TARRAY2_FIRST(fset->lvlArr); + code = tsdbMergerOpen(merger); + TSDB_CHECK_CODE(code, lino, _exit); - if (lvl->level != 0 || TARRAY2_SIZE(lvl->fobjArr) < merger->sttTrigger) continue; + code = tsdbMergeFileSet(merger, merger->fset); + TSDB_CHECK_CODE(code, lino, _exit); - if (!merger->ctx->opened) { - code = tsdbMergerOpen(merger); - TSDB_CHECK_CODE(code, lino, _exit); - } - - code = tsdbMergeFileSet(merger, fset); - TSDB_CHECK_CODE(code, lino, _exit); - } - - if (merger->ctx->opened) { - code = tsdbMergerClose(merger); - TSDB_CHECK_CODE(code, lino, _exit); - } + code = tsdbMergerClose(merger); + TSDB_CHECK_CODE(code, lino, _exit); _exit: if (code) { @@ -512,36 +508,73 @@ _exit: return code; } -int32_t tsdbMerge(void *arg) { - int32_t code = 0; - int32_t lino = 0; - STsdb *tsdb = (STsdb *)arg; +static int32_t tsdbMergeGetFSet(SMerger *merger) { + STFileSet *fset; - SMerger merger[1] = {{ - .tsdb = tsdb, - .sttTrigger = tsdb->pVnode->config.sttTrigger, - }}; - - if (merger->sttTrigger <= 1) { + taosThreadMutexLock(&merger->tsdb->mutex); + tsdbFSGetFSet(merger->tsdb->pFS, merger->fid, &fset); + if (fset == NULL) { + taosThreadMutexUnlock(&merger->tsdb->mutex); return 0; } - code = tsdbFSCreateCopySnapshot(tsdb->pFS, &merger->fsetArr); + int32_t code = tsdbTFileSetInitCopy(merger->tsdb, fset, &merger->fset); + if (code) { + taosThreadMutexUnlock(&merger->tsdb->mutex); + return code; + } + taosThreadMutexUnlock(&merger->tsdb->mutex); + return 0; +} + +static int32_t tsdbMerge(void *arg) { + int32_t code = 0; + int32_t lino = 0; + SMergeArg *mergeArg = (SMergeArg *)arg; + STsdb *tsdb = mergeArg->tsdb; + + SMerger merger[1] = {{ + .tsdb = tsdb, + .fid = mergeArg->fid, + .sttTrigger = tsdb->pVnode->config.sttTrigger, + }}; + + if (merger->sttTrigger <= 1) return 0; + + // copy snapshot + code = tsdbMergeGetFSet(merger); TSDB_CHECK_CODE(code, lino, _exit); + if (merger->fset == NULL) return 0; + + // do merge + tsdbDebug("vgId:%d merge begin, fid:%d", TD_VID(tsdb->pVnode), merger->fid); code = tsdbDoMerge(merger); + tsdbDebug("vgId:%d merge done, fid:%d", TD_VID(tsdb->pVnode), mergeArg->fid); TSDB_CHECK_CODE(code, lino, _exit); - tsdbFSDestroyCopySnapshot(&merger->fsetArr); - _exit: if (code) { TSDB_ERROR_LOG(TD_VID(tsdb->pVnode), lino, code); tsdbFatal("vgId:%d, failed to merge stt files since %s. code:%d", TD_VID(tsdb->pVnode), terrstr(), code); taosMsleep(100); exit(EXIT_FAILURE); - } else if (merger->ctx->opened) { - tsdbDebug("vgId:%d %s done", TD_VID(tsdb->pVnode), __func__); } + tsdbTFileSetClear(&merger->fset); return code; } + +int32_t tsdbSchedMerge(STsdb *tsdb, int32_t fid) { + SMergeArg *arg = taosMemoryMalloc(sizeof(*arg)); + if (arg == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + arg->tsdb = tsdb; + arg->fid = fid; + + int32_t code = tsdbFSScheduleBgTask(tsdb->pFS, fid, TSDB_BG_TASK_MERGER, tsdbMerge, taosMemoryFree, arg, NULL); + if (code) taosMemoryFree(arg); + + return code; +} \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbOpen.c b/source/dnode/vnode/src/tsdb/tsdbOpen.c index 6dd66c7a40..c32b2eedd7 100644 --- a/source/dnode/vnode/src/tsdb/tsdbOpen.c +++ b/source/dnode/vnode/src/tsdb/tsdbOpen.c @@ -53,7 +53,7 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee snprintf(pTsdb->path, TD_PATH_MAX, "%s%s%s", pVnode->path, TD_DIRSEP, dir); // taosRealPath(pTsdb->path, NULL, slen); pTsdb->pVnode = pVnode; - taosThreadRwlockInit(&pTsdb->rwLock, NULL); + taosThreadMutexInit(&pTsdb->mutex, NULL); if (!pKeepCfg) { tsdbSetKeepCfg(pTsdb, &pVnode->config.tsdbCfg); } else { @@ -99,15 +99,14 @@ int tsdbClose(STsdb **pTsdb) { tsdbDebug("vgId:%d, tsdb is close at %s, days:%d, keep:%d,%d,%d, keepTimeOffset:%d", TD_VID(pdb->pVnode), pdb->path, pdb->keepCfg.days, pdb->keepCfg.keep0, pdb->keepCfg.keep1, pdb->keepCfg.keep2, pdb->keepCfg.keepTimeOffset); - taosThreadRwlockWrlock(&(*pTsdb)->rwLock); + taosThreadMutexLock(&(*pTsdb)->mutex); tsdbMemTableDestroy((*pTsdb)->mem, true); (*pTsdb)->mem = NULL; - taosThreadRwlockUnlock(&(*pTsdb)->rwLock); - - taosThreadRwlockDestroy(&(*pTsdb)->rwLock); + taosThreadMutexUnlock(&(*pTsdb)->mutex); tsdbCloseFS(&(*pTsdb)->pFS); tsdbCloseCache(*pTsdb); + taosThreadMutexDestroy(&(*pTsdb)->mutex); taosMemoryFreeClear(*pTsdb); } return 0; diff --git a/source/dnode/vnode/src/tsdb/tsdbRead2.c b/source/dnode/vnode/src/tsdb/tsdbRead2.c index 65cebf0ca0..d1919d95ba 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead2.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead2.c @@ -1105,8 +1105,9 @@ static int32_t dataBlockPartiallyRequired(STimeWindow* pWindow, SVersionRange* p (pVerRange->maxVer < pBlock->record.maxVer && pVerRange->maxVer >= pBlock->record.minVer); } -static bool getNeighborBlockOfSameTable(SDataBlockIter* pBlockIter, SFileDataBlockInfo* pBlockInfo, STableBlockScanInfo* pTableBlockScanInfo, - int32_t* nextIndex, int32_t order, SBrinRecord* pRecord) { +static bool getNeighborBlockOfSameTable(SDataBlockIter* pBlockIter, SFileDataBlockInfo* pBlockInfo, + STableBlockScanInfo* pTableBlockScanInfo, int32_t* nextIndex, int32_t order, + SBrinRecord* pRecord) { bool asc = ASCENDING_TRAVERSE(order); if (asc && pBlockInfo->tbBlockIdx >= taosArrayGetSize(pTableBlockScanInfo->pBlockIdxList) - 1) { return false; @@ -1119,7 +1120,8 @@ static bool getNeighborBlockOfSameTable(SDataBlockIter* pBlockIter, SFileDataBlo int32_t step = asc ? 1 : -1; // *nextIndex = pBlockInfo->tbBlockIdx + step; // *pBlockIndex = *(SBlockIndex*)taosArrayGet(pTableBlockScanInfo->pBlockList, *nextIndex); - STableDataBlockIdx* pTableDataBlockIdx = taosArrayGet(pTableBlockScanInfo->pBlockIdxList, pBlockInfo->tbBlockIdx + step); + STableDataBlockIdx* pTableDataBlockIdx = + taosArrayGet(pTableBlockScanInfo->pBlockIdxList, pBlockInfo->tbBlockIdx + step); SFileDataBlockInfo* p = taosArrayGet(pBlockIter->blockList, pTableDataBlockIdx->globalIndex); memcpy(pRecord, &p->record, sizeof(SBrinRecord)); @@ -1145,7 +1147,8 @@ static int32_t findFileBlockInfoIndex(SDataBlockIter* pBlockIter, SFileDataBlock return -1; } -static int32_t setFileBlockActiveInBlockIter(STsdbReader* pReader, SDataBlockIter* pBlockIter, int32_t index, int32_t step) { +static int32_t setFileBlockActiveInBlockIter(STsdbReader* pReader, SDataBlockIter* pBlockIter, int32_t index, + int32_t step) { if (index < 0 || index >= pBlockIter->numOfBlocks) { return -1; } @@ -1153,12 +1156,13 @@ static int32_t setFileBlockActiveInBlockIter(STsdbReader* pReader, SDataBlockIte SFileDataBlockInfo fblock = *(SFileDataBlockInfo*)taosArrayGet(pBlockIter->blockList, index); pBlockIter->index += step; - if (index != pBlockIter->index) { + if (index != pBlockIter->index) { if (index > pBlockIter->index) { for (int32_t i = index - 1; i >= pBlockIter->index; --i) { SFileDataBlockInfo* pBlockInfo = taosArrayGet(pBlockIter->blockList, i); - STableBlockScanInfo* pBlockScanInfo = getTableBlockScanInfo(pReader->status.pTableMap, pBlockInfo->uid, pReader->idStr); + STableBlockScanInfo* pBlockScanInfo = + getTableBlockScanInfo(pReader->status.pTableMap, pBlockInfo->uid, pReader->idStr); STableDataBlockIdx* pTableDataBlockIdx = taosArrayGet(pBlockScanInfo->pBlockIdxList, pBlockInfo->tbBlockIdx); pTableDataBlockIdx->globalIndex = i + 1; @@ -1168,13 +1172,13 @@ static int32_t setFileBlockActiveInBlockIter(STsdbReader* pReader, SDataBlockIte for (int32_t i = index + 1; i <= pBlockIter->index; ++i) { SFileDataBlockInfo* pBlockInfo = taosArrayGet(pBlockIter->blockList, i); - STableBlockScanInfo* pBlockScanInfo = getTableBlockScanInfo(pReader->status.pTableMap, pBlockInfo->uid, pReader->idStr); + STableBlockScanInfo* pBlockScanInfo = + getTableBlockScanInfo(pReader->status.pTableMap, pBlockInfo->uid, pReader->idStr); STableDataBlockIdx* pTableDataBlockIdx = taosArrayGet(pBlockScanInfo->pBlockIdxList, pBlockInfo->tbBlockIdx); pTableDataBlockIdx->globalIndex = i - 1; taosArraySet(pBlockIter->blockList, i - 1, pBlockInfo); } - } taosArraySet(pBlockIter->blockList, pBlockIter->index, &fblock); @@ -1196,11 +1200,28 @@ static bool overlapWithNeighborBlock2(SFileDataBlockInfo* pBlock, SBrinRecord* p } } -static bool bufferDataInFileBlockGap(int32_t order, TSDBKEY key, SFileDataBlockInfo* pBlock) { +static int64_t getBoarderKeyInFiles(SFileDataBlockInfo* pBlock, SLastBlockReader* pLastBlockReader, int32_t order) { bool ascScan = ASCENDING_TRAVERSE(order); + bool bHasDataInLastBlock = hasDataInLastBlock(pLastBlockReader); - return (ascScan && (key.ts != TSKEY_INITIAL_VAL && key.ts <= pBlock->record.firstKey)) || - (!ascScan && (key.ts != TSKEY_INITIAL_VAL && key.ts >= pBlock->record.lastKey)); + int64_t key = 0; + if (bHasDataInLastBlock) { + int64_t keyInStt = getCurrentKeyInLastBlock(pLastBlockReader); + key = ascScan ? TMIN(pBlock->record.firstKey, keyInStt) : TMAX(pBlock->record.lastKey, keyInStt); + } else { + key = ascScan ? pBlock->record.firstKey : pBlock->record.lastKey; + } + + return key; +} + +static bool bufferDataInFileBlockGap(TSDBKEY keyInBuf, SFileDataBlockInfo* pBlock, + SLastBlockReader* pLastBlockReader, int32_t order) { + bool ascScan = ASCENDING_TRAVERSE(order); + int64_t key = getBoarderKeyInFiles(pBlock, pLastBlockReader, order); + + return (ascScan && (keyInBuf.ts != TSKEY_INITIAL_VAL && keyInBuf.ts < key)) || + (!ascScan && (keyInBuf.ts != TSKEY_INITIAL_VAL && keyInBuf.ts > key)); } static bool keyOverlapFileBlock(TSDBKEY key, SFileDataBlockInfo* pBlock, SVersionRange* pVerRange) { @@ -1286,7 +1307,8 @@ static void getBlockToLoadInfo(SDataBlockToLoadInfo* pInfo, SFileDataBlockInfo* int32_t neighborIndex = 0; SBrinRecord rec = {0}; - bool hasNeighbor = getNeighborBlockOfSameTable(&pReader->status.blockIter, pBlockInfo, pScanInfo, &neighborIndex, pReader->info.order, &rec); + bool hasNeighbor = getNeighborBlockOfSameTable(&pReader->status.blockIter, pBlockInfo, pScanInfo, &neighborIndex, + pReader->info.order, &rec); // overlap with neighbor if (hasNeighbor) { @@ -1420,9 +1442,7 @@ static bool nextRowFromLastBlocks(SLastBlockReader* pLastBlockReader, STableBloc } } -static void doPinSttBlock(SLastBlockReader* pLastBlockReader) { - tMergeTreePinSttBlock(&pLastBlockReader->mergeTree); -} +static void doPinSttBlock(SLastBlockReader* pLastBlockReader) { tMergeTreePinSttBlock(&pLastBlockReader->mergeTree); } static void doUnpinSttBlock(SLastBlockReader* pLastBlockReader) { tMergeTreeUnpinSttBlock(&pLastBlockReader->mergeTree); @@ -1568,7 +1588,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* if (minKey == tsLast) { TSDBROW* fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree); - int32_t code = tsdbRowMergerAdd(pMerger, fRow1, NULL); + int32_t code = tsdbRowMergerAdd(pMerger, fRow1, NULL); if (code != TSDB_CODE_SUCCESS) { return code; } @@ -1618,7 +1638,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* if (minKey == tsLast) { TSDBROW* fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree); - int32_t code = tsdbRowMergerAdd(pMerger, fRow1, NULL); + int32_t code = tsdbRowMergerAdd(pMerger, fRow1, NULL); if (code != TSDB_CODE_SUCCESS) { return code; } @@ -1826,8 +1846,8 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo* int64_t key = hasDataInFileBlock(pBlockData, pDumpInfo) ? pBlockData->aTSKEY[pDumpInfo->rowIndex] : INT64_MIN; - TSDBKEY k = TSDBROW_KEY(pRow); - TSDBKEY ik = TSDBROW_KEY(piRow); + TSDBKEY k = TSDBROW_KEY(pRow); + TSDBKEY ik = TSDBROW_KEY(piRow); STSchema* pSchema = NULL; if (pRow->type == TSDBROW_ROW_FMT) { @@ -2219,8 +2239,9 @@ static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanI SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; TSDBROW *pRow = NULL, *piRow = NULL; - int64_t key = (pBlockData->nRow > 0 && (!pDumpInfo->allDumped)) ? pBlockData->aTSKEY[pDumpInfo->rowIndex] : - (ASCENDING_TRAVERSE(pReader->info.order) ? INT64_MAX : INT64_MIN); + int64_t key = (pBlockData->nRow > 0 && (!pDumpInfo->allDumped)) + ? pBlockData->aTSKEY[pDumpInfo->rowIndex] + : (ASCENDING_TRAVERSE(pReader->info.order) ? INT64_MAX : INT64_MIN); if (pBlockScanInfo->iter.hasVal) { pRow = getValidMemRow(&pBlockScanInfo->iter, pBlockScanInfo->delSkyline, pReader); } @@ -2257,7 +2278,8 @@ static int32_t loadNeighborIfOverlap(SFileDataBlockInfo* pBlockInfo, STableBlock *loadNeighbor = false; SBrinRecord rec = {0}; - bool hasNeighbor = getNeighborBlockOfSameTable(&pReader->status.blockIter, pBlockInfo, pBlockScanInfo, &nextIndex, pReader->info.order, &rec); + bool hasNeighbor = getNeighborBlockOfSameTable(&pReader->status.blockIter, pBlockInfo, pBlockScanInfo, &nextIndex, + pReader->info.order, &rec); if (!hasNeighbor) { // do nothing return code; } @@ -2268,7 +2290,7 @@ static int32_t loadNeighborIfOverlap(SFileDataBlockInfo* pBlockInfo, STableBlock // 1. find the next neighbor block in the scan block list STableDataBlockIdx* tableDataBlockIdx = taosArrayGet(pBlockScanInfo->pBlockIdxList, nextIndex); - int32_t neighborIndex = tableDataBlockIdx->globalIndex; + int32_t neighborIndex = tableDataBlockIdx->globalIndex; // 2. remove it from the scan block list setFileBlockActiveInBlockIter(pReader, pBlockIter, neighborIndex, step); @@ -2662,6 +2684,15 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) { } } +static bool notOverlapWithSttFiles(SFileDataBlockInfo* pBlockInfo, SLastBlockReader* pLastBlockReader, bool asc) { + if(!hasDataInLastBlock(pLastBlockReader)) { + return true; + } else { + int64_t keyInStt = getCurrentKeyInLastBlock(pLastBlockReader); + return (asc && pBlockInfo->record.lastKey < keyInStt) || (!asc && pBlockInfo->record.firstKey > keyInStt); + } +} + static int32_t doBuildDataBlock(STsdbReader* pReader) { int32_t code = TSDB_CODE_SUCCESS; @@ -2697,17 +2728,13 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) { // build composed data block code = buildComposedDataBlock(pReader); - } else if (bufferDataInFileBlockGap(pReader->info.order, keyInBuf, pBlockInfo)) { - // data in memory that are earlier than current file block + } else if (bufferDataInFileBlockGap(keyInBuf, pBlockInfo, pLastBlockReader, pReader->info.order)) { + // data in memory that are earlier than current file block and stt blocks // rows in buffer should be less than the file block in asc, greater than file block in desc - int64_t endKey = - (ASCENDING_TRAVERSE(pReader->info.order)) ? pBlockInfo->record.firstKey : pBlockInfo->record.lastKey; + int64_t endKey = getBoarderKeyInFiles(pBlockInfo, pLastBlockReader, pReader->info.order); code = buildDataBlockFromBuf(pReader, pScanInfo, endKey); } else { - bool bHasDataInLastBlock = hasDataInLastBlock(pLastBlockReader); - int64_t tsLast = bHasDataInLastBlock ? getCurrentKeyInLastBlock(pLastBlockReader) : INT64_MIN; - if (!bHasDataInLastBlock || - ((asc && pBlockInfo->record.lastKey < tsLast) || (!asc && pBlockInfo->record.firstKey > tsLast))) { + if (notOverlapWithSttFiles(pBlockInfo, pLastBlockReader, asc)) { // whole block is required, return it directly SDataBlockInfo* pInfo = &pReader->resBlockInfo.pResBlock->info; pInfo->rows = pBlockInfo->record.numRow; @@ -2718,7 +2745,7 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) { setBlockAllDumped(&pStatus->fBlockDumpInfo, pBlockInfo->record.lastKey, pReader->info.order); // update the last key for the corresponding table - pScanInfo->lastKey = ASCENDING_TRAVERSE(pReader->info.order) ? pInfo->window.ekey : pInfo->window.skey; + pScanInfo->lastKey = asc ? pInfo->window.ekey : pInfo->window.skey; tsdbDebug("%p uid:%" PRIu64 " clean file block retrieved from file, global index:%d, " "table index:%d, rows:%d, brange:%" PRId64 "-%" PRId64 ", %s", @@ -2745,10 +2772,11 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) { } // data in stt now overlaps with current active file data block, need to composed with file data block. - int64_t keyInStt = getCurrentKeyInLastBlock(pLastBlockReader); - if ((keyInStt >= pBlockInfo->record.firstKey && asc) || (keyInStt <= pBlockInfo->record.lastKey && (!asc))) { - tsdbDebug("%p keyInStt:%" PRId64 ", overlap with file block, brange:%" PRId64 "-%" PRId64 " %s", pReader, - keyInStt, pBlockInfo->record.firstKey, pBlockInfo->record.lastKey, pReader->idStr); + int64_t lastKeyInStt = getCurrentKeyInLastBlock(pLastBlockReader); + if ((lastKeyInStt >= pBlockInfo->record.firstKey && asc) || + (lastKeyInStt <= pBlockInfo->record.lastKey && (!asc))) { + tsdbDebug("%p lastKeyInStt:%" PRId64 ", overlap with file block, brange:%" PRId64 "-%" PRId64 " %s", pReader, + lastKeyInStt, pBlockInfo->record.firstKey, pBlockInfo->record.lastKey, pReader->idStr); break; } } @@ -3479,7 +3507,7 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, // start to merge duplicated rows STSchema* pTSchema = NULL; - if (current.type == TSDBROW_ROW_FMT) { // get the correct schema for row-wise data in memory + if (current.type == TSDBROW_ROW_FMT) { // get the correct schema for row-wise data in memory pTSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(¤t), pReader, uid); if (pTSchema == NULL) { return terrno; @@ -3525,8 +3553,8 @@ int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* p SRow** pTSRow) { SRowMerger* pMerger = &pReader->status.merger; - TSDBKEY k = TSDBROW_KEY(pRow); - TSDBKEY ik = TSDBROW_KEY(piRow); + TSDBKEY k = TSDBROW_KEY(pRow); + TSDBKEY ik = TSDBROW_KEY(piRow); STSchema* pSchema = NULL; if (pRow->type == TSDBROW_ROW_FMT) { @@ -4907,12 +4935,12 @@ int32_t tsdbTakeReadSnap2(STsdbReader* pReader, _query_reseek_func_t reseek, STs SVersionRange* pRange = &pReader->info.verRange; // lock - taosThreadRwlockRdlock(&pTsdb->rwLock); + taosThreadMutexLock(&pTsdb->mutex); // alloc STsdbReadSnap* pSnap = (STsdbReadSnap*)taosMemoryCalloc(1, sizeof(STsdbReadSnap)); if (pSnap == NULL) { - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; } @@ -4922,7 +4950,7 @@ int32_t tsdbTakeReadSnap2(STsdbReader* pReader, _query_reseek_func_t reseek, STs pSnap->pMem = pTsdb->mem; pSnap->pNode = taosMemoryMalloc(sizeof(*pSnap->pNode)); if (pSnap->pNode == NULL) { - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; } @@ -4937,7 +4965,7 @@ int32_t tsdbTakeReadSnap2(STsdbReader* pReader, _query_reseek_func_t reseek, STs pSnap->pIMem = pTsdb->imem; pSnap->pINode = taosMemoryMalloc(sizeof(*pSnap->pINode)); if (pSnap->pINode == NULL) { - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; } @@ -4952,7 +4980,7 @@ int32_t tsdbTakeReadSnap2(STsdbReader* pReader, _query_reseek_func_t reseek, STs code = tsdbFSCreateRefSnapshotWithoutLock(pTsdb->pFS, &pSnap->pfSetArray); // unlock - taosThreadRwlockUnlock(&pTsdb->rwLock); + taosThreadMutexUnlock(&pTsdb->mutex); if (code == TSDB_CODE_SUCCESS) { tsdbTrace("vgId:%d, take read snapshot", TD_VID(pTsdb->pVnode)); @@ -5005,4 +5033,5 @@ void tsdbReaderSetId2(STsdbReader* pReader, const char* idstr) { pReader->status.fileIter.pLastBlockReader->mergeTree.idStr = pReader->idStr; } -void tsdbReaderSetCloseFlag(STsdbReader* pReader) { /*pReader->code = TSDB_CODE_TSC_QUERY_CANCELLED;*/ } +void tsdbReaderSetCloseFlag(STsdbReader* pReader) { /*pReader->code = TSDB_CODE_TSC_QUERY_CANCELLED;*/ +} diff --git a/source/dnode/vnode/src/tsdb/tsdbRetention.c b/source/dnode/vnode/src/tsdb/tsdbRetention.c index cfeca531fc..40561ddb42 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRetention.c +++ b/source/dnode/vnode/src/tsdb/tsdbRetention.c @@ -25,11 +25,6 @@ typedef struct { TFileSetArray *fsetArr; TFileOpArray fopArr[1]; - - struct { - int32_t fsetArrIdx; - STFileSet *fset; - } ctx[1]; } SRTNer; static int32_t tsdbDoRemoveFileObject(SRTNer *rtner, const STFileObj *fobj) { @@ -229,8 +224,8 @@ _exit: typedef struct { STsdb *tsdb; - int32_t sync; int64_t now; + int32_t fid; } SRtnArg; static int32_t tsdbDoRetentionBegin(SRtnArg *arg, SRTNer *rtner) { @@ -265,15 +260,15 @@ static int32_t tsdbDoRetentionEnd(SRTNer *rtner) { code = tsdbFSEditBegin(rtner->tsdb->pFS, rtner->fopArr, TSDB_FEDIT_MERGE); TSDB_CHECK_CODE(code, lino, _exit); - taosThreadRwlockWrlock(&rtner->tsdb->rwLock); + taosThreadMutexLock(&rtner->tsdb->mutex); code = tsdbFSEditCommit(rtner->tsdb->pFS); if (code) { - taosThreadRwlockUnlock(&rtner->tsdb->rwLock); + taosThreadMutexUnlock(&rtner->tsdb->mutex); TSDB_CHECK_CODE(code, lino, _exit); } - taosThreadRwlockUnlock(&rtner->tsdb->rwLock); + taosThreadMutexUnlock(&rtner->tsdb->mutex); TARRAY2_DESTROY(rtner->fopArr, NULL); @@ -287,56 +282,47 @@ _exit: return code; } -static int32_t tsdbDoRetention2(void *arg) { - int32_t code = 0; - int32_t lino = 0; - SRTNer rtner[1] = {0}; +static int32_t tsdbDoRetentionOnFileSet(SRTNer *rtner, STFileSet *fset) { + int32_t code = 0; + int32_t lino = 0; + STFileObj *fobj = NULL; + int32_t expLevel = tsdbFidLevel(fset->fid, &rtner->tsdb->keepCfg, rtner->now); - code = tsdbDoRetentionBegin(arg, rtner); - TSDB_CHECK_CODE(code, lino, _exit); + if (expLevel < 0) { // remove the fileset + for (int32_t ftype = 0; (ftype < TSDB_FTYPE_MAX) && (fobj = fset->farr[ftype], 1); ++ftype) { + if (fobj == NULL) continue; - for (rtner->ctx->fsetArrIdx = 0; rtner->ctx->fsetArrIdx < TARRAY2_SIZE(rtner->fsetArr); rtner->ctx->fsetArrIdx++) { - rtner->ctx->fset = TARRAY2_GET(rtner->fsetArr, rtner->ctx->fsetArrIdx); - - STFileObj *fobj; - int32_t expLevel = tsdbFidLevel(rtner->ctx->fset->fid, &rtner->tsdb->keepCfg, rtner->now); - - if (expLevel < 0) { // remove the file set - for (int32_t ftype = 0; (ftype < TSDB_FTYPE_MAX) && (fobj = rtner->ctx->fset->farr[ftype], 1); ++ftype) { - if (fobj == NULL) continue; - - int32_t nlevel = tfsGetLevel(rtner->tsdb->pVnode->pTfs); - if (tsS3Enabled && nlevel > 1 && TSDB_FTYPE_DATA == ftype && fobj->f->did.level == nlevel - 1 && - !taosCheckExistFile(fobj->fname)) { - code = tsdbRemoveFileObjectS3(rtner, fobj); - TSDB_CHECK_CODE(code, lino, _exit); - } else { - code = tsdbDoRemoveFileObject(rtner, fobj); - TSDB_CHECK_CODE(code, lino, _exit); - } - } - - SSttLvl *lvl; - TARRAY2_FOREACH(rtner->ctx->fset->lvlArr, lvl) { - TARRAY2_FOREACH(lvl->fobjArr, fobj) { - code = tsdbDoRemoveFileObject(rtner, fobj); - TSDB_CHECK_CODE(code, lino, _exit); - } - } - } else if (expLevel == 0) { - continue; - } else { - SDiskID did; - - if (tfsAllocDisk(rtner->tsdb->pVnode->pTfs, expLevel, &did) < 0) { - code = terrno; + int32_t nlevel = tfsGetLevel(rtner->tsdb->pVnode->pTfs); + if (tsS3Enabled && nlevel > 1 && TSDB_FTYPE_DATA == ftype && fobj->f->did.level == nlevel - 1) { + code = tsdbRemoveFileObjectS3(rtner, fobj); + TSDB_CHECK_CODE(code, lino, _exit); + } else { + code = tsdbDoRemoveFileObject(rtner, fobj); TSDB_CHECK_CODE(code, lino, _exit); } - tfsMkdirRecurAt(rtner->tsdb->pVnode->pTfs, rtner->tsdb->path, did); + } - // data - for (int32_t ftype = 0; ftype < TSDB_FTYPE_MAX && (fobj = rtner->ctx->fset->farr[ftype], 1); ++ftype) { - if (fobj == NULL) continue; + SSttLvl *lvl; + TARRAY2_FOREACH(fset->lvlArr, lvl) { + TARRAY2_FOREACH(lvl->fobjArr, fobj) { + code = tsdbDoRemoveFileObject(rtner, fobj); + TSDB_CHECK_CODE(code, lino, _exit); + } + } + } else if (expLevel == 0) { // only migrate to upper level + return 0; + } else { // migrate + SDiskID did; + + if (tfsAllocDisk(rtner->tsdb->pVnode->pTfs, expLevel, &did) < 0) { + code = terrno; + TSDB_CHECK_CODE(code, lino, _exit); + } + tfsMkdirRecurAt(rtner->tsdb->pVnode->pTfs, rtner->tsdb->path, did); + + // data + for (int32_t ftype = 0; ftype < TSDB_FTYPE_MAX && (fobj = fset->farr[ftype], 1); ++ftype) { + if (fobj == NULL) continue; int32_t nlevel = tfsGetLevel(rtner->tsdb->pVnode->pTfs); @@ -373,23 +359,20 @@ static int32_t tsdbDoRetention2(void *arg) { TSDB_CHECK_CODE(code, lino, _exit); //} } + } - // stt - SSttLvl *lvl; - TARRAY2_FOREACH(rtner->ctx->fset->lvlArr, lvl) { - TARRAY2_FOREACH(lvl->fobjArr, fobj) { - if (fobj->f->did.level == did.level) continue; + // stt + SSttLvl *lvl; + TARRAY2_FOREACH(fset->lvlArr, lvl) { + TARRAY2_FOREACH(lvl->fobjArr, fobj) { + if (fobj->f->did.level == did.level) continue; - code = tsdbDoMigrateFileObj(rtner, fobj, &did); - TSDB_CHECK_CODE(code, lino, _exit); - } + code = tsdbDoMigrateFileObj(rtner, fobj, &did); + TSDB_CHECK_CODE(code, lino, _exit); } } } - code = tsdbDoRetentionEnd(rtner); - TSDB_CHECK_CODE(code, lino, _exit); - _exit: if (code) { if (TARRAY2_DATA(rtner->fopArr)) { @@ -405,30 +388,105 @@ _exit: return code; } -static void tsdbFreeRtnArg(void *arg) { - SRtnArg *rArg = (SRtnArg *)arg; - if (rArg->sync) { - tsem_post(&rArg->tsdb->pVnode->canCommit); +static int32_t tsdbDoRetentionSync(void *arg) { + int32_t code = 0; + int32_t lino = 0; + SRTNer rtner[1] = {0}; + + code = tsdbDoRetentionBegin(arg, rtner); + TSDB_CHECK_CODE(code, lino, _exit); + + STFileSet *fset; + TARRAY2_FOREACH(rtner->fsetArr, fset) { + code = tsdbDoRetentionOnFileSet(rtner, fset); + TSDB_CHECK_CODE(code, lino, _exit); } - taosMemoryFree(arg); + + code = tsdbDoRetentionEnd(rtner); + TSDB_CHECK_CODE(code, lino, _exit); + +_exit: + if (code) { + TSDB_ERROR_LOG(TD_VID(rtner->tsdb->pVnode), lino, code); + } + tsem_post(&((SRtnArg *)arg)->tsdb->pVnode->canCommit); + return code; } -int32_t tsdbRetention(STsdb *tsdb, int64_t now, int32_t sync) { - SRtnArg *arg = taosMemoryMalloc(sizeof(*arg)); - if (arg == NULL) return TSDB_CODE_OUT_OF_MEMORY; - arg->tsdb = tsdb; - arg->sync = sync; - arg->now = now; +static int32_t tsdbDoRetentionAsync(void *arg) { + int32_t code = 0; + int32_t lino = 0; + SRTNer rtner[1] = {0}; - if (sync) { - tsem_wait(&tsdb->pVnode->canCommit); + code = tsdbDoRetentionBegin(arg, rtner); + TSDB_CHECK_CODE(code, lino, _exit); + + STFileSet *fset; + TARRAY2_FOREACH(rtner->fsetArr, fset) { + if (fset->fid != ((SRtnArg *)arg)->fid) continue; + + code = tsdbDoRetentionOnFileSet(rtner, fset); + TSDB_CHECK_CODE(code, lino, _exit); } - int64_t taskid; - int32_t code = - tsdbFSScheduleBgTask(tsdb->pFS, TSDB_BG_TASK_RETENTION, tsdbDoRetention2, tsdbFreeRtnArg, arg, &taskid); + code = tsdbDoRetentionEnd(rtner); + TSDB_CHECK_CODE(code, lino, _exit); + +_exit: if (code) { - tsdbFreeRtnArg(arg); + TSDB_ERROR_LOG(TD_VID(rtner->tsdb->pVnode), lino, code); } return code; } + +static void tsdbFreeRtnArg(void *arg) { taosMemoryFree(arg); } + +int32_t tsdbRetention(STsdb *tsdb, int64_t now, int32_t sync) { + int32_t code = 0; + + if (sync) { // sync retention + SRtnArg *arg = taosMemoryMalloc(sizeof(*arg)); + if (arg == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + arg->tsdb = tsdb; + arg->now = now; + arg->fid = INT32_MAX; + + tsem_wait(&tsdb->pVnode->canCommit); + code = vnodeScheduleTask(tsdbDoRetentionSync, arg); + if (code) { + tsem_post(&tsdb->pVnode->canCommit); + taosMemoryFree(arg); + return code; + } + } else { // async retention + taosThreadMutexLock(&tsdb->mutex); + + STFileSet *fset; + TARRAY2_FOREACH(tsdb->pFS->fSetArr, fset) { + SRtnArg *arg = taosMemoryMalloc(sizeof(*arg)); + if (arg == NULL) { + taosThreadMutexUnlock(&tsdb->mutex); + return TSDB_CODE_OUT_OF_MEMORY; + } + + arg->tsdb = tsdb; + arg->now = now; + arg->fid = fset->fid; + + code = tsdbFSScheduleBgTask(tsdb->pFS, fset->fid, TSDB_BG_TASK_RETENTION, tsdbDoRetentionAsync, tsdbFreeRtnArg, + arg, NULL); + if (code) { + tsdbFreeRtnArg(arg); + taosThreadMutexUnlock(&tsdb->mutex); + return code; + } + } + + taosThreadMutexUnlock(&tsdb->mutex); + } + + return code; +} diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index 3b4827a6be..a9da0fbcec 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -38,8 +38,8 @@ struct STsdbSnapReader { struct { int32_t fsrArrIdx; STSnapRange* fsr; - bool isDataDone; - bool isTombDone; + bool isDataDone; + bool isTombDone; } ctx[1]; // reader @@ -1095,17 +1095,17 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** writer, int8_t rollback) { code = tsdbFSEditAbort(writer[0]->tsdb->pFS); TSDB_CHECK_CODE(code, lino, _exit); } else { - taosThreadRwlockWrlock(&writer[0]->tsdb->rwLock); + taosThreadMutexLock(&writer[0]->tsdb->mutex); code = tsdbFSEditCommit(writer[0]->tsdb->pFS); if (code) { - taosThreadRwlockUnlock(&writer[0]->tsdb->rwLock); + taosThreadMutexUnlock(&writer[0]->tsdb->mutex); TSDB_CHECK_CODE(code, lino, _exit); } writer[0]->tsdb->pFS->fsstate = TSDB_FS_STATE_NORMAL; - taosThreadRwlockUnlock(&writer[0]->tsdb->rwLock); + taosThreadMutexUnlock(&writer[0]->tsdb->mutex); } tsdbFSEnableBgTask(tsdb->pFS); @@ -1236,7 +1236,7 @@ static int32_t tsdbTFileSetToSnapPart(STFileSet* fset, STsdbSnapPartition** ppSP if (fset->farr[ftype] == NULL) continue; typ = tsdbFTypeToSRangeTyp(ftype); ASSERT(typ < TSDB_SNAP_RANGE_TYP_MAX); - STFile* f = fset->farr[ftype]->f; + STFile* f = fset->farr[ftype]->f; if (f->maxVer > fset->maxVerValid) { corrupt = true; tsdbError("skip incomplete data file: fid:%d, maxVerValid:%" PRId64 ", minVer:%" PRId64 ", maxVer:%" PRId64 @@ -1255,7 +1255,7 @@ static int32_t tsdbTFileSetToSnapPart(STFileSet* fset, STsdbSnapPartition** ppSP TARRAY2_FOREACH(fset->lvlArr, lvl) { STFileObj* fobj; TARRAY2_FOREACH(lvl->fobjArr, fobj) { - STFile* f = fobj->f; + STFile* f = fobj->f; if (f->maxVer > fset->maxVerValid) { corrupt = true; tsdbError("skip incomplete stt file.fid:%d, maxVerValid:%" PRId64 ", minVer:%" PRId64 ", maxVer:%" PRId64 @@ -1299,7 +1299,7 @@ static STsdbSnapPartList* tsdbGetSnapPartList(STFileSystem* fs) { } int32_t code = 0; - taosThreadRwlockRdlock(&fs->tsdb->rwLock); + taosThreadMutexLock(&fs->tsdb->mutex); STFileSet* fset; TARRAY2_FOREACH(fs->fSetArr, fset) { STsdbSnapPartition* pItem = NULL; @@ -1311,7 +1311,7 @@ static STsdbSnapPartList* tsdbGetSnapPartList(STFileSystem* fs) { code = TARRAY2_SORT_INSERT(pList, pItem, tsdbSnapPartCmprFn); ASSERT(code == 0); } - taosThreadRwlockUnlock(&fs->tsdb->rwLock); + taosThreadMutexUnlock(&fs->tsdb->mutex); if (code) { TARRAY2_DESTROY(pList, tsdbSnapPartitionClear); @@ -1521,7 +1521,8 @@ ETsdbFsState tsdbSnapGetFsState(SVnode* pVnode) { return pVnode->pTsdb->pFS->fsstate; } for (int32_t lvl = 0; lvl < TSDB_RETENTION_MAX; ++lvl) { - if (SMA_RSMA_GET_TSDB(pVnode, lvl)->pFS->fsstate != TSDB_FS_STATE_NORMAL) { + STsdb* pTsdb = SMA_RSMA_GET_TSDB(pVnode, lvl); + if (pTsdb && pTsdb->pFS->fsstate != TSDB_FS_STATE_NORMAL) { return TSDB_FS_STATE_INCOMPLETE; } } diff --git a/source/dnode/vnode/src/vnd/vnodeCfg.c b/source/dnode/vnode/src/vnd/vnodeCfg.c index bbd67611cb..07bfa6c719 100644 --- a/source/dnode/vnode/src/vnd/vnodeCfg.c +++ b/source/dnode/vnode/src/vnd/vnodeCfg.c @@ -106,7 +106,7 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) { if (tjsonAddIntegerToObject(pJson, "keep1", pCfg->tsdbCfg.keep1) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "keep2", pCfg->tsdbCfg.keep2) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "keepTimeOffset", pCfg->tsdbCfg.keepTimeOffset) < 0) return -1; - if (pCfg->tsdbCfg.retentions[0].freq > 0) { + if (pCfg->tsdbCfg.retentions[0].keep > 0) { int32_t nRetention = 1; if (pCfg->tsdbCfg.retentions[1].freq > 0) { ++nRetention; diff --git a/source/dnode/vnode/src/vnd/vnodeSnapshot.c b/source/dnode/vnode/src/vnd/vnodeSnapshot.c index 87b407efcb..91244e321f 100644 --- a/source/dnode/vnode/src/vnd/vnodeSnapshot.c +++ b/source/dnode/vnode/src/vnd/vnodeSnapshot.c @@ -584,6 +584,7 @@ int32_t vnodeSnapWriterClose(SVSnapWriter *pWriter, int8_t rollback, SSnapshot * // commit json if (!rollback) { + ASSERT(pVnode->config.vgId == pWriter->info.config.vgId); pWriter->info.state.committed = pWriter->ever; pVnode->config = pWriter->info.config; pVnode->state = (SVState){.committed = pWriter->info.state.committed, diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index ed3b9460a6..b3675380c7 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -20,6 +20,8 @@ #include "vndCos.h" #include "vnode.h" #include "vnodeInt.h" +#include "audit.h" +#include "tstrbuild.h" static int32_t vnodeProcessCreateStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessAlterStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); @@ -585,7 +587,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg } } break; case TDMT_VND_STREAM_TASK_RESET: { - if (pVnode->restored /* && vnodeIsLeader(pVnode)*/) { + if (pVnode->restored && vnodeIsLeader(pVnode)) { tqProcessTaskResetReq(pVnode->pTq, pMsg); } } break; @@ -887,6 +889,7 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, char tbName[TSDB_TABLE_FNAME_LEN]; STbUidStore *pStore = NULL; SArray *tbUids = NULL; + SArray *tbNames = NULL; pRsp->msgType = TDMT_VND_CREATE_TABLE_RSP; pRsp->code = TSDB_CODE_SUCCESS; @@ -903,7 +906,8 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, rsp.pArray = taosArrayInit(req.nReqs, sizeof(cRsp)); tbUids = taosArrayInit(req.nReqs, sizeof(int64_t)); - if (rsp.pArray == NULL || tbUids == NULL) { + tbNames = taosArrayInit(req.nReqs, sizeof(char*)); + if (rsp.pArray == NULL || tbUids == NULL || tbNames == NULL) { rcode = -1; terrno = TSDB_CODE_OUT_OF_MEMORY; goto _exit; @@ -948,13 +952,10 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, taosArrayPush(rsp.pArray, &cRsp); - if (tsEnableAuditCreateTable) { - int64_t clusterId = pVnode->config.syncCfg.nodeInfo[0].clusterId; - - SName name = {0}; - tNameFromString(&name, pVnode->config.dbname, T_NAME_ACCT | T_NAME_DB); - - auditRecord(NULL, clusterId, "createTable", name.dbname, "", pCreateReq->name, strlen(pCreateReq->name)); + if(tsEnableAuditCreateTable){ + char* str = taosMemoryCalloc(1, TSDB_TABLE_FNAME_LEN); + strcpy(str, pCreateReq->name); + taosArrayPush(tbNames, &str); } } @@ -977,17 +978,42 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, tEncoderInit(&encoder, pRsp->pCont, pRsp->contLen); tEncodeSVCreateTbBatchRsp(&encoder, &rsp); + if(tsEnableAuditCreateTable){ + int64_t clusterId = pVnode->config.syncCfg.nodeInfo[0].clusterId; + + SName name = {0}; + tNameFromString(&name, pVnode->config.dbname, T_NAME_ACCT | T_NAME_DB); + + SStringBuilder sb = {0}; + for(int32_t iReq = 0; iReq < req.nReqs; iReq++){ + char** key = (char**)taosArrayGet(tbNames, iReq); + taosStringBuilderAppendStringLen(&sb, *key, strlen(*key)); + if(iReq < req.nReqs - 1){ + taosStringBuilderAppendChar(&sb, ','); + } + taosMemoryFreeClear(*key); + } + + size_t len = 0; + char* keyJoined = taosStringBuilderGetResult(&sb, &len); + + auditRecord(NULL, clusterId, "createTable", name.dbname, "", keyJoined, len); + + taosStringBuilderDestroy(&sb); + } + _exit: for (int32_t iReq = 0; iReq < req.nReqs; iReq++) { pCreateReq = req.pReqs + iReq; taosMemoryFree(pCreateReq->sql); taosMemoryFree(pCreateReq->comment); - taosArrayDestroy(pCreateReq->ctb.tagName); + taosArrayDestroy(pCreateReq->ctb.tagName); } taosArrayDestroyEx(rsp.pArray, tFreeSVCreateTbRsp); taosArrayDestroy(tbUids); tDecoderClear(&decoder); tEncoderClear(&encoder); + taosArrayDestroy(tbNames); return rcode; } @@ -1121,6 +1147,7 @@ static int32_t vnodeProcessDropTbReq(SVnode *pVnode, int64_t ver, void *pReq, in int32_t ret; SArray *tbUids = NULL; STbUidStore *pStore = NULL; + SArray *tbNames = NULL; pRsp->msgType = TDMT_VND_DROP_TABLE_RSP; pRsp->pCont = NULL; @@ -1139,7 +1166,8 @@ static int32_t vnodeProcessDropTbReq(SVnode *pVnode, int64_t ver, void *pReq, in // process req tbUids = taosArrayInit(req.nReqs, sizeof(int64_t)); rsp.pArray = taosArrayInit(req.nReqs, sizeof(SVDropTbRsp)); - if (tbUids == NULL || rsp.pArray == NULL) goto _exit; + tbNames = taosArrayInit(req.nReqs, sizeof(char*)); + if (tbUids == NULL || rsp.pArray == NULL || tbNames == NULL) goto _exit; for (int32_t iReq = 0; iReq < req.nReqs; iReq++) { SVDropTbReq *pDropTbReq = req.pReqs + iReq; @@ -1160,11 +1188,41 @@ static int32_t vnodeProcessDropTbReq(SVnode *pVnode, int64_t ver, void *pReq, in } taosArrayPush(rsp.pArray, &dropTbRsp); + + if(tsEnableAuditCreateTable){ + char* str = taosMemoryCalloc(1, TSDB_TABLE_FNAME_LEN); + strcpy(str, pDropTbReq->name); + taosArrayPush(tbNames, &str); + } } tqUpdateTbUidList(pVnode->pTq, tbUids, false); tdUpdateTbUidList(pVnode->pSma, pStore, false); + if(tsEnableAuditCreateTable){ + int64_t clusterId = pVnode->config.syncCfg.nodeInfo[0].clusterId; + + SName name = {0}; + tNameFromString(&name, pVnode->config.dbname, T_NAME_ACCT | T_NAME_DB); + + SStringBuilder sb = {0}; + for(int32_t iReq = 0; iReq < req.nReqs; iReq++){ + char** key = (char**)taosArrayGet(tbNames, iReq); + taosStringBuilderAppendStringLen(&sb, *key, strlen(*key)); + if(iReq < req.nReqs - 1){ + taosStringBuilderAppendChar(&sb, ','); + } + taosMemoryFreeClear(*key); + } + + size_t len = 0; + char* keyJoined = taosStringBuilderGetResult(&sb, &len); + + auditRecord(NULL, clusterId, "dropTable", name.dbname, "", keyJoined, len); + + taosStringBuilderDestroy(&sb); + } + _exit: taosArrayDestroy(tbUids); tdUidStoreFree(pStore); @@ -1175,6 +1233,7 @@ _exit: tEncodeSVDropTbBatchRsp(&encoder, &rsp); tEncoderClear(&encoder); taosArrayDestroy(rsp.pArray); + taosArrayDestroy(tbNames); return 0; } diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 6c03ed68e9..dcc31526f7 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -516,7 +516,10 @@ static int32_t vnodeSnapshotStopWrite(const SSyncFSM *pFsm, void *pWriter, bool pVnode->config.vgId, isApply, pSnapshot->lastApplyIndex, pSnapshot->lastApplyTerm, pSnapshot->lastConfigIndex); int32_t code = vnodeSnapWriterClose(pWriter, !isApply, pSnapshot); - vInfo("vgId:%d, apply vnode snapshot finished, code:0x%x", pVnode->config.vgId, code); + if (code != 0) { + vError("vgId:%d, failed to finish applying vnode snapshot since %s, code:0x%x", pVnode->config.vgId, terrstr(), + code); + } return code; } @@ -552,7 +555,7 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm, const SyncIndex commitIdx) pVnode->restored = true; taosWLockLatch(&pVnode->pTq->pStreamMeta->lock); - if (pVnode->pTq->pStreamMeta->startInfo.startedAfterNodeUpdate) { + if (pVnode->pTq->pStreamMeta->startInfo.startAllTasksFlag) { vInfo("vgId:%d, sync restore finished, stream tasks will be launched by other thread", vgId); taosWUnLockLatch(&pVnode->pTq->pStreamMeta->lock); return; @@ -564,8 +567,8 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm, const SyncIndex commitIdx) vInfo("vgId:%d, sync restore finished, not launch stream tasks, since stream tasks are disabled", vgId); } else { vInfo("vgId:%d sync restore finished, start to launch stream tasks", pVnode->config.vgId); - tqStartStreamTasks(pVnode->pTq); - tqCheckAndRunStreamTaskAsync(pVnode->pTq); + tqResetStreamTaskStatus(pVnode->pTq); + tqLaunchStreamTaskAsync(pVnode->pTq); } } else { vInfo("vgId:%d, sync restore finished, not launch stream tasks since not leader", vgId); diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c index f204f239b4..3d7a88ac03 100644 --- a/source/libs/command/src/command.c +++ b/source/libs/command/src/command.c @@ -215,37 +215,28 @@ int64_t getValOfDiffPrecision(int8_t unit, int64_t val) { return v; } -char* buildRetension(SArray* pRetension) { +static char* buildRetension(SArray* pRetension) { size_t size = taosArrayGetSize(pRetension); if (size == 0) { return NULL; } - char* p1 = taosMemoryCalloc(1, 100); - SRetention* p = taosArrayGet(pRetension, 0); - + char* p1 = taosMemoryCalloc(1, 100); int32_t len = 0; - int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq); - int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep); - len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit); + for (int32_t i = 0; i < size; ++i) { + SRetention* p = TARRAY_GET_ELEM(pRetension, i); + int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq); + int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep); + if (i == 0) { + len += sprintf(p1 + len, "-:%" PRId64 "%c", v2, p->keepUnit); + } else { + len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit); + } - if (size > 1) { - len += sprintf(p1 + len, ","); - p = taosArrayGet(pRetension, 1); - - v1 = getValOfDiffPrecision(p->freqUnit, p->freq); - v2 = getValOfDiffPrecision(p->keepUnit, p->keep); - len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit); - } - - if (size > 2) { - len += sprintf(p1 + len, ","); - p = taosArrayGet(pRetension, 2); - - v1 = getValOfDiffPrecision(p->freqUnit, p->freq); - v2 = getValOfDiffPrecision(p->keepUnit, p->keep); - len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit); + if (i < size - 1) { + len += sprintf(p1 + len, ","); + } } return p1; diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index 68a83fa662..84aff9fa88 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -2083,6 +2083,34 @@ static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int return TSDB_CODE_SUCCESS; } +static int32_t translateToTimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { + if (LIST_LENGTH(pFunc->pParameterList) != 2) { + return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName); + } + uint8_t para1Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type; + uint8_t para2Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 1))->resType.type; + if (!IS_STR_DATA_TYPE(para1Type) || !IS_STR_DATA_TYPE(para2Type)) { + return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); + } + pFunc->node.resType = + (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP}; + return TSDB_CODE_SUCCESS; +} + +static int32_t translateToChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { + if (LIST_LENGTH(pFunc->pParameterList) != 2) { + return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName); + } + uint8_t para1Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type; + uint8_t para2Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 1))->resType.type; + // currently only support to_char(timestamp, str) + if (!IS_STR_DATA_TYPE(para2Type) || !IS_TIMESTAMP_TYPE(para1Type)) { + return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); + } + pFunc->node.resType = (SDataType){.bytes = 4096, .type = TSDB_DATA_TYPE_VARCHAR}; + return TSDB_CODE_SUCCESS; +} + static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList); if (2 != numOfParams && 3 != numOfParams) { @@ -3284,6 +3312,26 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = { .sprocessFunc = castFunction, .finalizeFunc = NULL }, + { + .name = "to_timestamp", + .type = FUNCTION_TYPE_TO_TIMESTAMP, + .classification = FUNC_MGT_SCALAR_FUNC, + .translateFunc = translateToTimestamp, + .getEnvFunc = NULL, + .initFunc = NULL, + .sprocessFunc = toTimestampFunction, + .finalizeFunc = NULL + }, + { + .name = "to_char", + .type = FUNCTION_TYPE_TO_CHAR, + .classification = FUNC_MGT_SCALAR_FUNC, + .translateFunc = translateToChar, + .getEnvFunc = NULL, + .initFunc = NULL, + .sprocessFunc = toCharFunction, + .finalizeFunc = NULL + }, { .name = "to_iso8601", .type = FUNCTION_TYPE_TO_ISO8601, diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 6e92818bbb..a7b490c0dc 100755 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -304,6 +304,7 @@ retention_list(A) ::= retention(B). retention_list(A) ::= retention_list(B) NK_COMMA retention(C). { A = addNodeToList(pCxt, B, C); } retention(A) ::= NK_VARIABLE(B) NK_COLON NK_VARIABLE(C). { A = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &B), createDurationValueNode(pCxt, &C)); } +retention(A) ::= NK_MINUS(B) NK_COLON NK_VARIABLE(C). { A = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &B), createDurationValueNode(pCxt, &C)); } %type speed_opt { int32_t } %destructor speed_opt { } @@ -787,6 +788,7 @@ table_alias(A) ::= NK_ID(B). %type column_alias { SToken } %destructor column_alias { } column_alias(A) ::= NK_ID(B). { A = B; } +column_alias(A) ::= NK_ALIAS(B). { A = B; } %type user_name { SToken } %destructor user_name { } @@ -873,6 +875,8 @@ expression_list(A) ::= expression_list(B) NK_COMMA expr_or_subquery(C). column_reference(A) ::= column_name(B). { A = createRawExprNode(pCxt, &B, createColumnNode(pCxt, NULL, &B)); } column_reference(A) ::= table_name(B) NK_DOT column_name(C). { A = createRawExprNodeExt(pCxt, &B, &C, createColumnNode(pCxt, &B, &C)); } +column_reference(A) ::= NK_ALIAS(B). { A = createRawExprNode(pCxt, &B, createColumnNode(pCxt, NULL, &B)); } +column_reference(A) ::= table_name(B) NK_DOT NK_ALIAS(C). { A = createRawExprNodeExt(pCxt, &B, &C, createColumnNode(pCxt, &B, &C)); } pseudo_column(A) ::= ROWTS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); } pseudo_column(A) ::= TBNAME(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 8fd98f64de..c6d70667bf 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -1028,9 +1028,13 @@ SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pPr return select; } -SNode* setSelectStmtTagMode(SAstCreateContext* pCxt, SNode* pStmt, bool bSelectTags) { +SNode* setSelectStmtTagMode(SAstCreateContext* pCxt, SNode* pStmt, bool bSelectTags) { if (pStmt && QUERY_NODE_SELECT_STMT == nodeType(pStmt)) { - ((SSelectStmt*)pStmt)->tagScan = bSelectTags; + if (pCxt->pQueryCxt->biMode) { + ((SSelectStmt*)pStmt)->tagScan = true; + } else { + ((SSelectStmt*)pStmt)->tagScan = bSelectTags; + } } return pStmt; } diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index 7d75426d14..7f046abc32 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -627,9 +627,21 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) { case 't': case 'F': case 'f': { - for (i = 1; ((z[i] & 0x80) == 0) && isIdChar[(uint8_t)z[i]]; i++) { + bool hasNonAsciiChars = false; + for (i = 1;; i++) { + if ((z[i] & 0x80) != 0) { + // utf-8 characters + // currently, we support using utf-8 characters only in alias + hasNonAsciiChars = true; + } else if (isIdChar[(uint8_t)z[i]]) { + } else { + break; + } + } + if (hasNonAsciiChars) { + *tokenId = TK_NK_ALIAS; // must be alias + return i; } - if ((i == 4 && strncasecmp(z, "true", 4) == 0) || (i == 5 && strncasecmp(z, "false", 5) == 0)) { *tokenId = TK_NK_BOOL; return i; @@ -638,10 +650,21 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) { return i; } default: { - if (((*z & 0x80) != 0) || !isIdChar[(uint8_t)*z]) { + if ((*z & 0x80) == 0 && !isIdChar[(uint8_t)*z]) { break; } - for (i = 1; ((z[i] & 0x80) == 0) && isIdChar[(uint8_t)z[i]]; i++) { + bool hasNonAsciiChars = false; + for (i = 1; ; i++) { + if ((z[i] & 0x80) != 0) { + hasNonAsciiChars = true; + } else if (isIdChar[(uint8_t)z[i]]){ + } else { + break; + } + } + if (hasNonAsciiChars) { + *tokenId = TK_NK_ALIAS; + return i; } *tokenId = tKeywordCode(z, i); return i; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 72293e2f8c..8572ea8c3b 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -3499,6 +3499,20 @@ static const char* getPrecisionStr(uint8_t precision) { return "unknown"; } +static int64_t getPrecisionMultiple(uint8_t precision) { + switch (precision) { + case TSDB_TIME_PRECISION_MILLI: + return 1; + case TSDB_TIME_PRECISION_MICRO: + return 1000; + case TSDB_TIME_PRECISION_NANO: + return 1000000; + default: + break; + } + return 1; +} + static void convertVarDuration(SValueNode* pOffset, uint8_t precision) { const int64_t factors[3] = {NANOSECOND_PER_MSEC, NANOSECOND_PER_USEC, 1}; const int8_t units[3] = {TIME_UNIT_MILLISECOND, TIME_UNIT_MICROSECOND, TIME_UNIT_NANOSECOND}; @@ -3512,6 +3526,7 @@ static void convertVarDuration(SValueNode* pOffset, uint8_t precision) { pOffset->unit = units[precision]; } +static const int64_t tsdbMaxKeepMS = (int64_t)60 * 1000 * TSDB_MAX_KEEP; static int32_t checkIntervalWindow(STranslateContext* pCxt, SIntervalWindowNode* pInterval) { uint8_t precision = ((SColumnNode*)pInterval->pCol)->node.resType.precision; @@ -3520,6 +3535,8 @@ static int32_t checkIntervalWindow(STranslateContext* pCxt, SIntervalWindowNode* if (pInter->datum.i <= 0 || (!valInter && pInter->datum.i < tsMinIntervalTime)) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INTER_VALUE_TOO_SMALL, tsMinIntervalTime, getPrecisionStr(precision)); + } else if (pInter->datum.i / getPrecisionMultiple(precision) > tsdbMaxKeepMS) { + return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INTER_VALUE_TOO_BIG, 1000, "years"); } if (NULL != pInterval->pOffset) { @@ -4576,7 +4593,7 @@ static int32_t checkDbEnumOption(STranslateContext* pCxt, const char* pName, int return TSDB_CODE_SUCCESS; } -static int32_t checkDbRetentionsOption(STranslateContext* pCxt, SNodeList* pRetentions) { +static int32_t checkDbRetentionsOption(STranslateContext* pCxt, SNodeList* pRetentions, int8_t precision) { if (NULL == pRetentions) { return TSDB_CODE_SUCCESS; } @@ -4588,10 +4605,22 @@ static int32_t checkDbRetentionsOption(STranslateContext* pCxt, SNodeList* pRete SValueNode* pPrevFreq = NULL; SValueNode* pPrevKeep = NULL; SNode* pRetention = NULL; + bool firstFreq = true; FOREACH(pRetention, pRetentions) { SNode* pNode = NULL; FOREACH(pNode, ((SNodeListNode*)pRetention)->pNodeList) { SValueNode* pVal = (SValueNode*)pNode; + if (firstFreq) { + firstFreq = false; + if (pVal->literal[0] != '-' || strlen(pVal->literal) != 1) { + return generateSyntaxErrMsgExt( + &pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(freq): %s, the interval of 1st retention level should be '-'", pVal->literal); + } + pVal->unit = TIME_UNIT_SECOND; // assign minimum unit + pVal->datum.i = 0; // assign minimum value + continue; + } if (DEAL_RES_ERROR == translateValue(pCxt, pVal)) { return pCxt->errCode; } @@ -4599,11 +4628,55 @@ static int32_t checkDbRetentionsOption(STranslateContext* pCxt, SNodeList* pRete SValueNode* pFreq = (SValueNode*)nodesListGetNode(((SNodeListNode*)pRetention)->pNodeList, 0); SValueNode* pKeep = (SValueNode*)nodesListGetNode(((SNodeListNode*)pRetention)->pNodeList, 1); - if (pFreq->datum.i <= 0 || 'n' == pFreq->unit || 'y' == pFreq->unit || pFreq->datum.i >= pKeep->datum.i || - (NULL != pPrevFreq && pPrevFreq->datum.i >= pFreq->datum.i) || - (NULL != pPrevKeep && pPrevKeep->datum.i > pKeep->datum.i)) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, "Invalid option retentions"); + + ASSERTS(pFreq->isDuration && pKeep->isDuration, "Retentions freq/keep should have unit"); + + // check unit + if (pFreq->isDuration && TIME_UNIT_SECOND != pFreq->unit && TIME_UNIT_MINUTE != pFreq->unit && + TIME_UNIT_HOUR != pFreq->unit && TIME_UNIT_DAY != pFreq->unit && TIME_UNIT_WEEK != pFreq->unit) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(freq): %s, only s, m, h, d, w allowed", pFreq->literal); } + + if (pKeep->isDuration && TIME_UNIT_MINUTE != pKeep->unit && TIME_UNIT_HOUR != pKeep->unit && + TIME_UNIT_DAY != pKeep->unit) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(keep): %s, only m, h, d allowed", pKeep->literal); + } + + // check value range + if (pPrevFreq != NULL && pFreq->datum.i <= 0) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(freq): %s should larger than 0", pFreq->literal); + } + int64_t keepMinute = pKeep->datum.i / getUnitPerMinute(pKeep->node.resType.precision); + int64_t tsdbMaxKeep = TSDB_TIME_PRECISION_NANO == precision ? TSDB_MAX_KEEP_NS : TSDB_MAX_KEEP; + if (keepMinute < TSDB_MIN_KEEP || keepMinute > tsdbMaxKeep) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(keep): %" PRId64 "m, valid range: [%" PRIi64 + "m, %" PRId64 "m]", + keepMinute, TSDB_MIN_KEEP, tsdbMaxKeep); + } + + // check relationships + if (pFreq->datum.i >= pKeep->datum.i) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(freq/keep): %s should larger than %s", pKeep->literal, + pFreq->literal); + } + + if (NULL != pPrevFreq && pPrevFreq->datum.i >= pFreq->datum.i) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(freq): %s should larger than %s", pFreq->literal, + pPrevFreq->literal); + } + + if (NULL != pPrevKeep && pPrevKeep->datum.i > pKeep->datum.i) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option retentions(keep): %s should not larger than %s", + pPrevKeep->literal, pKeep->literal); + } + pPrevFreq = pFreq; pPrevKeep = pKeep; } @@ -4723,7 +4796,7 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName TSDB_DB_SINGLE_STABLE_OFF); } if (TSDB_CODE_SUCCESS == code) { - code = checkDbRetentionsOption(pCxt, pOptions->pRetentions); + code = checkDbRetentionsOption(pCxt, pOptions->pRetentions, pOptions->precision); } if (TSDB_CODE_SUCCESS == code) { code = checkDbEnumOption(pCxt, "schemaless", pOptions->schemaless, TSDB_DB_SCHEMALESS_ON, TSDB_DB_SCHEMALESS_OFF); @@ -5021,7 +5094,7 @@ static int32_t checkTableSmaOption(STranslateContext* pCxt, SCreateTableStmt* pS } static bool validRollupFunc(const char* pFunc) { - static const char* rollupFuncs[] = {"avg", "sum", "min", "max", "last", "first"}; + static const char* rollupFuncs[] = {"avg", "sum", "min", "max", "last", "first"}; static const int32_t numOfRollupFuncs = (sizeof(rollupFuncs) / sizeof(char*)); for (int i = 0; i < numOfRollupFuncs; ++i) { if (0 == strcmp(rollupFuncs[i], pFunc)) { @@ -5031,6 +5104,17 @@ static bool validRollupFunc(const char* pFunc) { return false; } +static bool aggrRollupFunc(const char* pFunc) { + static const char* aggrRollupFuncs[] = {"avg", "sum"}; + static const int32_t numOfAggrRollupFuncs = (sizeof(aggrRollupFuncs) / sizeof(char*)); + for (int i = 0; i < numOfAggrRollupFuncs; ++i) { + if (0 == strcmp(aggrRollupFuncs[i], pFunc)) { + return true; + } + } + return false; +} + static int32_t checkTableRollupOption(STranslateContext* pCxt, SNodeList* pFuncs, bool createStable, SDbCfgInfo* pDbCfg) { if (NULL == pFuncs) { @@ -5104,7 +5188,8 @@ static int32_t checkTableTagsSchema(STranslateContext* pCxt, SHashObj* pHash, SN return code; } -static int32_t checkTableColsSchema(STranslateContext* pCxt, SHashObj* pHash, int32_t ntags, SNodeList* pCols) { +static int32_t checkTableColsSchema(STranslateContext* pCxt, SHashObj* pHash, int32_t ntags, SNodeList* pCols, + SNodeList* pRollupFuncs) { int32_t ncols = LIST_LENGTH(pCols); if (ncols < TSDB_MIN_COLUMNS) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_COLUMNS_NUM); @@ -5114,13 +5199,19 @@ static int32_t checkTableColsSchema(STranslateContext* pCxt, SHashObj* pHash, in int32_t code = TSDB_CODE_SUCCESS; - bool first = true; + int32_t colIndex = 0; int32_t rowSize = 0; SNode* pNode = NULL; + char* pFunc = NULL; + bool isAggrRollup = false; + + if (pRollupFuncs) { + pFunc = ((SFunctionNode*)nodesListGetNode(pRollupFuncs, 0))->functionName; + isAggrRollup = aggrRollupFunc(pFunc); + } FOREACH(pNode, pCols) { SColumnDefNode* pCol = (SColumnDefNode*)pNode; - if (first) { - first = false; + if (0 == colIndex) { if (TSDB_DATA_TYPE_TIMESTAMP != pCol->dataType.type) { code = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_FIRST_COLUMN); } @@ -5140,6 +5231,15 @@ static int32_t checkTableColsSchema(STranslateContext* pCxt, SHashObj* pHash, in code = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN); } } + + if (TSDB_CODE_SUCCESS == code && isAggrRollup && 0 != colIndex) { + if (pCol->dataType.type != TSDB_DATA_TYPE_FLOAT && pCol->dataType.type != TSDB_DATA_TYPE_DOUBLE) { + code = + generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_COLUMN, + "Invalid column type: %s, only float/double allowed for %s", pCol->colName, pFunc); + } + } + if (TSDB_CODE_SUCCESS == code) { code = taosHashPut(pHash, pCol->colName, len, &pCol, POINTER_BYTES); } @@ -5148,6 +5248,8 @@ static int32_t checkTableColsSchema(STranslateContext* pCxt, SHashObj* pHash, in } else { break; } + // next column + ++colIndex; } if (TSDB_CODE_SUCCESS == code && rowSize > TSDB_MAX_BYTES_PER_ROW) { @@ -5166,7 +5268,7 @@ static int32_t checkTableSchema(STranslateContext* pCxt, SCreateTableStmt* pStmt int32_t code = checkTableTagsSchema(pCxt, pHash, pStmt->pTags); if (TSDB_CODE_SUCCESS == code) { - code = checkTableColsSchema(pCxt, pHash, LIST_LENGTH(pStmt->pTags), pStmt->pCols); + code = checkTableColsSchema(pCxt, pHash, LIST_LENGTH(pStmt->pTags), pStmt->pCols, pStmt->pOptions->pRollupFuncs); } taosHashCleanup(pHash); diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c index 0ab8927bd0..825e02f9aa 100644 --- a/source/libs/parser/src/parUtil.c +++ b/source/libs/parser/src/parUtil.c @@ -65,6 +65,8 @@ static char* getSyntaxErrFormat(int32_t errCode) { return "This statement is no longer supported"; case TSDB_CODE_PAR_INTER_VALUE_TOO_SMALL: return "Interval cannot be less than %d %s"; + case TSDB_CODE_PAR_INTER_VALUE_TOO_BIG: + return "Interval cannot be more than %d %s"; case TSDB_CODE_PAR_DB_NOT_SPECIFIED: return "Database not specified"; case TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME: diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 8a8ea0bee5..a4958c3e80 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -24,8 +24,9 @@ ** The following is the concatenation of all %include directives from the ** input grammar file: */ +#include +#include /************ Begin %include sections from the grammar ************************/ -#line 11 "sql.y" #include #include @@ -42,356 +43,12 @@ #include "parAst.h" #define YYSTACKDEPTH 0 -#line 46 "sql.c" /**************** End of %include directives **********************************/ -/* These constants specify the various numeric values for terminal symbols. -***************** Begin token definitions *************************************/ -#ifndef TK_OR -#define TK_OR 1 -#define TK_AND 2 -#define TK_UNION 3 -#define TK_ALL 4 -#define TK_MINUS 5 -#define TK_EXCEPT 6 -#define TK_INTERSECT 7 -#define TK_NK_BITAND 8 -#define TK_NK_BITOR 9 -#define TK_NK_LSHIFT 10 -#define TK_NK_RSHIFT 11 -#define TK_NK_PLUS 12 -#define TK_NK_MINUS 13 -#define TK_NK_STAR 14 -#define TK_NK_SLASH 15 -#define TK_NK_REM 16 -#define TK_NK_CONCAT 17 -#define TK_CREATE 18 -#define TK_ACCOUNT 19 -#define TK_NK_ID 20 -#define TK_PASS 21 -#define TK_NK_STRING 22 -#define TK_ALTER 23 -#define TK_PPS 24 -#define TK_TSERIES 25 -#define TK_STORAGE 26 -#define TK_STREAMS 27 -#define TK_QTIME 28 -#define TK_DBS 29 -#define TK_USERS 30 -#define TK_CONNS 31 -#define TK_STATE 32 -#define TK_NK_COMMA 33 -#define TK_HOST 34 -#define TK_USER 35 -#define TK_ENABLE 36 -#define TK_NK_INTEGER 37 -#define TK_SYSINFO 38 -#define TK_ADD 39 -#define TK_DROP 40 -#define TK_GRANT 41 -#define TK_ON 42 -#define TK_TO 43 -#define TK_REVOKE 44 -#define TK_FROM 45 -#define TK_SUBSCRIBE 46 -#define TK_READ 47 -#define TK_WRITE 48 -#define TK_NK_DOT 49 -#define TK_WITH 50 -#define TK_DNODE 51 -#define TK_PORT 52 -#define TK_DNODES 53 -#define TK_RESTORE 54 -#define TK_NK_IPTOKEN 55 -#define TK_FORCE 56 -#define TK_UNSAFE 57 -#define TK_LOCAL 58 -#define TK_QNODE 59 -#define TK_BNODE 60 -#define TK_SNODE 61 -#define TK_MNODE 62 -#define TK_VNODE 63 -#define TK_DATABASE 64 -#define TK_USE 65 -#define TK_FLUSH 66 -#define TK_TRIM 67 -#define TK_COMPACT 68 -#define TK_IF 69 -#define TK_NOT 70 -#define TK_EXISTS 71 -#define TK_BUFFER 72 -#define TK_CACHEMODEL 73 -#define TK_CACHESIZE 74 -#define TK_COMP 75 -#define TK_DURATION 76 -#define TK_NK_VARIABLE 77 -#define TK_MAXROWS 78 -#define TK_MINROWS 79 -#define TK_KEEP 80 -#define TK_PAGES 81 -#define TK_PAGESIZE 82 -#define TK_TSDB_PAGESIZE 83 -#define TK_PRECISION 84 -#define TK_REPLICA 85 -#define TK_VGROUPS 86 -#define TK_SINGLE_STABLE 87 -#define TK_RETENTIONS 88 -#define TK_SCHEMALESS 89 -#define TK_WAL_LEVEL 90 -#define TK_WAL_FSYNC_PERIOD 91 -#define TK_WAL_RETENTION_PERIOD 92 -#define TK_WAL_RETENTION_SIZE 93 -#define TK_WAL_ROLL_PERIOD 94 -#define TK_WAL_SEGMENT_SIZE 95 -#define TK_STT_TRIGGER 96 -#define TK_TABLE_PREFIX 97 -#define TK_TABLE_SUFFIX 98 -#define TK_KEEP_TIME_OFFSET 99 -#define TK_NK_COLON 100 -#define TK_BWLIMIT 101 -#define TK_START 102 -#define TK_TIMESTAMP 103 -#define TK_END 104 -#define TK_TABLE 105 -#define TK_NK_LP 106 -#define TK_NK_RP 107 -#define TK_STABLE 108 -#define TK_COLUMN 109 -#define TK_MODIFY 110 -#define TK_RENAME 111 -#define TK_TAG 112 -#define TK_SET 113 -#define TK_NK_EQ 114 -#define TK_USING 115 -#define TK_TAGS 116 -#define TK_BOOL 117 -#define TK_TINYINT 118 -#define TK_SMALLINT 119 -#define TK_INT 120 -#define TK_INTEGER 121 -#define TK_BIGINT 122 -#define TK_FLOAT 123 -#define TK_DOUBLE 124 -#define TK_BINARY 125 -#define TK_NCHAR 126 -#define TK_UNSIGNED 127 -#define TK_JSON 128 -#define TK_VARCHAR 129 -#define TK_MEDIUMBLOB 130 -#define TK_BLOB 131 -#define TK_VARBINARY 132 -#define TK_GEOMETRY 133 -#define TK_DECIMAL 134 -#define TK_COMMENT 135 -#define TK_MAX_DELAY 136 -#define TK_WATERMARK 137 -#define TK_ROLLUP 138 -#define TK_TTL 139 -#define TK_SMA 140 -#define TK_DELETE_MARK 141 -#define TK_FIRST 142 -#define TK_LAST 143 -#define TK_SHOW 144 -#define TK_PRIVILEGES 145 -#define TK_DATABASES 146 -#define TK_TABLES 147 -#define TK_STABLES 148 -#define TK_MNODES 149 -#define TK_QNODES 150 -#define TK_FUNCTIONS 151 -#define TK_INDEXES 152 -#define TK_ACCOUNTS 153 -#define TK_APPS 154 -#define TK_CONNECTIONS 155 -#define TK_LICENCES 156 -#define TK_GRANTS 157 -#define TK_QUERIES 158 -#define TK_SCORES 159 -#define TK_TOPICS 160 -#define TK_VARIABLES 161 -#define TK_CLUSTER 162 -#define TK_BNODES 163 -#define TK_SNODES 164 -#define TK_TRANSACTIONS 165 -#define TK_DISTRIBUTED 166 -#define TK_CONSUMERS 167 -#define TK_SUBSCRIPTIONS 168 -#define TK_VNODES 169 -#define TK_ALIVE 170 -#define TK_NORMAL 171 -#define TK_CHILD 172 -#define TK_LIKE 173 -#define TK_TBNAME 174 -#define TK_QTAGS 175 -#define TK_AS 176 -#define TK_SYSTEM 177 -#define TK_INDEX 178 -#define TK_FUNCTION 179 -#define TK_INTERVAL 180 -#define TK_COUNT 181 -#define TK_LAST_ROW 182 -#define TK_META 183 -#define TK_ONLY 184 -#define TK_TOPIC 185 -#define TK_CONSUMER 186 -#define TK_GROUP 187 -#define TK_DESC 188 -#define TK_DESCRIBE 189 -#define TK_RESET 190 -#define TK_QUERY 191 -#define TK_CACHE 192 -#define TK_EXPLAIN 193 -#define TK_ANALYZE 194 -#define TK_VERBOSE 195 -#define TK_NK_BOOL 196 -#define TK_RATIO 197 -#define TK_NK_FLOAT 198 -#define TK_OUTPUTTYPE 199 -#define TK_AGGREGATE 200 -#define TK_BUFSIZE 201 -#define TK_LANGUAGE 202 -#define TK_REPLACE 203 -#define TK_STREAM 204 -#define TK_INTO 205 -#define TK_PAUSE 206 -#define TK_RESUME 207 -#define TK_TRIGGER 208 -#define TK_AT_ONCE 209 -#define TK_WINDOW_CLOSE 210 -#define TK_IGNORE 211 -#define TK_EXPIRED 212 -#define TK_FILL_HISTORY 213 -#define TK_UPDATE 214 -#define TK_SUBTABLE 215 -#define TK_UNTREATED 216 -#define TK_KILL 217 -#define TK_CONNECTION 218 -#define TK_TRANSACTION 219 -#define TK_BALANCE 220 -#define TK_VGROUP 221 -#define TK_LEADER 222 -#define TK_MERGE 223 -#define TK_REDISTRIBUTE 224 -#define TK_SPLIT 225 -#define TK_DELETE 226 -#define TK_INSERT 227 -#define TK_NULL 228 -#define TK_NK_QUESTION 229 -#define TK_NK_ARROW 230 -#define TK_ROWTS 231 -#define TK_QSTART 232 -#define TK_QEND 233 -#define TK_QDURATION 234 -#define TK_WSTART 235 -#define TK_WEND 236 -#define TK_WDURATION 237 -#define TK_IROWTS 238 -#define TK_ISFILLED 239 -#define TK_CAST 240 -#define TK_NOW 241 -#define TK_TODAY 242 -#define TK_TIMEZONE 243 -#define TK_CLIENT_VERSION 244 -#define TK_SERVER_VERSION 245 -#define TK_SERVER_STATUS 246 -#define TK_CURRENT_USER 247 -#define TK_CASE 248 -#define TK_WHEN 249 -#define TK_THEN 250 -#define TK_ELSE 251 -#define TK_BETWEEN 252 -#define TK_IS 253 -#define TK_NK_LT 254 -#define TK_NK_GT 255 -#define TK_NK_LE 256 -#define TK_NK_GE 257 -#define TK_NK_NE 258 -#define TK_MATCH 259 -#define TK_NMATCH 260 -#define TK_CONTAINS 261 -#define TK_IN 262 -#define TK_JOIN 263 -#define TK_INNER 264 -#define TK_SELECT 265 -#define TK_NK_HINT 266 -#define TK_DISTINCT 267 -#define TK_WHERE 268 -#define TK_PARTITION 269 -#define TK_BY 270 -#define TK_SESSION 271 -#define TK_STATE_WINDOW 272 -#define TK_EVENT_WINDOW 273 -#define TK_SLIDING 274 -#define TK_FILL 275 -#define TK_VALUE 276 -#define TK_VALUE_F 277 -#define TK_NONE 278 -#define TK_PREV 279 -#define TK_NULL_F 280 -#define TK_LINEAR 281 -#define TK_NEXT 282 -#define TK_HAVING 283 -#define TK_RANGE 284 -#define TK_EVERY 285 -#define TK_ORDER 286 -#define TK_SLIMIT 287 -#define TK_SOFFSET 288 -#define TK_LIMIT 289 -#define TK_OFFSET 290 -#define TK_ASC 291 -#define TK_NULLS 292 -#define TK_ABORT 293 -#define TK_AFTER 294 -#define TK_ATTACH 295 -#define TK_BEFORE 296 -#define TK_BEGIN 297 -#define TK_BITAND 298 -#define TK_BITNOT 299 -#define TK_BITOR 300 -#define TK_BLOCKS 301 -#define TK_CHANGE 302 -#define TK_COMMA 303 -#define TK_CONCAT 304 -#define TK_CONFLICT 305 -#define TK_COPY 306 -#define TK_DEFERRED 307 -#define TK_DELIMITERS 308 -#define TK_DETACH 309 -#define TK_DIVIDE 310 -#define TK_DOT 311 -#define TK_EACH 312 -#define TK_FAIL 313 -#define TK_FILE 314 -#define TK_FOR 315 -#define TK_GLOB 316 -#define TK_ID 317 -#define TK_IMMEDIATE 318 -#define TK_IMPORT 319 -#define TK_INITIALLY 320 -#define TK_INSTEAD 321 -#define TK_ISNULL 322 -#define TK_KEY 323 -#define TK_MODULES 324 -#define TK_NK_BITNOT 325 -#define TK_NK_SEMI 326 -#define TK_NOTNULL 327 -#define TK_OF 328 -#define TK_PLUS 329 -#define TK_PRIVILEGE 330 -#define TK_RAISE 331 -#define TK_RESTRICT 332 -#define TK_ROW 333 -#define TK_SEMI 334 -#define TK_STAR 335 -#define TK_STATEMENT 336 -#define TK_STRICT 337 -#define TK_STRING 338 -#define TK_TIMES 339 -#define TK_VALUES 340 -#define TK_VARIABLE 341 -#define TK_VIEW 342 -#define TK_WAL 343 -#endif -/**************** End token definitions ***************************************/ +/* These constants specify the various numeric values for terminal symbols +** in a format understandable to "makeheaders". This section is blank unless +** "lemon" is run with the "-m" command-line option. +***************** Begin makeheaders token definitions *************************/ +/**************** End makeheaders token definitions ***************************/ /* The next sections is a series of control #defines. ** various aspects of the generated parser. @@ -449,29 +106,29 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 503 +#define YYNOCODE 504 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - SNodeList* yy20; - int32_t yy114; - STokenPair yy157; - SNode* yy342; - EOperatorType yy356; - EJoinType yy392; - SToken yy479; - int8_t yy541; - EShowKind yy545; - EFillMode yy590; - EOrder yy592; - int64_t yy669; - ENullOrder yy689; - SShowTablesOption yy711; - SDataType yy750; - bool yy829; - SAlterOption yy857; + EShowKind yy33; + EJoinType yy36; + SNode* yy56; + SShowTablesOption yy205; + int8_t yy215; + int64_t yy333; + ENullOrder yy361; + EOperatorType yy380; + bool yy425; + SDataType yy448; + int32_t yy676; + SNodeList* yy712; + EOrder yy722; + EFillMode yy774; + STokenPair yy777; + SToken yy785; + SAlterOption yy893; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -487,18 +144,18 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 820 -#define YYNRULE 627 -#define YYNRULE_WITH_ACTION 627 -#define YYNTOKEN 344 -#define YY_MAX_SHIFT 819 -#define YY_MIN_SHIFTREDUCE 1214 -#define YY_MAX_SHIFTREDUCE 1840 -#define YY_ERROR_ACTION 1841 -#define YY_ACCEPT_ACTION 1842 -#define YY_NO_ACTION 1843 -#define YY_MIN_REDUCE 1844 -#define YY_MAX_REDUCE 2470 +#define YYNSTATE 822 +#define YYNRULE 631 +#define YYNRULE_WITH_ACTION 631 +#define YYNTOKEN 345 +#define YY_MAX_SHIFT 821 +#define YY_MIN_SHIFTREDUCE 1220 +#define YY_MAX_SHIFTREDUCE 1850 +#define YY_ERROR_ACTION 1851 +#define YY_ACCEPT_ACTION 1852 +#define YY_NO_ACTION 1853 +#define YY_MIN_REDUCE 1854 +#define YY_MAX_REDUCE 2484 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -565,898 +222,985 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (3215) +#define YY_ACTTAB_COUNT (3640) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 2019, 707, 2030, 674, 2015, 2446, 2441, 548, 2441, 169, - /* 10 */ 549, 1887, 48, 46, 1764, 463, 2446, 1970, 412, 2441, - /* 20 */ 409, 133, 1609, 1845, 673, 193, 164, 2445, 590, 2442, - /* 30 */ 675, 2442, 2444, 391, 2032, 1690, 1927, 1607, 2445, 38, - /* 40 */ 313, 2081, 2442, 2443, 123, 91, 2274, 122, 121, 120, - /* 50 */ 119, 118, 117, 116, 115, 114, 686, 142, 1634, 689, - /* 60 */ 515, 513, 379, 361, 1685, 1844, 553, 207, 706, 1634, - /* 70 */ 19, 2025, 550, 1842, 2252, 123, 706, 1615, 122, 121, - /* 80 */ 120, 119, 118, 117, 116, 115, 114, 2292, 2021, 132, - /* 90 */ 131, 130, 129, 128, 127, 126, 125, 124, 2256, 2242, - /* 100 */ 706, 723, 1279, 816, 1278, 167, 15, 1867, 791, 790, - /* 110 */ 789, 788, 421, 2033, 787, 786, 146, 781, 780, 779, - /* 120 */ 778, 777, 776, 775, 158, 771, 770, 769, 420, 419, - /* 130 */ 766, 765, 764, 177, 176, 763, 567, 1280, 2273, 1634, - /* 140 */ 2258, 2309, 1692, 1693, 110, 2275, 727, 2277, 2278, 722, - /* 150 */ 717, 717, 424, 1279, 51, 1278, 190, 423, 2362, 67, - /* 160 */ 2242, 2161, 405, 2358, 293, 2370, 685, 62, 134, 684, - /* 170 */ 138, 2441, 707, 2030, 1665, 1675, 402, 195, 2205, 2158, - /* 180 */ 694, 1691, 1694, 1635, 2006, 2392, 51, 228, 1280, 673, - /* 190 */ 193, 551, 133, 1894, 2442, 675, 1610, 594, 1608, 595, - /* 200 */ 649, 593, 509, 2441, 556, 41, 40, 549, 1887, 47, - /* 210 */ 45, 44, 43, 42, 760, 156, 155, 757, 756, 755, - /* 220 */ 153, 2447, 193, 1513, 1514, 62, 2442, 675, 1613, 1614, - /* 230 */ 264, 1664, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, - /* 240 */ 719, 715, 1683, 1684, 1686, 1687, 1688, 1689, 2, 48, - /* 250 */ 46, 2161, 1635, 762, 360, 2274, 1632, 409, 2446, 1609, - /* 260 */ 170, 62, 1856, 500, 218, 52, 518, 369, 724, 2159, - /* 270 */ 694, 517, 1690, 186, 1607, 1636, 41, 40, 707, 2030, - /* 280 */ 47, 45, 44, 43, 42, 2252, 508, 483, 1637, 519, - /* 290 */ 469, 2137, 545, 1914, 485, 377, 2292, 2141, 198, 2261, - /* 300 */ 543, 1685, 1414, 539, 535, 1533, 1534, 19, 2242, 2256, - /* 310 */ 723, 1719, 564, 297, 1615, 610, 1405, 752, 751, 750, - /* 320 */ 1409, 749, 1411, 1412, 748, 745, 297, 1420, 742, 1422, - /* 330 */ 1423, 739, 736, 733, 47, 45, 44, 43, 42, 209, - /* 340 */ 816, 378, 230, 15, 1532, 1535, 551, 2273, 1894, 664, - /* 350 */ 2309, 2258, 471, 110, 2275, 727, 2277, 2278, 722, 1721, - /* 360 */ 717, 717, 1830, 145, 714, 151, 2333, 2362, 565, 2154, - /* 370 */ 1720, 405, 2358, 414, 1449, 1450, 2076, 2078, 186, 1692, - /* 380 */ 1693, 563, 2148, 2127, 297, 507, 506, 505, 504, 499, - /* 390 */ 498, 497, 496, 495, 491, 490, 489, 488, 359, 480, - /* 400 */ 479, 478, 2142, 473, 472, 376, 2377, 1501, 1502, 1768, - /* 410 */ 2226, 1665, 1675, 1520, 62, 1634, 707, 2030, 1691, 1694, - /* 420 */ 297, 41, 40, 2252, 297, 47, 45, 44, 43, 42, - /* 430 */ 107, 295, 2374, 1610, 1930, 1608, 56, 2260, 35, 104, - /* 440 */ 670, 665, 658, 1866, 276, 625, 30, 2256, 1726, 37, - /* 450 */ 407, 1714, 1715, 1716, 1717, 1718, 1722, 1723, 1724, 1725, - /* 460 */ 623, 431, 621, 259, 258, 1613, 1614, 2124, 1664, 1667, - /* 470 */ 1668, 1669, 1670, 1671, 1672, 1673, 1674, 719, 715, 1683, - /* 480 */ 1684, 1686, 1687, 1688, 1689, 2, 12, 48, 46, 2258, - /* 490 */ 406, 2274, 418, 417, 1254, 409, 2242, 1609, 1636, 717, - /* 500 */ 1865, 707, 2030, 454, 689, 453, 609, 608, 607, 467, - /* 510 */ 1690, 1864, 1607, 599, 139, 603, 2083, 1616, 669, 602, - /* 520 */ 1807, 460, 1711, 375, 601, 606, 385, 384, 1700, 762, - /* 530 */ 600, 2081, 2292, 596, 1634, 452, 1256, 1259, 1260, 1685, - /* 540 */ 1358, 609, 608, 607, 2242, 19, 723, 444, 599, 139, - /* 550 */ 603, 668, 1615, 2242, 602, 686, 142, 2077, 2078, 601, - /* 560 */ 606, 385, 384, 1863, 2242, 600, 475, 2137, 596, 1666, - /* 570 */ 2083, 456, 1609, 297, 446, 442, 455, 390, 816, 2292, - /* 580 */ 1360, 15, 2274, 2273, 262, 2081, 2309, 1607, 261, 110, - /* 590 */ 2275, 727, 2277, 2278, 722, 724, 717, 1896, 12, 674, - /* 600 */ 10, 190, 2441, 2362, 634, 41, 40, 405, 2358, 47, - /* 610 */ 45, 44, 43, 42, 12, 212, 2242, 1692, 1693, 649, - /* 620 */ 673, 193, 2441, 2292, 1787, 2442, 675, 1615, 707, 2030, - /* 630 */ 2393, 707, 2030, 14, 13, 2242, 102, 723, 667, 1788, - /* 640 */ 2447, 193, 502, 2137, 2083, 2442, 675, 1862, 461, 1665, - /* 650 */ 1675, 477, 94, 816, 295, 364, 1691, 1694, 389, 693, - /* 660 */ 627, 2023, 688, 191, 2370, 2371, 2007, 140, 2375, 707, - /* 670 */ 2030, 1610, 144, 1608, 2273, 2333, 1861, 2309, 1619, 1786, - /* 680 */ 110, 2275, 727, 2277, 2278, 722, 2083, 717, 1666, 492, - /* 690 */ 2083, 217, 2461, 399, 2362, 1282, 1283, 404, 405, 2358, - /* 700 */ 2242, 2081, 1795, 1613, 1614, 2081, 1664, 1667, 1668, 1669, - /* 710 */ 1670, 1671, 1672, 1673, 1674, 719, 715, 1683, 1684, 1686, - /* 720 */ 1687, 1688, 1689, 2, 48, 46, 1695, 2274, 403, 2242, - /* 730 */ 614, 189, 409, 648, 1609, 1615, 167, 707, 2030, 1733, - /* 740 */ 724, 2005, 2400, 2070, 2032, 626, 1610, 1690, 1608, 1607, - /* 750 */ 661, 660, 1793, 1794, 1796, 1797, 1798, 493, 41, 40, - /* 760 */ 91, 260, 47, 45, 44, 43, 42, 412, 2292, 773, - /* 770 */ 214, 44, 43, 42, 319, 167, 1685, 617, 1613, 1614, - /* 780 */ 2242, 34, 723, 2032, 611, 1837, 2026, 41, 40, 1615, - /* 790 */ 257, 47, 45, 44, 43, 42, 108, 2274, 2377, 586, - /* 800 */ 585, 760, 156, 155, 757, 756, 755, 153, 588, 587, - /* 810 */ 724, 87, 2413, 143, 86, 816, 707, 2030, 49, 2273, - /* 820 */ 2274, 2022, 2309, 753, 2373, 110, 2275, 727, 2277, 2278, - /* 830 */ 722, 71, 717, 724, 70, 656, 566, 2461, 2292, 2362, - /* 840 */ 1637, 41, 40, 405, 2358, 47, 45, 44, 43, 42, - /* 850 */ 2242, 2083, 723, 263, 1692, 1693, 1262, 1806, 413, 60, - /* 860 */ 2114, 2292, 1633, 1860, 41, 40, 2081, 646, 47, 45, - /* 870 */ 44, 43, 42, 2242, 2017, 723, 760, 156, 155, 757, - /* 880 */ 756, 755, 153, 707, 2030, 75, 1665, 1675, 1836, 2273, - /* 890 */ 1897, 1369, 2309, 1691, 1694, 110, 2275, 727, 2277, 2278, - /* 900 */ 722, 2013, 717, 2027, 605, 604, 1368, 2461, 1610, 2362, - /* 910 */ 1608, 1859, 2273, 405, 2358, 2309, 2242, 1858, 110, 2275, - /* 920 */ 727, 2277, 2278, 722, 1855, 717, 1578, 1579, 2235, 2445, - /* 930 */ 2461, 2034, 2362, 383, 382, 85, 405, 2358, 686, 142, - /* 940 */ 1613, 1614, 809, 1664, 1667, 1668, 1669, 1670, 1671, 1672, - /* 950 */ 1673, 1674, 719, 715, 1683, 1684, 1686, 1687, 1688, 1689, - /* 960 */ 2, 48, 46, 1780, 2242, 2274, 2236, 1761, 632, 409, - /* 970 */ 2242, 1609, 520, 2377, 415, 1854, 649, 2242, 724, 2441, - /* 980 */ 2434, 36, 167, 709, 1690, 2334, 1607, 41, 40, 9, - /* 990 */ 2032, 47, 45, 44, 43, 42, 210, 2447, 193, 2372, - /* 1000 */ 1853, 678, 2442, 675, 381, 380, 2292, 592, 1637, 166, - /* 1010 */ 690, 707, 2030, 1685, 649, 3, 649, 2441, 2242, 2441, - /* 1020 */ 723, 487, 785, 783, 686, 142, 1615, 54, 2242, 594, - /* 1030 */ 486, 265, 711, 593, 2334, 2447, 193, 2447, 193, 1373, - /* 1040 */ 2442, 675, 2442, 675, 304, 305, 192, 2370, 2371, 303, - /* 1050 */ 140, 2375, 816, 2242, 1372, 49, 2274, 2273, 649, 754, - /* 1060 */ 2309, 2441, 2074, 110, 2275, 727, 2277, 2278, 722, 724, - /* 1070 */ 717, 2381, 1852, 707, 2030, 2461, 1851, 2362, 1634, 2447, - /* 1080 */ 193, 405, 2358, 269, 2442, 675, 707, 2030, 2083, 2083, - /* 1090 */ 272, 1692, 1693, 273, 41, 40, 1850, 2292, 47, 45, - /* 1100 */ 44, 43, 42, 702, 2082, 135, 692, 707, 2030, 2242, - /* 1110 */ 1849, 723, 1848, 2008, 1847, 707, 2030, 84, 707, 2030, - /* 1120 */ 522, 707, 2030, 1665, 1675, 2242, 2223, 308, 597, 2242, - /* 1130 */ 1691, 1694, 194, 2370, 2371, 704, 140, 2375, 705, 1872, - /* 1140 */ 811, 314, 707, 2030, 154, 1610, 147, 1608, 2273, 2242, - /* 1150 */ 758, 2309, 1355, 2074, 110, 2275, 727, 2277, 2278, 722, - /* 1160 */ 154, 717, 416, 2242, 275, 2242, 2461, 2242, 2362, 1259, - /* 1170 */ 1260, 759, 405, 2358, 2074, 154, 328, 1613, 1614, 2060, - /* 1180 */ 1664, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 719, - /* 1190 */ 715, 1683, 1684, 1686, 1687, 1688, 1689, 2, 48, 46, - /* 1200 */ 774, 598, 2274, 1992, 2382, 1753, 409, 250, 1609, 1905, - /* 1210 */ 248, 1753, 677, 252, 254, 724, 251, 253, 55, 256, - /* 1220 */ 1903, 1690, 255, 1607, 629, 1353, 628, 274, 681, 2263, - /* 1230 */ 1760, 612, 1666, 1313, 1573, 2274, 50, 50, 1618, 178, - /* 1240 */ 767, 154, 615, 2292, 1839, 1840, 50, 302, 721, 1576, - /* 1250 */ 1685, 72, 152, 14, 13, 2242, 679, 723, 154, 718, - /* 1260 */ 1971, 1857, 2406, 1615, 1332, 290, 662, 768, 137, 65, - /* 1270 */ 50, 95, 1968, 1314, 284, 50, 2292, 731, 1967, 152, - /* 1280 */ 154, 136, 152, 659, 392, 395, 2265, 1617, 2242, 816, - /* 1290 */ 723, 1330, 15, 666, 2273, 2293, 696, 2309, 422, 2146, - /* 1300 */ 110, 2275, 727, 2277, 2278, 722, 1888, 717, 2071, 687, - /* 1310 */ 1792, 1791, 2337, 281, 2362, 691, 1893, 2396, 405, 2358, - /* 1320 */ 1530, 306, 292, 289, 296, 699, 310, 2273, 1692, 1693, - /* 1330 */ 2309, 5, 1399, 350, 2275, 727, 2277, 2278, 722, 720, - /* 1340 */ 717, 708, 2327, 1727, 1676, 425, 430, 168, 200, 327, - /* 1350 */ 438, 1427, 335, 1431, 1438, 1436, 157, 373, 439, 1640, - /* 1360 */ 1665, 1675, 448, 447, 202, 201, 450, 1691, 1694, 332, - /* 1370 */ 74, 204, 1554, 73, 1632, 464, 322, 1633, 468, 216, - /* 1380 */ 470, 1637, 1610, 357, 1608, 2147, 474, 476, 511, 481, - /* 1390 */ 494, 510, 501, 2139, 226, 530, 528, 525, 503, 1621, - /* 1400 */ 512, 523, 524, 521, 220, 221, 526, 527, 223, 529, - /* 1410 */ 531, 1638, 546, 4, 1613, 1614, 554, 1664, 1667, 1668, - /* 1420 */ 1669, 1670, 1671, 1672, 1673, 1674, 719, 715, 1683, 1684, - /* 1430 */ 1686, 1687, 1688, 1689, 2, 62, 418, 417, 547, 555, - /* 1440 */ 557, 231, 1635, 558, 233, 1639, 1623, 1641, 1620, 559, - /* 1450 */ 560, 562, 236, 238, 1642, 2155, 568, 89, 589, 1690, - /* 1460 */ 90, 1616, 243, 591, 618, 2020, 247, 2016, 249, 160, - /* 1470 */ 619, 2274, 631, 63, 2214, 161, 112, 354, 93, 2018, - /* 1480 */ 633, 2014, 148, 162, 724, 682, 323, 163, 1685, 266, - /* 1490 */ 637, 638, 636, 268, 270, 642, 2211, 644, 1561, 663, - /* 1500 */ 2210, 1615, 2412, 641, 697, 2411, 8, 2274, 672, 653, - /* 1510 */ 285, 283, 2292, 2384, 654, 652, 2397, 82, 81, 459, - /* 1520 */ 724, 2407, 206, 287, 2242, 286, 723, 713, 651, 1753, - /* 1530 */ 278, 643, 396, 141, 280, 451, 449, 175, 2274, 1636, - /* 1540 */ 2464, 1756, 288, 291, 683, 680, 358, 1758, 2292, 440, - /* 1550 */ 2440, 724, 437, 433, 429, 426, 452, 324, 182, 298, - /* 1560 */ 2242, 695, 723, 2273, 149, 2378, 2309, 2169, 2168, 110, - /* 1570 */ 2275, 727, 2277, 2278, 722, 2167, 717, 325, 700, 2292, - /* 1580 */ 701, 2335, 401, 2362, 326, 61, 103, 405, 2358, 2075, - /* 1590 */ 1993, 2242, 150, 723, 297, 2031, 1, 2343, 101, 2273, - /* 1600 */ 329, 1238, 2309, 2274, 196, 110, 2275, 727, 2277, 2278, - /* 1610 */ 722, 317, 717, 729, 810, 813, 724, 710, 353, 2362, - /* 1620 */ 1624, 159, 1619, 405, 2358, 815, 53, 333, 331, 365, - /* 1630 */ 2273, 2234, 2233, 2309, 2232, 366, 111, 2275, 727, 2277, - /* 1640 */ 2278, 722, 338, 717, 2292, 352, 342, 79, 2227, 427, - /* 1650 */ 2362, 428, 1627, 1629, 2361, 2358, 2242, 1600, 723, 1601, - /* 1660 */ 199, 432, 2225, 434, 435, 715, 1683, 1684, 1686, 1687, - /* 1670 */ 1688, 1689, 436, 1599, 2224, 374, 2222, 2274, 441, 2221, - /* 1680 */ 443, 2220, 445, 1589, 2201, 203, 2200, 205, 1557, 80, - /* 1690 */ 724, 1556, 2182, 2181, 2180, 2273, 457, 458, 2309, 2179, - /* 1700 */ 2274, 111, 2275, 727, 2277, 2278, 722, 2178, 717, 2129, - /* 1710 */ 462, 2123, 1500, 724, 465, 2362, 466, 2120, 2292, 712, - /* 1720 */ 2358, 208, 2119, 83, 2118, 2117, 2122, 2121, 2116, 211, - /* 1730 */ 2242, 213, 723, 2115, 2113, 2112, 2111, 482, 2110, 484, - /* 1740 */ 2126, 2292, 2109, 2108, 2107, 2106, 2105, 2104, 2103, 2102, - /* 1750 */ 2101, 2100, 2099, 2242, 2098, 723, 2097, 2096, 2095, 215, - /* 1760 */ 2094, 2093, 2092, 88, 2091, 2125, 2090, 2089, 2274, 725, - /* 1770 */ 2088, 219, 2309, 2087, 514, 111, 2275, 727, 2277, 2278, - /* 1780 */ 722, 724, 717, 2274, 2086, 1506, 2085, 516, 2084, 2362, - /* 1790 */ 1370, 362, 2273, 368, 2358, 2309, 724, 1374, 171, 2275, - /* 1800 */ 727, 2277, 2278, 722, 1933, 717, 1932, 1931, 1366, 2292, - /* 1810 */ 1929, 1926, 1925, 532, 534, 1918, 1907, 222, 536, 363, - /* 1820 */ 540, 2242, 1883, 723, 2292, 533, 544, 538, 245, 542, - /* 1830 */ 187, 537, 1261, 541, 77, 227, 2242, 1882, 723, 2199, - /* 1840 */ 650, 2403, 224, 225, 174, 2262, 229, 188, 552, 2274, - /* 1850 */ 78, 2189, 584, 580, 576, 572, 2177, 244, 237, 235, - /* 1860 */ 2273, 2176, 724, 2309, 2153, 2009, 172, 2275, 727, 2277, - /* 1870 */ 2278, 722, 240, 717, 1928, 2273, 1306, 1924, 2309, 569, - /* 1880 */ 570, 111, 2275, 727, 2277, 2278, 722, 571, 717, 1922, - /* 1890 */ 2292, 573, 574, 1920, 575, 2362, 577, 578, 92, 579, - /* 1900 */ 2359, 242, 2242, 1917, 723, 581, 582, 1902, 583, 1900, - /* 1910 */ 1901, 1899, 1879, 2011, 2274, 64, 1443, 1442, 2010, 1357, - /* 1920 */ 676, 2462, 1356, 1354, 1352, 246, 1343, 724, 1351, 2274, - /* 1930 */ 1915, 1350, 782, 1349, 1348, 784, 386, 1345, 1344, 1906, - /* 1940 */ 1904, 2273, 724, 1342, 2309, 387, 388, 171, 2275, 727, - /* 1950 */ 2277, 2278, 722, 616, 717, 2292, 1878, 1877, 613, 1876, - /* 1960 */ 393, 1875, 620, 622, 1874, 624, 113, 2242, 1583, 723, - /* 1970 */ 2292, 241, 234, 1585, 1582, 394, 1587, 29, 239, 561, - /* 1980 */ 2198, 68, 2242, 2188, 723, 2274, 1563, 1565, 639, 2175, - /* 1990 */ 2404, 2174, 645, 271, 1567, 57, 640, 232, 724, 165, - /* 2000 */ 2446, 1542, 1541, 20, 647, 1809, 2273, 17, 6, 2309, - /* 2010 */ 7, 21, 351, 2275, 727, 2277, 2278, 722, 22, 717, - /* 2020 */ 180, 2273, 657, 31, 2309, 277, 2292, 351, 2275, 727, - /* 2030 */ 2277, 2278, 722, 655, 717, 279, 33, 282, 2242, 1790, - /* 2040 */ 723, 173, 2263, 66, 179, 24, 1824, 32, 2274, 1779, - /* 2050 */ 96, 1823, 1829, 397, 1830, 1828, 1827, 398, 1750, 1749, - /* 2060 */ 294, 724, 59, 2274, 181, 23, 2173, 2152, 97, 98, - /* 2070 */ 301, 2151, 18, 25, 99, 1785, 724, 2273, 2274, 183, - /* 2080 */ 2309, 307, 69, 344, 2275, 727, 2277, 2278, 722, 2292, - /* 2090 */ 717, 721, 104, 58, 312, 13, 100, 26, 1702, 309, - /* 2100 */ 11, 2242, 698, 723, 2292, 1701, 1625, 1680, 1712, 400, - /* 2110 */ 2312, 716, 184, 1678, 39, 728, 2242, 1677, 723, 2292, - /* 2120 */ 1649, 197, 1657, 16, 730, 411, 734, 27, 28, 671, - /* 2130 */ 1428, 2242, 732, 723, 737, 1425, 735, 738, 726, 740, - /* 2140 */ 2273, 2274, 1424, 2309, 1421, 741, 172, 2275, 727, 2277, - /* 2150 */ 2278, 722, 743, 717, 724, 2273, 1415, 744, 2309, 1413, - /* 2160 */ 746, 351, 2275, 727, 2277, 2278, 722, 747, 717, 1419, - /* 2170 */ 2273, 2274, 315, 2309, 1418, 1417, 350, 2275, 727, 2277, - /* 2180 */ 2278, 722, 2292, 717, 724, 2328, 1416, 408, 105, 106, - /* 2190 */ 1437, 76, 1433, 1304, 2242, 761, 723, 1339, 635, 1336, - /* 2200 */ 1335, 2463, 1334, 1333, 1331, 1329, 1328, 1364, 1327, 772, - /* 2210 */ 316, 1325, 2292, 1324, 1322, 1323, 819, 410, 1321, 1320, - /* 2220 */ 1319, 1361, 1310, 1359, 2242, 1316, 723, 1315, 1312, 1923, - /* 2230 */ 1311, 1309, 321, 2273, 1921, 792, 2309, 794, 793, 351, - /* 2240 */ 2275, 727, 2277, 2278, 722, 796, 717, 797, 185, 798, - /* 2250 */ 1919, 800, 801, 802, 1916, 805, 807, 803, 799, 795, - /* 2260 */ 804, 318, 2274, 2273, 806, 1898, 2309, 808, 1251, 351, - /* 2270 */ 2275, 727, 2277, 2278, 722, 724, 717, 1873, 1239, 812, - /* 2280 */ 320, 814, 1843, 1611, 330, 817, 818, 1843, 1843, 1843, - /* 2290 */ 1843, 1843, 1843, 1843, 1843, 2274, 1843, 1843, 1843, 1843, - /* 2300 */ 1843, 1843, 109, 2292, 1843, 311, 1843, 1843, 724, 1843, - /* 2310 */ 1843, 1843, 1843, 1843, 1843, 2242, 1843, 723, 2274, 1843, - /* 2320 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2330 */ 1843, 724, 1843, 2274, 1843, 1843, 2292, 703, 1843, 1843, - /* 2340 */ 1843, 1843, 1843, 1843, 1843, 1843, 724, 1843, 2242, 1843, - /* 2350 */ 723, 1843, 1843, 1843, 630, 1843, 1843, 2309, 1843, 2292, - /* 2360 */ 346, 2275, 727, 2277, 2278, 722, 1843, 717, 1843, 1843, - /* 2370 */ 1843, 2242, 1843, 723, 2292, 300, 1843, 1843, 1843, 1843, - /* 2380 */ 1843, 1843, 299, 1843, 1843, 1843, 2242, 2273, 723, 1843, - /* 2390 */ 2309, 1843, 1843, 336, 2275, 727, 2277, 2278, 722, 1843, - /* 2400 */ 717, 267, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2274, - /* 2410 */ 2273, 1843, 1843, 2309, 1843, 1843, 334, 2275, 727, 2277, - /* 2420 */ 2278, 722, 724, 717, 2274, 2273, 1843, 1843, 2309, 1843, - /* 2430 */ 1843, 337, 2275, 727, 2277, 2278, 722, 724, 717, 2274, - /* 2440 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2450 */ 2292, 1843, 724, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2460 */ 1843, 1843, 2242, 1843, 723, 2292, 1843, 1843, 1843, 1843, - /* 2470 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2242, 1843, 723, - /* 2480 */ 2292, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2490 */ 1843, 1843, 2242, 1843, 723, 1843, 1843, 1843, 1843, 1843, - /* 2500 */ 1843, 2273, 2274, 1843, 2309, 1843, 1843, 343, 2275, 727, - /* 2510 */ 2277, 2278, 722, 1843, 717, 724, 2273, 1843, 1843, 2309, - /* 2520 */ 1843, 1843, 347, 2275, 727, 2277, 2278, 722, 1843, 717, - /* 2530 */ 1843, 2273, 2274, 1843, 2309, 1843, 1843, 339, 2275, 727, - /* 2540 */ 2277, 2278, 722, 2292, 717, 724, 1843, 1843, 1843, 1843, - /* 2550 */ 1843, 1843, 1843, 1843, 1843, 2242, 1843, 723, 1843, 1843, - /* 2560 */ 1843, 1843, 1843, 1843, 1843, 2274, 1843, 1843, 1843, 1843, - /* 2570 */ 1843, 1843, 1843, 2292, 1843, 1843, 1843, 1843, 724, 1843, - /* 2580 */ 1843, 1843, 1843, 1843, 1843, 2242, 1843, 723, 1843, 1843, - /* 2590 */ 1843, 1843, 1843, 1843, 2273, 1843, 1843, 2309, 1843, 1843, - /* 2600 */ 348, 2275, 727, 2277, 2278, 722, 2292, 717, 1843, 1843, - /* 2610 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2242, 1843, - /* 2620 */ 723, 1843, 1843, 1843, 2273, 1843, 1843, 2309, 1843, 1843, - /* 2630 */ 340, 2275, 727, 2277, 2278, 722, 1843, 717, 1843, 1843, - /* 2640 */ 1843, 1843, 1843, 2274, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2650 */ 1843, 1843, 1843, 1843, 1843, 1843, 724, 2273, 1843, 1843, - /* 2660 */ 2309, 1843, 1843, 349, 2275, 727, 2277, 2278, 722, 1843, - /* 2670 */ 717, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2274, - /* 2680 */ 1843, 1843, 1843, 1843, 2292, 1843, 1843, 1843, 1843, 1843, - /* 2690 */ 1843, 1843, 724, 1843, 1843, 1843, 2242, 1843, 723, 1843, - /* 2700 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2274, 1843, - /* 2710 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2720 */ 2292, 724, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2730 */ 1843, 1843, 2242, 1843, 723, 2273, 1843, 1843, 2309, 1843, - /* 2740 */ 1843, 341, 2275, 727, 2277, 2278, 722, 1843, 717, 2292, - /* 2750 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2760 */ 1843, 2242, 1843, 723, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2770 */ 1843, 2273, 1843, 2274, 2309, 1843, 1843, 355, 2275, 727, - /* 2780 */ 2277, 2278, 722, 1843, 717, 1843, 724, 1843, 1843, 1843, - /* 2790 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2800 */ 2273, 1843, 1843, 2309, 1843, 1843, 356, 2275, 727, 2277, - /* 2810 */ 2278, 722, 1843, 717, 2292, 1843, 1843, 1843, 1843, 1843, - /* 2820 */ 1843, 1843, 1843, 1843, 1843, 1843, 2242, 1843, 723, 1843, - /* 2830 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2840 */ 2274, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2850 */ 1843, 1843, 1843, 724, 1843, 1843, 2274, 1843, 1843, 1843, - /* 2860 */ 1843, 1843, 1843, 1843, 1843, 2273, 1843, 1843, 2309, 724, - /* 2870 */ 1843, 2286, 2275, 727, 2277, 2278, 722, 1843, 717, 1843, - /* 2880 */ 1843, 2292, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2890 */ 1843, 1843, 1843, 2242, 1843, 723, 1843, 2292, 1843, 1843, - /* 2900 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2242, - /* 2910 */ 1843, 723, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2920 */ 1843, 2274, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2930 */ 1843, 1843, 2273, 1843, 724, 2309, 1843, 1843, 2285, 2275, - /* 2940 */ 727, 2277, 2278, 722, 1843, 717, 1843, 1843, 2273, 1843, - /* 2950 */ 2274, 2309, 1843, 1843, 2284, 2275, 727, 2277, 2278, 722, - /* 2960 */ 1843, 717, 2292, 724, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2970 */ 1843, 1843, 1843, 1843, 2242, 1843, 723, 1843, 1843, 1843, - /* 2980 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 2990 */ 1843, 2292, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 3000 */ 1843, 1843, 1843, 2242, 1843, 723, 1843, 1843, 1843, 1843, - /* 3010 */ 1843, 1843, 1843, 2273, 1843, 2274, 2309, 1843, 1843, 370, - /* 3020 */ 2275, 727, 2277, 2278, 722, 1843, 717, 1843, 724, 1843, - /* 3030 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 3040 */ 1843, 1843, 2273, 1843, 2274, 2309, 1843, 1843, 371, 2275, - /* 3050 */ 727, 2277, 2278, 722, 1843, 717, 2292, 724, 1843, 1843, - /* 3060 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2242, 1843, - /* 3070 */ 723, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 3080 */ 2274, 1843, 1843, 1843, 1843, 2292, 1843, 1843, 1843, 1843, - /* 3090 */ 1843, 1843, 1843, 724, 1843, 1843, 1843, 2242, 1843, 723, - /* 3100 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 2273, 1843, 2274, - /* 3110 */ 2309, 1843, 1843, 367, 2275, 727, 2277, 2278, 722, 1843, - /* 3120 */ 717, 2292, 724, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 3130 */ 1843, 1843, 1843, 2242, 1843, 723, 2273, 1843, 1843, 2309, - /* 3140 */ 1843, 1843, 372, 2275, 727, 2277, 2278, 722, 1843, 717, - /* 3150 */ 2292, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 3160 */ 1843, 1843, 2242, 1843, 723, 1843, 1843, 1843, 1843, 1843, - /* 3170 */ 1843, 1843, 725, 1843, 1843, 2309, 1843, 1843, 346, 2275, - /* 3180 */ 727, 2277, 2278, 722, 1843, 717, 1843, 1843, 1843, 1843, - /* 3190 */ 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, - /* 3200 */ 1843, 2273, 1843, 1843, 2309, 1843, 1843, 345, 2275, 727, - /* 3210 */ 2277, 2278, 722, 1843, 717, + /* 0 */ 2094, 707, 2041, 674, 2030, 2460, 2455, 548, 2455, 2026, + /* 10 */ 549, 1897, 48, 46, 1774, 693, 2460, 668, 412, 2455, + /* 20 */ 409, 133, 1616, 1855, 673, 198, 164, 2459, 590, 2456, + /* 30 */ 675, 2456, 2458, 391, 2043, 1700, 1937, 1614, 2459, 38, + /* 40 */ 314, 2092, 2456, 2457, 123, 2304, 2286, 122, 121, 120, + /* 50 */ 119, 118, 117, 116, 115, 114, 686, 142, 1641, 689, + /* 60 */ 1643, 41, 40, 155, 1695, 47, 45, 44, 43, 42, + /* 70 */ 19, 707, 2041, 1852, 170, 123, 1866, 1622, 122, 121, + /* 80 */ 120, 119, 118, 117, 116, 115, 114, 2304, 41, 40, + /* 90 */ 67, 133, 47, 45, 44, 43, 42, 1877, 595, 2253, + /* 100 */ 1644, 723, 706, 818, 667, 706, 15, 319, 793, 792, + /* 110 */ 791, 790, 421, 1641, 789, 788, 147, 783, 782, 781, + /* 120 */ 780, 779, 778, 777, 146, 771, 770, 769, 420, 419, + /* 130 */ 766, 765, 764, 179, 178, 763, 556, 55, 2285, 549, + /* 140 */ 1897, 2323, 1702, 1703, 110, 2287, 727, 2289, 2290, 722, + /* 150 */ 2253, 717, 424, 686, 142, 706, 181, 423, 2376, 180, + /* 160 */ 1816, 2172, 405, 2372, 294, 2384, 685, 2460, 134, 684, + /* 170 */ 169, 2455, 463, 563, 1675, 1685, 402, 200, 1980, 2169, + /* 180 */ 694, 1701, 1704, 2153, 1643, 2406, 2094, 625, 51, 673, + /* 190 */ 198, 51, 62, 390, 2456, 675, 1617, 669, 1615, 62, + /* 200 */ 649, 2092, 623, 2455, 621, 263, 262, 41, 40, 62, + /* 210 */ 62, 47, 45, 44, 43, 42, 296, 515, 513, 1364, + /* 220 */ 361, 2461, 198, 267, 212, 1778, 2456, 675, 1620, 1621, + /* 230 */ 1672, 1641, 1674, 1677, 1678, 1679, 1680, 1681, 1682, 1683, + /* 240 */ 1684, 719, 715, 1693, 1694, 1696, 1697, 1698, 1699, 2, + /* 250 */ 48, 46, 1854, 686, 142, 360, 194, 1639, 409, 1366, + /* 260 */ 1616, 197, 2384, 2385, 500, 140, 2389, 518, 553, 369, + /* 270 */ 218, 1840, 517, 1700, 550, 1614, 132, 131, 130, 129, + /* 280 */ 128, 127, 126, 125, 124, 609, 608, 607, 483, 567, + /* 290 */ 519, 1260, 599, 139, 603, 485, 1585, 1586, 602, 454, + /* 300 */ 634, 453, 1695, 601, 606, 385, 384, 2018, 19, 600, + /* 310 */ 1645, 88, 596, 1729, 87, 1622, 47, 45, 44, 43, + /* 320 */ 42, 41, 40, 2286, 75, 47, 45, 44, 43, 42, + /* 330 */ 2216, 452, 52, 1262, 1265, 1266, 724, 664, 1906, 232, + /* 340 */ 296, 818, 378, 551, 15, 1904, 418, 417, 298, 2172, + /* 350 */ 41, 40, 298, 471, 47, 45, 44, 43, 42, 298, + /* 360 */ 688, 196, 2384, 2385, 2304, 140, 2389, 2170, 694, 298, + /* 370 */ 298, 1623, 1730, 234, 86, 30, 2253, 551, 723, 1904, + /* 380 */ 1702, 1703, 268, 2159, 2138, 1676, 507, 506, 505, 504, + /* 390 */ 499, 498, 497, 496, 495, 491, 490, 489, 488, 359, + /* 400 */ 480, 479, 478, 1644, 473, 472, 376, 1672, 1508, 1509, + /* 410 */ 1268, 1710, 1675, 1685, 1527, 2285, 1640, 1641, 2323, 1701, + /* 420 */ 1704, 110, 2287, 727, 2289, 2290, 722, 1641, 717, 670, + /* 430 */ 665, 658, 762, 2475, 1617, 2376, 1615, 383, 382, 405, + /* 440 */ 2372, 1673, 760, 157, 156, 757, 756, 755, 154, 1817, + /* 450 */ 2286, 1642, 37, 407, 1724, 1725, 1726, 1727, 1728, 1732, + /* 460 */ 1733, 1734, 1735, 724, 12, 1876, 1620, 1621, 1672, 2246, + /* 470 */ 1674, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 719, + /* 480 */ 715, 1693, 1694, 1696, 1697, 1698, 1699, 2, 12, 48, + /* 490 */ 46, 2304, 298, 92, 1642, 192, 1285, 409, 1284, 1616, + /* 500 */ 1285, 1847, 1284, 2253, 773, 723, 1875, 2081, 381, 380, + /* 510 */ 379, 592, 1700, 138, 1614, 34, 597, 649, 2253, 2036, + /* 520 */ 2455, 41, 40, 2286, 1731, 47, 45, 44, 43, 42, + /* 530 */ 92, 1286, 1626, 594, 1644, 1286, 689, 593, 2461, 198, + /* 540 */ 1361, 1695, 2285, 2456, 675, 2323, 564, 19, 110, 2287, + /* 550 */ 727, 2289, 2290, 722, 1622, 717, 2037, 1805, 145, 2253, + /* 560 */ 152, 2347, 2376, 1622, 2304, 2017, 405, 2372, 775, 509, + /* 570 */ 1421, 1676, 776, 1456, 1457, 2002, 2253, 1874, 723, 1873, + /* 580 */ 818, 1520, 1521, 15, 1412, 752, 751, 750, 1416, 749, + /* 590 */ 1418, 1419, 748, 745, 1872, 1427, 742, 1429, 1430, 739, + /* 600 */ 736, 733, 565, 2165, 35, 1846, 661, 660, 1803, 1804, + /* 610 */ 1806, 1807, 1808, 1645, 1736, 2285, 1540, 1541, 2323, 1702, + /* 620 */ 1703, 110, 2287, 727, 2289, 2290, 722, 1673, 717, 2028, + /* 630 */ 2253, 222, 2253, 181, 762, 2376, 753, 41, 40, 405, + /* 640 */ 2372, 47, 45, 44, 43, 42, 414, 2253, 180, 2087, + /* 650 */ 2089, 1675, 1685, 508, 36, 1539, 1542, 598, 1701, 1704, + /* 660 */ 41, 40, 2407, 2094, 47, 45, 44, 43, 42, 249, + /* 670 */ 377, 2024, 2152, 1617, 1940, 1615, 1376, 2094, 702, 707, + /* 680 */ 2041, 1359, 707, 2041, 375, 174, 686, 142, 1871, 545, + /* 690 */ 189, 1375, 2092, 584, 580, 576, 572, 543, 248, 203, + /* 700 */ 539, 535, 56, 1870, 266, 1620, 1621, 1672, 265, 1674, + /* 710 */ 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 719, 715, + /* 720 */ 1693, 1694, 1696, 1697, 1698, 1699, 2, 48, 46, 1705, + /* 730 */ 2286, 707, 2041, 102, 1616, 409, 1790, 1616, 1869, 93, + /* 740 */ 1868, 2253, 246, 724, 1645, 2414, 609, 608, 607, 1614, + /* 750 */ 1700, 460, 1614, 599, 139, 603, 2253, 520, 2034, 602, + /* 760 */ 674, 2286, 2094, 2455, 601, 606, 385, 384, 2019, 399, + /* 770 */ 600, 2304, 95, 596, 724, 364, 2427, 2092, 389, 1695, + /* 780 */ 627, 673, 198, 2253, 1865, 723, 2456, 675, 12, 1622, + /* 790 */ 10, 2253, 1622, 2253, 199, 2384, 2385, 1864, 140, 2389, + /* 800 */ 456, 148, 2304, 41, 40, 455, 2045, 47, 45, 44, + /* 810 */ 43, 42, 245, 238, 2253, 818, 723, 273, 818, 243, + /* 820 */ 561, 49, 2285, 707, 2041, 2323, 2286, 1863, 110, 2287, + /* 830 */ 727, 2289, 2290, 722, 1380, 717, 403, 2253, 236, 721, + /* 840 */ 2475, 2263, 2376, 461, 167, 276, 405, 2372, 649, 1379, + /* 850 */ 2253, 2455, 2043, 2285, 1644, 2032, 2323, 1702, 1703, 110, + /* 860 */ 2287, 727, 2289, 2290, 722, 2267, 717, 2304, 412, 2461, + /* 870 */ 198, 2475, 155, 2376, 2456, 675, 167, 405, 2372, 2253, + /* 880 */ 2253, 723, 1641, 2391, 2043, 1862, 648, 41, 40, 1675, + /* 890 */ 1685, 47, 45, 44, 43, 42, 1701, 1704, 2016, 760, + /* 900 */ 157, 156, 757, 756, 755, 154, 718, 2269, 1617, 2388, + /* 910 */ 1615, 1617, 1981, 1615, 709, 522, 2348, 717, 2285, 707, + /* 920 */ 2041, 2323, 707, 2041, 350, 2287, 727, 2289, 2290, 722, + /* 930 */ 720, 717, 708, 2341, 2459, 469, 2148, 2125, 2253, 477, + /* 940 */ 1620, 1621, 492, 1620, 1621, 1672, 1580, 1674, 1677, 1678, + /* 950 */ 1679, 1680, 1681, 1682, 1683, 1684, 719, 715, 1693, 1694, + /* 960 */ 1696, 1697, 1698, 1699, 2, 48, 46, 1797, 2286, 707, + /* 970 */ 2041, 614, 2094, 409, 1867, 1616, 2247, 415, 632, 404, + /* 980 */ 2094, 724, 1798, 656, 214, 167, 626, 2092, 1700, 493, + /* 990 */ 1614, 1861, 2094, 2043, 108, 2093, 707, 2041, 1641, 413, + /* 1000 */ 475, 2148, 264, 305, 306, 502, 2148, 2092, 304, 2304, + /* 1010 */ 193, 143, 60, 444, 2088, 2089, 566, 1695, 617, 2033, + /* 1020 */ 646, 2253, 1796, 723, 649, 611, 649, 2455, 594, 2455, + /* 1030 */ 1622, 261, 593, 760, 157, 156, 757, 756, 755, 154, + /* 1040 */ 446, 442, 9, 690, 2253, 2461, 198, 2461, 198, 216, + /* 1050 */ 2456, 675, 2456, 675, 221, 166, 818, 707, 2041, 49, + /* 1060 */ 2285, 2286, 1860, 2323, 1645, 2263, 110, 2287, 727, 2289, + /* 1070 */ 2290, 722, 71, 717, 724, 70, 2448, 2038, 2475, 2271, + /* 1080 */ 2376, 707, 2041, 1859, 405, 2372, 707, 2041, 711, 2267, + /* 1090 */ 2348, 649, 1673, 1858, 2455, 1702, 1703, 1771, 487, 605, + /* 1100 */ 604, 269, 2304, 707, 2041, 144, 277, 486, 2347, 707, + /* 1110 */ 2041, 678, 2461, 198, 2253, 2253, 723, 2456, 675, 1857, + /* 1120 */ 707, 2041, 167, 692, 2234, 707, 2041, 1675, 1685, 309, + /* 1130 */ 2044, 2269, 406, 2237, 1701, 1704, 2253, 707, 2041, 2391, + /* 1140 */ 704, 717, 14, 13, 2263, 705, 2253, 707, 2041, 1617, + /* 1150 */ 681, 1615, 1676, 2285, 787, 785, 2323, 315, 2272, 110, + /* 1160 */ 2287, 727, 2289, 2290, 722, 2387, 717, 416, 2267, 1288, + /* 1170 */ 1289, 2475, 2253, 2376, 44, 43, 42, 405, 2372, 586, + /* 1180 */ 585, 1620, 1621, 1672, 431, 1674, 1677, 1678, 1679, 1680, + /* 1190 */ 1681, 1682, 1683, 1684, 719, 715, 1693, 1694, 1696, 1697, + /* 1200 */ 1698, 1699, 2, 48, 46, 155, 2286, 2391, 1673, 754, + /* 1210 */ 2269, 409, 2085, 1616, 588, 587, 1882, 813, 677, 724, + /* 1220 */ 717, 2395, 758, 1924, 759, 2085, 1700, 2085, 1614, 328, + /* 1230 */ 1265, 1266, 2071, 2386, 2396, 1763, 2135, 3, 135, 254, + /* 1240 */ 256, 258, 252, 255, 257, 610, 278, 2304, 1743, 54, + /* 1250 */ 85, 260, 1915, 1913, 259, 1695, 629, 50, 628, 2253, + /* 1260 */ 714, 723, 50, 182, 155, 1763, 2420, 50, 1622, 1849, + /* 1270 */ 1850, 303, 1907, 72, 612, 615, 153, 155, 467, 1583, + /* 1280 */ 14, 13, 65, 50, 50, 1625, 2274, 291, 731, 153, + /* 1290 */ 96, 107, 662, 767, 818, 155, 136, 15, 2285, 2286, + /* 1300 */ 104, 2323, 153, 768, 110, 2287, 727, 2289, 2290, 722, + /* 1310 */ 137, 717, 724, 1624, 285, 1319, 2475, 1338, 2376, 418, + /* 1320 */ 417, 2305, 405, 2372, 811, 1978, 1977, 1336, 2157, 1630, + /* 1330 */ 2410, 1802, 659, 1702, 1703, 395, 1801, 283, 691, 422, + /* 1340 */ 2304, 1537, 1700, 2276, 1623, 307, 205, 699, 392, 666, + /* 1350 */ 311, 1406, 2253, 696, 723, 1320, 1737, 1686, 327, 1903, + /* 1360 */ 1898, 1770, 1434, 1438, 2158, 1675, 1685, 679, 2082, 1445, + /* 1370 */ 1443, 1695, 1701, 1704, 2411, 2421, 158, 687, 293, 290, + /* 1380 */ 5, 297, 2003, 425, 1622, 430, 373, 1617, 438, 1615, + /* 1390 */ 1648, 2285, 447, 439, 2323, 206, 448, 110, 2287, 727, + /* 1400 */ 2289, 2290, 722, 207, 717, 450, 209, 1561, 682, 2351, + /* 1410 */ 713, 2376, 322, 1639, 464, 405, 2372, 1640, 1721, 1620, + /* 1420 */ 1621, 1672, 468, 1674, 1677, 1678, 1679, 1680, 1681, 1682, + /* 1430 */ 1683, 1684, 719, 715, 1693, 1694, 1696, 1697, 1698, 1699, + /* 1440 */ 2, 220, 168, 470, 474, 476, 1628, 335, 511, 481, + /* 1450 */ 494, 503, 501, 510, 2150, 512, 523, 524, 521, 224, + /* 1460 */ 225, 526, 227, 527, 332, 74, 529, 531, 73, 1646, + /* 1470 */ 4, 546, 547, 554, 1627, 1642, 555, 557, 357, 235, + /* 1480 */ 558, 237, 1647, 559, 2286, 1649, 560, 1650, 562, 230, + /* 1490 */ 530, 528, 525, 2166, 240, 633, 589, 724, 242, 568, + /* 1500 */ 354, 618, 2225, 1631, 90, 1626, 91, 247, 112, 619, + /* 1510 */ 2222, 591, 2031, 631, 94, 2221, 149, 251, 637, 323, + /* 1520 */ 636, 270, 638, 2027, 274, 2304, 1568, 272, 642, 253, + /* 1530 */ 62, 644, 2426, 160, 161, 1634, 1636, 2253, 2029, 723, + /* 1540 */ 2025, 162, 163, 663, 8, 697, 2425, 175, 2398, 715, + /* 1550 */ 1693, 1694, 1696, 1697, 1698, 1699, 672, 653, 641, 284, + /* 1560 */ 654, 286, 652, 287, 651, 2454, 288, 292, 63, 2478, + /* 1570 */ 1763, 643, 683, 680, 396, 141, 2285, 1643, 280, 2323, + /* 1580 */ 282, 1, 110, 2287, 727, 2289, 2290, 722, 289, 717, + /* 1590 */ 1768, 1766, 201, 299, 2349, 185, 2376, 324, 695, 150, + /* 1600 */ 405, 2372, 2180, 2179, 2178, 325, 700, 2392, 401, 701, + /* 1610 */ 326, 61, 83, 82, 459, 103, 2086, 211, 1244, 2042, + /* 1620 */ 729, 151, 812, 815, 101, 329, 317, 2357, 53, 365, + /* 1630 */ 451, 449, 366, 353, 331, 333, 2245, 159, 2244, 817, + /* 1640 */ 2243, 358, 80, 2286, 440, 2238, 427, 437, 433, 429, + /* 1650 */ 426, 452, 428, 1607, 338, 1608, 724, 204, 432, 2236, + /* 1660 */ 434, 435, 436, 1606, 2235, 374, 2233, 352, 441, 2286, + /* 1670 */ 342, 2232, 443, 2231, 445, 1596, 2212, 208, 2211, 210, + /* 1680 */ 1564, 81, 724, 1563, 2304, 2193, 2192, 2191, 457, 458, + /* 1690 */ 298, 2190, 2189, 2140, 2134, 462, 2253, 1507, 723, 465, + /* 1700 */ 466, 2131, 213, 2130, 2129, 84, 2128, 2133, 2132, 2127, + /* 1710 */ 2304, 482, 215, 2126, 2124, 2123, 2122, 217, 2121, 484, + /* 1720 */ 2137, 2120, 2253, 2119, 723, 2118, 2117, 2116, 2115, 2114, + /* 1730 */ 2113, 2112, 2111, 2110, 2109, 2285, 2286, 219, 2323, 2108, + /* 1740 */ 2107, 110, 2287, 727, 2289, 2290, 722, 2106, 717, 724, + /* 1750 */ 2105, 2104, 2103, 710, 2102, 2376, 2136, 89, 2101, 405, + /* 1760 */ 2372, 2285, 2100, 1513, 2323, 2286, 2099, 111, 2287, 727, + /* 1770 */ 2289, 2290, 722, 2098, 717, 223, 514, 2304, 724, 2097, + /* 1780 */ 516, 2376, 2096, 2095, 1943, 2375, 2372, 1377, 362, 2253, + /* 1790 */ 1381, 723, 363, 1942, 1373, 1941, 1939, 1936, 532, 226, + /* 1800 */ 228, 534, 1935, 1928, 533, 538, 2304, 229, 536, 540, + /* 1810 */ 1917, 537, 542, 544, 1893, 541, 2273, 77, 2253, 231, + /* 1820 */ 723, 190, 1267, 1892, 233, 2210, 191, 552, 2285, 78, + /* 1830 */ 2200, 2323, 2188, 2286, 111, 2287, 727, 2289, 2290, 722, + /* 1840 */ 239, 717, 241, 2187, 2164, 2020, 724, 1938, 2376, 244, + /* 1850 */ 1934, 1312, 712, 2372, 569, 635, 570, 725, 571, 1932, + /* 1860 */ 2323, 573, 574, 111, 2287, 727, 2289, 2290, 722, 575, + /* 1870 */ 717, 1930, 577, 821, 2304, 579, 1927, 2376, 581, 578, + /* 1880 */ 582, 368, 2372, 1912, 583, 1910, 2253, 1911, 723, 321, + /* 1890 */ 1909, 1889, 2022, 1450, 1449, 2021, 1349, 1363, 2286, 64, + /* 1900 */ 1362, 250, 1360, 1358, 1357, 188, 1356, 1355, 784, 1925, + /* 1910 */ 1354, 724, 786, 809, 805, 801, 797, 2286, 318, 1351, + /* 1920 */ 386, 1350, 1916, 1348, 387, 2285, 1914, 388, 2323, 1888, + /* 1930 */ 724, 171, 2287, 727, 2289, 2290, 722, 616, 717, 2304, + /* 1940 */ 620, 613, 1887, 1886, 1885, 622, 1884, 624, 113, 1590, + /* 1950 */ 1592, 2253, 1589, 723, 2209, 1594, 1570, 29, 2304, 109, + /* 1960 */ 1572, 68, 312, 2199, 2186, 2185, 57, 639, 165, 2460, + /* 1970 */ 2253, 275, 723, 650, 2417, 640, 17, 1549, 66, 195, + /* 1980 */ 20, 6, 1548, 31, 7, 1819, 279, 645, 281, 1574, + /* 1990 */ 2285, 657, 2286, 2323, 703, 647, 172, 2287, 727, 2289, + /* 2000 */ 2290, 722, 21, 717, 22, 724, 1800, 173, 655, 2285, + /* 2010 */ 184, 2274, 2323, 183, 33, 111, 2287, 727, 2289, 2290, + /* 2020 */ 722, 1789, 717, 32, 24, 1834, 79, 1833, 1839, 2376, + /* 2030 */ 1840, 397, 301, 2304, 2373, 1838, 1837, 398, 295, 300, + /* 2040 */ 1760, 59, 1759, 2184, 176, 2253, 98, 723, 2163, 2162, + /* 2050 */ 676, 2476, 99, 26, 97, 25, 104, 302, 271, 2286, + /* 2060 */ 1795, 186, 23, 308, 69, 18, 100, 313, 13, 11, + /* 2070 */ 177, 310, 724, 58, 698, 1632, 1712, 1711, 187, 1665, + /* 2080 */ 1722, 1690, 2326, 728, 2285, 2286, 716, 2323, 726, 1688, + /* 2090 */ 171, 2287, 727, 2289, 2290, 722, 730, 717, 724, 39, + /* 2100 */ 2304, 411, 734, 1687, 1657, 393, 737, 16, 27, 28, + /* 2110 */ 1426, 732, 2253, 1435, 723, 740, 1432, 735, 743, 1431, + /* 2120 */ 738, 746, 1428, 741, 316, 744, 2304, 1444, 1440, 1422, + /* 2130 */ 1420, 394, 747, 2418, 1425, 1345, 105, 106, 2253, 76, + /* 2140 */ 723, 1310, 761, 1424, 1342, 1341, 1340, 1339, 1337, 1335, + /* 2150 */ 1334, 2285, 1423, 1333, 2323, 2286, 1371, 351, 2287, 727, + /* 2160 */ 2289, 2290, 722, 772, 717, 1370, 202, 774, 724, 1331, + /* 2170 */ 1328, 1330, 1329, 1327, 1326, 1325, 1367, 2285, 1365, 1322, + /* 2180 */ 2323, 1321, 2286, 351, 2287, 727, 2289, 2290, 722, 1318, + /* 2190 */ 717, 1317, 1316, 1933, 1315, 724, 2304, 794, 795, 1931, + /* 2200 */ 796, 798, 799, 800, 1929, 802, 803, 804, 2253, 1926, + /* 2210 */ 723, 806, 1908, 807, 808, 810, 1257, 1883, 1245, 814, + /* 2220 */ 320, 816, 819, 2304, 1618, 330, 820, 1853, 1853, 1853, + /* 2230 */ 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, 1853, + /* 2240 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2285, 1853, 1853, + /* 2250 */ 2323, 1853, 1853, 344, 2287, 727, 2289, 2290, 722, 1853, + /* 2260 */ 717, 1853, 1853, 1853, 1853, 1853, 2286, 1853, 1853, 1853, + /* 2270 */ 1853, 1853, 1853, 1853, 2285, 1853, 1853, 2323, 1853, 724, + /* 2280 */ 172, 2287, 727, 2289, 2290, 722, 1853, 717, 2286, 1853, + /* 2290 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 671, + /* 2300 */ 1853, 721, 1853, 1853, 1853, 1853, 1853, 2304, 1853, 1853, + /* 2310 */ 1853, 1853, 400, 1853, 1853, 1853, 1853, 1853, 1853, 2253, + /* 2320 */ 1853, 723, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2304, + /* 2330 */ 1853, 1853, 1853, 1853, 1853, 2477, 1853, 1853, 1853, 1853, + /* 2340 */ 1853, 2253, 1853, 723, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2350 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2285, 1853, + /* 2360 */ 1853, 2323, 1853, 1853, 351, 2287, 727, 2289, 2290, 722, + /* 2370 */ 1853, 717, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2380 */ 2285, 1853, 1853, 2323, 1853, 1853, 350, 2287, 727, 2289, + /* 2390 */ 2290, 722, 1853, 717, 2286, 2342, 1853, 1853, 1853, 1853, + /* 2400 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 724, 1853, 1853, + /* 2410 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2420 */ 1853, 2286, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2430 */ 1853, 1853, 1853, 1853, 724, 2304, 1853, 1853, 1853, 1853, + /* 2440 */ 408, 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, + /* 2450 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2460 */ 1853, 1853, 2304, 1853, 1853, 1853, 1853, 410, 1853, 1853, + /* 2470 */ 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, 1853, 1853, + /* 2480 */ 1853, 1853, 1853, 1853, 1853, 1853, 2285, 2286, 1853, 2323, + /* 2490 */ 1853, 1853, 351, 2287, 727, 2289, 2290, 722, 1853, 717, + /* 2500 */ 724, 1853, 1853, 1853, 2286, 1853, 1853, 1853, 1853, 1853, + /* 2510 */ 1853, 1853, 1853, 2285, 1853, 1853, 2323, 724, 1853, 351, + /* 2520 */ 2287, 727, 2289, 2290, 722, 1853, 717, 1853, 2304, 1853, + /* 2530 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2540 */ 2253, 1853, 723, 1853, 1853, 2304, 1853, 1853, 1853, 1853, + /* 2550 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, + /* 2560 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2570 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 630, + /* 2580 */ 1853, 1853, 2323, 1853, 2286, 346, 2287, 727, 2289, 2290, + /* 2590 */ 722, 1853, 717, 1853, 1853, 1853, 2285, 724, 1853, 2323, + /* 2600 */ 1853, 1853, 336, 2287, 727, 2289, 2290, 722, 1853, 717, + /* 2610 */ 1853, 1853, 1853, 1853, 1853, 2286, 1853, 1853, 1853, 1853, + /* 2620 */ 1853, 1853, 1853, 1853, 1853, 2304, 1853, 1853, 724, 1853, + /* 2630 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, + /* 2640 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2650 */ 2286, 1853, 1853, 1853, 1853, 1853, 2304, 1853, 1853, 1853, + /* 2660 */ 1853, 1853, 1853, 724, 1853, 1853, 1853, 1853, 2253, 1853, + /* 2670 */ 723, 1853, 1853, 1853, 1853, 1853, 2285, 1853, 1853, 2323, + /* 2680 */ 1853, 1853, 334, 2287, 727, 2289, 2290, 722, 1853, 717, + /* 2690 */ 1853, 2304, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2700 */ 1853, 1853, 1853, 2253, 1853, 723, 1853, 2285, 1853, 1853, + /* 2710 */ 2323, 1853, 1853, 337, 2287, 727, 2289, 2290, 722, 1853, + /* 2720 */ 717, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2730 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2740 */ 1853, 1853, 2285, 2286, 1853, 2323, 1853, 1853, 343, 2287, + /* 2750 */ 727, 2289, 2290, 722, 1853, 717, 724, 1853, 1853, 1853, + /* 2760 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2770 */ 2286, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2780 */ 1853, 1853, 1853, 724, 2304, 1853, 1853, 1853, 1853, 1853, + /* 2790 */ 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, + /* 2800 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2810 */ 1853, 2304, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2820 */ 1853, 1853, 1853, 2253, 1853, 723, 1853, 1853, 1853, 1853, + /* 2830 */ 1853, 1853, 1853, 1853, 1853, 2285, 2286, 1853, 2323, 1853, + /* 2840 */ 1853, 347, 2287, 727, 2289, 2290, 722, 1853, 717, 724, + /* 2850 */ 1853, 1853, 1853, 2286, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2860 */ 1853, 1853, 2285, 1853, 1853, 2323, 724, 1853, 339, 2287, + /* 2870 */ 727, 2289, 2290, 722, 1853, 717, 1853, 2304, 1853, 1853, + /* 2880 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2253, + /* 2890 */ 1853, 723, 1853, 1853, 2304, 1853, 1853, 1853, 1853, 1853, + /* 2900 */ 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, + /* 2910 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 2920 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2285, 1853, + /* 2930 */ 1853, 2323, 1853, 2286, 348, 2287, 727, 2289, 2290, 722, + /* 2940 */ 1853, 717, 1853, 1853, 1853, 2285, 724, 1853, 2323, 1853, + /* 2950 */ 1853, 340, 2287, 727, 2289, 2290, 722, 1853, 717, 1853, + /* 2960 */ 1853, 1853, 1853, 1853, 2286, 1853, 1853, 1853, 1853, 1853, + /* 2970 */ 1853, 1853, 1853, 1853, 2304, 1853, 1853, 724, 1853, 1853, + /* 2980 */ 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, + /* 2990 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2286, + /* 3000 */ 1853, 1853, 1853, 1853, 1853, 2304, 1853, 1853, 1853, 1853, + /* 3010 */ 1853, 1853, 724, 1853, 1853, 1853, 1853, 2253, 1853, 723, + /* 3020 */ 1853, 1853, 1853, 1853, 1853, 2285, 1853, 1853, 2323, 1853, + /* 3030 */ 1853, 349, 2287, 727, 2289, 2290, 722, 1853, 717, 1853, + /* 3040 */ 2304, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3050 */ 1853, 1853, 2253, 1853, 723, 1853, 2285, 1853, 1853, 2323, + /* 3060 */ 1853, 1853, 341, 2287, 727, 2289, 2290, 722, 1853, 717, + /* 3070 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3080 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3090 */ 1853, 2285, 2286, 1853, 2323, 1853, 1853, 355, 2287, 727, + /* 3100 */ 2289, 2290, 722, 1853, 717, 724, 1853, 1853, 1853, 1853, + /* 3110 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2286, + /* 3120 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3130 */ 1853, 1853, 724, 2304, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3140 */ 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, 1853, + /* 3150 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3160 */ 2304, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3170 */ 1853, 1853, 2253, 1853, 723, 1853, 1853, 1853, 1853, 1853, + /* 3180 */ 1853, 1853, 1853, 1853, 2285, 2286, 1853, 2323, 1853, 1853, + /* 3190 */ 356, 2287, 727, 2289, 2290, 722, 1853, 717, 724, 1853, + /* 3200 */ 1853, 1853, 2286, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3210 */ 1853, 2285, 1853, 1853, 2323, 724, 1853, 2298, 2287, 727, + /* 3220 */ 2289, 2290, 722, 1853, 717, 1853, 2304, 1853, 1853, 1853, + /* 3230 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, + /* 3240 */ 723, 1853, 1853, 2304, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3250 */ 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, 1853, + /* 3260 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3270 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2285, 1853, 1853, + /* 3280 */ 2323, 1853, 2286, 2297, 2287, 727, 2289, 2290, 722, 1853, + /* 3290 */ 717, 1853, 1853, 1853, 2285, 724, 1853, 2323, 1853, 1853, + /* 3300 */ 2296, 2287, 727, 2289, 2290, 722, 1853, 717, 1853, 1853, + /* 3310 */ 1853, 1853, 1853, 2286, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3320 */ 1853, 1853, 1853, 2304, 1853, 1853, 724, 1853, 1853, 1853, + /* 3330 */ 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, 1853, + /* 3340 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2286, 1853, + /* 3350 */ 1853, 1853, 1853, 1853, 2304, 1853, 1853, 1853, 1853, 1853, + /* 3360 */ 1853, 724, 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, + /* 3370 */ 1853, 1853, 1853, 1853, 2285, 1853, 1853, 2323, 1853, 1853, + /* 3380 */ 370, 2287, 727, 2289, 2290, 722, 1853, 717, 1853, 2304, + /* 3390 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3400 */ 1853, 2253, 1853, 723, 1853, 2285, 1853, 1853, 2323, 1853, + /* 3410 */ 1853, 371, 2287, 727, 2289, 2290, 722, 1853, 717, 1853, + /* 3420 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3430 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3440 */ 2285, 2286, 1853, 2323, 1853, 1853, 367, 2287, 727, 2289, + /* 3450 */ 2290, 722, 1853, 717, 724, 1853, 1853, 1853, 1853, 1853, + /* 3460 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2286, 1853, + /* 3470 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3480 */ 1853, 724, 2304, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3490 */ 1853, 1853, 1853, 1853, 2253, 1853, 723, 1853, 1853, 1853, + /* 3500 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2304, + /* 3510 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3520 */ 1853, 2253, 1853, 723, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3530 */ 1853, 1853, 1853, 2285, 2286, 1853, 2323, 1853, 1853, 372, + /* 3540 */ 2287, 727, 2289, 2290, 722, 1853, 717, 724, 1853, 1853, + /* 3550 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3560 */ 725, 1853, 1853, 2323, 1853, 1853, 346, 2287, 727, 2289, + /* 3570 */ 2290, 722, 1853, 717, 1853, 2304, 1853, 1853, 1853, 1853, + /* 3580 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 2253, 1853, 723, + /* 3590 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3600 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3610 */ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, + /* 3620 */ 1853, 1853, 1853, 1853, 1853, 1853, 2285, 1853, 1853, 2323, + /* 3630 */ 1853, 1853, 345, 2287, 727, 2289, 2290, 722, 1853, 717, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 389, 359, 360, 471, 389, 471, 474, 354, 474, 369, - /* 10 */ 357, 358, 12, 13, 14, 359, 471, 377, 380, 474, - /* 20 */ 20, 379, 22, 0, 492, 493, 388, 493, 386, 497, - /* 30 */ 498, 497, 498, 395, 396, 35, 0, 37, 493, 460, - /* 40 */ 461, 403, 497, 498, 21, 368, 347, 24, 25, 26, - /* 50 */ 27, 28, 29, 30, 31, 32, 359, 360, 20, 360, - /* 60 */ 404, 405, 385, 407, 64, 0, 14, 411, 20, 20, - /* 70 */ 70, 394, 20, 344, 376, 21, 20, 77, 24, 25, - /* 80 */ 26, 27, 28, 29, 30, 31, 32, 388, 390, 24, - /* 90 */ 25, 26, 27, 28, 29, 30, 31, 32, 400, 400, - /* 100 */ 20, 402, 20, 103, 22, 388, 106, 347, 72, 73, - /* 110 */ 74, 75, 76, 396, 78, 79, 80, 81, 82, 83, + /* 0 */ 389, 360, 361, 472, 390, 472, 475, 355, 475, 390, + /* 10 */ 358, 359, 12, 13, 14, 404, 472, 361, 381, 475, + /* 20 */ 20, 380, 22, 0, 493, 494, 389, 494, 387, 498, + /* 30 */ 499, 498, 499, 396, 397, 35, 0, 37, 494, 461, + /* 40 */ 462, 404, 498, 499, 21, 389, 348, 24, 25, 26, + /* 50 */ 27, 28, 29, 30, 31, 32, 360, 361, 20, 361, + /* 60 */ 20, 8, 9, 33, 64, 12, 13, 14, 15, 16, + /* 70 */ 70, 360, 361, 345, 347, 21, 349, 77, 24, 25, + /* 80 */ 26, 27, 28, 29, 30, 31, 32, 389, 8, 9, + /* 90 */ 4, 380, 12, 13, 14, 15, 16, 348, 387, 401, + /* 100 */ 20, 403, 20, 103, 448, 20, 106, 34, 72, 73, + /* 110 */ 74, 75, 76, 20, 78, 79, 80, 81, 82, 83, /* 120 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - /* 130 */ 94, 95, 96, 97, 98, 99, 69, 55, 439, 20, - /* 140 */ 442, 442, 142, 143, 445, 446, 447, 448, 449, 450, - /* 150 */ 452, 452, 423, 20, 106, 22, 457, 428, 459, 4, - /* 160 */ 400, 402, 463, 464, 467, 468, 469, 106, 471, 472, - /* 170 */ 37, 474, 359, 360, 174, 175, 417, 478, 384, 420, - /* 180 */ 421, 181, 182, 20, 0, 486, 106, 355, 55, 492, - /* 190 */ 493, 359, 379, 361, 497, 498, 196, 135, 198, 386, - /* 200 */ 471, 139, 86, 474, 354, 8, 9, 357, 358, 12, - /* 210 */ 13, 14, 15, 16, 135, 136, 137, 138, 139, 140, - /* 220 */ 141, 492, 493, 174, 175, 106, 497, 498, 228, 229, - /* 230 */ 436, 231, 232, 233, 234, 235, 236, 237, 238, 239, - /* 240 */ 240, 241, 242, 243, 244, 245, 246, 247, 248, 12, - /* 250 */ 13, 402, 20, 69, 18, 347, 20, 20, 3, 22, - /* 260 */ 346, 106, 348, 27, 148, 106, 30, 70, 360, 420, - /* 270 */ 421, 35, 35, 388, 37, 20, 8, 9, 359, 360, - /* 280 */ 12, 13, 14, 15, 16, 376, 170, 51, 20, 53, - /* 290 */ 359, 360, 51, 0, 58, 410, 388, 412, 379, 390, - /* 300 */ 59, 64, 103, 62, 63, 142, 143, 70, 400, 400, - /* 310 */ 402, 114, 359, 265, 77, 22, 117, 118, 119, 120, - /* 320 */ 121, 122, 123, 124, 125, 126, 265, 128, 129, 130, - /* 330 */ 131, 132, 133, 134, 12, 13, 14, 15, 16, 408, - /* 340 */ 103, 105, 355, 106, 181, 182, 359, 439, 361, 180, - /* 350 */ 442, 442, 116, 445, 446, 447, 448, 449, 450, 173, - /* 360 */ 452, 452, 107, 455, 70, 457, 458, 459, 415, 416, - /* 370 */ 173, 463, 464, 398, 142, 143, 401, 402, 388, 142, - /* 380 */ 143, 20, 146, 147, 265, 149, 150, 151, 152, 153, - /* 390 */ 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - /* 400 */ 164, 165, 412, 167, 168, 169, 444, 171, 172, 14, - /* 410 */ 0, 174, 175, 177, 106, 20, 359, 360, 181, 182, - /* 420 */ 265, 8, 9, 376, 265, 12, 13, 14, 15, 16, - /* 430 */ 106, 176, 470, 196, 0, 198, 379, 390, 252, 115, - /* 440 */ 271, 272, 273, 347, 176, 21, 33, 400, 262, 252, - /* 450 */ 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - /* 460 */ 36, 51, 38, 39, 40, 228, 229, 0, 231, 232, - /* 470 */ 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - /* 480 */ 243, 244, 245, 246, 247, 248, 249, 12, 13, 442, - /* 490 */ 443, 347, 12, 13, 4, 20, 400, 22, 20, 452, - /* 500 */ 347, 359, 360, 195, 360, 197, 72, 73, 74, 42, - /* 510 */ 35, 347, 37, 79, 80, 81, 388, 37, 20, 85, - /* 520 */ 107, 379, 228, 395, 90, 91, 92, 93, 14, 69, - /* 530 */ 96, 403, 388, 99, 20, 227, 46, 47, 48, 64, - /* 540 */ 37, 72, 73, 74, 400, 70, 402, 191, 79, 80, - /* 550 */ 81, 360, 77, 400, 85, 359, 360, 401, 402, 90, - /* 560 */ 91, 92, 93, 347, 400, 96, 359, 360, 99, 174, - /* 570 */ 388, 423, 22, 265, 218, 219, 428, 395, 103, 388, - /* 580 */ 77, 106, 347, 439, 137, 403, 442, 37, 141, 445, - /* 590 */ 446, 447, 448, 449, 450, 360, 452, 362, 249, 471, - /* 600 */ 251, 457, 474, 459, 116, 8, 9, 463, 464, 12, - /* 610 */ 13, 14, 15, 16, 249, 408, 400, 142, 143, 471, - /* 620 */ 492, 493, 474, 388, 22, 497, 498, 77, 359, 360, - /* 630 */ 486, 359, 360, 1, 2, 400, 366, 402, 447, 37, - /* 640 */ 492, 493, 359, 360, 388, 497, 498, 347, 379, 174, - /* 650 */ 175, 379, 205, 103, 176, 208, 181, 182, 211, 403, - /* 660 */ 213, 391, 466, 467, 468, 469, 0, 471, 472, 359, - /* 670 */ 360, 196, 455, 198, 439, 458, 347, 442, 198, 77, - /* 680 */ 445, 446, 447, 448, 449, 450, 388, 452, 174, 379, - /* 690 */ 388, 408, 457, 395, 459, 56, 57, 395, 463, 464, - /* 700 */ 400, 403, 228, 228, 229, 403, 231, 232, 233, 234, - /* 710 */ 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - /* 720 */ 245, 246, 247, 248, 12, 13, 14, 347, 380, 400, - /* 730 */ 4, 387, 20, 50, 22, 77, 388, 359, 360, 107, - /* 740 */ 360, 0, 362, 399, 396, 19, 196, 35, 198, 37, - /* 750 */ 276, 277, 278, 279, 280, 281, 282, 379, 8, 9, - /* 760 */ 368, 35, 12, 13, 14, 15, 16, 380, 388, 77, - /* 770 */ 64, 14, 15, 16, 34, 388, 64, 51, 228, 229, - /* 780 */ 400, 2, 402, 396, 58, 188, 394, 8, 9, 77, - /* 790 */ 64, 12, 13, 14, 15, 16, 366, 347, 444, 364, - /* 800 */ 365, 135, 136, 137, 138, 139, 140, 141, 364, 365, - /* 810 */ 360, 105, 362, 383, 108, 103, 359, 360, 106, 439, - /* 820 */ 347, 391, 442, 116, 470, 445, 446, 447, 448, 449, - /* 830 */ 450, 105, 452, 360, 108, 362, 379, 457, 388, 459, - /* 840 */ 20, 8, 9, 463, 464, 12, 13, 14, 15, 16, - /* 850 */ 400, 388, 402, 136, 142, 143, 14, 107, 395, 176, - /* 860 */ 0, 388, 20, 347, 8, 9, 403, 184, 12, 13, - /* 870 */ 14, 15, 16, 400, 389, 402, 135, 136, 137, 138, - /* 880 */ 139, 140, 141, 359, 360, 116, 174, 175, 291, 439, - /* 890 */ 0, 22, 442, 181, 182, 445, 446, 447, 448, 449, - /* 900 */ 450, 389, 452, 379, 373, 374, 37, 457, 196, 459, - /* 910 */ 198, 347, 439, 463, 464, 442, 400, 347, 445, 446, - /* 920 */ 447, 448, 449, 450, 347, 452, 209, 210, 423, 3, - /* 930 */ 457, 389, 459, 39, 40, 166, 463, 464, 359, 360, - /* 940 */ 228, 229, 52, 231, 232, 233, 234, 235, 236, 237, - /* 950 */ 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - /* 960 */ 248, 12, 13, 107, 400, 347, 423, 4, 423, 20, - /* 970 */ 400, 22, 103, 444, 380, 347, 471, 400, 360, 474, - /* 980 */ 362, 2, 388, 456, 35, 458, 37, 8, 9, 42, - /* 990 */ 396, 12, 13, 14, 15, 16, 176, 492, 493, 470, - /* 1000 */ 347, 33, 497, 498, 110, 111, 388, 113, 20, 176, - /* 1010 */ 423, 359, 360, 64, 471, 33, 471, 474, 400, 474, - /* 1020 */ 402, 161, 373, 374, 359, 360, 77, 45, 400, 135, - /* 1030 */ 170, 379, 456, 139, 458, 492, 493, 492, 493, 22, - /* 1040 */ 497, 498, 497, 498, 136, 137, 467, 468, 469, 141, - /* 1050 */ 471, 472, 103, 400, 37, 106, 347, 439, 471, 397, - /* 1060 */ 442, 474, 400, 445, 446, 447, 448, 449, 450, 360, - /* 1070 */ 452, 362, 347, 359, 360, 457, 347, 459, 20, 492, - /* 1080 */ 493, 463, 464, 389, 497, 498, 359, 360, 388, 388, - /* 1090 */ 429, 142, 143, 379, 8, 9, 347, 388, 12, 13, - /* 1100 */ 14, 15, 16, 403, 403, 33, 379, 359, 360, 400, - /* 1110 */ 347, 402, 347, 0, 347, 359, 360, 45, 359, 360, - /* 1120 */ 103, 359, 360, 174, 175, 400, 0, 379, 13, 400, - /* 1130 */ 181, 182, 467, 468, 469, 379, 471, 472, 379, 350, - /* 1140 */ 351, 379, 359, 360, 33, 196, 33, 198, 439, 400, - /* 1150 */ 397, 442, 37, 400, 445, 446, 447, 448, 449, 450, - /* 1160 */ 33, 452, 379, 400, 176, 400, 457, 400, 459, 47, - /* 1170 */ 48, 397, 463, 464, 400, 33, 381, 228, 229, 384, - /* 1180 */ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - /* 1190 */ 241, 242, 243, 244, 245, 246, 247, 248, 12, 13, - /* 1200 */ 375, 13, 347, 378, 263, 264, 20, 109, 22, 0, - /* 1210 */ 112, 264, 286, 109, 109, 360, 112, 112, 107, 109, - /* 1220 */ 0, 35, 112, 37, 212, 37, 214, 64, 33, 49, - /* 1230 */ 267, 22, 174, 37, 107, 347, 33, 33, 37, 33, - /* 1240 */ 13, 33, 22, 388, 142, 143, 33, 33, 360, 107, - /* 1250 */ 64, 33, 33, 1, 2, 400, 288, 402, 33, 389, - /* 1260 */ 377, 348, 413, 77, 37, 501, 490, 13, 363, 33, - /* 1270 */ 33, 108, 376, 77, 483, 33, 388, 33, 376, 33, - /* 1280 */ 33, 33, 33, 489, 422, 489, 106, 37, 400, 103, - /* 1290 */ 402, 37, 106, 489, 439, 388, 489, 442, 363, 413, - /* 1300 */ 445, 446, 447, 448, 449, 450, 358, 452, 399, 473, - /* 1310 */ 107, 107, 457, 107, 459, 107, 360, 413, 463, 464, - /* 1320 */ 107, 107, 494, 465, 476, 107, 107, 439, 142, 143, - /* 1330 */ 442, 268, 107, 445, 446, 447, 448, 449, 450, 451, - /* 1340 */ 452, 453, 454, 107, 107, 424, 51, 18, 222, 107, - /* 1350 */ 42, 107, 23, 107, 107, 107, 107, 441, 440, 20, - /* 1360 */ 174, 175, 433, 211, 368, 438, 433, 181, 182, 40, - /* 1370 */ 41, 368, 194, 44, 20, 359, 426, 20, 360, 45, - /* 1380 */ 409, 20, 196, 54, 198, 413, 360, 409, 173, 406, - /* 1390 */ 359, 406, 360, 359, 65, 66, 67, 68, 409, 198, - /* 1400 */ 406, 104, 372, 102, 371, 359, 101, 370, 359, 359, - /* 1410 */ 359, 20, 352, 50, 228, 229, 352, 231, 232, 233, - /* 1420 */ 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - /* 1430 */ 244, 245, 246, 247, 248, 106, 12, 13, 356, 356, - /* 1440 */ 433, 368, 20, 402, 368, 20, 22, 20, 198, 361, - /* 1450 */ 425, 361, 368, 368, 20, 416, 359, 368, 352, 35, - /* 1460 */ 368, 37, 368, 388, 350, 388, 388, 388, 388, 388, - /* 1470 */ 350, 347, 215, 144, 400, 388, 359, 352, 106, 388, - /* 1480 */ 437, 388, 435, 388, 360, 290, 433, 388, 64, 366, - /* 1490 */ 202, 432, 201, 431, 366, 430, 400, 359, 200, 275, - /* 1500 */ 400, 77, 482, 402, 274, 482, 283, 347, 187, 400, - /* 1510 */ 481, 484, 388, 485, 285, 284, 413, 188, 189, 190, - /* 1520 */ 360, 413, 193, 479, 400, 480, 402, 103, 269, 264, - /* 1530 */ 418, 424, 292, 360, 418, 206, 207, 482, 347, 20, - /* 1540 */ 502, 266, 424, 495, 289, 287, 217, 116, 388, 220, - /* 1550 */ 496, 360, 223, 224, 225, 226, 227, 418, 361, 366, - /* 1560 */ 400, 400, 402, 439, 366, 444, 442, 400, 400, 445, - /* 1570 */ 446, 447, 448, 449, 450, 400, 452, 418, 179, 388, - /* 1580 */ 414, 457, 400, 459, 384, 106, 106, 463, 464, 400, - /* 1590 */ 378, 400, 366, 402, 265, 360, 477, 462, 366, 439, - /* 1600 */ 359, 22, 442, 347, 475, 445, 446, 447, 448, 449, - /* 1610 */ 450, 366, 452, 392, 38, 349, 360, 457, 434, 459, - /* 1620 */ 196, 353, 198, 463, 464, 352, 427, 345, 367, 419, - /* 1630 */ 439, 0, 0, 442, 0, 419, 445, 446, 447, 448, - /* 1640 */ 449, 450, 382, 452, 388, 382, 382, 45, 0, 37, - /* 1650 */ 459, 221, 228, 229, 463, 464, 400, 37, 402, 37, - /* 1660 */ 37, 221, 0, 37, 37, 241, 242, 243, 244, 245, - /* 1670 */ 246, 247, 221, 37, 0, 221, 0, 347, 37, 0, - /* 1680 */ 22, 0, 37, 216, 0, 204, 0, 204, 198, 205, - /* 1690 */ 360, 196, 0, 0, 0, 439, 192, 191, 442, 0, - /* 1700 */ 347, 445, 446, 447, 448, 449, 450, 0, 452, 147, - /* 1710 */ 49, 0, 49, 360, 37, 459, 51, 0, 388, 463, - /* 1720 */ 464, 49, 0, 45, 0, 0, 0, 0, 0, 49, - /* 1730 */ 400, 161, 402, 0, 0, 0, 0, 37, 0, 161, - /* 1740 */ 0, 388, 0, 0, 0, 0, 0, 0, 0, 0, - /* 1750 */ 0, 0, 0, 400, 0, 402, 0, 0, 0, 49, - /* 1760 */ 0, 0, 0, 45, 0, 0, 0, 0, 347, 439, - /* 1770 */ 0, 147, 442, 0, 146, 445, 446, 447, 448, 449, - /* 1780 */ 450, 360, 452, 347, 0, 22, 0, 145, 0, 459, - /* 1790 */ 22, 50, 439, 463, 464, 442, 360, 22, 445, 446, - /* 1800 */ 447, 448, 449, 450, 0, 452, 0, 0, 37, 388, - /* 1810 */ 0, 0, 0, 37, 42, 0, 0, 64, 37, 50, - /* 1820 */ 37, 400, 0, 402, 388, 51, 37, 42, 35, 42, - /* 1830 */ 33, 51, 14, 51, 42, 45, 400, 0, 402, 0, - /* 1840 */ 487, 488, 64, 64, 51, 49, 43, 49, 49, 347, - /* 1850 */ 42, 0, 59, 60, 61, 62, 0, 64, 187, 42, - /* 1860 */ 439, 0, 360, 442, 0, 0, 445, 446, 447, 448, - /* 1870 */ 449, 450, 49, 452, 0, 439, 71, 0, 442, 37, - /* 1880 */ 51, 445, 446, 447, 448, 449, 450, 42, 452, 0, - /* 1890 */ 388, 37, 51, 0, 42, 459, 37, 51, 105, 42, - /* 1900 */ 464, 108, 400, 0, 402, 37, 51, 0, 42, 0, - /* 1910 */ 0, 0, 0, 0, 347, 114, 37, 22, 0, 37, - /* 1920 */ 499, 500, 37, 37, 37, 112, 22, 360, 37, 347, - /* 1930 */ 0, 37, 33, 37, 37, 33, 22, 37, 37, 0, - /* 1940 */ 0, 439, 360, 37, 442, 22, 22, 445, 446, 447, - /* 1950 */ 448, 449, 450, 37, 452, 388, 0, 0, 53, 0, - /* 1960 */ 393, 0, 37, 37, 0, 22, 20, 400, 37, 402, - /* 1970 */ 388, 178, 179, 37, 37, 393, 107, 106, 185, 186, - /* 1980 */ 0, 106, 400, 0, 402, 347, 37, 22, 22, 0, - /* 1990 */ 488, 0, 183, 179, 203, 176, 176, 204, 360, 199, - /* 2000 */ 3, 176, 176, 33, 183, 107, 439, 270, 50, 442, - /* 2010 */ 50, 33, 445, 446, 447, 448, 449, 450, 33, 452, - /* 2020 */ 33, 439, 102, 106, 442, 106, 388, 445, 446, 447, - /* 2030 */ 448, 449, 450, 104, 452, 107, 33, 49, 400, 107, - /* 2040 */ 402, 106, 49, 3, 106, 33, 37, 106, 347, 107, - /* 2050 */ 106, 37, 107, 37, 107, 37, 37, 37, 107, 107, - /* 2060 */ 49, 360, 33, 347, 49, 270, 0, 0, 106, 42, - /* 2070 */ 107, 0, 270, 106, 42, 107, 360, 439, 347, 106, - /* 2080 */ 442, 106, 106, 445, 446, 447, 448, 449, 450, 388, - /* 2090 */ 452, 360, 115, 263, 49, 2, 106, 33, 104, 178, - /* 2100 */ 250, 400, 180, 402, 388, 104, 22, 107, 228, 393, - /* 2110 */ 106, 106, 49, 107, 106, 116, 400, 107, 402, 388, - /* 2120 */ 107, 49, 22, 106, 37, 37, 37, 106, 106, 491, - /* 2130 */ 107, 400, 106, 402, 37, 107, 106, 106, 230, 37, - /* 2140 */ 439, 347, 107, 442, 107, 106, 445, 446, 447, 448, - /* 2150 */ 449, 450, 37, 452, 360, 439, 107, 106, 442, 107, - /* 2160 */ 37, 445, 446, 447, 448, 449, 450, 106, 452, 127, - /* 2170 */ 439, 347, 33, 442, 127, 127, 445, 446, 447, 448, - /* 2180 */ 449, 450, 388, 452, 360, 454, 127, 393, 106, 106, - /* 2190 */ 37, 106, 22, 71, 400, 70, 402, 37, 1, 37, - /* 2200 */ 37, 500, 37, 37, 37, 37, 37, 77, 37, 100, - /* 2210 */ 33, 37, 388, 37, 22, 37, 19, 393, 37, 37, - /* 2220 */ 37, 77, 22, 37, 400, 37, 402, 37, 37, 0, - /* 2230 */ 37, 37, 35, 439, 0, 37, 442, 42, 51, 445, - /* 2240 */ 446, 447, 448, 449, 450, 37, 452, 51, 51, 42, - /* 2250 */ 0, 37, 51, 42, 0, 51, 59, 60, 61, 62, - /* 2260 */ 37, 64, 347, 439, 42, 0, 442, 37, 37, 445, - /* 2270 */ 446, 447, 448, 449, 450, 360, 452, 0, 22, 33, - /* 2280 */ 22, 21, 503, 22, 22, 21, 20, 503, 503, 503, - /* 2290 */ 503, 503, 503, 503, 503, 347, 503, 503, 503, 503, - /* 2300 */ 503, 503, 105, 388, 503, 108, 503, 503, 360, 503, - /* 2310 */ 503, 503, 503, 503, 503, 400, 503, 402, 347, 503, - /* 2320 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2330 */ 503, 360, 503, 347, 503, 503, 388, 140, 503, 503, - /* 2340 */ 503, 503, 503, 503, 503, 503, 360, 503, 400, 503, - /* 2350 */ 402, 503, 503, 503, 439, 503, 503, 442, 503, 388, - /* 2360 */ 445, 446, 447, 448, 449, 450, 503, 452, 503, 503, - /* 2370 */ 503, 400, 503, 402, 388, 178, 503, 503, 503, 503, - /* 2380 */ 503, 503, 185, 503, 503, 503, 400, 439, 402, 503, - /* 2390 */ 442, 503, 503, 445, 446, 447, 448, 449, 450, 503, - /* 2400 */ 452, 204, 503, 503, 503, 503, 503, 503, 503, 347, - /* 2410 */ 439, 503, 503, 442, 503, 503, 445, 446, 447, 448, - /* 2420 */ 449, 450, 360, 452, 347, 439, 503, 503, 442, 503, - /* 2430 */ 503, 445, 446, 447, 448, 449, 450, 360, 452, 347, - /* 2440 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2450 */ 388, 503, 360, 503, 503, 503, 503, 503, 503, 503, - /* 2460 */ 503, 503, 400, 503, 402, 388, 503, 503, 503, 503, - /* 2470 */ 503, 503, 503, 503, 503, 503, 503, 400, 503, 402, - /* 2480 */ 388, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2490 */ 503, 503, 400, 503, 402, 503, 503, 503, 503, 503, - /* 2500 */ 503, 439, 347, 503, 442, 503, 503, 445, 446, 447, - /* 2510 */ 448, 449, 450, 503, 452, 360, 439, 503, 503, 442, - /* 2520 */ 503, 503, 445, 446, 447, 448, 449, 450, 503, 452, - /* 2530 */ 503, 439, 347, 503, 442, 503, 503, 445, 446, 447, - /* 2540 */ 448, 449, 450, 388, 452, 360, 503, 503, 503, 503, - /* 2550 */ 503, 503, 503, 503, 503, 400, 503, 402, 503, 503, - /* 2560 */ 503, 503, 503, 503, 503, 347, 503, 503, 503, 503, - /* 2570 */ 503, 503, 503, 388, 503, 503, 503, 503, 360, 503, - /* 2580 */ 503, 503, 503, 503, 503, 400, 503, 402, 503, 503, - /* 2590 */ 503, 503, 503, 503, 439, 503, 503, 442, 503, 503, - /* 2600 */ 445, 446, 447, 448, 449, 450, 388, 452, 503, 503, - /* 2610 */ 503, 503, 503, 503, 503, 503, 503, 503, 400, 503, - /* 2620 */ 402, 503, 503, 503, 439, 503, 503, 442, 503, 503, - /* 2630 */ 445, 446, 447, 448, 449, 450, 503, 452, 503, 503, - /* 2640 */ 503, 503, 503, 347, 503, 503, 503, 503, 503, 503, - /* 2650 */ 503, 503, 503, 503, 503, 503, 360, 439, 503, 503, - /* 2660 */ 442, 503, 503, 445, 446, 447, 448, 449, 450, 503, - /* 2670 */ 452, 503, 503, 503, 503, 503, 503, 503, 503, 347, - /* 2680 */ 503, 503, 503, 503, 388, 503, 503, 503, 503, 503, - /* 2690 */ 503, 503, 360, 503, 503, 503, 400, 503, 402, 503, - /* 2700 */ 503, 503, 503, 503, 503, 503, 503, 503, 347, 503, - /* 2710 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2720 */ 388, 360, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2730 */ 503, 503, 400, 503, 402, 439, 503, 503, 442, 503, - /* 2740 */ 503, 445, 446, 447, 448, 449, 450, 503, 452, 388, - /* 2750 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2760 */ 503, 400, 503, 402, 503, 503, 503, 503, 503, 503, - /* 2770 */ 503, 439, 503, 347, 442, 503, 503, 445, 446, 447, - /* 2780 */ 448, 449, 450, 503, 452, 503, 360, 503, 503, 503, - /* 2790 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2800 */ 439, 503, 503, 442, 503, 503, 445, 446, 447, 448, - /* 2810 */ 449, 450, 503, 452, 388, 503, 503, 503, 503, 503, - /* 2820 */ 503, 503, 503, 503, 503, 503, 400, 503, 402, 503, - /* 2830 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2840 */ 347, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2850 */ 503, 503, 503, 360, 503, 503, 347, 503, 503, 503, - /* 2860 */ 503, 503, 503, 503, 503, 439, 503, 503, 442, 360, - /* 2870 */ 503, 445, 446, 447, 448, 449, 450, 503, 452, 503, - /* 2880 */ 503, 388, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2890 */ 503, 503, 503, 400, 503, 402, 503, 388, 503, 503, - /* 2900 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 400, - /* 2910 */ 503, 402, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2920 */ 503, 347, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2930 */ 503, 503, 439, 503, 360, 442, 503, 503, 445, 446, - /* 2940 */ 447, 448, 449, 450, 503, 452, 503, 503, 439, 503, - /* 2950 */ 347, 442, 503, 503, 445, 446, 447, 448, 449, 450, - /* 2960 */ 503, 452, 388, 360, 503, 503, 503, 503, 503, 503, - /* 2970 */ 503, 503, 503, 503, 400, 503, 402, 503, 503, 503, - /* 2980 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 2990 */ 503, 388, 503, 503, 503, 503, 503, 503, 503, 503, - /* 3000 */ 503, 503, 503, 400, 503, 402, 503, 503, 503, 503, - /* 3010 */ 503, 503, 503, 439, 503, 347, 442, 503, 503, 445, - /* 3020 */ 446, 447, 448, 449, 450, 503, 452, 503, 360, 503, - /* 3030 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 3040 */ 503, 503, 439, 503, 347, 442, 503, 503, 445, 446, - /* 3050 */ 447, 448, 449, 450, 503, 452, 388, 360, 503, 503, - /* 3060 */ 503, 503, 503, 503, 503, 503, 503, 503, 400, 503, - /* 3070 */ 402, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 3080 */ 347, 503, 503, 503, 503, 388, 503, 503, 503, 503, - /* 3090 */ 503, 503, 503, 360, 503, 503, 503, 400, 503, 402, - /* 3100 */ 503, 503, 503, 503, 503, 503, 503, 439, 503, 347, - /* 3110 */ 442, 503, 503, 445, 446, 447, 448, 449, 450, 503, - /* 3120 */ 452, 388, 360, 503, 503, 503, 503, 503, 503, 503, - /* 3130 */ 503, 503, 503, 400, 503, 402, 439, 503, 503, 442, - /* 3140 */ 503, 503, 445, 446, 447, 448, 449, 450, 503, 452, - /* 3150 */ 388, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 3160 */ 503, 503, 400, 503, 402, 503, 503, 503, 503, 503, - /* 3170 */ 503, 503, 439, 503, 503, 442, 503, 503, 445, 446, - /* 3180 */ 447, 448, 449, 450, 503, 452, 503, 503, 503, 503, - /* 3190 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - /* 3200 */ 503, 439, 503, 503, 442, 503, 503, 445, 446, 447, - /* 3210 */ 448, 449, 450, 503, 452, 344, 344, 344, 344, 344, - /* 3220 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3230 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3240 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3250 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3260 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3270 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3280 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3290 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3300 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3310 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3320 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3330 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3340 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3350 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3360 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3370 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3380 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3390 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3400 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3410 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3420 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3430 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3440 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3450 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3460 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3470 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3480 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3490 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3500 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3510 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3520 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3530 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3540 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, - /* 3550 */ 344, 344, 344, 344, 344, 344, 344, 344, 344, + /* 130 */ 94, 95, 96, 97, 98, 99, 355, 107, 440, 358, + /* 140 */ 359, 443, 142, 143, 446, 447, 448, 449, 450, 451, + /* 150 */ 401, 453, 424, 360, 361, 20, 458, 429, 460, 389, + /* 160 */ 107, 403, 464, 465, 468, 469, 470, 3, 472, 473, + /* 170 */ 370, 475, 360, 20, 174, 175, 418, 479, 378, 421, + /* 180 */ 422, 181, 182, 413, 20, 487, 389, 21, 106, 493, + /* 190 */ 494, 106, 106, 396, 498, 499, 196, 20, 198, 106, + /* 200 */ 472, 404, 36, 475, 38, 39, 40, 8, 9, 106, + /* 210 */ 106, 12, 13, 14, 15, 16, 176, 405, 406, 37, + /* 220 */ 408, 493, 494, 136, 412, 14, 498, 499, 228, 229, + /* 230 */ 230, 20, 232, 233, 234, 235, 236, 237, 238, 239, + /* 240 */ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + /* 250 */ 12, 13, 0, 360, 361, 18, 176, 20, 20, 77, + /* 260 */ 22, 468, 469, 470, 27, 472, 473, 30, 14, 70, + /* 270 */ 64, 107, 35, 35, 20, 37, 24, 25, 26, 27, + /* 280 */ 28, 29, 30, 31, 32, 72, 73, 74, 51, 69, + /* 290 */ 53, 4, 79, 80, 81, 58, 209, 210, 85, 195, + /* 300 */ 116, 197, 64, 90, 91, 92, 93, 0, 70, 96, + /* 310 */ 230, 105, 99, 114, 108, 77, 12, 13, 14, 15, + /* 320 */ 16, 8, 9, 348, 116, 12, 13, 14, 15, 16, + /* 330 */ 385, 227, 106, 46, 47, 48, 361, 180, 363, 356, + /* 340 */ 176, 103, 105, 360, 106, 362, 12, 13, 266, 403, + /* 350 */ 8, 9, 266, 116, 12, 13, 14, 15, 16, 266, + /* 360 */ 467, 468, 469, 470, 389, 472, 473, 421, 422, 266, + /* 370 */ 266, 37, 173, 356, 166, 33, 401, 360, 403, 362, + /* 380 */ 142, 143, 437, 146, 147, 174, 149, 150, 151, 152, + /* 390 */ 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + /* 400 */ 163, 164, 165, 20, 167, 168, 169, 230, 171, 172, + /* 410 */ 14, 14, 174, 175, 177, 440, 20, 20, 443, 181, + /* 420 */ 182, 446, 447, 448, 449, 450, 451, 20, 453, 272, + /* 430 */ 273, 274, 69, 458, 196, 460, 198, 39, 40, 464, + /* 440 */ 465, 230, 135, 136, 137, 138, 139, 140, 141, 107, + /* 450 */ 348, 20, 253, 254, 255, 256, 257, 258, 259, 260, + /* 460 */ 261, 262, 263, 361, 250, 348, 228, 229, 230, 424, + /* 470 */ 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + /* 480 */ 242, 243, 244, 245, 246, 247, 248, 249, 250, 12, + /* 490 */ 13, 389, 266, 369, 20, 388, 20, 20, 22, 22, + /* 500 */ 20, 188, 22, 401, 13, 403, 348, 400, 110, 111, + /* 510 */ 386, 113, 35, 37, 37, 2, 13, 472, 401, 395, + /* 520 */ 475, 8, 9, 348, 173, 12, 13, 14, 15, 16, + /* 530 */ 369, 55, 198, 135, 20, 55, 361, 139, 493, 494, + /* 540 */ 37, 64, 440, 498, 499, 443, 360, 70, 446, 447, + /* 550 */ 448, 449, 450, 451, 77, 453, 395, 228, 456, 401, + /* 560 */ 458, 459, 460, 77, 389, 0, 464, 465, 77, 86, + /* 570 */ 103, 174, 376, 142, 143, 379, 401, 348, 403, 348, + /* 580 */ 103, 174, 175, 106, 117, 118, 119, 120, 121, 122, + /* 590 */ 123, 124, 125, 126, 348, 128, 129, 130, 131, 132, + /* 600 */ 133, 134, 416, 417, 253, 292, 277, 278, 279, 280, + /* 610 */ 281, 282, 283, 230, 263, 440, 142, 143, 443, 142, + /* 620 */ 143, 446, 447, 448, 449, 450, 451, 230, 453, 390, + /* 630 */ 401, 148, 401, 458, 69, 460, 116, 8, 9, 464, + /* 640 */ 465, 12, 13, 14, 15, 16, 399, 401, 389, 402, + /* 650 */ 403, 174, 175, 170, 2, 181, 182, 13, 181, 182, + /* 660 */ 8, 9, 487, 389, 12, 13, 14, 15, 16, 35, + /* 670 */ 411, 390, 413, 196, 0, 198, 22, 389, 404, 360, + /* 680 */ 361, 37, 360, 361, 396, 51, 360, 361, 348, 51, + /* 690 */ 176, 37, 404, 59, 60, 61, 62, 59, 64, 380, + /* 700 */ 62, 63, 380, 348, 137, 228, 229, 230, 141, 232, + /* 710 */ 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + /* 720 */ 243, 244, 245, 246, 247, 248, 249, 12, 13, 14, + /* 730 */ 348, 360, 361, 367, 22, 20, 107, 22, 348, 105, + /* 740 */ 348, 401, 108, 361, 230, 363, 72, 73, 74, 37, + /* 750 */ 35, 380, 37, 79, 80, 81, 401, 103, 392, 85, + /* 760 */ 472, 348, 389, 475, 90, 91, 92, 93, 0, 396, + /* 770 */ 96, 389, 205, 99, 361, 208, 363, 404, 211, 64, + /* 780 */ 213, 493, 494, 401, 348, 403, 498, 499, 250, 77, + /* 790 */ 252, 401, 77, 401, 468, 469, 470, 348, 472, 473, + /* 800 */ 424, 33, 389, 8, 9, 429, 390, 12, 13, 14, + /* 810 */ 15, 16, 178, 179, 401, 103, 403, 390, 103, 185, + /* 820 */ 186, 106, 440, 360, 361, 443, 348, 348, 446, 447, + /* 830 */ 448, 449, 450, 451, 22, 453, 381, 401, 204, 361, + /* 840 */ 458, 377, 460, 380, 389, 430, 464, 465, 472, 37, + /* 850 */ 401, 475, 397, 440, 20, 391, 443, 142, 143, 446, + /* 860 */ 447, 448, 449, 450, 451, 401, 453, 389, 381, 493, + /* 870 */ 494, 458, 33, 460, 498, 499, 389, 464, 465, 401, + /* 880 */ 401, 403, 20, 445, 397, 348, 50, 8, 9, 174, + /* 890 */ 175, 12, 13, 14, 15, 16, 181, 182, 0, 135, + /* 900 */ 136, 137, 138, 139, 140, 141, 390, 443, 196, 471, + /* 910 */ 198, 196, 378, 198, 457, 103, 459, 453, 440, 360, + /* 920 */ 361, 443, 360, 361, 446, 447, 448, 449, 450, 451, + /* 930 */ 452, 453, 454, 455, 3, 360, 361, 0, 401, 380, + /* 940 */ 228, 229, 380, 228, 229, 230, 107, 232, 233, 234, + /* 950 */ 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + /* 960 */ 245, 246, 247, 248, 249, 12, 13, 22, 348, 360, + /* 970 */ 361, 4, 389, 20, 349, 22, 424, 381, 424, 396, + /* 980 */ 389, 361, 37, 363, 409, 389, 19, 404, 35, 380, + /* 990 */ 37, 348, 389, 397, 367, 404, 360, 361, 20, 396, + /* 1000 */ 360, 361, 35, 136, 137, 360, 361, 404, 141, 389, + /* 1010 */ 176, 384, 176, 191, 402, 403, 380, 64, 51, 392, + /* 1020 */ 184, 401, 77, 403, 472, 58, 472, 475, 135, 475, + /* 1030 */ 77, 64, 139, 135, 136, 137, 138, 139, 140, 141, + /* 1040 */ 218, 219, 42, 424, 401, 493, 494, 493, 494, 409, + /* 1050 */ 498, 499, 498, 499, 409, 176, 103, 360, 361, 106, + /* 1060 */ 440, 348, 348, 443, 230, 377, 446, 447, 448, 449, + /* 1070 */ 450, 451, 105, 453, 361, 108, 363, 380, 458, 391, + /* 1080 */ 460, 360, 361, 348, 464, 465, 360, 361, 457, 401, + /* 1090 */ 459, 472, 230, 348, 475, 142, 143, 4, 161, 374, + /* 1100 */ 375, 380, 389, 360, 361, 456, 380, 170, 459, 360, + /* 1110 */ 361, 33, 493, 494, 401, 401, 403, 498, 499, 348, + /* 1120 */ 360, 361, 389, 380, 0, 360, 361, 174, 175, 380, + /* 1130 */ 397, 443, 444, 0, 181, 182, 401, 360, 361, 445, + /* 1140 */ 380, 453, 1, 2, 377, 380, 401, 360, 361, 196, + /* 1150 */ 33, 198, 174, 440, 374, 375, 443, 380, 391, 446, + /* 1160 */ 447, 448, 449, 450, 451, 471, 453, 380, 401, 56, + /* 1170 */ 57, 458, 401, 460, 14, 15, 16, 464, 465, 365, + /* 1180 */ 366, 228, 229, 230, 51, 232, 233, 234, 235, 236, + /* 1190 */ 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + /* 1200 */ 247, 248, 249, 12, 13, 33, 348, 445, 230, 398, + /* 1210 */ 443, 20, 401, 22, 365, 366, 351, 352, 287, 361, + /* 1220 */ 453, 363, 398, 0, 398, 401, 35, 401, 37, 382, + /* 1230 */ 47, 48, 385, 471, 264, 265, 0, 33, 33, 109, + /* 1240 */ 109, 109, 112, 112, 112, 22, 64, 389, 107, 45, + /* 1250 */ 45, 109, 0, 0, 112, 64, 212, 33, 214, 401, + /* 1260 */ 70, 403, 33, 33, 33, 265, 414, 33, 77, 142, + /* 1270 */ 143, 33, 0, 33, 22, 22, 33, 33, 42, 107, + /* 1280 */ 1, 2, 33, 33, 33, 37, 49, 502, 33, 33, + /* 1290 */ 108, 106, 491, 13, 103, 33, 33, 106, 440, 348, + /* 1300 */ 115, 443, 33, 13, 446, 447, 448, 449, 450, 451, + /* 1310 */ 364, 453, 361, 37, 484, 37, 458, 37, 460, 12, + /* 1320 */ 13, 389, 464, 465, 52, 377, 377, 37, 414, 22, + /* 1330 */ 414, 107, 490, 142, 143, 490, 107, 107, 107, 364, + /* 1340 */ 389, 107, 35, 106, 37, 107, 222, 107, 423, 490, + /* 1350 */ 107, 107, 401, 490, 403, 77, 107, 107, 107, 361, + /* 1360 */ 359, 268, 107, 107, 414, 174, 175, 289, 400, 107, + /* 1370 */ 107, 64, 181, 182, 414, 414, 107, 474, 495, 466, + /* 1380 */ 269, 477, 379, 425, 77, 51, 442, 196, 42, 198, + /* 1390 */ 20, 440, 211, 441, 443, 439, 434, 446, 447, 448, + /* 1400 */ 449, 450, 451, 369, 453, 434, 369, 194, 291, 458, + /* 1410 */ 103, 460, 427, 20, 360, 464, 465, 20, 228, 228, + /* 1420 */ 229, 230, 361, 232, 233, 234, 235, 236, 237, 238, + /* 1430 */ 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + /* 1440 */ 249, 45, 18, 410, 361, 410, 198, 23, 173, 407, + /* 1450 */ 360, 410, 361, 407, 360, 407, 104, 373, 102, 372, + /* 1460 */ 360, 101, 360, 371, 40, 41, 360, 360, 44, 20, + /* 1470 */ 50, 353, 357, 353, 198, 20, 357, 434, 54, 369, + /* 1480 */ 403, 369, 20, 362, 348, 20, 426, 20, 362, 65, + /* 1490 */ 66, 67, 68, 417, 369, 438, 353, 361, 369, 360, + /* 1500 */ 353, 351, 401, 196, 369, 198, 369, 369, 360, 351, + /* 1510 */ 401, 389, 389, 215, 106, 401, 436, 389, 202, 434, + /* 1520 */ 201, 367, 433, 389, 367, 389, 200, 432, 431, 389, + /* 1530 */ 106, 360, 483, 389, 389, 228, 229, 401, 389, 403, + /* 1540 */ 389, 389, 389, 276, 284, 275, 483, 483, 486, 242, + /* 1550 */ 243, 244, 245, 246, 247, 248, 187, 401, 403, 485, + /* 1560 */ 286, 482, 285, 481, 270, 497, 480, 496, 144, 503, + /* 1570 */ 265, 425, 290, 288, 293, 361, 440, 20, 419, 443, + /* 1580 */ 419, 478, 446, 447, 448, 449, 450, 451, 425, 453, + /* 1590 */ 116, 267, 476, 367, 458, 362, 460, 419, 401, 367, + /* 1600 */ 464, 465, 401, 401, 401, 419, 179, 445, 401, 415, + /* 1610 */ 385, 106, 188, 189, 190, 106, 401, 193, 22, 361, + /* 1620 */ 393, 367, 38, 350, 367, 360, 367, 463, 428, 420, + /* 1630 */ 206, 207, 420, 435, 368, 346, 0, 354, 0, 353, + /* 1640 */ 0, 217, 45, 348, 220, 0, 37, 223, 224, 225, + /* 1650 */ 226, 227, 221, 37, 383, 37, 361, 37, 221, 0, + /* 1660 */ 37, 37, 221, 37, 0, 221, 0, 383, 37, 348, + /* 1670 */ 383, 0, 22, 0, 37, 216, 0, 204, 0, 204, + /* 1680 */ 198, 205, 361, 196, 389, 0, 0, 0, 192, 191, + /* 1690 */ 266, 0, 0, 147, 0, 49, 401, 49, 403, 37, + /* 1700 */ 51, 0, 49, 0, 0, 45, 0, 0, 0, 0, + /* 1710 */ 389, 37, 49, 0, 0, 0, 0, 161, 0, 161, + /* 1720 */ 0, 0, 401, 0, 403, 0, 0, 0, 0, 0, + /* 1730 */ 0, 0, 0, 0, 0, 440, 348, 49, 443, 0, + /* 1740 */ 0, 446, 447, 448, 449, 450, 451, 0, 453, 361, + /* 1750 */ 0, 0, 0, 458, 0, 460, 0, 45, 0, 464, + /* 1760 */ 465, 440, 0, 22, 443, 348, 0, 446, 447, 448, + /* 1770 */ 449, 450, 451, 0, 453, 147, 146, 389, 361, 0, + /* 1780 */ 145, 460, 0, 0, 0, 464, 465, 22, 50, 401, + /* 1790 */ 22, 403, 50, 0, 37, 0, 0, 0, 37, 64, + /* 1800 */ 64, 42, 0, 0, 51, 42, 389, 64, 37, 37, + /* 1810 */ 0, 51, 42, 37, 0, 51, 49, 42, 401, 45, + /* 1820 */ 403, 33, 14, 0, 43, 0, 49, 49, 440, 42, + /* 1830 */ 0, 443, 0, 348, 446, 447, 448, 449, 450, 451, + /* 1840 */ 42, 453, 187, 0, 0, 0, 361, 0, 460, 49, + /* 1850 */ 0, 71, 464, 465, 37, 1, 51, 440, 42, 0, + /* 1860 */ 443, 37, 51, 446, 447, 448, 449, 450, 451, 42, + /* 1870 */ 453, 0, 37, 19, 389, 42, 0, 460, 37, 51, + /* 1880 */ 51, 464, 465, 0, 42, 0, 401, 0, 403, 35, + /* 1890 */ 0, 0, 0, 37, 22, 0, 22, 37, 348, 114, + /* 1900 */ 37, 112, 37, 37, 37, 51, 37, 37, 33, 0, + /* 1910 */ 37, 361, 33, 59, 60, 61, 62, 348, 64, 37, + /* 1920 */ 22, 37, 0, 37, 22, 440, 0, 22, 443, 0, + /* 1930 */ 361, 446, 447, 448, 449, 450, 451, 37, 453, 389, + /* 1940 */ 37, 53, 0, 0, 0, 37, 0, 22, 20, 37, + /* 1950 */ 37, 401, 37, 403, 0, 107, 37, 106, 389, 105, + /* 1960 */ 22, 106, 108, 0, 0, 0, 176, 22, 199, 3, + /* 1970 */ 401, 179, 403, 488, 489, 176, 271, 176, 3, 49, + /* 1980 */ 33, 50, 176, 106, 50, 107, 106, 183, 107, 203, + /* 1990 */ 440, 102, 348, 443, 140, 183, 446, 447, 448, 449, + /* 2000 */ 450, 451, 33, 453, 33, 361, 107, 106, 104, 440, + /* 2010 */ 33, 49, 443, 106, 33, 446, 447, 448, 449, 450, + /* 2020 */ 451, 107, 453, 106, 33, 37, 106, 37, 107, 460, + /* 2030 */ 107, 37, 178, 389, 465, 37, 37, 37, 49, 185, + /* 2040 */ 107, 33, 107, 0, 49, 401, 42, 403, 0, 0, + /* 2050 */ 500, 501, 42, 33, 106, 106, 115, 107, 204, 348, + /* 2060 */ 107, 106, 271, 106, 106, 271, 106, 49, 2, 251, + /* 2070 */ 49, 178, 361, 264, 180, 22, 104, 104, 49, 22, + /* 2080 */ 228, 107, 106, 116, 440, 348, 106, 443, 231, 107, + /* 2090 */ 446, 447, 448, 449, 450, 451, 37, 453, 361, 106, + /* 2100 */ 389, 37, 37, 107, 107, 394, 37, 106, 106, 106, + /* 2110 */ 127, 106, 401, 107, 403, 37, 107, 106, 37, 107, + /* 2120 */ 106, 37, 107, 106, 33, 106, 389, 37, 22, 107, + /* 2130 */ 107, 394, 106, 489, 127, 37, 106, 106, 401, 106, + /* 2140 */ 403, 71, 70, 127, 37, 37, 37, 37, 37, 37, + /* 2150 */ 37, 440, 127, 37, 443, 348, 77, 446, 447, 448, + /* 2160 */ 449, 450, 451, 100, 453, 77, 33, 100, 361, 37, + /* 2170 */ 22, 37, 37, 37, 37, 37, 77, 440, 37, 37, + /* 2180 */ 443, 37, 348, 446, 447, 448, 449, 450, 451, 37, + /* 2190 */ 453, 37, 22, 0, 37, 361, 389, 37, 51, 0, + /* 2200 */ 42, 37, 51, 42, 0, 37, 51, 42, 401, 0, + /* 2210 */ 403, 37, 0, 51, 42, 37, 37, 0, 22, 33, + /* 2220 */ 22, 21, 21, 389, 22, 22, 20, 504, 504, 504, + /* 2230 */ 504, 504, 504, 504, 504, 401, 504, 403, 504, 504, + /* 2240 */ 504, 504, 504, 504, 504, 504, 504, 440, 504, 504, + /* 2250 */ 443, 504, 504, 446, 447, 448, 449, 450, 451, 504, + /* 2260 */ 453, 504, 504, 504, 504, 504, 348, 504, 504, 504, + /* 2270 */ 504, 504, 504, 504, 440, 504, 504, 443, 504, 361, + /* 2280 */ 446, 447, 448, 449, 450, 451, 504, 453, 348, 504, + /* 2290 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 492, + /* 2300 */ 504, 361, 504, 504, 504, 504, 504, 389, 504, 504, + /* 2310 */ 504, 504, 394, 504, 504, 504, 504, 504, 504, 401, + /* 2320 */ 504, 403, 504, 504, 504, 504, 504, 504, 504, 389, + /* 2330 */ 504, 504, 504, 504, 504, 501, 504, 504, 504, 504, + /* 2340 */ 504, 401, 504, 403, 504, 504, 504, 504, 504, 504, + /* 2350 */ 504, 504, 504, 504, 504, 504, 504, 504, 440, 504, + /* 2360 */ 504, 443, 504, 504, 446, 447, 448, 449, 450, 451, + /* 2370 */ 504, 453, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2380 */ 440, 504, 504, 443, 504, 504, 446, 447, 448, 449, + /* 2390 */ 450, 451, 504, 453, 348, 455, 504, 504, 504, 504, + /* 2400 */ 504, 504, 504, 504, 504, 504, 504, 361, 504, 504, + /* 2410 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2420 */ 504, 348, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2430 */ 504, 504, 504, 504, 361, 389, 504, 504, 504, 504, + /* 2440 */ 394, 504, 504, 504, 504, 504, 504, 401, 504, 403, + /* 2450 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2460 */ 504, 504, 389, 504, 504, 504, 504, 394, 504, 504, + /* 2470 */ 504, 504, 504, 504, 401, 504, 403, 504, 504, 504, + /* 2480 */ 504, 504, 504, 504, 504, 504, 440, 348, 504, 443, + /* 2490 */ 504, 504, 446, 447, 448, 449, 450, 451, 504, 453, + /* 2500 */ 361, 504, 504, 504, 348, 504, 504, 504, 504, 504, + /* 2510 */ 504, 504, 504, 440, 504, 504, 443, 361, 504, 446, + /* 2520 */ 447, 448, 449, 450, 451, 504, 453, 504, 389, 504, + /* 2530 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2540 */ 401, 504, 403, 504, 504, 389, 504, 504, 504, 504, + /* 2550 */ 504, 504, 504, 504, 504, 504, 504, 401, 504, 403, + /* 2560 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2570 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 440, + /* 2580 */ 504, 504, 443, 504, 348, 446, 447, 448, 449, 450, + /* 2590 */ 451, 504, 453, 504, 504, 504, 440, 361, 504, 443, + /* 2600 */ 504, 504, 446, 447, 448, 449, 450, 451, 504, 453, + /* 2610 */ 504, 504, 504, 504, 504, 348, 504, 504, 504, 504, + /* 2620 */ 504, 504, 504, 504, 504, 389, 504, 504, 361, 504, + /* 2630 */ 504, 504, 504, 504, 504, 504, 504, 401, 504, 403, + /* 2640 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2650 */ 348, 504, 504, 504, 504, 504, 389, 504, 504, 504, + /* 2660 */ 504, 504, 504, 361, 504, 504, 504, 504, 401, 504, + /* 2670 */ 403, 504, 504, 504, 504, 504, 440, 504, 504, 443, + /* 2680 */ 504, 504, 446, 447, 448, 449, 450, 451, 504, 453, + /* 2690 */ 504, 389, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2700 */ 504, 504, 504, 401, 504, 403, 504, 440, 504, 504, + /* 2710 */ 443, 504, 504, 446, 447, 448, 449, 450, 451, 504, + /* 2720 */ 453, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2730 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2740 */ 504, 504, 440, 348, 504, 443, 504, 504, 446, 447, + /* 2750 */ 448, 449, 450, 451, 504, 453, 361, 504, 504, 504, + /* 2760 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2770 */ 348, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2780 */ 504, 504, 504, 361, 389, 504, 504, 504, 504, 504, + /* 2790 */ 504, 504, 504, 504, 504, 504, 401, 504, 403, 504, + /* 2800 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2810 */ 504, 389, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2820 */ 504, 504, 504, 401, 504, 403, 504, 504, 504, 504, + /* 2830 */ 504, 504, 504, 504, 504, 440, 348, 504, 443, 504, + /* 2840 */ 504, 446, 447, 448, 449, 450, 451, 504, 453, 361, + /* 2850 */ 504, 504, 504, 348, 504, 504, 504, 504, 504, 504, + /* 2860 */ 504, 504, 440, 504, 504, 443, 361, 504, 446, 447, + /* 2870 */ 448, 449, 450, 451, 504, 453, 504, 389, 504, 504, + /* 2880 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 401, + /* 2890 */ 504, 403, 504, 504, 389, 504, 504, 504, 504, 504, + /* 2900 */ 504, 504, 504, 504, 504, 504, 401, 504, 403, 504, + /* 2910 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 2920 */ 504, 504, 504, 504, 504, 504, 504, 504, 440, 504, + /* 2930 */ 504, 443, 504, 348, 446, 447, 448, 449, 450, 451, + /* 2940 */ 504, 453, 504, 504, 504, 440, 361, 504, 443, 504, + /* 2950 */ 504, 446, 447, 448, 449, 450, 451, 504, 453, 504, + /* 2960 */ 504, 504, 504, 504, 348, 504, 504, 504, 504, 504, + /* 2970 */ 504, 504, 504, 504, 389, 504, 504, 361, 504, 504, + /* 2980 */ 504, 504, 504, 504, 504, 504, 401, 504, 403, 504, + /* 2990 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 348, + /* 3000 */ 504, 504, 504, 504, 504, 389, 504, 504, 504, 504, + /* 3010 */ 504, 504, 361, 504, 504, 504, 504, 401, 504, 403, + /* 3020 */ 504, 504, 504, 504, 504, 440, 504, 504, 443, 504, + /* 3030 */ 504, 446, 447, 448, 449, 450, 451, 504, 453, 504, + /* 3040 */ 389, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3050 */ 504, 504, 401, 504, 403, 504, 440, 504, 504, 443, + /* 3060 */ 504, 504, 446, 447, 448, 449, 450, 451, 504, 453, + /* 3070 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3080 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3090 */ 504, 440, 348, 504, 443, 504, 504, 446, 447, 448, + /* 3100 */ 449, 450, 451, 504, 453, 361, 504, 504, 504, 504, + /* 3110 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 348, + /* 3120 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3130 */ 504, 504, 361, 389, 504, 504, 504, 504, 504, 504, + /* 3140 */ 504, 504, 504, 504, 504, 401, 504, 403, 504, 504, + /* 3150 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3160 */ 389, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3170 */ 504, 504, 401, 504, 403, 504, 504, 504, 504, 504, + /* 3180 */ 504, 504, 504, 504, 440, 348, 504, 443, 504, 504, + /* 3190 */ 446, 447, 448, 449, 450, 451, 504, 453, 361, 504, + /* 3200 */ 504, 504, 348, 504, 504, 504, 504, 504, 504, 504, + /* 3210 */ 504, 440, 504, 504, 443, 361, 504, 446, 447, 448, + /* 3220 */ 449, 450, 451, 504, 453, 504, 389, 504, 504, 504, + /* 3230 */ 504, 504, 504, 504, 504, 504, 504, 504, 401, 504, + /* 3240 */ 403, 504, 504, 389, 504, 504, 504, 504, 504, 504, + /* 3250 */ 504, 504, 504, 504, 504, 401, 504, 403, 504, 504, + /* 3260 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3270 */ 504, 504, 504, 504, 504, 504, 504, 440, 504, 504, + /* 3280 */ 443, 504, 348, 446, 447, 448, 449, 450, 451, 504, + /* 3290 */ 453, 504, 504, 504, 440, 361, 504, 443, 504, 504, + /* 3300 */ 446, 447, 448, 449, 450, 451, 504, 453, 504, 504, + /* 3310 */ 504, 504, 504, 348, 504, 504, 504, 504, 504, 504, + /* 3320 */ 504, 504, 504, 389, 504, 504, 361, 504, 504, 504, + /* 3330 */ 504, 504, 504, 504, 504, 401, 504, 403, 504, 504, + /* 3340 */ 504, 504, 504, 504, 504, 504, 504, 504, 348, 504, + /* 3350 */ 504, 504, 504, 504, 389, 504, 504, 504, 504, 504, + /* 3360 */ 504, 361, 504, 504, 504, 504, 401, 504, 403, 504, + /* 3370 */ 504, 504, 504, 504, 440, 504, 504, 443, 504, 504, + /* 3380 */ 446, 447, 448, 449, 450, 451, 504, 453, 504, 389, + /* 3390 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3400 */ 504, 401, 504, 403, 504, 440, 504, 504, 443, 504, + /* 3410 */ 504, 446, 447, 448, 449, 450, 451, 504, 453, 504, + /* 3420 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3430 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3440 */ 440, 348, 504, 443, 504, 504, 446, 447, 448, 449, + /* 3450 */ 450, 451, 504, 453, 361, 504, 504, 504, 504, 504, + /* 3460 */ 504, 504, 504, 504, 504, 504, 504, 504, 348, 504, + /* 3470 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3480 */ 504, 361, 389, 504, 504, 504, 504, 504, 504, 504, + /* 3490 */ 504, 504, 504, 504, 401, 504, 403, 504, 504, 504, + /* 3500 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 389, + /* 3510 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3520 */ 504, 401, 504, 403, 504, 504, 504, 504, 504, 504, + /* 3530 */ 504, 504, 504, 440, 348, 504, 443, 504, 504, 446, + /* 3540 */ 447, 448, 449, 450, 451, 504, 453, 361, 504, 504, + /* 3550 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3560 */ 440, 504, 504, 443, 504, 504, 446, 447, 448, 449, + /* 3570 */ 450, 451, 504, 453, 504, 389, 504, 504, 504, 504, + /* 3580 */ 504, 504, 504, 504, 504, 504, 504, 401, 504, 403, + /* 3590 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3600 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3610 */ 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + /* 3620 */ 504, 504, 504, 504, 504, 504, 440, 504, 504, 443, + /* 3630 */ 504, 504, 446, 447, 448, 449, 450, 451, 504, 453, + /* 3640 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3650 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3660 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3670 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3680 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3690 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3700 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3710 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3720 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3730 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3740 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3750 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3760 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3770 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3780 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3790 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3800 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3810 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3820 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3830 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3840 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3850 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3860 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3870 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3880 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3890 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3900 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3910 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3920 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3930 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3940 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3950 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3960 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3970 */ 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + /* 3980 */ 345, 345, 345, 345, 345, }; -#define YY_SHIFT_COUNT (819) +#define YY_SHIFT_COUNT (821) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2277) +#define YY_SHIFT_MAX (2217) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1329, 0, 237, 0, 475, 475, 475, 475, 475, 475, - /* 10 */ 475, 475, 475, 475, 475, 475, 712, 949, 949, 1186, - /* 20 */ 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, - /* 30 */ 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, - /* 40 */ 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, - /* 50 */ 949, 48, 119, 308, 80, 61, 159, 61, 80, 80, - /* 60 */ 61, 1424, 61, 236, 1424, 1424, 155, 61, 38, 163, - /* 70 */ 56, 56, 163, 490, 490, 49, 232, 52, 52, 56, - /* 80 */ 56, 56, 56, 56, 56, 56, 56, 56, 56, 361, - /* 90 */ 56, 56, 67, 38, 56, 56, 498, 38, 56, 56, - /* 100 */ 38, 56, 56, 38, 56, 38, 38, 38, 56, 460, - /* 110 */ 197, 197, 469, 54, 550, 550, 550, 550, 550, 550, - /* 120 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - /* 130 */ 550, 550, 550, 894, 255, 49, 232, 639, 639, 503, - /* 140 */ 478, 478, 478, 184, 349, 349, 503, 67, 488, 38, - /* 150 */ 38, 365, 38, 658, 38, 658, 658, 707, 692, 740, - /* 160 */ 199, 199, 199, 199, 199, 199, 199, 199, 2197, 434, - /* 170 */ 23, 268, 597, 474, 133, 169, 480, 480, 602, 602, - /* 180 */ 602, 395, 683, 602, 514, 82, 820, 1122, 842, 62, - /* 190 */ 988, 941, 947, 926, 941, 982, 963, 1058, 1063, 1295, - /* 200 */ 1308, 1339, 1152, 67, 1339, 67, 1178, 1354, 1357, 1334, - /* 210 */ 1361, 1357, 1334, 1215, 1354, 1357, 1354, 1334, 1215, 1215, - /* 220 */ 1297, 1301, 1354, 1305, 1354, 1354, 1354, 1391, 1363, 1391, - /* 230 */ 1363, 1339, 67, 1422, 67, 1425, 1427, 67, 1425, 67, - /* 240 */ 1434, 67, 67, 1354, 67, 1391, 38, 38, 38, 38, - /* 250 */ 38, 38, 38, 38, 38, 38, 38, 1354, 740, 740, - /* 260 */ 1391, 658, 658, 658, 1257, 1372, 1339, 460, 1288, 1291, - /* 270 */ 1422, 460, 1298, 1063, 1354, 1361, 1361, 658, 1224, 1230, - /* 280 */ 1224, 1230, 38, 1223, 1321, 1224, 1229, 1231, 1259, 1063, - /* 290 */ 1240, 1255, 1258, 1265, 1357, 1519, 1431, 1275, 1425, 460, - /* 300 */ 460, 1230, 658, 658, 658, 658, 1230, 658, 1399, 460, - /* 310 */ 707, 460, 1357, 1479, 1480, 658, 692, 1354, 460, 1579, - /* 320 */ 1576, 1391, 3215, 3215, 3215, 3215, 3215, 3215, 3215, 3215, - /* 330 */ 3215, 36, 1793, 65, 413, 726, 750, 856, 666, 779, - /* 340 */ 979, 833, 741, 1086, 1086, 1086, 1086, 1086, 1086, 1086, - /* 350 */ 1086, 1086, 79, 447, 424, 322, 322, 241, 356, 860, - /* 360 */ 706, 116, 869, 1017, 717, 908, 908, 757, 632, 186, - /* 370 */ 757, 757, 757, 410, 1126, 1111, 467, 1072, 769, 1113, - /* 380 */ 1098, 1104, 1105, 1110, 1115, 1188, 293, 1209, 1220, 1012, - /* 390 */ 1127, 1142, 1163, 1203, 1204, 1206, 1102, 968, 1195, 1208, - /* 400 */ 1213, 1214, 1218, 1219, 1225, 1252, 1236, 294, 1237, 1180, - /* 410 */ 1242, 1244, 1246, 1247, 1248, 1249, 324, 1201, 1250, 1227, - /* 420 */ 1254, 1196, 890, 1631, 1632, 1634, 1602, 1648, 1612, 1430, - /* 430 */ 1620, 1622, 1623, 1440, 1662, 1626, 1627, 1451, 1636, 1674, - /* 440 */ 1454, 1676, 1641, 1679, 1658, 1681, 1645, 1467, 1684, 1481, - /* 450 */ 1686, 1483, 1484, 1490, 1495, 1692, 1693, 1694, 1504, 1506, - /* 460 */ 1699, 1707, 1562, 1661, 1663, 1711, 1677, 1665, 1717, 1672, - /* 470 */ 1722, 1678, 1724, 1725, 1726, 1680, 1727, 1728, 1733, 1734, - /* 480 */ 1735, 1736, 1570, 1700, 1738, 1578, 1740, 1742, 1743, 1744, - /* 490 */ 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1754, 1756, - /* 500 */ 1757, 1758, 1710, 1760, 1718, 1761, 1762, 1764, 1765, 1766, - /* 510 */ 1767, 1763, 1770, 1624, 1773, 1628, 1784, 1642, 1786, 1788, - /* 520 */ 1768, 1741, 1775, 1769, 1804, 1753, 1771, 1806, 1778, 1807, - /* 530 */ 1779, 1810, 1811, 1776, 1774, 1772, 1812, 1781, 1780, 1785, - /* 540 */ 1815, 1783, 1782, 1787, 1816, 1789, 1822, 1790, 1792, 1797, - /* 550 */ 1796, 1798, 1818, 1799, 1837, 1803, 1808, 1839, 1851, 1856, - /* 560 */ 1817, 1671, 1861, 1796, 1823, 1864, 1865, 1805, 1874, 1877, - /* 570 */ 1842, 1829, 1845, 1889, 1854, 1841, 1852, 1893, 1859, 1846, - /* 580 */ 1857, 1903, 1868, 1855, 1866, 1907, 1909, 1910, 1911, 1912, - /* 590 */ 1913, 1801, 1813, 1879, 1895, 1918, 1882, 1885, 1886, 1887, - /* 600 */ 1891, 1894, 1896, 1897, 1899, 1902, 1900, 1901, 1904, 1906, - /* 610 */ 1930, 1914, 1939, 1923, 1905, 1940, 1924, 1916, 1956, 1957, - /* 620 */ 1959, 1925, 1961, 1926, 1964, 1943, 1946, 1931, 1936, 1937, - /* 630 */ 1869, 1871, 1980, 1819, 1875, 1791, 1949, 1965, 1983, 1800, - /* 640 */ 1966, 1820, 1814, 1989, 1991, 1825, 1809, 1826, 1821, 1997, - /* 650 */ 1970, 1737, 1917, 1898, 1919, 1958, 1929, 1960, 1920, 1928, - /* 660 */ 1978, 1985, 1932, 1935, 1938, 1941, 1942, 1987, 1988, 1993, - /* 670 */ 1944, 2003, 1795, 1945, 1947, 2040, 2012, 1802, 2009, 2014, - /* 680 */ 2016, 2018, 2019, 2020, 1951, 1952, 2011, 1830, 2029, 2015, - /* 690 */ 2066, 2067, 1962, 2027, 1967, 1963, 1968, 1973, 1975, 1922, - /* 700 */ 1976, 2071, 2032, 1921, 1990, 1977, 1796, 2045, 2064, 1994, - /* 710 */ 1850, 2001, 2093, 2084, 1880, 2004, 2000, 2005, 2006, 2008, - /* 720 */ 2010, 2063, 2017, 2021, 2072, 2013, 2100, 1908, 2022, 1999, - /* 730 */ 2023, 2087, 2088, 2026, 2028, 2089, 2030, 2035, 2097, 2031, - /* 740 */ 2037, 2102, 2039, 2049, 2115, 2051, 2052, 2123, 2061, 2042, - /* 750 */ 2047, 2048, 2059, 2082, 2139, 2083, 2153, 2085, 2139, 2139, - /* 760 */ 2170, 2122, 2125, 2160, 2162, 2163, 2165, 2166, 2167, 2168, - /* 770 */ 2169, 2171, 2130, 2109, 2177, 2174, 2176, 2178, 2192, 2181, - /* 780 */ 2182, 2183, 2144, 1899, 2186, 1902, 2188, 2190, 2191, 2193, - /* 790 */ 2200, 2194, 2229, 2198, 2187, 2195, 2234, 2208, 2196, 2207, - /* 800 */ 2250, 2214, 2201, 2211, 2254, 2223, 2204, 2222, 2265, 2230, - /* 810 */ 2231, 2277, 2256, 2246, 2258, 2260, 2261, 2262, 2264, 2266, + /* 0 */ 1424, 0, 238, 0, 477, 477, 477, 477, 477, 477, + /* 10 */ 477, 477, 477, 477, 477, 477, 715, 953, 953, 1191, + /* 20 */ 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, + /* 30 */ 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, + /* 40 */ 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, + /* 50 */ 953, 82, 93, 104, 85, 103, 226, 103, 85, 85, + /* 60 */ 103, 1307, 103, 237, 1307, 1307, 86, 103, 38, 474, + /* 70 */ 135, 135, 474, 287, 287, 407, 431, 254, 254, 177, + /* 80 */ 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + /* 90 */ 153, 135, 135, 220, 38, 135, 135, 38, 135, 135, + /* 100 */ 38, 135, 135, 38, 135, 38, 38, 38, 135, 363, + /* 110 */ 199, 199, 213, 54, 712, 712, 712, 712, 712, 712, + /* 120 */ 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + /* 130 */ 712, 712, 712, 398, 164, 407, 431, 1113, 1113, 182, + /* 140 */ 40, 40, 40, 565, 538, 538, 491, 182, 220, 184, + /* 150 */ 38, 38, 214, 38, 486, 38, 486, 486, 520, 73, + /* 160 */ 467, 467, 467, 467, 467, 467, 467, 467, 1854, 674, + /* 170 */ 23, 80, 313, 329, 476, 157, 211, 397, 334, 334, + /* 180 */ 514, 834, 945, 945, 945, 836, 945, 978, 480, 383, + /* 190 */ 1183, 396, 893, 383, 383, 862, 970, 1000, 931, 970, + /* 200 */ 1204, 1093, 491, 1111, 1334, 1346, 1370, 1181, 220, 1370, + /* 210 */ 220, 1213, 1393, 1397, 1396, 1397, 1396, 1275, 1393, 1397, + /* 220 */ 1393, 1396, 1275, 1275, 1352, 1356, 1393, 1360, 1393, 1393, + /* 230 */ 1393, 1449, 1420, 1449, 1420, 1370, 220, 1455, 220, 1462, + /* 240 */ 1465, 220, 1462, 220, 1467, 220, 220, 1393, 220, 1449, + /* 250 */ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + /* 260 */ 38, 1393, 73, 73, 1449, 486, 486, 486, 1298, 1408, + /* 270 */ 1370, 363, 1316, 1319, 1455, 363, 1326, 1111, 1393, 486, + /* 280 */ 1267, 1270, 1267, 1270, 1260, 1369, 1267, 1274, 1277, 1294, + /* 290 */ 1111, 1281, 1282, 1285, 1305, 1397, 1557, 1474, 1324, 1462, + /* 300 */ 363, 363, 1270, 486, 486, 486, 486, 1270, 486, 1427, + /* 310 */ 363, 520, 363, 1397, 1505, 1509, 486, 1393, 363, 1596, + /* 320 */ 1584, 1449, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, + /* 330 */ 3640, 36, 634, 252, 342, 967, 53, 629, 307, 513, + /* 340 */ 652, 879, 898, 795, 795, 795, 795, 795, 795, 795, + /* 350 */ 795, 795, 764, 567, 166, 304, 304, 638, 822, 937, + /* 360 */ 206, 483, 654, 812, 87, 867, 867, 1160, 1141, 351, + /* 370 */ 1160, 1160, 1160, 1133, 1124, 30, 1236, 1205, 208, 768, + /* 380 */ 1130, 1131, 1132, 1142, 503, 644, 1223, 1252, 1253, 1044, + /* 390 */ 839, 1172, 1182, 1224, 1229, 1230, 1127, 1078, 1117, 1231, + /* 400 */ 1234, 1238, 1240, 1243, 1244, 1279, 1249, 1190, 1250, 1237, + /* 410 */ 1251, 1255, 1256, 1262, 1263, 1269, 1185, 1248, 1276, 1280, + /* 420 */ 1290, 1278, 1272, 1636, 1638, 1640, 1597, 1645, 1609, 1431, + /* 430 */ 1616, 1618, 1620, 1437, 1659, 1623, 1624, 1441, 1626, 1664, + /* 440 */ 1444, 1666, 1631, 1671, 1650, 1673, 1637, 1459, 1676, 1473, + /* 450 */ 1678, 1475, 1476, 1482, 1487, 1685, 1686, 1687, 1496, 1498, + /* 460 */ 1691, 1692, 1546, 1646, 1648, 1694, 1662, 1649, 1701, 1653, + /* 470 */ 1703, 1660, 1704, 1706, 1707, 1663, 1708, 1709, 1713, 1714, + /* 480 */ 1715, 1716, 1556, 1674, 1718, 1558, 1720, 1721, 1723, 1725, + /* 490 */ 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1739, + /* 500 */ 1740, 1747, 1688, 1750, 1712, 1751, 1752, 1754, 1756, 1758, + /* 510 */ 1762, 1741, 1766, 1628, 1773, 1630, 1779, 1635, 1782, 1783, + /* 520 */ 1765, 1738, 1768, 1742, 1784, 1735, 1757, 1793, 1736, 1795, + /* 530 */ 1743, 1796, 1797, 1761, 1753, 1759, 1802, 1771, 1760, 1763, + /* 540 */ 1803, 1772, 1764, 1770, 1810, 1776, 1814, 1774, 1775, 1788, + /* 550 */ 1767, 1777, 1808, 1778, 1823, 1781, 1787, 1825, 1830, 1832, + /* 560 */ 1798, 1655, 1843, 1767, 1800, 1844, 1845, 1780, 1847, 1850, + /* 570 */ 1817, 1805, 1816, 1859, 1824, 1811, 1827, 1871, 1835, 1828, + /* 580 */ 1833, 1876, 1841, 1829, 1842, 1883, 1885, 1887, 1890, 1891, + /* 590 */ 1892, 1785, 1789, 1856, 1872, 1895, 1860, 1863, 1865, 1866, + /* 600 */ 1867, 1869, 1870, 1873, 1875, 1879, 1882, 1884, 1874, 1886, + /* 610 */ 1909, 1898, 1922, 1902, 1888, 1926, 1905, 1900, 1929, 1942, + /* 620 */ 1943, 1903, 1944, 1908, 1946, 1925, 1928, 1912, 1913, 1915, + /* 630 */ 1848, 1851, 1954, 1790, 1855, 1786, 1919, 1938, 1963, 1769, + /* 640 */ 1945, 1799, 1792, 1964, 1965, 1801, 1804, 1806, 1812, 1966, + /* 650 */ 1947, 1705, 1877, 1878, 1880, 1931, 1904, 1934, 1889, 1881, + /* 660 */ 1969, 1971, 1899, 1901, 1907, 1917, 1914, 1977, 1930, 1962, + /* 670 */ 1920, 1981, 1791, 1921, 1923, 1975, 1991, 1794, 1988, 1990, + /* 680 */ 1994, 1998, 1999, 2000, 1933, 1935, 1989, 1809, 2008, 1995, + /* 690 */ 2043, 2048, 1948, 2004, 1949, 1950, 1953, 1955, 1957, 1894, + /* 700 */ 1958, 2049, 2010, 1893, 1960, 1941, 1767, 2018, 2020, 1972, + /* 710 */ 1818, 1973, 2066, 2053, 1852, 1976, 1974, 1980, 1982, 1993, + /* 720 */ 1996, 2021, 2001, 2002, 2029, 1997, 2057, 1857, 2003, 1967, + /* 730 */ 2006, 2059, 2064, 2005, 2009, 2065, 2011, 2012, 2069, 2014, + /* 740 */ 2015, 2078, 2017, 2022, 2081, 2019, 2023, 2084, 2026, 1983, + /* 750 */ 2007, 2016, 2025, 2030, 2091, 2031, 2090, 2033, 2091, 2091, + /* 760 */ 2106, 2070, 2072, 2098, 2107, 2108, 2109, 2110, 2111, 2112, + /* 770 */ 2113, 2116, 2079, 2063, 2088, 2067, 2133, 2132, 2134, 2135, + /* 780 */ 2148, 2136, 2137, 2138, 2099, 1875, 2141, 1879, 2142, 2144, + /* 790 */ 2152, 2154, 2170, 2157, 2193, 2160, 2147, 2158, 2199, 2164, + /* 800 */ 2151, 2161, 2204, 2168, 2155, 2165, 2209, 2174, 2162, 2172, + /* 810 */ 2212, 2178, 2179, 2217, 2196, 2186, 2198, 2200, 2202, 2203, + /* 820 */ 2201, 2206, }; #define YY_REDUCE_COUNT (330) -#define YY_REDUCE_MIN (-468) -#define YY_REDUCE_MAX (2762) +#define YY_REDUCE_MIN (-469) +#define YY_REDUCE_MAX (3186) static const short yy_reduce_ofst[] = { - /* 0 */ -271, -301, -92, 144, 235, 380, 450, 473, 618, 709, - /* 10 */ 855, 1124, 1160, 1191, 1256, 1330, 888, 1353, 1421, 1436, - /* 20 */ 1502, 1567, 1582, 1638, 1701, 1716, 1731, 1794, 1824, 1915, - /* 30 */ 1948, 1971, 1986, 2062, 2077, 2092, 2155, 2185, 2218, 2296, - /* 40 */ 2332, 2361, 2426, 2493, 2509, 2574, 2603, 2668, 2697, 2733, - /* 50 */ 2762, -303, 128, 148, 196, 505, 543, 545, 579, 665, - /* 60 */ 587, 47, -468, -344, -302, -91, -466, -455, -362, -241, - /* 70 */ -358, -187, -151, -347, -150, -115, -25, -168, -13, -81, - /* 80 */ 57, 142, 269, -69, 207, 272, 310, 378, 283, -47, - /* 90 */ 457, 524, -323, 182, 652, 714, 191, 298, 727, 748, - /* 100 */ 348, 756, 759, 302, 762, 387, 463, 594, 783, 430, - /* 110 */ -421, -421, -360, -86, -240, 96, 153, 164, 216, 300, - /* 120 */ 329, 516, 564, 570, 577, 628, 653, 725, 729, 749, - /* 130 */ 763, 765, 767, 344, -38, -10, 156, 435, 444, 531, - /* 140 */ -38, 354, 529, 270, 527, 576, 649, 392, -206, 256, - /* 150 */ 700, 217, -283, 662, 701, 753, 774, 795, 825, 789, - /* 160 */ -389, -385, 485, 512, 542, 694, 870, 542, 661, 883, - /* 170 */ 913, 849, 764, 776, 905, 791, 896, 902, 794, 796, - /* 180 */ 804, 907, 862, 807, 907, 935, 886, 948, 956, 909, - /* 190 */ 904, 836, 836, 828, 836, 858, 848, 907, 921, 916, - /* 200 */ 918, 929, 927, 996, 933, 1003, 950, 1016, 1018, 971, - /* 210 */ 972, 1026, 978, 983, 1031, 1032, 1034, 989, 985, 994, - /* 220 */ 1030, 1033, 1046, 1037, 1049, 1050, 1051, 1060, 1082, 1064, - /* 230 */ 1083, 1007, 1073, 1041, 1076, 1088, 1025, 1084, 1090, 1085, - /* 240 */ 1039, 1089, 1092, 1097, 1094, 1106, 1075, 1077, 1078, 1079, - /* 250 */ 1080, 1081, 1087, 1091, 1093, 1095, 1099, 1117, 1114, 1120, - /* 260 */ 1125, 1074, 1096, 1100, 1043, 1047, 1053, 1123, 1059, 1062, - /* 270 */ 1101, 1128, 1065, 1107, 1138, 1103, 1108, 1109, 1020, 1112, - /* 280 */ 1023, 1116, 907, 1028, 1027, 1055, 1029, 1045, 1044, 1118, - /* 290 */ 1038, 1054, 1048, 836, 1173, 1121, 1119, 1129, 1197, 1193, - /* 300 */ 1198, 1139, 1161, 1167, 1168, 1175, 1159, 1182, 1166, 1226, - /* 310 */ 1200, 1232, 1235, 1135, 1221, 1189, 1212, 1241, 1245, 1266, - /* 320 */ 1268, 1273, 1199, 1184, 1210, 1216, 1260, 1263, 1264, 1261, - /* 330 */ 1282, + /* 0 */ -272, -302, 102, 175, -25, 382, 413, 620, 713, 858, + /* 10 */ 951, 1136, 1295, 1321, 1388, 1417, 478, 1485, 1550, 1569, + /* 20 */ 1644, 1711, 1737, 1807, 1834, 1918, 1940, 2046, 2073, 2139, + /* 30 */ 2156, 2236, 2267, 2302, 2395, 2422, 2488, 2505, 2585, 2616, + /* 40 */ 2651, 2744, 2771, 2837, 2854, 2934, 2965, 3000, 3093, 3120, + /* 50 */ 3186, -304, 288, 376, -107, 45, 552, 554, -207, 326, + /* 60 */ 619, 688, -469, -188, 464, 767, -467, -456, -363, -242, + /* 70 */ -359, -289, -54, -348, -219, 259, 247, -17, 17, -344, + /* 80 */ 319, 322, 371, 463, 575, 640, 559, 562, 609, 645, + /* 90 */ 186, 636, 697, 124, -203, 721, 726, 373, 743, 749, + /* 100 */ 455, 760, 765, 583, 777, 487, 603, 596, 787, 627, + /* 110 */ -422, -422, -200, -273, -251, 117, 158, 229, 231, 246, + /* 120 */ 340, 355, 390, 392, 436, 449, 479, 537, 643, 714, + /* 130 */ 735, 745, 771, 107, 438, -230, 612, 814, 849, 725, + /* 140 */ 438, 694, 762, 366, 457, 631, 196, 780, 161, -55, + /* 150 */ -389, 274, 649, 733, 811, 591, 824, 826, 847, 865, + /* 160 */ -386, -381, 239, 281, 416, 427, 516, 416, 415, 534, + /* 170 */ 625, 852, 785, 801, 946, 830, 932, 932, 948, 949, + /* 180 */ 914, 916, 842, 845, 859, 925, 863, 932, 975, 950, + /* 190 */ 1001, 998, 968, 960, 961, 932, 903, 903, 883, 903, + /* 200 */ 913, 904, 1003, 958, 944, 952, 962, 956, 1034, 971, + /* 210 */ 1037, 985, 1054, 1061, 1033, 1083, 1035, 1042, 1090, 1091, + /* 220 */ 1094, 1041, 1046, 1048, 1084, 1087, 1100, 1092, 1102, 1106, + /* 230 */ 1107, 1118, 1115, 1120, 1119, 1043, 1110, 1077, 1112, 1121, + /* 240 */ 1060, 1125, 1126, 1129, 1076, 1135, 1137, 1139, 1138, 1143, + /* 250 */ 1122, 1123, 1128, 1134, 1140, 1144, 1145, 1149, 1151, 1152, + /* 260 */ 1153, 1148, 1150, 1158, 1147, 1101, 1109, 1114, 1057, 1080, + /* 270 */ 1085, 1154, 1089, 1095, 1155, 1157, 1097, 1146, 1171, 1156, + /* 280 */ 1049, 1159, 1063, 1161, 1062, 1074, 1064, 1079, 1082, 1086, + /* 290 */ 1163, 1066, 1068, 1071, 903, 1214, 1162, 1103, 1116, 1233, + /* 300 */ 1226, 1232, 1178, 1197, 1201, 1202, 1203, 1186, 1207, 1194, + /* 310 */ 1254, 1225, 1257, 1258, 1164, 1227, 1215, 1265, 1259, 1273, + /* 320 */ 1283, 1286, 1200, 1198, 1209, 1212, 1271, 1284, 1287, 1266, + /* 330 */ 1289, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 10 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 20 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 30 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 40 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 50 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 60 */ 2170, 1841, 1841, 2133, 1841, 1841, 1841, 1841, 1841, 1841, - /* 70 */ 1841, 1841, 1841, 1841, 1841, 2140, 1841, 1841, 1841, 1841, - /* 80 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 90 */ 1841, 1841, 1937, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 100 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1935, - /* 110 */ 2364, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 120 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 130 */ 1841, 1841, 1841, 1841, 2376, 1841, 1841, 1911, 1911, 1841, - /* 140 */ 2376, 2376, 2376, 1935, 2336, 2336, 1841, 1937, 2204, 1841, - /* 150 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 2059, 1841, 1871, - /* 160 */ 1841, 1841, 1841, 1841, 2083, 1841, 1841, 1841, 2196, 1841, - /* 170 */ 1841, 2405, 2465, 1841, 1841, 2408, 1841, 1841, 1841, 1841, - /* 180 */ 1841, 1841, 1841, 1841, 1841, 1841, 2145, 1841, 1841, 2012, - /* 190 */ 2395, 2368, 2382, 2449, 2369, 2366, 2389, 1841, 2399, 1841, - /* 200 */ 2228, 1841, 2218, 1937, 1841, 1937, 2183, 2128, 1841, 2138, - /* 210 */ 1841, 1841, 2138, 2135, 1841, 1841, 1841, 2138, 2135, 2135, - /* 220 */ 2001, 1997, 1841, 1995, 1841, 1841, 1841, 1841, 1895, 1841, - /* 230 */ 1895, 1841, 1937, 1841, 1937, 1841, 1841, 1937, 1841, 1937, - /* 240 */ 1841, 1937, 1937, 1841, 1937, 1841, 1841, 1841, 1841, 1841, - /* 250 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 260 */ 1841, 1841, 1841, 1841, 2216, 2202, 1841, 1935, 2194, 2192, - /* 270 */ 1841, 1935, 2190, 2399, 1841, 1841, 1841, 1841, 2419, 2414, - /* 280 */ 2419, 2414, 1841, 2433, 2429, 2419, 2438, 2435, 2401, 2399, - /* 290 */ 2468, 2455, 2451, 2382, 1841, 1841, 2387, 2385, 1841, 1935, - /* 300 */ 1935, 2414, 1841, 1841, 1841, 1841, 2414, 1841, 1841, 1935, - /* 310 */ 1841, 1935, 1841, 1841, 2028, 1841, 1841, 1841, 1935, 1841, - /* 320 */ 1880, 1841, 2185, 2207, 2166, 2166, 2062, 2062, 2062, 1938, - /* 330 */ 1846, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 340 */ 1841, 1841, 1841, 2432, 2431, 2291, 1841, 2340, 2339, 2338, - /* 350 */ 2329, 2290, 2024, 1841, 1841, 2289, 2288, 1841, 1841, 1841, - /* 360 */ 1841, 1841, 1841, 1841, 1841, 2157, 2156, 2282, 1841, 1841, - /* 370 */ 2283, 2281, 2280, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 380 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 390 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 2452, 2456, 1841, - /* 400 */ 1841, 1841, 1841, 1841, 1841, 2365, 1841, 1841, 1841, 2264, - /* 410 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 420 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 430 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 440 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 450 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 460 */ 1841, 1841, 2134, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 470 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 480 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 490 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 500 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 510 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 2149, 1841, 1841, - /* 520 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 530 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 540 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1885, - /* 550 */ 2269, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 560 */ 1841, 1841, 1841, 2272, 1841, 1841, 1841, 1841, 1841, 1841, - /* 570 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 580 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 590 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 600 */ 1841, 1841, 1841, 1841, 1977, 1976, 1841, 1841, 1841, 1841, - /* 610 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 620 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 630 */ 2273, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 640 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 2448, - /* 650 */ 2402, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 660 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 2264, - /* 670 */ 1841, 2430, 1841, 1841, 2446, 1841, 2450, 1841, 1841, 1841, - /* 680 */ 1841, 1841, 1841, 1841, 2375, 2371, 1841, 1841, 2367, 1841, - /* 690 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 700 */ 1841, 1841, 1841, 1841, 1841, 1841, 2263, 1841, 2326, 1841, - /* 710 */ 1841, 1841, 2360, 1841, 1841, 2311, 1841, 1841, 1841, 1841, - /* 720 */ 1841, 1841, 1841, 1841, 1841, 2273, 1841, 2276, 1841, 1841, - /* 730 */ 1841, 1841, 1841, 2056, 1841, 1841, 1841, 1841, 1841, 1841, - /* 740 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 2040, - /* 750 */ 2038, 2037, 2036, 1841, 2069, 1841, 1841, 1841, 2065, 2064, - /* 760 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 770 */ 1841, 1841, 1841, 1841, 1956, 1841, 1841, 1841, 1841, 1841, - /* 780 */ 1841, 1841, 1841, 1948, 1841, 1947, 1841, 1841, 1841, 1841, - /* 790 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 800 */ 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, - /* 810 */ 1841, 1841, 1841, 1870, 1841, 1841, 1841, 1841, 1841, 1841, + /* 0 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 10 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 20 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 30 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 40 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 50 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 60 */ 2181, 1851, 1851, 2144, 1851, 1851, 1851, 1851, 1851, 1851, + /* 70 */ 1851, 1851, 1851, 1851, 1851, 2151, 1851, 1851, 1851, 1851, + /* 80 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 90 */ 1851, 1851, 1851, 1947, 1851, 1851, 1851, 1851, 1851, 1851, + /* 100 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1945, + /* 110 */ 2378, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 120 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 130 */ 1851, 1851, 1851, 1851, 2390, 1851, 1851, 1921, 1921, 1851, + /* 140 */ 2390, 2390, 2390, 1945, 2350, 2350, 1851, 1851, 1947, 2215, + /* 150 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 2070, 1881, + /* 160 */ 1851, 1851, 1851, 1851, 2094, 1851, 1851, 1851, 2207, 1851, + /* 170 */ 1851, 2419, 2479, 1851, 1851, 2422, 1851, 1851, 1851, 1851, + /* 180 */ 2156, 2409, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 190 */ 1851, 1851, 2023, 1851, 1851, 1851, 2382, 2396, 2463, 2383, + /* 200 */ 2380, 2403, 1851, 2413, 1851, 2239, 1851, 2229, 1947, 1851, + /* 210 */ 1947, 2194, 2139, 1851, 2149, 1851, 2149, 2146, 1851, 1851, + /* 220 */ 1851, 2149, 2146, 2146, 2012, 2008, 1851, 2006, 1851, 1851, + /* 230 */ 1851, 1851, 1905, 1851, 1905, 1851, 1947, 1851, 1947, 1851, + /* 240 */ 1851, 1947, 1851, 1947, 1851, 1947, 1947, 1851, 1947, 1851, + /* 250 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 260 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 2227, 2213, + /* 270 */ 1851, 1945, 2205, 2203, 1851, 1945, 2201, 2413, 1851, 1851, + /* 280 */ 2433, 2428, 2433, 2428, 2447, 2443, 2433, 2452, 2449, 2415, + /* 290 */ 2413, 2482, 2469, 2465, 2396, 1851, 1851, 2401, 2399, 1851, + /* 300 */ 1945, 1945, 2428, 1851, 1851, 1851, 1851, 2428, 1851, 1851, + /* 310 */ 1945, 1851, 1945, 1851, 1851, 2039, 1851, 1851, 1945, 1851, + /* 320 */ 1890, 1851, 2196, 2218, 2177, 2177, 2073, 2073, 2073, 1948, + /* 330 */ 1856, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 340 */ 1851, 1851, 1851, 2446, 2445, 2303, 1851, 2354, 2353, 2352, + /* 350 */ 2343, 2302, 2035, 1851, 1851, 2301, 2300, 1851, 1851, 1851, + /* 360 */ 1851, 1851, 1851, 1851, 1851, 2168, 2167, 2294, 1851, 1851, + /* 370 */ 2295, 2293, 2292, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 380 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 390 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 2466, 2470, 1851, + /* 400 */ 1851, 1851, 1851, 1851, 1851, 2379, 1851, 1851, 1851, 2275, + /* 410 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 420 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 430 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 440 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 450 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 460 */ 1851, 1851, 2145, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 470 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 480 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 490 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 500 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 510 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 2160, 1851, 1851, + /* 520 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 530 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 540 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1895, + /* 550 */ 2281, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 560 */ 1851, 1851, 1851, 2284, 1851, 1851, 1851, 1851, 1851, 1851, + /* 570 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 580 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 590 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 600 */ 1851, 1851, 1851, 1851, 1987, 1986, 1851, 1851, 1851, 1851, + /* 610 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 620 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 630 */ 2285, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 640 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 2462, + /* 650 */ 2416, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 660 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 2275, + /* 670 */ 1851, 2444, 1851, 1851, 2460, 1851, 2464, 1851, 1851, 1851, + /* 680 */ 1851, 1851, 1851, 1851, 2389, 2385, 1851, 1851, 2381, 1851, + /* 690 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 700 */ 1851, 1851, 1851, 1851, 1851, 1851, 2274, 1851, 2340, 1851, + /* 710 */ 1851, 1851, 2374, 1851, 1851, 2325, 1851, 1851, 1851, 1851, + /* 720 */ 1851, 1851, 1851, 1851, 1851, 2285, 1851, 2288, 1851, 1851, + /* 730 */ 1851, 1851, 1851, 2067, 1851, 1851, 1851, 1851, 1851, 1851, + /* 740 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 2051, + /* 750 */ 2049, 2048, 2047, 1851, 2080, 1851, 1851, 1851, 2076, 2075, + /* 760 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 770 */ 1851, 1851, 1851, 1851, 1851, 1851, 1966, 1851, 1851, 1851, + /* 780 */ 1851, 1851, 1851, 1851, 1851, 1958, 1851, 1957, 1851, 1851, + /* 790 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 800 */ 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, + /* 810 */ 1851, 1851, 1851, 1851, 1851, 1880, 1851, 1851, 1851, 1851, + /* 820 */ 1851, 1851, }; /********** End of lemon-generated parsing tables *****************************/ @@ -1580,7 +1324,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* BWLIMIT => nothing */ 0, /* START => nothing */ 0, /* TIMESTAMP => nothing */ - 293, /* END => ABORT */ + 294, /* END => ABORT */ 0, /* TABLE => nothing */ 0, /* NK_LP => nothing */ 0, /* NK_RP => nothing */ @@ -1706,6 +1450,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* INSERT => nothing */ 0, /* NULL => nothing */ 0, /* NK_QUESTION => nothing */ + 0, /* NK_ALIAS => nothing */ 0, /* NK_ARROW => nothing */ 0, /* ROWTS => nothing */ 0, /* QSTART => nothing */ @@ -1770,56 +1515,56 @@ static const YYCODETYPE yyFallback[] = { 0, /* ASC => nothing */ 0, /* NULLS => nothing */ 0, /* ABORT => nothing */ - 293, /* AFTER => ABORT */ - 293, /* ATTACH => ABORT */ - 293, /* BEFORE => ABORT */ - 293, /* BEGIN => ABORT */ - 293, /* BITAND => ABORT */ - 293, /* BITNOT => ABORT */ - 293, /* BITOR => ABORT */ - 293, /* BLOCKS => ABORT */ - 293, /* CHANGE => ABORT */ - 293, /* COMMA => ABORT */ - 293, /* CONCAT => ABORT */ - 293, /* CONFLICT => ABORT */ - 293, /* COPY => ABORT */ - 293, /* DEFERRED => ABORT */ - 293, /* DELIMITERS => ABORT */ - 293, /* DETACH => ABORT */ - 293, /* DIVIDE => ABORT */ - 293, /* DOT => ABORT */ - 293, /* EACH => ABORT */ - 293, /* FAIL => ABORT */ - 293, /* FILE => ABORT */ - 293, /* FOR => ABORT */ - 293, /* GLOB => ABORT */ - 293, /* ID => ABORT */ - 293, /* IMMEDIATE => ABORT */ - 293, /* IMPORT => ABORT */ - 293, /* INITIALLY => ABORT */ - 293, /* INSTEAD => ABORT */ - 293, /* ISNULL => ABORT */ - 293, /* KEY => ABORT */ - 293, /* MODULES => ABORT */ - 293, /* NK_BITNOT => ABORT */ - 293, /* NK_SEMI => ABORT */ - 293, /* NOTNULL => ABORT */ - 293, /* OF => ABORT */ - 293, /* PLUS => ABORT */ - 293, /* PRIVILEGE => ABORT */ - 293, /* RAISE => ABORT */ - 293, /* RESTRICT => ABORT */ - 293, /* ROW => ABORT */ - 293, /* SEMI => ABORT */ - 293, /* STAR => ABORT */ - 293, /* STATEMENT => ABORT */ - 293, /* STRICT => ABORT */ - 293, /* STRING => ABORT */ - 293, /* TIMES => ABORT */ - 293, /* VALUES => ABORT */ - 293, /* VARIABLE => ABORT */ - 293, /* VIEW => ABORT */ - 293, /* WAL => ABORT */ + 294, /* AFTER => ABORT */ + 294, /* ATTACH => ABORT */ + 294, /* BEFORE => ABORT */ + 294, /* BEGIN => ABORT */ + 294, /* BITAND => ABORT */ + 294, /* BITNOT => ABORT */ + 294, /* BITOR => ABORT */ + 294, /* BLOCKS => ABORT */ + 294, /* CHANGE => ABORT */ + 294, /* COMMA => ABORT */ + 294, /* CONCAT => ABORT */ + 294, /* CONFLICT => ABORT */ + 294, /* COPY => ABORT */ + 294, /* DEFERRED => ABORT */ + 294, /* DELIMITERS => ABORT */ + 294, /* DETACH => ABORT */ + 294, /* DIVIDE => ABORT */ + 294, /* DOT => ABORT */ + 294, /* EACH => ABORT */ + 294, /* FAIL => ABORT */ + 294, /* FILE => ABORT */ + 294, /* FOR => ABORT */ + 294, /* GLOB => ABORT */ + 294, /* ID => ABORT */ + 294, /* IMMEDIATE => ABORT */ + 294, /* IMPORT => ABORT */ + 294, /* INITIALLY => ABORT */ + 294, /* INSTEAD => ABORT */ + 294, /* ISNULL => ABORT */ + 294, /* KEY => ABORT */ + 294, /* MODULES => ABORT */ + 294, /* NK_BITNOT => ABORT */ + 294, /* NK_SEMI => ABORT */ + 294, /* NOTNULL => ABORT */ + 294, /* OF => ABORT */ + 294, /* PLUS => ABORT */ + 294, /* PRIVILEGE => ABORT */ + 294, /* RAISE => ABORT */ + 294, /* RESTRICT => ABORT */ + 294, /* ROW => ABORT */ + 294, /* SEMI => ABORT */ + 294, /* STAR => ABORT */ + 294, /* STATEMENT => ABORT */ + 294, /* STRICT => ABORT */ + 294, /* STRING => ABORT */ + 294, /* TIMES => ABORT */ + 294, /* VALUES => ABORT */ + 294, /* VARIABLE => ABORT */ + 294, /* VIEW => ABORT */ + 294, /* WAL => ABORT */ }; #endif /* YYFALLBACK */ @@ -1873,7 +1618,6 @@ typedef struct yyParser yyParser; #ifndef NDEBUG #include -#include static FILE *yyTraceFILE = 0; static char *yyTracePrompt = 0; #endif /* NDEBUG */ @@ -2138,279 +1882,280 @@ static const char *const yyTokenName[] = { /* 227 */ "INSERT", /* 228 */ "NULL", /* 229 */ "NK_QUESTION", - /* 230 */ "NK_ARROW", - /* 231 */ "ROWTS", - /* 232 */ "QSTART", - /* 233 */ "QEND", - /* 234 */ "QDURATION", - /* 235 */ "WSTART", - /* 236 */ "WEND", - /* 237 */ "WDURATION", - /* 238 */ "IROWTS", - /* 239 */ "ISFILLED", - /* 240 */ "CAST", - /* 241 */ "NOW", - /* 242 */ "TODAY", - /* 243 */ "TIMEZONE", - /* 244 */ "CLIENT_VERSION", - /* 245 */ "SERVER_VERSION", - /* 246 */ "SERVER_STATUS", - /* 247 */ "CURRENT_USER", - /* 248 */ "CASE", - /* 249 */ "WHEN", - /* 250 */ "THEN", - /* 251 */ "ELSE", - /* 252 */ "BETWEEN", - /* 253 */ "IS", - /* 254 */ "NK_LT", - /* 255 */ "NK_GT", - /* 256 */ "NK_LE", - /* 257 */ "NK_GE", - /* 258 */ "NK_NE", - /* 259 */ "MATCH", - /* 260 */ "NMATCH", - /* 261 */ "CONTAINS", - /* 262 */ "IN", - /* 263 */ "JOIN", - /* 264 */ "INNER", - /* 265 */ "SELECT", - /* 266 */ "NK_HINT", - /* 267 */ "DISTINCT", - /* 268 */ "WHERE", - /* 269 */ "PARTITION", - /* 270 */ "BY", - /* 271 */ "SESSION", - /* 272 */ "STATE_WINDOW", - /* 273 */ "EVENT_WINDOW", - /* 274 */ "SLIDING", - /* 275 */ "FILL", - /* 276 */ "VALUE", - /* 277 */ "VALUE_F", - /* 278 */ "NONE", - /* 279 */ "PREV", - /* 280 */ "NULL_F", - /* 281 */ "LINEAR", - /* 282 */ "NEXT", - /* 283 */ "HAVING", - /* 284 */ "RANGE", - /* 285 */ "EVERY", - /* 286 */ "ORDER", - /* 287 */ "SLIMIT", - /* 288 */ "SOFFSET", - /* 289 */ "LIMIT", - /* 290 */ "OFFSET", - /* 291 */ "ASC", - /* 292 */ "NULLS", - /* 293 */ "ABORT", - /* 294 */ "AFTER", - /* 295 */ "ATTACH", - /* 296 */ "BEFORE", - /* 297 */ "BEGIN", - /* 298 */ "BITAND", - /* 299 */ "BITNOT", - /* 300 */ "BITOR", - /* 301 */ "BLOCKS", - /* 302 */ "CHANGE", - /* 303 */ "COMMA", - /* 304 */ "CONCAT", - /* 305 */ "CONFLICT", - /* 306 */ "COPY", - /* 307 */ "DEFERRED", - /* 308 */ "DELIMITERS", - /* 309 */ "DETACH", - /* 310 */ "DIVIDE", - /* 311 */ "DOT", - /* 312 */ "EACH", - /* 313 */ "FAIL", - /* 314 */ "FILE", - /* 315 */ "FOR", - /* 316 */ "GLOB", - /* 317 */ "ID", - /* 318 */ "IMMEDIATE", - /* 319 */ "IMPORT", - /* 320 */ "INITIALLY", - /* 321 */ "INSTEAD", - /* 322 */ "ISNULL", - /* 323 */ "KEY", - /* 324 */ "MODULES", - /* 325 */ "NK_BITNOT", - /* 326 */ "NK_SEMI", - /* 327 */ "NOTNULL", - /* 328 */ "OF", - /* 329 */ "PLUS", - /* 330 */ "PRIVILEGE", - /* 331 */ "RAISE", - /* 332 */ "RESTRICT", - /* 333 */ "ROW", - /* 334 */ "SEMI", - /* 335 */ "STAR", - /* 336 */ "STATEMENT", - /* 337 */ "STRICT", - /* 338 */ "STRING", - /* 339 */ "TIMES", - /* 340 */ "VALUES", - /* 341 */ "VARIABLE", - /* 342 */ "VIEW", - /* 343 */ "WAL", - /* 344 */ "cmd", - /* 345 */ "account_options", - /* 346 */ "alter_account_options", - /* 347 */ "literal", - /* 348 */ "alter_account_option", - /* 349 */ "ip_range_list", - /* 350 */ "white_list", - /* 351 */ "white_list_opt", - /* 352 */ "user_name", - /* 353 */ "sysinfo_opt", - /* 354 */ "privileges", - /* 355 */ "priv_level", - /* 356 */ "with_opt", - /* 357 */ "priv_type_list", - /* 358 */ "priv_type", - /* 359 */ "db_name", - /* 360 */ "table_name", - /* 361 */ "topic_name", - /* 362 */ "search_condition", - /* 363 */ "dnode_endpoint", - /* 364 */ "force_opt", - /* 365 */ "unsafe_opt", - /* 366 */ "not_exists_opt", - /* 367 */ "db_options", - /* 368 */ "exists_opt", - /* 369 */ "alter_db_options", - /* 370 */ "speed_opt", - /* 371 */ "start_opt", - /* 372 */ "end_opt", - /* 373 */ "integer_list", - /* 374 */ "variable_list", - /* 375 */ "retention_list", - /* 376 */ "signed", - /* 377 */ "alter_db_option", - /* 378 */ "retention", - /* 379 */ "full_table_name", - /* 380 */ "column_def_list", - /* 381 */ "tags_def_opt", - /* 382 */ "table_options", - /* 383 */ "multi_create_clause", - /* 384 */ "tags_def", - /* 385 */ "multi_drop_clause", - /* 386 */ "alter_table_clause", - /* 387 */ "alter_table_options", - /* 388 */ "column_name", - /* 389 */ "type_name", - /* 390 */ "signed_literal", - /* 391 */ "create_subtable_clause", - /* 392 */ "specific_cols_opt", - /* 393 */ "expression_list", - /* 394 */ "drop_table_clause", - /* 395 */ "col_name_list", - /* 396 */ "column_def", - /* 397 */ "duration_list", - /* 398 */ "rollup_func_list", - /* 399 */ "alter_table_option", - /* 400 */ "duration_literal", - /* 401 */ "rollup_func_name", - /* 402 */ "function_name", - /* 403 */ "col_name", - /* 404 */ "db_kind_opt", - /* 405 */ "table_kind_db_name_cond_opt", - /* 406 */ "like_pattern_opt", - /* 407 */ "db_name_cond_opt", - /* 408 */ "table_name_cond", - /* 409 */ "from_db_opt", - /* 410 */ "tag_list_opt", - /* 411 */ "table_kind", - /* 412 */ "tag_item", - /* 413 */ "column_alias", - /* 414 */ "index_options", - /* 415 */ "full_index_name", - /* 416 */ "index_name", - /* 417 */ "func_list", - /* 418 */ "sliding_opt", - /* 419 */ "sma_stream_opt", - /* 420 */ "func", - /* 421 */ "sma_func_name", - /* 422 */ "with_meta", - /* 423 */ "query_or_subquery", - /* 424 */ "where_clause_opt", - /* 425 */ "cgroup_name", - /* 426 */ "analyze_opt", - /* 427 */ "explain_options", - /* 428 */ "insert_query", - /* 429 */ "or_replace_opt", - /* 430 */ "agg_func_opt", - /* 431 */ "bufsize_opt", - /* 432 */ "language_opt", - /* 433 */ "stream_name", - /* 434 */ "stream_options", - /* 435 */ "col_list_opt", - /* 436 */ "tag_def_or_ref_opt", - /* 437 */ "subtable_opt", - /* 438 */ "ignore_opt", - /* 439 */ "expression", - /* 440 */ "on_vgroup_id", - /* 441 */ "dnode_list", - /* 442 */ "literal_func", - /* 443 */ "literal_list", - /* 444 */ "table_alias", - /* 445 */ "expr_or_subquery", - /* 446 */ "pseudo_column", - /* 447 */ "column_reference", - /* 448 */ "function_expression", - /* 449 */ "case_when_expression", - /* 450 */ "star_func", - /* 451 */ "star_func_para_list", - /* 452 */ "noarg_func", - /* 453 */ "other_para_list", - /* 454 */ "star_func_para", - /* 455 */ "when_then_list", - /* 456 */ "case_when_else_opt", - /* 457 */ "common_expression", - /* 458 */ "when_then_expr", - /* 459 */ "predicate", - /* 460 */ "compare_op", - /* 461 */ "in_op", - /* 462 */ "in_predicate_value", - /* 463 */ "boolean_value_expression", - /* 464 */ "boolean_primary", - /* 465 */ "from_clause_opt", - /* 466 */ "table_reference_list", - /* 467 */ "table_reference", - /* 468 */ "table_primary", - /* 469 */ "joined_table", - /* 470 */ "alias_opt", - /* 471 */ "subquery", - /* 472 */ "parenthesized_joined_table", - /* 473 */ "join_type", - /* 474 */ "query_specification", - /* 475 */ "hint_list", - /* 476 */ "set_quantifier_opt", - /* 477 */ "tag_mode_opt", - /* 478 */ "select_list", - /* 479 */ "partition_by_clause_opt", - /* 480 */ "range_opt", - /* 481 */ "every_opt", - /* 482 */ "fill_opt", - /* 483 */ "twindow_clause_opt", - /* 484 */ "group_by_clause_opt", - /* 485 */ "having_clause_opt", - /* 486 */ "select_item", - /* 487 */ "partition_list", - /* 488 */ "partition_item", - /* 489 */ "interval_sliding_duration_literal", - /* 490 */ "fill_mode", - /* 491 */ "group_by_list", - /* 492 */ "query_expression", - /* 493 */ "query_simple", - /* 494 */ "order_by_clause_opt", - /* 495 */ "slimit_clause_opt", - /* 496 */ "limit_clause_opt", - /* 497 */ "union_query_expression", - /* 498 */ "query_simple_or_subquery", - /* 499 */ "sort_specification_list", - /* 500 */ "sort_specification", - /* 501 */ "ordering_specification_opt", - /* 502 */ "null_ordering_opt", + /* 230 */ "NK_ALIAS", + /* 231 */ "NK_ARROW", + /* 232 */ "ROWTS", + /* 233 */ "QSTART", + /* 234 */ "QEND", + /* 235 */ "QDURATION", + /* 236 */ "WSTART", + /* 237 */ "WEND", + /* 238 */ "WDURATION", + /* 239 */ "IROWTS", + /* 240 */ "ISFILLED", + /* 241 */ "CAST", + /* 242 */ "NOW", + /* 243 */ "TODAY", + /* 244 */ "TIMEZONE", + /* 245 */ "CLIENT_VERSION", + /* 246 */ "SERVER_VERSION", + /* 247 */ "SERVER_STATUS", + /* 248 */ "CURRENT_USER", + /* 249 */ "CASE", + /* 250 */ "WHEN", + /* 251 */ "THEN", + /* 252 */ "ELSE", + /* 253 */ "BETWEEN", + /* 254 */ "IS", + /* 255 */ "NK_LT", + /* 256 */ "NK_GT", + /* 257 */ "NK_LE", + /* 258 */ "NK_GE", + /* 259 */ "NK_NE", + /* 260 */ "MATCH", + /* 261 */ "NMATCH", + /* 262 */ "CONTAINS", + /* 263 */ "IN", + /* 264 */ "JOIN", + /* 265 */ "INNER", + /* 266 */ "SELECT", + /* 267 */ "NK_HINT", + /* 268 */ "DISTINCT", + /* 269 */ "WHERE", + /* 270 */ "PARTITION", + /* 271 */ "BY", + /* 272 */ "SESSION", + /* 273 */ "STATE_WINDOW", + /* 274 */ "EVENT_WINDOW", + /* 275 */ "SLIDING", + /* 276 */ "FILL", + /* 277 */ "VALUE", + /* 278 */ "VALUE_F", + /* 279 */ "NONE", + /* 280 */ "PREV", + /* 281 */ "NULL_F", + /* 282 */ "LINEAR", + /* 283 */ "NEXT", + /* 284 */ "HAVING", + /* 285 */ "RANGE", + /* 286 */ "EVERY", + /* 287 */ "ORDER", + /* 288 */ "SLIMIT", + /* 289 */ "SOFFSET", + /* 290 */ "LIMIT", + /* 291 */ "OFFSET", + /* 292 */ "ASC", + /* 293 */ "NULLS", + /* 294 */ "ABORT", + /* 295 */ "AFTER", + /* 296 */ "ATTACH", + /* 297 */ "BEFORE", + /* 298 */ "BEGIN", + /* 299 */ "BITAND", + /* 300 */ "BITNOT", + /* 301 */ "BITOR", + /* 302 */ "BLOCKS", + /* 303 */ "CHANGE", + /* 304 */ "COMMA", + /* 305 */ "CONCAT", + /* 306 */ "CONFLICT", + /* 307 */ "COPY", + /* 308 */ "DEFERRED", + /* 309 */ "DELIMITERS", + /* 310 */ "DETACH", + /* 311 */ "DIVIDE", + /* 312 */ "DOT", + /* 313 */ "EACH", + /* 314 */ "FAIL", + /* 315 */ "FILE", + /* 316 */ "FOR", + /* 317 */ "GLOB", + /* 318 */ "ID", + /* 319 */ "IMMEDIATE", + /* 320 */ "IMPORT", + /* 321 */ "INITIALLY", + /* 322 */ "INSTEAD", + /* 323 */ "ISNULL", + /* 324 */ "KEY", + /* 325 */ "MODULES", + /* 326 */ "NK_BITNOT", + /* 327 */ "NK_SEMI", + /* 328 */ "NOTNULL", + /* 329 */ "OF", + /* 330 */ "PLUS", + /* 331 */ "PRIVILEGE", + /* 332 */ "RAISE", + /* 333 */ "RESTRICT", + /* 334 */ "ROW", + /* 335 */ "SEMI", + /* 336 */ "STAR", + /* 337 */ "STATEMENT", + /* 338 */ "STRICT", + /* 339 */ "STRING", + /* 340 */ "TIMES", + /* 341 */ "VALUES", + /* 342 */ "VARIABLE", + /* 343 */ "VIEW", + /* 344 */ "WAL", + /* 345 */ "cmd", + /* 346 */ "account_options", + /* 347 */ "alter_account_options", + /* 348 */ "literal", + /* 349 */ "alter_account_option", + /* 350 */ "ip_range_list", + /* 351 */ "white_list", + /* 352 */ "white_list_opt", + /* 353 */ "user_name", + /* 354 */ "sysinfo_opt", + /* 355 */ "privileges", + /* 356 */ "priv_level", + /* 357 */ "with_opt", + /* 358 */ "priv_type_list", + /* 359 */ "priv_type", + /* 360 */ "db_name", + /* 361 */ "table_name", + /* 362 */ "topic_name", + /* 363 */ "search_condition", + /* 364 */ "dnode_endpoint", + /* 365 */ "force_opt", + /* 366 */ "unsafe_opt", + /* 367 */ "not_exists_opt", + /* 368 */ "db_options", + /* 369 */ "exists_opt", + /* 370 */ "alter_db_options", + /* 371 */ "speed_opt", + /* 372 */ "start_opt", + /* 373 */ "end_opt", + /* 374 */ "integer_list", + /* 375 */ "variable_list", + /* 376 */ "retention_list", + /* 377 */ "signed", + /* 378 */ "alter_db_option", + /* 379 */ "retention", + /* 380 */ "full_table_name", + /* 381 */ "column_def_list", + /* 382 */ "tags_def_opt", + /* 383 */ "table_options", + /* 384 */ "multi_create_clause", + /* 385 */ "tags_def", + /* 386 */ "multi_drop_clause", + /* 387 */ "alter_table_clause", + /* 388 */ "alter_table_options", + /* 389 */ "column_name", + /* 390 */ "type_name", + /* 391 */ "signed_literal", + /* 392 */ "create_subtable_clause", + /* 393 */ "specific_cols_opt", + /* 394 */ "expression_list", + /* 395 */ "drop_table_clause", + /* 396 */ "col_name_list", + /* 397 */ "column_def", + /* 398 */ "duration_list", + /* 399 */ "rollup_func_list", + /* 400 */ "alter_table_option", + /* 401 */ "duration_literal", + /* 402 */ "rollup_func_name", + /* 403 */ "function_name", + /* 404 */ "col_name", + /* 405 */ "db_kind_opt", + /* 406 */ "table_kind_db_name_cond_opt", + /* 407 */ "like_pattern_opt", + /* 408 */ "db_name_cond_opt", + /* 409 */ "table_name_cond", + /* 410 */ "from_db_opt", + /* 411 */ "tag_list_opt", + /* 412 */ "table_kind", + /* 413 */ "tag_item", + /* 414 */ "column_alias", + /* 415 */ "index_options", + /* 416 */ "full_index_name", + /* 417 */ "index_name", + /* 418 */ "func_list", + /* 419 */ "sliding_opt", + /* 420 */ "sma_stream_opt", + /* 421 */ "func", + /* 422 */ "sma_func_name", + /* 423 */ "with_meta", + /* 424 */ "query_or_subquery", + /* 425 */ "where_clause_opt", + /* 426 */ "cgroup_name", + /* 427 */ "analyze_opt", + /* 428 */ "explain_options", + /* 429 */ "insert_query", + /* 430 */ "or_replace_opt", + /* 431 */ "agg_func_opt", + /* 432 */ "bufsize_opt", + /* 433 */ "language_opt", + /* 434 */ "stream_name", + /* 435 */ "stream_options", + /* 436 */ "col_list_opt", + /* 437 */ "tag_def_or_ref_opt", + /* 438 */ "subtable_opt", + /* 439 */ "ignore_opt", + /* 440 */ "expression", + /* 441 */ "on_vgroup_id", + /* 442 */ "dnode_list", + /* 443 */ "literal_func", + /* 444 */ "literal_list", + /* 445 */ "table_alias", + /* 446 */ "expr_or_subquery", + /* 447 */ "pseudo_column", + /* 448 */ "column_reference", + /* 449 */ "function_expression", + /* 450 */ "case_when_expression", + /* 451 */ "star_func", + /* 452 */ "star_func_para_list", + /* 453 */ "noarg_func", + /* 454 */ "other_para_list", + /* 455 */ "star_func_para", + /* 456 */ "when_then_list", + /* 457 */ "case_when_else_opt", + /* 458 */ "common_expression", + /* 459 */ "when_then_expr", + /* 460 */ "predicate", + /* 461 */ "compare_op", + /* 462 */ "in_op", + /* 463 */ "in_predicate_value", + /* 464 */ "boolean_value_expression", + /* 465 */ "boolean_primary", + /* 466 */ "from_clause_opt", + /* 467 */ "table_reference_list", + /* 468 */ "table_reference", + /* 469 */ "table_primary", + /* 470 */ "joined_table", + /* 471 */ "alias_opt", + /* 472 */ "subquery", + /* 473 */ "parenthesized_joined_table", + /* 474 */ "join_type", + /* 475 */ "query_specification", + /* 476 */ "hint_list", + /* 477 */ "set_quantifier_opt", + /* 478 */ "tag_mode_opt", + /* 479 */ "select_list", + /* 480 */ "partition_by_clause_opt", + /* 481 */ "range_opt", + /* 482 */ "every_opt", + /* 483 */ "fill_opt", + /* 484 */ "twindow_clause_opt", + /* 485 */ "group_by_clause_opt", + /* 486 */ "having_clause_opt", + /* 487 */ "select_item", + /* 488 */ "partition_list", + /* 489 */ "partition_item", + /* 490 */ "interval_sliding_duration_literal", + /* 491 */ "fill_mode", + /* 492 */ "group_by_list", + /* 493 */ "query_expression", + /* 494 */ "query_simple", + /* 495 */ "order_by_clause_opt", + /* 496 */ "slimit_clause_opt", + /* 497 */ "limit_clause_opt", + /* 498 */ "union_query_expression", + /* 499 */ "query_simple_or_subquery", + /* 500 */ "sort_specification_list", + /* 501 */ "sort_specification", + /* 502 */ "ordering_specification_opt", + /* 503 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -2569,482 +2314,486 @@ static const char *const yyRuleName[] = { /* 148 */ "retention_list ::= retention", /* 149 */ "retention_list ::= retention_list NK_COMMA retention", /* 150 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", - /* 151 */ "speed_opt ::=", - /* 152 */ "speed_opt ::= BWLIMIT NK_INTEGER", - /* 153 */ "start_opt ::=", - /* 154 */ "start_opt ::= START WITH NK_INTEGER", - /* 155 */ "start_opt ::= START WITH NK_STRING", - /* 156 */ "start_opt ::= START WITH TIMESTAMP NK_STRING", - /* 157 */ "end_opt ::=", - /* 158 */ "end_opt ::= END WITH NK_INTEGER", - /* 159 */ "end_opt ::= END WITH NK_STRING", - /* 160 */ "end_opt ::= END WITH TIMESTAMP NK_STRING", - /* 161 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", - /* 162 */ "cmd ::= CREATE TABLE multi_create_clause", - /* 163 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", - /* 164 */ "cmd ::= DROP TABLE multi_drop_clause", - /* 165 */ "cmd ::= DROP STABLE exists_opt full_table_name", - /* 166 */ "cmd ::= ALTER TABLE alter_table_clause", - /* 167 */ "cmd ::= ALTER STABLE alter_table_clause", - /* 168 */ "alter_table_clause ::= full_table_name alter_table_options", - /* 169 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", - /* 170 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", - /* 171 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", - /* 172 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", - /* 173 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", - /* 174 */ "alter_table_clause ::= full_table_name DROP TAG column_name", - /* 175 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", - /* 176 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", - /* 177 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", - /* 178 */ "multi_create_clause ::= create_subtable_clause", - /* 179 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", - /* 180 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options", - /* 181 */ "multi_drop_clause ::= drop_table_clause", - /* 182 */ "multi_drop_clause ::= multi_drop_clause NK_COMMA drop_table_clause", - /* 183 */ "drop_table_clause ::= exists_opt full_table_name", - /* 184 */ "specific_cols_opt ::=", - /* 185 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", - /* 186 */ "full_table_name ::= table_name", - /* 187 */ "full_table_name ::= db_name NK_DOT table_name", - /* 188 */ "column_def_list ::= column_def", - /* 189 */ "column_def_list ::= column_def_list NK_COMMA column_def", - /* 190 */ "column_def ::= column_name type_name", - /* 191 */ "type_name ::= BOOL", - /* 192 */ "type_name ::= TINYINT", - /* 193 */ "type_name ::= SMALLINT", - /* 194 */ "type_name ::= INT", - /* 195 */ "type_name ::= INTEGER", - /* 196 */ "type_name ::= BIGINT", - /* 197 */ "type_name ::= FLOAT", - /* 198 */ "type_name ::= DOUBLE", - /* 199 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", - /* 200 */ "type_name ::= TIMESTAMP", - /* 201 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", - /* 202 */ "type_name ::= TINYINT UNSIGNED", - /* 203 */ "type_name ::= SMALLINT UNSIGNED", - /* 204 */ "type_name ::= INT UNSIGNED", - /* 205 */ "type_name ::= BIGINT UNSIGNED", - /* 206 */ "type_name ::= JSON", - /* 207 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", - /* 208 */ "type_name ::= MEDIUMBLOB", - /* 209 */ "type_name ::= BLOB", - /* 210 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", - /* 211 */ "type_name ::= GEOMETRY NK_LP NK_INTEGER NK_RP", - /* 212 */ "type_name ::= DECIMAL", - /* 213 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", - /* 214 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", - /* 215 */ "tags_def_opt ::=", - /* 216 */ "tags_def_opt ::= tags_def", - /* 217 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", - /* 218 */ "table_options ::=", - /* 219 */ "table_options ::= table_options COMMENT NK_STRING", - /* 220 */ "table_options ::= table_options MAX_DELAY duration_list", - /* 221 */ "table_options ::= table_options WATERMARK duration_list", - /* 222 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", - /* 223 */ "table_options ::= table_options TTL NK_INTEGER", - /* 224 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", - /* 225 */ "table_options ::= table_options DELETE_MARK duration_list", - /* 226 */ "alter_table_options ::= alter_table_option", - /* 227 */ "alter_table_options ::= alter_table_options alter_table_option", - /* 228 */ "alter_table_option ::= COMMENT NK_STRING", - /* 229 */ "alter_table_option ::= TTL NK_INTEGER", - /* 230 */ "duration_list ::= duration_literal", - /* 231 */ "duration_list ::= duration_list NK_COMMA duration_literal", - /* 232 */ "rollup_func_list ::= rollup_func_name", - /* 233 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", - /* 234 */ "rollup_func_name ::= function_name", - /* 235 */ "rollup_func_name ::= FIRST", - /* 236 */ "rollup_func_name ::= LAST", - /* 237 */ "col_name_list ::= col_name", - /* 238 */ "col_name_list ::= col_name_list NK_COMMA col_name", - /* 239 */ "col_name ::= column_name", - /* 240 */ "cmd ::= SHOW DNODES", - /* 241 */ "cmd ::= SHOW USERS", - /* 242 */ "cmd ::= SHOW USER PRIVILEGES", - /* 243 */ "cmd ::= SHOW db_kind_opt DATABASES", - /* 244 */ "cmd ::= SHOW table_kind_db_name_cond_opt TABLES like_pattern_opt", - /* 245 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", - /* 246 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", - /* 247 */ "cmd ::= SHOW MNODES", - /* 248 */ "cmd ::= SHOW QNODES", - /* 249 */ "cmd ::= SHOW FUNCTIONS", - /* 250 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", - /* 251 */ "cmd ::= SHOW INDEXES FROM db_name NK_DOT table_name", - /* 252 */ "cmd ::= SHOW STREAMS", - /* 253 */ "cmd ::= SHOW ACCOUNTS", - /* 254 */ "cmd ::= SHOW APPS", - /* 255 */ "cmd ::= SHOW CONNECTIONS", - /* 256 */ "cmd ::= SHOW LICENCES", - /* 257 */ "cmd ::= SHOW GRANTS", - /* 258 */ "cmd ::= SHOW CREATE DATABASE db_name", - /* 259 */ "cmd ::= SHOW CREATE TABLE full_table_name", - /* 260 */ "cmd ::= SHOW CREATE STABLE full_table_name", - /* 261 */ "cmd ::= SHOW QUERIES", - /* 262 */ "cmd ::= SHOW SCORES", - /* 263 */ "cmd ::= SHOW TOPICS", - /* 264 */ "cmd ::= SHOW VARIABLES", - /* 265 */ "cmd ::= SHOW CLUSTER VARIABLES", - /* 266 */ "cmd ::= SHOW LOCAL VARIABLES", - /* 267 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt", - /* 268 */ "cmd ::= SHOW BNODES", - /* 269 */ "cmd ::= SHOW SNODES", - /* 270 */ "cmd ::= SHOW CLUSTER", - /* 271 */ "cmd ::= SHOW TRANSACTIONS", - /* 272 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", - /* 273 */ "cmd ::= SHOW CONSUMERS", - /* 274 */ "cmd ::= SHOW SUBSCRIPTIONS", - /* 275 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", - /* 276 */ "cmd ::= SHOW TAGS FROM db_name NK_DOT table_name", - /* 277 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt", - /* 278 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM db_name NK_DOT table_name", - /* 279 */ "cmd ::= SHOW VNODES ON DNODE NK_INTEGER", - /* 280 */ "cmd ::= SHOW VNODES", - /* 281 */ "cmd ::= SHOW db_name_cond_opt ALIVE", - /* 282 */ "cmd ::= SHOW CLUSTER ALIVE", - /* 283 */ "table_kind_db_name_cond_opt ::=", - /* 284 */ "table_kind_db_name_cond_opt ::= table_kind", - /* 285 */ "table_kind_db_name_cond_opt ::= db_name NK_DOT", - /* 286 */ "table_kind_db_name_cond_opt ::= table_kind db_name NK_DOT", - /* 287 */ "table_kind ::= NORMAL", - /* 288 */ "table_kind ::= CHILD", - /* 289 */ "db_name_cond_opt ::=", - /* 290 */ "db_name_cond_opt ::= db_name NK_DOT", - /* 291 */ "like_pattern_opt ::=", - /* 292 */ "like_pattern_opt ::= LIKE NK_STRING", - /* 293 */ "table_name_cond ::= table_name", - /* 294 */ "from_db_opt ::=", - /* 295 */ "from_db_opt ::= FROM db_name", - /* 296 */ "tag_list_opt ::=", - /* 297 */ "tag_list_opt ::= tag_item", - /* 298 */ "tag_list_opt ::= tag_list_opt NK_COMMA tag_item", - /* 299 */ "tag_item ::= TBNAME", - /* 300 */ "tag_item ::= QTAGS", - /* 301 */ "tag_item ::= column_name", - /* 302 */ "tag_item ::= column_name column_alias", - /* 303 */ "tag_item ::= column_name AS column_alias", - /* 304 */ "db_kind_opt ::=", - /* 305 */ "db_kind_opt ::= USER", - /* 306 */ "db_kind_opt ::= SYSTEM", - /* 307 */ "cmd ::= CREATE SMA INDEX not_exists_opt col_name ON full_table_name index_options", - /* 308 */ "cmd ::= CREATE INDEX not_exists_opt col_name ON full_table_name NK_LP col_name_list NK_RP", - /* 309 */ "cmd ::= DROP INDEX exists_opt full_index_name", - /* 310 */ "full_index_name ::= index_name", - /* 311 */ "full_index_name ::= db_name NK_DOT index_name", - /* 312 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", - /* 313 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", - /* 314 */ "func_list ::= func", - /* 315 */ "func_list ::= func_list NK_COMMA func", - /* 316 */ "func ::= sma_func_name NK_LP expression_list NK_RP", - /* 317 */ "sma_func_name ::= function_name", - /* 318 */ "sma_func_name ::= COUNT", - /* 319 */ "sma_func_name ::= FIRST", - /* 320 */ "sma_func_name ::= LAST", - /* 321 */ "sma_func_name ::= LAST_ROW", - /* 322 */ "sma_stream_opt ::=", - /* 323 */ "sma_stream_opt ::= sma_stream_opt WATERMARK duration_literal", - /* 324 */ "sma_stream_opt ::= sma_stream_opt MAX_DELAY duration_literal", - /* 325 */ "sma_stream_opt ::= sma_stream_opt DELETE_MARK duration_literal", - /* 326 */ "with_meta ::= AS", - /* 327 */ "with_meta ::= WITH META AS", - /* 328 */ "with_meta ::= ONLY META AS", - /* 329 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", - /* 330 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta DATABASE db_name", - /* 331 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta STABLE full_table_name where_clause_opt", - /* 332 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 333 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", - /* 334 */ "cmd ::= DESC full_table_name", - /* 335 */ "cmd ::= DESCRIBE full_table_name", - /* 336 */ "cmd ::= RESET QUERY CACHE", - /* 337 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", - /* 338 */ "cmd ::= EXPLAIN analyze_opt explain_options insert_query", - /* 339 */ "analyze_opt ::=", - /* 340 */ "analyze_opt ::= ANALYZE", - /* 341 */ "explain_options ::=", - /* 342 */ "explain_options ::= explain_options VERBOSE NK_BOOL", - /* 343 */ "explain_options ::= explain_options RATIO NK_FLOAT", - /* 344 */ "cmd ::= CREATE or_replace_opt agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt language_opt", - /* 345 */ "cmd ::= DROP FUNCTION exists_opt function_name", - /* 346 */ "agg_func_opt ::=", - /* 347 */ "agg_func_opt ::= AGGREGATE", - /* 348 */ "bufsize_opt ::=", - /* 349 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 350 */ "language_opt ::=", - /* 351 */ "language_opt ::= LANGUAGE NK_STRING", - /* 352 */ "or_replace_opt ::=", - /* 353 */ "or_replace_opt ::= OR REPLACE", - /* 354 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name col_list_opt tag_def_or_ref_opt subtable_opt AS query_or_subquery", - /* 355 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 356 */ "cmd ::= PAUSE STREAM exists_opt stream_name", - /* 357 */ "cmd ::= RESUME STREAM exists_opt ignore_opt stream_name", - /* 358 */ "col_list_opt ::=", - /* 359 */ "col_list_opt ::= NK_LP col_name_list NK_RP", - /* 360 */ "tag_def_or_ref_opt ::=", - /* 361 */ "tag_def_or_ref_opt ::= tags_def", - /* 362 */ "tag_def_or_ref_opt ::= TAGS NK_LP col_name_list NK_RP", - /* 363 */ "stream_options ::=", - /* 364 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 365 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 366 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 367 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 368 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", - /* 369 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER", - /* 370 */ "stream_options ::= stream_options DELETE_MARK duration_literal", - /* 371 */ "stream_options ::= stream_options IGNORE UPDATE NK_INTEGER", - /* 372 */ "subtable_opt ::=", - /* 373 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", - /* 374 */ "ignore_opt ::=", - /* 375 */ "ignore_opt ::= IGNORE UNTREATED", - /* 376 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 377 */ "cmd ::= KILL QUERY NK_STRING", - /* 378 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 379 */ "cmd ::= BALANCE VGROUP", - /* 380 */ "cmd ::= BALANCE VGROUP LEADER on_vgroup_id", - /* 381 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 382 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 383 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 384 */ "on_vgroup_id ::=", - /* 385 */ "on_vgroup_id ::= ON NK_INTEGER", - /* 386 */ "dnode_list ::= DNODE NK_INTEGER", - /* 387 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 388 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 389 */ "cmd ::= query_or_subquery", - /* 390 */ "cmd ::= insert_query", - /* 391 */ "insert_query ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", - /* 392 */ "insert_query ::= INSERT INTO full_table_name query_or_subquery", - /* 393 */ "literal ::= NK_INTEGER", - /* 394 */ "literal ::= NK_FLOAT", - /* 395 */ "literal ::= NK_STRING", - /* 396 */ "literal ::= NK_BOOL", - /* 397 */ "literal ::= TIMESTAMP NK_STRING", - /* 398 */ "literal ::= duration_literal", - /* 399 */ "literal ::= NULL", - /* 400 */ "literal ::= NK_QUESTION", - /* 401 */ "duration_literal ::= NK_VARIABLE", - /* 402 */ "signed ::= NK_INTEGER", - /* 403 */ "signed ::= NK_PLUS NK_INTEGER", - /* 404 */ "signed ::= NK_MINUS NK_INTEGER", - /* 405 */ "signed ::= NK_FLOAT", - /* 406 */ "signed ::= NK_PLUS NK_FLOAT", - /* 407 */ "signed ::= NK_MINUS NK_FLOAT", - /* 408 */ "signed_literal ::= signed", - /* 409 */ "signed_literal ::= NK_STRING", - /* 410 */ "signed_literal ::= NK_BOOL", - /* 411 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 412 */ "signed_literal ::= duration_literal", - /* 413 */ "signed_literal ::= NULL", - /* 414 */ "signed_literal ::= literal_func", - /* 415 */ "signed_literal ::= NK_QUESTION", - /* 416 */ "literal_list ::= signed_literal", - /* 417 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 418 */ "db_name ::= NK_ID", - /* 419 */ "table_name ::= NK_ID", - /* 420 */ "column_name ::= NK_ID", - /* 421 */ "function_name ::= NK_ID", - /* 422 */ "table_alias ::= NK_ID", - /* 423 */ "column_alias ::= NK_ID", - /* 424 */ "user_name ::= NK_ID", - /* 425 */ "topic_name ::= NK_ID", - /* 426 */ "stream_name ::= NK_ID", - /* 427 */ "cgroup_name ::= NK_ID", - /* 428 */ "index_name ::= NK_ID", - /* 429 */ "expr_or_subquery ::= expression", - /* 430 */ "expression ::= literal", - /* 431 */ "expression ::= pseudo_column", - /* 432 */ "expression ::= column_reference", - /* 433 */ "expression ::= function_expression", - /* 434 */ "expression ::= case_when_expression", - /* 435 */ "expression ::= NK_LP expression NK_RP", - /* 436 */ "expression ::= NK_PLUS expr_or_subquery", - /* 437 */ "expression ::= NK_MINUS expr_or_subquery", - /* 438 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", - /* 439 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", - /* 440 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", - /* 441 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", - /* 442 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", - /* 443 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 444 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", - /* 445 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", - /* 446 */ "expression_list ::= expr_or_subquery", - /* 447 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", - /* 448 */ "column_reference ::= column_name", - /* 449 */ "column_reference ::= table_name NK_DOT column_name", - /* 450 */ "pseudo_column ::= ROWTS", - /* 451 */ "pseudo_column ::= TBNAME", - /* 452 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 453 */ "pseudo_column ::= QSTART", - /* 454 */ "pseudo_column ::= QEND", - /* 455 */ "pseudo_column ::= QDURATION", - /* 456 */ "pseudo_column ::= WSTART", - /* 457 */ "pseudo_column ::= WEND", - /* 458 */ "pseudo_column ::= WDURATION", - /* 459 */ "pseudo_column ::= IROWTS", - /* 460 */ "pseudo_column ::= ISFILLED", - /* 461 */ "pseudo_column ::= QTAGS", - /* 462 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 463 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 464 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", - /* 465 */ "function_expression ::= literal_func", - /* 466 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 467 */ "literal_func ::= NOW", - /* 468 */ "noarg_func ::= NOW", - /* 469 */ "noarg_func ::= TODAY", - /* 470 */ "noarg_func ::= TIMEZONE", - /* 471 */ "noarg_func ::= DATABASE", - /* 472 */ "noarg_func ::= CLIENT_VERSION", - /* 473 */ "noarg_func ::= SERVER_VERSION", - /* 474 */ "noarg_func ::= SERVER_STATUS", - /* 475 */ "noarg_func ::= CURRENT_USER", - /* 476 */ "noarg_func ::= USER", - /* 477 */ "star_func ::= COUNT", - /* 478 */ "star_func ::= FIRST", - /* 479 */ "star_func ::= LAST", - /* 480 */ "star_func ::= LAST_ROW", - /* 481 */ "star_func_para_list ::= NK_STAR", - /* 482 */ "star_func_para_list ::= other_para_list", - /* 483 */ "other_para_list ::= star_func_para", - /* 484 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 485 */ "star_func_para ::= expr_or_subquery", - /* 486 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 487 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", - /* 488 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", - /* 489 */ "when_then_list ::= when_then_expr", - /* 490 */ "when_then_list ::= when_then_list when_then_expr", - /* 491 */ "when_then_expr ::= WHEN common_expression THEN common_expression", - /* 492 */ "case_when_else_opt ::=", - /* 493 */ "case_when_else_opt ::= ELSE common_expression", - /* 494 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", - /* 495 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", - /* 496 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", - /* 497 */ "predicate ::= expr_or_subquery IS NULL", - /* 498 */ "predicate ::= expr_or_subquery IS NOT NULL", - /* 499 */ "predicate ::= expr_or_subquery in_op in_predicate_value", - /* 500 */ "compare_op ::= NK_LT", - /* 501 */ "compare_op ::= NK_GT", - /* 502 */ "compare_op ::= NK_LE", - /* 503 */ "compare_op ::= NK_GE", - /* 504 */ "compare_op ::= NK_NE", - /* 505 */ "compare_op ::= NK_EQ", - /* 506 */ "compare_op ::= LIKE", - /* 507 */ "compare_op ::= NOT LIKE", - /* 508 */ "compare_op ::= MATCH", - /* 509 */ "compare_op ::= NMATCH", - /* 510 */ "compare_op ::= CONTAINS", - /* 511 */ "in_op ::= IN", - /* 512 */ "in_op ::= NOT IN", - /* 513 */ "in_predicate_value ::= NK_LP literal_list NK_RP", - /* 514 */ "boolean_value_expression ::= boolean_primary", - /* 515 */ "boolean_value_expression ::= NOT boolean_primary", - /* 516 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 517 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 518 */ "boolean_primary ::= predicate", - /* 519 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 520 */ "common_expression ::= expr_or_subquery", - /* 521 */ "common_expression ::= boolean_value_expression", - /* 522 */ "from_clause_opt ::=", - /* 523 */ "from_clause_opt ::= FROM table_reference_list", - /* 524 */ "table_reference_list ::= table_reference", - /* 525 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 526 */ "table_reference ::= table_primary", - /* 527 */ "table_reference ::= joined_table", - /* 528 */ "table_primary ::= table_name alias_opt", - /* 529 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 530 */ "table_primary ::= subquery alias_opt", - /* 531 */ "table_primary ::= parenthesized_joined_table", - /* 532 */ "alias_opt ::=", - /* 533 */ "alias_opt ::= table_alias", - /* 534 */ "alias_opt ::= AS table_alias", - /* 535 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 536 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 537 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 538 */ "join_type ::=", - /* 539 */ "join_type ::= INNER", - /* 540 */ "query_specification ::= SELECT hint_list set_quantifier_opt tag_mode_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", - /* 541 */ "hint_list ::=", - /* 542 */ "hint_list ::= NK_HINT", - /* 543 */ "tag_mode_opt ::=", - /* 544 */ "tag_mode_opt ::= TAGS", - /* 545 */ "set_quantifier_opt ::=", - /* 546 */ "set_quantifier_opt ::= DISTINCT", - /* 547 */ "set_quantifier_opt ::= ALL", - /* 548 */ "select_list ::= select_item", - /* 549 */ "select_list ::= select_list NK_COMMA select_item", - /* 550 */ "select_item ::= NK_STAR", - /* 551 */ "select_item ::= common_expression", - /* 552 */ "select_item ::= common_expression column_alias", - /* 553 */ "select_item ::= common_expression AS column_alias", - /* 554 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 555 */ "where_clause_opt ::=", - /* 556 */ "where_clause_opt ::= WHERE search_condition", - /* 557 */ "partition_by_clause_opt ::=", - /* 558 */ "partition_by_clause_opt ::= PARTITION BY partition_list", - /* 559 */ "partition_list ::= partition_item", - /* 560 */ "partition_list ::= partition_list NK_COMMA partition_item", - /* 561 */ "partition_item ::= expr_or_subquery", - /* 562 */ "partition_item ::= expr_or_subquery column_alias", - /* 563 */ "partition_item ::= expr_or_subquery AS column_alias", - /* 564 */ "twindow_clause_opt ::=", - /* 565 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA interval_sliding_duration_literal NK_RP", - /* 566 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", - /* 567 */ "twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_RP sliding_opt fill_opt", - /* 568 */ "twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_COMMA interval_sliding_duration_literal NK_RP sliding_opt fill_opt", - /* 569 */ "twindow_clause_opt ::= EVENT_WINDOW START WITH search_condition END WITH search_condition", - /* 570 */ "sliding_opt ::=", - /* 571 */ "sliding_opt ::= SLIDING NK_LP interval_sliding_duration_literal NK_RP", - /* 572 */ "interval_sliding_duration_literal ::= NK_VARIABLE", - /* 573 */ "interval_sliding_duration_literal ::= NK_STRING", - /* 574 */ "interval_sliding_duration_literal ::= NK_INTEGER", - /* 575 */ "fill_opt ::=", - /* 576 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 577 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA expression_list NK_RP", - /* 578 */ "fill_opt ::= FILL NK_LP VALUE_F NK_COMMA expression_list NK_RP", - /* 579 */ "fill_mode ::= NONE", - /* 580 */ "fill_mode ::= PREV", - /* 581 */ "fill_mode ::= NULL", - /* 582 */ "fill_mode ::= NULL_F", - /* 583 */ "fill_mode ::= LINEAR", - /* 584 */ "fill_mode ::= NEXT", - /* 585 */ "group_by_clause_opt ::=", - /* 586 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 587 */ "group_by_list ::= expr_or_subquery", - /* 588 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", - /* 589 */ "having_clause_opt ::=", - /* 590 */ "having_clause_opt ::= HAVING search_condition", - /* 591 */ "range_opt ::=", - /* 592 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", - /* 593 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_RP", - /* 594 */ "every_opt ::=", - /* 595 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 596 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 597 */ "query_simple ::= query_specification", - /* 598 */ "query_simple ::= union_query_expression", - /* 599 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", - /* 600 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", - /* 601 */ "query_simple_or_subquery ::= query_simple", - /* 602 */ "query_simple_or_subquery ::= subquery", - /* 603 */ "query_or_subquery ::= query_expression", - /* 604 */ "query_or_subquery ::= subquery", - /* 605 */ "order_by_clause_opt ::=", - /* 606 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 607 */ "slimit_clause_opt ::=", - /* 608 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 609 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 610 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 611 */ "limit_clause_opt ::=", - /* 612 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 613 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 614 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 615 */ "subquery ::= NK_LP query_expression NK_RP", - /* 616 */ "subquery ::= NK_LP subquery NK_RP", - /* 617 */ "search_condition ::= common_expression", - /* 618 */ "sort_specification_list ::= sort_specification", - /* 619 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 620 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", - /* 621 */ "ordering_specification_opt ::=", - /* 622 */ "ordering_specification_opt ::= ASC", - /* 623 */ "ordering_specification_opt ::= DESC", - /* 624 */ "null_ordering_opt ::=", - /* 625 */ "null_ordering_opt ::= NULLS FIRST", - /* 626 */ "null_ordering_opt ::= NULLS LAST", + /* 151 */ "retention ::= NK_MINUS NK_COLON NK_VARIABLE", + /* 152 */ "speed_opt ::=", + /* 153 */ "speed_opt ::= BWLIMIT NK_INTEGER", + /* 154 */ "start_opt ::=", + /* 155 */ "start_opt ::= START WITH NK_INTEGER", + /* 156 */ "start_opt ::= START WITH NK_STRING", + /* 157 */ "start_opt ::= START WITH TIMESTAMP NK_STRING", + /* 158 */ "end_opt ::=", + /* 159 */ "end_opt ::= END WITH NK_INTEGER", + /* 160 */ "end_opt ::= END WITH NK_STRING", + /* 161 */ "end_opt ::= END WITH TIMESTAMP NK_STRING", + /* 162 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", + /* 163 */ "cmd ::= CREATE TABLE multi_create_clause", + /* 164 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", + /* 165 */ "cmd ::= DROP TABLE multi_drop_clause", + /* 166 */ "cmd ::= DROP STABLE exists_opt full_table_name", + /* 167 */ "cmd ::= ALTER TABLE alter_table_clause", + /* 168 */ "cmd ::= ALTER STABLE alter_table_clause", + /* 169 */ "alter_table_clause ::= full_table_name alter_table_options", + /* 170 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", + /* 171 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", + /* 172 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", + /* 173 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", + /* 174 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", + /* 175 */ "alter_table_clause ::= full_table_name DROP TAG column_name", + /* 176 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", + /* 177 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", + /* 178 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", + /* 179 */ "multi_create_clause ::= create_subtable_clause", + /* 180 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", + /* 181 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options", + /* 182 */ "multi_drop_clause ::= drop_table_clause", + /* 183 */ "multi_drop_clause ::= multi_drop_clause NK_COMMA drop_table_clause", + /* 184 */ "drop_table_clause ::= exists_opt full_table_name", + /* 185 */ "specific_cols_opt ::=", + /* 186 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", + /* 187 */ "full_table_name ::= table_name", + /* 188 */ "full_table_name ::= db_name NK_DOT table_name", + /* 189 */ "column_def_list ::= column_def", + /* 190 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 191 */ "column_def ::= column_name type_name", + /* 192 */ "type_name ::= BOOL", + /* 193 */ "type_name ::= TINYINT", + /* 194 */ "type_name ::= SMALLINT", + /* 195 */ "type_name ::= INT", + /* 196 */ "type_name ::= INTEGER", + /* 197 */ "type_name ::= BIGINT", + /* 198 */ "type_name ::= FLOAT", + /* 199 */ "type_name ::= DOUBLE", + /* 200 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 201 */ "type_name ::= TIMESTAMP", + /* 202 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 203 */ "type_name ::= TINYINT UNSIGNED", + /* 204 */ "type_name ::= SMALLINT UNSIGNED", + /* 205 */ "type_name ::= INT UNSIGNED", + /* 206 */ "type_name ::= BIGINT UNSIGNED", + /* 207 */ "type_name ::= JSON", + /* 208 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 209 */ "type_name ::= MEDIUMBLOB", + /* 210 */ "type_name ::= BLOB", + /* 211 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 212 */ "type_name ::= GEOMETRY NK_LP NK_INTEGER NK_RP", + /* 213 */ "type_name ::= DECIMAL", + /* 214 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 215 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 216 */ "tags_def_opt ::=", + /* 217 */ "tags_def_opt ::= tags_def", + /* 218 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", + /* 219 */ "table_options ::=", + /* 220 */ "table_options ::= table_options COMMENT NK_STRING", + /* 221 */ "table_options ::= table_options MAX_DELAY duration_list", + /* 222 */ "table_options ::= table_options WATERMARK duration_list", + /* 223 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", + /* 224 */ "table_options ::= table_options TTL NK_INTEGER", + /* 225 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", + /* 226 */ "table_options ::= table_options DELETE_MARK duration_list", + /* 227 */ "alter_table_options ::= alter_table_option", + /* 228 */ "alter_table_options ::= alter_table_options alter_table_option", + /* 229 */ "alter_table_option ::= COMMENT NK_STRING", + /* 230 */ "alter_table_option ::= TTL NK_INTEGER", + /* 231 */ "duration_list ::= duration_literal", + /* 232 */ "duration_list ::= duration_list NK_COMMA duration_literal", + /* 233 */ "rollup_func_list ::= rollup_func_name", + /* 234 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", + /* 235 */ "rollup_func_name ::= function_name", + /* 236 */ "rollup_func_name ::= FIRST", + /* 237 */ "rollup_func_name ::= LAST", + /* 238 */ "col_name_list ::= col_name", + /* 239 */ "col_name_list ::= col_name_list NK_COMMA col_name", + /* 240 */ "col_name ::= column_name", + /* 241 */ "cmd ::= SHOW DNODES", + /* 242 */ "cmd ::= SHOW USERS", + /* 243 */ "cmd ::= SHOW USER PRIVILEGES", + /* 244 */ "cmd ::= SHOW db_kind_opt DATABASES", + /* 245 */ "cmd ::= SHOW table_kind_db_name_cond_opt TABLES like_pattern_opt", + /* 246 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", + /* 247 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", + /* 248 */ "cmd ::= SHOW MNODES", + /* 249 */ "cmd ::= SHOW QNODES", + /* 250 */ "cmd ::= SHOW FUNCTIONS", + /* 251 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", + /* 252 */ "cmd ::= SHOW INDEXES FROM db_name NK_DOT table_name", + /* 253 */ "cmd ::= SHOW STREAMS", + /* 254 */ "cmd ::= SHOW ACCOUNTS", + /* 255 */ "cmd ::= SHOW APPS", + /* 256 */ "cmd ::= SHOW CONNECTIONS", + /* 257 */ "cmd ::= SHOW LICENCES", + /* 258 */ "cmd ::= SHOW GRANTS", + /* 259 */ "cmd ::= SHOW CREATE DATABASE db_name", + /* 260 */ "cmd ::= SHOW CREATE TABLE full_table_name", + /* 261 */ "cmd ::= SHOW CREATE STABLE full_table_name", + /* 262 */ "cmd ::= SHOW QUERIES", + /* 263 */ "cmd ::= SHOW SCORES", + /* 264 */ "cmd ::= SHOW TOPICS", + /* 265 */ "cmd ::= SHOW VARIABLES", + /* 266 */ "cmd ::= SHOW CLUSTER VARIABLES", + /* 267 */ "cmd ::= SHOW LOCAL VARIABLES", + /* 268 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt", + /* 269 */ "cmd ::= SHOW BNODES", + /* 270 */ "cmd ::= SHOW SNODES", + /* 271 */ "cmd ::= SHOW CLUSTER", + /* 272 */ "cmd ::= SHOW TRANSACTIONS", + /* 273 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", + /* 274 */ "cmd ::= SHOW CONSUMERS", + /* 275 */ "cmd ::= SHOW SUBSCRIPTIONS", + /* 276 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", + /* 277 */ "cmd ::= SHOW TAGS FROM db_name NK_DOT table_name", + /* 278 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt", + /* 279 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM db_name NK_DOT table_name", + /* 280 */ "cmd ::= SHOW VNODES ON DNODE NK_INTEGER", + /* 281 */ "cmd ::= SHOW VNODES", + /* 282 */ "cmd ::= SHOW db_name_cond_opt ALIVE", + /* 283 */ "cmd ::= SHOW CLUSTER ALIVE", + /* 284 */ "table_kind_db_name_cond_opt ::=", + /* 285 */ "table_kind_db_name_cond_opt ::= table_kind", + /* 286 */ "table_kind_db_name_cond_opt ::= db_name NK_DOT", + /* 287 */ "table_kind_db_name_cond_opt ::= table_kind db_name NK_DOT", + /* 288 */ "table_kind ::= NORMAL", + /* 289 */ "table_kind ::= CHILD", + /* 290 */ "db_name_cond_opt ::=", + /* 291 */ "db_name_cond_opt ::= db_name NK_DOT", + /* 292 */ "like_pattern_opt ::=", + /* 293 */ "like_pattern_opt ::= LIKE NK_STRING", + /* 294 */ "table_name_cond ::= table_name", + /* 295 */ "from_db_opt ::=", + /* 296 */ "from_db_opt ::= FROM db_name", + /* 297 */ "tag_list_opt ::=", + /* 298 */ "tag_list_opt ::= tag_item", + /* 299 */ "tag_list_opt ::= tag_list_opt NK_COMMA tag_item", + /* 300 */ "tag_item ::= TBNAME", + /* 301 */ "tag_item ::= QTAGS", + /* 302 */ "tag_item ::= column_name", + /* 303 */ "tag_item ::= column_name column_alias", + /* 304 */ "tag_item ::= column_name AS column_alias", + /* 305 */ "db_kind_opt ::=", + /* 306 */ "db_kind_opt ::= USER", + /* 307 */ "db_kind_opt ::= SYSTEM", + /* 308 */ "cmd ::= CREATE SMA INDEX not_exists_opt col_name ON full_table_name index_options", + /* 309 */ "cmd ::= CREATE INDEX not_exists_opt col_name ON full_table_name NK_LP col_name_list NK_RP", + /* 310 */ "cmd ::= DROP INDEX exists_opt full_index_name", + /* 311 */ "full_index_name ::= index_name", + /* 312 */ "full_index_name ::= db_name NK_DOT index_name", + /* 313 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", + /* 314 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", + /* 315 */ "func_list ::= func", + /* 316 */ "func_list ::= func_list NK_COMMA func", + /* 317 */ "func ::= sma_func_name NK_LP expression_list NK_RP", + /* 318 */ "sma_func_name ::= function_name", + /* 319 */ "sma_func_name ::= COUNT", + /* 320 */ "sma_func_name ::= FIRST", + /* 321 */ "sma_func_name ::= LAST", + /* 322 */ "sma_func_name ::= LAST_ROW", + /* 323 */ "sma_stream_opt ::=", + /* 324 */ "sma_stream_opt ::= sma_stream_opt WATERMARK duration_literal", + /* 325 */ "sma_stream_opt ::= sma_stream_opt MAX_DELAY duration_literal", + /* 326 */ "sma_stream_opt ::= sma_stream_opt DELETE_MARK duration_literal", + /* 327 */ "with_meta ::= AS", + /* 328 */ "with_meta ::= WITH META AS", + /* 329 */ "with_meta ::= ONLY META AS", + /* 330 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", + /* 331 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta DATABASE db_name", + /* 332 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta STABLE full_table_name where_clause_opt", + /* 333 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 334 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", + /* 335 */ "cmd ::= DESC full_table_name", + /* 336 */ "cmd ::= DESCRIBE full_table_name", + /* 337 */ "cmd ::= RESET QUERY CACHE", + /* 338 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", + /* 339 */ "cmd ::= EXPLAIN analyze_opt explain_options insert_query", + /* 340 */ "analyze_opt ::=", + /* 341 */ "analyze_opt ::= ANALYZE", + /* 342 */ "explain_options ::=", + /* 343 */ "explain_options ::= explain_options VERBOSE NK_BOOL", + /* 344 */ "explain_options ::= explain_options RATIO NK_FLOAT", + /* 345 */ "cmd ::= CREATE or_replace_opt agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt language_opt", + /* 346 */ "cmd ::= DROP FUNCTION exists_opt function_name", + /* 347 */ "agg_func_opt ::=", + /* 348 */ "agg_func_opt ::= AGGREGATE", + /* 349 */ "bufsize_opt ::=", + /* 350 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", + /* 351 */ "language_opt ::=", + /* 352 */ "language_opt ::= LANGUAGE NK_STRING", + /* 353 */ "or_replace_opt ::=", + /* 354 */ "or_replace_opt ::= OR REPLACE", + /* 355 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name col_list_opt tag_def_or_ref_opt subtable_opt AS query_or_subquery", + /* 356 */ "cmd ::= DROP STREAM exists_opt stream_name", + /* 357 */ "cmd ::= PAUSE STREAM exists_opt stream_name", + /* 358 */ "cmd ::= RESUME STREAM exists_opt ignore_opt stream_name", + /* 359 */ "col_list_opt ::=", + /* 360 */ "col_list_opt ::= NK_LP col_name_list NK_RP", + /* 361 */ "tag_def_or_ref_opt ::=", + /* 362 */ "tag_def_or_ref_opt ::= tags_def", + /* 363 */ "tag_def_or_ref_opt ::= TAGS NK_LP col_name_list NK_RP", + /* 364 */ "stream_options ::=", + /* 365 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 366 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 367 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 368 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 369 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", + /* 370 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER", + /* 371 */ "stream_options ::= stream_options DELETE_MARK duration_literal", + /* 372 */ "stream_options ::= stream_options IGNORE UPDATE NK_INTEGER", + /* 373 */ "subtable_opt ::=", + /* 374 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", + /* 375 */ "ignore_opt ::=", + /* 376 */ "ignore_opt ::= IGNORE UNTREATED", + /* 377 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 378 */ "cmd ::= KILL QUERY NK_STRING", + /* 379 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 380 */ "cmd ::= BALANCE VGROUP", + /* 381 */ "cmd ::= BALANCE VGROUP LEADER on_vgroup_id", + /* 382 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 383 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 384 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 385 */ "on_vgroup_id ::=", + /* 386 */ "on_vgroup_id ::= ON NK_INTEGER", + /* 387 */ "dnode_list ::= DNODE NK_INTEGER", + /* 388 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 389 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 390 */ "cmd ::= query_or_subquery", + /* 391 */ "cmd ::= insert_query", + /* 392 */ "insert_query ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", + /* 393 */ "insert_query ::= INSERT INTO full_table_name query_or_subquery", + /* 394 */ "literal ::= NK_INTEGER", + /* 395 */ "literal ::= NK_FLOAT", + /* 396 */ "literal ::= NK_STRING", + /* 397 */ "literal ::= NK_BOOL", + /* 398 */ "literal ::= TIMESTAMP NK_STRING", + /* 399 */ "literal ::= duration_literal", + /* 400 */ "literal ::= NULL", + /* 401 */ "literal ::= NK_QUESTION", + /* 402 */ "duration_literal ::= NK_VARIABLE", + /* 403 */ "signed ::= NK_INTEGER", + /* 404 */ "signed ::= NK_PLUS NK_INTEGER", + /* 405 */ "signed ::= NK_MINUS NK_INTEGER", + /* 406 */ "signed ::= NK_FLOAT", + /* 407 */ "signed ::= NK_PLUS NK_FLOAT", + /* 408 */ "signed ::= NK_MINUS NK_FLOAT", + /* 409 */ "signed_literal ::= signed", + /* 410 */ "signed_literal ::= NK_STRING", + /* 411 */ "signed_literal ::= NK_BOOL", + /* 412 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 413 */ "signed_literal ::= duration_literal", + /* 414 */ "signed_literal ::= NULL", + /* 415 */ "signed_literal ::= literal_func", + /* 416 */ "signed_literal ::= NK_QUESTION", + /* 417 */ "literal_list ::= signed_literal", + /* 418 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 419 */ "db_name ::= NK_ID", + /* 420 */ "table_name ::= NK_ID", + /* 421 */ "column_name ::= NK_ID", + /* 422 */ "function_name ::= NK_ID", + /* 423 */ "table_alias ::= NK_ID", + /* 424 */ "column_alias ::= NK_ID", + /* 425 */ "column_alias ::= NK_ALIAS", + /* 426 */ "user_name ::= NK_ID", + /* 427 */ "topic_name ::= NK_ID", + /* 428 */ "stream_name ::= NK_ID", + /* 429 */ "cgroup_name ::= NK_ID", + /* 430 */ "index_name ::= NK_ID", + /* 431 */ "expr_or_subquery ::= expression", + /* 432 */ "expression ::= literal", + /* 433 */ "expression ::= pseudo_column", + /* 434 */ "expression ::= column_reference", + /* 435 */ "expression ::= function_expression", + /* 436 */ "expression ::= case_when_expression", + /* 437 */ "expression ::= NK_LP expression NK_RP", + /* 438 */ "expression ::= NK_PLUS expr_or_subquery", + /* 439 */ "expression ::= NK_MINUS expr_or_subquery", + /* 440 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", + /* 441 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", + /* 442 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", + /* 443 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", + /* 444 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", + /* 445 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 446 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", + /* 447 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", + /* 448 */ "expression_list ::= expr_or_subquery", + /* 449 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", + /* 450 */ "column_reference ::= column_name", + /* 451 */ "column_reference ::= table_name NK_DOT column_name", + /* 452 */ "column_reference ::= NK_ALIAS", + /* 453 */ "column_reference ::= table_name NK_DOT NK_ALIAS", + /* 454 */ "pseudo_column ::= ROWTS", + /* 455 */ "pseudo_column ::= TBNAME", + /* 456 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 457 */ "pseudo_column ::= QSTART", + /* 458 */ "pseudo_column ::= QEND", + /* 459 */ "pseudo_column ::= QDURATION", + /* 460 */ "pseudo_column ::= WSTART", + /* 461 */ "pseudo_column ::= WEND", + /* 462 */ "pseudo_column ::= WDURATION", + /* 463 */ "pseudo_column ::= IROWTS", + /* 464 */ "pseudo_column ::= ISFILLED", + /* 465 */ "pseudo_column ::= QTAGS", + /* 466 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 467 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 468 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", + /* 469 */ "function_expression ::= literal_func", + /* 470 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 471 */ "literal_func ::= NOW", + /* 472 */ "noarg_func ::= NOW", + /* 473 */ "noarg_func ::= TODAY", + /* 474 */ "noarg_func ::= TIMEZONE", + /* 475 */ "noarg_func ::= DATABASE", + /* 476 */ "noarg_func ::= CLIENT_VERSION", + /* 477 */ "noarg_func ::= SERVER_VERSION", + /* 478 */ "noarg_func ::= SERVER_STATUS", + /* 479 */ "noarg_func ::= CURRENT_USER", + /* 480 */ "noarg_func ::= USER", + /* 481 */ "star_func ::= COUNT", + /* 482 */ "star_func ::= FIRST", + /* 483 */ "star_func ::= LAST", + /* 484 */ "star_func ::= LAST_ROW", + /* 485 */ "star_func_para_list ::= NK_STAR", + /* 486 */ "star_func_para_list ::= other_para_list", + /* 487 */ "other_para_list ::= star_func_para", + /* 488 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 489 */ "star_func_para ::= expr_or_subquery", + /* 490 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 491 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", + /* 492 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", + /* 493 */ "when_then_list ::= when_then_expr", + /* 494 */ "when_then_list ::= when_then_list when_then_expr", + /* 495 */ "when_then_expr ::= WHEN common_expression THEN common_expression", + /* 496 */ "case_when_else_opt ::=", + /* 497 */ "case_when_else_opt ::= ELSE common_expression", + /* 498 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", + /* 499 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", + /* 500 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", + /* 501 */ "predicate ::= expr_or_subquery IS NULL", + /* 502 */ "predicate ::= expr_or_subquery IS NOT NULL", + /* 503 */ "predicate ::= expr_or_subquery in_op in_predicate_value", + /* 504 */ "compare_op ::= NK_LT", + /* 505 */ "compare_op ::= NK_GT", + /* 506 */ "compare_op ::= NK_LE", + /* 507 */ "compare_op ::= NK_GE", + /* 508 */ "compare_op ::= NK_NE", + /* 509 */ "compare_op ::= NK_EQ", + /* 510 */ "compare_op ::= LIKE", + /* 511 */ "compare_op ::= NOT LIKE", + /* 512 */ "compare_op ::= MATCH", + /* 513 */ "compare_op ::= NMATCH", + /* 514 */ "compare_op ::= CONTAINS", + /* 515 */ "in_op ::= IN", + /* 516 */ "in_op ::= NOT IN", + /* 517 */ "in_predicate_value ::= NK_LP literal_list NK_RP", + /* 518 */ "boolean_value_expression ::= boolean_primary", + /* 519 */ "boolean_value_expression ::= NOT boolean_primary", + /* 520 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 521 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 522 */ "boolean_primary ::= predicate", + /* 523 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 524 */ "common_expression ::= expr_or_subquery", + /* 525 */ "common_expression ::= boolean_value_expression", + /* 526 */ "from_clause_opt ::=", + /* 527 */ "from_clause_opt ::= FROM table_reference_list", + /* 528 */ "table_reference_list ::= table_reference", + /* 529 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 530 */ "table_reference ::= table_primary", + /* 531 */ "table_reference ::= joined_table", + /* 532 */ "table_primary ::= table_name alias_opt", + /* 533 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 534 */ "table_primary ::= subquery alias_opt", + /* 535 */ "table_primary ::= parenthesized_joined_table", + /* 536 */ "alias_opt ::=", + /* 537 */ "alias_opt ::= table_alias", + /* 538 */ "alias_opt ::= AS table_alias", + /* 539 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 540 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 541 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 542 */ "join_type ::=", + /* 543 */ "join_type ::= INNER", + /* 544 */ "query_specification ::= SELECT hint_list set_quantifier_opt tag_mode_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", + /* 545 */ "hint_list ::=", + /* 546 */ "hint_list ::= NK_HINT", + /* 547 */ "tag_mode_opt ::=", + /* 548 */ "tag_mode_opt ::= TAGS", + /* 549 */ "set_quantifier_opt ::=", + /* 550 */ "set_quantifier_opt ::= DISTINCT", + /* 551 */ "set_quantifier_opt ::= ALL", + /* 552 */ "select_list ::= select_item", + /* 553 */ "select_list ::= select_list NK_COMMA select_item", + /* 554 */ "select_item ::= NK_STAR", + /* 555 */ "select_item ::= common_expression", + /* 556 */ "select_item ::= common_expression column_alias", + /* 557 */ "select_item ::= common_expression AS column_alias", + /* 558 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 559 */ "where_clause_opt ::=", + /* 560 */ "where_clause_opt ::= WHERE search_condition", + /* 561 */ "partition_by_clause_opt ::=", + /* 562 */ "partition_by_clause_opt ::= PARTITION BY partition_list", + /* 563 */ "partition_list ::= partition_item", + /* 564 */ "partition_list ::= partition_list NK_COMMA partition_item", + /* 565 */ "partition_item ::= expr_or_subquery", + /* 566 */ "partition_item ::= expr_or_subquery column_alias", + /* 567 */ "partition_item ::= expr_or_subquery AS column_alias", + /* 568 */ "twindow_clause_opt ::=", + /* 569 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA interval_sliding_duration_literal NK_RP", + /* 570 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", + /* 571 */ "twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_RP sliding_opt fill_opt", + /* 572 */ "twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_COMMA interval_sliding_duration_literal NK_RP sliding_opt fill_opt", + /* 573 */ "twindow_clause_opt ::= EVENT_WINDOW START WITH search_condition END WITH search_condition", + /* 574 */ "sliding_opt ::=", + /* 575 */ "sliding_opt ::= SLIDING NK_LP interval_sliding_duration_literal NK_RP", + /* 576 */ "interval_sliding_duration_literal ::= NK_VARIABLE", + /* 577 */ "interval_sliding_duration_literal ::= NK_STRING", + /* 578 */ "interval_sliding_duration_literal ::= NK_INTEGER", + /* 579 */ "fill_opt ::=", + /* 580 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 581 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA expression_list NK_RP", + /* 582 */ "fill_opt ::= FILL NK_LP VALUE_F NK_COMMA expression_list NK_RP", + /* 583 */ "fill_mode ::= NONE", + /* 584 */ "fill_mode ::= PREV", + /* 585 */ "fill_mode ::= NULL", + /* 586 */ "fill_mode ::= NULL_F", + /* 587 */ "fill_mode ::= LINEAR", + /* 588 */ "fill_mode ::= NEXT", + /* 589 */ "group_by_clause_opt ::=", + /* 590 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 591 */ "group_by_list ::= expr_or_subquery", + /* 592 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", + /* 593 */ "having_clause_opt ::=", + /* 594 */ "having_clause_opt ::= HAVING search_condition", + /* 595 */ "range_opt ::=", + /* 596 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", + /* 597 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_RP", + /* 598 */ "every_opt ::=", + /* 599 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 600 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 601 */ "query_simple ::= query_specification", + /* 602 */ "query_simple ::= union_query_expression", + /* 603 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", + /* 604 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", + /* 605 */ "query_simple_or_subquery ::= query_simple", + /* 606 */ "query_simple_or_subquery ::= subquery", + /* 607 */ "query_or_subquery ::= query_expression", + /* 608 */ "query_or_subquery ::= subquery", + /* 609 */ "order_by_clause_opt ::=", + /* 610 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 611 */ "slimit_clause_opt ::=", + /* 612 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 613 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 614 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 615 */ "limit_clause_opt ::=", + /* 616 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 617 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 618 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 619 */ "subquery ::= NK_LP query_expression NK_RP", + /* 620 */ "subquery ::= NK_LP subquery NK_RP", + /* 621 */ "search_condition ::= common_expression", + /* 622 */ "sort_specification_list ::= sort_specification", + /* 623 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 624 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", + /* 625 */ "ordering_specification_opt ::=", + /* 626 */ "ordering_specification_opt ::= ASC", + /* 627 */ "ordering_specification_opt ::= DESC", + /* 628 */ "null_ordering_opt ::=", + /* 629 */ "null_ordering_opt ::= NULLS FIRST", + /* 630 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -3171,265 +2920,231 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 344: /* cmd */ - case 347: /* literal */ - case 356: /* with_opt */ - case 362: /* search_condition */ - case 367: /* db_options */ - case 369: /* alter_db_options */ - case 371: /* start_opt */ - case 372: /* end_opt */ - case 376: /* signed */ - case 378: /* retention */ - case 379: /* full_table_name */ - case 382: /* table_options */ - case 386: /* alter_table_clause */ - case 387: /* alter_table_options */ - case 390: /* signed_literal */ - case 391: /* create_subtable_clause */ - case 394: /* drop_table_clause */ - case 396: /* column_def */ - case 400: /* duration_literal */ - case 401: /* rollup_func_name */ - case 403: /* col_name */ - case 406: /* like_pattern_opt */ - case 407: /* db_name_cond_opt */ - case 408: /* table_name_cond */ - case 409: /* from_db_opt */ - case 412: /* tag_item */ - case 414: /* index_options */ - case 415: /* full_index_name */ - case 418: /* sliding_opt */ - case 419: /* sma_stream_opt */ - case 420: /* func */ - case 423: /* query_or_subquery */ - case 424: /* where_clause_opt */ - case 427: /* explain_options */ - case 428: /* insert_query */ - case 434: /* stream_options */ - case 437: /* subtable_opt */ - case 439: /* expression */ - case 442: /* literal_func */ - case 445: /* expr_or_subquery */ - case 446: /* pseudo_column */ - case 447: /* column_reference */ - case 448: /* function_expression */ - case 449: /* case_when_expression */ - case 454: /* star_func_para */ - case 456: /* case_when_else_opt */ - case 457: /* common_expression */ - case 458: /* when_then_expr */ - case 459: /* predicate */ - case 462: /* in_predicate_value */ - case 463: /* boolean_value_expression */ - case 464: /* boolean_primary */ - case 465: /* from_clause_opt */ - case 466: /* table_reference_list */ - case 467: /* table_reference */ - case 468: /* table_primary */ - case 469: /* joined_table */ - case 471: /* subquery */ - case 472: /* parenthesized_joined_table */ - case 474: /* query_specification */ - case 480: /* range_opt */ - case 481: /* every_opt */ - case 482: /* fill_opt */ - case 483: /* twindow_clause_opt */ - case 485: /* having_clause_opt */ - case 486: /* select_item */ - case 488: /* partition_item */ - case 489: /* interval_sliding_duration_literal */ - case 492: /* query_expression */ - case 493: /* query_simple */ - case 495: /* slimit_clause_opt */ - case 496: /* limit_clause_opt */ - case 497: /* union_query_expression */ - case 498: /* query_simple_or_subquery */ - case 500: /* sort_specification */ + case 345: /* cmd */ + case 348: /* literal */ + case 357: /* with_opt */ + case 363: /* search_condition */ + case 368: /* db_options */ + case 370: /* alter_db_options */ + case 372: /* start_opt */ + case 373: /* end_opt */ + case 377: /* signed */ + case 379: /* retention */ + case 380: /* full_table_name */ + case 383: /* table_options */ + case 387: /* alter_table_clause */ + case 388: /* alter_table_options */ + case 391: /* signed_literal */ + case 392: /* create_subtable_clause */ + case 395: /* drop_table_clause */ + case 397: /* column_def */ + case 401: /* duration_literal */ + case 402: /* rollup_func_name */ + case 404: /* col_name */ + case 407: /* like_pattern_opt */ + case 408: /* db_name_cond_opt */ + case 409: /* table_name_cond */ + case 410: /* from_db_opt */ + case 413: /* tag_item */ + case 415: /* index_options */ + case 416: /* full_index_name */ + case 419: /* sliding_opt */ + case 420: /* sma_stream_opt */ + case 421: /* func */ + case 424: /* query_or_subquery */ + case 425: /* where_clause_opt */ + case 428: /* explain_options */ + case 429: /* insert_query */ + case 435: /* stream_options */ + case 438: /* subtable_opt */ + case 440: /* expression */ + case 443: /* literal_func */ + case 446: /* expr_or_subquery */ + case 447: /* pseudo_column */ + case 448: /* column_reference */ + case 449: /* function_expression */ + case 450: /* case_when_expression */ + case 455: /* star_func_para */ + case 457: /* case_when_else_opt */ + case 458: /* common_expression */ + case 459: /* when_then_expr */ + case 460: /* predicate */ + case 463: /* in_predicate_value */ + case 464: /* boolean_value_expression */ + case 465: /* boolean_primary */ + case 466: /* from_clause_opt */ + case 467: /* table_reference_list */ + case 468: /* table_reference */ + case 469: /* table_primary */ + case 470: /* joined_table */ + case 472: /* subquery */ + case 473: /* parenthesized_joined_table */ + case 475: /* query_specification */ + case 481: /* range_opt */ + case 482: /* every_opt */ + case 483: /* fill_opt */ + case 484: /* twindow_clause_opt */ + case 486: /* having_clause_opt */ + case 487: /* select_item */ + case 489: /* partition_item */ + case 490: /* interval_sliding_duration_literal */ + case 493: /* query_expression */ + case 494: /* query_simple */ + case 496: /* slimit_clause_opt */ + case 497: /* limit_clause_opt */ + case 498: /* union_query_expression */ + case 499: /* query_simple_or_subquery */ + case 501: /* sort_specification */ { -#line 7 "sql.y" - nodesDestroyNode((yypminor->yy342)); -#line 3252 "sql.c" + nodesDestroyNode((yypminor->yy56)); } break; - case 345: /* account_options */ - case 346: /* alter_account_options */ - case 348: /* alter_account_option */ - case 370: /* speed_opt */ - case 422: /* with_meta */ - case 431: /* bufsize_opt */ + case 346: /* account_options */ + case 347: /* alter_account_options */ + case 349: /* alter_account_option */ + case 371: /* speed_opt */ + case 423: /* with_meta */ + case 432: /* bufsize_opt */ { -#line 54 "sql.y" -#line 3264 "sql.c" } break; - case 349: /* ip_range_list */ - case 350: /* white_list */ - case 351: /* white_list_opt */ - case 373: /* integer_list */ - case 374: /* variable_list */ - case 375: /* retention_list */ - case 380: /* column_def_list */ - case 381: /* tags_def_opt */ - case 383: /* multi_create_clause */ - case 384: /* tags_def */ - case 385: /* multi_drop_clause */ - case 392: /* specific_cols_opt */ - case 393: /* expression_list */ - case 395: /* col_name_list */ - case 397: /* duration_list */ - case 398: /* rollup_func_list */ - case 410: /* tag_list_opt */ - case 417: /* func_list */ - case 435: /* col_list_opt */ - case 436: /* tag_def_or_ref_opt */ - case 441: /* dnode_list */ - case 443: /* literal_list */ - case 451: /* star_func_para_list */ - case 453: /* other_para_list */ - case 455: /* when_then_list */ - case 475: /* hint_list */ - case 478: /* select_list */ - case 479: /* partition_by_clause_opt */ - case 484: /* group_by_clause_opt */ - case 487: /* partition_list */ - case 491: /* group_by_list */ - case 494: /* order_by_clause_opt */ - case 499: /* sort_specification_list */ + case 350: /* ip_range_list */ + case 351: /* white_list */ + case 352: /* white_list_opt */ + case 374: /* integer_list */ + case 375: /* variable_list */ + case 376: /* retention_list */ + case 381: /* column_def_list */ + case 382: /* tags_def_opt */ + case 384: /* multi_create_clause */ + case 385: /* tags_def */ + case 386: /* multi_drop_clause */ + case 393: /* specific_cols_opt */ + case 394: /* expression_list */ + case 396: /* col_name_list */ + case 398: /* duration_list */ + case 399: /* rollup_func_list */ + case 411: /* tag_list_opt */ + case 418: /* func_list */ + case 436: /* col_list_opt */ + case 437: /* tag_def_or_ref_opt */ + case 442: /* dnode_list */ + case 444: /* literal_list */ + case 452: /* star_func_para_list */ + case 454: /* other_para_list */ + case 456: /* when_then_list */ + case 476: /* hint_list */ + case 479: /* select_list */ + case 480: /* partition_by_clause_opt */ + case 485: /* group_by_clause_opt */ + case 488: /* partition_list */ + case 492: /* group_by_list */ + case 495: /* order_by_clause_opt */ + case 500: /* sort_specification_list */ { -#line 85 "sql.y" - nodesDestroyList((yypminor->yy20)); -#line 3303 "sql.c" + nodesDestroyList((yypminor->yy712)); } break; - case 352: /* user_name */ - case 359: /* db_name */ - case 360: /* table_name */ - case 361: /* topic_name */ - case 363: /* dnode_endpoint */ - case 388: /* column_name */ - case 402: /* function_name */ - case 413: /* column_alias */ - case 416: /* index_name */ - case 421: /* sma_func_name */ - case 425: /* cgroup_name */ - case 432: /* language_opt */ - case 433: /* stream_name */ - case 440: /* on_vgroup_id */ - case 444: /* table_alias */ - case 450: /* star_func */ - case 452: /* noarg_func */ - case 470: /* alias_opt */ + case 353: /* user_name */ + case 360: /* db_name */ + case 361: /* table_name */ + case 362: /* topic_name */ + case 364: /* dnode_endpoint */ + case 389: /* column_name */ + case 403: /* function_name */ + case 414: /* column_alias */ + case 417: /* index_name */ + case 422: /* sma_func_name */ + case 426: /* cgroup_name */ + case 433: /* language_opt */ + case 434: /* stream_name */ + case 441: /* on_vgroup_id */ + case 445: /* table_alias */ + case 451: /* star_func */ + case 453: /* noarg_func */ + case 471: /* alias_opt */ { -#line 792 "sql.y" -#line 3327 "sql.c" } break; - case 353: /* sysinfo_opt */ + case 354: /* sysinfo_opt */ { -#line 112 "sql.y" -#line 3334 "sql.c" } break; - case 354: /* privileges */ - case 357: /* priv_type_list */ - case 358: /* priv_type */ + case 355: /* privileges */ + case 358: /* priv_type_list */ + case 359: /* priv_type */ { -#line 121 "sql.y" -#line 3343 "sql.c" } break; - case 355: /* priv_level */ + case 356: /* priv_level */ { -#line 137 "sql.y" -#line 3350 "sql.c" } break; - case 364: /* force_opt */ - case 365: /* unsafe_opt */ - case 366: /* not_exists_opt */ - case 368: /* exists_opt */ - case 426: /* analyze_opt */ - case 429: /* or_replace_opt */ - case 430: /* agg_func_opt */ - case 438: /* ignore_opt */ - case 476: /* set_quantifier_opt */ - case 477: /* tag_mode_opt */ + case 365: /* force_opt */ + case 366: /* unsafe_opt */ + case 367: /* not_exists_opt */ + case 369: /* exists_opt */ + case 427: /* analyze_opt */ + case 430: /* or_replace_opt */ + case 431: /* agg_func_opt */ + case 439: /* ignore_opt */ + case 477: /* set_quantifier_opt */ + case 478: /* tag_mode_opt */ { -#line 166 "sql.y" -#line 3366 "sql.c" } break; - case 377: /* alter_db_option */ - case 399: /* alter_table_option */ + case 378: /* alter_db_option */ + case 400: /* alter_table_option */ { -#line 264 "sql.y" -#line 3374 "sql.c" } break; - case 389: /* type_name */ + case 390: /* type_name */ { -#line 386 "sql.y" -#line 3381 "sql.c" } break; - case 404: /* db_kind_opt */ - case 411: /* table_kind */ + case 405: /* db_kind_opt */ + case 412: /* table_kind */ { -#line 547 "sql.y" -#line 3389 "sql.c" } break; - case 405: /* table_kind_db_name_cond_opt */ + case 406: /* table_kind_db_name_cond_opt */ { -#line 512 "sql.y" -#line 3396 "sql.c" } break; - case 460: /* compare_op */ - case 461: /* in_op */ + case 461: /* compare_op */ + case 462: /* in_op */ { -#line 980 "sql.y" -#line 3404 "sql.c" } break; - case 473: /* join_type */ + case 474: /* join_type */ { -#line 1056 "sql.y" -#line 3411 "sql.c" } break; - case 490: /* fill_mode */ + case 491: /* fill_mode */ { -#line 1147 "sql.y" -#line 3418 "sql.c" } break; - case 501: /* ordering_specification_opt */ + case 502: /* ordering_specification_opt */ { -#line 1232 "sql.y" -#line 3425 "sql.c" } break; - case 502: /* null_ordering_opt */ + case 503: /* null_ordering_opt */ { -#line 1238 "sql.y" -#line 3432 "sql.c" } break; /********* End destructor definitions *****************************************/ @@ -3596,7 +3311,7 @@ static YYACTIONTYPE yy_find_shift_action( #endif /* YYWILDCARD */ return yy_default[stateno]; }else{ - assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) ); + assert( i>=0 && iyytos; - assert( yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ); #ifndef NDEBUG - if( yyTraceFILE ){ + if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ yysize = yyRuleInfoNRhs[yyruleno]; if( yysize ){ fprintf(yyTraceFILE, "%sReduce %d [%s]%s, pop back to state %d.\n", @@ -5068,21 +4790,15 @@ static YYACTIONTYPE yy_reduce( /********** Begin reduce actions **********************************************/ YYMINORTYPE yylhsminor; case 0: /* cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ -#line 50 "sql.y" { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } -#line 5073 "sql.c" - yy_destructor(yypParser,345,&yymsp[0].minor); - break; - case 1: /* cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ -#line 51 "sql.y" -{ pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } -#line 5079 "sql.c" yy_destructor(yypParser,346,&yymsp[0].minor); break; + case 1: /* cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ +{ pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } + yy_destructor(yypParser,347,&yymsp[0].minor); + break; case 2: /* account_options ::= */ -#line 55 "sql.y" { } -#line 5085 "sql.c" break; case 3: /* account_options ::= account_options PPS literal */ case 4: /* account_options ::= account_options TSERIES literal */ yytestcase(yyruleno==4); @@ -5093,26 +4809,20 @@ static YYACTIONTYPE yy_reduce( case 9: /* account_options ::= account_options USERS literal */ yytestcase(yyruleno==9); case 10: /* account_options ::= account_options CONNS literal */ yytestcase(yyruleno==10); case 11: /* account_options ::= account_options STATE literal */ yytestcase(yyruleno==11); -{ yy_destructor(yypParser,345,&yymsp[-2].minor); -#line 56 "sql.y" +{ yy_destructor(yypParser,346,&yymsp[-2].minor); { } -#line 5099 "sql.c" - yy_destructor(yypParser,347,&yymsp[0].minor); + yy_destructor(yypParser,348,&yymsp[0].minor); } break; case 12: /* alter_account_options ::= alter_account_option */ -{ yy_destructor(yypParser,348,&yymsp[0].minor); -#line 68 "sql.y" +{ yy_destructor(yypParser,349,&yymsp[0].minor); { } -#line 5107 "sql.c" } break; case 13: /* alter_account_options ::= alter_account_options alter_account_option */ -{ yy_destructor(yypParser,346,&yymsp[-1].minor); -#line 69 "sql.y" +{ yy_destructor(yypParser,347,&yymsp[-1].minor); { } -#line 5114 "sql.c" - yy_destructor(yypParser,348,&yymsp[0].minor); + yy_destructor(yypParser,349,&yymsp[0].minor); } break; case 14: /* alter_account_option ::= PASS literal */ @@ -5125,2566 +4835,1738 @@ static YYACTIONTYPE yy_reduce( case 21: /* alter_account_option ::= USERS literal */ yytestcase(yyruleno==21); case 22: /* alter_account_option ::= CONNS literal */ yytestcase(yyruleno==22); case 23: /* alter_account_option ::= STATE literal */ yytestcase(yyruleno==23); -#line 73 "sql.y" { } -#line 5130 "sql.c" - yy_destructor(yypParser,347,&yymsp[0].minor); + yy_destructor(yypParser,348,&yymsp[0].minor); break; case 24: /* ip_range_list ::= NK_STRING */ -#line 86 "sql.y" -{ yylhsminor.yy20 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } -#line 5136 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; +{ yylhsminor.yy712 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; case 25: /* ip_range_list ::= ip_range_list NK_COMMA NK_STRING */ -#line 87 "sql.y" -{ yylhsminor.yy20 = addNodeToList(pCxt, yymsp[-2].minor.yy20, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } -#line 5142 "sql.c" - yymsp[-2].minor.yy20 = yylhsminor.yy20; +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; break; case 26: /* white_list ::= HOST ip_range_list */ -#line 91 "sql.y" -{ yymsp[-1].minor.yy20 = yymsp[0].minor.yy20; } -#line 5148 "sql.c" +{ yymsp[-1].minor.yy712 = yymsp[0].minor.yy712; } break; case 27: /* white_list_opt ::= */ - case 184: /* specific_cols_opt ::= */ yytestcase(yyruleno==184); - case 215: /* tags_def_opt ::= */ yytestcase(yyruleno==215); - case 296: /* tag_list_opt ::= */ yytestcase(yyruleno==296); - case 358: /* col_list_opt ::= */ yytestcase(yyruleno==358); - case 360: /* tag_def_or_ref_opt ::= */ yytestcase(yyruleno==360); - case 557: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==557); - case 585: /* group_by_clause_opt ::= */ yytestcase(yyruleno==585); - case 605: /* order_by_clause_opt ::= */ yytestcase(yyruleno==605); -#line 95 "sql.y" -{ yymsp[1].minor.yy20 = NULL; } -#line 5161 "sql.c" + case 185: /* specific_cols_opt ::= */ yytestcase(yyruleno==185); + case 216: /* tags_def_opt ::= */ yytestcase(yyruleno==216); + case 297: /* tag_list_opt ::= */ yytestcase(yyruleno==297); + case 359: /* col_list_opt ::= */ yytestcase(yyruleno==359); + case 361: /* tag_def_or_ref_opt ::= */ yytestcase(yyruleno==361); + case 561: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==561); + case 589: /* group_by_clause_opt ::= */ yytestcase(yyruleno==589); + case 609: /* order_by_clause_opt ::= */ yytestcase(yyruleno==609); +{ yymsp[1].minor.yy712 = NULL; } break; case 28: /* white_list_opt ::= white_list */ - case 216: /* tags_def_opt ::= tags_def */ yytestcase(yyruleno==216); - case 361: /* tag_def_or_ref_opt ::= tags_def */ yytestcase(yyruleno==361); - case 482: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==482); -#line 96 "sql.y" -{ yylhsminor.yy20 = yymsp[0].minor.yy20; } -#line 5169 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; + case 217: /* tags_def_opt ::= tags_def */ yytestcase(yyruleno==217); + case 362: /* tag_def_or_ref_opt ::= tags_def */ yytestcase(yyruleno==362); + case 486: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==486); +{ yylhsminor.yy712 = yymsp[0].minor.yy712; } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; case 29: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt white_list_opt */ -#line 100 "sql.y" { - pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-4].minor.yy479, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy541); - pCxt->pRootNode = addCreateUserStmtWhiteList(pCxt, pCxt->pRootNode, yymsp[0].minor.yy20); + pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-4].minor.yy785, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy215); + pCxt->pRootNode = addCreateUserStmtWhiteList(pCxt, pCxt->pRootNode, yymsp[0].minor.yy712); } -#line 5178 "sql.c" break; case 30: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -#line 104 "sql.y" -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy479, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } -#line 5183 "sql.c" +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy785, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } break; case 31: /* cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ -#line 105 "sql.y" -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy479, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } -#line 5188 "sql.c" +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy785, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } break; case 32: /* cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ -#line 106 "sql.y" -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy479, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } -#line 5193 "sql.c" +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy785, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } break; case 33: /* cmd ::= ALTER USER user_name ADD white_list */ -#line 107 "sql.y" -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy479, TSDB_ALTER_USER_ADD_WHITE_LIST, yymsp[0].minor.yy20); } -#line 5198 "sql.c" +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy785, TSDB_ALTER_USER_ADD_WHITE_LIST, yymsp[0].minor.yy712); } break; case 34: /* cmd ::= ALTER USER user_name DROP white_list */ -#line 108 "sql.y" -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy479, TSDB_ALTER_USER_DROP_WHITE_LIST, yymsp[0].minor.yy20); } -#line 5203 "sql.c" +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy785, TSDB_ALTER_USER_DROP_WHITE_LIST, yymsp[0].minor.yy712); } break; case 35: /* cmd ::= DROP USER user_name */ -#line 109 "sql.y" -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy479); } -#line 5208 "sql.c" +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy785); } break; case 36: /* sysinfo_opt ::= */ -#line 113 "sql.y" -{ yymsp[1].minor.yy541 = 1; } -#line 5213 "sql.c" +{ yymsp[1].minor.yy215 = 1; } break; case 37: /* sysinfo_opt ::= SYSINFO NK_INTEGER */ -#line 114 "sql.y" -{ yymsp[-1].minor.yy541 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } -#line 5218 "sql.c" +{ yymsp[-1].minor.yy215 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } break; case 38: /* cmd ::= GRANT privileges ON priv_level with_opt TO user_name */ -#line 117 "sql.y" -{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-5].minor.yy669, &yymsp[-3].minor.yy157, &yymsp[0].minor.yy479, yymsp[-2].minor.yy342); } -#line 5223 "sql.c" +{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-5].minor.yy333, &yymsp[-3].minor.yy777, &yymsp[0].minor.yy785, yymsp[-2].minor.yy56); } break; case 39: /* cmd ::= REVOKE privileges ON priv_level with_opt FROM user_name */ -#line 118 "sql.y" -{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-5].minor.yy669, &yymsp[-3].minor.yy157, &yymsp[0].minor.yy479, yymsp[-2].minor.yy342); } -#line 5228 "sql.c" +{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-5].minor.yy333, &yymsp[-3].minor.yy777, &yymsp[0].minor.yy785, yymsp[-2].minor.yy56); } break; case 40: /* privileges ::= ALL */ -#line 122 "sql.y" -{ yymsp[0].minor.yy669 = PRIVILEGE_TYPE_ALL; } -#line 5233 "sql.c" +{ yymsp[0].minor.yy333 = PRIVILEGE_TYPE_ALL; } break; case 41: /* privileges ::= priv_type_list */ case 43: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==43); -#line 123 "sql.y" -{ yylhsminor.yy669 = yymsp[0].minor.yy669; } -#line 5239 "sql.c" - yymsp[0].minor.yy669 = yylhsminor.yy669; +{ yylhsminor.yy333 = yymsp[0].minor.yy333; } + yymsp[0].minor.yy333 = yylhsminor.yy333; break; case 42: /* privileges ::= SUBSCRIBE */ -#line 124 "sql.y" -{ yymsp[0].minor.yy669 = PRIVILEGE_TYPE_SUBSCRIBE; } -#line 5245 "sql.c" +{ yymsp[0].minor.yy333 = PRIVILEGE_TYPE_SUBSCRIBE; } break; case 44: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ -#line 129 "sql.y" -{ yylhsminor.yy669 = yymsp[-2].minor.yy669 | yymsp[0].minor.yy669; } -#line 5250 "sql.c" - yymsp[-2].minor.yy669 = yylhsminor.yy669; +{ yylhsminor.yy333 = yymsp[-2].minor.yy333 | yymsp[0].minor.yy333; } + yymsp[-2].minor.yy333 = yylhsminor.yy333; break; case 45: /* priv_type ::= READ */ -#line 133 "sql.y" -{ yymsp[0].minor.yy669 = PRIVILEGE_TYPE_READ; } -#line 5256 "sql.c" +{ yymsp[0].minor.yy333 = PRIVILEGE_TYPE_READ; } break; case 46: /* priv_type ::= WRITE */ -#line 134 "sql.y" -{ yymsp[0].minor.yy669 = PRIVILEGE_TYPE_WRITE; } -#line 5261 "sql.c" +{ yymsp[0].minor.yy333 = PRIVILEGE_TYPE_WRITE; } break; case 47: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ -#line 138 "sql.y" -{ yylhsminor.yy157.first = yymsp[-2].minor.yy0; yylhsminor.yy157.second = yymsp[0].minor.yy0; } -#line 5266 "sql.c" - yymsp[-2].minor.yy157 = yylhsminor.yy157; +{ yylhsminor.yy777.first = yymsp[-2].minor.yy0; yylhsminor.yy777.second = yymsp[0].minor.yy0; } + yymsp[-2].minor.yy777 = yylhsminor.yy777; break; case 48: /* priv_level ::= db_name NK_DOT NK_STAR */ -#line 139 "sql.y" -{ yylhsminor.yy157.first = yymsp[-2].minor.yy479; yylhsminor.yy157.second = yymsp[0].minor.yy0; } -#line 5272 "sql.c" - yymsp[-2].minor.yy157 = yylhsminor.yy157; +{ yylhsminor.yy777.first = yymsp[-2].minor.yy785; yylhsminor.yy777.second = yymsp[0].minor.yy0; } + yymsp[-2].minor.yy777 = yylhsminor.yy777; break; case 49: /* priv_level ::= db_name NK_DOT table_name */ -#line 140 "sql.y" -{ yylhsminor.yy157.first = yymsp[-2].minor.yy479; yylhsminor.yy157.second = yymsp[0].minor.yy479; } -#line 5278 "sql.c" - yymsp[-2].minor.yy157 = yylhsminor.yy157; +{ yylhsminor.yy777.first = yymsp[-2].minor.yy785; yylhsminor.yy777.second = yymsp[0].minor.yy785; } + yymsp[-2].minor.yy777 = yylhsminor.yy777; break; case 50: /* priv_level ::= topic_name */ -#line 141 "sql.y" -{ yylhsminor.yy157.first = yymsp[0].minor.yy479; yylhsminor.yy157.second = nil_token; } -#line 5284 "sql.c" - yymsp[0].minor.yy157 = yylhsminor.yy157; +{ yylhsminor.yy777.first = yymsp[0].minor.yy785; yylhsminor.yy777.second = nil_token; } + yymsp[0].minor.yy777 = yylhsminor.yy777; break; case 51: /* with_opt ::= */ - case 153: /* start_opt ::= */ yytestcase(yyruleno==153); - case 157: /* end_opt ::= */ yytestcase(yyruleno==157); - case 291: /* like_pattern_opt ::= */ yytestcase(yyruleno==291); - case 372: /* subtable_opt ::= */ yytestcase(yyruleno==372); - case 492: /* case_when_else_opt ::= */ yytestcase(yyruleno==492); - case 522: /* from_clause_opt ::= */ yytestcase(yyruleno==522); - case 555: /* where_clause_opt ::= */ yytestcase(yyruleno==555); - case 564: /* twindow_clause_opt ::= */ yytestcase(yyruleno==564); - case 570: /* sliding_opt ::= */ yytestcase(yyruleno==570); - case 575: /* fill_opt ::= */ yytestcase(yyruleno==575); - case 589: /* having_clause_opt ::= */ yytestcase(yyruleno==589); - case 591: /* range_opt ::= */ yytestcase(yyruleno==591); - case 594: /* every_opt ::= */ yytestcase(yyruleno==594); - case 607: /* slimit_clause_opt ::= */ yytestcase(yyruleno==607); - case 611: /* limit_clause_opt ::= */ yytestcase(yyruleno==611); -#line 143 "sql.y" -{ yymsp[1].minor.yy342 = NULL; } -#line 5305 "sql.c" + case 154: /* start_opt ::= */ yytestcase(yyruleno==154); + case 158: /* end_opt ::= */ yytestcase(yyruleno==158); + case 292: /* like_pattern_opt ::= */ yytestcase(yyruleno==292); + case 373: /* subtable_opt ::= */ yytestcase(yyruleno==373); + case 496: /* case_when_else_opt ::= */ yytestcase(yyruleno==496); + case 526: /* from_clause_opt ::= */ yytestcase(yyruleno==526); + case 559: /* where_clause_opt ::= */ yytestcase(yyruleno==559); + case 568: /* twindow_clause_opt ::= */ yytestcase(yyruleno==568); + case 574: /* sliding_opt ::= */ yytestcase(yyruleno==574); + case 579: /* fill_opt ::= */ yytestcase(yyruleno==579); + case 593: /* having_clause_opt ::= */ yytestcase(yyruleno==593); + case 595: /* range_opt ::= */ yytestcase(yyruleno==595); + case 598: /* every_opt ::= */ yytestcase(yyruleno==598); + case 611: /* slimit_clause_opt ::= */ yytestcase(yyruleno==611); + case 615: /* limit_clause_opt ::= */ yytestcase(yyruleno==615); +{ yymsp[1].minor.yy56 = NULL; } break; case 52: /* with_opt ::= WITH search_condition */ - case 523: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==523); - case 556: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==556); - case 590: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==590); -#line 144 "sql.y" -{ yymsp[-1].minor.yy342 = yymsp[0].minor.yy342; } -#line 5313 "sql.c" + case 527: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==527); + case 560: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==560); + case 594: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==594); +{ yymsp[-1].minor.yy56 = yymsp[0].minor.yy56; } break; case 53: /* cmd ::= CREATE DNODE dnode_endpoint */ -#line 147 "sql.y" -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy479, NULL); } -#line 5318 "sql.c" +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy785, NULL); } break; case 54: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ -#line 148 "sql.y" -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy0); } -#line 5323 "sql.c" +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy0); } break; case 55: /* cmd ::= DROP DNODE NK_INTEGER force_opt */ -#line 149 "sql.y" -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy829, false); } -#line 5328 "sql.c" +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy425, false); } break; case 56: /* cmd ::= DROP DNODE dnode_endpoint force_opt */ -#line 150 "sql.y" -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy479, yymsp[0].minor.yy829, false); } -#line 5333 "sql.c" +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy785, yymsp[0].minor.yy425, false); } break; case 57: /* cmd ::= DROP DNODE NK_INTEGER unsafe_opt */ -#line 151 "sql.y" -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, false, yymsp[0].minor.yy829); } -#line 5338 "sql.c" +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, false, yymsp[0].minor.yy425); } break; case 58: /* cmd ::= DROP DNODE dnode_endpoint unsafe_opt */ -#line 152 "sql.y" -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy479, false, yymsp[0].minor.yy829); } -#line 5343 "sql.c" +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy785, false, yymsp[0].minor.yy425); } break; case 59: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ -#line 153 "sql.y" { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } -#line 5348 "sql.c" break; case 60: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ -#line 154 "sql.y" { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-2].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } -#line 5353 "sql.c" break; case 61: /* cmd ::= ALTER ALL DNODES NK_STRING */ -#line 155 "sql.y" { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[0].minor.yy0, NULL); } -#line 5358 "sql.c" break; case 62: /* cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ -#line 156 "sql.y" { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } -#line 5363 "sql.c" break; case 63: /* cmd ::= RESTORE DNODE NK_INTEGER */ -#line 157 "sql.y" { pCxt->pRootNode = createRestoreComponentNodeStmt(pCxt, QUERY_NODE_RESTORE_DNODE_STMT, &yymsp[0].minor.yy0); } -#line 5368 "sql.c" break; case 64: /* dnode_endpoint ::= NK_STRING */ case 65: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==65); case 66: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==66); - case 318: /* sma_func_name ::= COUNT */ yytestcase(yyruleno==318); - case 319: /* sma_func_name ::= FIRST */ yytestcase(yyruleno==319); - case 320: /* sma_func_name ::= LAST */ yytestcase(yyruleno==320); - case 321: /* sma_func_name ::= LAST_ROW */ yytestcase(yyruleno==321); - case 418: /* db_name ::= NK_ID */ yytestcase(yyruleno==418); - case 419: /* table_name ::= NK_ID */ yytestcase(yyruleno==419); - case 420: /* column_name ::= NK_ID */ yytestcase(yyruleno==420); - case 421: /* function_name ::= NK_ID */ yytestcase(yyruleno==421); - case 422: /* table_alias ::= NK_ID */ yytestcase(yyruleno==422); - case 423: /* column_alias ::= NK_ID */ yytestcase(yyruleno==423); - case 424: /* user_name ::= NK_ID */ yytestcase(yyruleno==424); - case 425: /* topic_name ::= NK_ID */ yytestcase(yyruleno==425); - case 426: /* stream_name ::= NK_ID */ yytestcase(yyruleno==426); - case 427: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==427); - case 428: /* index_name ::= NK_ID */ yytestcase(yyruleno==428); - case 468: /* noarg_func ::= NOW */ yytestcase(yyruleno==468); - case 469: /* noarg_func ::= TODAY */ yytestcase(yyruleno==469); - case 470: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==470); - case 471: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==471); - case 472: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==472); - case 473: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==473); - case 474: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==474); - case 475: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==475); - case 476: /* noarg_func ::= USER */ yytestcase(yyruleno==476); - case 477: /* star_func ::= COUNT */ yytestcase(yyruleno==477); - case 478: /* star_func ::= FIRST */ yytestcase(yyruleno==478); - case 479: /* star_func ::= LAST */ yytestcase(yyruleno==479); - case 480: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==480); -#line 161 "sql.y" -{ yylhsminor.yy479 = yymsp[0].minor.yy0; } -#line 5403 "sql.c" - yymsp[0].minor.yy479 = yylhsminor.yy479; + case 319: /* sma_func_name ::= COUNT */ yytestcase(yyruleno==319); + case 320: /* sma_func_name ::= FIRST */ yytestcase(yyruleno==320); + case 321: /* sma_func_name ::= LAST */ yytestcase(yyruleno==321); + case 322: /* sma_func_name ::= LAST_ROW */ yytestcase(yyruleno==322); + case 419: /* db_name ::= NK_ID */ yytestcase(yyruleno==419); + case 420: /* table_name ::= NK_ID */ yytestcase(yyruleno==420); + case 421: /* column_name ::= NK_ID */ yytestcase(yyruleno==421); + case 422: /* function_name ::= NK_ID */ yytestcase(yyruleno==422); + case 423: /* table_alias ::= NK_ID */ yytestcase(yyruleno==423); + case 424: /* column_alias ::= NK_ID */ yytestcase(yyruleno==424); + case 425: /* column_alias ::= NK_ALIAS */ yytestcase(yyruleno==425); + case 426: /* user_name ::= NK_ID */ yytestcase(yyruleno==426); + case 427: /* topic_name ::= NK_ID */ yytestcase(yyruleno==427); + case 428: /* stream_name ::= NK_ID */ yytestcase(yyruleno==428); + case 429: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==429); + case 430: /* index_name ::= NK_ID */ yytestcase(yyruleno==430); + case 472: /* noarg_func ::= NOW */ yytestcase(yyruleno==472); + case 473: /* noarg_func ::= TODAY */ yytestcase(yyruleno==473); + case 474: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==474); + case 475: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==475); + case 476: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==476); + case 477: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==477); + case 478: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==478); + case 479: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==479); + case 480: /* noarg_func ::= USER */ yytestcase(yyruleno==480); + case 481: /* star_func ::= COUNT */ yytestcase(yyruleno==481); + case 482: /* star_func ::= FIRST */ yytestcase(yyruleno==482); + case 483: /* star_func ::= LAST */ yytestcase(yyruleno==483); + case 484: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==484); +{ yylhsminor.yy785 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy785 = yylhsminor.yy785; break; case 67: /* force_opt ::= */ case 91: /* not_exists_opt ::= */ yytestcase(yyruleno==91); case 93: /* exists_opt ::= */ yytestcase(yyruleno==93); - case 339: /* analyze_opt ::= */ yytestcase(yyruleno==339); - case 346: /* agg_func_opt ::= */ yytestcase(yyruleno==346); - case 352: /* or_replace_opt ::= */ yytestcase(yyruleno==352); - case 374: /* ignore_opt ::= */ yytestcase(yyruleno==374); - case 543: /* tag_mode_opt ::= */ yytestcase(yyruleno==543); - case 545: /* set_quantifier_opt ::= */ yytestcase(yyruleno==545); -#line 167 "sql.y" -{ yymsp[1].minor.yy829 = false; } -#line 5417 "sql.c" + case 340: /* analyze_opt ::= */ yytestcase(yyruleno==340); + case 347: /* agg_func_opt ::= */ yytestcase(yyruleno==347); + case 353: /* or_replace_opt ::= */ yytestcase(yyruleno==353); + case 375: /* ignore_opt ::= */ yytestcase(yyruleno==375); + case 547: /* tag_mode_opt ::= */ yytestcase(yyruleno==547); + case 549: /* set_quantifier_opt ::= */ yytestcase(yyruleno==549); +{ yymsp[1].minor.yy425 = false; } break; case 68: /* force_opt ::= FORCE */ case 69: /* unsafe_opt ::= UNSAFE */ yytestcase(yyruleno==69); - case 340: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==340); - case 347: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==347); - case 544: /* tag_mode_opt ::= TAGS */ yytestcase(yyruleno==544); - case 546: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==546); -#line 168 "sql.y" -{ yymsp[0].minor.yy829 = true; } -#line 5427 "sql.c" + case 341: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==341); + case 348: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==348); + case 548: /* tag_mode_opt ::= TAGS */ yytestcase(yyruleno==548); + case 550: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==550); +{ yymsp[0].minor.yy425 = true; } break; case 70: /* cmd ::= ALTER LOCAL NK_STRING */ -#line 175 "sql.y" { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } -#line 5432 "sql.c" break; case 71: /* cmd ::= ALTER LOCAL NK_STRING NK_STRING */ -#line 176 "sql.y" { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } -#line 5437 "sql.c" break; case 72: /* cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ -#line 179 "sql.y" { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_QNODE_STMT, &yymsp[0].minor.yy0); } -#line 5442 "sql.c" break; case 73: /* cmd ::= DROP QNODE ON DNODE NK_INTEGER */ -#line 180 "sql.y" { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_QNODE_STMT, &yymsp[0].minor.yy0); } -#line 5447 "sql.c" break; case 74: /* cmd ::= RESTORE QNODE ON DNODE NK_INTEGER */ -#line 181 "sql.y" { pCxt->pRootNode = createRestoreComponentNodeStmt(pCxt, QUERY_NODE_RESTORE_QNODE_STMT, &yymsp[0].minor.yy0); } -#line 5452 "sql.c" break; case 75: /* cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ -#line 184 "sql.y" { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_BNODE_STMT, &yymsp[0].minor.yy0); } -#line 5457 "sql.c" break; case 76: /* cmd ::= DROP BNODE ON DNODE NK_INTEGER */ -#line 185 "sql.y" { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_BNODE_STMT, &yymsp[0].minor.yy0); } -#line 5462 "sql.c" break; case 77: /* cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ -#line 188 "sql.y" { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_SNODE_STMT, &yymsp[0].minor.yy0); } -#line 5467 "sql.c" break; case 78: /* cmd ::= DROP SNODE ON DNODE NK_INTEGER */ -#line 189 "sql.y" { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_SNODE_STMT, &yymsp[0].minor.yy0); } -#line 5472 "sql.c" break; case 79: /* cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ -#line 192 "sql.y" { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_MNODE_STMT, &yymsp[0].minor.yy0); } -#line 5477 "sql.c" break; case 80: /* cmd ::= DROP MNODE ON DNODE NK_INTEGER */ -#line 193 "sql.y" { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_MNODE_STMT, &yymsp[0].minor.yy0); } -#line 5482 "sql.c" break; case 81: /* cmd ::= RESTORE MNODE ON DNODE NK_INTEGER */ -#line 194 "sql.y" { pCxt->pRootNode = createRestoreComponentNodeStmt(pCxt, QUERY_NODE_RESTORE_MNODE_STMT, &yymsp[0].minor.yy0); } -#line 5487 "sql.c" break; case 82: /* cmd ::= RESTORE VNODE ON DNODE NK_INTEGER */ -#line 197 "sql.y" { pCxt->pRootNode = createRestoreComponentNodeStmt(pCxt, QUERY_NODE_RESTORE_VNODE_STMT, &yymsp[0].minor.yy0); } -#line 5492 "sql.c" break; case 83: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ -#line 200 "sql.y" -{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy829, &yymsp[-1].minor.yy479, yymsp[0].minor.yy342); } -#line 5497 "sql.c" +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy425, &yymsp[-1].minor.yy785, yymsp[0].minor.yy56); } break; case 84: /* cmd ::= DROP DATABASE exists_opt db_name */ -#line 201 "sql.y" -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy829, &yymsp[0].minor.yy479); } -#line 5502 "sql.c" +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy425, &yymsp[0].minor.yy785); } break; case 85: /* cmd ::= USE db_name */ -#line 202 "sql.y" -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy479); } -#line 5507 "sql.c" +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy785); } break; case 86: /* cmd ::= ALTER DATABASE db_name alter_db_options */ -#line 203 "sql.y" -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy479, yymsp[0].minor.yy342); } -#line 5512 "sql.c" +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy785, yymsp[0].minor.yy56); } break; case 87: /* cmd ::= FLUSH DATABASE db_name */ -#line 204 "sql.y" -{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy479); } -#line 5517 "sql.c" +{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy785); } break; case 88: /* cmd ::= TRIM DATABASE db_name speed_opt */ -#line 205 "sql.y" -{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy479, yymsp[0].minor.yy114); } -#line 5522 "sql.c" +{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy785, yymsp[0].minor.yy676); } break; case 89: /* cmd ::= COMPACT DATABASE db_name start_opt end_opt */ -#line 206 "sql.y" -{ pCxt->pRootNode = createCompactStmt(pCxt, &yymsp[-2].minor.yy479, yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 5527 "sql.c" +{ pCxt->pRootNode = createCompactStmt(pCxt, &yymsp[-2].minor.yy785, yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } break; case 90: /* not_exists_opt ::= IF NOT EXISTS */ -#line 210 "sql.y" -{ yymsp[-2].minor.yy829 = true; } -#line 5532 "sql.c" +{ yymsp[-2].minor.yy425 = true; } break; case 92: /* exists_opt ::= IF EXISTS */ - case 353: /* or_replace_opt ::= OR REPLACE */ yytestcase(yyruleno==353); - case 375: /* ignore_opt ::= IGNORE UNTREATED */ yytestcase(yyruleno==375); -#line 215 "sql.y" -{ yymsp[-1].minor.yy829 = true; } -#line 5539 "sql.c" + case 354: /* or_replace_opt ::= OR REPLACE */ yytestcase(yyruleno==354); + case 376: /* ignore_opt ::= IGNORE UNTREATED */ yytestcase(yyruleno==376); +{ yymsp[-1].minor.yy425 = true; } break; case 94: /* db_options ::= */ -#line 218 "sql.y" -{ yymsp[1].minor.yy342 = createDefaultDatabaseOptions(pCxt); } -#line 5544 "sql.c" +{ yymsp[1].minor.yy56 = createDefaultDatabaseOptions(pCxt); } break; case 95: /* db_options ::= db_options BUFFER NK_INTEGER */ -#line 219 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } -#line 5549 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 96: /* db_options ::= db_options CACHEMODEL NK_STRING */ -#line 220 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } -#line 5555 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 97: /* db_options ::= db_options CACHESIZE NK_INTEGER */ -#line 221 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } -#line 5561 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 98: /* db_options ::= db_options COMP NK_INTEGER */ -#line 222 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_COMP, &yymsp[0].minor.yy0); } -#line 5567 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 99: /* db_options ::= db_options DURATION NK_INTEGER */ case 100: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==100); -#line 223 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } -#line 5574 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 101: /* db_options ::= db_options MAXROWS NK_INTEGER */ -#line 225 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } -#line 5580 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 102: /* db_options ::= db_options MINROWS NK_INTEGER */ -#line 226 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } -#line 5586 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 103: /* db_options ::= db_options KEEP integer_list */ case 104: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==104); -#line 227 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_KEEP, yymsp[0].minor.yy20); } -#line 5593 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_KEEP, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 105: /* db_options ::= db_options PAGES NK_INTEGER */ -#line 229 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } -#line 5599 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 106: /* db_options ::= db_options PAGESIZE NK_INTEGER */ -#line 230 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } -#line 5605 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 107: /* db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ -#line 231 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); } -#line 5611 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 108: /* db_options ::= db_options PRECISION NK_STRING */ -#line 232 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } -#line 5617 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 109: /* db_options ::= db_options REPLICA NK_INTEGER */ -#line 233 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } -#line 5623 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 110: /* db_options ::= db_options VGROUPS NK_INTEGER */ -#line 235 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } -#line 5629 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 111: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -#line 236 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } -#line 5635 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 112: /* db_options ::= db_options RETENTIONS retention_list */ -#line 237 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_RETENTIONS, yymsp[0].minor.yy20); } -#line 5641 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_RETENTIONS, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 113: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ -#line 238 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } -#line 5647 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 114: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */ -#line 239 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_WAL, &yymsp[0].minor.yy0); } -#line 5653 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 115: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ -#line 240 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } -#line 5659 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 116: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ -#line 241 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } -#line 5665 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 117: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ -#line 242 "sql.y" { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-3].minor.yy342, DB_OPTION_WAL_RETENTION_PERIOD, &t); + yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-3].minor.yy56, DB_OPTION_WAL_RETENTION_PERIOD, &t); } -#line 5675 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; case 118: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ -#line 247 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } -#line 5681 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 119: /* db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ -#line 248 "sql.y" { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-3].minor.yy342, DB_OPTION_WAL_RETENTION_SIZE, &t); + yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-3].minor.yy56, DB_OPTION_WAL_RETENTION_SIZE, &t); } -#line 5691 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; case 120: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ -#line 253 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } -#line 5697 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 121: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ -#line 254 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } -#line 5703 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 122: /* db_options ::= db_options STT_TRIGGER NK_INTEGER */ -#line 255 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); } -#line 5709 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 123: /* db_options ::= db_options TABLE_PREFIX signed */ -#line 256 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_TABLE_PREFIX, yymsp[0].minor.yy342); } -#line 5715 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_TABLE_PREFIX, yymsp[0].minor.yy56); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 124: /* db_options ::= db_options TABLE_SUFFIX signed */ -#line 257 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_TABLE_SUFFIX, yymsp[0].minor.yy342); } -#line 5721 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_TABLE_SUFFIX, yymsp[0].minor.yy56); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 125: /* db_options ::= db_options KEEP_TIME_OFFSET NK_INTEGER */ -#line 258 "sql.y" -{ yylhsminor.yy342 = setDatabaseOption(pCxt, yymsp[-2].minor.yy342, DB_OPTION_KEEP_TIME_OFFSET, &yymsp[0].minor.yy0); } -#line 5727 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setDatabaseOption(pCxt, yymsp[-2].minor.yy56, DB_OPTION_KEEP_TIME_OFFSET, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; case 126: /* alter_db_options ::= alter_db_option */ -#line 260 "sql.y" -{ yylhsminor.yy342 = createAlterDatabaseOptions(pCxt); yylhsminor.yy342 = setAlterDatabaseOption(pCxt, yylhsminor.yy342, &yymsp[0].minor.yy857); } -#line 5733 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = createAlterDatabaseOptions(pCxt); yylhsminor.yy56 = setAlterDatabaseOption(pCxt, yylhsminor.yy56, &yymsp[0].minor.yy893); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; case 127: /* alter_db_options ::= alter_db_options alter_db_option */ -#line 261 "sql.y" -{ yylhsminor.yy342 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy342, &yymsp[0].minor.yy857); } -#line 5739 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; +{ yylhsminor.yy56 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy56, &yymsp[0].minor.yy893); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; case 128: /* alter_db_option ::= BUFFER NK_INTEGER */ -#line 265 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5745 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 129: /* alter_db_option ::= CACHEMODEL NK_STRING */ -#line 266 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5750 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 130: /* alter_db_option ::= CACHESIZE NK_INTEGER */ -#line 267 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5755 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 131: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ -#line 268 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5760 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 132: /* alter_db_option ::= KEEP integer_list */ case 133: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==133); -#line 269 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_KEEP; yymsp[-1].minor.yy857.pList = yymsp[0].minor.yy20; } -#line 5766 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_KEEP; yymsp[-1].minor.yy893.pList = yymsp[0].minor.yy712; } break; case 134: /* alter_db_option ::= PAGES NK_INTEGER */ -#line 271 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_PAGES; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5771 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_PAGES; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 135: /* alter_db_option ::= REPLICA NK_INTEGER */ -#line 272 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5776 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 136: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ -#line 274 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_WAL; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5781 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_WAL; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 137: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */ -#line 275 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5786 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 138: /* alter_db_option ::= MINROWS NK_INTEGER */ -#line 276 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_MINROWS; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5791 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_MINROWS; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 139: /* alter_db_option ::= WAL_RETENTION_PERIOD NK_INTEGER */ -#line 277 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_WAL_RETENTION_PERIOD; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5796 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_WAL_RETENTION_PERIOD; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 140: /* alter_db_option ::= WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ -#line 278 "sql.y" { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yymsp[-2].minor.yy857.type = DB_OPTION_WAL_RETENTION_PERIOD; yymsp[-2].minor.yy857.val = t; + yymsp[-2].minor.yy893.type = DB_OPTION_WAL_RETENTION_PERIOD; yymsp[-2].minor.yy893.val = t; } -#line 5805 "sql.c" break; case 141: /* alter_db_option ::= WAL_RETENTION_SIZE NK_INTEGER */ -#line 283 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_WAL_RETENTION_SIZE; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5810 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_WAL_RETENTION_SIZE; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 142: /* alter_db_option ::= WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ -#line 284 "sql.y" { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yymsp[-2].minor.yy857.type = DB_OPTION_WAL_RETENTION_SIZE; yymsp[-2].minor.yy857.val = t; + yymsp[-2].minor.yy893.type = DB_OPTION_WAL_RETENTION_SIZE; yymsp[-2].minor.yy893.val = t; } -#line 5819 "sql.c" break; case 143: /* alter_db_option ::= KEEP_TIME_OFFSET NK_INTEGER */ -#line 289 "sql.y" -{ yymsp[-1].minor.yy857.type = DB_OPTION_KEEP_TIME_OFFSET; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 5824 "sql.c" +{ yymsp[-1].minor.yy893.type = DB_OPTION_KEEP_TIME_OFFSET; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } break; case 144: /* integer_list ::= NK_INTEGER */ -#line 293 "sql.y" -{ yylhsminor.yy20 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } -#line 5829 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; +{ yylhsminor.yy712 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; case 145: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 387: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==387); -#line 294 "sql.y" -{ yylhsminor.yy20 = addNodeToList(pCxt, yymsp[-2].minor.yy20, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } -#line 5836 "sql.c" - yymsp[-2].minor.yy20 = yylhsminor.yy20; + case 388: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==388); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; break; case 146: /* variable_list ::= NK_VARIABLE */ -#line 298 "sql.y" -{ yylhsminor.yy20 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } -#line 5842 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; +{ yylhsminor.yy712 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; case 147: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ -#line 299 "sql.y" -{ yylhsminor.yy20 = addNodeToList(pCxt, yymsp[-2].minor.yy20, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } -#line 5848 "sql.c" - yymsp[-2].minor.yy20 = yylhsminor.yy20; +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; break; case 148: /* retention_list ::= retention */ - case 178: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==178); - case 181: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==181); - case 188: /* column_def_list ::= column_def */ yytestcase(yyruleno==188); - case 232: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==232); - case 237: /* col_name_list ::= col_name */ yytestcase(yyruleno==237); - case 297: /* tag_list_opt ::= tag_item */ yytestcase(yyruleno==297); - case 314: /* func_list ::= func */ yytestcase(yyruleno==314); - case 416: /* literal_list ::= signed_literal */ yytestcase(yyruleno==416); - case 483: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==483); - case 489: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==489); - case 548: /* select_list ::= select_item */ yytestcase(yyruleno==548); - case 559: /* partition_list ::= partition_item */ yytestcase(yyruleno==559); - case 618: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==618); -#line 303 "sql.y" -{ yylhsminor.yy20 = createNodeList(pCxt, yymsp[0].minor.yy342); } -#line 5867 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; + case 179: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==179); + case 182: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==182); + case 189: /* column_def_list ::= column_def */ yytestcase(yyruleno==189); + case 233: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==233); + case 238: /* col_name_list ::= col_name */ yytestcase(yyruleno==238); + case 298: /* tag_list_opt ::= tag_item */ yytestcase(yyruleno==298); + case 315: /* func_list ::= func */ yytestcase(yyruleno==315); + case 417: /* literal_list ::= signed_literal */ yytestcase(yyruleno==417); + case 487: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==487); + case 493: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==493); + case 552: /* select_list ::= select_item */ yytestcase(yyruleno==552); + case 563: /* partition_list ::= partition_item */ yytestcase(yyruleno==563); + case 622: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==622); +{ yylhsminor.yy712 = createNodeList(pCxt, yymsp[0].minor.yy56); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; case 149: /* retention_list ::= retention_list NK_COMMA retention */ - case 182: /* multi_drop_clause ::= multi_drop_clause NK_COMMA drop_table_clause */ yytestcase(yyruleno==182); - case 189: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==189); - case 233: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==233); - case 238: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==238); - case 298: /* tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ yytestcase(yyruleno==298); - case 315: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==315); - case 417: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==417); - case 484: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==484); - case 549: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==549); - case 560: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==560); - case 619: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==619); -#line 304 "sql.y" -{ yylhsminor.yy20 = addNodeToList(pCxt, yymsp[-2].minor.yy20, yymsp[0].minor.yy342); } -#line 5884 "sql.c" - yymsp[-2].minor.yy20 = yylhsminor.yy20; + case 183: /* multi_drop_clause ::= multi_drop_clause NK_COMMA drop_table_clause */ yytestcase(yyruleno==183); + case 190: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==190); + case 234: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==234); + case 239: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==239); + case 299: /* tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ yytestcase(yyruleno==299); + case 316: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==316); + case 418: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==418); + case 488: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==488); + case 553: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==553); + case 564: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==564); + case 623: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==623); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, yymsp[0].minor.yy56); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; break; case 150: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ -#line 306 "sql.y" -{ yylhsminor.yy342 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } -#line 5890 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; - break; - case 151: /* speed_opt ::= */ - case 348: /* bufsize_opt ::= */ yytestcase(yyruleno==348); -#line 310 "sql.y" -{ yymsp[1].minor.yy114 = 0; } -#line 5897 "sql.c" - break; - case 152: /* speed_opt ::= BWLIMIT NK_INTEGER */ - case 349: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==349); -#line 311 "sql.y" -{ yymsp[-1].minor.yy114 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } -#line 5903 "sql.c" - break; - case 154: /* start_opt ::= START WITH NK_INTEGER */ - case 158: /* end_opt ::= END WITH NK_INTEGER */ yytestcase(yyruleno==158); -#line 314 "sql.y" -{ yymsp[-2].minor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } -#line 5909 "sql.c" - break; - case 155: /* start_opt ::= START WITH NK_STRING */ - case 159: /* end_opt ::= END WITH NK_STRING */ yytestcase(yyruleno==159); -#line 315 "sql.y" -{ yymsp[-2].minor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } -#line 5915 "sql.c" - break; - case 156: /* start_opt ::= START WITH TIMESTAMP NK_STRING */ - case 160: /* end_opt ::= END WITH TIMESTAMP NK_STRING */ yytestcase(yyruleno==160); -#line 316 "sql.y" -{ yymsp[-3].minor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } -#line 5921 "sql.c" - break; - case 161: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - case 163: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==163); -#line 325 "sql.y" -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy829, yymsp[-5].minor.yy342, yymsp[-3].minor.yy20, yymsp[-1].minor.yy20, yymsp[0].minor.yy342); } -#line 5927 "sql.c" - break; - case 162: /* cmd ::= CREATE TABLE multi_create_clause */ -#line 326 "sql.y" -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy20); } -#line 5932 "sql.c" - break; - case 164: /* cmd ::= DROP TABLE multi_drop_clause */ -#line 329 "sql.y" -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy20); } -#line 5937 "sql.c" - break; - case 165: /* cmd ::= DROP STABLE exists_opt full_table_name */ -#line 330 "sql.y" -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy829, yymsp[0].minor.yy342); } -#line 5942 "sql.c" - break; - case 166: /* cmd ::= ALTER TABLE alter_table_clause */ - case 389: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==389); - case 390: /* cmd ::= insert_query */ yytestcase(yyruleno==390); -#line 332 "sql.y" -{ pCxt->pRootNode = yymsp[0].minor.yy342; } -#line 5949 "sql.c" - break; - case 167: /* cmd ::= ALTER STABLE alter_table_clause */ -#line 333 "sql.y" -{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy342); } -#line 5954 "sql.c" - break; - case 168: /* alter_table_clause ::= full_table_name alter_table_options */ -#line 335 "sql.y" -{ yylhsminor.yy342 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 5959 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; - break; - case 169: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ -#line 337 "sql.y" -{ yylhsminor.yy342 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy342, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy479, yymsp[0].minor.yy750); } -#line 5965 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 170: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ -#line 338 "sql.y" -{ yylhsminor.yy342 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy342, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy479); } -#line 5971 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; - break; - case 171: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ -#line 340 "sql.y" -{ yylhsminor.yy342 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy342, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy479, yymsp[0].minor.yy750); } -#line 5977 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 172: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ -#line 342 "sql.y" -{ yylhsminor.yy342 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy342, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy479, &yymsp[0].minor.yy479); } -#line 5983 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 173: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ -#line 344 "sql.y" -{ yylhsminor.yy342 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy342, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy479, yymsp[0].minor.yy750); } -#line 5989 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 174: /* alter_table_clause ::= full_table_name DROP TAG column_name */ -#line 345 "sql.y" -{ yylhsminor.yy342 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy342, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy479); } -#line 5995 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; - break; - case 175: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ -#line 347 "sql.y" -{ yylhsminor.yy342 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy342, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy479, yymsp[0].minor.yy750); } -#line 6001 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 176: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ -#line 349 "sql.y" -{ yylhsminor.yy342 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy342, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy479, &yymsp[0].minor.yy479); } -#line 6007 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 177: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ -#line 351 "sql.y" -{ yylhsminor.yy342 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy342, &yymsp[-2].minor.yy479, yymsp[0].minor.yy342); } -#line 6013 "sql.c" - yymsp[-5].minor.yy342 = yylhsminor.yy342; - break; - case 179: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ - case 490: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==490); -#line 356 "sql.y" -{ yylhsminor.yy20 = addNodeToList(pCxt, yymsp[-1].minor.yy20, yymsp[0].minor.yy342); } -#line 6020 "sql.c" - yymsp[-1].minor.yy20 = yylhsminor.yy20; - break; - case 180: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ -#line 360 "sql.y" -{ yylhsminor.yy342 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy829, yymsp[-8].minor.yy342, yymsp[-6].minor.yy342, yymsp[-5].minor.yy20, yymsp[-2].minor.yy20, yymsp[0].minor.yy342); } -#line 6026 "sql.c" - yymsp[-9].minor.yy342 = yylhsminor.yy342; - break; - case 183: /* drop_table_clause ::= exists_opt full_table_name */ -#line 367 "sql.y" -{ yylhsminor.yy342 = createDropTableClause(pCxt, yymsp[-1].minor.yy829, yymsp[0].minor.yy342); } -#line 6032 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; - break; - case 185: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ - case 359: /* col_list_opt ::= NK_LP col_name_list NK_RP */ yytestcase(yyruleno==359); -#line 372 "sql.y" -{ yymsp[-2].minor.yy20 = yymsp[-1].minor.yy20; } -#line 6039 "sql.c" - break; - case 186: /* full_table_name ::= table_name */ -#line 374 "sql.y" -{ yylhsminor.yy342 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy479, NULL); } -#line 6044 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; - break; - case 187: /* full_table_name ::= db_name NK_DOT table_name */ -#line 375 "sql.y" -{ yylhsminor.yy342 = createRealTableNode(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy479, NULL); } -#line 6050 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; - break; - case 190: /* column_def ::= column_name type_name */ -#line 382 "sql.y" -{ yylhsminor.yy342 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy479, yymsp[0].minor.yy750, NULL); } -#line 6056 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; - break; - case 191: /* type_name ::= BOOL */ -#line 387 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_BOOL); } -#line 6062 "sql.c" - break; - case 192: /* type_name ::= TINYINT */ -#line 388 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_TINYINT); } -#line 6067 "sql.c" - break; - case 193: /* type_name ::= SMALLINT */ -#line 389 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_SMALLINT); } -#line 6072 "sql.c" - break; - case 194: /* type_name ::= INT */ - case 195: /* type_name ::= INTEGER */ yytestcase(yyruleno==195); -#line 390 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_INT); } -#line 6078 "sql.c" - break; - case 196: /* type_name ::= BIGINT */ -#line 392 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_BIGINT); } -#line 6083 "sql.c" - break; - case 197: /* type_name ::= FLOAT */ -#line 393 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_FLOAT); } -#line 6088 "sql.c" - break; - case 198: /* type_name ::= DOUBLE */ -#line 394 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_DOUBLE); } -#line 6093 "sql.c" - break; - case 199: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -#line 395 "sql.y" -{ yymsp[-3].minor.yy750 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } -#line 6098 "sql.c" - break; - case 200: /* type_name ::= TIMESTAMP */ -#line 396 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } -#line 6103 "sql.c" - break; - case 201: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -#line 397 "sql.y" -{ yymsp[-3].minor.yy750 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } -#line 6108 "sql.c" - break; - case 202: /* type_name ::= TINYINT UNSIGNED */ -#line 398 "sql.y" -{ yymsp[-1].minor.yy750 = createDataType(TSDB_DATA_TYPE_UTINYINT); } -#line 6113 "sql.c" - break; - case 203: /* type_name ::= SMALLINT UNSIGNED */ -#line 399 "sql.y" -{ yymsp[-1].minor.yy750 = createDataType(TSDB_DATA_TYPE_USMALLINT); } -#line 6118 "sql.c" - break; - case 204: /* type_name ::= INT UNSIGNED */ -#line 400 "sql.y" -{ yymsp[-1].minor.yy750 = createDataType(TSDB_DATA_TYPE_UINT); } -#line 6123 "sql.c" - break; - case 205: /* type_name ::= BIGINT UNSIGNED */ -#line 401 "sql.y" -{ yymsp[-1].minor.yy750 = createDataType(TSDB_DATA_TYPE_UBIGINT); } -#line 6128 "sql.c" - break; - case 206: /* type_name ::= JSON */ -#line 402 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_JSON); } -#line 6133 "sql.c" - break; - case 207: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -#line 403 "sql.y" -{ yymsp[-3].minor.yy750 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } -#line 6138 "sql.c" - break; - case 208: /* type_name ::= MEDIUMBLOB */ -#line 404 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } -#line 6143 "sql.c" - break; - case 209: /* type_name ::= BLOB */ -#line 405 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_BLOB); } -#line 6148 "sql.c" - break; - case 210: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -#line 406 "sql.y" -{ yymsp[-3].minor.yy750 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } -#line 6153 "sql.c" - break; - case 211: /* type_name ::= GEOMETRY NK_LP NK_INTEGER NK_RP */ -#line 407 "sql.y" -{ yymsp[-3].minor.yy750 = createVarLenDataType(TSDB_DATA_TYPE_GEOMETRY, &yymsp[-1].minor.yy0); } -#line 6158 "sql.c" - break; - case 212: /* type_name ::= DECIMAL */ -#line 408 "sql.y" -{ yymsp[0].minor.yy750 = createDataType(TSDB_DATA_TYPE_DECIMAL); } -#line 6163 "sql.c" - break; - case 213: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -#line 409 "sql.y" -{ yymsp[-3].minor.yy750 = createDataType(TSDB_DATA_TYPE_DECIMAL); } -#line 6168 "sql.c" - break; - case 214: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -#line 410 "sql.y" -{ yymsp[-5].minor.yy750 = createDataType(TSDB_DATA_TYPE_DECIMAL); } -#line 6173 "sql.c" - break; - case 217: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ - case 362: /* tag_def_or_ref_opt ::= TAGS NK_LP col_name_list NK_RP */ yytestcase(yyruleno==362); -#line 419 "sql.y" -{ yymsp[-3].minor.yy20 = yymsp[-1].minor.yy20; } -#line 6179 "sql.c" - break; - case 218: /* table_options ::= */ -#line 421 "sql.y" -{ yymsp[1].minor.yy342 = createDefaultTableOptions(pCxt); } -#line 6184 "sql.c" - break; - case 219: /* table_options ::= table_options COMMENT NK_STRING */ -#line 422 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-2].minor.yy342, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } -#line 6189 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; - break; - case 220: /* table_options ::= table_options MAX_DELAY duration_list */ -#line 423 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-2].minor.yy342, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy20); } -#line 6195 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; - break; - case 221: /* table_options ::= table_options WATERMARK duration_list */ -#line 424 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-2].minor.yy342, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy20); } -#line 6201 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; - break; - case 222: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ -#line 425 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-4].minor.yy342, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy20); } -#line 6207 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 223: /* table_options ::= table_options TTL NK_INTEGER */ -#line 426 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-2].minor.yy342, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } -#line 6213 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; - break; - case 224: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -#line 427 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-4].minor.yy342, TABLE_OPTION_SMA, yymsp[-1].minor.yy20); } -#line 6219 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; - break; - case 225: /* table_options ::= table_options DELETE_MARK duration_list */ -#line 428 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-2].minor.yy342, TABLE_OPTION_DELETE_MARK, yymsp[0].minor.yy20); } -#line 6225 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; - break; - case 226: /* alter_table_options ::= alter_table_option */ -#line 430 "sql.y" -{ yylhsminor.yy342 = createAlterTableOptions(pCxt); yylhsminor.yy342 = setTableOption(pCxt, yylhsminor.yy342, yymsp[0].minor.yy857.type, &yymsp[0].minor.yy857.val); } -#line 6231 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; - break; - case 227: /* alter_table_options ::= alter_table_options alter_table_option */ -#line 431 "sql.y" -{ yylhsminor.yy342 = setTableOption(pCxt, yymsp[-1].minor.yy342, yymsp[0].minor.yy857.type, &yymsp[0].minor.yy857.val); } -#line 6237 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; - break; - case 228: /* alter_table_option ::= COMMENT NK_STRING */ -#line 435 "sql.y" -{ yymsp[-1].minor.yy857.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 6243 "sql.c" - break; - case 229: /* alter_table_option ::= TTL NK_INTEGER */ -#line 436 "sql.y" -{ yymsp[-1].minor.yy857.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy857.val = yymsp[0].minor.yy0; } -#line 6248 "sql.c" - break; - case 230: /* duration_list ::= duration_literal */ - case 446: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==446); -#line 440 "sql.y" -{ yylhsminor.yy20 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy342)); } -#line 6254 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; - break; - case 231: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 447: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==447); -#line 441 "sql.y" -{ yylhsminor.yy20 = addNodeToList(pCxt, yymsp[-2].minor.yy20, releaseRawExprNode(pCxt, yymsp[0].minor.yy342)); } -#line 6261 "sql.c" - yymsp[-2].minor.yy20 = yylhsminor.yy20; - break; - case 234: /* rollup_func_name ::= function_name */ -#line 448 "sql.y" -{ yylhsminor.yy342 = createFunctionNode(pCxt, &yymsp[0].minor.yy479, NULL); } -#line 6267 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; - break; - case 235: /* rollup_func_name ::= FIRST */ - case 236: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==236); - case 300: /* tag_item ::= QTAGS */ yytestcase(yyruleno==300); -#line 449 "sql.y" -{ yylhsminor.yy342 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } -#line 6275 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; - break; - case 239: /* col_name ::= column_name */ - case 301: /* tag_item ::= column_name */ yytestcase(yyruleno==301); -#line 457 "sql.y" -{ yylhsminor.yy342 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy479); } -#line 6282 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; - break; - case 240: /* cmd ::= SHOW DNODES */ -#line 460 "sql.y" + case 151: /* retention ::= NK_MINUS NK_COLON NK_VARIABLE */ yytestcase(yyruleno==151); +{ yylhsminor.yy56 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 152: /* speed_opt ::= */ + case 349: /* bufsize_opt ::= */ yytestcase(yyruleno==349); +{ yymsp[1].minor.yy676 = 0; } + break; + case 153: /* speed_opt ::= BWLIMIT NK_INTEGER */ + case 350: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==350); +{ yymsp[-1].minor.yy676 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } + break; + case 155: /* start_opt ::= START WITH NK_INTEGER */ + case 159: /* end_opt ::= END WITH NK_INTEGER */ yytestcase(yyruleno==159); +{ yymsp[-2].minor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } + break; + case 156: /* start_opt ::= START WITH NK_STRING */ + case 160: /* end_opt ::= END WITH NK_STRING */ yytestcase(yyruleno==160); +{ yymsp[-2].minor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + break; + case 157: /* start_opt ::= START WITH TIMESTAMP NK_STRING */ + case 161: /* end_opt ::= END WITH TIMESTAMP NK_STRING */ yytestcase(yyruleno==161); +{ yymsp[-3].minor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + break; + case 162: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + case 164: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==164); +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy425, yymsp[-5].minor.yy56, yymsp[-3].minor.yy712, yymsp[-1].minor.yy712, yymsp[0].minor.yy56); } + break; + case 163: /* cmd ::= CREATE TABLE multi_create_clause */ +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy712); } + break; + case 165: /* cmd ::= DROP TABLE multi_drop_clause */ +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy712); } + break; + case 166: /* cmd ::= DROP STABLE exists_opt full_table_name */ +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy425, yymsp[0].minor.yy56); } + break; + case 167: /* cmd ::= ALTER TABLE alter_table_clause */ + case 390: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==390); + case 391: /* cmd ::= insert_query */ yytestcase(yyruleno==391); +{ pCxt->pRootNode = yymsp[0].minor.yy56; } + break; + case 168: /* cmd ::= ALTER STABLE alter_table_clause */ +{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy56); } + break; + case 169: /* alter_table_clause ::= full_table_name alter_table_options */ +{ yylhsminor.yy56 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; + break; + case 170: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ +{ yylhsminor.yy56 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy56, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy785, yymsp[0].minor.yy448); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 171: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ +{ yylhsminor.yy56 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy56, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy785); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; + break; + case 172: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ +{ yylhsminor.yy56 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy56, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy785, yymsp[0].minor.yy448); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 173: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ +{ yylhsminor.yy56 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy56, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy785, &yymsp[0].minor.yy785); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 174: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ +{ yylhsminor.yy56 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy56, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy785, yymsp[0].minor.yy448); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 175: /* alter_table_clause ::= full_table_name DROP TAG column_name */ +{ yylhsminor.yy56 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy56, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy785); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; + break; + case 176: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ +{ yylhsminor.yy56 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy56, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy785, yymsp[0].minor.yy448); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 177: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ +{ yylhsminor.yy56 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy56, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy785, &yymsp[0].minor.yy785); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 178: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ +{ yylhsminor.yy56 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy56, &yymsp[-2].minor.yy785, yymsp[0].minor.yy56); } + yymsp[-5].minor.yy56 = yylhsminor.yy56; + break; + case 180: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ + case 494: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==494); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-1].minor.yy712, yymsp[0].minor.yy56); } + yymsp[-1].minor.yy712 = yylhsminor.yy712; + break; + case 181: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ +{ yylhsminor.yy56 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy425, yymsp[-8].minor.yy56, yymsp[-6].minor.yy56, yymsp[-5].minor.yy712, yymsp[-2].minor.yy712, yymsp[0].minor.yy56); } + yymsp[-9].minor.yy56 = yylhsminor.yy56; + break; + case 184: /* drop_table_clause ::= exists_opt full_table_name */ +{ yylhsminor.yy56 = createDropTableClause(pCxt, yymsp[-1].minor.yy425, yymsp[0].minor.yy56); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; + break; + case 186: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ + case 360: /* col_list_opt ::= NK_LP col_name_list NK_RP */ yytestcase(yyruleno==360); +{ yymsp[-2].minor.yy712 = yymsp[-1].minor.yy712; } + break; + case 187: /* full_table_name ::= table_name */ +{ yylhsminor.yy56 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy785, NULL); } + yymsp[0].minor.yy56 = yylhsminor.yy56; + break; + case 188: /* full_table_name ::= db_name NK_DOT table_name */ +{ yylhsminor.yy56 = createRealTableNode(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy785, NULL); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 191: /* column_def ::= column_name type_name */ +{ yylhsminor.yy56 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy785, yymsp[0].minor.yy448, NULL); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; + break; + case 192: /* type_name ::= BOOL */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_BOOL); } + break; + case 193: /* type_name ::= TINYINT */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_TINYINT); } + break; + case 194: /* type_name ::= SMALLINT */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_SMALLINT); } + break; + case 195: /* type_name ::= INT */ + case 196: /* type_name ::= INTEGER */ yytestcase(yyruleno==196); +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_INT); } + break; + case 197: /* type_name ::= BIGINT */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_BIGINT); } + break; + case 198: /* type_name ::= FLOAT */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_FLOAT); } + break; + case 199: /* type_name ::= DOUBLE */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_DOUBLE); } + break; + case 200: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy448 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } + break; + case 201: /* type_name ::= TIMESTAMP */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } + break; + case 202: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy448 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } + break; + case 203: /* type_name ::= TINYINT UNSIGNED */ +{ yymsp[-1].minor.yy448 = createDataType(TSDB_DATA_TYPE_UTINYINT); } + break; + case 204: /* type_name ::= SMALLINT UNSIGNED */ +{ yymsp[-1].minor.yy448 = createDataType(TSDB_DATA_TYPE_USMALLINT); } + break; + case 205: /* type_name ::= INT UNSIGNED */ +{ yymsp[-1].minor.yy448 = createDataType(TSDB_DATA_TYPE_UINT); } + break; + case 206: /* type_name ::= BIGINT UNSIGNED */ +{ yymsp[-1].minor.yy448 = createDataType(TSDB_DATA_TYPE_UBIGINT); } + break; + case 207: /* type_name ::= JSON */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_JSON); } + break; + case 208: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy448 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } + break; + case 209: /* type_name ::= MEDIUMBLOB */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } + break; + case 210: /* type_name ::= BLOB */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_BLOB); } + break; + case 211: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy448 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } + break; + case 212: /* type_name ::= GEOMETRY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy448 = createVarLenDataType(TSDB_DATA_TYPE_GEOMETRY, &yymsp[-1].minor.yy0); } + break; + case 213: /* type_name ::= DECIMAL */ +{ yymsp[0].minor.yy448 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + break; + case 214: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy448 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + break; + case 215: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy448 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + break; + case 218: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ + case 363: /* tag_def_or_ref_opt ::= TAGS NK_LP col_name_list NK_RP */ yytestcase(yyruleno==363); +{ yymsp[-3].minor.yy712 = yymsp[-1].minor.yy712; } + break; + case 219: /* table_options ::= */ +{ yymsp[1].minor.yy56 = createDefaultTableOptions(pCxt); } + break; + case 220: /* table_options ::= table_options COMMENT NK_STRING */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-2].minor.yy56, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 221: /* table_options ::= table_options MAX_DELAY duration_list */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-2].minor.yy56, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 222: /* table_options ::= table_options WATERMARK duration_list */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-2].minor.yy56, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 223: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-4].minor.yy56, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy712); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 224: /* table_options ::= table_options TTL NK_INTEGER */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-2].minor.yy56, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 225: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-4].minor.yy56, TABLE_OPTION_SMA, yymsp[-1].minor.yy712); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 226: /* table_options ::= table_options DELETE_MARK duration_list */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-2].minor.yy56, TABLE_OPTION_DELETE_MARK, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 227: /* alter_table_options ::= alter_table_option */ +{ yylhsminor.yy56 = createAlterTableOptions(pCxt); yylhsminor.yy56 = setTableOption(pCxt, yylhsminor.yy56, yymsp[0].minor.yy893.type, &yymsp[0].minor.yy893.val); } + yymsp[0].minor.yy56 = yylhsminor.yy56; + break; + case 228: /* alter_table_options ::= alter_table_options alter_table_option */ +{ yylhsminor.yy56 = setTableOption(pCxt, yymsp[-1].minor.yy56, yymsp[0].minor.yy893.type, &yymsp[0].minor.yy893.val); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; + break; + case 229: /* alter_table_option ::= COMMENT NK_STRING */ +{ yymsp[-1].minor.yy893.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } + break; + case 230: /* alter_table_option ::= TTL NK_INTEGER */ +{ yymsp[-1].minor.yy893.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy893.val = yymsp[0].minor.yy0; } + break; + case 231: /* duration_list ::= duration_literal */ + case 448: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==448); +{ yylhsminor.yy712 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy56)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; + break; + case 232: /* duration_list ::= duration_list NK_COMMA duration_literal */ + case 449: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==449); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, releaseRawExprNode(pCxt, yymsp[0].minor.yy56)); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; + break; + case 235: /* rollup_func_name ::= function_name */ +{ yylhsminor.yy56 = createFunctionNode(pCxt, &yymsp[0].minor.yy785, NULL); } + yymsp[0].minor.yy56 = yylhsminor.yy56; + break; + case 236: /* rollup_func_name ::= FIRST */ + case 237: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==237); + case 301: /* tag_item ::= QTAGS */ yytestcase(yyruleno==301); +{ yylhsminor.yy56 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } + yymsp[0].minor.yy56 = yylhsminor.yy56; + break; + case 240: /* col_name ::= column_name */ + case 302: /* tag_item ::= column_name */ yytestcase(yyruleno==302); +{ yylhsminor.yy56 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy785); } + yymsp[0].minor.yy56 = yylhsminor.yy56; + break; + case 241: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } -#line 6288 "sql.c" break; - case 241: /* cmd ::= SHOW USERS */ -#line 461 "sql.y" + case 242: /* cmd ::= SHOW USERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); } -#line 6293 "sql.c" break; - case 242: /* cmd ::= SHOW USER PRIVILEGES */ -#line 462 "sql.y" + case 243: /* cmd ::= SHOW USER PRIVILEGES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USER_PRIVILEGES_STMT); } -#line 6298 "sql.c" break; - case 243: /* cmd ::= SHOW db_kind_opt DATABASES */ -#line 463 "sql.y" + case 244: /* cmd ::= SHOW db_kind_opt DATABASES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); - setShowKind(pCxt, pCxt->pRootNode, yymsp[-1].minor.yy545); + setShowKind(pCxt, pCxt->pRootNode, yymsp[-1].minor.yy33); } -#line 6306 "sql.c" break; - case 244: /* cmd ::= SHOW table_kind_db_name_cond_opt TABLES like_pattern_opt */ -#line 467 "sql.y" + case 245: /* cmd ::= SHOW table_kind_db_name_cond_opt TABLES like_pattern_opt */ { - pCxt->pRootNode = createShowTablesStmt(pCxt, yymsp[-2].minor.yy711, yymsp[0].minor.yy342, OP_TYPE_LIKE); + pCxt->pRootNode = createShowTablesStmt(pCxt, yymsp[-2].minor.yy205, yymsp[0].minor.yy56, OP_TYPE_LIKE); } -#line 6313 "sql.c" break; - case 245: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ -#line 470 "sql.y" -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy342, yymsp[0].minor.yy342, OP_TYPE_LIKE); } -#line 6318 "sql.c" + case 246: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy56, yymsp[0].minor.yy56, OP_TYPE_LIKE); } break; - case 246: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ -#line 471 "sql.y" -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy342, NULL, OP_TYPE_LIKE); } -#line 6323 "sql.c" + case 247: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy56, NULL, OP_TYPE_LIKE); } break; - case 247: /* cmd ::= SHOW MNODES */ -#line 472 "sql.y" + case 248: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } -#line 6328 "sql.c" break; - case 248: /* cmd ::= SHOW QNODES */ -#line 474 "sql.y" + case 249: /* cmd ::= SHOW QNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); } -#line 6333 "sql.c" break; - case 249: /* cmd ::= SHOW FUNCTIONS */ -#line 475 "sql.y" + case 250: /* cmd ::= SHOW FUNCTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } -#line 6338 "sql.c" break; - case 250: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ -#line 476 "sql.y" -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy342, yymsp[-1].minor.yy342, OP_TYPE_EQUAL); } -#line 6343 "sql.c" + case 251: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy56, yymsp[-1].minor.yy56, OP_TYPE_EQUAL); } break; - case 251: /* cmd ::= SHOW INDEXES FROM db_name NK_DOT table_name */ -#line 477 "sql.y" -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, createIdentifierValueNode(pCxt, &yymsp[-2].minor.yy479), createIdentifierValueNode(pCxt, &yymsp[0].minor.yy479), OP_TYPE_EQUAL); } -#line 6348 "sql.c" + case 252: /* cmd ::= SHOW INDEXES FROM db_name NK_DOT table_name */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, createIdentifierValueNode(pCxt, &yymsp[-2].minor.yy785), createIdentifierValueNode(pCxt, &yymsp[0].minor.yy785), OP_TYPE_EQUAL); } break; - case 252: /* cmd ::= SHOW STREAMS */ -#line 478 "sql.y" + case 253: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } -#line 6353 "sql.c" break; - case 253: /* cmd ::= SHOW ACCOUNTS */ -#line 479 "sql.y" + case 254: /* cmd ::= SHOW ACCOUNTS */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } -#line 6358 "sql.c" break; - case 254: /* cmd ::= SHOW APPS */ -#line 480 "sql.y" + case 255: /* cmd ::= SHOW APPS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT); } -#line 6363 "sql.c" break; - case 255: /* cmd ::= SHOW CONNECTIONS */ -#line 481 "sql.y" + case 256: /* cmd ::= SHOW CONNECTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT); } -#line 6368 "sql.c" break; - case 256: /* cmd ::= SHOW LICENCES */ - case 257: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==257); -#line 482 "sql.y" + case 257: /* cmd ::= SHOW LICENCES */ + case 258: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==258); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); } -#line 6374 "sql.c" break; - case 258: /* cmd ::= SHOW CREATE DATABASE db_name */ -#line 484 "sql.y" -{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy479); } -#line 6379 "sql.c" + case 259: /* cmd ::= SHOW CREATE DATABASE db_name */ +{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy785); } break; - case 259: /* cmd ::= SHOW CREATE TABLE full_table_name */ -#line 485 "sql.y" -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy342); } -#line 6384 "sql.c" + case 260: /* cmd ::= SHOW CREATE TABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy56); } break; - case 260: /* cmd ::= SHOW CREATE STABLE full_table_name */ -#line 486 "sql.y" -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy342); } -#line 6389 "sql.c" + case 261: /* cmd ::= SHOW CREATE STABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy56); } break; - case 261: /* cmd ::= SHOW QUERIES */ -#line 487 "sql.y" + case 262: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } -#line 6394 "sql.c" break; - case 262: /* cmd ::= SHOW SCORES */ -#line 488 "sql.y" + case 263: /* cmd ::= SHOW SCORES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); } -#line 6399 "sql.c" break; - case 263: /* cmd ::= SHOW TOPICS */ -#line 489 "sql.y" + case 264: /* cmd ::= SHOW TOPICS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); } -#line 6404 "sql.c" break; - case 264: /* cmd ::= SHOW VARIABLES */ - case 265: /* cmd ::= SHOW CLUSTER VARIABLES */ yytestcase(yyruleno==265); -#line 490 "sql.y" + case 265: /* cmd ::= SHOW VARIABLES */ + case 266: /* cmd ::= SHOW CLUSTER VARIABLES */ yytestcase(yyruleno==266); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } -#line 6410 "sql.c" break; - case 266: /* cmd ::= SHOW LOCAL VARIABLES */ -#line 492 "sql.y" + case 267: /* cmd ::= SHOW LOCAL VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); } -#line 6415 "sql.c" break; - case 267: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */ -#line 493 "sql.y" -{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy342); } -#line 6420 "sql.c" + case 268: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy56); } break; - case 268: /* cmd ::= SHOW BNODES */ -#line 494 "sql.y" + case 269: /* cmd ::= SHOW BNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); } -#line 6425 "sql.c" break; - case 269: /* cmd ::= SHOW SNODES */ -#line 495 "sql.y" + case 270: /* cmd ::= SHOW SNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } -#line 6430 "sql.c" break; - case 270: /* cmd ::= SHOW CLUSTER */ -#line 496 "sql.y" + case 271: /* cmd ::= SHOW CLUSTER */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } -#line 6435 "sql.c" break; - case 271: /* cmd ::= SHOW TRANSACTIONS */ -#line 497 "sql.y" + case 272: /* cmd ::= SHOW TRANSACTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } -#line 6440 "sql.c" break; - case 272: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ -#line 498 "sql.y" -{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy342); } -#line 6445 "sql.c" + case 273: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ +{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy56); } break; - case 273: /* cmd ::= SHOW CONSUMERS */ -#line 499 "sql.y" + case 274: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } -#line 6450 "sql.c" break; - case 274: /* cmd ::= SHOW SUBSCRIPTIONS */ -#line 500 "sql.y" + case 275: /* cmd ::= SHOW SUBSCRIPTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } -#line 6455 "sql.c" break; - case 275: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ -#line 501 "sql.y" -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy342, yymsp[-1].minor.yy342, OP_TYPE_EQUAL); } -#line 6460 "sql.c" + case 276: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy56, yymsp[-1].minor.yy56, OP_TYPE_EQUAL); } break; - case 276: /* cmd ::= SHOW TAGS FROM db_name NK_DOT table_name */ -#line 502 "sql.y" -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, createIdentifierValueNode(pCxt, &yymsp[-2].minor.yy479), createIdentifierValueNode(pCxt, &yymsp[0].minor.yy479), OP_TYPE_EQUAL); } -#line 6465 "sql.c" + case 277: /* cmd ::= SHOW TAGS FROM db_name NK_DOT table_name */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, createIdentifierValueNode(pCxt, &yymsp[-2].minor.yy785), createIdentifierValueNode(pCxt, &yymsp[0].minor.yy785), OP_TYPE_EQUAL); } break; - case 277: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */ -#line 503 "sql.y" -{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, yymsp[-1].minor.yy342, yymsp[0].minor.yy342, yymsp[-3].minor.yy20); } -#line 6470 "sql.c" + case 278: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, yymsp[-1].minor.yy56, yymsp[0].minor.yy56, yymsp[-3].minor.yy712); } break; - case 278: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM db_name NK_DOT table_name */ -#line 504 "sql.y" -{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, createIdentifierValueNode(pCxt, &yymsp[0].minor.yy479), createIdentifierValueNode(pCxt, &yymsp[-2].minor.yy479), yymsp[-4].minor.yy20); } -#line 6475 "sql.c" + case 279: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM db_name NK_DOT table_name */ +{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, createIdentifierValueNode(pCxt, &yymsp[0].minor.yy785), createIdentifierValueNode(pCxt, &yymsp[-2].minor.yy785), yymsp[-4].minor.yy712); } break; - case 279: /* cmd ::= SHOW VNODES ON DNODE NK_INTEGER */ -#line 505 "sql.y" + case 280: /* cmd ::= SHOW VNODES ON DNODE NK_INTEGER */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0), NULL); } -#line 6480 "sql.c" break; - case 280: /* cmd ::= SHOW VNODES */ -#line 506 "sql.y" + case 281: /* cmd ::= SHOW VNODES */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, NULL); } -#line 6485 "sql.c" break; - case 281: /* cmd ::= SHOW db_name_cond_opt ALIVE */ -#line 508 "sql.y" -{ pCxt->pRootNode = createShowAliveStmt(pCxt, yymsp[-1].minor.yy342, QUERY_NODE_SHOW_DB_ALIVE_STMT); } -#line 6490 "sql.c" + case 282: /* cmd ::= SHOW db_name_cond_opt ALIVE */ +{ pCxt->pRootNode = createShowAliveStmt(pCxt, yymsp[-1].minor.yy56, QUERY_NODE_SHOW_DB_ALIVE_STMT); } break; - case 282: /* cmd ::= SHOW CLUSTER ALIVE */ -#line 509 "sql.y" + case 283: /* cmd ::= SHOW CLUSTER ALIVE */ { pCxt->pRootNode = createShowAliveStmt(pCxt, NULL, QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT); } -#line 6495 "sql.c" break; - case 283: /* table_kind_db_name_cond_opt ::= */ -#line 513 "sql.y" -{ yymsp[1].minor.yy711.kind = SHOW_KIND_ALL; yymsp[1].minor.yy711.dbName = nil_token; } -#line 6500 "sql.c" + case 284: /* table_kind_db_name_cond_opt ::= */ +{ yymsp[1].minor.yy205.kind = SHOW_KIND_ALL; yymsp[1].minor.yy205.dbName = nil_token; } break; - case 284: /* table_kind_db_name_cond_opt ::= table_kind */ -#line 514 "sql.y" -{ yylhsminor.yy711.kind = yymsp[0].minor.yy545; yylhsminor.yy711.dbName = nil_token; } -#line 6505 "sql.c" - yymsp[0].minor.yy711 = yylhsminor.yy711; + case 285: /* table_kind_db_name_cond_opt ::= table_kind */ +{ yylhsminor.yy205.kind = yymsp[0].minor.yy33; yylhsminor.yy205.dbName = nil_token; } + yymsp[0].minor.yy205 = yylhsminor.yy205; break; - case 285: /* table_kind_db_name_cond_opt ::= db_name NK_DOT */ -#line 515 "sql.y" -{ yylhsminor.yy711.kind = SHOW_KIND_ALL; yylhsminor.yy711.dbName = yymsp[-1].minor.yy479; } -#line 6511 "sql.c" - yymsp[-1].minor.yy711 = yylhsminor.yy711; + case 286: /* table_kind_db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy205.kind = SHOW_KIND_ALL; yylhsminor.yy205.dbName = yymsp[-1].minor.yy785; } + yymsp[-1].minor.yy205 = yylhsminor.yy205; break; - case 286: /* table_kind_db_name_cond_opt ::= table_kind db_name NK_DOT */ -#line 516 "sql.y" -{ yylhsminor.yy711.kind = yymsp[-2].minor.yy545; yylhsminor.yy711.dbName = yymsp[-1].minor.yy479; } -#line 6517 "sql.c" - yymsp[-2].minor.yy711 = yylhsminor.yy711; + case 287: /* table_kind_db_name_cond_opt ::= table_kind db_name NK_DOT */ +{ yylhsminor.yy205.kind = yymsp[-2].minor.yy33; yylhsminor.yy205.dbName = yymsp[-1].minor.yy785; } + yymsp[-2].minor.yy205 = yylhsminor.yy205; break; - case 287: /* table_kind ::= NORMAL */ -#line 520 "sql.y" -{ yymsp[0].minor.yy545 = SHOW_KIND_TABLES_NORMAL; } -#line 6523 "sql.c" + case 288: /* table_kind ::= NORMAL */ +{ yymsp[0].minor.yy33 = SHOW_KIND_TABLES_NORMAL; } break; - case 288: /* table_kind ::= CHILD */ -#line 521 "sql.y" -{ yymsp[0].minor.yy545 = SHOW_KIND_TABLES_CHILD; } -#line 6528 "sql.c" + case 289: /* table_kind ::= CHILD */ +{ yymsp[0].minor.yy33 = SHOW_KIND_TABLES_CHILD; } break; - case 289: /* db_name_cond_opt ::= */ - case 294: /* from_db_opt ::= */ yytestcase(yyruleno==294); -#line 523 "sql.y" -{ yymsp[1].minor.yy342 = createDefaultDatabaseCondValue(pCxt); } -#line 6534 "sql.c" + case 290: /* db_name_cond_opt ::= */ + case 295: /* from_db_opt ::= */ yytestcase(yyruleno==295); +{ yymsp[1].minor.yy56 = createDefaultDatabaseCondValue(pCxt); } break; - case 290: /* db_name_cond_opt ::= db_name NK_DOT */ -#line 524 "sql.y" -{ yylhsminor.yy342 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy479); } -#line 6539 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + case 291: /* db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy56 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy785); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 292: /* like_pattern_opt ::= LIKE NK_STRING */ -#line 527 "sql.y" -{ yymsp[-1].minor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } -#line 6545 "sql.c" + case 293: /* like_pattern_opt ::= LIKE NK_STRING */ +{ yymsp[-1].minor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; - case 293: /* table_name_cond ::= table_name */ -#line 529 "sql.y" -{ yylhsminor.yy342 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy479); } -#line 6550 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 294: /* table_name_cond ::= table_name */ +{ yylhsminor.yy56 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy785); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 295: /* from_db_opt ::= FROM db_name */ -#line 532 "sql.y" -{ yymsp[-1].minor.yy342 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy479); } -#line 6556 "sql.c" + case 296: /* from_db_opt ::= FROM db_name */ +{ yymsp[-1].minor.yy56 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy785); } break; - case 299: /* tag_item ::= TBNAME */ -#line 540 "sql.y" -{ yylhsminor.yy342 = setProjectionAlias(pCxt, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL), &yymsp[0].minor.yy0); } -#line 6561 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 300: /* tag_item ::= TBNAME */ +{ yylhsminor.yy56 = setProjectionAlias(pCxt, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL), &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 302: /* tag_item ::= column_name column_alias */ -#line 543 "sql.y" -{ yylhsminor.yy342 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy479), &yymsp[0].minor.yy479); } -#line 6567 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + case 303: /* tag_item ::= column_name column_alias */ +{ yylhsminor.yy56 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy785), &yymsp[0].minor.yy785); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 303: /* tag_item ::= column_name AS column_alias */ -#line 544 "sql.y" -{ yylhsminor.yy342 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-2].minor.yy479), &yymsp[0].minor.yy479); } -#line 6573 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 304: /* tag_item ::= column_name AS column_alias */ +{ yylhsminor.yy56 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-2].minor.yy785), &yymsp[0].minor.yy785); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 304: /* db_kind_opt ::= */ -#line 548 "sql.y" -{ yymsp[1].minor.yy545 = SHOW_KIND_ALL; } -#line 6579 "sql.c" + case 305: /* db_kind_opt ::= */ +{ yymsp[1].minor.yy33 = SHOW_KIND_ALL; } break; - case 305: /* db_kind_opt ::= USER */ -#line 549 "sql.y" -{ yymsp[0].minor.yy545 = SHOW_KIND_DATABASES_USER; } -#line 6584 "sql.c" + case 306: /* db_kind_opt ::= USER */ +{ yymsp[0].minor.yy33 = SHOW_KIND_DATABASES_USER; } break; - case 306: /* db_kind_opt ::= SYSTEM */ -#line 550 "sql.y" -{ yymsp[0].minor.yy545 = SHOW_KIND_DATABASES_SYSTEM; } -#line 6589 "sql.c" + case 307: /* db_kind_opt ::= SYSTEM */ +{ yymsp[0].minor.yy33 = SHOW_KIND_DATABASES_SYSTEM; } break; - case 307: /* cmd ::= CREATE SMA INDEX not_exists_opt col_name ON full_table_name index_options */ -#line 554 "sql.y" -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy829, yymsp[-3].minor.yy342, yymsp[-1].minor.yy342, NULL, yymsp[0].minor.yy342); } -#line 6594 "sql.c" + case 308: /* cmd ::= CREATE SMA INDEX not_exists_opt col_name ON full_table_name index_options */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy425, yymsp[-3].minor.yy56, yymsp[-1].minor.yy56, NULL, yymsp[0].minor.yy56); } break; - case 308: /* cmd ::= CREATE INDEX not_exists_opt col_name ON full_table_name NK_LP col_name_list NK_RP */ -#line 556 "sql.y" -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_NORMAL, yymsp[-6].minor.yy829, yymsp[-5].minor.yy342, yymsp[-3].minor.yy342, yymsp[-1].minor.yy20, NULL); } -#line 6599 "sql.c" + case 309: /* cmd ::= CREATE INDEX not_exists_opt col_name ON full_table_name NK_LP col_name_list NK_RP */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_NORMAL, yymsp[-6].minor.yy425, yymsp[-5].minor.yy56, yymsp[-3].minor.yy56, yymsp[-1].minor.yy712, NULL); } break; - case 309: /* cmd ::= DROP INDEX exists_opt full_index_name */ -#line 557 "sql.y" -{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy829, yymsp[0].minor.yy342); } -#line 6604 "sql.c" + case 310: /* cmd ::= DROP INDEX exists_opt full_index_name */ +{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy425, yymsp[0].minor.yy56); } break; - case 310: /* full_index_name ::= index_name */ -#line 559 "sql.y" -{ yylhsminor.yy342 = createRealTableNodeForIndexName(pCxt, NULL, &yymsp[0].minor.yy479); } -#line 6609 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 311: /* full_index_name ::= index_name */ +{ yylhsminor.yy56 = createRealTableNodeForIndexName(pCxt, NULL, &yymsp[0].minor.yy785); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 311: /* full_index_name ::= db_name NK_DOT index_name */ -#line 560 "sql.y" -{ yylhsminor.yy342 = createRealTableNodeForIndexName(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy479); } -#line 6615 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 312: /* full_index_name ::= db_name NK_DOT index_name */ +{ yylhsminor.yy56 = createRealTableNodeForIndexName(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy785); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 312: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ -#line 563 "sql.y" -{ yymsp[-9].minor.yy342 = createIndexOption(pCxt, yymsp[-7].minor.yy20, releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), NULL, yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 6621 "sql.c" + case 313: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-9].minor.yy56 = createIndexOption(pCxt, yymsp[-7].minor.yy712, releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), NULL, yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } break; - case 313: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ -#line 566 "sql.y" -{ yymsp[-11].minor.yy342 = createIndexOption(pCxt, yymsp[-9].minor.yy20, releaseRawExprNode(pCxt, yymsp[-5].minor.yy342), releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 6626 "sql.c" + case 314: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-11].minor.yy56 = createIndexOption(pCxt, yymsp[-9].minor.yy712, releaseRawExprNode(pCxt, yymsp[-5].minor.yy56), releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } break; - case 316: /* func ::= sma_func_name NK_LP expression_list NK_RP */ -#line 573 "sql.y" -{ yylhsminor.yy342 = createFunctionNode(pCxt, &yymsp[-3].minor.yy479, yymsp[-1].minor.yy20); } -#line 6631 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 317: /* func ::= sma_func_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy56 = createFunctionNode(pCxt, &yymsp[-3].minor.yy785, yymsp[-1].minor.yy712); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 317: /* sma_func_name ::= function_name */ - case 533: /* alias_opt ::= table_alias */ yytestcase(yyruleno==533); -#line 577 "sql.y" -{ yylhsminor.yy479 = yymsp[0].minor.yy479; } -#line 6638 "sql.c" - yymsp[0].minor.yy479 = yylhsminor.yy479; + case 318: /* sma_func_name ::= function_name */ + case 537: /* alias_opt ::= table_alias */ yytestcase(yyruleno==537); +{ yylhsminor.yy785 = yymsp[0].minor.yy785; } + yymsp[0].minor.yy785 = yylhsminor.yy785; break; - case 322: /* sma_stream_opt ::= */ - case 363: /* stream_options ::= */ yytestcase(yyruleno==363); -#line 583 "sql.y" -{ yymsp[1].minor.yy342 = createStreamOptions(pCxt); } -#line 6645 "sql.c" + case 323: /* sma_stream_opt ::= */ + case 364: /* stream_options ::= */ yytestcase(yyruleno==364); +{ yymsp[1].minor.yy56 = createStreamOptions(pCxt); } break; - case 323: /* sma_stream_opt ::= sma_stream_opt WATERMARK duration_literal */ -#line 584 "sql.y" -{ ((SStreamOptions*)yymsp[-2].minor.yy342)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy342); yylhsminor.yy342 = yymsp[-2].minor.yy342; } -#line 6650 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 324: /* sma_stream_opt ::= sma_stream_opt WATERMARK duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy56)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy56); yylhsminor.yy56 = yymsp[-2].minor.yy56; } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 324: /* sma_stream_opt ::= sma_stream_opt MAX_DELAY duration_literal */ -#line 585 "sql.y" -{ ((SStreamOptions*)yymsp[-2].minor.yy342)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy342); yylhsminor.yy342 = yymsp[-2].minor.yy342; } -#line 6656 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 325: /* sma_stream_opt ::= sma_stream_opt MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy56)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy56); yylhsminor.yy56 = yymsp[-2].minor.yy56; } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 325: /* sma_stream_opt ::= sma_stream_opt DELETE_MARK duration_literal */ -#line 586 "sql.y" -{ ((SStreamOptions*)yymsp[-2].minor.yy342)->pDeleteMark = releaseRawExprNode(pCxt, yymsp[0].minor.yy342); yylhsminor.yy342 = yymsp[-2].minor.yy342; } -#line 6662 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 326: /* sma_stream_opt ::= sma_stream_opt DELETE_MARK duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy56)->pDeleteMark = releaseRawExprNode(pCxt, yymsp[0].minor.yy56); yylhsminor.yy56 = yymsp[-2].minor.yy56; } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 326: /* with_meta ::= AS */ -#line 591 "sql.y" -{ yymsp[0].minor.yy114 = 0; } -#line 6668 "sql.c" + case 327: /* with_meta ::= AS */ +{ yymsp[0].minor.yy676 = 0; } break; - case 327: /* with_meta ::= WITH META AS */ -#line 592 "sql.y" -{ yymsp[-2].minor.yy114 = 1; } -#line 6673 "sql.c" + case 328: /* with_meta ::= WITH META AS */ +{ yymsp[-2].minor.yy676 = 1; } break; - case 328: /* with_meta ::= ONLY META AS */ -#line 593 "sql.y" -{ yymsp[-2].minor.yy114 = 2; } -#line 6678 "sql.c" + case 329: /* with_meta ::= ONLY META AS */ +{ yymsp[-2].minor.yy676 = 2; } break; - case 329: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ -#line 595 "sql.y" -{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy829, &yymsp[-2].minor.yy479, yymsp[0].minor.yy342); } -#line 6683 "sql.c" + case 330: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ +{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy425, &yymsp[-2].minor.yy785, yymsp[0].minor.yy56); } break; - case 330: /* cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta DATABASE db_name */ -#line 597 "sql.y" -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy829, &yymsp[-3].minor.yy479, &yymsp[0].minor.yy479, yymsp[-2].minor.yy114); } -#line 6688 "sql.c" + case 331: /* cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy425, &yymsp[-3].minor.yy785, &yymsp[0].minor.yy785, yymsp[-2].minor.yy676); } break; - case 331: /* cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta STABLE full_table_name where_clause_opt */ -#line 599 "sql.y" -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-5].minor.yy829, &yymsp[-4].minor.yy479, yymsp[-1].minor.yy342, yymsp[-3].minor.yy114, yymsp[0].minor.yy342); } -#line 6693 "sql.c" + case 332: /* cmd ::= CREATE TOPIC not_exists_opt topic_name with_meta STABLE full_table_name where_clause_opt */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-5].minor.yy425, &yymsp[-4].minor.yy785, yymsp[-1].minor.yy56, yymsp[-3].minor.yy676, yymsp[0].minor.yy56); } break; - case 332: /* cmd ::= DROP TOPIC exists_opt topic_name */ -#line 601 "sql.y" -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy829, &yymsp[0].minor.yy479); } -#line 6698 "sql.c" + case 333: /* cmd ::= DROP TOPIC exists_opt topic_name */ +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy425, &yymsp[0].minor.yy785); } break; - case 333: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -#line 602 "sql.y" -{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy829, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy479); } -#line 6703 "sql.c" + case 334: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ +{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy425, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy785); } break; - case 334: /* cmd ::= DESC full_table_name */ - case 335: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==335); -#line 605 "sql.y" -{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy342); } -#line 6709 "sql.c" + case 335: /* cmd ::= DESC full_table_name */ + case 336: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==336); +{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy56); } break; - case 336: /* cmd ::= RESET QUERY CACHE */ -#line 609 "sql.y" + case 337: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } -#line 6714 "sql.c" break; - case 337: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ - case 338: /* cmd ::= EXPLAIN analyze_opt explain_options insert_query */ yytestcase(yyruleno==338); -#line 612 "sql.y" -{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy829, yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 6720 "sql.c" + case 338: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ + case 339: /* cmd ::= EXPLAIN analyze_opt explain_options insert_query */ yytestcase(yyruleno==339); +{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy425, yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } break; - case 341: /* explain_options ::= */ -#line 620 "sql.y" -{ yymsp[1].minor.yy342 = createDefaultExplainOptions(pCxt); } -#line 6725 "sql.c" + case 342: /* explain_options ::= */ +{ yymsp[1].minor.yy56 = createDefaultExplainOptions(pCxt); } break; - case 342: /* explain_options ::= explain_options VERBOSE NK_BOOL */ -#line 621 "sql.y" -{ yylhsminor.yy342 = setExplainVerbose(pCxt, yymsp[-2].minor.yy342, &yymsp[0].minor.yy0); } -#line 6730 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 343: /* explain_options ::= explain_options VERBOSE NK_BOOL */ +{ yylhsminor.yy56 = setExplainVerbose(pCxt, yymsp[-2].minor.yy56, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 343: /* explain_options ::= explain_options RATIO NK_FLOAT */ -#line 622 "sql.y" -{ yylhsminor.yy342 = setExplainRatio(pCxt, yymsp[-2].minor.yy342, &yymsp[0].minor.yy0); } -#line 6736 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 344: /* explain_options ::= explain_options RATIO NK_FLOAT */ +{ yylhsminor.yy56 = setExplainRatio(pCxt, yymsp[-2].minor.yy56, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 344: /* cmd ::= CREATE or_replace_opt agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt language_opt */ -#line 627 "sql.y" -{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-7].minor.yy829, yymsp[-9].minor.yy829, &yymsp[-6].minor.yy479, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy750, yymsp[-1].minor.yy114, &yymsp[0].minor.yy479, yymsp[-10].minor.yy829); } -#line 6742 "sql.c" + case 345: /* cmd ::= CREATE or_replace_opt agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt language_opt */ +{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-7].minor.yy425, yymsp[-9].minor.yy425, &yymsp[-6].minor.yy785, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy448, yymsp[-1].minor.yy676, &yymsp[0].minor.yy785, yymsp[-10].minor.yy425); } break; - case 345: /* cmd ::= DROP FUNCTION exists_opt function_name */ -#line 628 "sql.y" -{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy829, &yymsp[0].minor.yy479); } -#line 6747 "sql.c" + case 346: /* cmd ::= DROP FUNCTION exists_opt function_name */ +{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy425, &yymsp[0].minor.yy785); } break; - case 350: /* language_opt ::= */ - case 384: /* on_vgroup_id ::= */ yytestcase(yyruleno==384); -#line 642 "sql.y" -{ yymsp[1].minor.yy479 = nil_token; } -#line 6753 "sql.c" + case 351: /* language_opt ::= */ + case 385: /* on_vgroup_id ::= */ yytestcase(yyruleno==385); +{ yymsp[1].minor.yy785 = nil_token; } break; - case 351: /* language_opt ::= LANGUAGE NK_STRING */ - case 385: /* on_vgroup_id ::= ON NK_INTEGER */ yytestcase(yyruleno==385); -#line 643 "sql.y" -{ yymsp[-1].minor.yy479 = yymsp[0].minor.yy0; } -#line 6759 "sql.c" + case 352: /* language_opt ::= LANGUAGE NK_STRING */ + case 386: /* on_vgroup_id ::= ON NK_INTEGER */ yytestcase(yyruleno==386); +{ yymsp[-1].minor.yy785 = yymsp[0].minor.yy0; } break; - case 354: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name col_list_opt tag_def_or_ref_opt subtable_opt AS query_or_subquery */ -#line 653 "sql.y" -{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-9].minor.yy829, &yymsp[-8].minor.yy479, yymsp[-5].minor.yy342, yymsp[-7].minor.yy342, yymsp[-3].minor.yy20, yymsp[-2].minor.yy342, yymsp[0].minor.yy342, yymsp[-4].minor.yy20); } -#line 6764 "sql.c" + case 355: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name col_list_opt tag_def_or_ref_opt subtable_opt AS query_or_subquery */ +{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-9].minor.yy425, &yymsp[-8].minor.yy785, yymsp[-5].minor.yy56, yymsp[-7].minor.yy56, yymsp[-3].minor.yy712, yymsp[-2].minor.yy56, yymsp[0].minor.yy56, yymsp[-4].minor.yy712); } break; - case 355: /* cmd ::= DROP STREAM exists_opt stream_name */ -#line 654 "sql.y" -{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy829, &yymsp[0].minor.yy479); } -#line 6769 "sql.c" + case 356: /* cmd ::= DROP STREAM exists_opt stream_name */ +{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy425, &yymsp[0].minor.yy785); } break; - case 356: /* cmd ::= PAUSE STREAM exists_opt stream_name */ -#line 655 "sql.y" -{ pCxt->pRootNode = createPauseStreamStmt(pCxt, yymsp[-1].minor.yy829, &yymsp[0].minor.yy479); } -#line 6774 "sql.c" + case 357: /* cmd ::= PAUSE STREAM exists_opt stream_name */ +{ pCxt->pRootNode = createPauseStreamStmt(pCxt, yymsp[-1].minor.yy425, &yymsp[0].minor.yy785); } break; - case 357: /* cmd ::= RESUME STREAM exists_opt ignore_opt stream_name */ -#line 656 "sql.y" -{ pCxt->pRootNode = createResumeStreamStmt(pCxt, yymsp[-2].minor.yy829, yymsp[-1].minor.yy829, &yymsp[0].minor.yy479); } -#line 6779 "sql.c" + case 358: /* cmd ::= RESUME STREAM exists_opt ignore_opt stream_name */ +{ pCxt->pRootNode = createResumeStreamStmt(pCxt, yymsp[-2].minor.yy425, yymsp[-1].minor.yy425, &yymsp[0].minor.yy785); } break; - case 364: /* stream_options ::= stream_options TRIGGER AT_ONCE */ - case 365: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ yytestcase(yyruleno==365); -#line 670 "sql.y" -{ yylhsminor.yy342 = setStreamOptions(pCxt, yymsp[-2].minor.yy342, SOPT_TRIGGER_TYPE_SET, &yymsp[0].minor.yy0, NULL); } -#line 6785 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 365: /* stream_options ::= stream_options TRIGGER AT_ONCE */ + case 366: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ yytestcase(yyruleno==366); +{ yylhsminor.yy56 = setStreamOptions(pCxt, yymsp[-2].minor.yy56, SOPT_TRIGGER_TYPE_SET, &yymsp[0].minor.yy0, NULL); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 366: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ -#line 672 "sql.y" -{ yylhsminor.yy342 = setStreamOptions(pCxt, yymsp[-3].minor.yy342, SOPT_TRIGGER_TYPE_SET, &yymsp[-1].minor.yy0, releaseRawExprNode(pCxt, yymsp[0].minor.yy342)); } -#line 6791 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 367: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ +{ yylhsminor.yy56 = setStreamOptions(pCxt, yymsp[-3].minor.yy56, SOPT_TRIGGER_TYPE_SET, &yymsp[-1].minor.yy0, releaseRawExprNode(pCxt, yymsp[0].minor.yy56)); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 367: /* stream_options ::= stream_options WATERMARK duration_literal */ -#line 673 "sql.y" -{ yylhsminor.yy342 = setStreamOptions(pCxt, yymsp[-2].minor.yy342, SOPT_WATERMARK_SET, NULL, releaseRawExprNode(pCxt, yymsp[0].minor.yy342)); } -#line 6797 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 368: /* stream_options ::= stream_options WATERMARK duration_literal */ +{ yylhsminor.yy56 = setStreamOptions(pCxt, yymsp[-2].minor.yy56, SOPT_WATERMARK_SET, NULL, releaseRawExprNode(pCxt, yymsp[0].minor.yy56)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 368: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ -#line 674 "sql.y" -{ yylhsminor.yy342 = setStreamOptions(pCxt, yymsp[-3].minor.yy342, SOPT_IGNORE_EXPIRED_SET, &yymsp[0].minor.yy0, NULL); } -#line 6803 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 369: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ +{ yylhsminor.yy56 = setStreamOptions(pCxt, yymsp[-3].minor.yy56, SOPT_IGNORE_EXPIRED_SET, &yymsp[0].minor.yy0, NULL); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 369: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ -#line 675 "sql.y" -{ yylhsminor.yy342 = setStreamOptions(pCxt, yymsp[-2].minor.yy342, SOPT_FILL_HISTORY_SET, &yymsp[0].minor.yy0, NULL); } -#line 6809 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 370: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ +{ yylhsminor.yy56 = setStreamOptions(pCxt, yymsp[-2].minor.yy56, SOPT_FILL_HISTORY_SET, &yymsp[0].minor.yy0, NULL); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 370: /* stream_options ::= stream_options DELETE_MARK duration_literal */ -#line 676 "sql.y" -{ yylhsminor.yy342 = setStreamOptions(pCxt, yymsp[-2].minor.yy342, SOPT_DELETE_MARK_SET, NULL, releaseRawExprNode(pCxt, yymsp[0].minor.yy342)); } -#line 6815 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 371: /* stream_options ::= stream_options DELETE_MARK duration_literal */ +{ yylhsminor.yy56 = setStreamOptions(pCxt, yymsp[-2].minor.yy56, SOPT_DELETE_MARK_SET, NULL, releaseRawExprNode(pCxt, yymsp[0].minor.yy56)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 371: /* stream_options ::= stream_options IGNORE UPDATE NK_INTEGER */ -#line 677 "sql.y" -{ yylhsminor.yy342 = setStreamOptions(pCxt, yymsp[-3].minor.yy342, SOPT_IGNORE_UPDATE_SET, &yymsp[0].minor.yy0, NULL); } -#line 6821 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 372: /* stream_options ::= stream_options IGNORE UPDATE NK_INTEGER */ +{ yylhsminor.yy56 = setStreamOptions(pCxt, yymsp[-3].minor.yy56, SOPT_IGNORE_UPDATE_SET, &yymsp[0].minor.yy0, NULL); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 373: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ - case 571: /* sliding_opt ::= SLIDING NK_LP interval_sliding_duration_literal NK_RP */ yytestcase(yyruleno==571); - case 595: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==595); -#line 680 "sql.y" -{ yymsp[-3].minor.yy342 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy342); } -#line 6829 "sql.c" + case 374: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + case 575: /* sliding_opt ::= SLIDING NK_LP interval_sliding_duration_literal NK_RP */ yytestcase(yyruleno==575); + case 599: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==599); +{ yymsp[-3].minor.yy56 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy56); } break; - case 376: /* cmd ::= KILL CONNECTION NK_INTEGER */ -#line 688 "sql.y" + case 377: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } -#line 6834 "sql.c" break; - case 377: /* cmd ::= KILL QUERY NK_STRING */ -#line 689 "sql.y" + case 378: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } -#line 6839 "sql.c" break; - case 378: /* cmd ::= KILL TRANSACTION NK_INTEGER */ -#line 690 "sql.y" + case 379: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } -#line 6844 "sql.c" break; - case 379: /* cmd ::= BALANCE VGROUP */ -#line 693 "sql.y" + case 380: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } -#line 6849 "sql.c" break; - case 380: /* cmd ::= BALANCE VGROUP LEADER on_vgroup_id */ -#line 694 "sql.y" -{ pCxt->pRootNode = createBalanceVgroupLeaderStmt(pCxt, &yymsp[0].minor.yy479); } -#line 6854 "sql.c" + case 381: /* cmd ::= BALANCE VGROUP LEADER on_vgroup_id */ +{ pCxt->pRootNode = createBalanceVgroupLeaderStmt(pCxt, &yymsp[0].minor.yy785); } break; - case 381: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ -#line 695 "sql.y" + case 382: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } -#line 6859 "sql.c" break; - case 382: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ -#line 696 "sql.y" -{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy20); } -#line 6864 "sql.c" + case 383: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ +{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy712); } break; - case 383: /* cmd ::= SPLIT VGROUP NK_INTEGER */ -#line 697 "sql.y" + case 384: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } -#line 6869 "sql.c" break; - case 386: /* dnode_list ::= DNODE NK_INTEGER */ -#line 706 "sql.y" -{ yymsp[-1].minor.yy20 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } -#line 6874 "sql.c" + case 387: /* dnode_list ::= DNODE NK_INTEGER */ +{ yymsp[-1].minor.yy712 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } break; - case 388: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ -#line 713 "sql.y" -{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 6879 "sql.c" + case 389: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ +{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } break; - case 391: /* insert_query ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ -#line 722 "sql.y" -{ yymsp[-6].minor.yy342 = createInsertStmt(pCxt, yymsp[-4].minor.yy342, yymsp[-2].minor.yy20, yymsp[0].minor.yy342); } -#line 6884 "sql.c" + case 392: /* insert_query ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ +{ yymsp[-6].minor.yy56 = createInsertStmt(pCxt, yymsp[-4].minor.yy56, yymsp[-2].minor.yy712, yymsp[0].minor.yy56); } break; - case 392: /* insert_query ::= INSERT INTO full_table_name query_or_subquery */ -#line 723 "sql.y" -{ yymsp[-3].minor.yy342 = createInsertStmt(pCxt, yymsp[-1].minor.yy342, NULL, yymsp[0].minor.yy342); } -#line 6889 "sql.c" + case 393: /* insert_query ::= INSERT INTO full_table_name query_or_subquery */ +{ yymsp[-3].minor.yy56 = createInsertStmt(pCxt, yymsp[-1].minor.yy56, NULL, yymsp[0].minor.yy56); } break; - case 393: /* literal ::= NK_INTEGER */ -#line 726 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } -#line 6894 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 394: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 394: /* literal ::= NK_FLOAT */ -#line 727 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } -#line 6900 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 395: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 395: /* literal ::= NK_STRING */ -#line 728 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } -#line 6906 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 396: /* literal ::= NK_STRING */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 396: /* literal ::= NK_BOOL */ -#line 729 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } -#line 6912 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 397: /* literal ::= NK_BOOL */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 397: /* literal ::= TIMESTAMP NK_STRING */ -#line 730 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } -#line 6918 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + case 398: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 398: /* literal ::= duration_literal */ - case 408: /* signed_literal ::= signed */ yytestcase(yyruleno==408); - case 429: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==429); - case 430: /* expression ::= literal */ yytestcase(yyruleno==430); - case 432: /* expression ::= column_reference */ yytestcase(yyruleno==432); - case 433: /* expression ::= function_expression */ yytestcase(yyruleno==433); - case 434: /* expression ::= case_when_expression */ yytestcase(yyruleno==434); - case 465: /* function_expression ::= literal_func */ yytestcase(yyruleno==465); - case 514: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==514); - case 518: /* boolean_primary ::= predicate */ yytestcase(yyruleno==518); - case 520: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==520); - case 521: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==521); - case 524: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==524); - case 526: /* table_reference ::= table_primary */ yytestcase(yyruleno==526); - case 527: /* table_reference ::= joined_table */ yytestcase(yyruleno==527); - case 531: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==531); - case 597: /* query_simple ::= query_specification */ yytestcase(yyruleno==597); - case 598: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==598); - case 601: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==601); - case 603: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==603); -#line 731 "sql.y" -{ yylhsminor.yy342 = yymsp[0].minor.yy342; } -#line 6943 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 399: /* literal ::= duration_literal */ + case 409: /* signed_literal ::= signed */ yytestcase(yyruleno==409); + case 431: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==431); + case 432: /* expression ::= literal */ yytestcase(yyruleno==432); + case 434: /* expression ::= column_reference */ yytestcase(yyruleno==434); + case 435: /* expression ::= function_expression */ yytestcase(yyruleno==435); + case 436: /* expression ::= case_when_expression */ yytestcase(yyruleno==436); + case 469: /* function_expression ::= literal_func */ yytestcase(yyruleno==469); + case 518: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==518); + case 522: /* boolean_primary ::= predicate */ yytestcase(yyruleno==522); + case 524: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==524); + case 525: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==525); + case 528: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==528); + case 530: /* table_reference ::= table_primary */ yytestcase(yyruleno==530); + case 531: /* table_reference ::= joined_table */ yytestcase(yyruleno==531); + case 535: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==535); + case 601: /* query_simple ::= query_specification */ yytestcase(yyruleno==601); + case 602: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==602); + case 605: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==605); + case 607: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==607); +{ yylhsminor.yy56 = yymsp[0].minor.yy56; } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 399: /* literal ::= NULL */ -#line 732 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } -#line 6949 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 400: /* literal ::= NULL */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 400: /* literal ::= NK_QUESTION */ -#line 733 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } -#line 6955 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 401: /* literal ::= NK_QUESTION */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 401: /* duration_literal ::= NK_VARIABLE */ - case 572: /* interval_sliding_duration_literal ::= NK_VARIABLE */ yytestcase(yyruleno==572); - case 573: /* interval_sliding_duration_literal ::= NK_STRING */ yytestcase(yyruleno==573); - case 574: /* interval_sliding_duration_literal ::= NK_INTEGER */ yytestcase(yyruleno==574); -#line 735 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } -#line 6964 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 402: /* duration_literal ::= NK_VARIABLE */ + case 576: /* interval_sliding_duration_literal ::= NK_VARIABLE */ yytestcase(yyruleno==576); + case 577: /* interval_sliding_duration_literal ::= NK_STRING */ yytestcase(yyruleno==577); + case 578: /* interval_sliding_duration_literal ::= NK_INTEGER */ yytestcase(yyruleno==578); +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 402: /* signed ::= NK_INTEGER */ -#line 737 "sql.y" -{ yylhsminor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } -#line 6970 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 403: /* signed ::= NK_INTEGER */ +{ yylhsminor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 403: /* signed ::= NK_PLUS NK_INTEGER */ -#line 738 "sql.y" -{ yymsp[-1].minor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } -#line 6976 "sql.c" + case 404: /* signed ::= NK_PLUS NK_INTEGER */ +{ yymsp[-1].minor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } break; - case 404: /* signed ::= NK_MINUS NK_INTEGER */ -#line 739 "sql.y" + case 405: /* signed ::= NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); + yylhsminor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); } -#line 6985 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 405: /* signed ::= NK_FLOAT */ -#line 744 "sql.y" -{ yylhsminor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } -#line 6991 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 406: /* signed ::= NK_FLOAT */ +{ yylhsminor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 406: /* signed ::= NK_PLUS NK_FLOAT */ -#line 745 "sql.y" -{ yymsp[-1].minor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } -#line 6997 "sql.c" + case 407: /* signed ::= NK_PLUS NK_FLOAT */ +{ yymsp[-1].minor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 407: /* signed ::= NK_MINUS NK_FLOAT */ -#line 746 "sql.y" + case 408: /* signed ::= NK_MINUS NK_FLOAT */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); + yylhsminor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); } -#line 7006 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 409: /* signed_literal ::= NK_STRING */ -#line 753 "sql.y" -{ yylhsminor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } -#line 7012 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 410: /* signed_literal ::= NK_STRING */ +{ yylhsminor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 410: /* signed_literal ::= NK_BOOL */ -#line 754 "sql.y" -{ yylhsminor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } -#line 7018 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 411: /* signed_literal ::= NK_BOOL */ +{ yylhsminor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 411: /* signed_literal ::= TIMESTAMP NK_STRING */ -#line 755 "sql.y" -{ yymsp[-1].minor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } -#line 7024 "sql.c" + case 412: /* signed_literal ::= TIMESTAMP NK_STRING */ +{ yymsp[-1].minor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 412: /* signed_literal ::= duration_literal */ - case 414: /* signed_literal ::= literal_func */ yytestcase(yyruleno==414); - case 485: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==485); - case 551: /* select_item ::= common_expression */ yytestcase(yyruleno==551); - case 561: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==561); - case 602: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==602); - case 604: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==604); - case 617: /* search_condition ::= common_expression */ yytestcase(yyruleno==617); -#line 756 "sql.y" -{ yylhsminor.yy342 = releaseRawExprNode(pCxt, yymsp[0].minor.yy342); } -#line 7036 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 413: /* signed_literal ::= duration_literal */ + case 415: /* signed_literal ::= literal_func */ yytestcase(yyruleno==415); + case 489: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==489); + case 555: /* select_item ::= common_expression */ yytestcase(yyruleno==555); + case 565: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==565); + case 606: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==606); + case 608: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==608); + case 621: /* search_condition ::= common_expression */ yytestcase(yyruleno==621); +{ yylhsminor.yy56 = releaseRawExprNode(pCxt, yymsp[0].minor.yy56); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 413: /* signed_literal ::= NULL */ -#line 757 "sql.y" -{ yylhsminor.yy342 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } -#line 7042 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 414: /* signed_literal ::= NULL */ +{ yylhsminor.yy56 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 415: /* signed_literal ::= NK_QUESTION */ -#line 759 "sql.y" -{ yylhsminor.yy342 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } -#line 7048 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 416: /* signed_literal ::= NK_QUESTION */ +{ yylhsminor.yy56 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 431: /* expression ::= pseudo_column */ -#line 816 "sql.y" -{ yylhsminor.yy342 = yymsp[0].minor.yy342; setRawExprNodeIsPseudoColumn(pCxt, yylhsminor.yy342, true); } -#line 7054 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 433: /* expression ::= pseudo_column */ +{ yylhsminor.yy56 = yymsp[0].minor.yy56; setRawExprNodeIsPseudoColumn(pCxt, yylhsminor.yy56, true); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 435: /* expression ::= NK_LP expression NK_RP */ - case 519: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==519); - case 616: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==616); -#line 820 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy342)); } -#line 7062 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 437: /* expression ::= NK_LP expression NK_RP */ + case 523: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==523); + case 620: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==620); +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy56)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 436: /* expression ::= NK_PLUS expr_or_subquery */ -#line 821 "sql.y" + case 438: /* expression ::= NK_PLUS expr_or_subquery */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy342)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy56)); } -#line 7071 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 437: /* expression ::= NK_MINUS expr_or_subquery */ -#line 825 "sql.y" + case 439: /* expression ::= NK_MINUS expr_or_subquery */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy342), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy56), NULL)); } -#line 7080 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 438: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ -#line 829 "sql.y" + case 440: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7090 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 439: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ -#line 834 "sql.y" + case 441: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7100 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 440: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ -#line 839 "sql.y" + case 442: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7110 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 441: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ -#line 844 "sql.y" + case 443: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7120 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 442: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ -#line 849 "sql.y" + case 444: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7130 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 443: /* expression ::= column_reference NK_ARROW NK_STRING */ -#line 854 "sql.y" + case 445: /* expression ::= column_reference NK_ARROW NK_STRING */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } -#line 7139 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 444: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ -#line 858 "sql.y" + case 446: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7149 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 445: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ -#line 863 "sql.y" + case 447: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7159 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 448: /* column_reference ::= column_name */ -#line 874 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy479, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy479)); } -#line 7165 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 450: /* column_reference ::= column_name */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy785, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy785)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 449: /* column_reference ::= table_name NK_DOT column_name */ -#line 875 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy479, createColumnNode(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy479)); } -#line 7171 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 451: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy785, createColumnNode(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy785)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 450: /* pseudo_column ::= ROWTS */ - case 451: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==451); - case 453: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==453); - case 454: /* pseudo_column ::= QEND */ yytestcase(yyruleno==454); - case 455: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==455); - case 456: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==456); - case 457: /* pseudo_column ::= WEND */ yytestcase(yyruleno==457); - case 458: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==458); - case 459: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==459); - case 460: /* pseudo_column ::= ISFILLED */ yytestcase(yyruleno==460); - case 461: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==461); - case 467: /* literal_func ::= NOW */ yytestcase(yyruleno==467); -#line 877 "sql.y" -{ yylhsminor.yy342 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } -#line 7188 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 452: /* column_reference ::= NK_ALIAS */ +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 452: /* pseudo_column ::= table_name NK_DOT TBNAME */ -#line 879 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy479)))); } -#line 7194 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 453: /* column_reference ::= table_name NK_DOT NK_ALIAS */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy0, createColumnNode(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 462: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 463: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==463); -#line 890 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy479, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy479, yymsp[-1].minor.yy20)); } -#line 7201 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 454: /* pseudo_column ::= ROWTS */ + case 455: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==455); + case 457: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==457); + case 458: /* pseudo_column ::= QEND */ yytestcase(yyruleno==458); + case 459: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==459); + case 460: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==460); + case 461: /* pseudo_column ::= WEND */ yytestcase(yyruleno==461); + case 462: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==462); + case 463: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==463); + case 464: /* pseudo_column ::= ISFILLED */ yytestcase(yyruleno==464); + case 465: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==465); + case 471: /* literal_func ::= NOW */ yytestcase(yyruleno==471); +{ yylhsminor.yy56 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 464: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ -#line 893 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), yymsp[-1].minor.yy750)); } -#line 7207 "sql.c" - yymsp[-5].minor.yy342 = yylhsminor.yy342; + case 456: /* pseudo_column ::= table_name NK_DOT TBNAME */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy785)))); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 466: /* literal_func ::= noarg_func NK_LP NK_RP */ -#line 896 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy479, NULL)); } -#line 7213 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 466: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 467: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==467); +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy785, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy785, yymsp[-1].minor.yy712)); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 481: /* star_func_para_list ::= NK_STAR */ -#line 920 "sql.y" -{ yylhsminor.yy20 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } -#line 7219 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; + case 468: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), yymsp[-1].minor.yy448)); } + yymsp[-5].minor.yy56 = yylhsminor.yy56; break; - case 486: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 554: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==554); -#line 929 "sql.y" -{ yylhsminor.yy342 = createColumnNode(pCxt, &yymsp[-2].minor.yy479, &yymsp[0].minor.yy0); } -#line 7226 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 470: /* literal_func ::= noarg_func NK_LP NK_RP */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy785, NULL)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 487: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ -#line 932 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy20, yymsp[-1].minor.yy342)); } -#line 7232 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 485: /* star_func_para_list ::= NK_STAR */ +{ yylhsminor.yy712 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; - case 488: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ -#line 934 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), yymsp[-2].minor.yy20, yymsp[-1].minor.yy342)); } -#line 7238 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; + case 490: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 558: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==558); +{ yylhsminor.yy56 = createColumnNode(pCxt, &yymsp[-2].minor.yy785, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 491: /* when_then_expr ::= WHEN common_expression THEN common_expression */ -#line 941 "sql.y" -{ yymsp[-3].minor.yy342 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342)); } -#line 7244 "sql.c" + case 491: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy712, yymsp[-1].minor.yy56)); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 493: /* case_when_else_opt ::= ELSE common_expression */ -#line 944 "sql.y" -{ yymsp[-1].minor.yy342 = releaseRawExprNode(pCxt, yymsp[0].minor.yy342); } -#line 7249 "sql.c" + case 492: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), yymsp[-2].minor.yy712, yymsp[-1].minor.yy56)); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; break; - case 494: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ - case 499: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==499); -#line 947 "sql.y" + case 495: /* when_then_expr ::= WHEN common_expression THEN common_expression */ +{ yymsp[-3].minor.yy56 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56)); } + break; + case 497: /* case_when_else_opt ::= ELSE common_expression */ +{ yymsp[-1].minor.yy56 = releaseRawExprNode(pCxt, yymsp[0].minor.yy56); } + break; + case 498: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ + case 503: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==503); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy356, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy380, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7259 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 495: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ -#line 954 "sql.y" + case 499: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy342), releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy56), releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7269 "sql.c" - yymsp[-4].minor.yy342 = yylhsminor.yy342; + yymsp[-4].minor.yy56 = yylhsminor.yy56; break; - case 496: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ -#line 960 "sql.y" + case 500: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy342), releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy56), releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7279 "sql.c" - yymsp[-5].minor.yy342 = yylhsminor.yy342; + yymsp[-5].minor.yy56 = yylhsminor.yy56; break; - case 497: /* predicate ::= expr_or_subquery IS NULL */ -#line 965 "sql.y" + case 501: /* predicate ::= expr_or_subquery IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), NULL)); } -#line 7288 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 498: /* predicate ::= expr_or_subquery IS NOT NULL */ -#line 969 "sql.y" + case 502: /* predicate ::= expr_or_subquery IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), NULL)); } -#line 7297 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 500: /* compare_op ::= NK_LT */ -#line 981 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_LOWER_THAN; } -#line 7303 "sql.c" + case 504: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy380 = OP_TYPE_LOWER_THAN; } break; - case 501: /* compare_op ::= NK_GT */ -#line 982 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_GREATER_THAN; } -#line 7308 "sql.c" + case 505: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy380 = OP_TYPE_GREATER_THAN; } break; - case 502: /* compare_op ::= NK_LE */ -#line 983 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_LOWER_EQUAL; } -#line 7313 "sql.c" + case 506: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy380 = OP_TYPE_LOWER_EQUAL; } break; - case 503: /* compare_op ::= NK_GE */ -#line 984 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_GREATER_EQUAL; } -#line 7318 "sql.c" + case 507: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy380 = OP_TYPE_GREATER_EQUAL; } break; - case 504: /* compare_op ::= NK_NE */ -#line 985 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_NOT_EQUAL; } -#line 7323 "sql.c" + case 508: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy380 = OP_TYPE_NOT_EQUAL; } break; - case 505: /* compare_op ::= NK_EQ */ -#line 986 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_EQUAL; } -#line 7328 "sql.c" + case 509: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy380 = OP_TYPE_EQUAL; } break; - case 506: /* compare_op ::= LIKE */ -#line 987 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_LIKE; } -#line 7333 "sql.c" + case 510: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy380 = OP_TYPE_LIKE; } break; - case 507: /* compare_op ::= NOT LIKE */ -#line 988 "sql.y" -{ yymsp[-1].minor.yy356 = OP_TYPE_NOT_LIKE; } -#line 7338 "sql.c" + case 511: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy380 = OP_TYPE_NOT_LIKE; } break; - case 508: /* compare_op ::= MATCH */ -#line 989 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_MATCH; } -#line 7343 "sql.c" + case 512: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy380 = OP_TYPE_MATCH; } break; - case 509: /* compare_op ::= NMATCH */ -#line 990 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_NMATCH; } -#line 7348 "sql.c" + case 513: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy380 = OP_TYPE_NMATCH; } break; - case 510: /* compare_op ::= CONTAINS */ -#line 991 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_JSON_CONTAINS; } -#line 7353 "sql.c" + case 514: /* compare_op ::= CONTAINS */ +{ yymsp[0].minor.yy380 = OP_TYPE_JSON_CONTAINS; } break; - case 511: /* in_op ::= IN */ -#line 995 "sql.y" -{ yymsp[0].minor.yy356 = OP_TYPE_IN; } -#line 7358 "sql.c" + case 515: /* in_op ::= IN */ +{ yymsp[0].minor.yy380 = OP_TYPE_IN; } break; - case 512: /* in_op ::= NOT IN */ -#line 996 "sql.y" -{ yymsp[-1].minor.yy356 = OP_TYPE_NOT_IN; } -#line 7363 "sql.c" + case 516: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy380 = OP_TYPE_NOT_IN; } break; - case 513: /* in_predicate_value ::= NK_LP literal_list NK_RP */ -#line 998 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy20)); } -#line 7368 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 517: /* in_predicate_value ::= NK_LP literal_list NK_RP */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy712)); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 515: /* boolean_value_expression ::= NOT boolean_primary */ -#line 1002 "sql.y" + case 519: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy342), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy56), NULL)); } -#line 7377 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 516: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ -#line 1007 "sql.y" + case 520: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7387 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 517: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ -#line 1013 "sql.y" + case 521: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy342); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy342); - yylhsminor.yy342 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy56); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy56); + yylhsminor.yy56 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } -#line 7397 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 525: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -#line 1031 "sql.y" -{ yylhsminor.yy342 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy342, yymsp[0].minor.yy342, NULL); } -#line 7403 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 529: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy56 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy56, yymsp[0].minor.yy56, NULL); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 528: /* table_primary ::= table_name alias_opt */ -#line 1037 "sql.y" -{ yylhsminor.yy342 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy479, &yymsp[0].minor.yy479); } -#line 7409 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + case 532: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy56 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy785, &yymsp[0].minor.yy785); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 529: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -#line 1038 "sql.y" -{ yylhsminor.yy342 = createRealTableNode(pCxt, &yymsp[-3].minor.yy479, &yymsp[-1].minor.yy479, &yymsp[0].minor.yy479); } -#line 7415 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 533: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy56 = createRealTableNode(pCxt, &yymsp[-3].minor.yy785, &yymsp[-1].minor.yy785, &yymsp[0].minor.yy785); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 530: /* table_primary ::= subquery alias_opt */ -#line 1039 "sql.y" -{ yylhsminor.yy342 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy342), &yymsp[0].minor.yy479); } -#line 7421 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + case 534: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy56 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy56), &yymsp[0].minor.yy785); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 532: /* alias_opt ::= */ -#line 1044 "sql.y" -{ yymsp[1].minor.yy479 = nil_token; } -#line 7427 "sql.c" + case 536: /* alias_opt ::= */ +{ yymsp[1].minor.yy785 = nil_token; } break; - case 534: /* alias_opt ::= AS table_alias */ -#line 1046 "sql.y" -{ yymsp[-1].minor.yy479 = yymsp[0].minor.yy479; } -#line 7432 "sql.c" + case 538: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy785 = yymsp[0].minor.yy785; } break; - case 535: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 536: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==536); -#line 1048 "sql.y" -{ yymsp[-2].minor.yy342 = yymsp[-1].minor.yy342; } -#line 7438 "sql.c" + case 539: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 540: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==540); +{ yymsp[-2].minor.yy56 = yymsp[-1].minor.yy56; } break; - case 537: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -#line 1053 "sql.y" -{ yylhsminor.yy342 = createJoinTableNode(pCxt, yymsp[-4].minor.yy392, yymsp[-5].minor.yy342, yymsp[-2].minor.yy342, yymsp[0].minor.yy342); } -#line 7443 "sql.c" - yymsp[-5].minor.yy342 = yylhsminor.yy342; + case 541: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy56 = createJoinTableNode(pCxt, yymsp[-4].minor.yy36, yymsp[-5].minor.yy56, yymsp[-2].minor.yy56, yymsp[0].minor.yy56); } + yymsp[-5].minor.yy56 = yylhsminor.yy56; break; - case 538: /* join_type ::= */ -#line 1057 "sql.y" -{ yymsp[1].minor.yy392 = JOIN_TYPE_INNER; } -#line 7449 "sql.c" + case 542: /* join_type ::= */ +{ yymsp[1].minor.yy36 = JOIN_TYPE_INNER; } break; - case 539: /* join_type ::= INNER */ -#line 1058 "sql.y" -{ yymsp[0].minor.yy392 = JOIN_TYPE_INNER; } -#line 7454 "sql.c" + case 543: /* join_type ::= INNER */ +{ yymsp[0].minor.yy36 = JOIN_TYPE_INNER; } break; - case 540: /* query_specification ::= SELECT hint_list set_quantifier_opt tag_mode_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ -#line 1064 "sql.y" + case 544: /* query_specification ::= SELECT hint_list set_quantifier_opt tag_mode_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ { - yymsp[-13].minor.yy342 = createSelectStmt(pCxt, yymsp[-11].minor.yy829, yymsp[-9].minor.yy20, yymsp[-8].minor.yy342, yymsp[-12].minor.yy20); - yymsp[-13].minor.yy342 = setSelectStmtTagMode(pCxt, yymsp[-13].minor.yy342, yymsp[-10].minor.yy829); - yymsp[-13].minor.yy342 = addWhereClause(pCxt, yymsp[-13].minor.yy342, yymsp[-7].minor.yy342); - yymsp[-13].minor.yy342 = addPartitionByClause(pCxt, yymsp[-13].minor.yy342, yymsp[-6].minor.yy20); - yymsp[-13].minor.yy342 = addWindowClauseClause(pCxt, yymsp[-13].minor.yy342, yymsp[-2].minor.yy342); - yymsp[-13].minor.yy342 = addGroupByClause(pCxt, yymsp[-13].minor.yy342, yymsp[-1].minor.yy20); - yymsp[-13].minor.yy342 = addHavingClause(pCxt, yymsp[-13].minor.yy342, yymsp[0].minor.yy342); - yymsp[-13].minor.yy342 = addRangeClause(pCxt, yymsp[-13].minor.yy342, yymsp[-5].minor.yy342); - yymsp[-13].minor.yy342 = addEveryClause(pCxt, yymsp[-13].minor.yy342, yymsp[-4].minor.yy342); - yymsp[-13].minor.yy342 = addFillClause(pCxt, yymsp[-13].minor.yy342, yymsp[-3].minor.yy342); + yymsp[-13].minor.yy56 = createSelectStmt(pCxt, yymsp[-11].minor.yy425, yymsp[-9].minor.yy712, yymsp[-8].minor.yy56, yymsp[-12].minor.yy712); + yymsp[-13].minor.yy56 = setSelectStmtTagMode(pCxt, yymsp[-13].minor.yy56, yymsp[-10].minor.yy425); + yymsp[-13].minor.yy56 = addWhereClause(pCxt, yymsp[-13].minor.yy56, yymsp[-7].minor.yy56); + yymsp[-13].minor.yy56 = addPartitionByClause(pCxt, yymsp[-13].minor.yy56, yymsp[-6].minor.yy712); + yymsp[-13].minor.yy56 = addWindowClauseClause(pCxt, yymsp[-13].minor.yy56, yymsp[-2].minor.yy56); + yymsp[-13].minor.yy56 = addGroupByClause(pCxt, yymsp[-13].minor.yy56, yymsp[-1].minor.yy712); + yymsp[-13].minor.yy56 = addHavingClause(pCxt, yymsp[-13].minor.yy56, yymsp[0].minor.yy56); + yymsp[-13].minor.yy56 = addRangeClause(pCxt, yymsp[-13].minor.yy56, yymsp[-5].minor.yy56); + yymsp[-13].minor.yy56 = addEveryClause(pCxt, yymsp[-13].minor.yy56, yymsp[-4].minor.yy56); + yymsp[-13].minor.yy56 = addFillClause(pCxt, yymsp[-13].minor.yy56, yymsp[-3].minor.yy56); } -#line 7470 "sql.c" break; - case 541: /* hint_list ::= */ -#line 1079 "sql.y" -{ yymsp[1].minor.yy20 = createHintNodeList(pCxt, NULL); } -#line 7475 "sql.c" + case 545: /* hint_list ::= */ +{ yymsp[1].minor.yy712 = createHintNodeList(pCxt, NULL); } break; - case 542: /* hint_list ::= NK_HINT */ -#line 1080 "sql.y" -{ yylhsminor.yy20 = createHintNodeList(pCxt, &yymsp[0].minor.yy0); } -#line 7480 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; + case 546: /* hint_list ::= NK_HINT */ +{ yylhsminor.yy712 = createHintNodeList(pCxt, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; - case 547: /* set_quantifier_opt ::= ALL */ -#line 1091 "sql.y" -{ yymsp[0].minor.yy829 = false; } -#line 7486 "sql.c" + case 551: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy425 = false; } break; - case 550: /* select_item ::= NK_STAR */ -#line 1098 "sql.y" -{ yylhsminor.yy342 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } -#line 7491 "sql.c" - yymsp[0].minor.yy342 = yylhsminor.yy342; + case 554: /* select_item ::= NK_STAR */ +{ yylhsminor.yy56 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; break; - case 552: /* select_item ::= common_expression column_alias */ - case 562: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==562); -#line 1100 "sql.y" -{ yylhsminor.yy342 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy342), &yymsp[0].minor.yy479); } -#line 7498 "sql.c" - yymsp[-1].minor.yy342 = yylhsminor.yy342; + case 556: /* select_item ::= common_expression column_alias */ + case 566: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==566); +{ yylhsminor.yy56 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy56), &yymsp[0].minor.yy785); } + yymsp[-1].minor.yy56 = yylhsminor.yy56; break; - case 553: /* select_item ::= common_expression AS column_alias */ - case 563: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==563); -#line 1101 "sql.y" -{ yylhsminor.yy342 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), &yymsp[0].minor.yy479); } -#line 7505 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 557: /* select_item ::= common_expression AS column_alias */ + case 567: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==567); +{ yylhsminor.yy56 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), &yymsp[0].minor.yy785); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 558: /* partition_by_clause_opt ::= PARTITION BY partition_list */ - case 586: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==586); - case 606: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==606); -#line 1110 "sql.y" -{ yymsp[-2].minor.yy20 = yymsp[0].minor.yy20; } -#line 7513 "sql.c" + case 562: /* partition_by_clause_opt ::= PARTITION BY partition_list */ + case 590: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==590); + case 610: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==610); +{ yymsp[-2].minor.yy712 = yymsp[0].minor.yy712; } break; - case 565: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA interval_sliding_duration_literal NK_RP */ -#line 1123 "sql.y" -{ yymsp[-5].minor.yy342 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), releaseRawExprNode(pCxt, yymsp[-1].minor.yy342)); } -#line 7518 "sql.c" + case 569: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA interval_sliding_duration_literal NK_RP */ +{ yymsp[-5].minor.yy56 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), releaseRawExprNode(pCxt, yymsp[-1].minor.yy56)); } break; - case 566: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ -#line 1124 "sql.y" -{ yymsp[-3].minor.yy342 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy342)); } -#line 7523 "sql.c" + case 570: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ +{ yymsp[-3].minor.yy56 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy56)); } break; - case 567: /* twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_RP sliding_opt fill_opt */ -#line 1126 "sql.y" -{ yymsp[-5].minor.yy342 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), NULL, yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 7528 "sql.c" + case 571: /* twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy56 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), NULL, yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } break; - case 568: /* twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_COMMA interval_sliding_duration_literal NK_RP sliding_opt fill_opt */ -#line 1130 "sql.y" -{ yymsp[-7].minor.yy342 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy342), releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), yymsp[-1].minor.yy342, yymsp[0].minor.yy342); } -#line 7533 "sql.c" + case 572: /* twindow_clause_opt ::= INTERVAL NK_LP interval_sliding_duration_literal NK_COMMA interval_sliding_duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy56 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy56), releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), yymsp[-1].minor.yy56, yymsp[0].minor.yy56); } break; - case 569: /* twindow_clause_opt ::= EVENT_WINDOW START WITH search_condition END WITH search_condition */ -#line 1132 "sql.y" -{ yymsp[-6].minor.yy342 = createEventWindowNode(pCxt, yymsp[-3].minor.yy342, yymsp[0].minor.yy342); } -#line 7538 "sql.c" + case 573: /* twindow_clause_opt ::= EVENT_WINDOW START WITH search_condition END WITH search_condition */ +{ yymsp[-6].minor.yy56 = createEventWindowNode(pCxt, yymsp[-3].minor.yy56, yymsp[0].minor.yy56); } break; - case 576: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -#line 1142 "sql.y" -{ yymsp[-3].minor.yy342 = createFillNode(pCxt, yymsp[-1].minor.yy590, NULL); } -#line 7543 "sql.c" + case 580: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy56 = createFillNode(pCxt, yymsp[-1].minor.yy774, NULL); } break; - case 577: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA expression_list NK_RP */ -#line 1143 "sql.y" -{ yymsp[-5].minor.yy342 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy20)); } -#line 7548 "sql.c" + case 581: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA expression_list NK_RP */ +{ yymsp[-5].minor.yy56 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy712)); } break; - case 578: /* fill_opt ::= FILL NK_LP VALUE_F NK_COMMA expression_list NK_RP */ -#line 1144 "sql.y" -{ yymsp[-5].minor.yy342 = createFillNode(pCxt, FILL_MODE_VALUE_F, createNodeListNode(pCxt, yymsp[-1].minor.yy20)); } -#line 7553 "sql.c" + case 582: /* fill_opt ::= FILL NK_LP VALUE_F NK_COMMA expression_list NK_RP */ +{ yymsp[-5].minor.yy56 = createFillNode(pCxt, FILL_MODE_VALUE_F, createNodeListNode(pCxt, yymsp[-1].minor.yy712)); } break; - case 579: /* fill_mode ::= NONE */ -#line 1148 "sql.y" -{ yymsp[0].minor.yy590 = FILL_MODE_NONE; } -#line 7558 "sql.c" + case 583: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy774 = FILL_MODE_NONE; } break; - case 580: /* fill_mode ::= PREV */ -#line 1149 "sql.y" -{ yymsp[0].minor.yy590 = FILL_MODE_PREV; } -#line 7563 "sql.c" + case 584: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy774 = FILL_MODE_PREV; } break; - case 581: /* fill_mode ::= NULL */ -#line 1150 "sql.y" -{ yymsp[0].minor.yy590 = FILL_MODE_NULL; } -#line 7568 "sql.c" + case 585: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy774 = FILL_MODE_NULL; } break; - case 582: /* fill_mode ::= NULL_F */ -#line 1151 "sql.y" -{ yymsp[0].minor.yy590 = FILL_MODE_NULL_F; } -#line 7573 "sql.c" + case 586: /* fill_mode ::= NULL_F */ +{ yymsp[0].minor.yy774 = FILL_MODE_NULL_F; } break; - case 583: /* fill_mode ::= LINEAR */ -#line 1152 "sql.y" -{ yymsp[0].minor.yy590 = FILL_MODE_LINEAR; } -#line 7578 "sql.c" + case 587: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy774 = FILL_MODE_LINEAR; } break; - case 584: /* fill_mode ::= NEXT */ -#line 1153 "sql.y" -{ yymsp[0].minor.yy590 = FILL_MODE_NEXT; } -#line 7583 "sql.c" + case 588: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy774 = FILL_MODE_NEXT; } break; - case 587: /* group_by_list ::= expr_or_subquery */ -#line 1162 "sql.y" -{ yylhsminor.yy20 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); } -#line 7588 "sql.c" - yymsp[0].minor.yy20 = yylhsminor.yy20; + case 591: /* group_by_list ::= expr_or_subquery */ +{ yylhsminor.yy712 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; - case 588: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ -#line 1163 "sql.y" -{ yylhsminor.yy20 = addNodeToList(pCxt, yymsp[-2].minor.yy20, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy342))); } -#line 7594 "sql.c" - yymsp[-2].minor.yy20 = yylhsminor.yy20; + case 592: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy56))); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; break; - case 592: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ -#line 1170 "sql.y" -{ yymsp[-5].minor.yy342 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy342), releaseRawExprNode(pCxt, yymsp[-1].minor.yy342)); } -#line 7600 "sql.c" + case 596: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ +{ yymsp[-5].minor.yy56 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy56), releaseRawExprNode(pCxt, yymsp[-1].minor.yy56)); } break; - case 593: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_RP */ -#line 1172 "sql.y" -{ yymsp[-3].minor.yy342 = createInterpTimePoint(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy342)); } -#line 7605 "sql.c" + case 597: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_RP */ +{ yymsp[-3].minor.yy56 = createInterpTimePoint(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy56)); } break; - case 596: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ -#line 1179 "sql.y" + case 600: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy342 = addOrderByClause(pCxt, yymsp[-3].minor.yy342, yymsp[-2].minor.yy20); - yylhsminor.yy342 = addSlimitClause(pCxt, yylhsminor.yy342, yymsp[-1].minor.yy342); - yylhsminor.yy342 = addLimitClause(pCxt, yylhsminor.yy342, yymsp[0].minor.yy342); + yylhsminor.yy56 = addOrderByClause(pCxt, yymsp[-3].minor.yy56, yymsp[-2].minor.yy712); + yylhsminor.yy56 = addSlimitClause(pCxt, yylhsminor.yy56, yymsp[-1].minor.yy56); + yylhsminor.yy56 = addLimitClause(pCxt, yylhsminor.yy56, yymsp[0].minor.yy56); } -#line 7614 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 599: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ -#line 1189 "sql.y" -{ yylhsminor.yy342 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy342, yymsp[0].minor.yy342); } -#line 7620 "sql.c" - yymsp[-3].minor.yy342 = yylhsminor.yy342; + case 603: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ +{ yylhsminor.yy56 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy56, yymsp[0].minor.yy56); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; break; - case 600: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ -#line 1191 "sql.y" -{ yylhsminor.yy342 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy342, yymsp[0].minor.yy342); } -#line 7626 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 604: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ +{ yylhsminor.yy56 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy56, yymsp[0].minor.yy56); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 608: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 612: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==612); -#line 1205 "sql.y" -{ yymsp[-1].minor.yy342 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } -#line 7633 "sql.c" + case 612: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 616: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==616); +{ yymsp[-1].minor.yy56 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 609: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 613: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==613); -#line 1206 "sql.y" -{ yymsp[-3].minor.yy342 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } -#line 7639 "sql.c" + case 613: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 617: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==617); +{ yymsp[-3].minor.yy56 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 610: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 614: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==614); -#line 1207 "sql.y" -{ yymsp[-3].minor.yy342 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } -#line 7645 "sql.c" + case 614: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 618: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==618); +{ yymsp[-3].minor.yy56 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 615: /* subquery ::= NK_LP query_expression NK_RP */ -#line 1215 "sql.y" -{ yylhsminor.yy342 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy342); } -#line 7650 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 619: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy56 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy56); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 620: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ -#line 1229 "sql.y" -{ yylhsminor.yy342 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy342), yymsp[-1].minor.yy592, yymsp[0].minor.yy689); } -#line 7656 "sql.c" - yymsp[-2].minor.yy342 = yylhsminor.yy342; + case 624: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy56 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy56), yymsp[-1].minor.yy722, yymsp[0].minor.yy361); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; break; - case 621: /* ordering_specification_opt ::= */ -#line 1233 "sql.y" -{ yymsp[1].minor.yy592 = ORDER_ASC; } -#line 7662 "sql.c" + case 625: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy722 = ORDER_ASC; } break; - case 622: /* ordering_specification_opt ::= ASC */ -#line 1234 "sql.y" -{ yymsp[0].minor.yy592 = ORDER_ASC; } -#line 7667 "sql.c" + case 626: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy722 = ORDER_ASC; } break; - case 623: /* ordering_specification_opt ::= DESC */ -#line 1235 "sql.y" -{ yymsp[0].minor.yy592 = ORDER_DESC; } -#line 7672 "sql.c" + case 627: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy722 = ORDER_DESC; } break; - case 624: /* null_ordering_opt ::= */ -#line 1239 "sql.y" -{ yymsp[1].minor.yy689 = NULL_ORDER_DEFAULT; } -#line 7677 "sql.c" + case 628: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy361 = NULL_ORDER_DEFAULT; } break; - case 625: /* null_ordering_opt ::= NULLS FIRST */ -#line 1240 "sql.y" -{ yymsp[-1].minor.yy689 = NULL_ORDER_FIRST; } -#line 7682 "sql.c" + case 629: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy361 = NULL_ORDER_FIRST; } break; - case 626: /* null_ordering_opt ::= NULLS LAST */ -#line 1241 "sql.y" -{ yymsp[-1].minor.yy689 = NULL_ORDER_LAST; } -#line 7687 "sql.c" + case 630: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy361 = NULL_ORDER_LAST; } break; default: break; @@ -7746,7 +6628,6 @@ static void yy_syntax_error( ParseCTX_FETCH #define TOKEN yyminor /************ Begin %syntax_error code ****************************************/ -#line 29 "sql.y" if (TSDB_CODE_SUCCESS == pCxt->errCode) { if(TOKEN.z) { @@ -7757,7 +6638,6 @@ static void yy_syntax_error( } else if (TSDB_CODE_PAR_DB_NOT_SPECIFIED == pCxt->errCode && TK_NK_FLOAT == TOKEN.type) { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, TOKEN.z); } -#line 7760 "sql.c" /************ End %syntax_error code ******************************************/ ParseARG_STORE /* Suppress warning about unused %extra_argument variable */ ParseCTX_STORE diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp index 856fdb4804..6219676c50 100644 --- a/source/libs/parser/test/parInitialCTest.cpp +++ b/source/libs/parser/test/parInitialCTest.cpp @@ -247,7 +247,11 @@ TEST_F(ParserInitialCTest, createDatabase) { for (int32_t i = 0; i < expect.numOfRetensions; ++i) { SRetention* pReten = (SRetention*)taosArrayGet(req.pRetensions, i); SRetention* pExpectReten = (SRetention*)taosArrayGet(expect.pRetensions, i); - ASSERT_EQ(pReten->freq, pExpectReten->freq); + if(i == 0) { + ASSERT_EQ(pReten->freq, 0); + } else { + ASSERT_EQ(pReten->freq, pExpectReten->freq); + } ASSERT_EQ(pReten->keep, pExpectReten->keep); ASSERT_EQ(pReten->freqUnit, pExpectReten->freqUnit); ASSERT_EQ(pReten->keepUnit, pExpectReten->keepUnit); @@ -304,7 +308,7 @@ TEST_F(ParserInitialCTest, createDatabase) { "PAGESIZE 8 " "PRECISION 'ns' " "REPLICA 3 " - "RETENTIONS 15s:7d,1m:21d,15m:500d " + "RETENTIONS -:7d,1m:21d,15m:500d " // "STRICT 'on' " "WAL_LEVEL 2 " "VGROUPS 100 " @@ -340,12 +344,12 @@ TEST_F(ParserInitialCTest, createDatabase) { TEST_F(ParserInitialCTest, createDatabaseSemanticCheck) { useDb("root", "test"); - run("create database db2 retentions 0s:1d", TSDB_CODE_PAR_INVALID_DB_OPTION); - run("create database db2 retentions 10s:0d", TSDB_CODE_PAR_INVALID_DB_OPTION); - run("create database db2 retentions 1w:1d", TSDB_CODE_PAR_INVALID_DB_OPTION); - run("create database db2 retentions 1w:1n", TSDB_CODE_PAR_INVALID_DB_OPTION); - run("create database db2 retentions 15s:7d,15m:21d,10m:500d", TSDB_CODE_PAR_INVALID_DB_OPTION); - run("create database db2 retentions 15s:7d,5m:21d,10m:10d", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("create database db2 retentions -:1d,0s:1d", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("create database db2 retentions -:0d", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("create database db2 retentions -:1d,1w:1d", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("create database db2 retentions -:1n,1w:1d", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("create database db2 retentions -:7d,15m:21d,10m:500d", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("create database db2 retentions -:7d,5m:21d,10m:10d", TSDB_CODE_PAR_INVALID_DB_OPTION); } /* diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c index 4df7454df8..48886b1eec 100644 --- a/source/libs/scalar/src/sclfunc.c +++ b/source/libs/scalar/src/sclfunc.c @@ -1197,6 +1197,83 @@ int32_t toJsonFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu return TSDB_CODE_SUCCESS; } +#define TS_FORMAT_MAX_LEN 4096 +int32_t toTimestampFunction(SScalarParam* pInput, int32_t inputNum, SScalarParam* pOutput) { + int64_t ts; + char * tsStr = taosMemoryMalloc(TS_FORMAT_MAX_LEN); + char * format = taosMemoryMalloc(TS_FORMAT_MAX_LEN); + int32_t len, code = TSDB_CODE_SUCCESS; + SArray *formats = NULL; + + for (int32_t i = 0; i < pInput[0].numOfRows; ++i) { + if (colDataIsNull_s(pInput[1].columnData, i) || colDataIsNull_s(pInput[0].columnData, i)) { + colDataSetNULL(pOutput->columnData, i); + continue; + } + + char *tsData = colDataGetData(pInput[0].columnData, i); + char *formatData = colDataGetData(pInput[1].columnData, pInput[1].numOfRows > 1 ? i : 0); + len = TMIN(TS_FORMAT_MAX_LEN - 1, varDataLen(tsData)); + strncpy(tsStr, varDataVal(tsData), len); + tsStr[len] = '\0'; + len = TMIN(TS_FORMAT_MAX_LEN - 1, varDataLen(formatData)); + if (pInput[1].numOfRows > 1 || i == 0) { + strncpy(format, varDataVal(formatData), len); + format[len] = '\0'; + if (formats) { + taosArrayDestroy(formats); + formats = NULL; + } + } + int32_t precision = pOutput->columnData->info.precision; + char errMsg[128] = {0}; + code = taosChar2Ts(format, &formats, tsStr, &ts, precision, errMsg, 128); + if (code) { + qError("func to_timestamp failed %s", errMsg); + code = TSDB_CODE_FUNC_TO_TIMESTAMP_FAILED; + break; + } + colDataSetVal(pOutput->columnData, i, (char *)&ts, false); + } + if (formats) taosArrayDestroy(formats); + taosMemoryFree(tsStr); + taosMemoryFree(format); + return code; +} + +int32_t toCharFunction(SScalarParam* pInput, int32_t inputNum, SScalarParam* pOutput) { + char * format = taosMemoryMalloc(TS_FORMAT_MAX_LEN); + char * out = taosMemoryCalloc(1, TS_FORMAT_MAX_LEN + VARSTR_HEADER_SIZE); + int32_t len; + SArray *formats = NULL; + for (int32_t i = 0; i < pInput[0].numOfRows; ++i) { + if (colDataIsNull_s(pInput[1].columnData, i) || colDataIsNull_s(pInput[0].columnData, i)) { + colDataSetNULL(pOutput->columnData, i); + continue; + } + + char *ts = colDataGetData(pInput[0].columnData, i); + char *formatData = colDataGetData(pInput[1].columnData, pInput[1].numOfRows > 1 ? i : 0); + len = TMIN(TS_FORMAT_MAX_LEN - 1, varDataLen(formatData)); + if (pInput[1].numOfRows > 1 || i == 0) { + strncpy(format, varDataVal(formatData), len); + format[len] = '\0'; + if (formats) { + taosArrayDestroy(formats); + formats = NULL; + } + } + int32_t precision = pInput[0].columnData->info.precision; + taosTs2Char(format, &formats, *(int64_t *)ts, precision, varDataVal(out), TS_FORMAT_MAX_LEN); + varDataSetLen(out, strlen(varDataVal(out))); + colDataSetVal(pOutput->columnData, i, out, false); + } + if (formats) taosArrayDestroy(formats); + taosMemoryFree(format); + taosMemoryFree(out); + return TSDB_CODE_SUCCESS; +} + /** Time functions **/ static int64_t offsetFromTz(char *timezone, int64_t factor) { char *minStr = &timezone[3]; diff --git a/source/libs/stream/inc/streamInt.h b/source/libs/stream/inc/streamInt.h index 4cd8319a07..c63b51d745 100644 --- a/source/libs/stream/inc/streamInt.h +++ b/source/libs/stream/inc/streamInt.h @@ -52,6 +52,11 @@ extern "C" { #define stTrace(...) do { if (stDebugFlag & DEBUG_TRACE) { taosPrintLog("STM ", DEBUG_TRACE, tqDebugFlag, __VA_ARGS__); }} while(0) // clang-format on +typedef struct { + int8_t type; + SSDataBlock* pBlock; +} SStreamTrigger; + typedef struct SStreamGlobalEnv { int8_t inited; void* timer; @@ -122,7 +127,7 @@ int32_t streamNotifyUpstreamContinue(SStreamTask* pTask); int32_t streamTaskFillHistoryFinished(SStreamTask* pTask); int32_t streamTransferStateToStreamTask(SStreamTask* pTask); -int32_t streamTaskInitTokenBucket(STokenBucket* pBucket, int32_t numCap, int32_t numRate, int32_t quotaRate); +int32_t streamTaskInitTokenBucket(STokenBucket* pBucket, int32_t numCap, int32_t numRate, float quotaRate); STaskId streamTaskExtractKey(const SStreamTask* pTask); void streamTaskInitForLaunchHTask(SHistoryTaskInfo* pInfo); void streamTaskSetRetryInfoForLaunch(SHistoryTaskInfo* pInfo); diff --git a/source/libs/stream/inc/streamsm.h b/source/libs/stream/inc/streamsm.h new file mode 100644 index 0000000000..be3665fde7 --- /dev/null +++ b/source/libs/stream/inc/streamsm.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TDENGINE_STREAMSM_H +#define TDENGINE_STREAMSM_H + +#include "tstream.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// moore finite state machine for stream task +typedef struct SStreamTaskState { + ETaskStatus state; + char* name; +} SStreamTaskState; + +typedef int32_t (*__state_trans_fn)(SStreamTask*); +typedef int32_t (*__state_trans_succ_fn)(SStreamTask*); + +typedef struct SAttachedEventInfo { + ETaskStatus status; // required status that this event can be handled + EStreamTaskEvent event; // the delayed handled event +} SAttachedEventInfo; + +typedef struct STaskStateTrans { + bool autoInvokeEndFn; + SStreamTaskState state; + EStreamTaskEvent event; + SStreamTaskState next; + __state_trans_fn pAction; + __state_trans_succ_fn pSuccAction; + SAttachedEventInfo attachEvent; +} STaskStateTrans; + +struct SStreamTaskSM { + SStreamTask* pTask; + STaskStateTrans* pActiveTrans; + int64_t startTs; + SStreamTaskState current; + struct { + SStreamTaskState state; + EStreamTaskEvent evt; + } prev; + // register the next handled event, if current state is not allowed to handle this event + SArray* pWaitingEventList; +}; + +typedef struct SStreamEventInfo { + EStreamTaskEvent event; + const char* name; +} SStreamEventInfo; + +SStreamTaskSM* streamCreateStateMachine(SStreamTask* pTask); +void* streamDestroyStateMachine(SStreamTaskSM* pSM); +#ifdef __cplusplus +} +#endif + +#endif // TDENGINE_STREAMSM_H diff --git a/source/libs/stream/src/stream.c b/source/libs/stream/src/stream.c index 03ba796b2c..34b4677235 100644 --- a/source/libs/stream/src/stream.c +++ b/source/libs/stream/src/stream.c @@ -62,14 +62,14 @@ static void streamSchedByTimer(void* param, void* tmrId) { int32_t nextTrigger = (int32_t)pTask->info.triggerParam; int8_t status = atomic_load_8(&pTask->schedInfo.status); - stDebug("s-task:%s in scheduler, trigger status:%d, next:%dms", id, status, nextTrigger); + stTrace("s-task:%s in scheduler, trigger status:%d, next:%dms", id, status, nextTrigger); - if (streamTaskShouldStop(&pTask->status) || streamTaskShouldPause(&pTask->status)) { + if (streamTaskShouldStop(pTask) || streamTaskShouldPause(pTask)) { stDebug("s-task:%s jump out of schedTimer", id); return; } - if (pTask->status.taskStatus == TASK_STATUS__CK) { + if (streamTaskGetStatus(pTask, NULL) == TASK_STATUS__CK) { stDebug("s-task:%s in checkpoint procedure, not retrieve result, next:%dms", id, nextTrigger); } else { if (status == TASK_TRIGGER_STATUS__ACTIVE) { @@ -127,7 +127,7 @@ int32_t streamSchedExec(SStreamTask* pTask) { SStreamTaskRunReq* pRunReq = rpcMallocCont(sizeof(SStreamTaskRunReq)); if (pRunReq == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; - /*int8_t status = */streamTaskSetSchedStatusInActive(pTask); + /*int8_t status = */streamTaskSetSchedStatusInactive(pTask); stError("failed to create msg to aunch s-task:%s, reason out of memory", pTask->id.idStr); return -1; } @@ -267,8 +267,7 @@ int32_t streamProcessDispatchMsg(SStreamTask* pTask, SStreamDispatchReq* pReq, S } // disable the data from upstream tasks - int8_t st = pTask->status.taskStatus; - if (st == TASK_STATUS__HALT) { + if (streamTaskGetStatus(pTask, NULL) == TASK_STATUS__HALT) { status = TASK_INPUT_STATUS__BLOCKED; } @@ -297,7 +296,7 @@ int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, S return 0; } -void streamTaskInputFail(SStreamTask* pTask) { atomic_store_8(&pTask->inputInfo.status, TASK_INPUT_STATUS__FAILED); } +void streamTaskInputFail(SStreamTask* pTask) { atomic_store_8(&pTask->inputq.status, TASK_INPUT_STATUS__FAILED); } void streamTaskOpenAllUpstreamInput(SStreamTask* pTask) { int32_t num = taosArrayGetSize(pTask->upstreamInfo.pList); diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index ce4feb38eb..b22c6c9b0f 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -993,7 +993,7 @@ int32_t streamBackendDoCheckpoint(void* arg, uint64_t checkpointId) { stDebug("stream backend:%p end to do checkpoint at:%s, time cost:%" PRId64 "ms", pHandle, pChkpIdDir, taosGetTimestampMs() - st); } - } else { + } else { stError("stream backend:%p failed to flush db at:%s", pHandle, pChkpIdDir); } // release all ref to cfWrapper; @@ -1467,16 +1467,24 @@ rocksdb_compactionfilter_t* compactFilteFactoryCreateFilter(void* arg, rocksdb_c void destroyRocksdbCfInst(RocksdbCfInst* inst) { int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]); - for (int i = 0; i < cfLen; i++) { - if (inst->pHandle[i]) rocksdb_column_family_handle_destroy((inst->pHandle)[i]); + if (inst->pHandle) { + for (int i = 0; i < cfLen; i++) { + if (inst->pHandle[i]) rocksdb_column_family_handle_destroy((inst->pHandle)[i]); + } + taosMemoryFree(inst->pHandle); } - rocksdb_writeoptions_destroy(inst->wOpt); - inst->wOpt = NULL; + if (inst->cfOpt) { + for (int i = 0; i < cfLen; i++) { + rocksdb_options_destroy(inst->cfOpt[i]); + rocksdb_block_based_options_destroy(((RocksdbCfParam*)inst->param)[i].tableOpt); + } + taosMemoryFreeClear(inst->cfOpt); + taosMemoryFreeClear(inst->param); + } + if (inst->wOpt) rocksdb_writeoptions_destroy(inst->wOpt); + if (inst->rOpt) rocksdb_readoptions_destroy(inst->rOpt); - rocksdb_readoptions_destroy(inst->rOpt); - taosMemoryFree(inst->cfOpt); - taosMemoryFreeClear(inst->param); taosMemoryFree(inst); } @@ -1645,6 +1653,13 @@ int streamStateOpenBackend(void* backend, SStreamState* pState) { pState->pTdbState->backendCfWrapperId = id; pState->pTdbState->pBackendCfWrapper = pBackendCfWrapper; stInfo("succ to open state %p on backendWrapper, %p, %s", pState, pBackendCfWrapper, pBackendCfWrapper->idstr); + + inst->pHandle = NULL; + inst->cfOpt = NULL; + inst->param = NULL; + + inst->wOpt = NULL; + inst->rOpt = NULL; return 0; } taosThreadMutexUnlock(&handle->cfMutex); @@ -1992,14 +2007,12 @@ int32_t streamStateAddIfNotExist_rocksdb(SStreamState* pState, const SWinKey* ke return 0; } int32_t streamStateCurPrev_rocksdb(SStreamStateCur* pCur) { - stDebug("streamStateCurPrev_rocksdb"); if (!pCur) return -1; rocksdb_iter_prev(pCur->iter); return 0; } int32_t streamStateGetKVByCur_rocksdb(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen) { - stDebug("streamStateGetKVByCur_rocksdb"); if (!pCur) return -1; SStateKey tkey; SStateKey* pKtmp = &tkey; @@ -2024,7 +2037,6 @@ int32_t streamStateGetKVByCur_rocksdb(SStreamStateCur* pCur, SWinKey* pKey, cons return -1; } SStreamStateCur* streamStateGetAndCheckCur_rocksdb(SStreamState* pState, SWinKey* key) { - stDebug("streamStateGetAndCheckCur_rocksdb"); SStreamStateCur* pCur = streamStateFillGetCur_rocksdb(pState, key); if (pCur) { int32_t code = streamStateGetGroupKVByCur_rocksdb(pCur, key, NULL, 0); @@ -2035,7 +2047,6 @@ SStreamStateCur* streamStateGetAndCheckCur_rocksdb(SStreamState* pState, SWinKey } SStreamStateCur* streamStateSeekKeyNext_rocksdb(SStreamState* pState, const SWinKey* key) { - stDebug("streamStateSeekKeyNext_rocksdb"); SStreamStateCur* pCur = createStreamStateCursor(); if (pCur == NULL) { return NULL; @@ -2074,7 +2085,6 @@ SStreamStateCur* streamStateSeekKeyNext_rocksdb(SStreamState* pState, const SWin } SStreamStateCur* streamStateSeekToLast_rocksdb(SStreamState* pState) { - stDebug("streamStateGetCur_rocksdb"); int32_t code = 0; const SStateKey maxStateKey = {.key = {.groupId = UINT64_MAX, .ts = INT64_MAX}, .opNum = INT64_MAX}; @@ -2115,7 +2125,6 @@ SStreamStateCur* streamStateSeekToLast_rocksdb(SStreamState* pState) { } SStreamStateCur* streamStateGetCur_rocksdb(SStreamState* pState, const SWinKey* key) { - stDebug("streamStateGetCur_rocksdb"); SBackendCfWrapper* wrapper = pState->pTdbState->pBackendCfWrapper; SStreamStateCur* pCur = createStreamStateCursor(); diff --git a/source/libs/stream/src/streamCheckpoint.c b/source/libs/stream/src/streamCheckpoint.c index 2cde368195..9eaa9fcb92 100644 --- a/source/libs/stream/src/streamCheckpoint.c +++ b/source/libs/stream/src/streamCheckpoint.c @@ -135,12 +135,13 @@ static int32_t appendCheckpointIntoInputQ(SStreamTask* pTask, int32_t checkpoint int32_t streamProcessCheckpointSourceReq(SStreamTask* pTask, SStreamCheckpointSourceReq* pReq) { ASSERT(pTask->info.taskLevel == TASK_LEVEL__SOURCE); + // todo this status may not be set here. // 1. set task status to be prepared for check point, no data are allowed to put into inputQ. - pTask->status.taskStatus = TASK_STATUS__CK; + streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_GEN_CHECKPOINT); + pTask->checkpointingId = pReq->checkpointId; pTask->checkpointNotReadyTasks = streamTaskGetNumOfDownstream(pTask); pTask->chkInfo.startTs = taosGetTimestampMs(); - pTask->execInfo.checkpoint += 1; // 2. Put the checkpoint block into inputQ, to make sure all blocks with less version have been handled by this task @@ -171,11 +172,15 @@ int32_t streamProcessCheckpointBlock(SStreamTask* pTask, SStreamDataBlock* pBloc const char* id = pTask->id.idStr; int32_t code = TSDB_CODE_SUCCESS; - // set the task status - pTask->checkpointingId = checkpointId; - // set task status - pTask->status.taskStatus = TASK_STATUS__CK; + if (streamTaskGetStatus(pTask, NULL) != TASK_STATUS__CK) { + pTask->checkpointingId = checkpointId; + code = streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_GEN_CHECKPOINT); + if (code != TSDB_CODE_SUCCESS) { + stError("s-task:%s handle checkpoint-trigger block failed, code:%s", id, tstrerror(code)); + return code; + } + } { // todo: remove this when the pipeline checkpoint generating is used. SStreamMeta* pMeta = pTask->pMeta; @@ -195,6 +200,7 @@ int32_t streamProcessCheckpointBlock(SStreamTask* pTask, SStreamDataBlock* pBloc stDebug("s-task:%s set childIdx:%d, and add checkpoint-trigger block into outputQ", id, pTask->info.selfChildId); continueDispatchCheckpointBlock(pBlock, pTask); } else { // only one task exists, no need to dispatch downstream info + atomic_add_fetch_32(&pTask->checkpointNotReadyTasks, 1); streamProcessCheckpointReadyMsg(pTask); streamFreeQitem((SStreamQueueItem*)pBlock); } @@ -274,6 +280,8 @@ void streamTaskClearCheckInfo(SStreamTask* pTask) { } int32_t streamSaveAllTaskStatus(SStreamMeta* pMeta, int64_t checkpointId) { + int32_t vgId = pMeta->vgId; + taosWLockLatch(&pMeta->lock); for (int32_t i = 0; i < taosArrayGetSize(pMeta->pTaskList); ++i) { @@ -288,27 +296,34 @@ int32_t streamSaveAllTaskStatus(SStreamMeta* pMeta, int64_t checkpointId) { continue; } - int8_t prev = p->status.taskStatus; ASSERT(p->chkInfo.checkpointId < p->checkpointingId && p->checkpointingId == checkpointId); p->chkInfo.checkpointId = p->checkpointingId; streamTaskClearCheckInfo(p); - streamSetStatusNormal(p); - // save the task - streamMetaSaveTask(pMeta, p); + char* str = NULL; + streamTaskGetStatus(p, &str); + + int32_t code = streamTaskHandleEvent(p->status.pSM, TASK_EVENT_CHECKPOINT_DONE); + if (code != TSDB_CODE_SUCCESS) { + stDebug("s-task:%s vgId:%d save task status failed, since handle event failed", p->id.idStr, vgId); + taosWUnLockLatch(&pMeta->lock); + return -1; + } else { // save the task + streamMetaSaveTask(pMeta, p); + } stDebug( "vgId:%d s-task:%s level:%d open upstream inputQ, commit task status after checkpoint completed, " "checkpointId:%" PRId64 ", Ver(saved):%" PRId64 " currentVer:%" PRId64 ", status to be normal, prev:%s", pMeta->vgId, p->id.idStr, p->info.taskLevel, checkpointId, p->chkInfo.checkpointVer, p->chkInfo.nextProcessVer, - streamGetTaskStatusStr(prev)); + str); } if (streamMetaCommit(pMeta) < 0) { taosWUnLockLatch(&pMeta->lock); stError("vgId:%d failed to commit stream meta after do checkpoint, checkpointId:%" PRId64 ", since %s", pMeta->vgId, - checkpointId, terrstr()); + checkpointId, terrstr()); return -1; } else { taosWUnLockLatch(&pMeta->lock); diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index a7a06dd884..cd8bbacb98 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -420,7 +420,7 @@ static void doRetryDispatchData(void* param, void* tmrId) { const char* id = pTask->id.idStr; int32_t msgId = pTask->execInfo.dispatch; - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { int32_t ref = atomic_sub_fetch_32(&pTask->status.timerActive, 1); stDebug("s-task:%s should stop, abort from timer, ref:%d", pTask->id.idStr, ref); return; @@ -474,10 +474,10 @@ static void doRetryDispatchData(void* param, void* tmrId) { } if (code != TSDB_CODE_SUCCESS) { - if (!streamTaskShouldStop(&pTask->status)) { + if (!streamTaskShouldStop(pTask)) { // stDebug("s-task:%s reset the waitRspCnt to be 0 before launch retry dispatch", pTask->id.idStr); // atomic_store_32(&pTask->outputInfo.shuffleDispatcher.waitingRspCnt, 0); - if (streamTaskShouldPause(&pTask->status)) { + if (streamTaskShouldPause(pTask)) { streamRetryDispatchData(pTask, DISPATCH_RETRY_INTERVAL_MS * 10); } else { streamRetryDispatchData(pTask, DISPATCH_RETRY_INTERVAL_MS); @@ -662,8 +662,10 @@ int32_t streamDispatchScanHistoryFinishMsg(SStreamTask* pTask) { int32_t numOfVgs = taosArrayGetSize(vgInfo); pTask->notReadyTasks = numOfVgs; + char* p = NULL; + streamTaskGetStatus(pTask, &p); stDebug("s-task:%s send scan-history data complete msg to downstream (shuffle-dispatch) %d tasks, status:%s", pTask->id.idStr, - numOfVgs, streamGetTaskStatusStr(pTask->status.taskStatus)); + numOfVgs, p); for (int32_t i = 0; i < numOfVgs; i++) { SVgroupInfo* pVgInfo = taosArrayGet(vgInfo, i); req.downstreamTaskId = pVgInfo->taskId; @@ -775,8 +777,9 @@ int32_t doDispatchScanHistoryFinishMsg(SStreamTask* pTask, const SStreamScanHist initRpcMsg(&msg, TDMT_VND_STREAM_SCAN_HISTORY_FINISH, buf, tlen + sizeof(SMsgHead)); tmsgSendReq(pEpSet, &msg); - const char* pStatus = streamGetTaskStatusStr(pTask->status.taskStatus); - stDebug("s-task:%s status:%s dispatch scan-history finish msg to taskId:0x%x (vgId:%d)", pTask->id.idStr, pStatus, + char* p = NULL; + streamTaskGetStatus(pTask, &p); + stDebug("s-task:%s status:%s dispatch scan-history finish msg to taskId:0x%x (vgId:%d)", pTask->id.idStr, p, pReq->downstreamTaskId, vgId); return 0; } @@ -1008,7 +1011,7 @@ int32_t streamAddEndScanHistoryMsg(SStreamTask* pTask, SRpcHandleInfo* pRpcInfo, taosThreadMutexUnlock(&pTask->lock); int32_t num = taosArrayGetSize(pTask->pRspMsgList); - stDebug("s-task:%s add scan history finish rsp msg for task:0x%x, total:%d", pTask->id.idStr, pReq->upstreamTaskId, + stDebug("s-task:%s add scan-history finish rsp msg for task:0x%x, total:%d", pTask->id.idStr, pReq->upstreamTaskId, num); return TSDB_CODE_SUCCESS; } @@ -1024,7 +1027,7 @@ int32_t streamNotifyUpstreamContinue(SStreamTask* pTask) { SStreamContinueExecInfo* pInfo = taosArrayGet(pTask->pRspMsgList, i); tmsgSendRsp(&pInfo->msg); - stDebug("s-task:%s level:%d notify upstream:0x%x continuing scan data in WAL", id, level, pInfo->taskId); + stDebug("s-task:%s level:%d notify upstream:0x%x continuing handle data in WAL", id, level, pInfo->taskId); } taosArrayClear(pTask->pRspMsgList); @@ -1040,8 +1043,8 @@ static int32_t handleDispatchSuccessRsp(SStreamTask* pTask, int32_t downstreamId int64_t el = taosGetTimestampMs() - pTask->msgInfo.startTs; // put data into inputQ of current task is also allowed - if (pTask->inputInfo.status == TASK_INPUT_STATUS__BLOCKED) { - pTask->inputInfo.status = TASK_INPUT_STATUS__NORMAL; + if (pTask->inputq.status == TASK_INPUT_STATUS__BLOCKED) { + pTask->inputq.status = TASK_INPUT_STATUS__NORMAL; stDebug("s-task:%s downstream task:0x%x resume to normal from inputQ blocking, blocking time:%" PRId64 "ms", pTask->id.idStr, downstreamId, el); } else { @@ -1093,7 +1096,7 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i } else { // code == 0 if (pRsp->inputStatus == TASK_INPUT_STATUS__BLOCKED) { - pTask->inputInfo.status = TASK_INPUT_STATUS__BLOCKED; + pTask->inputq.status = TASK_INPUT_STATUS__BLOCKED; // block the input of current task, to push pressure to upstream taosThreadMutexLock(&pTask->lock); taosArrayPush(pTask->msgInfo.pRetryList, &pRsp->downstreamNodeId); @@ -1113,16 +1116,16 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i ASSERT(leftRsp >= 0); if (leftRsp > 0) { - stDebug( "s-task:%s recv dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%d, waiting for %d rsp", - id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, code, leftRsp); + stDebug( "s-task:%s recv dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%s, waiting for %d rsp", + id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, tstrerror(code), leftRsp); } else { stDebug( - "s-task:%s recv dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%d, all rsp", - id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, code); + "s-task:%s recv dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%s, all rsp", + id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, tstrerror(code)); } } else { - stDebug("s-task:%s recv fix-dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%d", - id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, code); + stDebug("s-task:%s recv fix-dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%s", + id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, tstrerror(code)); } ASSERT(leftRsp >= 0); @@ -1181,6 +1184,9 @@ int32_t tEncodeStreamTaskUpdateMsg(SEncoder* pEncoder, const SStreamTaskNodeUpda if (tEncodeSEpSet(pEncoder, &pInfo->prevEp) < 0) return -1; if (tEncodeSEpSet(pEncoder, &pInfo->newEp) < 0) return -1; } + + // todo this new attribute will be result in being incompatible with previous version + if (tEncodeI32(pEncoder, pMsg->transId) < 0) return -1; tEndEncode(pEncoder); return pEncoder->pos; } @@ -1201,6 +1207,8 @@ int32_t tDecodeStreamTaskUpdateMsg(SDecoder* pDecoder, SStreamTaskNodeUpdateMsg* taosArrayPush(pMsg->pNodeList, &info); } + if (tDecodeI32(pDecoder, &pMsg->transId) < 0) return -1; + tEndDecode(pDecoder); return 0; } diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index c49c647906..15b809d6bd 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -22,14 +22,13 @@ static int32_t streamDoTransferStateToStreamTask(SStreamTask* pTask); -bool streamTaskShouldStop(const SStreamStatus* pStatus) { - int32_t status = atomic_load_8((int8_t*)&pStatus->taskStatus); - return (status == TASK_STATUS__STOP) || (status == TASK_STATUS__DROPPING); +bool streamTaskShouldStop(const SStreamTask* pTask) { + ETaskStatus s = streamTaskGetStatus(pTask, NULL); + return (s == TASK_STATUS__STOP) || (s == TASK_STATUS__DROPPING); } -bool streamTaskShouldPause(const SStreamStatus* pStatus) { - int32_t status = atomic_load_8((int8_t*)&pStatus->taskStatus); - return (status == TASK_STATUS__PAUSE); +bool streamTaskShouldPause(const SStreamTask* pTask) { + return (streamTaskGetStatus(pTask, NULL) == TASK_STATUS__PAUSE); } static int32_t doOutputResultBlockImpl(SStreamTask* pTask, SStreamDataBlock* pBlock) { @@ -102,12 +101,12 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, i pRes = taosArrayInit(4, sizeof(SSDataBlock)); } - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes); return 0; } - if (pTask->inputInfo.status == TASK_INPUT_STATUS__BLOCKED) { + if (pTask->inputq.status == TASK_INPUT_STATUS__BLOCKED) { stWarn("s-task:%s downstream task inputQ blocked, idle for 1sec and retry exec task", pTask->id.idStr); taosMsleep(1000); continue; @@ -198,7 +197,7 @@ int32_t streamScanHistoryData(SStreamTask* pTask) { qSetStreamOpOpen(exec); while (!finished) { - if (streamTaskShouldPause(&pTask->status)) { + if (streamTaskShouldPause(pTask)) { double el = (taosGetTimestampMs() - pTask->execInfo.step1Start) / 1000.0; stDebug("s-task:%s paused from the scan-history task, elapsed time:%.2fsec", pTask->id.idStr, el); break; @@ -213,12 +212,12 @@ int32_t streamScanHistoryData(SStreamTask* pTask) { int32_t size = 0; int32_t numOfBlocks = 0; while (1) { - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes); return 0; } - if (pTask->inputInfo.status == TASK_INPUT_STATUS__BLOCKED) { + if (pTask->inputq.status == TASK_INPUT_STATUS__BLOCKED) { stDebug("s-task:%s inputQ is blocked, wait for 10sec and retry", pTask->id.idStr); taosMsleep(10000); continue; @@ -309,21 +308,19 @@ int32_t streamDoTransferStateToStreamTask(SStreamTask* pTask) { pStreamTask->id.idStr); } - ASSERT(((pStreamTask->status.taskStatus == TASK_STATUS__STOP) || - (pStreamTask->hTaskInfo.id.taskId == pTask->id.taskId)) && + ETaskStatus status = streamTaskGetStatus(pStreamTask, NULL); + ASSERT(((status == TASK_STATUS__DROPPING) || (pStreamTask->hTaskInfo.id.taskId == pTask->id.taskId)) && pTask->status.appendTranstateBlock == true); STimeWindow* pTimeWindow = &pStreamTask->dataRange.window; - // todo. the dropping status should be append to the status after the halt completed. // It must be halted for a source stream task, since when the related scan-history-data task start scan the history // for the step 2. - int8_t status = pStreamTask->status.taskStatus; if (pStreamTask->info.taskLevel == TASK_LEVEL__SOURCE) { - ASSERT(status == TASK_STATUS__HALT || status == TASK_STATUS__DROPPING); + ASSERT(status == TASK_STATUS__HALT || status == TASK_STATUS__DROPPING || status == TASK_STATUS__STOP); } else { - ASSERT(status == TASK_STATUS__NORMAL); - pStreamTask->status.taskStatus = TASK_STATUS__HALT; + ASSERT(status == TASK_STATUS__READY|| status == TASK_STATUS__DROPPING || status == TASK_STATUS__STOP); + streamTaskHandleEvent(pStreamTask->status.pSM, TASK_EVENT_HALT); stDebug("s-task:%s halt by related fill-history task:%s", pStreamTask->id.idStr, pTask->id.idStr); } @@ -333,13 +330,14 @@ int32_t streamDoTransferStateToStreamTask(SStreamTask* pTask) { // In case of sink tasks, no need to halt them. // In case of source tasks and agg tasks, we should HALT them, and wait for them to be idle. And then, it's safe to // start the task state transfer procedure. - // When a task is idle with halt status, all data in inputQ are consumed. + char* p = NULL; + streamTaskGetStatus(pStreamTask, &p); if (pStreamTask->info.taskLevel == TASK_LEVEL__SOURCE) { // update the scan data range for source task. stDebug("s-task:%s level:%d stream task window %" PRId64 " - %" PRId64 " update to %" PRId64 " - %" PRId64 - ", status:%s, sched-status:%d", - pStreamTask->id.idStr, TASK_LEVEL__SOURCE, pTimeWindow->skey, pTimeWindow->ekey, INT64_MIN, - pTimeWindow->ekey, streamGetTaskStatusStr(TASK_STATUS__NORMAL), pStreamTask->status.schedStatus); + ", status:%s, sched-status:%d", + pStreamTask->id.idStr, TASK_LEVEL__SOURCE, pTimeWindow->skey, pTimeWindow->ekey, INT64_MIN, + pTimeWindow->ekey, p, pStreamTask->status.schedStatus); } else { stDebug("s-task:%s no need to update time window for non-source task", pStreamTask->id.idStr); } @@ -354,7 +352,7 @@ int32_t streamDoTransferStateToStreamTask(SStreamTask* pTask) { // 3. resume the state of stream task, after this function, the stream task will run immidately. But it can not be // pause, since the pause allowed attribute is not set yet. - streamTaskResumeFromHalt(pStreamTask); + streamTaskResume(pStreamTask); // todo refactor: use streamTaskResume. stDebug("s-task:%s fill-history task set status to be dropping, save the state into disk", pTask->id.idStr); @@ -362,20 +360,21 @@ int32_t streamDoTransferStateToStreamTask(SStreamTask* pTask) { streamBuildAndSendDropTaskMsg(pTask->pMsgCb, pMeta->vgId, &pTask->id); // 5. clear the link between fill-history task and stream task info - pStreamTask->hTaskInfo.id.taskId = 0; - pStreamTask->hTaskInfo.id.streamId = 0; +// CLEAR_RELATED_FILLHISTORY_TASK(pStreamTask); // 6. save to disk taosWLockLatch(&pMeta->lock); - streamMetaSaveTask(pMeta, pStreamTask); - if (streamMetaCommit(pMeta) < 0) { + + pStreamTask->status.taskStatus = streamTaskGetStatus(pStreamTask, NULL); +// streamMetaSaveTask(pMeta, pStreamTask); +// if (streamMetaCommit(pMeta) < 0) { // persist to disk - } +// } taosWUnLockLatch(&pMeta->lock); // 7. pause allowed. streamTaskEnablePause(pStreamTask); - if (taosQueueEmpty(pStreamTask->inputInfo.queue->pQueue)) { + if ((pStreamTask->info.taskLevel == TASK_LEVEL__SOURCE) && taosQueueEmpty(pStreamTask->inputq.queue->pQueue)) { SStreamRefDataBlock* pItem = taosAllocateQitem(sizeof(SStreamRefDataBlock), DEF_QITEM, 0); SSDataBlock* pDelBlock = createSpecialDataBlock(STREAM_DELETE_DATA); @@ -492,7 +491,7 @@ int32_t streamProcessTranstateBlock(SStreamTask* pTask, SStreamDataBlock* pBlock code = taosWriteQitem(pTask->outputq.queue->pQueue, pBlock); if (code == 0) { streamDispatchStreamBlock(pTask); - } else { + } else { // todo put into queue failed, retry streamFreeQitem((SStreamQueueItem*)pBlock); } } else { // level == TASK_LEVEL__SINK @@ -500,12 +499,12 @@ int32_t streamProcessTranstateBlock(SStreamTask* pTask, SStreamDataBlock* pBlock } } else { // non-dispatch task, do task state transfer directly streamFreeQitem((SStreamQueueItem*)pBlock); - stDebug("s-task:%s non-dispatch task, start to transfer state directly", id); + stDebug("s-task:%s non-dispatch task, level:%d start to transfer state directly", id, pTask->info.taskLevel); ASSERT(pTask->info.fillHistory == 1); - code = streamTransferStateToStreamTask(pTask); + code = streamTransferStateToStreamTask(pTask); if (code != TSDB_CODE_SUCCESS) { - /*int8_t status = */ streamTaskSetSchedStatusInActive(pTask); + /*int8_t status = */ streamTaskSetSchedStatusInactive(pTask); } } @@ -526,7 +525,7 @@ int32_t streamExecForAll(SStreamTask* pTask) { int32_t blockSize = 0; int32_t numOfBlocks = 0; SStreamQueueItem* pInput = NULL; - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask) || (streamTaskGetStatus(pTask, NULL) == TASK_STATUS__UNINIT)) { stDebug("s-task:%s stream task is stopped", id); break; } @@ -592,8 +591,9 @@ int32_t streamExecForAll(SStreamTask* pTask) { // todo other thread may change the status // do nothing after sync executor state to storage backend, untill the vnode-level checkpoint is completed. if (type == STREAM_INPUT__CHECKPOINT) { - stDebug("s-task:%s checkpoint block received, set status:%s", pTask->id.idStr, - streamGetTaskStatusStr(pTask->status.taskStatus)); + char* p = NULL; + streamTaskGetStatus(pTask, &p); + stDebug("s-task:%s checkpoint block received, set status:%s", pTask->id.idStr, p); streamTaskBuildCheckpoint(pTask); return 0; } @@ -605,8 +605,15 @@ int32_t streamExecForAll(SStreamTask* pTask) { // the task may be set dropping/stopping, while it is still in the task queue, therefore, the sched-status can not // be updated by tryExec function, therefore, the schedStatus will always be the TASK_SCHED_STATUS__WAITING. bool streamTaskIsIdle(const SStreamTask* pTask) { - return (pTask->status.schedStatus == TASK_SCHED_STATUS__INACTIVE || pTask->status.taskStatus == TASK_STATUS__STOP || - pTask->status.taskStatus == TASK_STATUS__DROPPING); + ETaskStatus status = streamTaskGetStatus(pTask, NULL); + return (pTask->status.schedStatus == TASK_SCHED_STATUS__INACTIVE || status == TASK_STATUS__STOP || + status == TASK_STATUS__DROPPING); +} + +bool streamTaskReadyToRun(const SStreamTask* pTask, char** pStatus) { + ETaskStatus st = streamTaskGetStatus(pTask, NULL); + return (st == TASK_STATUS__READY || st == TASK_STATUS__SCAN_HISTORY || st == TASK_STATUS__STREAM_SCAN_HISTORY || + st == TASK_STATUS__CK); } int32_t streamExecTask(SStreamTask* pTask) { @@ -623,20 +630,23 @@ int32_t streamExecTask(SStreamTask* pTask) { } taosThreadMutexLock(&pTask->lock); - if ((streamQueueGetNumOfItems(pTask->inputInfo.queue) == 0) || streamTaskShouldStop(&pTask->status) || - streamTaskShouldPause(&pTask->status)) { + if ((streamQueueGetNumOfItems(pTask->inputq.queue) == 0) || streamTaskShouldStop(pTask) || + streamTaskShouldPause(pTask)) { atomic_store_8(&pTask->status.schedStatus, TASK_SCHED_STATUS__INACTIVE); taosThreadMutexUnlock(&pTask->lock); - stDebug("s-task:%s exec completed, status:%s, sched-status:%d", id, - streamGetTaskStatusStr(pTask->status.taskStatus), pTask->status.schedStatus); + char* p = NULL; + streamTaskGetStatus(pTask, &p); + stDebug("s-task:%s exec completed, status:%s, sched-status:%d", id, p, pTask->status.schedStatus); return 0; } taosThreadMutexUnlock(&pTask->lock); } } else { - stDebug("s-task:%s already started to exec by other thread, status:%s, sched-status:%d", id, - streamGetTaskStatusStr(pTask->status.taskStatus), pTask->status.schedStatus); + char* p = NULL; + streamTaskGetStatus(pTask, &p); + stDebug("s-task:%s already started to exec by other thread, status:%s, sched-status:%d", id, p, + pTask->status.schedStatus); } return 0; diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c index 86f9afe59f..f788e244cd 100644 --- a/source/libs/stream/src/streamMeta.c +++ b/source/libs/stream/src/streamMeta.c @@ -143,8 +143,8 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF goto _err; } - pMeta->pUpdateTaskSet = taosHashInit(64, fp, false, HASH_NO_LOCK); - if (pMeta->pUpdateTaskSet == NULL) { + pMeta->updateInfo.pTasks = taosHashInit(64, fp, false, HASH_NO_LOCK); + if (pMeta->updateInfo.pTasks == NULL) { goto _err; } @@ -211,7 +211,7 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF stage); return pMeta; -_err: + _err: taosMemoryFree(pMeta->path); if (pMeta->pTasksMap) taosHashCleanup(pMeta->pTasksMap); if (pMeta->pTaskList) taosArrayDestroy(pMeta->pTaskList); @@ -219,7 +219,7 @@ _err: if (pMeta->pCheckpointDb) tdbTbClose(pMeta->pCheckpointDb); if (pMeta->db) tdbClose(pMeta->db); if (pMeta->pHbInfo) taosMemoryFreeClear(pMeta->pHbInfo); - if (pMeta->pUpdateTaskSet) taosHashCleanup(pMeta->pUpdateTaskSet); + if (pMeta->updateInfo.pTasks) taosHashCleanup(pMeta->updateInfo.pTasks); if (pMeta->startInfo.pReadyTaskSet) taosHashCleanup(pMeta->startInfo.pReadyTaskSet); taosMemoryFree(pMeta); @@ -228,11 +228,15 @@ _err: } int32_t streamMetaReopen(SStreamMeta* pMeta) { + // backup the restart flag + int32_t restartFlag = pMeta->startInfo.startAllTasksFlag; streamMetaClear(pMeta); + pMeta->startInfo.startAllTasksFlag = restartFlag; + + // NOTE: role should not be changed during reopen meta pMeta->streamBackendRid = -1; pMeta->streamBackend = NULL; - pMeta->role = NODE_ROLE_UNINIT; char* defaultPath = taosMemoryCalloc(1, strlen(pMeta->path) + 128); sprintf(defaultPath, "%s%s%s", pMeta->path, TD_DIRSEP, "state"); @@ -274,6 +278,7 @@ int32_t streamMetaReopen(SStreamMeta* pMeta) { } void streamMetaClear(SStreamMeta* pMeta) { + // remove all existed tasks in this vnode void* pIter = NULL; while ((pIter = taosHashIterate(pMeta->pTasksMap, pIter)) != NULL) { SStreamTask* p = *(SStreamTask**)pIter; @@ -299,6 +304,9 @@ void streamMetaClear(SStreamMeta* pMeta) { taosArrayClear(pMeta->chkpInUse); pMeta->numOfStreamTasks = 0; pMeta->numOfPausedTasks = 0; + pMeta->chkptNotReadyTasks = 0; + + streamMetaResetStartInfo(&pMeta->startInfo); } void streamMetaClose(SStreamMeta* pMeta) { @@ -336,7 +344,7 @@ void streamMetaCloseImpl(void* arg) { taosHashCleanup(pMeta->pTasksMap); taosHashCleanup(pMeta->pTaskBackendUnique); - taosHashCleanup(pMeta->pUpdateTaskSet); + taosHashCleanup(pMeta->updateInfo.pTasks); taosHashCleanup(pMeta->startInfo.pReadyTaskSet); taosMemoryFree(pMeta->pHbInfo); @@ -348,6 +356,7 @@ void streamMetaCloseImpl(void* arg) { stDebug("end to close stream meta"); } +// todo let's check the status for each task int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) { void* buf = NULL; int32_t len; @@ -437,31 +446,13 @@ int32_t streamMetaGetNumOfTasks(SStreamMeta* pMeta) { return (int32_t)size; } -int32_t streamMetaGetNumOfStreamTasks(SStreamMeta* pMeta) { - int32_t num = 0; - size_t size = taosArrayGetSize(pMeta->pTaskList); - for (int32_t i = 0; i < size; ++i) { - STaskId* pId = taosArrayGet(pMeta->pTaskList, i); - SStreamTask** p = taosHashGet(pMeta->pTasksMap, pId, sizeof(*pId)); - if (p == NULL) { - continue; - } - - if ((*p)->info.fillHistory == 0) { - num += 1; - } - } - - return num; -} - SStreamTask* streamMetaAcquireTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId) { taosRLockLatch(&pMeta->lock); STaskId id = {.streamId = streamId, .taskId = taskId}; SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &id, sizeof(id)); if (ppTask != NULL) { - if (!streamTaskShouldStop(&(*ppTask)->status)) { + if (!streamTaskShouldStop(*ppTask)) { int32_t ref = atomic_add_fetch_32(&(*ppTask)->refCnt, 1); taosRUnLockLatch(&pMeta->lock); stTrace("s-task:%s acquire task, ref:%d", (*ppTask)->id.idStr, ref); @@ -478,7 +469,7 @@ void streamMetaReleaseTask(SStreamMeta* UNUSED_PARAM(pMeta), SStreamTask* pTask) if (ref > 0) { stTrace("s-task:%s release task, ref:%d", pTask->id.idStr, ref); } else if (ref == 0) { - ASSERT(streamTaskShouldStop(&pTask->status)); + ASSERT(streamTaskShouldStop(pTask)); stTrace("s-task:%s all refs are gone, free it", pTask->id.idStr); tFreeStreamTask(pTask); } else if (ref < 0) { @@ -506,11 +497,15 @@ int32_t streamMetaUnregisterTask(SStreamMeta* pMeta, int64_t streamId, int32_t t SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &id, sizeof(id)); if (ppTask) { pTask = *ppTask; - if (streamTaskShouldPause(&pTask->status)) { + + // desc the paused task counter + if (streamTaskShouldPause(pTask)) { int32_t num = atomic_sub_fetch_32(&pMeta->numOfPausedTasks, 1); stInfo("vgId:%d s-task:%s drop stream task. pause task num:%d", pMeta->vgId, pTask->id.idStr, num); } - atomic_store_8(&pTask->status.taskStatus, TASK_STATUS__DROPPING); + + // handle the dropping event + streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_DROPPING); } else { stDebug("vgId:%d failed to find the task:0x%x, it may be dropped already", pMeta->vgId, taskId); taosWUnLockLatch(&pMeta->lock); @@ -518,13 +513,12 @@ int32_t streamMetaUnregisterTask(SStreamMeta* pMeta, int64_t streamId, int32_t t } taosWUnLockLatch(&pMeta->lock); - stDebug("s-task:0x%x set task status:%s and start to unregister it", taskId, - streamGetTaskStatusStr(TASK_STATUS__DROPPING)); + stDebug("s-task:0x%x set task status:dropping and start to unregister it", taskId); while (1) { taosRLockLatch(&pMeta->lock); - ppTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &id, sizeof(id)); + ppTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &id, sizeof(id)); if (ppTask) { if ((*ppTask)->status.timerActive == 0) { taosRUnLockLatch(&pMeta->lock); @@ -544,23 +538,19 @@ int32_t streamMetaUnregisterTask(SStreamMeta* pMeta, int64_t streamId, int32_t t taosWLockLatch(&pMeta->lock); ppTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &id, sizeof(id)); if (ppTask) { + pTask = *ppTask; + // it is an fill-history task, remove the related stream task's id that points to it - if ((*ppTask)->info.fillHistory == 1) { - STaskId streamTaskId = {.streamId = (*ppTask)->streamTaskId.streamId, .taskId = (*ppTask)->streamTaskId.taskId}; - SStreamTask** ppStreamTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &streamTaskId, sizeof(streamTaskId)); - if (ppStreamTask != NULL) { - (*ppStreamTask)->hTaskInfo.id.taskId = 0; - (*ppStreamTask)->hTaskInfo.id.streamId = 0; - } + if (pTask->info.fillHistory == 1) { + streamTaskClearHTaskAttr(pTask); } else { atomic_sub_fetch_32(&pMeta->numOfStreamTasks, 1); } taosHashRemove(pMeta->pTasksMap, &id, sizeof(id)); - atomic_store_8(&pTask->status.taskStatus, TASK_STATUS__DROPPING); + doRemoveIdFromList(pMeta, (int32_t)taosArrayGetSize(pMeta->pTaskList), &pTask->id); ASSERT(pTask->status.timerActive == 0); - doRemoveIdFromList(pMeta, (int32_t)taosArrayGetSize(pMeta->pTaskList), &pTask->id); if (pTask->info.triggerParam != 0 && pTask->info.fillHistory == 0) { stDebug("s-task:%s stop schedTimer, and (before) desc ref:%d", pTask->id.idStr, pTask->refCnt); @@ -691,7 +681,8 @@ int32_t streamMetaLoadAllTasks(SStreamMeta* pMeta) { tFreeStreamTask(pTask); stError( "vgId:%d stream read incompatible data, rm %s/vnode/vnode*/tq/stream if taosd cannot start, and rebuild " - "stream manually", vgId, tsDataDir); + "stream manually", + vgId, tsDataDir); return -1; } tDecoderClear(&decoder); @@ -701,8 +692,8 @@ int32_t streamMetaLoadAllTasks(SStreamMeta* pMeta) { tFreeStreamTask(pTask); STaskId id = streamTaskExtractKey(pTask); - taosArrayPush(pRecycleList, &id); + int32_t total = taosArrayGetSize(pRecycleList); stDebug("s-task:0x%x is already dropped, add into recycle list, total:%d", taskId, total); continue; @@ -738,7 +729,7 @@ int32_t streamMetaLoadAllTasks(SStreamMeta* pMeta) { atomic_add_fetch_32(&pMeta->numOfStreamTasks, 1); } - if (streamTaskShouldPause(&pTask->status)) { + if (streamTaskShouldPause(pTask)) { atomic_add_fetch_32(&pMeta->numOfPausedTasks, 1); } @@ -790,6 +781,15 @@ int32_t tEncodeStreamHbMsg(SEncoder* pEncoder, const SStreamHbMsg* pReq) { if (tEncodeI64(pEncoder, ps->activeCheckpointId) < 0) return -1; if (tEncodeI8(pEncoder, ps->checkpointFailed) < 0) return -1; } + + int32_t numOfVgs = taosArrayGetSize(pReq->pUpdateNodes); + if (tEncodeI32(pEncoder, numOfVgs) < 0) return -1; + + for (int j = 0; j < numOfVgs; ++j) { + int32_t* pVgId = taosArrayGet(pReq->pUpdateNodes, j); + if (tEncodeI32(pEncoder, *pVgId) < 0) return -1; + } + tEndEncode(pEncoder); return pEncoder->pos; } @@ -823,6 +823,17 @@ int32_t tDecodeStreamHbMsg(SDecoder* pDecoder, SStreamHbMsg* pReq) { taosArrayPush(pReq->pTaskStatus, &entry); } + int32_t numOfVgs = 0; + if (tDecodeI32(pDecoder, &numOfVgs) < 0) return -1; + + pReq->pUpdateNodes = taosArrayInit(numOfVgs, sizeof(int32_t)); + + for (int j = 0; j < numOfVgs; ++j) { + int32_t vgId = 0; + if (tDecodeI32(pDecoder, &vgId) < 0) return -1; + taosArrayPush(pReq->pUpdateNodes, &vgId); + } + tEndDecode(pDecoder); return 0; } @@ -852,8 +863,8 @@ void metaHbToMnode(void* param, void* tmrId) { } // not leader not send msg - if (pMeta->role == NODE_ROLE_FOLLOWER) { - stInfo("vgId:%d follower not send hb to mnode", pMeta->vgId); + if (pMeta->role != NODE_ROLE_LEADER) { + stInfo("vgId:%d role:%d not leader not send hb to mnode", pMeta->vgId, pMeta->role); taosReleaseRef(streamMetaId, rid); pMeta->pHbInfo->hbStart = 0; return; @@ -877,13 +888,14 @@ void metaHbToMnode(void* param, void* tmrId) { int32_t numOfTasks = streamMetaGetNumOfTasks(pMeta); SEpSet epset = {0}; - bool hasValEpset = false; + bool hasMnodeEpset = false; + hbMsg.vgId = pMeta->vgId; hbMsg.pTaskStatus = taosArrayInit(numOfTasks, sizeof(STaskStatusEntry)); + hbMsg.pUpdateNodes = taosArrayInit(numOfTasks, sizeof(int32_t)); for (int32_t i = 0; i < numOfTasks; ++i) { - STaskId* pId = taosArrayGet(pMeta->pTaskList, i); - + STaskId* pId = taosArrayGet(pMeta->pTaskList, i); SStreamTask** pTask = taosHashGet(pMeta->pTasksMap, pId, sizeof(*pId)); // not report the status of fill-history task @@ -893,10 +905,10 @@ void metaHbToMnode(void* param, void* tmrId) { STaskStatusEntry entry = { .id = *pId, - .status = (*pTask)->status.taskStatus, + .status = streamTaskGetStatus(*pTask, NULL), .nodeId = pMeta->vgId, .stage = pMeta->stage, - .inputQUsed = SIZE_IN_MiB(streamQueueGetItemSize((*pTask)->inputInfo.queue)), + .inputQUsed = SIZE_IN_MiB(streamQueueGetItemSize((*pTask)->inputq.queue)), }; entry.inputRate = entry.inputQUsed*100.0/STREAM_TASK_QUEUE_CAPACITY_IN_SIZE; @@ -915,18 +927,39 @@ void metaHbToMnode(void* param, void* tmrId) { walReaderValidVersionRange((*pTask)->exec.pWalReader, &entry.verStart, &entry.verEnd); } - taosArrayPush(hbMsg.pTaskStatus, &entry); + taosThreadMutexLock(&(*pTask)->lock); + int32_t num = taosArrayGetSize((*pTask)->outputInfo.pDownstreamUpdateList); + for (int j = 0; j < num; ++j) { + int32_t *pNodeId = taosArrayGet((*pTask)->outputInfo.pDownstreamUpdateList, j); - if (!hasValEpset) { + bool exist = false; + int32_t numOfExisted = taosArrayGetSize(hbMsg.pUpdateNodes); + for (int k = 0; k < numOfExisted; ++k) { + if (*pNodeId == *(int32_t*)taosArrayGet(hbMsg.pUpdateNodes, k)) { + exist = true; + break; + } + } + + if (!exist) { + taosArrayPush(hbMsg.pUpdateNodes, pNodeId); + } + } + + taosArrayClear((*pTask)->outputInfo.pDownstreamUpdateList); + taosThreadMutexUnlock(&(*pTask)->lock); + + taosArrayPush(hbMsg.pTaskStatus, &entry); + if (!hasMnodeEpset) { epsetAssign(&epset, &(*pTask)->info.mnodeEpset); - hasValEpset = true; + hasMnodeEpset = true; } } hbMsg.numOfTasks = taosArrayGetSize(hbMsg.pTaskStatus); taosRUnLockLatch(&pMeta->lock); - if (hasValEpset) { + if (hasMnodeEpset) { int32_t code = 0; int32_t tlen = 0; @@ -971,13 +1004,14 @@ void metaHbToMnode(void* param, void* tmrId) { } taosArrayDestroy(hbMsg.pTaskStatus); + taosArrayDestroy(hbMsg.pUpdateNodes); + taosTmrReset(metaHbToMnode, META_HB_CHECK_INTERVAL, param, streamEnv.timer, &pMeta->pHbInfo->hbTmr); taosReleaseRef(streamMetaId, rid); } -static bool hasStreamTaskInTimer(SStreamMeta* pMeta) { +bool streamMetaTaskInTimer(SStreamMeta* pMeta) { bool inTimer = false; - taosWLockLatch(&pMeta->lock); void* pIter = NULL; @@ -1031,7 +1065,7 @@ void streamMetaNotifyClose(SStreamMeta* pMeta) { stDebug("vgId:%d start to check all tasks", vgId); int64_t st = taosGetTimestampMs(); - while (hasStreamTaskInTimer(pMeta)) { + while (streamMetaTaskInTimer(pMeta)) { stDebug("vgId:%d some tasks in timer, wait for 100ms and recheck", pMeta->vgId); taosMsleep(100); } @@ -1054,5 +1088,6 @@ void streamMetaInitForSnode(SStreamMeta* pMeta) { void streamMetaResetStartInfo(STaskStartInfo* pStartInfo) { taosHashClear(pStartInfo->pReadyTaskSet); - pStartInfo->startedAfterNodeUpdate = 0; + pStartInfo->startAllTasksFlag = 0; + pStartInfo->readyTs = 0; } \ No newline at end of file diff --git a/source/libs/stream/src/streamQueue.c b/source/libs/stream/src/streamQueue.c index ae285046ef..eae4605dbc 100644 --- a/source/libs/stream/src/streamQueue.c +++ b/source/libs/stream/src/streamQueue.c @@ -18,7 +18,7 @@ #define MAX_STREAM_EXEC_BATCH_NUM 32 #define MAX_SMOOTH_BURST_RATIO 5 // 5 sec #define WAIT_FOR_DURATION 40 -#define SINK_TASK_IDLE_DURATION 200 // 200 ms +#define OUTPUT_QUEUE_FULL_WAIT_DURATION 500 // 500 ms // todo refactor: // read data from input queue @@ -119,17 +119,8 @@ int32_t streamQueueGetNumOfItems(const SStreamQueue* pQueue) { return numOfItems1 + numOfItems2; } -int32_t streamQueueGetAvailableSpace(const SStreamQueue* pQueue, int32_t* availNum, double* availSize) { - int32_t num = streamQueueGetNumOfItems(pQueue); - *availNum = STREAM_TASK_QUEUE_CAPACITY - num; - - *availSize = STREAM_TASK_QUEUE_CAPACITY_IN_SIZE - taosQueueMemorySize(pQueue->pQueue); - return 0; -} - -// todo: fix it: data in Qall is not included here int32_t streamQueueGetItemSize(const SStreamQueue* pQueue) { - return taosQueueMemorySize(pQueue->pQueue); + return taosQueueMemorySize(pQueue->pQueue) + taosQallUnAccessedMemSize(pQueue->qall); } int32_t streamQueueItemGetSize(const SStreamQueueItem* pItem) { @@ -173,12 +164,12 @@ int32_t streamTaskGetDataFromInputQ(SStreamTask* pTask, SStreamQueueItem** pInpu } while (1) { - if (streamTaskShouldPause(&pTask->status) || streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldPause(pTask) || streamTaskShouldStop(pTask)) { stDebug("s-task:%s task should pause, extract input blocks:%d", pTask->id.idStr, *numOfBlocks); return TSDB_CODE_SUCCESS; } - SStreamQueueItem* qItem = streamQueueNextItem(pTask->inputInfo.queue); + SStreamQueueItem* qItem = streamQueueNextItem(pTask->inputq.queue); if (qItem == NULL) { if ((taskLevel == TASK_LEVEL__SOURCE || taskLevel == TASK_LEVEL__SINK) && (++retryTimes) < MAX_RETRY_TIMES) { taosMsleep(WAIT_FOR_DURATION); @@ -220,7 +211,7 @@ int32_t streamTaskGetDataFromInputQ(SStreamTask* pTask, SStreamQueueItem** pInpu streamTaskConsumeQuota(pTask->outputInfo.pTokenBucket, *blockSize); } - streamQueueProcessFail(pTask->inputInfo.queue); + streamQueueProcessFail(pTask->inputq.queue); return TSDB_CODE_SUCCESS; } } else { @@ -241,7 +232,7 @@ int32_t streamTaskGetDataFromInputQ(SStreamTask* pTask, SStreamQueueItem** pInpu streamTaskConsumeQuota(pTask->outputInfo.pTokenBucket, *blockSize); } - streamQueueProcessFail(pTask->inputInfo.queue); + streamQueueProcessFail(pTask->inputq.queue); return TSDB_CODE_SUCCESS; } @@ -249,7 +240,7 @@ int32_t streamTaskGetDataFromInputQ(SStreamTask* pTask, SStreamQueueItem** pInpu } *numOfBlocks += 1; - streamQueueProcessSuccess(pTask->inputInfo.queue); + streamQueueProcessSuccess(pTask->inputq.queue); if (*numOfBlocks >= MAX_STREAM_EXEC_BATCH_NUM) { stDebug("s-task:%s batch size limit:%d reached, start to process blocks", id, MAX_STREAM_EXEC_BATCH_NUM); @@ -267,12 +258,12 @@ int32_t streamTaskGetDataFromInputQ(SStreamTask* pTask, SStreamQueueItem** pInpu int32_t streamTaskPutDataIntoInputQ(SStreamTask* pTask, SStreamQueueItem* pItem) { int8_t type = pItem->type; - STaosQueue* pQueue = pTask->inputInfo.queue->pQueue; - int32_t total = streamQueueGetNumOfItems(pTask->inputInfo.queue) + 1; + STaosQueue* pQueue = pTask->inputq.queue->pQueue; + int32_t total = streamQueueGetNumOfItems(pTask->inputq.queue) + 1; if (type == STREAM_INPUT__DATA_SUBMIT) { SStreamDataSubmit* px = (SStreamDataSubmit*)pItem; - if ((pTask->info.taskLevel == TASK_LEVEL__SOURCE) && streamQueueIsFull(pTask->inputInfo.queue)) { + if ((pTask->info.taskLevel == TASK_LEVEL__SOURCE) && streamQueueIsFull(pTask->inputq.queue)) { double size = SIZE_IN_MiB(taosQueueMemorySize(pQueue)); stTrace( "s-task:%s inputQ is full, capacity(size:%d num:%dMiB), current(blocks:%d, size:%.2fMiB) stop to push data", @@ -299,7 +290,7 @@ int32_t streamTaskPutDataIntoInputQ(SStreamTask* pTask, SStreamQueueItem* pItem) msgLen, ver, total, size + SIZE_IN_MiB(msgLen)); } else if (type == STREAM_INPUT__DATA_BLOCK || type == STREAM_INPUT__DATA_RETRIEVE || type == STREAM_INPUT__REF_DATA_BLOCK) { - if (streamQueueIsFull(pTask->inputInfo.queue)) { + if (streamQueueIsFull(pTask->inputq.queue)) { double size = SIZE_IN_MiB(taosQueueMemorySize(pQueue)); stTrace("s-task:%s input queue is full, capacity:%d size:%d MiB, current(blocks:%d, size:%.2fMiB) abort", @@ -354,7 +345,7 @@ int32_t streamTaskPutDataIntoOutputQ(SStreamTask* pTask, SStreamDataBlock* pBloc STaosQueue* pQueue = pTask->outputq.queue->pQueue; while (streamQueueIsFull(pTask->outputq.queue)) { - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { stInfo("s-task:%s discard result block due to task stop", pTask->id.idStr); return TSDB_CODE_STREAM_EXEC_CANCELLED; } @@ -362,9 +353,10 @@ int32_t streamTaskPutDataIntoOutputQ(SStreamTask* pTask, SStreamDataBlock* pBloc int32_t total = streamQueueGetNumOfItems(pTask->outputq.queue); double size = SIZE_IN_MiB(taosQueueMemorySize(pQueue)); // let's wait for there are enough space to hold this result pBlock - stDebug("s-task:%s outputQ is full, wait for 500ms and retry, outputQ items:%d, size:%.2fMiB", pTask->id.idStr, - total, size); - taosMsleep(500); + stDebug("s-task:%s outputQ is full, wait for %dms and retry, outputQ items:%d, size:%.2fMiB", pTask->id.idStr, + OUTPUT_QUEUE_FULL_WAIT_DURATION, total, size); + + taosMsleep(OUTPUT_QUEUE_FULL_WAIT_DURATION); } int32_t code = taosWriteQitem(pQueue, pBlock); @@ -381,7 +373,7 @@ int32_t streamTaskPutDataIntoOutputQ(SStreamTask* pTask, SStreamDataBlock* pBloc return TSDB_CODE_SUCCESS; } -int32_t streamTaskInitTokenBucket(STokenBucket* pBucket, int32_t numCap, int32_t numRate, int32_t quotaRate) { +int32_t streamTaskInitTokenBucket(STokenBucket* pBucket, int32_t numCap, int32_t numRate, float quotaRate) { if (numCap < 10 || numRate < 10 || pBucket == NULL) { stError("failed to init sink task bucket, cap:%d, rate:%d", numCap, numRate); return TSDB_CODE_INVALID_PARA; diff --git a/source/libs/stream/src/streamRecover.c b/source/libs/stream/src/streamStart.c similarity index 79% rename from source/libs/stream/src/streamRecover.c rename to source/libs/stream/src/streamStart.c index cd15595411..2d951147d0 100644 --- a/source/libs/stream/src/streamRecover.c +++ b/source/libs/stream/src/streamStart.c @@ -17,6 +17,7 @@ #include "trpc.h" #include "ttimer.h" #include "wal.h" +#include "streamsm.h" typedef struct SLaunchHTaskInfo { SStreamMeta* pMeta; @@ -34,16 +35,18 @@ static void streamTaskSetRangeStreamCalc(SStreamTask* pTask); static int32_t initScanHistoryReq(SStreamTask* pTask, SStreamScanHistoryReq* pReq, int8_t igUntreated); static SLaunchHTaskInfo* createHTaskLaunchInfo(SStreamMeta* pMeta, int64_t streamId, int32_t taskId); static void tryLaunchHistoryTask(void* param, void* tmrId); +static void doProcessDownstreamReadyRsp(SStreamTask* pTask); -static void streamTaskSetReady(SStreamTask* pTask, int32_t numOfReqs) { - SStreamMeta* pMeta = pTask->pMeta; - int32_t vgId = pMeta->vgId; +int32_t streamTaskSetReady(SStreamTask* pTask) { + char* p = NULL; + int32_t numOfDowns = streamTaskGetNumOfDownstream(pTask); + ETaskStatus status = streamTaskGetStatus(pTask, &p); - if (pTask->status.taskStatus == TASK_STATUS__SCAN_HISTORY && pTask->info.taskLevel != TASK_LEVEL__SOURCE) { + if ((status == TASK_STATUS__SCAN_HISTORY || status == TASK_STATUS__STREAM_SCAN_HISTORY) && + pTask->info.taskLevel != TASK_LEVEL__SOURCE) { pTask->numOfWaitingUpstream = taosArrayGetSize(pTask->upstreamInfo.pList); stDebug("s-task:%s level:%d task wait for %d upstream tasks complete scan-history procedure, status:%s", - pTask->id.idStr, pTask->info.taskLevel, pTask->numOfWaitingUpstream, - streamGetTaskStatusStr(pTask->status.taskStatus)); + pTask->id.idStr, pTask->info.taskLevel, pTask->numOfWaitingUpstream, p); } ASSERT(pTask->status.downstreamReady == 0); @@ -52,34 +55,10 @@ static void streamTaskSetReady(SStreamTask* pTask, int32_t numOfReqs) { pTask->execInfo.start = taosGetTimestampMs(); int64_t el = (pTask->execInfo.start - pTask->execInfo.init); stDebug("s-task:%s all %d downstream ready, init completed, elapsed time:%" PRId64 "ms, task status:%s", - pTask->id.idStr, numOfReqs, el, streamGetTaskStatusStr(pTask->status.taskStatus)); + pTask->id.idStr, numOfDowns, el, p); - taosWLockLatch(&pMeta->lock); - - STaskId id = streamTaskExtractKey(pTask); - taosHashPut(pMeta->startInfo.pReadyTaskSet, &id, sizeof(id), NULL, 0); - - int32_t numOfTotal = streamMetaGetNumOfTasks(pMeta); - - if (taosHashGetSize(pMeta->startInfo.pReadyTaskSet) == numOfTotal) { - STaskStartInfo* pStartInfo = &pMeta->startInfo; - pStartInfo->readyTs = pTask->execInfo.start; - - if (pStartInfo->startTs != 0) { - pStartInfo->elapsedTime = pStartInfo->readyTs - pStartInfo->startTs; - } else { - pStartInfo->elapsedTime = 0; - } - - streamMetaResetStartInfo(pStartInfo); - - stDebug("vgId:%d all %d task(s) are started successfully, last ready task:%s level:%d, startTs:%" PRId64 - ", readyTs:%" PRId64 " total elapsed time:%.2fs", - vgId, numOfTotal, pTask->id.idStr, pTask->info.taskLevel, pStartInfo->startTs, pStartInfo->readyTs, - pStartInfo->elapsedTime / 1000.0); - } - - taosWUnLockLatch(&pMeta->lock); + streamMetaUpdateTaskReadyInfo(pTask); + return TSDB_CODE_SUCCESS; } int32_t streamStartScanHistoryAsync(SStreamTask* pTask, int8_t igUntreated) { @@ -114,33 +93,28 @@ static int32_t doStartScanHistoryTask(SStreamTask* pTask) { } int32_t streamTaskStartScanHistory(SStreamTask* pTask) { - ASSERT(pTask->status.downstreamReady == 1); + int32_t level = pTask->info.taskLevel; + ETaskStatus status = streamTaskGetStatus(pTask, NULL); - if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) { - if (pTask->status.taskStatus == TASK_STATUS__SCAN_HISTORY) { - return doStartScanHistoryTask(pTask); - } else { - ASSERT(pTask->status.taskStatus == TASK_STATUS__NORMAL); - stDebug("s-task:%s no need to scan-history data, status:%s, sched-status:%d, ver:%" PRId64, pTask->id.idStr, - streamGetTaskStatusStr(pTask->status.taskStatus), pTask->status.schedStatus, - walReaderGetCurrentVer(pTask->exec.pWalReader)); - streamTaskEnablePause(pTask); - } - } else if (pTask->info.taskLevel == TASK_LEVEL__AGG) { + ASSERT(pTask->status.downstreamReady == 1 && + ((status == TASK_STATUS__SCAN_HISTORY) || (status == TASK_STATUS__STREAM_SCAN_HISTORY))); + + if (level == TASK_LEVEL__SOURCE) { + return doStartScanHistoryTask(pTask); + } else if (level == TASK_LEVEL__AGG) { if (pTask->info.fillHistory) { streamSetParamForScanHistory(pTask); streamTaskEnablePause(pTask); } - } else if (pTask->info.taskLevel == TASK_LEVEL__SINK) { - if (pTask->status.taskStatus == TASK_STATUS__SCAN_HISTORY) { - stDebug("s-task:%s sink task do nothing to handle scan-history", pTask->id.idStr); - } + } else if (level == TASK_LEVEL__SINK) { + stDebug("s-task:%s sink task do nothing to handle scan-history", pTask->id.idStr); } + return 0; } // check status -static int32_t doCheckDownstreamStatus(SStreamTask* pTask) { +void streamTaskCheckDownstream(SStreamTask* pTask) { SDataRange* pRange = &pTask->dataRange; STimeWindow* pWindow = &pRange->window; @@ -152,6 +126,8 @@ static int32_t doCheckDownstreamStatus(SStreamTask* pTask) { .stage = pTask->pMeta->stage, }; + ASSERT(pTask->status.downstreamReady == 0); + // serialize streamProcessScanHistoryFinishRsp if (pTask->outputInfo.type == TASK_OUTPUT__FIXED_DISPATCH) { req.reqId = tGenIdPI64(); @@ -187,14 +163,8 @@ static int32_t doCheckDownstreamStatus(SStreamTask* pTask) { } } else { stDebug("s-task:%s (vgId:%d) set downstream ready, since no downstream", pTask->id.idStr, pTask->info.nodeId); - - streamTaskSetReady(pTask, 0); - streamTaskSetRangeStreamCalc(pTask); - streamTaskStartScanHistory(pTask); - streamLaunchFillHistoryTask(pTask); + doProcessDownstreamReadyRsp(pTask); } - - return 0; } static STaskRecheckInfo* createRecheckInfo(SStreamTask* pTask, const SStreamTaskCheckRsp* pRsp) { @@ -280,56 +250,88 @@ int32_t streamTaskCheckStatus(SStreamTask* pTask, int32_t upstreamTaskId, int32_ } if (pInfo->stage != stage) { - return TASK_SELF_NEW_STAGE; + return TASK_UPSTREAM_NEW_STAGE; } else if (pTask->status.downstreamReady != 1) { + stDebug("s-task:%s vgId:%d leader:%d, downstream not ready", id, vgId, (pTask->pMeta->role == NODE_ROLE_LEADER)); return TASK_DOWNSTREAM_NOT_READY; } else { return TASK_DOWNSTREAM_READY; } } -static void doProcessDownstreamReadyRsp(SStreamTask* pTask, int32_t numOfReqs) { - streamTaskSetReady(pTask, numOfReqs); +int32_t onNormalTaskReady(SStreamTask* pTask) { const char* id = pTask->id.idStr; - int8_t status = pTask->status.taskStatus; - const char* str = streamGetTaskStatusStr(status); - - ASSERT(status == TASK_STATUS__SCAN_HISTORY || status == TASK_STATUS__NORMAL); + streamTaskSetReady(pTask); streamTaskSetRangeStreamCalc(pTask); - if (status == TASK_STATUS__SCAN_HISTORY) { - stDebug("s-task:%s enter into scan-history data stage, status:%s", id, str); - streamTaskStartScanHistory(pTask); - } else { - // fill-history tasks are not allowed to reach here. - if (pTask->info.fillHistory == 1) { - stDebug("s-task:%s fill-history is set normal when start it, try to remove it,set it task to be dropping", id); - pTask->status.taskStatus = TASK_STATUS__DROPPING; - ASSERT(pTask->hTaskInfo.id.taskId == 0); - } else { - stDebug("s-task:%s downstream tasks are ready, now ready for data from wal, status:%s", id, str); - streamTaskEnablePause(pTask); + char* p = NULL; + ETaskStatus status = streamTaskGetStatus(pTask, &p); + ASSERT(status == TASK_STATUS__READY); + + if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) { + int64_t startVer = walReaderGetCurrentVer(pTask->exec.pWalReader); + if (startVer == -1) { + startVer = pTask->chkInfo.nextProcessVer; } + + stDebug("s-task:%s no need to scan-history data, status:%s, sched-status:%d, ready for data from wal ver:%" PRId64, + id, p, pTask->status.schedStatus, startVer); + } else { + stDebug("s-task:%s level:%d status:%s sched-status:%d", id, pTask->info.taskLevel, p, pTask->status.schedStatus); } - // when current stream task is ready, check the related fill history task. - streamLaunchFillHistoryTask(pTask); + streamTaskEnablePause(pTask); + return TSDB_CODE_SUCCESS; +} + +int32_t onScanhistoryTaskReady(SStreamTask* pTask) { + const char* id = pTask->id.idStr; + + // set the state to be ready + streamTaskSetReady(pTask); + streamTaskSetRangeStreamCalc(pTask); + + char* p = NULL; + ETaskStatus status = streamTaskGetStatus(pTask, &p); + ASSERT(status == TASK_STATUS__SCAN_HISTORY || status == TASK_STATUS__STREAM_SCAN_HISTORY); + + stDebug("s-task:%s enter into scan-history data stage, status:%s", id, p); + streamTaskStartScanHistory(pTask); + + // start the related fill-history task, when current task is ready + if (HAS_RELATED_FILLHISTORY_TASK(pTask)) { + streamLaunchFillHistoryTask(pTask); + } + + return TSDB_CODE_SUCCESS; +} + +void doProcessDownstreamReadyRsp(SStreamTask* pTask) { + EStreamTaskEvent event; + if (pTask->info.fillHistory == 0) { + event = HAS_RELATED_FILLHISTORY_TASK(pTask)? TASK_EVENT_INIT_STREAM_SCANHIST:TASK_EVENT_INIT; + } else { + event = TASK_EVENT_INIT_SCANHIST; + } + + streamTaskOnHandleEventSuccess(pTask->status.pSM, event); } int32_t streamProcessCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp* pRsp) { ASSERT(pTask->id.taskId == pRsp->upstreamTaskId); const char* id = pTask->id.idStr; + int32_t vgId = pTask->pMeta->vgId; - if (streamTaskShouldStop(&pTask->status)) { + if (streamTaskShouldStop(pTask)) { stDebug("s-task:%s should stop, do not do check downstream again", id); return TSDB_CODE_SUCCESS; } if (pRsp->status == TASK_DOWNSTREAM_READY) { if (pTask->outputInfo.type == TASK_OUTPUT__SHUFFLE_DISPATCH) { - bool found = false; + bool found = false; int32_t numOfReqs = taosArrayGetSize(pTask->checkReqIds); for (int32_t i = 0; i < numOfReqs; i++) { int64_t reqId = *(int64_t*)taosArrayGet(pTask->checkReqIds, i); @@ -350,7 +352,7 @@ int32_t streamProcessCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp* pRs taosArrayDestroy(pTask->checkReqIds); pTask->checkReqIds = NULL; - doProcessDownstreamReadyRsp(pTask, numOfReqs); + doProcessDownstreamReadyRsp(pTask); } else { int32_t total = taosArrayGetSize(pTask->outputInfo.shuffleDispatcher.dbInfo.pVgroupInfos); stDebug("s-task:%s (vgId:%d) recv check rsp from task:0x%x (vgId:%d) status:%d, total:%d not ready:%d", id, @@ -362,27 +364,49 @@ int32_t streamProcessCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp* pRs return -1; } - doProcessDownstreamReadyRsp(pTask, 1); + doProcessDownstreamReadyRsp(pTask); } } else { // not ready, wait for 100ms and retry - if (pRsp->status == TASK_DOWNSTREAM_NOT_LEADER) { + if (pRsp->status == TASK_UPSTREAM_NEW_STAGE) { stError( - "s-task:%s downstream taskId:0x%x (vgId:%d) vnode-transfer/leader-change detected, not send check again, " - "roll-back needed", - id, pRsp->downstreamTaskId, pRsp->downstreamNodeId); - } else if (pRsp->status == TASK_SELF_NEW_STAGE) { - stError( - "s-task:%s vnode-transfer/leader-change/restart detected, old stage:%d, current stage:%d, not send check " - "again, roll-back needed", - id, pRsp->oldStage, (int32_t)pTask->pMeta->stage); + "s-task:%s vgId:%d self vnode-transfer/leader-change/restart detected, old stage:%d, current stage:%d, " + "not check wait for downstream task nodeUpdate, and all tasks restart", + id, pRsp->upstreamNodeId, pRsp->oldStage, (int32_t)pTask->pMeta->stage); } else { + if (pRsp->status == TASK_DOWNSTREAM_NOT_LEADER) { + stError( + "s-task:%s downstream taskId:0x%x (vgId:%d) not leader, self dispatch epset needs to be updated, not check " + "downstream again, nodeUpdate needed", + id, pRsp->downstreamTaskId, pRsp->downstreamNodeId); + + taosThreadMutexLock(&pTask->lock); + int32_t num = taosArrayGetSize(pTask->outputInfo.pDownstreamUpdateList); + bool existed = false; + for (int i = 0; i < num; ++i) { + SDownstreamTaskEpset* p = taosArrayGet(pTask->outputInfo.pDownstreamUpdateList, i); + if (p->nodeId == pRsp->downstreamNodeId) { + existed = true; + break; + } + } + + if (!existed) { + SDownstreamTaskEpset t = {.nodeId = pRsp->downstreamNodeId}; + taosArrayPush(pTask->outputInfo.pDownstreamUpdateList, &t); + stInfo("s-task:%s vgId:%d downstream nodeId:%d needs to be updated, total needs updated:%d", id, vgId, + t.nodeId, (int32_t)taosArrayGetSize(pTask->outputInfo.pDownstreamUpdateList)); + } + + taosThreadMutexUnlock(&pTask->lock); + return 0; + } + STaskRecheckInfo* pInfo = createRecheckInfo(pTask, pRsp); int32_t ref = atomic_add_fetch_32(&pTask->status.timerActive, 1); stDebug("s-task:%s downstream taskId:0x%x (vgId:%d) not ready, stage:%d, retry in 100ms, ref:%d ", id, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->oldStage, ref); - - taosTmrReset(recheckDownstreamTasks, CHECK_DOWNSTREAM_INTERVAL, pInfo, streamEnv.timer, &pInfo->checkTimer); + pInfo->checkTimer = taosTmrStart(recheckDownstreamTasks, CHECK_DOWNSTREAM_INTERVAL, pInfo, streamEnv.timer); } } @@ -426,30 +450,6 @@ int32_t streamRestoreParam(SStreamTask* pTask) { return qRestoreStreamOperatorOption(pTask->exec.pExecutor); } -int32_t streamSetStatusNormal(SStreamTask* pTask) { - int32_t status = atomic_load_8(&pTask->status.taskStatus); - if (status == TASK_STATUS__DROPPING) { - stError("s-task:%s cannot be set normal, since in dropping state", pTask->id.idStr); - return -1; - } else { - stDebug("s-task:%s set task status to be normal, prev:%s", pTask->id.idStr, streamGetTaskStatusStr(status)); - atomic_store_8(&pTask->status.taskStatus, TASK_STATUS__NORMAL); - return 0; - } -} - -int32_t streamSetStatusUnint(SStreamTask* pTask) { - int32_t status = atomic_load_8(&pTask->status.taskStatus); - if (status == TASK_STATUS__DROPPING) { - stError("s-task:%s cannot be set uninit, since in dropping state", pTask->id.idStr); - return -1; - } else { - stDebug("s-task:%s set task status to be uninit, prev:%s", pTask->id.idStr, streamGetTaskStatusStr(status)); - atomic_store_8(&pTask->status.taskStatus, TASK_STATUS__UNINIT); - return 0; - } -} - // source int32_t streamSetParamForStreamScannerStep1(SStreamTask* pTask, SVersionRange *pVerRange, STimeWindow* pWindow) { return qStreamSourceScanParamForHistoryScanStep1(pTask->exec.pExecutor, pVerRange, pWindow); @@ -515,9 +515,13 @@ int32_t streamProcessScanHistoryFinishReq(SStreamTask* pTask, SStreamScanHistory int32_t taskLevel = pTask->info.taskLevel; ASSERT(taskLevel == TASK_LEVEL__AGG || taskLevel == TASK_LEVEL__SINK); - if (pTask->status.taskStatus != TASK_STATUS__SCAN_HISTORY) { + const char* id = pTask->id.idStr; + char* p = NULL; + ETaskStatus status = streamTaskGetStatus(pTask, &p); + + if (status != TASK_STATUS__SCAN_HISTORY && status != TASK_STATUS__STREAM_SCAN_HISTORY) { stError("s-task:%s not in scan-history status, status:%s return upstream:0x%x scan-history finish directly", - pTask->id.idStr, streamGetTaskStatusStr(pTask->status.taskStatus), pReq->upstreamTaskId); + id, p, pReq->upstreamTaskId); void* pBuf = NULL; int32_t len = 0; @@ -527,8 +531,8 @@ int32_t streamProcessScanHistoryFinishReq(SStreamTask* pTask, SStreamScanHistory initRpcMsg(&msg, 0, pBuf, sizeof(SMsgHead) + len); tmsgSendRsp(&msg); - stDebug("s-task:%s level:%d notify upstream:0x%x(vgId:%d) to continue process data in WAL", pTask->id.idStr, - pTask->info.taskLevel, pReq->upstreamTaskId, pReq->upstreamNodeId); + stDebug("s-task:%s level:%d notify upstream:0x%x(vgId:%d) to continue process data in WAL", id, + taskLevel, pReq->upstreamTaskId, pReq->upstreamNodeId); return 0; } @@ -540,13 +544,15 @@ int32_t streamProcessScanHistoryFinishReq(SStreamTask* pTask, SStreamScanHistory if (left == 0) { int32_t numOfTasks = taosArrayGetSize(pTask->upstreamInfo.pList); - stDebug( - "s-task:%s all %d upstream tasks finish scan-history data, set param for agg task for stream data and send " - "rsp to all upstream tasks", - pTask->id.idStr, numOfTasks); - - if (pTask->info.taskLevel == TASK_LEVEL__AGG) { + if (taskLevel == TASK_LEVEL__AGG) { + stDebug( + "s-task:%s all %d upstream tasks finish scan-history data, set param for agg task for stream data processing " + "and send rsp to all upstream tasks", + id, numOfTasks); streamAggUpstreamScanHistoryFinish(pTask); + } else { + stDebug("s-task:%s all %d upstream task(s) finish scan-history data, and rsp to all upstream tasks", id, + numOfTasks); } // all upstream tasks have completed the scan-history task in the stream time window, let's start to extract data @@ -557,26 +563,25 @@ int32_t streamProcessScanHistoryFinishReq(SStreamTask* pTask, SStreamScanHistory if (taskLevel == TASK_LEVEL__AGG) { /*int32_t code = */streamTaskScanHistoryDataComplete(pTask); } else { // for sink task, set normal - if (pTask->status.taskStatus != TASK_STATUS__PAUSE && pTask->status.taskStatus != TASK_STATUS__STOP && - pTask->status.taskStatus != TASK_STATUS__DROPPING) { - streamSetStatusNormal(pTask); - } + streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_SCANHIST_DONE); } } else { stDebug("s-task:%s receive scan-history data finish msg from upstream:0x%x(index:%d), unfinished:%d", - pTask->id.idStr, pReq->upstreamTaskId, pReq->childId, left); + id, pReq->upstreamTaskId, pReq->childId, left); } return 0; } int32_t streamProcessScanHistoryFinishRsp(SStreamTask* pTask) { - ASSERT(pTask->status.taskStatus == TASK_STATUS__SCAN_HISTORY); + ETaskStatus status = streamTaskGetStatus(pTask, NULL); + + ASSERT(status == TASK_STATUS__SCAN_HISTORY || status == TASK_STATUS__STREAM_SCAN_HISTORY); SStreamMeta* pMeta = pTask->pMeta; // execute in the scan history complete call back msg, ready to process data from inputQ - streamSetStatusNormal(pTask); - streamTaskSetSchedStatusInActive(pTask); + streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_SCANHIST_DONE); + streamTaskSetSchedStatusInactive(pTask); taosWLockLatch(&pMeta->lock); streamMetaSaveTask(pMeta, pTask); @@ -604,15 +609,15 @@ static void checkFillhistoryTaskStatus(SStreamTask* pTask, SStreamTask* pHTask) if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) { stDebug("s-task:%s set the launch condition for fill-history s-task:%s, window:%" PRId64 " - %" PRId64 - " ver range:%" PRId64 " - %" PRId64", init:%"PRId64, + " verRange:%" PRId64 " - %" PRId64", init:%"PRId64, pTask->id.idStr, pHTask->id.idStr, pRange->window.skey, pRange->window.ekey, pRange->range.minVer, pRange->range.maxVer, pHTask->execInfo.init); } else { - stDebug("s-task:%s no fill history condition for non-source task:%s", pTask->id.idStr, pHTask->id.idStr); + stDebug("s-task:%s no fill-history condition for non-source task:%s", pTask->id.idStr, pHTask->id.idStr); } // check if downstream tasks have been ready - doCheckDownstreamStatus(pHTask); + streamTaskHandleEvent(pHTask->status.pSM, TASK_EVENT_INIT_SCANHIST); } static void tryLaunchHistoryTask(void* param, void* tmrId) { @@ -624,12 +629,12 @@ static void tryLaunchHistoryTask(void* param, void* tmrId) { if (ppTask) { ASSERT((*ppTask)->status.timerActive >= 1); - if (streamTaskShouldStop(&(*ppTask)->status)) { - const char* pStatus = streamGetTaskStatusStr((*ppTask)->status.taskStatus); - + if (streamTaskShouldStop(*ppTask)) { + char* p = NULL; + streamTaskGetStatus((*ppTask), &p); int32_t ref = atomic_sub_fetch_32(&(*ppTask)->status.timerActive, 1); stDebug("s-task:%s status:%s should stop, quit launch fill-history task timer, retry:%d, ref:%d", - (*ppTask)->id.idStr, pStatus, (*ppTask)->hTaskInfo.retryTimes, ref); + (*ppTask)->id.idStr, p, (*ppTask)->hTaskInfo.retryTimes, ref); taosMemoryFree(pInfo); taosWUnLockLatch(&pMeta->lock); @@ -665,9 +670,11 @@ static void tryLaunchHistoryTask(void* param, void* tmrId) { // abort the timer if intend to stop task SStreamTask* pHTask = streamMetaAcquireTask(pMeta, pHTaskInfo->id.streamId, pHTaskInfo->id.taskId); - if (pHTask == NULL && (!streamTaskShouldStop(&pTask->status))) { - const char* p = streamGetTaskStatusStr(pTask->status.taskStatus); - int32_t hTaskId = pHTaskInfo->id.taskId; + if (pHTask == NULL && (!streamTaskShouldStop(pTask))) { + char* p = NULL; + int32_t hTaskId = pHTaskInfo->id.taskId; + + streamTaskGetStatus(pTask, &p); stDebug( "s-task:%s status:%s failed to launch fill-history task:0x%x, retry launch:%dms, retryCount:%d", pTask->id.idStr, p, hTaskId, pHTaskInfo->waitInterval, pHTaskInfo->retryTimes); @@ -713,11 +720,8 @@ SLaunchHTaskInfo* createHTaskLaunchInfo(SStreamMeta* pMeta, int64_t streamId, in int32_t streamLaunchFillHistoryTask(SStreamTask* pTask) { SStreamMeta* pMeta = pTask->pMeta; int32_t hTaskId = pTask->hTaskInfo.id.taskId; - if (hTaskId == 0) { - return TSDB_CODE_SUCCESS; - } - ASSERT(pTask->status.downstreamReady == 1); + ASSERT((hTaskId != 0) && (pTask->status.downstreamReady == 1)); stDebug("s-task:%s start to launch related fill-history task:0x%" PRIx64 "-0x%x", pTask->id.idStr, pTask->hTaskInfo.id.streamId, hTaskId); @@ -765,7 +769,7 @@ int32_t streamLaunchFillHistoryTask(SStreamTask* pTask) { } int32_t streamTaskScanHistoryDataComplete(SStreamTask* pTask) { - if (atomic_load_8(&pTask->status.taskStatus) == TASK_STATUS__DROPPING) { + if (streamTaskGetStatus(pTask, NULL) == TASK_STATUS__DROPPING) { return 0; } @@ -897,7 +901,7 @@ int32_t tDecodeStreamScanHistoryFinishReq(SDecoder* pDecoder, SStreamScanHistory void streamTaskSetRangeStreamCalc(SStreamTask* pTask) { SDataRange* pRange = &pTask->dataRange; - if (pTask->hTaskInfo.id.taskId == 0) { + if (!HAS_RELATED_FILLHISTORY_TASK(pTask)) { if (pTask->info.fillHistory == 1) { stDebug("s-task:%s fill-history task, time window:%" PRId64 "-%" PRId64 ", verRange:%" PRId64 "-%" PRId64, pTask->id.idStr, pRange->window.skey, pRange->window.ekey, pRange->range.minVer, pRange->range.maxVer); @@ -929,21 +933,8 @@ void streamTaskSetRangeStreamCalc(SStreamTask* pTask) { } } -// only the downstream tasks are ready, set the task to be ready to work. -void streamTaskCheckDownstream(SStreamTask* pTask) { - if (pTask->info.fillHistory) { - stDebug("s-task:%s fill history task, wait for being launched", pTask->id.idStr); - return; - } - - ASSERT(pTask->status.downstreamReady == 0); - doCheckDownstreamStatus(pTask); -} - -// normal -> pause, pause/stop/dropping -> pause, halt -> pause, scan-history -> pause void streamTaskPause(SStreamTask* pTask, SStreamMeta* pMeta) { - int64_t st = taosGetTimestampMs(); - +#if 0 int8_t status = pTask->status.taskStatus; if (status == TASK_STATUS__DROPPING) { stDebug("vgId:%d s-task:%s task already dropped, do nothing", pMeta->vgId, pTask->id.idStr); @@ -1001,43 +992,54 @@ void streamTaskPause(SStreamTask* pTask, SStreamMeta* pMeta) { stInfo("vgId:%d s-task:%s pause stream task. pause task num:%d", pMeta->vgId, pTask->id.idStr, num); taosWUnLockLatch(&pMeta->lock); +#endif + + streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_PAUSE); + + int32_t num = atomic_add_fetch_32(&pMeta->numOfPausedTasks, 1); + stInfo("vgId:%d s-task:%s pause stream task. pause task num:%d", pMeta->vgId, pTask->id.idStr, num); + // in case of fill-history task, stop the tsdb file scan operation. if (pTask->info.fillHistory == 1) { void* pExecutor = pTask->exec.pExecutor; qKillTask(pExecutor, TSDB_CODE_SUCCESS); } - int64_t el = taosGetTimestampMs() - st; - stDebug("vgId:%d s-task:%s set pause flag, prev:%s, pause elapsed time:%dms", pMeta->vgId, pTask->id.idStr, - streamGetTaskStatusStr(pTask->status.keepTaskStatus), (int32_t)el); + stDebug("vgId:%d s-task:%s set pause flag and pause task", pMeta->vgId, pTask->id.idStr); } -void streamTaskResume(SStreamTask* pTask, SStreamMeta* pMeta) { - int8_t status = pTask->status.taskStatus; - if (status == TASK_STATUS__PAUSE) { - pTask->status.taskStatus = pTask->status.keepTaskStatus; - pTask->status.keepTaskStatus = TASK_STATUS__NORMAL; - int32_t num = atomic_sub_fetch_32(&pMeta->numOfPausedTasks, 1); - stInfo("vgId:%d s-task:%s resume from pause, status:%s. pause task num:%d", pMeta->vgId, pTask->id.idStr, streamGetTaskStatusStr(status), num); - } else if (pTask->info.taskLevel == TASK_LEVEL__SINK) { - int32_t num = atomic_sub_fetch_32(&pMeta->numOfPausedTasks, 1); - stInfo("vgId:%d s-task:%s sink task.resume from pause, status:%s. pause task num:%d", pMeta->vgId, pTask->id.idStr, streamGetTaskStatusStr(status), num); +void streamTaskResume(SStreamTask* pTask) { + char* p = NULL; + ETaskStatus status = streamTaskGetStatus(pTask, &p); + SStreamMeta* pMeta = pTask->pMeta; + + if (status == TASK_STATUS__PAUSE || status == TASK_STATUS__HALT) { + streamTaskRestoreStatus(pTask); + + char* pNew = NULL; + streamTaskGetStatus(pTask, &pNew); + if (status == TASK_STATUS__PAUSE) { + int32_t num = atomic_sub_fetch_32(&pMeta->numOfPausedTasks, 1); + stInfo("s-task:%s status:%s resume from %s, paused task(s):%d", pTask->id.idStr, pNew, p, num); + } else { + stInfo("s-task:%s status:%s resume from %s", pTask->id.idStr, pNew, p); + } } else { - stError("s-task:%s not in pause, failed to resume, status:%s", pTask->id.idStr, streamGetTaskStatusStr(status)); + stDebug("s-task:%s status:%s not in pause/halt status, no need to resume", pTask->id.idStr, p); } } // todo fix race condition void streamTaskDisablePause(SStreamTask* pTask) { // pre-condition check - const char* id = pTask->id.idStr; - while (pTask->status.taskStatus == TASK_STATUS__PAUSE) { - stDebug("s-task:%s already in pause, wait for pause being cancelled, and set pause disabled, recheck in 100ms", id); - taosMsleep(100); - } - - stDebug("s-task:%s disable task pause", id); - pTask->status.pauseAllowed = 0; +// const char* id = pTask->id.idStr; +// while (pTask->status.taskStatus == TASK_STATUS__PAUSE) { +// stDebug("s-task:%s already in pause, wait for pause being cancelled, and set pause disabled, recheck in 100ms", id); +// taosMsleep(100); +// } +// +// stDebug("s-task:%s disable task pause", id); +// pTask->status.pauseAllowed = 0; } void streamTaskEnablePause(SStreamTask* pTask) { @@ -1045,15 +1047,30 @@ void streamTaskEnablePause(SStreamTask* pTask) { pTask->status.pauseAllowed = 1; } -void streamTaskResumeFromHalt(SStreamTask* pTask) { - const char* id = pTask->id.idStr; - int8_t status = pTask->status.taskStatus; - if (status != TASK_STATUS__HALT) { - stError("s-task:%s not in halt status, status:%s", id, streamGetTaskStatusStr(status)); - return; +int32_t streamMetaUpdateTaskReadyInfo(SStreamTask* pTask) { + SStreamMeta* pMeta = pTask->pMeta; + + taosWLockLatch(&pMeta->lock); + + STaskId id = streamTaskExtractKey(pTask); + taosHashPut(pMeta->startInfo.pReadyTaskSet, &id, sizeof(id), NULL, 0); + + int32_t numOfTotal = streamMetaGetNumOfTasks(pMeta); + + if (taosHashGetSize(pMeta->startInfo.pReadyTaskSet) == numOfTotal) { + STaskStartInfo* pStartInfo = &pMeta->startInfo; + + pStartInfo->readyTs = pTask->execInfo.start; + pStartInfo->elapsedTime = (pStartInfo->startTs != 0) ? pStartInfo->readyTs - pStartInfo->startTs : 0; + + streamMetaResetStartInfo(pStartInfo); + + stDebug("vgId:%d all %d task(s) are started successfully, last ready task:%s level:%d, startTs:%" PRId64 + ", readyTs:%" PRId64 " total elapsed time:%.2fs", + pMeta->vgId, numOfTotal, pTask->id.idStr, pTask->info.taskLevel, pStartInfo->startTs, pStartInfo->readyTs, + pStartInfo->elapsedTime / 1000.0); } - pTask->status.taskStatus = pTask->status.keepTaskStatus; - pTask->status.keepTaskStatus = TASK_STATUS__NORMAL; - stDebug("s-task:%s resume from halt, current status:%s", id, streamGetTaskStatusStr(pTask->status.taskStatus)); + taosWUnLockLatch(&pMeta->lock); + return TSDB_CODE_SUCCESS; } diff --git a/source/libs/stream/src/streamTask.c b/source/libs/stream/src/streamTask.c index 37af1ce64f..f949d46315 100644 --- a/source/libs/stream/src/streamTask.c +++ b/source/libs/stream/src/streamTask.c @@ -19,6 +19,7 @@ #include "tstream.h" #include "ttimer.h" #include "wal.h" +#include "streamsm.h" static void streamTaskDestroyUpstreamInfo(SUpstreamInfo* pUpstreamInfo); @@ -34,8 +35,11 @@ SStreamTask* tNewStreamTask(int64_t streamId, int8_t taskLevel, bool fillHistory SStreamTask* pTask = (SStreamTask*)taosMemoryCalloc(1, sizeof(SStreamTask)); if (pTask == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; + stError("s-task:0x%" PRIx64 " failed malloc new stream task, size:%d, code:%s", streamId, + (int32_t)sizeof(SStreamTask), tstrerror(terrno)); return NULL; } + pTask->ver = SSTREAM_TASK_VER; pTask->id.taskId = tGenIdPI32(); pTask->id.streamId = streamId; @@ -43,13 +47,19 @@ SStreamTask* tNewStreamTask(int64_t streamId, int8_t taskLevel, bool fillHistory pTask->info.fillHistory = fillHistory; pTask->info.triggerParam = triggerParam; + pTask->status.pSM = streamCreateStateMachine(pTask); + if (pTask->status.pSM == NULL) { + taosMemoryFreeClear(pTask); + return NULL; + } + char buf[128] = {0}; sprintf(buf, "0x%" PRIx64 "-%d", pTask->id.streamId, pTask->id.taskId); pTask->id.idStr = taosStrdup(buf); pTask->status.schedStatus = TASK_SCHED_STATUS__INACTIVE; - pTask->status.taskStatus = (fillHistory || hasFillhistory)? TASK_STATUS__SCAN_HISTORY:TASK_STATUS__NORMAL; - pTask->inputInfo.status = TASK_INPUT_STATUS__NORMAL; + pTask->status.taskStatus = (fillHistory || hasFillhistory) ? TASK_STATUS__SCAN_HISTORY : TASK_STATUS__READY; + pTask->inputq.status = TASK_INPUT_STATUS__NORMAL; pTask->outputq.status = TASK_OUTPUT_STATUS__NORMAL; if (fillHistory) { @@ -296,9 +306,7 @@ void tFreeStreamTask(SStreamTask* pTask) { int32_t taskId = pTask->id.taskId; STaskExecStatisInfo* pStatis = &pTask->execInfo; - - stDebug("start to free s-task:0x%x, %p, state:%p, status:%s", taskId, pTask, pTask->pState, - streamGetTaskStatusStr(pTask->status.taskStatus)); + stDebug("start to free s-task:0x%x, %p, state:%p", taskId, pTask, pTask->pState); stDebug("s-task:0x%x task exec summary: create:%" PRId64 ", init:%" PRId64 ", start:%" PRId64 ", updateCount:%d latestUpdate:%" PRId64 ", latestCheckPoint:%" PRId64 ", ver:%" PRId64 @@ -309,8 +317,8 @@ void tFreeStreamTask(SStreamTask* pTask) { // remove the ref by timer while (pTask->status.timerActive > 0) { - stDebug("s-task:%s wait for task stop timer activities", pTask->id.idStr); - taosMsleep(10); + stDebug("s-task:%s wait for task stop timer activities, ref:%d", pTask->id.idStr, pTask->status.timerActive); + taosMsleep(100); } if (pTask->schedInfo.pTimer != NULL) { @@ -329,8 +337,8 @@ void tFreeStreamTask(SStreamTask* pTask) { } int32_t status = atomic_load_8((int8_t*)&(pTask->status.taskStatus)); - if (pTask->inputInfo.queue) { - streamQueueClose(pTask->inputInfo.queue, pTask->id.taskId); + if (pTask->inputq.queue) { + streamQueueClose(pTask->inputq.queue, pTask->id.taskId); } if (pTask->outputq.queue) { @@ -384,13 +392,18 @@ void tFreeStreamTask(SStreamTask* pTask) { pTask->pRspMsgList = NULL; } + pTask->status.pSM = streamDestroyStateMachine(pTask->status.pSM); + streamTaskDestroyUpstreamInfo(&pTask->upstreamInfo); pTask->msgInfo.pRetryList = taosArrayDestroy(pTask->msgInfo.pRetryList); taosMemoryFree(pTask->outputInfo.pTokenBucket); taosThreadMutexDestroy(&pTask->lock); - taosMemoryFree(pTask); + taosArrayDestroy(pTask->outputInfo.pDownstreamUpdateList); + pTask->outputInfo.pDownstreamUpdateList = NULL; + + taosMemoryFree(pTask); stDebug("s-task:0x%x free task completed", taskId); } @@ -399,16 +412,23 @@ int32_t streamTaskInit(SStreamTask* pTask, SStreamMeta* pMeta, SMsgCb* pMsgCb, i pTask->refCnt = 1; pTask->status.schedStatus = TASK_SCHED_STATUS__INACTIVE; pTask->status.timerActive = 0; - pTask->inputInfo.queue = streamQueueOpen(512 << 10); + pTask->inputq.queue = streamQueueOpen(512 << 10); pTask->outputq.queue = streamQueueOpen(512 << 10); - if (pTask->inputInfo.queue == NULL || pTask->outputq.queue == NULL) { + if (pTask->inputq.queue == NULL || pTask->outputq.queue == NULL) { stError("s-task:%s failed to prepare the input/output queue, initialize task failed", pTask->id.idStr); return TSDB_CODE_OUT_OF_MEMORY; } + pTask->status.pSM = streamCreateStateMachine(pTask); + if (pTask->status.pSM == NULL) { + stError("s-task:%s failed create state-machine for stream task, initialization failed, code:%s", pTask->id.idStr, + tstrerror(terrno)); + return terrno; + } + pTask->execInfo.created = taosGetTimestampMs(); - pTask->inputInfo.status = TASK_INPUT_STATUS__NORMAL; + pTask->inputq.status = TASK_INPUT_STATUS__NORMAL; pTask->outputq.status = TASK_OUTPUT_STATUS__NORMAL; pTask->pMeta = pMeta; @@ -427,7 +447,7 @@ int32_t streamTaskInit(SStreamTask* pTask, SStreamMeta* pMeta, SMsgCb* pMsgCb, i // 2MiB per second for sink task // 50 times sink operator per second - streamTaskInitTokenBucket(pTask->outputInfo.pTokenBucket, 50, 50, 2); + streamTaskInitTokenBucket(pTask->outputInfo.pTokenBucket, 50, 50, tsSinkDataRate); TdThreadMutexAttr attr = {0}; int code = taosThreadMutexAttrInit(&attr); @@ -445,6 +465,11 @@ int32_t streamTaskInit(SStreamTask* pTask, SStreamMeta* pMeta, SMsgCb* pMsgCb, i taosThreadMutexInit(&pTask->lock, &attr); streamTaskOpenAllUpstreamInput(pTask); + pTask->outputInfo.pDownstreamUpdateList = taosArrayInit(4, sizeof(SDownstreamTaskEpset)); + if (pTask->outputInfo.pDownstreamUpdateList == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + return TSDB_CODE_SUCCESS; } @@ -453,7 +478,9 @@ int32_t streamTaskGetNumOfDownstream(const SStreamTask* pTask) { return 0; } else { int32_t type = pTask->outputInfo.type; - if (type == TASK_OUTPUT__FIXED_DISPATCH || type == TASK_OUTPUT__TABLE) { + if (type == TASK_OUTPUT__TABLE) { + return 0; + } else if (type == TASK_OUTPUT__FIXED_DISPATCH) { return 1; } else { SArray* vgInfo = pTask->outputInfo.shuffleDispatcher.dbInfo.pVgroupInfos; @@ -562,13 +589,7 @@ int32_t streamTaskStop(SStreamTask* pTask) { int64_t st = taosGetTimestampMs(); const char* id = pTask->id.idStr; - taosThreadMutexLock(&pTask->lock); - if (pTask->status.taskStatus == TASK_STATUS__CK) { - stDebug("s-task:%s in checkpoint will be discarded since task is stopped", id); - } - pTask->status.taskStatus = TASK_STATUS__STOP; - taosThreadMutexUnlock(&pTask->lock); - + streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_STOP); qKillTask(pTask->exec.pExecutor, TSDB_CODE_SUCCESS); while (/*pTask->status.schedStatus != TASK_SCHED_STATUS__INACTIVE */ !streamTaskIsIdle(pTask)) { stDebug("s-task:%s level:%d wait for task to be idle and then close, check again in 100ms", id, @@ -612,7 +633,7 @@ int32_t streamTaskUpdateEpsetInfo(SStreamTask* pTask, SArray* pNodeList) { p->latestUpdateTs = taosGetTimestampMs(); p->updateCount += 1; - stDebug("s-task:%s update task nodeEp epset, updatedNodes:%d, updateCount:%d, prevTs:%" PRId64, pTask->id.idStr, + stDebug("s-task:0x%x update task nodeEp epset, updatedNodes:%d, updateCount:%d, prevTs:%" PRId64, pTask->id.taskId, numOfNodes, p->updateCount, prevTs); for (int32_t i = 0; i < taosArrayGetSize(pNodeList); ++i) { @@ -667,7 +688,7 @@ int8_t streamTaskSetSchedStatusActive(SStreamTask* pTask) { return status; } -int8_t streamTaskSetSchedStatusInActive(SStreamTask* pTask) { +int8_t streamTaskSetSchedStatusInactive(SStreamTask* pTask) { taosThreadMutexLock(&pTask->lock); int8_t status = pTask->status.schedStatus; ASSERT(status == TASK_SCHED_STATUS__WAITING || status == TASK_SCHED_STATUS__ACTIVE || @@ -678,6 +699,25 @@ int8_t streamTaskSetSchedStatusInActive(SStreamTask* pTask) { return status; } +int32_t streamTaskClearHTaskAttr(SStreamTask* pTask) { + SStreamMeta* pMeta = pTask->pMeta; + if (pTask->info.fillHistory == 0) { + return TSDB_CODE_SUCCESS; + } + + STaskId sTaskId = {.streamId = pTask->streamTaskId.streamId, .taskId = pTask->streamTaskId.taskId}; + SStreamTask** ppStreamTask = (SStreamTask**)taosHashGet(pMeta->pTasksMap, &sTaskId, sizeof(sTaskId)); + + if (ppStreamTask != NULL) { + CLEAR_RELATED_FILLHISTORY_TASK((*ppStreamTask)); + streamMetaSaveTask(pMeta, *ppStreamTask); + stDebug("s-task:%s clear the related stream task:0x%x attr to fill-history task", pTask->id.idStr, + (int32_t)sTaskId.taskId); + } + + return TSDB_CODE_SUCCESS; +} + int32_t streamBuildAndSendDropTaskMsg(SMsgCb* pMsgCb, int32_t vgId, SStreamTaskId* pTaskId) { SVDropStreamTaskReq *pReq = rpcMallocCont(sizeof(SVDropStreamTaskReq)); if (pReq == NULL) { @@ -696,7 +736,7 @@ int32_t streamBuildAndSendDropTaskMsg(SMsgCb* pMsgCb, int32_t vgId, SStreamTaskI return code; } - stDebug("vgId:%d build and send drop table:0x%x msg", vgId, pTaskId->taskId); + stDebug("vgId:%d build and send drop task:0x%x msg", vgId, pTaskId->taskId); return code; } @@ -719,20 +759,6 @@ void streamTaskSetRetryInfoForLaunch(SHistoryTaskInfo* pInfo) { pInfo->retryTimes += 1; } -const char* streamGetTaskStatusStr(int32_t status) { - switch(status) { - case TASK_STATUS__NORMAL: return "normal"; - case TASK_STATUS__SCAN_HISTORY: return "scan-history"; - case TASK_STATUS__HALT: return "halt"; - case TASK_STATUS__PAUSE: return "paused"; - case TASK_STATUS__CK: return "check-point"; - case TASK_STATUS__DROPPING: return "dropping"; - case TASK_STATUS__STOP: return "stop"; - case TASK_STATUS__UNINIT: return "uninitialized"; - default:return ""; - } -} - void streamTaskStatusInit(STaskStatusEntry* pEntry, const SStreamTask* pTask) { pEntry->id.streamId = pTask->id.streamId; pEntry->id.taskId = pTask->id.taskId; diff --git a/source/libs/stream/src/streamTaskSm.c b/source/libs/stream/src/streamTaskSm.c new file mode 100644 index 0000000000..1aa4dd8e13 --- /dev/null +++ b/source/libs/stream/src/streamTaskSm.c @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "streamInt.h" +#include "streamsm.h" +#include "tmisce.h" +#include "tstream.h" +#include "ttimer.h" +#include "wal.h" + +SStreamTaskState StreamTaskStatusList[9] = { + {.state = TASK_STATUS__READY, .name = "ready"}, + {.state = TASK_STATUS__DROPPING, .name = "dropped"}, + {.state = TASK_STATUS__UNINIT, .name = "uninit"}, + {.state = TASK_STATUS__STOP, .name = "stop"}, + {.state = TASK_STATUS__SCAN_HISTORY, .name = "scan-history"}, + {.state = TASK_STATUS__HALT, .name = "halt"}, + {.state = TASK_STATUS__PAUSE, .name = "paused"}, + {.state = TASK_STATUS__CK, .name = "checkpoint"}, + {.state = TASK_STATUS__STREAM_SCAN_HISTORY, .name = "stream-scan-history"}, +}; + +SStreamEventInfo StreamTaskEventList[12] = { + {.event = 0, .name = ""}, // dummy event, place holder + {.event = TASK_EVENT_INIT, .name = "initialize"}, + {.event = TASK_EVENT_INIT_SCANHIST, .name = "scan-history-init"}, + {.event = TASK_EVENT_INIT_STREAM_SCANHIST, .name = "stream-scan-history-init"}, + {.event = TASK_EVENT_SCANHIST_DONE, .name = "scan-history-completed"}, + {.event = TASK_EVENT_STOP, .name = "stopping"}, + {.event = TASK_EVENT_GEN_CHECKPOINT, .name = "checkpoint"}, + {.event = TASK_EVENT_CHECKPOINT_DONE, .name = "checkpoint-done"}, + {.event = TASK_EVENT_PAUSE, .name = "pausing"}, + {.event = TASK_EVENT_RESUME, .name = "resuming"}, + {.event = TASK_EVENT_HALT, .name = "halting"}, + {.event = TASK_EVENT_DROPPING, .name = "dropping"}, +}; + +static TdThreadOnce streamTaskStateMachineInit = PTHREAD_ONCE_INIT; +static SArray* streamTaskSMTrans = NULL; + +static int32_t streamTaskInitStatus(SStreamTask* pTask); +static int32_t streamTaskKeepCurrentVerInWal(SStreamTask* pTask); +static int32_t initStateTransferTable(); +static void doInitStateTransferTable(void); + +static STaskStateTrans createStateTransform(ETaskStatus current, ETaskStatus next, EStreamTaskEvent event, + __state_trans_fn fn, __state_trans_succ_fn succFn, + SAttachedEventInfo* pEventInfo, bool autoInvoke); + +static int32_t dummyFn(SStreamTask* UNUSED_PARAM(p)) { return TSDB_CODE_SUCCESS; } + +static int32_t attachEvent(SStreamTask* pTask, SAttachedEventInfo* pEvtInfo) { + char* p = NULL; + streamTaskGetStatus(pTask, &p); + + stDebug("s-task:%s status:%s attach event:%s required status:%s, since not allowed to handle it", pTask->id.idStr, p, + StreamTaskEventList[pEvtInfo->event].name, StreamTaskStatusList[pEvtInfo->status].name); + taosArrayPush(pTask->status.pSM->pWaitingEventList, pEvtInfo); + return 0; +} + +int32_t streamTaskInitStatus(SStreamTask* pTask) { + pTask->execInfo.init = taosGetTimestampMs(); + + stDebug("s-task:%s start init, and check downstream tasks, set the init ts:%" PRId64, pTask->id.idStr, + pTask->execInfo.init); + streamTaskCheckDownstream(pTask); + return 0; +} + +int32_t streamTaskSetReadyForWal(SStreamTask* pTask) { + if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) { + stDebug("s-task:%s ready for extract data from wal", pTask->id.idStr); + } + return TSDB_CODE_SUCCESS; +} + +static int32_t streamTaskDoCheckpoint(SStreamTask* pTask) { + stDebug("s-task:%s start to do checkpoint", pTask->id.idStr); + return 0; +} + +int32_t streamTaskKeepCurrentVerInWal(SStreamTask* pTask) { + ASSERT(HAS_RELATED_FILLHISTORY_TASK(pTask)); + + if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) { + pTask->hTaskInfo.haltVer = walReaderGetCurrentVer(pTask->exec.pWalReader); + if (pTask->hTaskInfo.haltVer == -1) { + pTask->hTaskInfo.haltVer = pTask->dataRange.range.maxVer + 1; + } + } + + return TSDB_CODE_SUCCESS; +} + +// todo optimize the perf of find the trans objs by using hash table +static STaskStateTrans* streamTaskFindTransform(ETaskStatus state, const EStreamTaskEvent event) { + int32_t numOfTrans = taosArrayGetSize(streamTaskSMTrans); + for (int32_t i = 0; i < numOfTrans; ++i) { + STaskStateTrans* pTrans = taosArrayGet(streamTaskSMTrans, i); + if (pTrans->state.state == state && pTrans->event == event) { + return pTrans; + } + } + + if (event == TASK_EVENT_CHECKPOINT_DONE && state == TASK_STATUS__STOP) { + + } else if (event == TASK_EVENT_GEN_CHECKPOINT && state == TASK_STATUS__UNINIT) { + // the task is set to uninit due to nodeEpset update, during processing checkpoint-trigger block. + } else { + ASSERT(0); + } + + return NULL; +} + +void streamTaskRestoreStatus(SStreamTask* pTask) { + SStreamTaskSM* pSM = pTask->status.pSM; + taosThreadMutexLock(&pTask->lock); + ASSERT(pSM->pActiveTrans == NULL); + + ASSERT(pSM->current.state == TASK_STATUS__PAUSE || pSM->current.state == TASK_STATUS__HALT); + + SStreamTaskState state = pSM->current; + pSM->current = pSM->prev.state; + + pSM->prev.state = state; + pSM->prev.evt = 0; + + pSM->startTs = taosGetTimestampMs(); + stDebug("s-task:%s restore status, %s -> %s", pTask->id.idStr, pSM->prev.state.name, pSM->current.name); + + taosThreadMutexUnlock(&pTask->lock); +} + +SStreamTaskSM* streamCreateStateMachine(SStreamTask* pTask) { + initStateTransferTable(); + const char* id = pTask->id.idStr; + + SStreamTaskSM* pSM = taosMemoryCalloc(1, sizeof(SStreamTaskSM)); + if (pSM == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + stError("s-task:%s failed to create task stateMachine, size:%d, code:%s", id, (int32_t)sizeof(SStreamTaskSM), + tstrerror(terrno)); + return NULL; + } + + pSM->pTask = pTask; + pSM->pWaitingEventList = taosArrayInit(4, sizeof(SAttachedEventInfo)); + if (pSM->pWaitingEventList == NULL) { + taosMemoryFree(pSM); + + terrno = TSDB_CODE_OUT_OF_MEMORY; + stError("s-task:%s failed to create task stateMachine, size:%d, code:%s", id, (int32_t)sizeof(SStreamTaskSM), + tstrerror(terrno)); + return NULL; + } + + // set the initial state for the state-machine of stream task + pSM->current = StreamTaskStatusList[TASK_STATUS__UNINIT]; + pSM->startTs = taosGetTimestampMs(); + return pSM; +} + +void* streamDestroyStateMachine(SStreamTaskSM* pSM) { + if (pSM == NULL) { + return NULL; + } + + taosArrayDestroy(pSM->pWaitingEventList); + taosMemoryFree(pSM); + return NULL; +} + +static int32_t doHandleEvent(SStreamTaskSM* pSM, EStreamTaskEvent event, STaskStateTrans* pTrans) { + SStreamTask* pTask = pSM->pTask; + const char* id = pTask->id.idStr; + + if (pTrans->attachEvent.event != 0) { + attachEvent(pTask, &pTrans->attachEvent); + taosThreadMutexUnlock(&pTask->lock); + + while (1) { + // wait for the task to be here + taosThreadMutexLock(&pTask->lock); + ETaskStatus s = streamTaskGetStatus(pTask, NULL); + taosThreadMutexUnlock(&pTask->lock); + + if ((s == pTrans->next.state) && (pSM->prev.evt == pTrans->event)) { + stDebug("s-task:%s attached event:%s handled", id, StreamTaskEventList[pTrans->event].name); + return TSDB_CODE_SUCCESS; + } else if (s != TASK_STATUS__DROPPING && s != TASK_STATUS__STOP) { // this event has been handled already + stDebug("s-task:%s not handle event:%s yet, wait for 100ms and recheck", id, StreamTaskEventList[event].name); + taosMsleep(100); + } else { + stDebug("s-task:%s is dropped or stopped already, not wait.", id); + return TSDB_CODE_INVALID_PARA; + } + } + + } else { // override current active trans + pSM->pActiveTrans = pTrans; + pSM->startTs = taosGetTimestampMs(); + taosThreadMutexUnlock(&pTask->lock); + + int32_t code = pTrans->pAction(pTask); + // todo handle error code; + + if (pTrans->autoInvokeEndFn) { + streamTaskOnHandleEventSuccess(pSM, event); + } + } + + return TSDB_CODE_SUCCESS; +} + +int32_t streamTaskHandleEvent(SStreamTaskSM* pSM, EStreamTaskEvent event) { + SStreamTask* pTask = pSM->pTask; + STaskStateTrans* pTrans = NULL; + + while (1) { + taosThreadMutexLock(&pTask->lock); + if (pSM->pActiveTrans != NULL && pSM->pActiveTrans->autoInvokeEndFn) { + taosThreadMutexUnlock(&pTask->lock); + taosMsleep(100); + stDebug("s-task:%s status:%s handling event:%s by some other thread, wait for 100ms and check if completed", + pTask->id.idStr, pSM->current.name, StreamTaskEventList[pSM->pActiveTrans->event].name); + } else { + pTrans = streamTaskFindTransform(pSM->current.state, event); + if (pTrans == NULL) { + stDebug("s-task:%s failed to handle event:%s", pTask->id.idStr, StreamTaskEventList[event].name); + taosThreadMutexUnlock(&pTask->lock); + return TSDB_CODE_INVALID_PARA; // todo: set new error code// failed to handle the event. + } + + if (pSM->pActiveTrans != NULL) { + // currently in some state transfer procedure, not auto invoke transfer, abort it + stDebug("s-task:%s event:%s handle procedure quit, status %s -> %s failed, handle event %s now", + pTask->id.idStr, StreamTaskEventList[pSM->pActiveTrans->event].name, pSM->current.name, + pSM->pActiveTrans->next.name, StreamTaskEventList[event].name); + } + + doHandleEvent(pSM, event, pTrans); + break; + } + } + + return TSDB_CODE_SUCCESS; +} + +static void keepPrevInfo(SStreamTaskSM* pSM) { + STaskStateTrans* pTrans = pSM->pActiveTrans; + + pSM->prev.state = pSM->current; + pSM->prev.evt = pTrans->event; +} + +int32_t streamTaskOnHandleEventSuccess(SStreamTaskSM* pSM, EStreamTaskEvent event) { + SStreamTask* pTask = pSM->pTask; + + // do update the task status + taosThreadMutexLock(&pTask->lock); + STaskStateTrans* pTrans = pSM->pActiveTrans; + + if (pTrans == NULL) { + ETaskStatus s = pSM->current.state; + ASSERT(s == TASK_STATUS__DROPPING || s == TASK_STATUS__PAUSE || s == TASK_STATUS__STOP); + // the pSM->prev.evt may be 0, so print string is not appropriate. + stDebug("s-task:%s event:%s handled failed, current status:%s, trigger event:%s", pTask->id.idStr, + StreamTaskEventList[event].name, pSM->current.name, StreamTaskEventList[pSM->prev.evt].name); + + taosThreadMutexUnlock(&pTask->lock); + return TSDB_CODE_INVALID_PARA; + } + + if (pTrans->event != event) { + stWarn("s-task:%s handle event:%s failed, current status:%s, active trans evt:%s", pTask->id.idStr, + StreamTaskEventList[event].name, pSM->current.name, StreamTaskEventList[pTrans->event].name); + taosThreadMutexUnlock(&pTask->lock); + return TSDB_CODE_INVALID_PARA; + } + + keepPrevInfo(pSM); + + pSM->current = pTrans->next; + pSM->pActiveTrans = NULL; + + // on success callback, add into lock if necessary, or maybe we should add an option for this? + pTrans->pSuccAction(pTask); + + if (taosArrayGetSize(pSM->pWaitingEventList) > 0) { + int64_t el = (taosGetTimestampMs() - pSM->startTs); + stDebug("s-task:%s handle event:%s completed, elapsed time:%" PRId64 "ms state:%s -> %s", pTask->id.idStr, + StreamTaskEventList[pTrans->event].name, el, pSM->prev.state.name, pSM->current.name); + + SAttachedEventInfo* pEvtInfo = taosArrayPop(pSM->pWaitingEventList); + + // OK, let's handle the attached event, since the task has reached the required status now + if (pSM->current.state == pEvtInfo->status) { + stDebug("s-task:%s handle the attached event:%s, state:%s", pTask->id.idStr, + StreamTaskEventList[pEvtInfo->event].name, pSM->current.name); + + STaskStateTrans* pNextTrans = streamTaskFindTransform(pSM->current.state, pEvtInfo->event); + ASSERT(pSM->pActiveTrans == NULL && pNextTrans != NULL); + + pSM->pActiveTrans = pNextTrans; + pSM->startTs = taosGetTimestampMs(); + taosThreadMutexUnlock(&pTask->lock); + + int32_t code = pNextTrans->pAction(pSM->pTask); + if (pNextTrans->autoInvokeEndFn) { + return streamTaskOnHandleEventSuccess(pSM, pNextTrans->event); + } else { + return code; + } + } + } else { + taosThreadMutexUnlock(&pTask->lock); + + int64_t el = (taosGetTimestampMs() - pSM->startTs); + stDebug("s-task:%s handle event:%s completed, elapsed time:%" PRId64 "ms state:%s -> %s", pTask->id.idStr, + StreamTaskEventList[pTrans->event].name, el, pSM->prev.state.name, pSM->current.name); + } + + return TSDB_CODE_SUCCESS; +} + +ETaskStatus streamTaskGetStatus(const SStreamTask* pTask, char** pStr) { + SStreamTaskState s = pTask->status.pSM->current; // copy one obj in case of multi-thread environment + if (pStr != NULL) { + *pStr = s.name; + } + return s.state; +} + +const char* streamTaskGetStatusStr(ETaskStatus status) { + return StreamTaskStatusList[status].name; +} + +void streamTaskResetStatus(SStreamTask* pTask) { + SStreamTaskSM* pSM = pTask->status.pSM; + + taosThreadMutexLock(&pTask->lock); + stDebug("s-task:%s level:%d fill-history:%d vgId:%d set uninit, prev status:%s", pTask->id.idStr, + pTask->info.taskLevel, pTask->info.fillHistory, pTask->pMeta->vgId, pSM->current.name); + + pSM->current = StreamTaskStatusList[TASK_STATUS__UNINIT]; + pSM->pActiveTrans = NULL; + taosArrayClear(pSM->pWaitingEventList); + taosThreadMutexUnlock(&pTask->lock); + + // clear the downstream ready status + pTask->status.downstreamReady = 0; +} + +void streamTaskSetStatusReady(SStreamTask* pTask) { + SStreamTaskSM* pSM = pTask->status.pSM; + if (pSM->current.state == TASK_STATUS__DROPPING) { + stError("s-task:%s task in dropping state, cannot be set ready", pTask->id.idStr); + return; + } + + taosThreadMutexLock(&pTask->lock); + + pSM->prev.state = pSM->current; + pSM->prev.evt = 0; + + pSM->current = StreamTaskStatusList[TASK_STATUS__READY]; + pSM->startTs = taosGetTimestampMs(); + pSM->pActiveTrans = NULL; + taosArrayClear(pSM->pWaitingEventList); + + taosThreadMutexUnlock(&pTask->lock); +} + +STaskStateTrans createStateTransform(ETaskStatus current, ETaskStatus next, EStreamTaskEvent event, __state_trans_fn fn, + __state_trans_succ_fn succFn, SAttachedEventInfo* pEventInfo, bool autoInvoke) { + STaskStateTrans trans = {0}; + trans.state = StreamTaskStatusList[current]; + trans.next = StreamTaskStatusList[next]; + trans.event = event; + + if (pEventInfo != NULL) { + trans.attachEvent = *pEventInfo; + } else { + trans.attachEvent.event = 0; + trans.attachEvent.status = 0; + } + + trans.pAction = (fn != NULL) ? fn : dummyFn; + trans.pSuccAction = (succFn != NULL) ? succFn : dummyFn; + trans.autoInvokeEndFn = autoInvoke; + return trans; +} + +int32_t initStateTransferTable() { + taosThreadOnce(&streamTaskStateMachineInit, doInitStateTransferTable); + return TSDB_CODE_SUCCESS; +} + +void doInitStateTransferTable(void) { + streamTaskSMTrans = taosArrayInit(8, sizeof(STaskStateTrans)); + + // initialization event handle + STaskStateTrans trans = createStateTransform(TASK_STATUS__UNINIT, TASK_STATUS__READY, TASK_EVENT_INIT, + streamTaskInitStatus, onNormalTaskReady, false, false); + taosArrayPush(streamTaskSMTrans, &trans); + + trans = createStateTransform(TASK_STATUS__UNINIT, TASK_STATUS__SCAN_HISTORY, TASK_EVENT_INIT_SCANHIST, + streamTaskInitStatus, onScanhistoryTaskReady, false, false); + taosArrayPush(streamTaskSMTrans, &trans); + + trans = createStateTransform(TASK_STATUS__UNINIT, TASK_STATUS__STREAM_SCAN_HISTORY, TASK_EVENT_INIT_STREAM_SCANHIST, + streamTaskInitStatus, onScanhistoryTaskReady, false, false); + taosArrayPush(streamTaskSMTrans, &trans); + + // scan-history related event + trans = createStateTransform(TASK_STATUS__SCAN_HISTORY, TASK_STATUS__READY, TASK_EVENT_SCANHIST_DONE, NULL, NULL, + NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + trans = createStateTransform(TASK_STATUS__STREAM_SCAN_HISTORY, TASK_STATUS__READY, TASK_EVENT_SCANHIST_DONE, NULL, + NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + // halt stream task, from other task status + trans = createStateTransform(TASK_STATUS__READY, TASK_STATUS__HALT, TASK_EVENT_HALT, NULL, + streamTaskKeepCurrentVerInWal, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + SAttachedEventInfo info = {.status = TASK_STATUS__READY, .event = TASK_EVENT_HALT}; + trans = createStateTransform(TASK_STATUS__STREAM_SCAN_HISTORY, TASK_STATUS__HALT, TASK_EVENT_HALT, NULL, + streamTaskKeepCurrentVerInWal, &info, true); + taosArrayPush(streamTaskSMTrans, &trans); + + trans = createStateTransform(TASK_STATUS__CK, TASK_STATUS__HALT, TASK_EVENT_HALT, NULL, streamTaskKeepCurrentVerInWal, + &info, true); + taosArrayPush(streamTaskSMTrans, &trans); + + trans = createStateTransform(TASK_STATUS__PAUSE, TASK_STATUS__HALT, TASK_EVENT_HALT, NULL, + streamTaskKeepCurrentVerInWal, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + // checkpoint related event + trans = createStateTransform(TASK_STATUS__READY, TASK_STATUS__CK, TASK_EVENT_GEN_CHECKPOINT, NULL, + streamTaskDoCheckpoint, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + trans = + createStateTransform(TASK_STATUS__CK, TASK_STATUS__READY, TASK_EVENT_CHECKPOINT_DONE, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + // pause & resume related event handle + trans = createStateTransform(TASK_STATUS__READY, TASK_STATUS__PAUSE, TASK_EVENT_PAUSE, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__SCAN_HISTORY, TASK_STATUS__PAUSE, TASK_EVENT_PAUSE, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + info = (SAttachedEventInfo){.status = TASK_STATUS__READY, .event = TASK_EVENT_PAUSE}; + trans = createStateTransform(TASK_STATUS__STREAM_SCAN_HISTORY, TASK_STATUS__PAUSE, TASK_EVENT_PAUSE, NULL, NULL, &info, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__CK, TASK_STATUS__PAUSE, TASK_EVENT_PAUSE, NULL, NULL, &info, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__HALT, TASK_STATUS__PAUSE, TASK_EVENT_PAUSE, NULL, NULL, &info, true); + taosArrayPush(streamTaskSMTrans, &trans); + + trans = createStateTransform(TASK_STATUS__UNINIT, TASK_STATUS__PAUSE, TASK_EVENT_PAUSE, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__PAUSE, TASK_STATUS__PAUSE, TASK_EVENT_PAUSE, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__STOP, TASK_STATUS__STOP, TASK_EVENT_PAUSE, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__DROPPING, TASK_STATUS__DROPPING, TASK_EVENT_PAUSE, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + // resume is completed by restore status of state-machine + + // stop related event + trans = createStateTransform(TASK_STATUS__READY, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__DROPPING, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__UNINIT, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__STOP, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__SCAN_HISTORY, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__HALT, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__PAUSE, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__CK, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__STREAM_SCAN_HISTORY, TASK_STATUS__STOP, TASK_EVENT_STOP, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + + // dropping related event + trans = createStateTransform(TASK_STATUS__READY, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__DROPPING, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__UNINIT, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__STOP, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__SCAN_HISTORY, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__HALT, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__PAUSE, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__CK, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); + trans = createStateTransform(TASK_STATUS__STREAM_SCAN_HISTORY, TASK_STATUS__DROPPING, TASK_EVENT_DROPPING, NULL, NULL, NULL, true); + taosArrayPush(streamTaskSMTrans, &trans); +} \ No newline at end of file diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index cec1a12024..637c18e97d 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -249,8 +249,8 @@ int32_t syncNodeOnRequestVote(SSyncNode* pNode, const SRpcMsg* pMsg); int32_t syncNodeOnRequestVoteReply(SSyncNode* pNode, const SRpcMsg* pMsg); int32_t syncNodeOnAppendEntries(SSyncNode* pNode, const SRpcMsg* pMsg); int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pMsg); -int32_t syncNodeOnSnapshot(SSyncNode* ths, const SRpcMsg* pMsg); -int32_t syncNodeOnSnapshotRsp(SSyncNode* ths, const SRpcMsg* pMsg); +int32_t syncNodeOnSnapshot(SSyncNode* ths, SRpcMsg* pMsg); +int32_t syncNodeOnSnapshotRsp(SSyncNode* ths, SRpcMsg* pMsg); int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pMsg); int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pMsg); int32_t syncNodeOnLocalCmd(SSyncNode* ths, const SRpcMsg* pMsg); diff --git a/source/libs/sync/inc/syncSnapshot.h b/source/libs/sync/inc/syncSnapshot.h index 95382132b5..f8ee99e8a0 100644 --- a/source/libs/sync/inc/syncSnapshot.h +++ b/source/libs/sync/inc/syncSnapshot.h @@ -22,21 +22,41 @@ extern "C" { #include "syncInt.h" -#define SYNC_SNAPSHOT_SEQ_INVALID -2 #define SYNC_SNAPSHOT_SEQ_FORCE_CLOSE -3 -#define SYNC_SNAPSHOT_SEQ_PREP_SNAPSHOT -1 +#define SYNC_SNAPSHOT_SEQ_INVALID -2 +#define SYNC_SNAPSHOT_SEQ_PREP -1 #define SYNC_SNAPSHOT_SEQ_BEGIN 0 #define SYNC_SNAPSHOT_SEQ_END 0x7FFFFFFF #define SYNC_SNAPSHOT_RETRY_MS 5000 +typedef struct SSyncSnapBuffer { + void *entries[TSDB_SYNC_SNAP_BUFFER_SIZE]; + int64_t start; + int64_t cursor; + int64_t end; + int64_t size; + TdThreadMutex mutex; + void (*entryDeleteCb)(void *ptr); +} SSyncSnapBuffer; + +typedef struct SyncSnapBlock { + int32_t seq; + int8_t acked; + int64_t sendTimeMs; + + int16_t blockType; + void *pBlock; + int32_t blockLen; +} SyncSnapBlock; + +void syncSnapBlockDestroy(void *ptr); + typedef struct SSyncSnapshotSender { int8_t start; int32_t seq; int32_t ack; void *pReader; - void *pCurrentBlock; - int32_t blockLen; SSnapshotParam snapshotParam; SSnapshot snapshot; SSyncCfg lastConfig; @@ -47,6 +67,9 @@ typedef struct SSyncSnapshotSender { int64_t lastSendTime; bool finish; + // ring buffer for ack + SSyncSnapBuffer *pSndBuf; + // init when create SSyncNode *pSyncNode; int32_t replicaIndex; @@ -72,6 +95,9 @@ typedef struct SSyncSnapshotReceiver { SSnapshotParam snapshotParam; SSnapshot snapshot; + // buffer + SSyncSnapBuffer *pRcvBuf; + // init when create SSyncNode *pSyncNode; } SSyncSnapshotReceiver; @@ -83,8 +109,8 @@ void snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver); bool snapshotReceiverIsStart(SSyncSnapshotReceiver *pReceiver); // on message -int32_t syncNodeOnSnapshot(SSyncNode *ths, const SRpcMsg *pMsg); -int32_t syncNodeOnSnapshotRsp(SSyncNode *ths, const SRpcMsg *pMsg); +// int32_t syncNodeOnSnapshot(SSyncNode *ths, const SRpcMsg *pMsg); +// int32_t syncNodeOnSnapshotRsp(SSyncNode *ths, const SRpcMsg *pMsg); SyncIndex syncNodeGetSnapshotConfigIndex(SSyncNode *pSyncNode, SyncIndex snapshotLastApplyIndex); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index f9dc10da02..199c7a1445 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -818,7 +818,8 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion) { if (!taosCheckExistFile(pSyncNode->configPath)) { // create a new raft config file - sInfo("vgId:%d, create a new raft config file", pSyncNode->vgId); + sInfo("vgId:%d, create a new raft config file", pSyncInfo->vgId); + pSyncNode->vgId = pSyncInfo->vgId; pSyncNode->raftCfg.isStandBy = pSyncInfo->isStandBy; pSyncNode->raftCfg.snapshotStrategy = pSyncInfo->snapshotStrategy; pSyncNode->raftCfg.lastConfigIndex = pSyncInfo->syncCfg.lastIndex; diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index a7ee37cc3b..f2386797c1 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -797,7 +797,7 @@ _out: pMgr->retryBackoff = syncLogReplGetNextRetryBackoff(pMgr); SSyncLogBuffer* pBuf = pNode->pLogBuf; sInfo("vgId:%d, resend %d sync log entries. dest:%" PRIx64 ", indexes:%" PRId64 " ..., terms: ... %" PRId64 - ", retryWaitMs:%" PRId64 ", mgr: [%" PRId64 " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 + ", retryWaitMs:%" PRId64 ", repl-mgr:[%" PRId64 " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, count, pDestId->addr, firstIndex, term, retryWaitMs, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -815,9 +815,9 @@ int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEn ASSERT(pMgr->matchIndex == 0); if (pMsg->matchIndex < 0) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl restored. peer: dnode:%d (%" PRIx64 "), mgr: rs(%d) [%" PRId64 " %" PRId64 - ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, DID(&destId), destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + sInfo("vgId:%d, sync log repl restored. peer: dnode:%d (%" PRIx64 "), repl-mgr:[%" PRId64 " %" PRId64 ", %" PRId64 + "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, DID(&destId), destId.addr, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -832,9 +832,9 @@ int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEn if (pMsg->success && pMsg->matchIndex == pMsg->lastSendIndex) { pMgr->matchIndex = pMsg->matchIndex; pMgr->restored = true; - sInfo("vgId:%d, sync log repl restored. peer: dnode:%d (%" PRIx64 "), mgr: rs(%d) [%" PRId64 " %" PRId64 - ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, DID(&destId), destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + sInfo("vgId:%d, sync log repl restored. peer: dnode:%d (%" PRIx64 "), repl-mgr:[%" PRId64 " %" PRId64 ", %" PRId64 + "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, DID(&destId), destId.addr, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -958,10 +958,10 @@ int32_t syncLogReplProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex inde pMgr->endIndex = index + 1; SSyncLogBuffer* pBuf = pNode->pLogBuf; - sTrace("vgId:%d, probe peer:%" PRIx64 " with msg of index:%" PRId64 " term:%" PRId64 ". mgr (rs:%d): [%" PRId64 - " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pDestId->addr, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + sTrace("vgId:%d, probe peer:%" PRIx64 " with msg of index:%" PRId64 " term:%" PRId64 ". repl-mgr:[%" PRId64 + " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pDestId->addr, index, term, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, + pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -1002,9 +1002,9 @@ int32_t syncLogReplAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { pMgr->endIndex = index + 1; if (barrier) { - sInfo("vgId:%d, replicated sync barrier to dnode:%d. index:%" PRId64 ", term:%" PRId64 - ", repl mgr: rs(%d) [%" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, DID(pDestId), index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex); + sInfo("vgId:%d, replicated sync barrier to dnode:%d. index:%" PRId64 ", term:%" PRId64 ", repl-mgr:[%" PRId64 + " %" PRId64 ", %" PRId64 ")", + pNode->vgId, DID(pDestId), index, term, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex); break; } } @@ -1013,10 +1013,10 @@ int32_t syncLogReplAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { SSyncLogBuffer* pBuf = pNode->pLogBuf; sTrace("vgId:%d, replicated %d msgs to peer:%" PRIx64 ". indexes:%" PRId64 "..., terms: ...%" PRId64 - ", mgr: (rs:%d) [%" PRId64 " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 + ", repl-mgr:[%" PRId64 " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, count, pDestId->addr, firstIndex, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, - pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + pNode->vgId, count, pDestId->addr, firstIndex, term, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index 924813eb98..0b94d377f1 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -23,6 +23,44 @@ #include "syncReplication.h" #include "syncUtil.h" +static void syncSnapBufferReset(SSyncSnapBuffer *pBuf) { + taosThreadMutexLock(&pBuf->mutex); + for (int64_t i = pBuf->start; i < pBuf->end; ++i) { + if (pBuf->entryDeleteCb) { + pBuf->entryDeleteCb(pBuf->entries[i % pBuf->size]); + } + pBuf->entries[i % pBuf->size] = NULL; + } + pBuf->start = SYNC_SNAPSHOT_SEQ_BEGIN + 1; + pBuf->end = pBuf->start; + pBuf->cursor = pBuf->start - 1; + taosThreadMutexUnlock(&pBuf->mutex); +} + +static void syncSnapBufferDestroy(SSyncSnapBuffer **ppBuf) { + if (ppBuf == NULL || ppBuf[0] == NULL) return; + SSyncSnapBuffer *pBuf = ppBuf[0]; + + syncSnapBufferReset(pBuf); + + taosThreadMutexDestroy(&pBuf->mutex); + taosMemoryFree(ppBuf[0]); + ppBuf[0] = NULL; + return; +} + +static SSyncSnapBuffer *syncSnapBufferCreate() { + SSyncSnapBuffer *pBuf = taosMemoryCalloc(1, sizeof(SSyncSnapBuffer)); + if (pBuf == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + pBuf->size = sizeof(pBuf->entries) / sizeof(void *); + ASSERT(pBuf->size == TSDB_SYNC_SNAP_BUFFER_SIZE); + taosThreadMutexInit(&pBuf->mutex, NULL); + return pBuf; +} + SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaIndex) { bool condition = (pSyncNode->pFsm->FpSnapshotStartRead != NULL) && (pSyncNode->pFsm->FpSnapshotStopRead != NULL) && (pSyncNode->pFsm->FpSnapshotDoRead != NULL); @@ -38,8 +76,6 @@ SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaI pSender->seq = SYNC_SNAPSHOT_SEQ_INVALID; pSender->ack = SYNC_SNAPSHOT_SEQ_INVALID; pSender->pReader = NULL; - pSender->pCurrentBlock = NULL; - pSender->blockLen = 0; pSender->sendingMS = SYNC_SNAPSHOT_RETRY_MS; pSender->pSyncNode = pSyncNode; pSender->replicaIndex = replicaIndex; @@ -49,24 +85,42 @@ SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaI pSender->pSyncNode->pFsm->FpGetSnapshotInfo(pSender->pSyncNode->pFsm, &pSender->snapshot); pSender->finish = false; + SSyncSnapBuffer *pSndBuf = syncSnapBufferCreate(); + if (pSndBuf == NULL) { + taosMemoryFree(pSender); + pSender = NULL; + return NULL; + } + pSndBuf->entryDeleteCb = syncSnapBlockDestroy; + pSender->pSndBuf = pSndBuf; + + syncSnapBufferReset(pSender->pSndBuf); return pSender; } +void syncSnapBlockDestroy(void *ptr) { + SyncSnapBlock *pBlk = ptr; + if (pBlk->pBlock != NULL) { + taosMemoryFree(pBlk->pBlock); + pBlk->pBlock = NULL; + pBlk->blockLen = 0; + } + taosMemoryFree(pBlk); +} + void snapshotSenderDestroy(SSyncSnapshotSender *pSender) { if (pSender == NULL) return; - // free current block - if (pSender->pCurrentBlock != NULL) { - taosMemoryFree(pSender->pCurrentBlock); - pSender->pCurrentBlock = NULL; - } - // close reader if (pSender->pReader != NULL) { pSender->pSyncNode->pFsm->FpSnapshotStopRead(pSender->pSyncNode->pFsm, pSender->pReader); pSender->pReader = NULL; } + // free snap buffer + if (pSender->pSndBuf) { + syncSnapBufferDestroy(&pSender->pSndBuf); + } // free sender taosMemoryFree(pSender); } @@ -79,11 +133,9 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) { int8_t started = atomic_val_compare_exchange_8(&pSender->start, false, true); if (started) return 0; - pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN; + pSender->seq = SYNC_SNAPSHOT_SEQ_PREP; pSender->ack = SYNC_SNAPSHOT_SEQ_INVALID; pSender->pReader = NULL; - pSender->pCurrentBlock = NULL; - pSender->blockLen = 0; pSender->snapshotParam.start = SYNC_INDEX_INVALID; pSender->snapshotParam.end = SYNC_INDEX_INVALID; pSender->snapshot.data = NULL; @@ -127,29 +179,28 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) { SyncSnapshotSend *pMsg = rpcMsg.pCont; pMsg->srcId = pSender->pSyncNode->myRaftId; pMsg->destId = pSender->pSyncNode->replicasId[pSender->replicaIndex]; - pMsg->term = raftStoreGetTerm(pSender->pSyncNode); + pMsg->term = pSender->term; pMsg->beginIndex = pSender->snapshotParam.start; pMsg->lastIndex = pSender->snapshot.lastApplyIndex; pMsg->lastTerm = pSender->snapshot.lastApplyTerm; pMsg->lastConfigIndex = pSender->snapshot.lastConfigIndex; pMsg->lastConfig = pSender->lastConfig; pMsg->startTime = pSender->startTime; - pMsg->seq = SYNC_SNAPSHOT_SEQ_PREP_SNAPSHOT; + pMsg->seq = pSender->seq; if (dataLen > 0) { pMsg->payloadType = snapInfo.type; memcpy(pMsg->data, snapInfo.data, dataLen); } - // event log - syncLogSendSyncSnapshotSend(pSender->pSyncNode, pMsg, "snapshot sender start"); - // send msg if (syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg) != 0) { sSError(pSender, "snapshot sender send msg failed since %s", terrstr()); goto _out; } + sSInfo(pSender, "snapshot sender start, to dnode:%d.", DID(&pMsg->destId)); + code = 0; _out: if (snapInfo.data) { @@ -175,48 +226,59 @@ void snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish) { pSender->pReader = NULL; } - // free current block - if (pSender->pCurrentBlock != NULL) { - taosMemoryFree(pSender->pCurrentBlock); - pSender->pCurrentBlock = NULL; - pSender->blockLen = 0; - } + syncSnapBufferReset(pSender->pSndBuf); + + SRaftId destId = pSender->pSyncNode->replicasId[pSender->replicaIndex]; + sSInfo(pSender, "snapshot sender stop, to dnode:%d, finish:%d", DID(&destId), finish); } // when sender receive ack, call this function to send msg from seq // seq = ack + 1, already updated static int32_t snapshotSend(SSyncSnapshotSender *pSender) { - // free memory last time (current seq - 1) - if (pSender->pCurrentBlock != NULL) { - taosMemoryFree(pSender->pCurrentBlock); - pSender->pCurrentBlock = NULL; - pSender->blockLen = 0; + int32_t code = -1; + SyncSnapBlock *pBlk = NULL; + + if (pSender->seq < SYNC_SNAPSHOT_SEQ_END) { + pSender->seq++; + + if (pSender->seq > SYNC_SNAPSHOT_SEQ_BEGIN) { + pBlk = taosMemoryCalloc(1, sizeof(SyncSnapBlock)); + if (pBlk == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _OUT; + } + + pBlk->seq = pSender->seq; + + // read data + int32_t ret = pSender->pSyncNode->pFsm->FpSnapshotDoRead(pSender->pSyncNode->pFsm, pSender->pReader, + &pBlk->pBlock, &pBlk->blockLen); + if (ret != 0) { + sSError(pSender, "snapshot sender read failed since %s", terrstr()); + goto _OUT; + } + + if (pBlk->blockLen > 0) { + // has read data + sSDebug(pSender, "snapshot sender continue to read, blockLen:%d seq:%d", pBlk->blockLen, pBlk->seq); + } else { + // read finish, update seq to end + pSender->seq = SYNC_SNAPSHOT_SEQ_END; + sSInfo(pSender, "snapshot sender read to the end"); + code = 0; + goto _OUT; + } + } } - // read data - int32_t ret = pSender->pSyncNode->pFsm->FpSnapshotDoRead(pSender->pSyncNode->pFsm, pSender->pReader, - &pSender->pCurrentBlock, &pSender->blockLen); - if (ret != 0) { - sSError(pSender, "snapshot sender read failed since %s", terrstr()); - return -1; - } - - if (pSender->blockLen > 0) { - // has read data - sSDebug(pSender, "vgId:%d, snapshot sender continue to read, blockLen:%d seq:%d", pSender->pSyncNode->vgId, - pSender->blockLen, pSender->seq); - } else { - // read finish, update seq to end - pSender->seq = SYNC_SNAPSHOT_SEQ_END; - sSInfo(pSender, "vgId:%d, snapshot sender read to the end, blockLen:%d seq:%d", pSender->pSyncNode->vgId, - pSender->blockLen, pSender->seq); - } + ASSERT(pSender->seq >= SYNC_SNAPSHOT_SEQ_BEGIN && pSender->seq <= SYNC_SNAPSHOT_SEQ_END); + int32_t blockLen = (pBlk != NULL) ? pBlk->blockLen : 0; // build msg SRpcMsg rpcMsg = {0}; - if (syncBuildSnapshotSend(&rpcMsg, pSender->blockLen, pSender->pSyncNode->vgId) != 0) { + if (syncBuildSnapshotSend(&rpcMsg, blockLen, pSender->pSyncNode->vgId) != 0) { sSError(pSender, "vgId:%d, snapshot sender build msg failed since %s", pSender->pSyncNode->vgId, terrstr()); - return -1; + goto _OUT; } SyncSnapshotSend *pMsg = rpcMsg.pCont; @@ -231,77 +293,83 @@ static int32_t snapshotSend(SSyncSnapshotSender *pSender) { pMsg->startTime = pSender->startTime; pMsg->seq = pSender->seq; - if (pSender->pCurrentBlock != NULL) { - memcpy(pMsg->data, pSender->pCurrentBlock, pSender->blockLen); - } - - // event log - if (pSender->seq == SYNC_SNAPSHOT_SEQ_END) { - syncLogSendSyncSnapshotSend(pSender->pSyncNode, pMsg, "snapshot sender finish"); - } else { - syncLogSendSyncSnapshotSend(pSender->pSyncNode, pMsg, "snapshot sender sending"); + if (pBlk != NULL && pBlk->pBlock != NULL && pBlk->blockLen > 0) { + memcpy(pMsg->data, pBlk->pBlock, pBlk->blockLen); } // send msg if (syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg) != 0) { sSError(pSender, "snapshot sender send msg failed since %s", terrstr()); - return -1; + goto _OUT; } - pSender->lastSendTime = taosGetTimestampMs(); - return 0; + // put in buffer + int64_t nowMs = taosGetTimestampMs(); + if (pBlk) { + ASSERT(pBlk->seq > SYNC_SNAPSHOT_SEQ_BEGIN && pBlk->seq < SYNC_SNAPSHOT_SEQ_END); + pBlk->sendTimeMs = nowMs; + pSender->pSndBuf->entries[pSender->seq % pSender->pSndBuf->size] = pBlk; + pBlk = NULL; + pSender->pSndBuf->end = TMAX(pSender->seq + 1, pSender->pSndBuf->end); + } + pSender->lastSendTime = nowMs; + code = 0; + +_OUT:; + if (pBlk != NULL) { + syncSnapBlockDestroy(pBlk); + pBlk = NULL; + } + return code; } // send snapshot data from cache int32_t snapshotReSend(SSyncSnapshotSender *pSender) { - // build msg - SRpcMsg rpcMsg = {0}; - if (syncBuildSnapshotSend(&rpcMsg, pSender->blockLen, pSender->pSyncNode->vgId) != 0) { - sSError(pSender, "snapshot sender build msg failed since %s", terrstr()); - return -1; + SSyncSnapBuffer *pSndBuf = pSender->pSndBuf; + int32_t code = -1; + taosThreadMutexLock(&pSndBuf->mutex); + + for (int32_t seq = pSndBuf->cursor + 1; seq < pSndBuf->end; ++seq) { + SyncSnapBlock *pBlk = pSndBuf->entries[seq % pSndBuf->size]; + ASSERT(pBlk && !pBlk->acked); + int64_t nowMs = taosGetTimestampMs(); + if (nowMs < pBlk->sendTimeMs + SYNC_SNAP_RESEND_MS) { + continue; + } + // build msg + SRpcMsg rpcMsg = {0}; + if (syncBuildSnapshotSend(&rpcMsg, pBlk->blockLen, pSender->pSyncNode->vgId) != 0) { + sSError(pSender, "snapshot sender build msg failed since %s", terrstr()); + goto _out; + } + + SyncSnapshotSend *pMsg = rpcMsg.pCont; + pMsg->srcId = pSender->pSyncNode->myRaftId; + pMsg->destId = pSender->pSyncNode->replicasId[pSender->replicaIndex]; + pMsg->term = pSender->term; + pMsg->beginIndex = pSender->snapshotParam.start; + pMsg->lastIndex = pSender->snapshot.lastApplyIndex; + pMsg->lastTerm = pSender->snapshot.lastApplyTerm; + pMsg->lastConfigIndex = pSender->snapshot.lastConfigIndex; + pMsg->lastConfig = pSender->lastConfig; + pMsg->startTime = pSender->startTime; + pMsg->seq = pBlk->seq; + + if (pBlk->pBlock != NULL && pBlk->blockLen > 0) { + memcpy(pMsg->data, pBlk->pBlock, pBlk->blockLen); + } + + // send msg + if (syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg) != 0) { + sSError(pSender, "snapshot sender resend msg failed since %s", terrstr()); + goto _out; + } + pBlk->sendTimeMs = nowMs; } - - SyncSnapshotSend *pMsg = rpcMsg.pCont; - pMsg->srcId = pSender->pSyncNode->myRaftId; - pMsg->destId = pSender->pSyncNode->replicasId[pSender->replicaIndex]; - pMsg->term = raftStoreGetTerm(pSender->pSyncNode); - pMsg->beginIndex = pSender->snapshotParam.start; - pMsg->lastIndex = pSender->snapshot.lastApplyIndex; - pMsg->lastTerm = pSender->snapshot.lastApplyTerm; - pMsg->lastConfigIndex = pSender->snapshot.lastConfigIndex; - pMsg->lastConfig = pSender->lastConfig; - pMsg->startTime = pSender->startTime; - pMsg->seq = pSender->seq; - - if (pSender->pCurrentBlock != NULL && pSender->blockLen > 0) { - memcpy(pMsg->data, pSender->pCurrentBlock, pSender->blockLen); - } - - // event log - syncLogSendSyncSnapshotSend(pSender->pSyncNode, pMsg, "snapshot sender resend"); - - // send msg - if (syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg) != 0) { - sSError(pSender, "snapshot sender resend msg failed since %s", terrstr()); - return -1; - } - - pSender->lastSendTime = taosGetTimestampMs(); - return 0; -} - -static int32_t snapshotSenderUpdateProgress(SSyncSnapshotSender *pSender, SyncSnapshotRsp *pMsg) { - if (pMsg->ack != pSender->seq) { - sSError(pSender, "snapshot sender update seq failed, ack:%d seq:%d", pMsg->ack, pSender->seq); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - return -1; - } - - pSender->ack = pMsg->ack; - pSender->seq++; - - sSDebug(pSender, "snapshot sender update seq:%d", pSender->seq); - return 0; + code = 0; +_out:; + taosThreadMutexUnlock(&pSndBuf->mutex); + return code; } // return 0, start ok @@ -328,8 +396,6 @@ int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId) { return 0; } - sSInfo(pSender, "snapshot sender start"); - int32_t code = snapshotSenderStart(pSender); if (code != 0) { sSError(pSender, "snapshot sender start error since %s", terrstr()); @@ -362,6 +428,16 @@ SSyncSnapshotReceiver *snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId from pReceiver->snapshot.lastApplyTerm = 0; pReceiver->snapshot.lastConfigIndex = SYNC_INDEX_INVALID; + SSyncSnapBuffer *pRcvBuf = syncSnapBufferCreate(); + if (pRcvBuf == NULL) { + taosMemoryFree(pReceiver); + pReceiver = NULL; + return NULL; + } + pRcvBuf->entryDeleteCb = rpcFreeCont; + pReceiver->pRcvBuf = pRcvBuf; + + syncSnapBufferReset(pReceiver->pRcvBuf); return pReceiver; } @@ -389,6 +465,11 @@ void snapshotReceiverDestroy(SSyncSnapshotReceiver *pReceiver) { pReceiver->snapshot.data = NULL; } + // free snap buf + if (pReceiver->pRcvBuf) { + syncSnapBufferDestroy(&pReceiver->pRcvBuf); + } + // free receiver taosMemoryFree(pReceiver); } @@ -444,20 +525,19 @@ void snapshotReceiverStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *p int8_t started = atomic_val_compare_exchange_8(&pReceiver->start, false, true); if (started) return; - pReceiver->ack = SYNC_SNAPSHOT_SEQ_PREP_SNAPSHOT; + pReceiver->ack = SYNC_SNAPSHOT_SEQ_PREP; pReceiver->term = pPreMsg->term; pReceiver->fromId = pPreMsg->srcId; pReceiver->startTime = pPreMsg->startTime; ASSERT(pReceiver->startTime); - // event log - sRInfo(pReceiver, "snapshot receiver is start"); + sRInfo(pReceiver, "snapshot receiver start, from dnode:%d.", DID(&pReceiver->fromId)); } // just set start = false // FpSnapshotStopWrite should not be called void snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver) { - sRInfo(pReceiver, "snapshot receiver stop, not apply, writer:%p", pReceiver->pWriter); + sRDebug(pReceiver, "snapshot receiver stop, not apply, writer:%p", pReceiver->pWriter); int8_t stopped = !atomic_val_compare_exchange_8(&pReceiver->start, true, false); if (stopped) return; @@ -472,6 +552,8 @@ void snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver) { } else { sRInfo(pReceiver, "snapshot receiver stop, writer is null"); } + + syncSnapBufferReset(pReceiver->pRcvBuf); } // when recv last snapshot block, apply data into snapshot @@ -479,7 +561,7 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap int32_t code = 0; if (pReceiver->pWriter != NULL) { // write data - sRInfo(pReceiver, "snapshot receiver write finish, blockLen:%d seq:%d", pMsg->dataLen, pMsg->seq); + sRInfo(pReceiver, "snapshot receiver write about to finish, blockLen:%d seq:%d", pMsg->dataLen, pMsg->seq); if (pMsg->dataLen > 0) { code = pReceiver->pSyncNode->pFsm->FpSnapshotDoWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, pMsg->data, pMsg->dataLen); @@ -489,15 +571,6 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap } } - // reset wal - sRInfo(pReceiver, "snapshot receiver log restore"); - code = - pReceiver->pSyncNode->pLogStore->syncLogRestoreFromSnapshot(pReceiver->pSyncNode->pLogStore, pMsg->lastIndex); - if (code != 0) { - sRError(pReceiver, "failed to snapshot receiver log restore since %s", terrstr()); - return -1; - } - // update commit index if (pReceiver->snapshot.lastApplyIndex > pReceiver->pSyncNode->commitIndex) { pReceiver->pSyncNode->commitIndex = pReceiver->snapshot.lastApplyIndex; @@ -509,7 +582,6 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap } // stop writer, apply data - sRInfo(pReceiver, "snapshot receiver apply write"); code = pReceiver->pSyncNode->pFsm->FpSnapshotStopWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, true, &pReceiver->snapshot); if (code != 0) { @@ -517,21 +589,29 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap return -1; } pReceiver->pWriter = NULL; + sRInfo(pReceiver, "snapshot receiver write stopped"); // update progress pReceiver->ack = SYNC_SNAPSHOT_SEQ_END; + // get fsmState SSnapshot snapshot = {0}; pReceiver->pSyncNode->pFsm->FpGetSnapshotInfo(pReceiver->pSyncNode->pFsm, &snapshot); pReceiver->pSyncNode->fsmState = snapshot.state; + // reset wal + code = + pReceiver->pSyncNode->pLogStore->syncLogRestoreFromSnapshot(pReceiver->pSyncNode->pLogStore, pMsg->lastIndex); + if (code != 0) { + sRError(pReceiver, "failed to snapshot receiver log restore since %s", terrstr()); + return -1; + } + sRInfo(pReceiver, "wal log restored from snapshot"); } else { sRError(pReceiver, "snapshot receiver finish error since writer is null"); return -1; } - // event log - sRInfo(pReceiver, "snapshot receiver got last data and apply snapshot finished"); return 0; } @@ -599,22 +679,22 @@ static int32_t syncNodeOnSnapshotPrep(SSyncNode *pSyncNode, SyncSnapshotSend *pM int32_t order = 0; if ((order = snapshotReceiverSignatureCmp(pReceiver, pMsg)) < 0) { sRInfo(pReceiver, - "received a new snapshot preparation. restart receiver" - "receiver signature: (%" PRId64 ", %" PRId64 "), msg signature:(%" PRId64 ", %" PRId64 ")", - pReceiver->term, pReceiver->startTime, pMsg->term, pMsg->startTime); + "received a new snapshot preparation. restart receiver." + " msg signature:(%" PRId64 ", %" PRId64 ")", + pMsg->term, pMsg->startTime); goto _START_RECEIVER; } else if (order == 0) { sRInfo(pReceiver, - "received a duplicate snapshot preparation. send reply" - "receiver signature: (%" PRId64 ", %" PRId64 "), msg signature:(%" PRId64 ", %" PRId64 ")", - pReceiver->term, pReceiver->startTime, pMsg->term, pMsg->startTime); + "received a duplicate snapshot preparation. send reply." + " msg signature:(%" PRId64 ", %" PRId64 ")", + pMsg->term, pMsg->startTime); goto _SEND_REPLY; } else { // ignore sRError(pReceiver, - "received a stale snapshot preparation. ignore" - "receiver signature: (%" PRId64 ", %" PRId64 "), msg signature:(%" PRId64 ", %" PRId64 ")", - pReceiver->term, pReceiver->startTime, pMsg->term, pMsg->startTime); + "received a stale snapshot preparation. ignore." + " msg signature:(%" PRId64 ", %" PRId64 ")", + pMsg->term, pMsg->startTime); terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; code = terrno; goto _SEND_REPLY; @@ -765,29 +845,8 @@ _SEND_REPLY: return code; } -static int32_t syncNodeOnSnapshotReceive(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) { - // condition 4 - // transfering - SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver; - int64_t timeNow = taosGetTimestampMs(); - int32_t code = 0; - - if (snapshotReceiverSignatureCmp(pReceiver, pMsg) != 0) { - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - sRError(pReceiver, "failed to receive snapshot data since %s.", terrstr()); - code = terrno; - goto _SEND_REPLY; - } - - if (snapshotReceiverGotData(pReceiver, pMsg) != 0) { - code = terrno; - if (code >= SYNC_SNAPSHOT_SEQ_INVALID) { - code = TSDB_CODE_SYN_INTERNAL_ERROR; - } - } - -_SEND_REPLY:; - +static int32_t syncSnapSendRsp(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg, int32_t code) { + SSyncNode *pSyncNode = pReceiver->pSyncNode; // build msg SRpcMsg rpcMsg = {0}; if (syncBuildSnapshotSendRsp(&rpcMsg, 0, pSyncNode->vgId)) { @@ -811,10 +870,79 @@ _SEND_REPLY:; sRError(pReceiver, "failed to send snapshot receiver resp since %s", terrstr()); return -1; } + return 0; +} +static int32_t syncSnapBufferRecv(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend **ppMsg) { + int32_t code = 0; + SSyncSnapBuffer *pRcvBuf = pReceiver->pRcvBuf; + SyncSnapshotSend *pMsg = ppMsg[0]; + terrno = TSDB_CODE_SUCCESS; + + taosThreadMutexLock(&pRcvBuf->mutex); + + if (pMsg->seq - pRcvBuf->start >= pRcvBuf->size) { + terrno = TSDB_CODE_SYN_BUFFER_FULL; + code = terrno; + goto _out; + } + + ASSERT(pRcvBuf->start <= pRcvBuf->cursor + 1 && pRcvBuf->cursor < pRcvBuf->end); + + if (pMsg->seq > pRcvBuf->cursor) { + pRcvBuf->entries[pMsg->seq % pRcvBuf->size] = pMsg; + ppMsg[0] = NULL; + pRcvBuf->end = TMAX(pMsg->seq + 1, pRcvBuf->end); + } else { + syncSnapSendRsp(pReceiver, pMsg, code); + goto _out; + } + + for (int64_t seq = pRcvBuf->cursor + 1; seq < pRcvBuf->end; ++seq) { + if (pRcvBuf->entries[seq]) { + pRcvBuf->cursor = seq; + } else { + break; + } + } + + for (int64_t seq = pRcvBuf->start; seq <= pRcvBuf->cursor; ++seq) { + if (snapshotReceiverGotData(pReceiver, pRcvBuf->entries[seq % pRcvBuf->size]) != 0) { + code = terrno; + if (code >= SYNC_SNAPSHOT_SEQ_INVALID) { + code = TSDB_CODE_SYN_INTERNAL_ERROR; + } + } + pRcvBuf->start = seq + 1; + syncSnapSendRsp(pReceiver, pRcvBuf->entries[seq % pRcvBuf->size], code); + pRcvBuf->entryDeleteCb(pRcvBuf->entries[seq % pRcvBuf->size]); + pRcvBuf->entries[seq % pRcvBuf->size] = NULL; + if (code) goto _out; + } + +_out: + taosThreadMutexUnlock(&pRcvBuf->mutex); return code; } +static int32_t syncNodeOnSnapshotReceive(SSyncNode *pSyncNode, SyncSnapshotSend **ppMsg) { + // condition 4 + // transfering + SyncSnapshotSend *pMsg = ppMsg[0]; + ASSERT(pMsg); + SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver; + int64_t timeNow = taosGetTimestampMs(); + int32_t code = 0; + + if (snapshotReceiverSignatureCmp(pReceiver, pMsg) != 0) { + terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + sRError(pReceiver, "failed to receive snapshot data since %s.", terrstr()); + return syncSnapSendRsp(pReceiver, pMsg, terrno); + } + + return syncSnapBufferRecv(pReceiver, ppMsg); +} + static int32_t syncNodeOnSnapshotEnd(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) { // condition 2 // end, finish FSM @@ -867,7 +995,7 @@ _SEND_REPLY:; // receiver on message // -// condition 1, recv SYNC_SNAPSHOT_SEQ_PREP_SNAPSHOT +// condition 1, recv SYNC_SNAPSHOT_SEQ_PREP // if receiver already start // if sender.start-time > receiver.start-time, restart receiver(reply snapshot start) // if sender.start-time = receiver.start-time, maybe duplicate msg @@ -885,9 +1013,11 @@ _SEND_REPLY:; // // condition 5, got data, update ack // -int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { - SyncSnapshotSend *pMsg = pRpcMsg->pCont; +int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { + SyncSnapshotSend **ppMsg = (SyncSnapshotSend **)&pRpcMsg->pCont; + SyncSnapshotSend *pMsg = ppMsg[0]; SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver; + int32_t code = 0; // if already drop replica, do not process if (!syncNodeInRaftGroup(pSyncNode, &pMsg->srcId)) { @@ -911,49 +1041,56 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { syncNodeUpdateTermWithoutStepDown(pSyncNode, pMsg->term); } - // state, term, seq/ack - int32_t code = 0; - if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER || pSyncNode->state == TAOS_SYNC_STATE_LEARNER) { - if (pMsg->term == raftStoreGetTerm(pSyncNode)) { - if (pMsg->seq == SYNC_SNAPSHOT_SEQ_PREP_SNAPSHOT) { - sInfo("vgId:%d, receive pre-snapshot msg of snapshot replication. signature:(%" PRId64 ", %" PRId64 ")", - pSyncNode->vgId, pMsg->term, pMsg->startTime); - code = syncNodeOnSnapshotPrep(pSyncNode, pMsg); - } else if (pMsg->seq == SYNC_SNAPSHOT_SEQ_BEGIN) { - sInfo("vgId:%d, receive begin msg of snapshot replication. signature:(%" PRId64 ", %" PRId64 ")", - pSyncNode->vgId, pMsg->term, pMsg->startTime); - code = syncNodeOnSnapshotBegin(pSyncNode, pMsg); - } else if (pMsg->seq == SYNC_SNAPSHOT_SEQ_END) { - sInfo("vgId:%d, receive end msg of snapshot replication. signature: (%" PRId64 ", %" PRId64 ")", - pSyncNode->vgId, pMsg->term, pMsg->startTime); - code = syncNodeOnSnapshotEnd(pSyncNode, pMsg); - if (syncLogBufferReInit(pSyncNode->pLogBuf, pSyncNode) != 0) { - sRError(pReceiver, "failed to reinit log buffer since %s", terrstr()); - code = -1; - } - } else if (pMsg->seq == SYNC_SNAPSHOT_SEQ_FORCE_CLOSE) { - // force close, no response - syncLogRecvSyncSnapshotSend(pSyncNode, pMsg, "process force stop"); - snapshotReceiverStop(pReceiver); - } else if (pMsg->seq > SYNC_SNAPSHOT_SEQ_BEGIN && pMsg->seq < SYNC_SNAPSHOT_SEQ_END) { - syncLogRecvSyncSnapshotSend(pSyncNode, pMsg, "process seq data"); - code = syncNodeOnSnapshotReceive(pSyncNode, pMsg); - } else { - // error log - sRError(pReceiver, "snapshot receiver recv error seq:%d, my ack:%d", pMsg->seq, pReceiver->ack); - code = -1; - } - } else { - // error log - sRError(pReceiver, "snapshot receiver term not equal"); - code = -1; - } - } else { - // error log - sRError(pReceiver, "snapshot receiver not follower"); - code = -1; + if (pSyncNode->state != TAOS_SYNC_STATE_FOLLOWER && pSyncNode->state != TAOS_SYNC_STATE_LEARNER) { + sRError(pReceiver, "snapshot receiver not a follower or learner"); + return -1; } + if (pMsg->seq < SYNC_SNAPSHOT_SEQ_PREP || pMsg->seq > SYNC_SNAPSHOT_SEQ_END) { + sRError(pReceiver, "snap replication msg with invalid seq:%d", pMsg->seq); + return -1; + } + + // prepare + if (pMsg->seq == SYNC_SNAPSHOT_SEQ_PREP) { + sInfo("vgId:%d, prepare snap replication. msg signature:(%" PRId64 ", %" PRId64 ")", pSyncNode->vgId, pMsg->term, + pMsg->startTime); + code = syncNodeOnSnapshotPrep(pSyncNode, pMsg); + goto _out; + } + + // begin + if (pMsg->seq == SYNC_SNAPSHOT_SEQ_BEGIN) { + sInfo("vgId:%d, begin snap replication. msg signature:(%" PRId64 ", %" PRId64 ")", pSyncNode->vgId, pMsg->term, + pMsg->startTime); + code = syncNodeOnSnapshotBegin(pSyncNode, pMsg); + goto _out; + } + + // data + if (pMsg->seq > SYNC_SNAPSHOT_SEQ_BEGIN && pMsg->seq < SYNC_SNAPSHOT_SEQ_END) { + code = syncNodeOnSnapshotReceive(pSyncNode, ppMsg); + goto _out; + } + + // end + if (pMsg->seq == SYNC_SNAPSHOT_SEQ_END) { + sInfo("vgId:%d, end snap replication. msg signature:(%" PRId64 ", %" PRId64 ")", pSyncNode->vgId, pMsg->term, + pMsg->startTime); + code = syncNodeOnSnapshotEnd(pSyncNode, pMsg); + if (code != 0) { + sRError(pReceiver, "failed to end snapshot."); + goto _out; + } + + code = syncLogBufferReInit(pSyncNode->pLogBuf, pSyncNode); + if (code != 0) { + sRError(pReceiver, "failed to reinit log buffer since %s", terrstr()); + } + goto _out; + } + +_out:; syncNodeResetElectTimer(pSyncNode); return code; } @@ -993,41 +1130,7 @@ static int32_t syncNodeOnSnapshotPrepRsp(SSyncNode *pSyncNode, SSyncSnapshotSend // update next index syncIndexMgrSetIndex(pSyncNode->pNextIndex, &pMsg->srcId, snapshot.lastApplyIndex + 1); - // update seq - pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN; - - // build begin msg - SRpcMsg rpcMsg = {0}; - if (syncBuildSnapshotSend(&rpcMsg, 0, pSender->pSyncNode->vgId) != 0) { - sSError(pSender, "prepare snapshot failed since build msg error"); - return -1; - } - - SyncSnapshotSend *pSendMsg = rpcMsg.pCont; - pSendMsg->srcId = pSender->pSyncNode->myRaftId; - pSendMsg->destId = pSender->pSyncNode->replicasId[pSender->replicaIndex]; - pSendMsg->term = raftStoreGetTerm(pSender->pSyncNode); - pSendMsg->beginIndex = pSender->snapshotParam.start; - pSendMsg->lastIndex = pSender->snapshot.lastApplyIndex; - pSendMsg->lastTerm = pSender->snapshot.lastApplyTerm; - pSendMsg->lastConfigIndex = pSender->snapshot.lastConfigIndex; - pSendMsg->lastConfig = pSender->lastConfig; - pSendMsg->startTime = pSender->startTime; - pSendMsg->seq = SYNC_SNAPSHOT_SEQ_BEGIN; - - ASSERT(pSendMsg->startTime); - - sSInfo(pSender, "begin snapshot replication to dnode %d. startTime:%" PRId64, DID(&pSendMsg->destId), - pSendMsg->startTime); - - // send msg - syncLogSendSyncSnapshotSend(pSyncNode, pSendMsg, "snapshot sender reply pre"); - if (syncNodeSendMsgById(&pSendMsg->destId, pSender->pSyncNode, &rpcMsg) != 0) { - sSError(pSender, "prepare snapshot failed since send msg error"); - return -1; - } - - return 0; + return snapshotSend(pSender); } static int32_t snapshotSenderSignatureCmp(SSyncSnapshotSender *pSender, SyncSnapshotRsp *pMsg) { @@ -1038,14 +1141,77 @@ static int32_t snapshotSenderSignatureCmp(SSyncSnapshotSender *pSender, SyncSnap return 0; } +static int32_t syncSnapBufferSend(SSyncSnapshotSender *pSender, SyncSnapshotRsp **ppMsg) { + int32_t code = 0; + SSyncSnapBuffer *pSndBuf = pSender->pSndBuf; + SyncSnapshotRsp *pMsg = ppMsg[0]; + + taosThreadMutexLock(&pSndBuf->mutex); + if (snapshotSenderSignatureCmp(pSender, pMsg) != 0) { + code = terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + goto _out; + } + + if (pSender->pReader == NULL || pSender->finish) { + code = terrno = TSDB_CODE_SYN_INTERNAL_ERROR; + goto _out; + } + + if (pMsg->ack - pSndBuf->start >= pSndBuf->size) { + code = terrno = TSDB_CODE_SYN_BUFFER_FULL; + goto _out; + } + + ASSERT(pSndBuf->start <= pSndBuf->cursor + 1 && pSndBuf->cursor < pSndBuf->end); + + if (pMsg->ack > pSndBuf->cursor && pMsg->ack < pSndBuf->end) { + SyncSnapBlock *pBlk = pSndBuf->entries[pMsg->ack % pSndBuf->size]; + ASSERT(pBlk); + pBlk->acked = 1; + } + + for (int64_t ack = pSndBuf->cursor + 1; ack < pSndBuf->end; ++ack) { + SyncSnapBlock *pBlk = pSndBuf->entries[ack % pSndBuf->size]; + if (pBlk->acked) { + pSndBuf->cursor = ack; + } else { + break; + } + } + + for (int64_t ack = pSndBuf->start; ack <= pSndBuf->cursor; ++ack) { + pSndBuf->entryDeleteCb(pSndBuf->entries[ack % pSndBuf->size]); + pSndBuf->entries[ack % pSndBuf->size] = NULL; + pSndBuf->start = ack + 1; + } + + while (pSender->seq != SYNC_SNAPSHOT_SEQ_END && pSender->seq - pSndBuf->start < (pSndBuf->size >> 2)) { + if (snapshotSend(pSender) != 0) { + code = terrno; + goto _out; + } + } + + if (pSender->seq == SYNC_SNAPSHOT_SEQ_END && pSndBuf->end <= pSndBuf->start) { + if (snapshotSend(pSender) != 0) { + code = terrno; + goto _out; + } + } +_out: + taosThreadMutexUnlock(&pSndBuf->mutex); + return code; +} + // sender on message // // condition 1 sender receives SYNC_SNAPSHOT_SEQ_END, close sender // condition 2 sender receives ack, set seq = ack + 1, send msg from seq // condition 3 sender receives error msg, just print error log // -int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { - SyncSnapshotRsp *pMsg = pRpcMsg->pCont; +int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { + SyncSnapshotRsp **ppMsg = (SyncSnapshotRsp **)&pRpcMsg->pCont; + SyncSnapshotRsp *pMsg = ppMsg[0]; // if already drop replica, do not process if (!syncNodeInRaftGroup(pSyncNode, &pMsg->srcId)) { @@ -1071,10 +1237,7 @@ int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { // check signature int32_t order = 0; if ((order = snapshotSenderSignatureCmp(pSender, pMsg)) > 0) { - sSError(pSender, - "received a stale snapshot rsp. ignore it" - "sender signature: (%" PRId64 ", %" PRId64 "), msg signature:(%" PRId64 ", %" PRId64 ")", - pSender->term, pSender->startTime, pMsg->term, pMsg->startTime); + sSWarn(pSender, "ignore a stale snap rsp, msg signature:(%" PRId64 ", %" PRId64 ").", pMsg->term, pMsg->startTime); terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; return -1; } else if (order < 0) { @@ -1083,9 +1246,7 @@ int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { goto _ERROR; } - // state, term, seq/ack if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "snapshot sender not leader"); sSError(pSender, "snapshot sender not leader"); terrno = TSDB_CODE_SYN_NOT_LEADER; goto _ERROR; @@ -1093,83 +1254,46 @@ int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { SyncTerm currentTerm = raftStoreGetTerm(pSyncNode); if (pMsg->term != currentTerm) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "snapshot sender and receiver term not match"); - sSError(pSender, "snapshot sender term not equal, msg term:%" PRId64 " currentTerm:%" PRId64, pMsg->term, + sSError(pSender, "snapshot sender term mismatch, msg term:%" PRId64 " currentTerm:%" PRId64, pMsg->term, currentTerm); terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; goto _ERROR; } if (pMsg->code != 0) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "receive error code"); sSError(pSender, "snapshot sender receive error:%s 0x%x and stop sender", tstrerror(pMsg->code), pMsg->code); terrno = pMsg->code; goto _ERROR; } - // prepare , send begin msg - if (pMsg->ack == SYNC_SNAPSHOT_SEQ_PREP_SNAPSHOT) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "process seq pre-snapshot"); - return syncNodeOnSnapshotPrepRsp(pSyncNode, pSender, pMsg); - } - - if (pSender->pReader == NULL || pSender->finish) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "snapshot sender invalid"); - sSError(pSender, "snapshot sender invalid error:%s 0x%x, pReader:%p finish:%d", tstrerror(pMsg->code), pMsg->code, - pSender->pReader, pSender->finish); - terrno = pMsg->code; - goto _ERROR; - } - - if (pMsg->ack == SYNC_SNAPSHOT_SEQ_BEGIN) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "process seq begin"); - if (snapshotSenderUpdateProgress(pSender, pMsg) != 0) { - return -1; + // send begin + if (pMsg->ack == SYNC_SNAPSHOT_SEQ_PREP) { + sSInfo(pSender, "process prepare rsp"); + if (syncNodeOnSnapshotPrepRsp(pSyncNode, pSender, pMsg) != 0) { + goto _ERROR; } - - if (snapshotSend(pSender) != 0) { - return -1; - } - return 0; } - // receive ack is finish, close sender + // send msg of data or end + if (pMsg->ack >= SYNC_SNAPSHOT_SEQ_BEGIN && pMsg->ack < SYNC_SNAPSHOT_SEQ_END) { + if (syncSnapBufferSend(pSender, ppMsg) != 0) { + sSError(pSender, "failed to replicate snap since %s. seq:%d, pReader:%p, finish:%d", terrstr(), pSender->seq, + pSender->pReader, pSender->finish); + goto _ERROR; + } + } + + // end if (pMsg->ack == SYNC_SNAPSHOT_SEQ_END) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "process seq end"); + sSInfo(pSender, "process end rsp"); snapshotSenderStop(pSender, true); syncNodeReplicateReset(pSyncNode, &pMsg->srcId); - return 0; - } - - // send next msg - if (pMsg->ack == pSender->seq) { - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "process seq data"); - // update sender ack - if (snapshotSenderUpdateProgress(pSender, pMsg) != 0) { - return -1; - } - if (snapshotSend(pSender) != 0) { - return -1; - } - } else if (pMsg->ack == pSender->seq - 1) { - // maybe resend - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "process seq and resend"); - if (snapshotReSend(pSender) != 0) { - return -1; - } - } else { - // error log - syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "receive error ack"); - sSError(pSender, "snapshot sender receive error ack:%d, my seq:%d", pMsg->ack, pSender->seq); - snapshotSenderStop(pSender, true); - syncNodeReplicateReset(pSyncNode, &pMsg->srcId); - return -1; } return 0; _ERROR: - snapshotSenderStop(pSender, true); + snapshotSenderStop(pSender, false); syncNodeReplicateReset(pSyncNode, &pMsg->srcId); return -1; } diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c index 37166805ce..a57dfbee53 100644 --- a/source/libs/sync/src/syncTimeout.c +++ b/source/libs/sync/src/syncTimeout.c @@ -77,12 +77,19 @@ static int32_t syncNodeTimerRoutine(SSyncNode* ths) { for (int i = 0; i < ths->peersNum; ++i) { SSyncSnapshotSender* pSender = syncNodeGetSnapshotSender(ths, &(ths->peersId[i])); if (pSender != NULL) { - if (ths->isStart && ths->state == TAOS_SYNC_STATE_LEADER && pSender->start && - timeNow - pSender->lastSendTime > SYNC_SNAP_RESEND_MS) { - snapshotReSend(pSender); - } else { - sTrace("vgId:%d, do not resend: nstart%d, now:%" PRId64 ", lstsend:%" PRId64 ", diff:%" PRId64, ths->vgId, - ths->isStart, timeNow, pSender->lastSendTime, timeNow - pSender->lastSendTime); + if (ths->isStart && ths->state == TAOS_SYNC_STATE_LEADER && pSender->start) { + int64_t elapsedMs = timeNow - pSender->lastSendTime; + if (elapsedMs < SYNC_SNAP_RESEND_MS) { + continue; + } + + if (elapsedMs > SYNC_SNAP_TIMEOUT_MS) { + sSError(pSender, "snap replication timeout, terminate."); + snapshotSenderStop(pSender, false); + } else { + sSWarn(pSender, "snap replication resend."); + snapshotReSend(pSender); + } } } } diff --git a/source/libs/sync/src/syncUtil.c b/source/libs/sync/src/syncUtil.c index 9acc17e130..9e6ea94e78 100644 --- a/source/libs/sync/src/syncUtil.c +++ b/source/libs/sync/src/syncUtil.c @@ -267,21 +267,23 @@ void syncPrintSnapshotSenderLog(const char* flags, ELogLevel level, int32_t dfla va_end(argpointer); taosPrintLog(flags, level, dflag, - "vgId:%d, %s, sync:%s, snap-sender:{%p start:%" PRId64 " end:%" PRId64 " last-index:%" PRId64 - " last-term:%" PRIu64 " last-cfg:%" PRId64 - ", seq:%d ack:%d finish:%d, as:%d dnode:%d}" + "vgId:%d, %s, sync:%s, snap-sender:%p signature:(%" PRId64 ", %" PRId64 "), {start:%" PRId64 + " end:%" PRId64 " last-index:%" PRId64 " last-term:%" PRIu64 " last-cfg:%" PRId64 + ", seq:%d, ack:%d, " + " buf:[%" PRId64 " %" PRId64 ", %" PRId64 + "), finish:%d, as:%d, to-dnode:%d}" ", term:%" PRIu64 ", commit-index:%" PRId64 ", firstver:%" PRId64 ", lastver:%" PRId64 ", min-match:%" PRId64 ", snap:{last-index:%" PRId64 ", term:%" PRIu64 "}, standby:%d, batch-sz:%d, replicas:%d, last-cfg:%" PRId64 - ", chging:%d, restore:%d, quorum:%d, lc-timer:{elect:%" PRId64 ", hb:%" PRId64 "}, peer:%s, cfg:%s", - pNode->vgId, eventLog, syncStr(pNode->state), pSender, pSender->snapshotParam.start, - pSender->snapshotParam.end, pSender->snapshot.lastApplyIndex, pSender->snapshot.lastApplyTerm, - pSender->snapshot.lastConfigIndex, pSender->seq, pSender->ack, pSender->finish, pSender->replicaIndex, - DID(&pNode->replicasId[pSender->replicaIndex]), raftStoreGetTerm(pNode), pNode->commitIndex, - logBeginIndex, logLastIndex, pNode->minMatchIndex, snapshot.lastApplyIndex, snapshot.lastApplyTerm, - pNode->raftCfg.isStandBy, pNode->raftCfg.batchSize, pNode->replicaNum, pNode->raftCfg.lastConfigIndex, - pNode->changing, pNode->restoreFinish, syncNodeDynamicQuorum(pNode), pNode->electTimerLogicClock, - pNode->heartbeatTimerLogicClockUser, peerStr, cfgStr); + ", chging:%d, restore:%d, quorum:%d, peer:%s, cfg:%s", + pNode->vgId, eventLog, syncStr(pNode->state), pSender, pSender->term, pSender->startTime, + pSender->snapshotParam.start, pSender->snapshotParam.end, pSender->snapshot.lastApplyIndex, + pSender->snapshot.lastApplyTerm, pSender->snapshot.lastConfigIndex, pSender->seq, pSender->ack, + pSender->pSndBuf->start, pSender->pSndBuf->cursor, pSender->pSndBuf->end, pSender->finish, + pSender->replicaIndex, DID(&pNode->replicasId[pSender->replicaIndex]), raftStoreGetTerm(pNode), + pNode->commitIndex, logBeginIndex, logLastIndex, pNode->minMatchIndex, snapshot.lastApplyIndex, + snapshot.lastApplyTerm, pNode->raftCfg.isStandBy, pNode->raftCfg.batchSize, pNode->replicaNum, + pNode->raftCfg.lastConfigIndex, pNode->changing, pNode->restoreFinish, pNode->quorum, peerStr, cfgStr); } void syncPrintSnapshotReceiverLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotReceiver* pReceiver, @@ -316,19 +318,21 @@ void syncPrintSnapshotReceiverLog(const char* flags, ELogLevel level, int32_t df taosPrintLog( flags, level, dflag, "vgId:%d, %s, sync:%s," - " snap-receiver:{%p started:%d acked:%d term:%" PRIu64 " start-time:%" PRId64 " from-dnode:%d, start:%" PRId64 - " end:%" PRId64 " last-index:%" PRId64 " last-term:%" PRIu64 " last-cfg:%" PRId64 + " snap-receiver:%p signature:(%" PRId64 ", %" PRId64 "), {start:%d ack:%d buf:[%" PRId64 " %" PRId64 ", %" PRId64 + ")" + " from-dnode:%d, start:%" PRId64 " end:%" PRId64 " last-index:%" PRId64 " last-term:%" PRIu64 " last-cfg:%" PRId64 "}" ", term:%" PRIu64 ", commit-index:%" PRId64 ", firstver:%" PRId64 ", lastver:%" PRId64 ", min-match:%" PRId64 ", snap:{last-index:%" PRId64 ", last-term:%" PRIu64 "}, standby:%d, batch-sz:%d, replicas:%d, last-cfg:%" PRId64 - ", chging:%d, restore:%d, quorum:%d, lc-timers:{elect:%" PRId64 ", hb:%" PRId64 "}, peer:%s, cfg:%s", - pNode->vgId, eventLog, syncStr(pNode->state), pReceiver, pReceiver->start, pReceiver->ack, pReceiver->term, - pReceiver->startTime, DID(&pReceiver->fromId), pReceiver->snapshotParam.start, pReceiver->snapshotParam.end, + ", chging:%d, restore:%d, quorum:%d, peer:%s, cfg:%s", + pNode->vgId, eventLog, syncStr(pNode->state), pReceiver, pReceiver->term, pReceiver->startTime, pReceiver->start, + pReceiver->ack, pReceiver->pRcvBuf->start, pReceiver->pRcvBuf->cursor, pReceiver->pRcvBuf->end, + DID(&pReceiver->fromId), pReceiver->snapshotParam.start, pReceiver->snapshotParam.end, pReceiver->snapshot.lastApplyIndex, pReceiver->snapshot.lastApplyTerm, pReceiver->snapshot.lastConfigIndex, raftStoreGetTerm(pNode), pNode->commitIndex, logBeginIndex, logLastIndex, pNode->minMatchIndex, snapshot.lastApplyIndex, snapshot.lastApplyTerm, pNode->raftCfg.isStandBy, pNode->raftCfg.batchSize, - pNode->replicaNum, pNode->raftCfg.lastConfigIndex, pNode->changing, pNode->restoreFinish, - syncNodeDynamicQuorum(pNode), pNode->electTimerLogicClock, pNode->heartbeatTimerLogicClockUser, peerStr, cfgStr); + pNode->replicaNum, pNode->raftCfg.lastConfigIndex, pNode->changing, pNode->restoreFinish, pNode->quorum, peerStr, + cfgStr); } void syncLogRecvTimer(SSyncNode* pSyncNode, const SyncTimeout* pMsg, const char* s) { diff --git a/source/libs/tfs/src/tfsTier.c b/source/libs/tfs/src/tfsTier.c index 1c47182e2a..d4f228a537 100644 --- a/source/libs/tfs/src/tfsTier.c +++ b/source/libs/tfs/src/tfsTier.c @@ -110,7 +110,9 @@ int32_t tfsAllocDiskOnTier(STfsTier *pTier) { } int32_t retId = -1; + int64_t avail = 0; for (int32_t id = 0; id < TFS_MAX_DISKS_PER_TIER; ++id) { +#if 0 // round-robin int32_t diskId = (pTier->nextid + id) % pTier->ndisk; STfsDisk *pDisk = pTier->disks[diskId]; @@ -126,6 +128,18 @@ int32_t tfsAllocDiskOnTier(STfsTier *pTier) { terrno = 0; pTier->nextid = (diskId + 1) % pTier->ndisk; break; +#else // select the disk with the most available space + STfsDisk *pDisk = pTier->disks[id]; + if (pDisk == NULL) continue; + + if (pDisk->size.avail < tsMinDiskFreeSize) continue; + + if (pDisk->size.avail > avail) { + avail = pDisk->size.avail; + retId = id; + terrno = 0; + } +#endif } tfsUnLockTier(pTier); diff --git a/source/libs/tfs/test/CMakeLists.txt b/source/libs/tfs/test/CMakeLists.txt index ee28dcf723..2fd0836a1d 100644 --- a/source/libs/tfs/test/CMakeLists.txt +++ b/source/libs/tfs/test/CMakeLists.txt @@ -8,7 +8,7 @@ target_link_libraries( PUBLIC gtest_main ) -add_test( - NAME tfs_test - COMMAND tfs_test -) +# add_test( +# NAME tfs_test +# COMMAND tfs_test +# ) diff --git a/source/os/src/osTime.c b/source/os/src/osTime.c index 05233065fa..e506ee603b 100644 --- a/source/os/src/osTime.c +++ b/source/os/src/osTime.c @@ -477,47 +477,38 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf) { return res; } #ifdef WINDOWS - if (*timep < 0) { - if (*timep < -2208988800LL) { - if (buf != NULL) { - sprintf(buf, "NaN"); - } - return NULL; - } - - SYSTEMTIME s; - FILETIME f; - LARGE_INTEGER offset; - struct tm tm1; - time_t tt = 0; - if (localtime_s(&tm1, &tt) != 0 ) { - if (buf != NULL) { - sprintf(buf, "NaN"); - } - return NULL; - } - offset.QuadPart = TIMEEPOCH1900; - offset.QuadPart += *timep * 10000000; - f.dwLowDateTime = offset.QuadPart & 0xffffffff; - f.dwHighDateTime = (offset.QuadPart >> 32) & 0xffffffff; - FileTimeToSystemTime(&f, &s); - result->tm_sec = s.wSecond; - result->tm_min = s.wMinute; - result->tm_hour = s.wHour; - result->tm_mday = s.wDay; - result->tm_mon = s.wMonth - 1; - result->tm_year = s.wYear - 1900; - result->tm_wday = s.wDayOfWeek; - result->tm_yday = 0; - result->tm_isdst = 0; - } else { - if (localtime_s(result, timep) != 0) { - if (buf != NULL) { - sprintf(buf, "NaN"); - } - return NULL; + if (*timep < -2208988800LL) { + if (buf != NULL) { + sprintf(buf, "NaN"); } + return NULL; } + + SYSTEMTIME s; + FILETIME f; + LARGE_INTEGER offset; + struct tm tm1; + time_t tt = 0; + if (localtime_s(&tm1, &tt) != 0) { + if (buf != NULL) { + sprintf(buf, "NaN"); + } + return NULL; + } + offset.QuadPart = TIMEEPOCH1900; + offset.QuadPart += *timep * 10000000; + f.dwLowDateTime = offset.QuadPart & 0xffffffff; + f.dwHighDateTime = (offset.QuadPart >> 32) & 0xffffffff; + FileTimeToSystemTime(&f, &s); + result->tm_sec = s.wSecond; + result->tm_min = s.wMinute; + result->tm_hour = s.wHour; + result->tm_mday = s.wDay; + result->tm_mon = s.wMonth - 1; + result->tm_year = s.wYear - 1900; + result->tm_wday = s.wDayOfWeek; + result->tm_yday = 0; + result->tm_isdst = 0; #else res = localtime_r(timep, result); if (res == NULL && buf != NULL) { diff --git a/source/os/test/osTimeTests.cpp b/source/os/test/osTimeTests.cpp index 5dd15db4ab..90c089e310 100644 --- a/source/os/test/osTimeTests.cpp +++ b/source/os/test/osTimeTests.cpp @@ -114,10 +114,6 @@ TEST(osTimeTests, taosLocalTime) { ASSERT_EQ(local_time->tm_min, 0); ASSERT_EQ(local_time->tm_sec, 0); - time_t over_timep = 6406301441633558; - local_time = taosLocalTime(&over_timep, &result, NULL); - ASSERT_EQ(local_time, nullptr); - time_t neg_timep3 = -78115158887; local_time = taosLocalTime(&neg_timep3, &result, NULL); ASSERT_EQ(local_time, nullptr); diff --git a/source/util/src/tarray.c b/source/util/src/tarray.c index a7c28df22b..26d149b5b5 100644 --- a/source/util/src/tarray.c +++ b/source/util/src/tarray.c @@ -191,7 +191,7 @@ void* taosArrayGet(const SArray* pArray, size_t index) { } if (index >= pArray->size) { - uError("index is out of range, current:%" PRIzu " max:%d", index, pArray->capacity); + uError("index is out of range, current:%" PRIzu " max:%"PRIzu, index, pArray->size); return NULL; } diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c index 34c3222bff..08bb8ecabf 100644 --- a/source/util/src/tconfig.c +++ b/source/util/src/tconfig.c @@ -416,16 +416,6 @@ int32_t cfgAddFloat(SConfig *pCfg, const char *name, float defaultVal, float min return cfgAddItem(pCfg, &item, name); } -int32_t cfgAddDouble(SConfig *pCfg, const char *name, double defaultVal, double minval, double maxval, int8_t scope) { - if (defaultVal < minval || defaultVal > maxval) { - terrno = TSDB_CODE_OUT_OF_RANGE; - return -1; - } - - SConfigItem item = {.dtype = CFG_DTYPE_DOUBLE, .dval = defaultVal, .fmin = minval, .fmax = maxval, .scope = scope}; - return cfgAddItem(pCfg, &item, name); -} - int32_t cfgAddString(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope) { SConfigItem item = {.dtype = CFG_DTYPE_STRING, .scope = scope}; item.str = taosStrdup(defaultVal); @@ -611,8 +601,7 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) { switch (pItem->dtype) { case CFG_DTYPE_BOOL: if (dump) { - printf("%s %s %u", src, name, pItem->bval); - printf("\n"); + printf("%s %s %u\n", src, name, pItem->bval); } else { uInfo("%s %s %u", src, name, pItem->bval); } @@ -620,25 +609,22 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) { break; case CFG_DTYPE_INT32: if (dump) { - printf("%s %s %d", src, name, pItem->i32); - printf("\n"); + printf("%s %s %d\n", src, name, pItem->i32); } else { uInfo("%s %s %d", src, name, pItem->i32); } break; case CFG_DTYPE_INT64: if (dump) { - printf("%s %s %" PRId64, src, name, pItem->i64); - printf("\n"); + printf("%s %s %" PRId64"\n", src, name, pItem->i64); } else { uInfo("%s %s %" PRId64, src, name, pItem->i64); } break; - case CFG_DTYPE_FLOAT: case CFG_DTYPE_DOUBLE: + case CFG_DTYPE_FLOAT: if (dump) { - printf("%s %s %.2f", src, name, pItem->fval); - printf("\n"); + printf("%s %s %.2f\n", src, name, pItem->fval); } else { uInfo("%s %s %.2f", src, name, pItem->fval); } @@ -650,8 +636,7 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) { case CFG_DTYPE_TIMEZONE: case CFG_DTYPE_NONE: if (dump) { - printf("%s %s %s", src, name, pItem->str); - printf("\n"); + printf("%s %s %s\n", src, name, pItem->str); } else { uInfo("%s %s %s", src, name, pItem->str); } @@ -660,8 +645,7 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) { } if (dump) { - printf("================================================================="); - printf("\n"); + printf("=================================================================\n"); } else { uInfo("================================================================="); } diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 4cc86d51b7..30daad62bf 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -259,6 +259,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_DNODE_ID, "Invalid dnode id") TAOS_DEFINE_ERROR(TSDB_CODE_MND_VGROUP_UN_CHANGED, "Vgroup distribution has not changed") TAOS_DEFINE_ERROR(TSDB_CODE_MND_HAS_OFFLINE_DNODE, "Offline dnode exists") TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_REPLICA, "Invalid vgroup replica") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_NO_ENOUGH_VNODES, "Vnodes exhausted") // mnode-stable-part2 TAOS_DEFINE_ERROR(TSDB_CODE_MND_NAME_CONFLICT_WITH_TOPIC, "STable confilct with topic") @@ -518,6 +519,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_PORT, "Port should be an in TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_ENDPOINT, "Endpoint should be in the format of 'fqdn:port'") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_EXPRIE_STATEMENT, "This statement is no longer supported") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INTER_VALUE_TOO_SMALL, "Interval too small") +TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INTER_VALUE_TOO_BIG, "Interval too big") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_DB_NOT_SPECIFIED, "Database not specified") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME, "Invalid identifier name") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_CORRESPONDING_STABLE_ERR, "Corresponding super table not in this db") @@ -552,7 +554,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_PAR_TOO_MANY_COLUMNS, "Too many columns") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_FIRST_COLUMN, "First column must be timestamp") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN, "Invalid varbinary/binary/nchar column/tag length") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_TAGS_NUM, "Invalid number of tag columns") -TAOS_DEFINE_ERROR(TSDB_CODE_PAR_PERMISSION_DENIED, "Permission denied") +TAOS_DEFINE_ERROR(TSDB_CODE_PAR_PERMISSION_DENIED, "Permission denied or target object not exist") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Invalid stream query") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_INTERNAL_PK, "Invalid _c0 or _rowts expression") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_TIMELINE_FUNC, "Invalid timeline function") @@ -602,6 +604,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_FUNC_FUNTION_PARA_TYPE, "Invalid function par TAOS_DEFINE_ERROR(TSDB_CODE_FUNC_FUNTION_PARA_VALUE, "Invalid function para value") TAOS_DEFINE_ERROR(TSDB_CODE_FUNC_NOT_BUILTIN_FUNTION, "Not buildin function") TAOS_DEFINE_ERROR(TSDB_CODE_FUNC_DUP_TIMESTAMP, "Duplicate timestamps not allowed in function") +TAOS_DEFINE_ERROR(TSDB_CODE_FUNC_TO_TIMESTAMP_FAILED, "Func to_timestamp failed, check log for detail") //udf TAOS_DEFINE_ERROR(TSDB_CODE_UDF_STOPPING, "udf is stopping") diff --git a/source/util/src/tqueue.c b/source/util/src/tqueue.c index 81350dddd2..1dfdd637b6 100644 --- a/source/util/src/tqueue.c +++ b/source/util/src/tqueue.c @@ -242,6 +242,11 @@ int32_t taosReadAllQitems(STaosQueue *queue, STaosQall *qall) { qall->current = queue->head; qall->start = queue->head; qall->numOfItems = queue->numOfItems; + qall->memOfItems = queue->memOfItems; + + qall->unAccessedNumOfItems = queue->numOfItems; + qall->unAccessMemOfItems = queue->memOfItems; + numOfItems = qall->numOfItems; queue->head = NULL; @@ -274,6 +279,10 @@ int32_t taosGetQitem(STaosQall *qall, void **ppItem) { if (pNode) { *ppItem = pNode->item; num = 1; + + qall->unAccessedNumOfItems -= 1; + qall->unAccessMemOfItems -= pNode->dataSize; + uTrace("item:%p is fetched", *ppItem); } else { *ppItem = NULL; @@ -449,6 +458,8 @@ int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, SQueueInfo * qall->current = queue->head; qall->start = queue->head; qall->numOfItems = queue->numOfItems; + qall->memOfItems = queue->memOfItems; + code = qall->numOfItems; qinfo->ahandle = queue->ahandle; qinfo->fp = queue->itemsFp; @@ -476,6 +487,11 @@ int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, SQueueInfo * } int32_t taosQallItemSize(STaosQall *qall) { return qall->numOfItems; } +int64_t taosQallMemSize(STaosQall *qall) { return qall->memOfItems; } + +int64_t taosQallUnAccessedItemSize(STaosQall *qall) {return qall->unAccessedNumOfItems;} +int64_t taosQallUnAccessedMemSize(STaosQall *qall) {return qall->unAccessMemOfItems;} + void taosResetQitems(STaosQall *qall) { qall->current = qall->start; } int32_t taosGetQueueNumber(STaosQset *qset) { return qset->numOfQueues; } diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 6915f802c3..a8d3125030 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -65,6 +65,10 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 2 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 4 ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqShow.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropStb.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb0.py @@ -1044,6 +1048,7 @@ e ,,y,script,./test.sh -f tsim/query/tableCount.sim ,,y,script,./test.sh -f tsim/query/show_db_table_kind.sim ,,y,script,./test.sh -f tsim/query/bi_star_table.sim +,,y,script,./test.sh -f tsim/query/bi_tag_scan.sim ,,y,script,./test.sh -f tsim/query/tag_scan.sim ,,y,script,./test.sh -f tsim/query/nullColSma.sim ,,y,script,./test.sh -f tsim/query/bug3398.sim diff --git a/tests/parallel_test/container_build.sh b/tests/parallel_test/container_build.sh index 94704b1c25..f4db7edb8b 100755 --- a/tests/parallel_test/container_build.sh +++ b/tests/parallel_test/container_build.sh @@ -69,7 +69,7 @@ docker run \ -v ${REP_REAL_PATH}/community/contrib/libuv/:${REP_DIR}/community/contrib/libuv \ -v ${REP_REAL_PATH}/community/contrib/lz4/:${REP_DIR}/community/contrib/lz4 \ -v ${REP_REAL_PATH}/community/contrib/zlib/:${REP_DIR}/community/contrib/zlib \ - --rm --ulimit core=-1 taos_test:v1.0 sh -c "pip uninstall taospy -y;pip3 install taospy==2.7.2;cd $REP_DIR;rm -rf debug;mkdir -p debug;cd debug;cmake .. -DBUILD_HTTP=false -DBUILD_TOOLS=true -DBUILD_TEST=true -DWEBSOCKET=true -DBUILD_TAOSX=true -DJEMALLOC_ENABLED=0;make -j 10|| exit 1" + --rm --ulimit core=-1 taos_test:v1.0 sh -c "pip uninstall taospy -y;pip3 install taospy==2.7.2;cd $REP_DIR;rm -rf debug;mkdir -p debug;cd debug;cmake .. -DBUILD_HTTP=false -DBUILD_TOOLS=true -DBUILD_TEST=true -DWEBSOCKET=true -DBUILD_TAOSX=false -DJEMALLOC_ENABLED=0;make -j 10|| exit 1" # -v ${REP_REAL_PATH}/community/contrib/jemalloc/:${REP_DIR}/community/contrib/jemalloc \ if [[ -d ${WORKDIR}/debugNoSan ]] ;then @@ -99,7 +99,7 @@ docker run \ -v ${REP_REAL_PATH}/community/contrib/lz4/:${REP_DIR}/community/contrib/lz4 \ -v ${REP_REAL_PATH}/community/contrib/zlib/:${REP_DIR}/community/contrib/zlib \ -v ${REP_REAL_PATH}/community/contrib/jemalloc/:${REP_DIR}/community/contrib/jemalloc \ - --rm --ulimit core=-1 taos_test:v1.0 sh -c "pip uninstall taospy -y;pip3 install taospy==2.7.2;cd $REP_DIR;rm -rf debug;mkdir -p debug;cd debug;cmake .. -DBUILD_HTTP=false -DBUILD_TOOLS=true -DBUILD_TEST=true -DWEBSOCKET=true -DBUILD_SANITIZER=1 -DTOOLS_SANITIZE=true -DTOOLS_BUILD_TYPE=Debug -DBUILD_TAOSX=true -DJEMALLOC_ENABLED=0;make -j 10|| exit 1 " + --rm --ulimit core=-1 taos_test:v1.0 sh -c "pip uninstall taospy -y;pip3 install taospy==2.7.2;cd $REP_DIR;rm -rf debug;mkdir -p debug;cd debug;cmake .. -DBUILD_HTTP=false -DBUILD_TOOLS=true -DBUILD_TEST=true -DWEBSOCKET=true -DBUILD_SANITIZER=1 -DTOOLS_SANITIZE=true -DTOOLS_BUILD_TYPE=Debug -DBUILD_TAOSX=false -DJEMALLOC_ENABLED=0;make -j 10|| exit 1 " mv ${REP_REAL_PATH}/debug ${WORKDIR}/debugSan diff --git a/tests/pytest/util/dnodes.py b/tests/pytest/util/dnodes.py index d0ed1d874d..67c3d37960 100644 --- a/tests/pytest/util/dnodes.py +++ b/tests/pytest/util/dnodes.py @@ -130,14 +130,16 @@ class TDDnode: "locale": "en_US.UTF-8", "charset": "UTF-8", "asyncLog": "0", - "mDebugFlag": "135", - "dDebugFlag": "135", - "vDebugFlag": "135", - "tqDebugFlag": "135", - "cDebugFlag": "135", - "jniDebugFlag": "135", - "qDebugFlag": "135", - "rpcDebugFlag": "135", + "mDebugFlag": "143", + "dDebugFlag": "143", + "vDebugFlag": "143", + "tqDebugFlag": "143", + "cDebugFlag": "143", + "stDebugFlag": "143", + "smaDebugFlag": "143", + "jniDebugFlag": "143", + "qDebugFlag": "143", + "rpcDebugFlag": "143", "tmrDebugFlag": "131", "uDebugFlag": "135", "sDebugFlag": "135", diff --git a/tests/script/tsim/query/bi_tag_scan.sim b/tests/script/tsim/query/bi_tag_scan.sim new file mode 100644 index 0000000000..5b8af68b5a --- /dev/null +++ b/tests/script/tsim/query/bi_tag_scan.sim @@ -0,0 +1,31 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -i 1 +system sh/exec.sh -n dnode1 -s start +sql connect + +sql drop database if exists db1; +sql create database db1 vgroups 3; +sql create database db1; +sql use db1; +sql create stable sta (ts timestamp, f1 int, f2 binary(200)) tags(t1 int, t2 int, t3 int); +sql create stable stb (ts timestamp, f1 int, f2 binary(200)) tags(t1 int, t2 int, t3 int); +sql create table tba1 using sta tags(1, 1, 1); +sql create table tba2 using sta tags(2, 2, 2); +sql insert into tba1 values(now, 1, "1")(now+3s, 3, "3")(now+5s, 5, "5"); +sql insert into tba2 values(now + 1s, 2, "2")(now+2s, 2, "2")(now+4s, 4, "4"); +sql create table tbn1 (ts timestamp, f1 int); + +set_bi_mode 1 +sql select t1,t2,t3 from db1.sta order by t1; +print $rows $data00 $data10 +if $rows != 2 then + return -1 +endi +if $data00 != 1 then + return -1 +endi +if $data10 != 2 then + return -1 +endi + +system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/sma/rsmaCreateInsertQuery.sim b/tests/script/tsim/sma/rsmaCreateInsertQuery.sim index b3144e4e0d..e5e07dfaec 100644 --- a/tests/script/tsim/sma/rsmaCreateInsertQuery.sim +++ b/tests/script/tsim/sma/rsmaCreateInsertQuery.sim @@ -5,7 +5,7 @@ sleep 50 sql connect print =============== create database with retentions -sql create database d0 retentions 5s:7d,10s:21d,15s:365d; +sql create database d0 retentions -:7d,10s:21d,15s:365d; sql use d0 print =============== create super table and register rsma diff --git a/tests/script/tsim/sma/rsmaPersistenceRecovery.sim b/tests/script/tsim/sma/rsmaPersistenceRecovery.sim index 0b3938d773..6f78829db7 100644 --- a/tests/script/tsim/sma/rsmaPersistenceRecovery.sim +++ b/tests/script/tsim/sma/rsmaPersistenceRecovery.sim @@ -8,7 +8,7 @@ sql connect return 1 print =============== create database with retentions -sql create database d0 retentions 5s:7d,5m:21d,15m:365d; +sql create database d0 retentions -:7d,5m:21d,15m:365d; sql use d0 print =============== create super table and register rsma diff --git a/tests/script/tsim/stream/distributeIntervalRetrive0.sim b/tests/script/tsim/stream/distributeIntervalRetrive0.sim index 052bf441d5..39c3353429 100644 --- a/tests/script/tsim/stream/distributeIntervalRetrive0.sim +++ b/tests/script/tsim/stream/distributeIntervalRetrive0.sim @@ -267,6 +267,7 @@ sql create table t1 using st tags(1,1,1); sql create table t2 using st tags(2,2,2); sql create stream streams1 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 delete_mark 20s into streamt1 as select _wstart as c0, count(*) c1, count(a) c2 from st interval(10s) ; +sleep 1000 sql insert into t1 values(1648791211000,1,2,3); sql insert into t1 values(1262275200000,2,2,3); diff --git a/tests/script/tsim/stream/pauseAndResume.sim b/tests/script/tsim/stream/pauseAndResume.sim index 402e0086f7..673bc77c0f 100644 --- a/tests/script/tsim/stream/pauseAndResume.sim +++ b/tests/script/tsim/stream/pauseAndResume.sim @@ -16,7 +16,9 @@ sql create table ts2 using st tags(2,2,2); sql create table ts3 using st tags(3,2,2); sql create table ts4 using st tags(4,2,2); sql create stream streams1 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 watermark 1d into streamt1 as select _wstart, count(*) c1, sum(a) c3 from st interval(10s); +sleep 1000 +sleep 1000 sql pause stream streams1; sql insert into ts1 values(1648791213001,1,12,3,1.0); @@ -246,6 +248,7 @@ sql create table ts4 using st tags(4,2,2); sql create stream streams3 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 watermark 1d into streamt3 as select _wstart, count(*) c1, sum(a) c3 from st interval(10s); sql create stream streams4 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 watermark 1d into streamt4 as select _wstart, count(*) c1, sum(a) c3 from st interval(10s); sql create stream streams5 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 watermark 1d into streamt5 as select _wstart, count(*) c1, sum(a) c3 from ts1 interval(10s); +sleep 1000 sql pause stream streams3; diff --git a/tests/script/tsim/stream/sliding.sim b/tests/script/tsim/stream/sliding.sim index 18893245fa..a92da7f472 100644 --- a/tests/script/tsim/stream/sliding.sim +++ b/tests/script/tsim/stream/sliding.sim @@ -21,6 +21,7 @@ sql create stream streams1 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 in sql create stream streams2 trigger at_once watermark 1d IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt2 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from t1 interval(10s) sliding (5s); sql create stream stream_t1 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamtST as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from st interval(10s) sliding (5s); sql create stream stream_t2 trigger at_once watermark 1d IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamtST2 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from st interval(10s) sliding (5s); +sleep 1000 sql insert into t1 values(1648791210000,1,2,3,1.0); sql insert into t1 values(1648791216000,2,2,3,1.1); @@ -311,6 +312,7 @@ sql create table t2 using st tags(2,2,2); sql create stream streams11 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from t1 interval(10s, 5s); sql create stream streams12 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt2 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from st interval(10s, 5s); +sleep 1000 sql insert into t1 values(1648791213000,1,2,3,1.0); sql insert into t1 values(1648791223001,2,2,3,1.1); @@ -444,6 +446,7 @@ sql create table t2 using st tags(2,2,2); sql create stream streams21 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt21 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from t1 interval(10s, 5s); sql create stream streams22 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt22 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from st interval(10s, 5s); +sleep 1000 sql insert into t1 values(1648791213000,1,1,1,1.0); sql insert into t1 values(1648791223001,2,2,2,1.1); @@ -582,6 +585,7 @@ sql create table t1 using st tags(1,1,1); sql create table t2 using st tags(2,2,2); sql create stream streams23 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt23 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from st interval(20s) sliding(10s); +sleep 1000 sql insert into t1 values(1648791213000,1,1,1,1.0); sql insert into t1 values(1648791223001,2,2,2,1.1); @@ -706,6 +710,7 @@ sql create table t1 using st tags(1,1,1); sql create table t2 using st tags(2,2,2); sql create stream streams4 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt4 as select _wstart as ts, count(*),min(a) c1 from st interval(10s) sliding(5s); +sleep 1000 sql insert into t1 values(1648791213000,1,1,1,1.0); sql insert into t1 values(1648791243000,2,1,1,1.0); @@ -818,4 +823,4 @@ print ============loop_all=$loop_all #=goto looptest -system sh/stop_dnodes.sh \ No newline at end of file +system sh/stop_dnodes.sh diff --git a/tests/script/tsim/sync/vnodesnapshot-rsma-test.sim b/tests/script/tsim/sync/vnodesnapshot-rsma-test.sim index 6f8c095162..3b3cd01521 100644 --- a/tests/script/tsim/sync/vnodesnapshot-rsma-test.sim +++ b/tests/script/tsim/sync/vnodesnapshot-rsma-test.sim @@ -47,7 +47,7 @@ endi $replica = 3 $vgroups = 1 -$retentions = 5s:7d,15s:21d,1m:365d +$retentions = -:7d,15s:21d,1m:365d print ============= create database sql create database db replica $replica vgroups $vgroups retentions $retentions diff --git a/tests/system-test/0-others/timeRangeWise.py b/tests/system-test/0-others/timeRangeWise.py index 5ef5aa4a75..7a258f5dd3 100644 --- a/tests/system-test/0-others/timeRangeWise.py +++ b/tests/system-test/0-others/timeRangeWise.py @@ -23,7 +23,8 @@ from util.cases import * from util.sql import * class TDTestCase: - + updatecfgDict = {'vdebugFlag': 143, 'qdebugflag':135, 'tqdebugflag':135, 'udebugflag':135, 'rpcdebugflag':135, + 'asynclog': 0, 'stdebugflag':135} # random string def random_string(self, count): letters = string.ascii_letters diff --git a/tests/system-test/1-insert/block_wise.py b/tests/system-test/1-insert/block_wise.py index 8222000cd6..1aff2e7708 100644 --- a/tests/system-test/1-insert/block_wise.py +++ b/tests/system-test/1-insert/block_wise.py @@ -417,7 +417,7 @@ class TDTestCase: self.all_test() tdLog.printNoPrefix("==========step2:create table in rollup database") - tdSql.execute("create database db3 retentions 1s:4m,2s:8m,3s:12m") + tdSql.execute("create database db3 retentions -:4m,2s:8m,3s:12m") tdSql.execute("use db3") tdSql.query(f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL})") @@ -438,7 +438,7 @@ class TDTestCase: tdSql.execute("drop database if exists db_s20 ") tdLog.printNoPrefix("==========step4:insert and flush in rollup database") - tdSql.execute("create database db4 retentions 1s:4m,2s:8m,3s:12m") + tdSql.execute("create database db4 retentions -:4m,2s:8m,3s:12m") tdSql.execute("use db4") self.__create_tb(rollup="first") self.__insert_data(rollup="first") diff --git a/tests/system-test/1-insert/create_retentions.py b/tests/system-test/1-insert/create_retentions.py index 0090a7124f..a4b2cae68a 100644 --- a/tests/system-test/1-insert/create_retentions.py +++ b/tests/system-test/1-insert/create_retentions.py @@ -52,27 +52,65 @@ class TDTestCase: @property def create_databases_sql_err(self): return [ - "create database db1 retentions 0s:1d", - "create database db3 retentions 1s:0d", - "create database db1 retentions 1s:1y", - "create database db1 retentions 1s:1n", - "create database db2 retentions 1w:1d ;", - "create database db5 retentions 1s:1d,3s:3d,2s:2d", - "create database db1 retentions 1s:1n,2s:2d,3s:3d,4s:4d", + # check grammar + "create database db1 retentions", + "create database db1 retentions 1s:1d", + "create database db1 retentions 1s:1d,2s:2d", + "create database db1 retentions 1s:1d,2s:2d,3s:3d", + "create database db1 retentions -:1d,2s:2d,3s:3d,4s:4d", + "create database db1 retentions -:-", + "create database db1 retentions --:1d", + "create database db1 retentions +:1d", + "create database db1 retentions :1d", + "create database db1 retentions -:1d,-:2d", + "create database db1 retentions -:1d,1s:-", + "create database db1 retentions -:1d,15s:2d,-:3d", + + # check unit + "create database db1 retentions -:1d,1b:1d", + "create database db1 retentions -:1d,1u:1d", + "create database db1 retentions -:1d,1a:1d", + "create database db1 retentions -:1d,1n:1d", + "create database db1 retentions -:1d,1y:1d", + "create database db1 retentions -:1d,1s:86400s", + "create database db1 retentions -:1d,1s:86400000a", + "create database db1 retentions -:1d,1s:86400000000u", + "create database db1 retentions -:1d,1s:86400000000000b", + "create database db1 retentions -:1d,1s:1w", + "create database db1 retentions -:1d,1s:1n", + "create database db1 retentions -:1d,1s:1y", + + # check value range + "create database db3 retentions -:-1d", + "create database db3 retentions -:0d", + "create database db3 retentions -:1439m", + "create database db3 retentions -:365001d", + "create database db3 retentions -:8760001h", + "create database db3 retentions -:525600001m", + "create database db3 retentions -:106581d precision 'ns'", + "create database db3 retentions -:2557921h precision 'ns'", + "create database db3 retentions -:153475201m precision 'ns'", + # check relationships + "create database db5 retentions -:1440m,1441m:1440m,2d:3d", + "create database db5 retentions -:1d,2m:1d,1s:2d", + "create database db5 retentions -:1440m,1s:2880m,2s:2879m", + "create database db5 retentions -:1d,2s:2d,2s:3d", + "create database db5 retentions -:1d,3s:2d,2s:3d", + "create database db1 retentions -:1d,2s:3d,3s:2d", ] @property def create_databases_sql_current(self): return [ - f"create database {DB1} retentions 1s:1d", - f"create database {DB2} retentions 1s:1d,2m:2d,3h:3d", + f"create database {DB1} retentions -:1d", + f"create database {DB2} retentions -:1d,2m:2d,3h:3d", ] @property def alter_database_sql(self): return [ - "alter database db1 retentions 99h:99d", - "alter database db2 retentions 97h:97d,98h:98d,99h:99d,", + "alter database db1 retentions -:99d", + "alter database db2 retentions -:97d,98h:98d,99h:99d,", ] @property @@ -92,6 +130,16 @@ class TDTestCase: f"create stable {dbname}.stb24 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) " , f"create stable {dbname}.stb25 ({PRIMARY_COL} timestamp, {INT_COL} int) " , f"create stable {dbname}.stb26 ({PRIMARY_COL} timestamp, {INT_COL} int, {BINARY_COL} nchar(16)) " , + # only float/double allowd for avg/sum + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(avg)", + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {BINT_COL} bigint) tags (tag1 int) rollup(avg)", + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {BOOL_COL} bool) tags (tag1 int) rollup(avg)", + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {BINARY_COL} binary(10)) tags (tag1 int) rollup(avg)", + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(sum)", + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {BINT_COL} bigint) tags (tag1 int) rollup(sum)", + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {BOOL_COL} bool) tags (tag1 int) rollup(sum)", + f"create stable {dbname}.stb11 ({PRIMARY_COL} timestamp, {BINARY_COL} binary(10)) tags (tag1 int) rollup(sum)", + # watermark, max_delay: [0, 900000], [ms, s, m, ?] f"create stable stb17 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 1u", @@ -108,10 +156,10 @@ class TDTestCase: @property def create_stable_sql_current(self): return [ - f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(avg)", + f"create stable stb1 ({PRIMARY_COL} timestamp, {FLOAT_COL} float) tags (tag1 int) rollup(avg)", f"create stable stb2 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark 5s max_delay 1m", f"create stable stb3 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(max) watermark 5s max_delay 1m", - f"create stable stb4 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(sum) watermark 5s max_delay 1m", + f"create stable stb4 ({PRIMARY_COL} timestamp, {DOUBLE_COL} double) tags (tag1 int) rollup(sum) watermark 5s max_delay 1m", f"create stable stb5 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(last) watermark 5s max_delay 1m", f"create stable stb6 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m", f"create stable stb7 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL})", @@ -134,9 +182,17 @@ class TDTestCase: def test_create_databases(self): for err_sql in self.create_databases_sql_err: tdSql.error(err_sql) + index = 0 for cur_sql in self.create_databases_sql_current: tdSql.execute(cur_sql) - # tdSql.query("select * from information_schema.ins_databases") + if(index == 0): + tdSql.query(f"show create database {DB1}") + else: + tdSql.query(f"show create database {DB2}") + tdSql.checkEqual(len(tdSql.queryResult),1) + tdLog.info("%s" % (tdSql.queryResult[0][1])) + tdSql.checkEqual(tdSql.queryResult[0][1].find("RETENTIONS -:") > 0, True) + index += 1 for alter_sql in self.alter_database_sql: tdSql.error(alter_sql) @@ -154,6 +210,12 @@ class TDTestCase: {INT_UN_COL} int unsigned, {BINT_UN_COL} bigint unsigned, {BINARY_COL} binary(16) ) tags ({INT_TAG} int) rollup({rsma_type}) watermark 5s,5s max_delay 5s,5s ''' + elif rsma_type.lower().strip() in ("sum", "avg"): + create_stb_sql = f'''create table {dbname}.{stb}( + ts timestamp, {DOUBLE_COL} double, {DOUBLE_COL}_1 double, {DOUBLE_COL}_2 double, {DOUBLE_COL}_3 double, + {FLOAT_COL} float, {DOUBLE_COL}_4 double, {FLOAT_COL}_1 float, {FLOAT_COL}_2 float, {FLOAT_COL}_3 float, + {DOUBLE_COL}_5 double) tags ({INT_TAG} int) rollup({rsma_type}) watermark 5s,5s max_delay 5s,5s + ''' else: create_stb_sql = f'''create table {dbname}.{stb}( ts timestamp, {INT_COL} int, {BINT_COL} bigint, {SINT_COL} smallint, {TINT_COL} tinyint, @@ -200,11 +262,16 @@ class TDTestCase: {data.int_data[i]}, {data.bint_data[i]}, {data.sint_data[i]}, {data.tint_data[i]}, {data.float_data[i]}, {data.double_data[i]}, {data.utint_data[i]}, {data.usint_data[i]}, {data.uint_data[i]}, {data.ubint_data[i]}, '{data.vchar_data[i]}' ''' - else: + elif rsma_type.lower().strip() in ("sum", "avg"): row_data = f''' {data.int_data[i]}, {data.bint_data[i]}, {data.sint_data[i]}, {data.tint_data[i]}, {data.float_data[i]}, {data.double_data[i]}, {data.utint_data[i]}, {data.usint_data[i]}, {data.uint_data[i]}, {data.ubint_data[i]} ''' + else: + row_data = f''' + {data.double_data[i]}, {data.double_data[i]}, {data.double_data[i]}, {data.double_data[i]}, {data.float_data[i]}, {data.double_data[i]}, + {data.float_data[i]}, {data.float_data[i]}, {data.float_data[i]}, {data.double_data[i]} + ''' else: row_data = f''' {data.int_data[i]}, {data.bint_data[i]}, {data.sint_data[i]}, {data.tint_data[i]}, {data.float_data[i]}, {data.double_data[i]}, @@ -232,7 +299,7 @@ class TDTestCase: tdLog.printNoPrefix("==========step2:create table in rollup database") tdLog.printNoPrefix("==========step2.1 : rolluo func is not last/first") - tdSql.prepare(dbname=DB3, **{"retentions": "1s:1d, 3s:3d, 5s:5d"}) + tdSql.prepare(dbname=DB3, **{"retentions": "-:1d, 3s:3d, 5s:5d"}) db3_ctb_num = 10 self.__create_tb(rsma=True, dbname=DB3, ctb_num=db3_ctb_num, stb=STBNAME) @@ -245,17 +312,17 @@ class TDTestCase: tdSql.query(f"select count(*) from {DB3}.{STBNAME} where ts > now()-5m") tdSql.checkData(0, 0, self.rows * db3_ctb_num) tdSql.checkRows(1) - tdSql.query(f"select {INT_COL} from {DB3}.{CTBNAME} where ts > now()-4d") + tdSql.query(f"select {FLOAT_COL} from {DB3}.{CTBNAME} where ts > now()-4d") # not stable #tdSql.checkData(0, 0, self.rows-1) - tdSql.query(f"select {INT_COL} from {DB3}.{CTBNAME} where ts > now()-6d") + tdSql.query(f"select {DOUBLE_COL} from {DB3}.{CTBNAME} where ts > now()-6d") # not stable # tdSql.checkData(0, 0, self.rows-1) # from ...pytest.util.sql import tdSql tdLog.printNoPrefix("==========step2.1.1 : alter stb schemaL drop column") - tdSql.query(f"select {BINT_COL} from {DB3}.{STBNAME}") + tdSql.query(f"select {FLOAT_COL} from {DB3}.{STBNAME}") #tdSql.execute(f"alter stable {DB3}.stb1 drop column {BINT_COL}") # not support alter stable schema anymore tdSql.error(f"alter stable {DB3}.stb1 drop column {BINT_COL}") @@ -289,7 +356,7 @@ class TDTestCase: tdLog.printNoPrefix("==========step2.2 : rolluo func is last/first") - tdSql.prepare(dbname=DB4, **{"retentions": "1s:1d, 2m:3d, 3m:5d"}) + tdSql.prepare(dbname=DB4, **{"retentions": "-:1d, 2m:3d, 3m:5d"}) db4_ctb_num = 10 tdSql.execute(f"use {DB4}") diff --git a/tests/system-test/1-insert/time_range_wise.py b/tests/system-test/1-insert/time_range_wise.py index df1cc516c5..14b717d1da 100644 --- a/tests/system-test/1-insert/time_range_wise.py +++ b/tests/system-test/1-insert/time_range_wise.py @@ -584,7 +584,7 @@ class TDTestCase: self.all_test() tdLog.printNoPrefix("==========step2:create table in rollup database") - tdSql.execute("create database db3 retentions 1s:4m,2s:8m,3s:12m") + tdSql.execute("create database db3 retentions -:4m,2s:8m,3s:12m") tdSql.execute("use db3") tdSql.execute(f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL}) ") self.all_test() @@ -603,7 +603,7 @@ class TDTestCase: # add for TS-2440 for i in range(self.rows): tdSql.execute("drop database if exists db3 ") - tdSql.execute("create database db3 retentions 1s:4m,2s:8m,3s:12m") + tdSql.execute("create database db3 retentions -:4m,2s:8m,3s:12m") def stop(self): tdSql.close() diff --git a/tests/system-test/2-query/func_to_char_timestamp.py b/tests/system-test/2-query/func_to_char_timestamp.py new file mode 100644 index 0000000000..639811d275 --- /dev/null +++ b/tests/system-test/2-query/func_to_char_timestamp.py @@ -0,0 +1,177 @@ +import taos +import sys +import time +import socket +import os +import threading +import math + +from util.log import * +from util.sql import * +from util.cases import * +from util.dnodes import * +from util.common import * +# from tmqCommon import * + +class TDTestCase: + def __init__(self): + self.vgroups = 4 + self.ctbNum = 10 + self.rowsPerTbl = 10000 + self.duraion = '1h' + + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor(), False) + + def create_database(self,tsql, dbName,dropFlag=1,vgroups=2,replica=1, duration:str='1d'): + if dropFlag == 1: + tsql.execute("drop database if exists %s"%(dbName)) + + tsql.execute("create database if not exists %s vgroups %d replica %d duration %s"%(dbName, vgroups, replica, duration)) + tdLog.debug("complete to create database %s"%(dbName)) + return + + def create_stable(self,tsql, paraDict): + colString = tdCom.gen_column_type_str(colname_prefix=paraDict["colPrefix"], column_elm_list=paraDict["colSchema"]) + tagString = tdCom.gen_tag_type_str(tagname_prefix=paraDict["tagPrefix"], tag_elm_list=paraDict["tagSchema"]) + sqlString = f"create table if not exists %s.%s (%s) tags (%s)"%(paraDict["dbName"], paraDict["stbName"], colString, tagString) + tdLog.debug("%s"%(sqlString)) + tsql.execute(sqlString) + return + + def create_ctable(self,tsql=None, dbName='dbx',stbName='stb',ctbPrefix='ctb',ctbNum=1,ctbStartIdx=0): + for i in range(ctbNum): + sqlString = "create table %s.%s%d using %s.%s tags(%d, 'tb%d', 'tb%d', %d, %d, %d)" % \ + (dbName,ctbPrefix,i+ctbStartIdx,dbName,stbName,(i+ctbStartIdx) % 5,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx) + tsql.execute(sqlString) + + tdLog.debug("complete to create %d child tables by %s.%s" %(ctbNum, dbName, stbName)) + return + + def insert_data(self,tsql,dbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs,tsStep): + tdLog.debug("start to insert data ............") + tsql.execute("use %s" %dbName) + pre_insert = "insert into " + sql = pre_insert + + for i in range(ctbNum): + rowsBatched = 0 + sql += " %s%d values "%(ctbPrefix,i) + for j in range(rowsPerTbl): + if i % 3 == 0: + ts_format = 'NULL' + else: + ts_format = "'yyyy-mm-dd hh24:mi:ss'" + + if (i < ctbNum/2): + sql += "(%d, %d, %d, %d,%d,%d,%d,true,'2023-11-01 10:10:%d', %s, 'nchar%d') "%(startTs + j*tsStep, j%10, j%10, j%10, j%10, j%10, j%10, j%10, ts_format, j%10) + else: + sql += "(%d, %d, NULL, %d,NULL,%d,%d,true,NULL , %s, 'nchar%d') "%(startTs + j*tsStep, j%10, j%10, j%10, j%10, ts_format, j%10) + rowsBatched += 1 + if ((rowsBatched == batchNum) or (j == rowsPerTbl - 1)): + tsql.execute(sql) + rowsBatched = 0 + if j < rowsPerTbl - 1: + sql = "insert into %s%d values " %(ctbPrefix,i) + else: + sql = "insert into " + if sql != pre_insert: + tsql.execute(sql) + tdLog.debug("insert data ............ [OK]") + return + + def prepareTestEnv(self): + tdLog.printNoPrefix("======== prepare test env include database, stable, ctables, and insert data: ") + paraDict = {'dbName': 'test', + 'dropFlag': 1, + 'vgroups': 2, + 'stbName': 'meters', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'FLOAT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'smallint', 'count':1},{'type': 'tinyint', 'count':1},{'type': 'bool', 'count':1},{'type': 'varchar', 'len':1024, 'count':2},{'type': 'nchar', 'len':10, 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'nchar', 'len':20, 'count':1},{'type': 'binary', 'len':20, 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'smallint', 'count':1},{'type': 'DOUBLE', 'count':1}], + 'ctbPrefix': 't', + 'ctbStartIdx': 0, + 'ctbNum': 100, + 'rowsPerTbl': 10000, + 'batchNum': 3000, + 'startTs': 1537146000000, + 'tsStep': 600000} + + paraDict['vgroups'] = self.vgroups + paraDict['ctbNum'] = self.ctbNum + paraDict['rowsPerTbl'] = self.rowsPerTbl + + tdLog.info("create database") + self.create_database(tsql=tdSql, dbName=paraDict["dbName"], dropFlag=paraDict["dropFlag"], vgroups=paraDict["vgroups"], replica=self.replicaVar, duration=self.duraion) + + tdLog.info("create stb") + self.create_stable(tsql=tdSql, paraDict=paraDict) + + tdLog.info("create child tables") + self.create_ctable(tsql=tdSql, dbName=paraDict["dbName"], \ + stbName=paraDict["stbName"],ctbPrefix=paraDict["ctbPrefix"],\ + ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict["ctbStartIdx"]) + self.insert_data(tsql=tdSql, dbName=paraDict["dbName"],\ + ctbPrefix=paraDict["ctbPrefix"],ctbNum=paraDict["ctbNum"],\ + rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"],\ + startTs=paraDict["startTs"],tsStep=paraDict["tsStep"]) + return + + def convert_ts_and_check(self, ts_str: str, ts_format: str, expect_ts_char: str, expect_ts: str): + tdSql.query("select to_timestamp('%s', '%s')" % (ts_str, ts_format), queryTimes=1) + tdSql.checkData(0, 0, expect_ts) + tdSql.query("select to_char(to_timestamp('%s', '%s'), '%s')" % (ts_str, ts_format, ts_format), queryTimes=1) + tdSql.checkData(0, 0, expect_ts_char) + + def test_to_timestamp(self): + self.convert_ts_and_check('2023-10-10 12:13:14.123', 'YYYY-MM-DD HH:MI:SS.MS', '2023-10-10 12:13:14.123', '2023-10-10 00:13:14.123000') + self.convert_ts_and_check('2023-10-10 12:00:00.000AM', 'YYYY-DD-MM HH12:MI:SS.MSPM', '2023-10-10 12:00:00.000AM', '2023-10-10 00:00:00.000000') + self.convert_ts_and_check('2023-01-01 12:10:10am', 'yyyy-mm-dd HH12:MI:SSAM', '2023-01-01 12:10:10AM', '2023-1-1 00:10:10.000000') + self.convert_ts_and_check('23-1-01 9:10:10.123p.m.', 'yy-MM-dd HH12:MI:ss.msa.m.', '23-01-01 09:10:10.123p.m.', '2023-1-1 21:10:10.123000') + self.convert_ts_and_check('23-1-01 9:10:10.123.000456.000000789p.m.', 'yy-MM-dd HH12:MI:ss.ms.us.nsa.m.', '23-01-01 09:10:10.123.123000.123000000p.m.', '2023-1-1 21:10:10.123000') + self.convert_ts_and_check(' 23 -1 - 01 \t 21:10:10 . 12 . \t 00045 . 00000078 \t', 'yy-MM-dd HH24:MI:SS.ms.us.ns', '23-01-01 21:10:10.120.120000.120000000', '2023-1-1 21:10:10.120000') + self.convert_ts_and_check(' 23 年 -1 月 - 01 日 \t 21:10:10 . 12 . \t 00045 . 00000078 \t+08', 'yy\"年\"-MM月-dd日 HH24:MI:SS.ms.us.ns TZH', '23年-01月-01日 21:10:10.120.120000.120000000 +08', '2023-1-1 21:10:10.120000') + self.convert_ts_and_check('23-1-01 7:10:10.123p.m.6', 'yy-MM-dd HH:MI:ss.msa.m.TZH', '23-01-01 09:10:10.123p.m.+08', '2023-1-1 21:10:10.123000') + + self.convert_ts_and_check('2023-OCTober-19 10:10:10AM Thu', 'yyyy-month-dd hh24:mi:ssam dy', '2023-october -19 10:10:10am thu', '2023-10-19 10:10:10') + + tdSql.error("select to_timestamp('210013/2', 'yyyyMM/dd')") + tdSql.error("select to_timestamp('2100111111111/13/2', 'yyyyMM/dd')") + + tdSql.error("select to_timestamp('210a12/2', 'yyyyMM/dd')") + + tdSql.query("select to_timestamp(to_char(ts, 'yy-mon-dd hh24:mi:ss dy'), 'yy-mon-dd hh24:mi:ss dy') == ts from meters limit 10") + tdSql.checkData(0, 0, 1) + tdSql.checkData(1, 0, 1) + tdSql.checkRows(10) + + tdSql.query("select to_char(ts, 'yy-mon-dd hh24:mi:ss.msa.m.TZH Day') from meters where to_timestamp(to_char(ts, 'yy-mon-dd hh24:mi:ss dy'), 'yy-mon-dd hh24:mi:ss dy') != ts") + tdSql.checkRows(0) + + tdSql.query("select to_timestamp(c8, 'YYYY-MM-DD hh24:mi:ss') from meters") + tdSql.query("select to_timestamp(c8, c9) from meters") + + format = "YYYY-MM-DD HH:MI:SS" + for i in range(500): + format = format + "1234567890" + tdSql.query("select to_char(ts, '%s') from meters" % (format), queryTimes=1) + time_str = '2023-11-11 10:10:10' + for i in range(500): + time_str = time_str + "1234567890" + tdSql.query("select to_timestamp('%s', '%s')" % (time_str, format)) + + def run(self): + self.prepareTestEnv() + self.test_to_timestamp() + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +event = threading.Event() + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) diff --git a/tests/system-test/2-query/select_null.py b/tests/system-test/2-query/select_null.py index 68eea8bc67..e20f6131c9 100755 --- a/tests/system-test/2-query/select_null.py +++ b/tests/system-test/2-query/select_null.py @@ -432,10 +432,39 @@ class TDTestCase: self.ts_3036("%s" %self.db) + self.test_select_as_chinese_characters(); endTime = time.time() print("total time %ds" % (endTime - startTime)) + def test_select_as_chinese_characters(self): + tdSql.execute("use sel_null") + tdSql.query("select ts as 时间戳, c0 as c第一列, t0 标签1 from sel_null.stb0_0 limit 10", queryTimes=1) + tdSql.checkRows(10) + tdSql.query("select 时间戳 from (select ts as 时间戳, c0 as c第一列, t0 标签1 from sel_null.stb0_0) where 时间戳 > '2023-1-1' and c第一列 != 0 and 标签1 == 0 limit 10", queryTimes=1) + tdSql.checkRows(10) + tdSql.query("select count(*) as 计数 from sel_null.stb0_0 partition by c0 as 分组列", queryTimes=1) + tdSql.error("create database 数据库") + tdSql.error("create table sel_null.中文库 (ts timestamp, c2 int)") + tdSql.error("create table sel_null.table1(ts timestamp, 列2 int)") + tdSql.execute("create stable sel_null.stable1(ts timestamp, `值` int) tags(`标签1` int, `标签2` int)") + tdSql.execute('insert into sel_null.ct1 using sel_null.stable1 tags(1, 1) values(now, 1)', queryTimes=1) + tdSql.execute('insert into sel_null.ct1 using sel_null.stable1 tags(2, 2) values(now, 2)', queryTimes=1) + tdSql.execute('insert into sel_null.ct1 using sel_null.stable1 tags(2, 2) values(now, 3)', queryTimes=1) + tdSql.query('select 值 , 标签1 from sel_null.stable1', queryTimes=1) + tdSql.query('select case 值 when 标签1 then 标签1 else 标签2 end from sel_null.stable1', queryTimes=1) + tdSql.query('select count(*) from sel_null.stable1 group by 值 having sum(标签1) > 0', queryTimes=1) + tdSql.query('show table tags `标签1` 标签n from sel_null.stable1', queryTimes=1) + tdSql.query('create sma index a on sel_null.stable1 FUNCTION (sum(值)) interval(1s)', queryTimes=1) + tdSql.query('select count(值) from sel_null.stable1', queryTimes=1) + tdSql.query('select stable1.值 from sel_null.stable1', queryTimes=1) + tdSql.query('select stable1.值 from sel_null.stable1 order by 值', queryTimes=1) + tdSql.execute('create stable sel_null.join_stable(`时间戳` timestamp, c1 int) tags(`标签1` int)', queryTimes=1) + tdSql.query('select a.值 from sel_null.stable1 a join sel_null.join_stable b on a.ts = 时间戳;', queryTimes=1) + tdSql.query('select a.值 from sel_null.stable1 a join sel_null.join_stable b on a.ts = b.时间戳;', queryTimes=1) + tdSql.execute('create user user1 pass "asd"', queryTimes=1) + tdSql.execute('grant write on sel_null.stable1 with 标签1 = 1 to user1',queryTimes=1) + tdSql.execute('select count(*) from sel_null.stable1 state_window(值)', queryTimes=1) def stop(self): tdSql.close() diff --git a/tests/system-test/8-stream/max_delay_session.py b/tests/system-test/8-stream/max_delay_session.py index 1a734e0e61..46c4c5801d 100644 --- a/tests/system-test/8-stream/max_delay_session.py +++ b/tests/system-test/8-stream/max_delay_session.py @@ -35,6 +35,8 @@ class TDTestCase: self.tdCom.create_stream(stream_name=f'{self.ctb_name}{self.tdCom.stream_suffix}', des_table=self.ctb_stream_des_table, source_sql=f'select _wstart AS wstart, _wend AS wend, {self.tdCom.stb_source_select_str} from {self.ctb_name} session(ts, {self.tdCom.dataDict["session"]}s)', trigger_mode="max_delay", watermark=watermark_value, max_delay=max_delay_value, fill_history_value=fill_history_value) self.tdCom.create_stream(stream_name=f'{self.tb_name}{self.tdCom.stream_suffix}', des_table=self.tb_stream_des_table, source_sql=f'select _wstart AS wstart, _wend AS wend, {self.tdCom.tb_source_select_str} from {self.tb_name} session(ts, {self.tdCom.dataDict["session"]}s)', trigger_mode="max_delay", watermark=watermark_value, max_delay=max_delay_value, fill_history_value=fill_history_value) init_num = 0 + time.sleep(1) + for i in range(self.tdCom.range_count): if i == 0: window_close_ts = self.tdCom.cal_watermark_window_close_session_endts(self.tdCom.date_time, self.tdCom.dataDict['watermark'], self.tdCom.dataDict['session']) diff --git a/tests/system-test/8-stream/scalar_function.py b/tests/system-test/8-stream/scalar_function.py index 3bc44a7dc7..eda643f661 100644 --- a/tests/system-test/8-stream/scalar_function.py +++ b/tests/system-test/8-stream/scalar_function.py @@ -7,7 +7,7 @@ from util.common import * class TDTestCase: updatecfgDict = {'vdebugFlag': 143, 'qdebugflag':135, 'tqdebugflag':135, 'udebugflag':135, 'rpcdebugflag':135, - 'asynclog': 0} + 'asynclog': 0, 'stdebugflag':135} def init(self, conn, logSql, replicaVar=1): self.replicaVar = int(replicaVar) tdLog.debug("start to execute %s" % __file__) diff --git a/tests/system-test/test.py b/tests/system-test/test.py index 6813530a5c..81f98fea22 100644 --- a/tests/system-test/test.py +++ b/tests/system-test/test.py @@ -398,7 +398,7 @@ if __name__ == "__main__": tdDnodes.setValgrind(valgrind) tdDnodes.stopAll() for dnode in tdDnodes.dnodes: - tdDnodes.deploy(dnode.index,{}) + tdDnodes.deploy(dnode.index, updateCfgDict) for dnode in tdDnodes.dnodes: tdDnodes.starttaosd(dnode.index) tdCases.logSql(logSql) diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c index a7f79fc9db..3b150230e7 100644 --- a/tools/shell/src/shellEngine.c +++ b/tools/shell/src/shellEngine.c @@ -22,6 +22,23 @@ #include "shellAuto.h" #include "shellInt.h" +typedef struct { + const char *sql; + bool vertical; + tsem_t sem; + int64_t numOfRows; // the num of this batch + int64_t numOfAllRows; + + int32_t numFields; + TAOS_FIELD *fields; + int32_t precision; + + int32_t maxColNameLen; // for vertical print + int32_t width[TSDB_MAX_COLUMNS]; // for horizontal print + + uint64_t resShowMaxNum; +} tsDumpInfo; + static bool shellIsEmptyCommand(const char *cmd); static int32_t shellRunSingleCommand(char *command); static void shellRecordCommandToHistory(char *command); @@ -31,8 +48,8 @@ static char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision); static int64_t shellDumpResultToFile(const char *fname, TAOS_RES *tres); static void shellPrintNChar(const char *str, int32_t length, int32_t width); static void shellPrintGeometry(const unsigned char *str, int32_t length, int32_t width); -static int64_t shellVerticalPrintResult(TAOS_RES *tres, const char *sql); -static int64_t shellHorizontalPrintResult(TAOS_RES *tres, const char *sql); +static void shellVerticalPrintResult(TAOS_RES *tres, tsDumpInfo* dump_info); +static void shellHorizontalPrintResult(TAOS_RES *tres, tsDumpInfo* dump_info); static int64_t shellDumpResult(TAOS_RES *tres, char *fname, int32_t *error_no, bool vertical, const char *sql); static void shellReadHistory(); static void shellWriteHistory(); @@ -702,49 +719,67 @@ bool shellIsShowQuery(const char *sql) { return false; } -int64_t shellVerticalPrintResult(TAOS_RES *tres, const char *sql) { - TAOS_ROW row = taos_fetch_row(tres); - if (row == NULL) { - return 0; +void init_dump_info(tsDumpInfo *dump_info, TAOS_RES *tres, const char *sql, bool vertical) { + dump_info->sql = sql; + dump_info->vertical = vertical; + tsem_init(&dump_info->sem, 0, 0); + dump_info->numOfAllRows = 0; + + dump_info->numFields = taos_num_fields(tres); + dump_info->fields = taos_fetch_fields(tres); + dump_info->precision = taos_result_precision(tres); + + dump_info->resShowMaxNum = UINT64_MAX; + + if (shell.args.commands == NULL && shell.args.file[0] == 0 && !shellIsShowWhole(dump_info->sql)) { + dump_info->resShowMaxNum = SHELL_DEFAULT_RES_SHOW_NUM; } - int32_t num_fields = taos_num_fields(tres); - TAOS_FIELD *fields = taos_fetch_fields(tres); - int32_t precision = taos_result_precision(tres); - - int32_t maxColNameLen = 0; - for (int32_t col = 0; col < num_fields; col++) { - int32_t len = (int32_t)strlen(fields[col].name); - if (len > maxColNameLen) { - maxColNameLen = len; + if (vertical) { + dump_info->maxColNameLen = 0; + for (int32_t col = 0; col < dump_info->numFields; col++) { + int32_t len = (int32_t)strlen(dump_info->fields[col].name); + if (len > dump_info->maxColNameLen) { + dump_info->maxColNameLen = len; + } + } + } else { + for (int32_t col = 0; col < dump_info->numFields; col++) { + dump_info->width[col] = shellCalcColWidth(dump_info->fields + col, dump_info->precision); } } +} - uint64_t resShowMaxNum = UINT64_MAX; - - if (shell.args.commands == NULL && shell.args.file[0] == 0 && !shellIsShowWhole(sql)) { - resShowMaxNum = SHELL_DEFAULT_RES_SHOW_NUM; +void shellVerticalPrintResult(TAOS_RES *tres, tsDumpInfo *dump_info) { + TAOS_ROW row = taos_fetch_row(tres); + if (row == NULL) { + printf("\033[31mtaos_fetch_row failed.\033[0m\n"); + return; } - int64_t numOfRows = 0; - int32_t showMore = 1; - do { - if (numOfRows < resShowMaxNum) { - printf("*************************** %"PRId64".row ***************************\r\n", numOfRows + 1); + int64_t numOfPintRows = dump_info->numOfAllRows; + int numOfPrintRowsThisOne = 0; - int32_t *length = taos_fetch_lengths(tres); + while (row != NULL) { + printf("*************************** %" PRId64 ".row ***************************\r\n", numOfPintRows + 1); - for (int32_t i = 0; i < num_fields; i++) { - TAOS_FIELD *field = fields + i; + int32_t *length = taos_fetch_lengths(tres); - int32_t padding = (int32_t)(maxColNameLen - strlen(field->name)); - printf("%*.s%s: ", padding, " ", field->name); + for (int32_t i = 0; i < dump_info->numFields; i++) { + TAOS_FIELD *field = dump_info->fields + i; - shellPrintField((const char *)row[i], field, 0, length[i], precision); - putchar('\r'); - putchar('\n'); - } - } else if (showMore) { + int32_t padding = (int32_t)(dump_info->maxColNameLen - strlen(field->name)); + printf("%*.s%s: ", padding, " ", field->name); + + shellPrintField((const char *)row[i], field, 0, length[i], dump_info->precision); + putchar('\r'); + putchar('\n'); + } + + numOfPintRows++; + numOfPrintRowsThisOne++; + + if (numOfPintRows == dump_info->resShowMaxNum) { printf("\r\n"); printf(" Notice: The result shows only the first %d rows.\r\n", SHELL_DEFAULT_RES_SHOW_NUM); printf(" You can use the `LIMIT` clause to get fewer result to show.\r\n"); @@ -752,14 +787,16 @@ int64_t shellVerticalPrintResult(TAOS_RES *tres, const char *sql) { printf("\r\n"); printf(" You can use Ctrl+C to stop the underway fetching.\r\n"); printf("\r\n"); - showMore = 0; + return; } - numOfRows++; - row = taos_fetch_row(tres); - } while (row != NULL); + if (numOfPrintRowsThisOne == dump_info->numOfRows) { + return; + } - return numOfRows; + row = taos_fetch_row(tres); + } + return; } int32_t shellCalcColWidth(TAOS_FIELD *field, int32_t precision) { @@ -856,47 +893,38 @@ void shellPrintHeader(TAOS_FIELD *fields, int32_t *width, int32_t num_fields) { putchar('\n'); } -int64_t shellHorizontalPrintResult(TAOS_RES *tres, const char *sql) { +void shellHorizontalPrintResult(TAOS_RES *tres, tsDumpInfo *dump_info) { TAOS_ROW row = taos_fetch_row(tres); if (row == NULL) { - return 0; + printf("\033[31mtaos_fetch_row failed.\033[0m\n"); + return; } - int32_t num_fields = taos_num_fields(tres); - TAOS_FIELD *fields = taos_fetch_fields(tres); - int32_t precision = taos_result_precision(tres); - - int32_t width[TSDB_MAX_COLUMNS]; - for (int32_t col = 0; col < num_fields; col++) { - width[col] = shellCalcColWidth(fields + col, precision); + int64_t numOfPintRows = dump_info->numOfAllRows; + int numOfPrintRowsThisOne = 0; + if (numOfPintRows == 0) { + shellPrintHeader(dump_info->fields, dump_info->width, dump_info->numFields); } - shellPrintHeader(fields, width, num_fields); - - uint64_t resShowMaxNum = UINT64_MAX; - - if (shell.args.commands == NULL && shell.args.file[0] == 0 && !shellIsShowWhole(sql)) { - resShowMaxNum = SHELL_DEFAULT_RES_SHOW_NUM; - } - - int64_t numOfRows = 0; - int32_t showMore = 1; - - do { + while (row != NULL) { int32_t *length = taos_fetch_lengths(tres); - if (numOfRows < resShowMaxNum) { - for (int32_t i = 0; i < num_fields; i++) { - putchar(' '); - shellPrintField((const char *)row[i], fields + i, width[i], length[i], precision); - putchar(' '); - putchar('|'); - } - putchar('\r'); - putchar('\n'); - } else if (showMore) { + for (int32_t i = 0; i < dump_info->numFields; i++) { + putchar(' '); + shellPrintField((const char *)row[i], dump_info->fields + i, dump_info->width[i], length[i], + dump_info->precision); + putchar(' '); + putchar('|'); + } + putchar('\r'); + putchar('\n'); + + numOfPintRows++; + numOfPrintRowsThisOne++; + + if (numOfPintRows == dump_info->resShowMaxNum) { printf("\r\n"); printf(" Notice: The result shows only the first %d rows.\r\n", SHELL_DEFAULT_RES_SHOW_NUM); - if (shellIsShowQuery(sql)) { + if (shellIsShowQuery(dump_info->sql)) { printf(" You can use '>>' to redirect the whole set of the result to a specified file.\r\n"); } else { printf(" You can use the `LIMIT` clause to get fewer result to show.\r\n"); @@ -905,28 +933,53 @@ int64_t shellHorizontalPrintResult(TAOS_RES *tres, const char *sql) { printf("\r\n"); printf(" You can use Ctrl+C to stop the underway fetching.\r\n"); printf("\r\n"); - showMore = 0; + return; } - numOfRows++; - row = taos_fetch_row(tres); - } while (row != NULL); + if (numOfPrintRowsThisOne == dump_info->numOfRows) { + return; + } - return numOfRows; + row = taos_fetch_row(tres); + } + return; +} + +void shellDumpResultCallback(void *param, TAOS_RES *tres, int num_of_rows) { + tsDumpInfo *dump_info = (tsDumpInfo *)param; + if (num_of_rows > 0) { + dump_info->numOfRows = num_of_rows; + if (dump_info->numOfAllRows < dump_info->resShowMaxNum) { + if (dump_info->vertical) { + shellVerticalPrintResult(tres, dump_info); + } else { + shellHorizontalPrintResult(tres, dump_info); + } + } + dump_info->numOfAllRows += num_of_rows; + taos_fetch_rows_a(tres, shellDumpResultCallback, param); + } else { + if (num_of_rows < 0) { + printf("\033[31masync retrieve failed, code: %d\033[0m\n", num_of_rows); + } + tsem_post(&dump_info->sem); + } } int64_t shellDumpResult(TAOS_RES *tres, char *fname, int32_t *error_no, bool vertical, const char *sql) { - int64_t numOfRows = 0; + int64_t num_of_rows = 0; if (fname != NULL) { - numOfRows = shellDumpResultToFile(fname, tres); - } else if (vertical) { - numOfRows = shellVerticalPrintResult(tres, sql); + num_of_rows = shellDumpResultToFile(fname, tres); } else { - numOfRows = shellHorizontalPrintResult(tres, sql); + tsDumpInfo dump_info; + init_dump_info(&dump_info, tres, sql, vertical); + taos_fetch_rows_a(tres, shellDumpResultCallback, &dump_info); + tsem_wait(&dump_info.sem); + num_of_rows = dump_info.numOfAllRows; } *error_no = taos_errno(tres); - return numOfRows; + return num_of_rows; } void shellReadHistory() {