diff --git a/cmake/cmake.define b/cmake/cmake.define index b5d5c6d957facdb41a934c130ba11a451b37bd6a..1cc28ec6fdd0f522534493788f25a45a1945a031 100644 --- a/cmake/cmake.define +++ b/cmake/cmake.define @@ -97,10 +97,10 @@ ELSE () SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") ENDIF () - IF (${SANITIZER} MATCHES "true") + IF (${BUILD_SANITIZER}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0") - MESSAGE(STATUS "Will compile with Address Sanitizer!") + MESSAGE(STATUS "Will compile with Address Sanitizer!") ELSE () SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=0") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=0") diff --git a/cmake/cmake.options b/cmake/cmake.options index 09236a5b87cc862097403036c2a9609c99ca52bd..e013ff759239c8861b9601e79f0b3bcf11c8f618 100644 --- a/cmake/cmake.options +++ b/cmake/cmake.options @@ -77,6 +77,12 @@ ELSE () ENDIF () ENDIF () +option( + BUILD_SANITIZER + "If build addr2line" + OFF + ) + option( BUILD_ADDR2LINE "If build addr2line" diff --git a/docs/en/25-application/03-immigrate.md b/docs/en/25-application/03-immigrate.md index 4d47aec1d76014ba63f6be91004abcc3934769f7..fe67f973894d460fb017de0e1a2099b8441a4abe 100644 --- a/docs/en/25-application/03-immigrate.md +++ b/docs/en/25-application/03-immigrate.md @@ -379,11 +379,11 @@ We still use the hypothetical environment from Chapter 4. There are three measur ### Storage resource estimation -Assuming that the number of sensor devices that generate data and need to be stored is `n`, the frequency of data generation is `t` per second, and the length of each record is `L` bytes, the scale of data generated per day is `n * t * L` bytes. Assuming the compression ratio is `C`, the daily data size is `(n * t * L)/C` bytes. The storage resources are estimated to accommodate the data scale for 1.5 years. In the production environment, the compression ratio C of TDengine is generally between 5 and 7. +Assuming that the number of sensor devices that generate data and need to be stored is `n`, the frequency of data generation is `t` per second, and the length of each record is `L` bytes, the scale of data generated per day is `86400 * n * t * L` bytes. Assuming the compression ratio is `C`, the daily data size is `(86400 * n * t * L)/C` bytes. The storage resources are estimated to accommodate the data scale for 1.5 years. In the production environment, the compression ratio C of TDengine is generally between 5 and 7. With additional 20% redundancy, you can calculate the required storage resources: ```matlab -(n * t * L) * (365 * 1.5) * (1+20%)/C +(86400 * n * t * L) * (365 * 1.5) * (1+20%)/C ```` Substituting in the above formula, the raw data generated every year is 11.8TB without considering the label information. Note that tag information is associated with each timeline in TDengine, not every record. The amount of data to be recorded is somewhat reduced relative to the generated data, and label data can be ignored as a whole. Assuming a compression ratio of 5, the size of the retained data ends up being 2.56 TB. diff --git a/docs/zh/25-application/03-immigrate.md b/docs/zh/25-application/03-immigrate.md index 9d8946bc4a69639c5327ac1ffb6c0539ddbd0e63..d1c9caea099b79494784aa1122e89d7b4d412464 100644 --- a/docs/zh/25-application/03-immigrate.md +++ b/docs/zh/25-application/03-immigrate.md @@ -367,10 +367,10 @@ WHERE ts>=1510560000 AND ts<=1515000009 ### 存储资源估算 -假设产生数据并需要存储的传感器设备数量为 `n`,数据生成的频率为`t`条/秒,每条记录的长度为 `L` bytes,则每天产生的数据规模为 `n×t×L` bytes。假设压缩比为 C,则每日产生数据规模为 `(n×t×L)/C` bytes。存储资源预估为能够容纳 1.5 年的数据规模,生产环境下 TDengine 的压缩比 C 一般在 5 ~ 7 之间,同时为最后结果增加 20% 的冗余,可计算得到需要存储资源: +假设产生数据并需要存储的传感器设备数量为 `n`,数据生成的频率为`t`条/秒,每条记录的长度为 `L` bytes,则每天产生的数据规模为 `86400×n×t×L` bytes。假设压缩比为 C,则每日产生数据规模为 `(86400×n×t×L)/C` bytes。存储资源预估为能够容纳 1.5 年的数据规模,生产环境下 TDengine 的压缩比 C 一般在 5 ~ 7 之间,同时为最后结果增加 20% 的冗余,可计算得到需要存储资源: ```matlab -(n×t×L)×(365×1.5)×(1+20%)/C +(86400×n×t×L)×(365×1.5)×(1+20%)/C ``` 结合以上的计算公式,将参数带入计算公式,在不考虑标签信息的情况下,每年产生的原始数据规模是 11.8TB。需要注意的是,由于标签信息在 TDengine 中关联到每个时间线,并不是每条记录。所以需要记录的数据量规模相对于产生的数据有一定的降低,而这部分标签数据整体上可以忽略不记。假设压缩比为 5,则保留的数据规模最终为 2.56 TB。 diff --git a/examples/c/tmq.c b/examples/c/tmq.c index 89be847f8e1dc34d09871aa7de279b7749127efb..74efb4c02618cfcfe55760ff8788760e9067acdd 100644 --- a/examples/c/tmq.c +++ b/examples/c/tmq.c @@ -241,7 +241,7 @@ int32_t create_topic() { taos_free_result(pRes); pRes = taos_query(pConn, "create topic topic_ctb_column with meta as database abc1"); -// pRes = taos_query(pConn, "create topic topic_ctb_column as select ts, c1, c2, c3 from st1"); + /*pRes = taos_query(pConn, "create topic topic_ctb_column as select ts, c1, c2, c3 from st1");*/ if (taos_errno(pRes) != 0) { printf("failed to create topic topic_ctb_column, reason:%s\n", taos_errstr(pRes)); return -1; @@ -302,7 +302,7 @@ tmq_t* build_consumer() { tmq_conf_set(conf, "msg.with.table.name", "true"); tmq_conf_set(conf, "enable.auto.commit", "true"); - tmq_conf_set(conf, "experimental.snapshot.enable", "false"); + /*tmq_conf_set(conf, "experimental.snapshot.enable", "true");*/ tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL); tmq_t* tmq = tmq_consumer_new(conf, NULL, 0); diff --git a/include/common/tcommon.h b/include/common/tcommon.h index 083ded88870f4430bd18a66e21ebd1f5c0e11e3f..779453f714b6ce835b61909f59aad3a510628a00 100644 --- a/include/common/tcommon.h +++ b/include/common/tcommon.h @@ -32,6 +32,18 @@ enum { TMQ_CONF__RESET_OFFSET__LATEST = -1, }; +// clang-format off +#define IS_META_MSG(x) ( \ + x == TDMT_VND_CREATE_STB \ + || x == TDMT_VND_ALTER_STB \ + || x == TDMT_VND_DROP_STB \ + || x == TDMT_VND_CREATE_TABLE \ + || x == TDMT_VND_ALTER_TABLE \ + || x == TDMT_VND_DROP_TABLE \ + || x == TDMT_VND_DROP_TTL_TABLE \ +) +// clang-format on + enum { TMQ_MSG_TYPE__DUMMY = 0, TMQ_MSG_TYPE__POLL_RSP, @@ -76,8 +88,6 @@ typedef struct { #pragma pack(push, 1) typedef struct SColumnDataAgg { int16_t colId; - int16_t minIndex; - int16_t maxIndex; int16_t numOfNull; int64_t sum; int64_t max; @@ -105,6 +115,20 @@ typedef struct SSDataBlock { SDataBlockInfo info; } SSDataBlock; +enum { + FETCH_TYPE__DATA = 1, + FETCH_TYPE__META, + FETCH_TYPE__NONE, +}; + +typedef struct { + int8_t fetchType; + union { + SSDataBlock data; + void* meta; + }; +} SFetchRet; + typedef struct SVarColAttr { int32_t* offset; // start position for each entry in the list uint32_t length; // used buffer size that contain the valid data diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 8988459637bb486fd5357981d8eed695aaa3c7a9..20f9503150349439b0bbbca0cd5d33ff3032e85a 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -57,8 +57,8 @@ extern int32_t tMsgDict[]; #define TMSG_SEG_SEQ(TYPE) ((TYPE)&0xff) #define TMSG_INFO(TYPE) \ ((TYPE) >= 0 && \ - ((TYPE) < TDMT_DND_MAX_MSG | (TYPE) < TDMT_MND_MAX_MSG | (TYPE) < TDMT_VND_MAX_MSG | (TYPE) < TDMT_SCH_MAX_MSG | \ - (TYPE) < TDMT_STREAM_MAX_MSG | (TYPE) < TDMT_MON_MAX_MSG | (TYPE) < TDMT_SYNC_MAX_MSG)) \ + ((TYPE) < TDMT_DND_MAX_MSG || (TYPE) < TDMT_MND_MAX_MSG || (TYPE) < TDMT_VND_MAX_MSG || (TYPE) < TDMT_SCH_MAX_MSG || \ + (TYPE) < TDMT_STREAM_MAX_MSG || (TYPE) < TDMT_MON_MAX_MSG || (TYPE) < TDMT_SYNC_MAX_MSG)) \ ? tMsgInfo[tMsgDict[TMSG_SEG_CODE(TYPE)] + TMSG_SEG_SEQ(TYPE)] \ : 0 #define TMSG_INDEX(TYPE) (tMsgDict[TMSG_SEG_CODE(TYPE)] + TMSG_SEG_SEQ(TYPE)) @@ -665,6 +665,7 @@ typedef struct { char tbFName[TSDB_TABLE_FNAME_LEN]; int32_t sversion; int32_t tversion; + int64_t affectedRows; } SQueryTableRsp; int32_t tSerializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp); @@ -1510,6 +1511,7 @@ typedef struct SSubQueryMsg { int32_t execId; int8_t taskType; int8_t explain; + int8_t needFetch; uint32_t sqlLen; // the query sql, uint32_t phyLen; char msg[]; @@ -2826,8 +2828,8 @@ typedef struct { static FORCE_INLINE int32_t tEncodeSMqMetaRsp(void** buf, const SMqMetaRsp* pRsp) { int32_t tlen = 0; - tlen += taosEncodeFixedI64(buf, pRsp->reqOffset); - tlen += taosEncodeFixedI64(buf, pRsp->rspOffset); + // tlen += taosEncodeFixedI64(buf, pRsp->reqOffset); + // tlen += taosEncodeFixedI64(buf, pRsp->rspOffset); tlen += taosEncodeFixedI16(buf, pRsp->resMsgType); tlen += taosEncodeFixedI32(buf, pRsp->metaRspLen); tlen += taosEncodeBinary(buf, pRsp->metaRsp, pRsp->metaRspLen); @@ -2835,8 +2837,8 @@ static FORCE_INLINE int32_t tEncodeSMqMetaRsp(void** buf, const SMqMetaRsp* pRsp } static FORCE_INLINE void* tDecodeSMqMetaRsp(const void* buf, SMqMetaRsp* pRsp) { - buf = taosDecodeFixedI64(buf, &pRsp->reqOffset); - buf = taosDecodeFixedI64(buf, &pRsp->rspOffset); + // buf = taosDecodeFixedI64(buf, &pRsp->reqOffset); + // buf = taosDecodeFixedI64(buf, &pRsp->rspOffset); buf = taosDecodeFixedI16(buf, &pRsp->resMsgType); buf = taosDecodeFixedI32(buf, &pRsp->metaRspLen); buf = taosDecodeBinary(buf, &pRsp->metaRsp, pRsp->metaRspLen); diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index a5651f96f472603412497a27d88c35b20666d343..5deec2d5f67700f442d26109d40ee6dc629c68ef 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -79,195 +79,196 @@ #define TK_EXISTS 61 #define TK_BUFFER 62 #define TK_CACHELAST 63 -#define TK_COMP 64 -#define TK_DURATION 65 -#define TK_NK_VARIABLE 66 -#define TK_FSYNC 67 -#define TK_MAXROWS 68 -#define TK_MINROWS 69 -#define TK_KEEP 70 -#define TK_PAGES 71 -#define TK_PAGESIZE 72 -#define TK_PRECISION 73 -#define TK_REPLICA 74 -#define TK_STRICT 75 -#define TK_WAL 76 -#define TK_VGROUPS 77 -#define TK_SINGLE_STABLE 78 -#define TK_RETENTIONS 79 -#define TK_SCHEMALESS 80 -#define TK_NK_COLON 81 -#define TK_TABLE 82 -#define TK_NK_LP 83 -#define TK_NK_RP 84 -#define TK_STABLE 85 -#define TK_ADD 86 -#define TK_COLUMN 87 -#define TK_MODIFY 88 -#define TK_RENAME 89 -#define TK_TAG 90 -#define TK_SET 91 -#define TK_NK_EQ 92 -#define TK_USING 93 -#define TK_TAGS 94 -#define TK_COMMENT 95 -#define TK_BOOL 96 -#define TK_TINYINT 97 -#define TK_SMALLINT 98 -#define TK_INT 99 -#define TK_INTEGER 100 -#define TK_BIGINT 101 -#define TK_FLOAT 102 -#define TK_DOUBLE 103 -#define TK_BINARY 104 -#define TK_TIMESTAMP 105 -#define TK_NCHAR 106 -#define TK_UNSIGNED 107 -#define TK_JSON 108 -#define TK_VARCHAR 109 -#define TK_MEDIUMBLOB 110 -#define TK_BLOB 111 -#define TK_VARBINARY 112 -#define TK_DECIMAL 113 -#define TK_MAX_DELAY 114 -#define TK_WATERMARK 115 -#define TK_ROLLUP 116 -#define TK_TTL 117 -#define TK_SMA 118 -#define TK_FIRST 119 -#define TK_LAST 120 -#define TK_SHOW 121 -#define TK_DATABASES 122 -#define TK_TABLES 123 -#define TK_STABLES 124 -#define TK_MNODES 125 -#define TK_MODULES 126 -#define TK_QNODES 127 -#define TK_FUNCTIONS 128 -#define TK_INDEXES 129 -#define TK_ACCOUNTS 130 -#define TK_APPS 131 -#define TK_CONNECTIONS 132 -#define TK_LICENCE 133 -#define TK_GRANTS 134 -#define TK_QUERIES 135 -#define TK_SCORES 136 -#define TK_TOPICS 137 -#define TK_VARIABLES 138 -#define TK_BNODES 139 -#define TK_SNODES 140 -#define TK_CLUSTER 141 -#define TK_TRANSACTIONS 142 -#define TK_DISTRIBUTED 143 -#define TK_CONSUMERS 144 -#define TK_SUBSCRIPTIONS 145 -#define TK_LIKE 146 -#define TK_INDEX 147 -#define TK_FUNCTION 148 -#define TK_INTERVAL 149 -#define TK_TOPIC 150 -#define TK_AS 151 -#define TK_WITH 152 -#define TK_META 153 -#define TK_CONSUMER 154 -#define TK_GROUP 155 -#define TK_DESC 156 -#define TK_DESCRIBE 157 -#define TK_RESET 158 -#define TK_QUERY 159 -#define TK_CACHE 160 -#define TK_EXPLAIN 161 -#define TK_ANALYZE 162 -#define TK_VERBOSE 163 -#define TK_NK_BOOL 164 -#define TK_RATIO 165 -#define TK_NK_FLOAT 166 -#define TK_COMPACT 167 -#define TK_VNODES 168 -#define TK_IN 169 -#define TK_OUTPUTTYPE 170 -#define TK_AGGREGATE 171 -#define TK_BUFSIZE 172 -#define TK_STREAM 173 -#define TK_INTO 174 -#define TK_TRIGGER 175 -#define TK_AT_ONCE 176 -#define TK_WINDOW_CLOSE 177 -#define TK_IGNORE 178 -#define TK_EXPIRED 179 -#define TK_KILL 180 -#define TK_CONNECTION 181 -#define TK_TRANSACTION 182 -#define TK_BALANCE 183 -#define TK_VGROUP 184 -#define TK_MERGE 185 -#define TK_REDISTRIBUTE 186 -#define TK_SPLIT 187 -#define TK_SYNCDB 188 -#define TK_DELETE 189 -#define TK_INSERT 190 -#define TK_NULL 191 -#define TK_NK_QUESTION 192 -#define TK_NK_ARROW 193 -#define TK_ROWTS 194 -#define TK_TBNAME 195 -#define TK_QSTARTTS 196 -#define TK_QENDTS 197 -#define TK_WSTARTTS 198 -#define TK_WENDTS 199 -#define TK_WDURATION 200 -#define TK_CAST 201 -#define TK_NOW 202 -#define TK_TODAY 203 -#define TK_TIMEZONE 204 -#define TK_CLIENT_VERSION 205 -#define TK_SERVER_VERSION 206 -#define TK_SERVER_STATUS 207 -#define TK_CURRENT_USER 208 -#define TK_COUNT 209 -#define TK_LAST_ROW 210 -#define TK_BETWEEN 211 -#define TK_IS 212 -#define TK_NK_LT 213 -#define TK_NK_GT 214 -#define TK_NK_LE 215 -#define TK_NK_GE 216 -#define TK_NK_NE 217 -#define TK_MATCH 218 -#define TK_NMATCH 219 -#define TK_CONTAINS 220 -#define TK_JOIN 221 -#define TK_INNER 222 -#define TK_SELECT 223 -#define TK_DISTINCT 224 -#define TK_WHERE 225 -#define TK_PARTITION 226 -#define TK_BY 227 -#define TK_SESSION 228 -#define TK_STATE_WINDOW 229 -#define TK_SLIDING 230 -#define TK_FILL 231 -#define TK_VALUE 232 -#define TK_NONE 233 -#define TK_PREV 234 -#define TK_LINEAR 235 -#define TK_NEXT 236 -#define TK_HAVING 237 -#define TK_RANGE 238 -#define TK_EVERY 239 -#define TK_ORDER 240 -#define TK_SLIMIT 241 -#define TK_SOFFSET 242 -#define TK_LIMIT 243 -#define TK_OFFSET 244 -#define TK_ASC 245 -#define TK_NULLS 246 -#define TK_ID 247 -#define TK_NK_BITNOT 248 -#define TK_VALUES 249 -#define TK_IMPORT 250 -#define TK_NK_SEMI 251 -#define TK_FILE 252 +#define TK_CACHELASTSIZE 64 +#define TK_COMP 65 +#define TK_DURATION 66 +#define TK_NK_VARIABLE 67 +#define TK_FSYNC 68 +#define TK_MAXROWS 69 +#define TK_MINROWS 70 +#define TK_KEEP 71 +#define TK_PAGES 72 +#define TK_PAGESIZE 73 +#define TK_PRECISION 74 +#define TK_REPLICA 75 +#define TK_STRICT 76 +#define TK_WAL 77 +#define TK_VGROUPS 78 +#define TK_SINGLE_STABLE 79 +#define TK_RETENTIONS 80 +#define TK_SCHEMALESS 81 +#define TK_NK_COLON 82 +#define TK_TABLE 83 +#define TK_NK_LP 84 +#define TK_NK_RP 85 +#define TK_STABLE 86 +#define TK_ADD 87 +#define TK_COLUMN 88 +#define TK_MODIFY 89 +#define TK_RENAME 90 +#define TK_TAG 91 +#define TK_SET 92 +#define TK_NK_EQ 93 +#define TK_USING 94 +#define TK_TAGS 95 +#define TK_COMMENT 96 +#define TK_BOOL 97 +#define TK_TINYINT 98 +#define TK_SMALLINT 99 +#define TK_INT 100 +#define TK_INTEGER 101 +#define TK_BIGINT 102 +#define TK_FLOAT 103 +#define TK_DOUBLE 104 +#define TK_BINARY 105 +#define TK_TIMESTAMP 106 +#define TK_NCHAR 107 +#define TK_UNSIGNED 108 +#define TK_JSON 109 +#define TK_VARCHAR 110 +#define TK_MEDIUMBLOB 111 +#define TK_BLOB 112 +#define TK_VARBINARY 113 +#define TK_DECIMAL 114 +#define TK_MAX_DELAY 115 +#define TK_WATERMARK 116 +#define TK_ROLLUP 117 +#define TK_TTL 118 +#define TK_SMA 119 +#define TK_FIRST 120 +#define TK_LAST 121 +#define TK_SHOW 122 +#define TK_DATABASES 123 +#define TK_TABLES 124 +#define TK_STABLES 125 +#define TK_MNODES 126 +#define TK_MODULES 127 +#define TK_QNODES 128 +#define TK_FUNCTIONS 129 +#define TK_INDEXES 130 +#define TK_ACCOUNTS 131 +#define TK_APPS 132 +#define TK_CONNECTIONS 133 +#define TK_LICENCE 134 +#define TK_GRANTS 135 +#define TK_QUERIES 136 +#define TK_SCORES 137 +#define TK_TOPICS 138 +#define TK_VARIABLES 139 +#define TK_BNODES 140 +#define TK_SNODES 141 +#define TK_CLUSTER 142 +#define TK_TRANSACTIONS 143 +#define TK_DISTRIBUTED 144 +#define TK_CONSUMERS 145 +#define TK_SUBSCRIPTIONS 146 +#define TK_LIKE 147 +#define TK_INDEX 148 +#define TK_FUNCTION 149 +#define TK_INTERVAL 150 +#define TK_TOPIC 151 +#define TK_AS 152 +#define TK_WITH 153 +#define TK_META 154 +#define TK_CONSUMER 155 +#define TK_GROUP 156 +#define TK_DESC 157 +#define TK_DESCRIBE 158 +#define TK_RESET 159 +#define TK_QUERY 160 +#define TK_CACHE 161 +#define TK_EXPLAIN 162 +#define TK_ANALYZE 163 +#define TK_VERBOSE 164 +#define TK_NK_BOOL 165 +#define TK_RATIO 166 +#define TK_NK_FLOAT 167 +#define TK_COMPACT 168 +#define TK_VNODES 169 +#define TK_IN 170 +#define TK_OUTPUTTYPE 171 +#define TK_AGGREGATE 172 +#define TK_BUFSIZE 173 +#define TK_STREAM 174 +#define TK_INTO 175 +#define TK_TRIGGER 176 +#define TK_AT_ONCE 177 +#define TK_WINDOW_CLOSE 178 +#define TK_IGNORE 179 +#define TK_EXPIRED 180 +#define TK_KILL 181 +#define TK_CONNECTION 182 +#define TK_TRANSACTION 183 +#define TK_BALANCE 184 +#define TK_VGROUP 185 +#define TK_MERGE 186 +#define TK_REDISTRIBUTE 187 +#define TK_SPLIT 188 +#define TK_SYNCDB 189 +#define TK_DELETE 190 +#define TK_INSERT 191 +#define TK_NULL 192 +#define TK_NK_QUESTION 193 +#define TK_NK_ARROW 194 +#define TK_ROWTS 195 +#define TK_TBNAME 196 +#define TK_QSTARTTS 197 +#define TK_QENDTS 198 +#define TK_WSTARTTS 199 +#define TK_WENDTS 200 +#define TK_WDURATION 201 +#define TK_CAST 202 +#define TK_NOW 203 +#define TK_TODAY 204 +#define TK_TIMEZONE 205 +#define TK_CLIENT_VERSION 206 +#define TK_SERVER_VERSION 207 +#define TK_SERVER_STATUS 208 +#define TK_CURRENT_USER 209 +#define TK_COUNT 210 +#define TK_LAST_ROW 211 +#define TK_BETWEEN 212 +#define TK_IS 213 +#define TK_NK_LT 214 +#define TK_NK_GT 215 +#define TK_NK_LE 216 +#define TK_NK_GE 217 +#define TK_NK_NE 218 +#define TK_MATCH 219 +#define TK_NMATCH 220 +#define TK_CONTAINS 221 +#define TK_JOIN 222 +#define TK_INNER 223 +#define TK_SELECT 224 +#define TK_DISTINCT 225 +#define TK_WHERE 226 +#define TK_PARTITION 227 +#define TK_BY 228 +#define TK_SESSION 229 +#define TK_STATE_WINDOW 230 +#define TK_SLIDING 231 +#define TK_FILL 232 +#define TK_VALUE 233 +#define TK_NONE 234 +#define TK_PREV 235 +#define TK_LINEAR 236 +#define TK_NEXT 237 +#define TK_HAVING 238 +#define TK_RANGE 239 +#define TK_EVERY 240 +#define TK_ORDER 241 +#define TK_SLIMIT 242 +#define TK_SOFFSET 243 +#define TK_LIMIT 244 +#define TK_OFFSET 245 +#define TK_ASC 246 +#define TK_NULLS 247 +#define TK_ID 248 +#define TK_NK_BITNOT 249 +#define TK_VALUES 250 +#define TK_IMPORT 251 +#define TK_NK_SEMI 252 +#define TK_FILE 253 #define TK_NK_SPACE 300 #define TK_NK_COMMENT 301 diff --git a/include/libs/executor/dataSinkMgt.h b/include/libs/executor/dataSinkMgt.h index 957c40f21e455a91cb916229565760782bd15d31..8d5a8abcb4aa595086d5b223e6b8dc028554384f 100644 --- a/include/libs/executor/dataSinkMgt.h +++ b/include/libs/executor/dataSinkMgt.h @@ -45,6 +45,10 @@ typedef struct SDeleterParam { SArray* pUidList; } SDeleterParam; +typedef struct SInserterParam { + SReadHandle* readHandle; +} SInserterParam; + typedef struct SDataSinkStat { uint64_t cachedSize; } SDataSinkStat; @@ -96,7 +100,7 @@ void dsEndPut(DataSinkHandle handle, uint64_t useconds); * @param handle * @param pLen data length */ -void dsGetDataLength(DataSinkHandle handle, int32_t* pLen, bool* pQueryEnd); +void dsGetDataLength(DataSinkHandle handle, int64_t* pLen, bool* pQueryEnd); /** * Get data, the caller needs to allocate data memory. diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 9d09861b8ef82f4e10f3619827c884c8a0db5900..f512587880656dc627b0bad05050f881cd05c4c6 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -30,15 +30,15 @@ struct SRpcMsg; struct SSubplan; typedef struct SReadHandle { - void* reader; + void* tqReader; void* meta; void* config; void* vnode; void* mnd; SMsgCb* pMsgCb; - -// int8_t initTsdbReader; - bool tqReader; + bool initMetaReader; + bool initTableReader; + bool initTqReader; } SReadHandle; typedef enum { @@ -52,7 +52,7 @@ typedef enum { * @param streamReadHandle * @return */ -qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, void* streamReadHandle); +qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers); /** * Switch the stream scan to snapshot mode @@ -157,7 +157,7 @@ int64_t qGetQueriedTableUid(qTaskInfo_t tinfo); */ int32_t qGetQualifiedTableIdList(void* pTableList, const char* tagCond, int32_t tagCondLen, SArray* pTableIdList); -void qProcessFetchRsp(void* parent, struct SRpcMsg* pMsg, struct SEpSet* pEpSet); +void qProcessRspMsg(void* parent, struct SRpcMsg* pMsg, struct SEpSet* pEpSet); int32_t qGetExplainExecInfo(qTaskInfo_t tinfo, int32_t* resNum, SExplainExecInfo** pRes); @@ -176,6 +176,9 @@ int32_t qGetStreamScanStatus(qTaskInfo_t tinfo, uint64_t* uid, int64_t* ts); int32_t qStreamPrepareScan(qTaskInfo_t tinfo, uint64_t uid, int64_t ts); +void* qExtractReaderFromStreamScanner(void* scanner); +int32_t qExtractStreamScanner(qTaskInfo_t tinfo, void** scanner); + #ifdef __cplusplus } #endif diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 90ccbb60cf851b38502325a76bdf0382a2b1aee9..2187a7b03aefb2903da35548fcdc03865fa036ee 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -51,7 +51,8 @@ extern "C" { typedef struct SDatabaseOptions { ENodeType type; int32_t buffer; - int8_t cachelast; + int8_t cacheLast; + int32_t cacheLastSize; int8_t compressionLevel; int32_t daysPerFile; SValueNode* pDaysPerFile; diff --git a/include/libs/qworker/qworker.h b/include/libs/qworker/qworker.h index 71f7622f49f5c3ba376d24af03cc9d21604d1d35..87aefe5187ec7ca61a4de5f6f14adbbf26861dfc 100644 --- a/include/libs/qworker/qworker.h +++ b/include/libs/qworker/qworker.h @@ -67,7 +67,7 @@ int32_t qWorkerProcessCQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, in int32_t qWorkerProcessFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts); -int32_t qWorkerProcessFetchRsp(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts); +int32_t qWorkerProcessRspMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts); int32_t qWorkerProcessCancelMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts); diff --git a/include/libs/stream/tstream.h b/include/libs/stream/tstream.h index 67074c789e3a89c379dab7c19e8aa23a02605fc7..d6cb2c27b02b132b4ab87fdefb545dc6d6cc2fd3 100644 --- a/include/libs/stream/tstream.h +++ b/include/libs/stream/tstream.h @@ -223,7 +223,7 @@ typedef struct { SEpSet epSet; } SStreamChildEpInfo; -struct SStreamTask { +typedef struct SStreamTask { int64_t streamId; int32_t taskId; int8_t isDataScan; @@ -277,7 +277,7 @@ struct SStreamTask { // msg handle SMsgCb* pMsgCb; -}; +} SStreamTask; int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo); int32_t tDecodeStreamEpInfo(SDecoder* pDecoder, SStreamChildEpInfo* pInfo); @@ -288,6 +288,7 @@ int32_t tDecodeSStreamTask(SDecoder* pDecoder, SStreamTask* pTask); void tFreeSStreamTask(SStreamTask* pTask); static FORCE_INLINE int32_t streamTaskInput(SStreamTask* pTask, SStreamQueueItem* pItem) { +#if 0 while (1) { int8_t inputStatus = atomic_val_compare_exchange_8(&pTask->inputStatus, TASK_INPUT_STATUS__NORMAL, TASK_INPUT_STATUS__PROCESSING); @@ -296,6 +297,7 @@ static FORCE_INLINE int32_t streamTaskInput(SStreamTask* pTask, SStreamQueueItem } ASSERT(0); } +#endif if (pItem->type == STREAM_INPUT__DATA_SUBMIT) { SStreamDataSubmit* pSubmitClone = streamSubmitRefClone((SStreamDataSubmit*)pItem); @@ -316,8 +318,10 @@ static FORCE_INLINE int32_t streamTaskInput(SStreamTask* pTask, SStreamQueueItem atomic_val_compare_exchange_8(&pTask->triggerStatus, TASK_TRIGGER_STATUS__IN_ACTIVE, TASK_TRIGGER_STATUS__ACTIVE); } +#if 0 // TODO: back pressure atomic_store_8(&pTask->inputStatus, TASK_INPUT_STATUS__NORMAL); +#endif return 0; } diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index 8a6d6b7722807a004a3e46ec4ed24aa9b6875cbf..bef26cb3102173b6353afd83fa4ae05b3de97803 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -163,9 +163,6 @@ typedef struct SSyncLogStore { // return commit index of log SyncIndex (*getCommitIndex)(struct SSyncLogStore* pLogStore); - // refactor, log[0 .. n] ==> log[m .. n] - // int32_t (*syncLogSetBeginIndex)(struct SSyncLogStore* pLogStore, SyncIndex beginIndex); - SyncIndex (*syncLogBeginIndex)(struct SSyncLogStore* pLogStore); SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore); bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore); diff --git a/include/libs/wal/wal.h b/include/libs/wal/wal.h index c11651970c2894db56d59ee036054179b95444cf..43792b54155b9ab62d589502c1f7d9e2263424f2 100644 --- a/include/libs/wal/wal.h +++ b/include/libs/wal/wal.h @@ -88,7 +88,7 @@ typedef struct { EWalType level; // wal level } SWalCfg; -typedef struct SWalVer { +typedef struct { int64_t firstVer; int64_t verInSnapshotting; int64_t snapshotVer; @@ -149,17 +149,22 @@ typedef struct SWal { SWalCkHead writeHead; } SWal; // WAL HANDLE -typedef struct SWalReadHandle { - SWal *pWal; - TdFilePtr pReadLogTFile; - TdFilePtr pReadIdxTFile; - int64_t curFileFirstVer; - int64_t curVersion; - int64_t capacity; - int64_t status; // if cursor valid - TdThreadMutex mutex; - SWalCkHead *pHead; -} SWalReadHandle; +typedef struct { + int8_t scanUncommited; + int8_t scanMeta; +} SWalFilterCond; + +typedef struct { + SWal *pWal; + TdFilePtr pLogFile; + TdFilePtr pIdxFile; + int64_t curFileFirstVer; + int64_t curVersion; + int64_t capacity; + TdThreadMutex mutex; + SWalFilterCond cond; + SWalCkHead *pHead; +} SWalReader; // module initialization int32_t walInit(); @@ -178,7 +183,6 @@ void walFsync(SWal *, bool force); // apis for lifecycle management int32_t walCommit(SWal *, int64_t ver); -// truncate after int32_t walRollback(SWal *, int64_t ver); // notify that previous logs can be pruned safely int32_t walBeginSnapshot(SWal *, int64_t ver); @@ -187,15 +191,16 @@ int32_t walRestoreFromSnapshot(SWal *, int64_t ver); // int32_t walDataCorrupted(SWal*); // read -SWalReadHandle *walOpenReadHandle(SWal *); -void walCloseReadHandle(SWalReadHandle *); -int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver); +SWalReader *walOpenReader(SWal *, SWalFilterCond *pCond); +void walCloseReader(SWalReader *pRead); +int32_t walReadVer(SWalReader *pRead, int64_t ver); +int32_t walNextValidMsg(SWalReader *pRead); // only for tq usage -void walSetReaderCapacity(SWalReadHandle *pRead, int32_t capacity); -int32_t walFetchHead(SWalReadHandle *pRead, int64_t ver, SWalCkHead *pHead); -int32_t walFetchBody(SWalReadHandle *pRead, SWalCkHead **ppHead); -int32_t walSkipFetchBody(SWalReadHandle *pRead, const SWalCkHead *pHead); +void walSetReaderCapacity(SWalReader *pRead, int32_t capacity); +int32_t walFetchHead(SWalReader *pRead, int64_t ver, SWalCkHead *pHead); +int32_t walFetchBody(SWalReader *pRead, SWalCkHead **ppHead); +int32_t walSkipFetchBody(SWalReader *pRead, const SWalCkHead *pHead); typedef struct { int64_t refId; @@ -207,10 +212,11 @@ void walCloseRef(SWalRef *); int32_t walRefVer(SWalRef *, int64_t ver); int32_t walUnrefVer(SWal *); +// help function for raft bool walLogExist(SWal *, int64_t ver); +bool walIsEmpty(SWal *); // lifecycle check -bool walIsEmpty(SWal *); int64_t walGetFirstVer(SWal *); int64_t walGetSnapshotVer(SWal *); int64_t walGetLastVer(SWal *); diff --git a/include/util/tlog.h b/include/util/tlog.h index 988d9c6890832d17a7e9acd2b496e3ef6ba63d90..a519aaa9b7e6938dd76ab739ec75b57b8e83917b 100644 --- a/include/util/tlog.h +++ b/include/util/tlog.h @@ -60,7 +60,7 @@ extern int32_t tsdbDebugFlag; extern int32_t tqDebugFlag; extern int32_t fsDebugFlag; extern int32_t metaDebugFlag; -extern int32_t fnDebugFlag; +extern int32_t udfDebugFlag; extern int32_t smaDebugFlag; extern int32_t idxDebugFlag; diff --git a/include/util/tutil.h b/include/util/tutil.h index 6a1a40f14ccb865533f117524ffdfef3c84e20ad..2e96c5b88e239b8ba6df3dbe4fc07040639e6cdb 100644 --- a/include/util/tutil.h +++ b/include/util/tutil.h @@ -45,6 +45,7 @@ void taosIp2String(uint32_t ip, char *str); void taosIpPort2String(uint32_t ip, uint16_t port, char *str); void *tmemmem(const char *haystack, int hlen, const char *needle, int nlen); +char *strDupUnquo(const char *src); static FORCE_INLINE void taosEncryptPass(uint8_t *inBuf, size_t inLen, char *target) { T_MD5_CTX context; diff --git a/source/client/src/TMQConnector.c b/source/client/src/TMQConnector.c index c3d1e60782b26995341ab822beeaee320d28036c..1d84dcf7a2be09516b15a095a6013af53f68c60c 100644 --- a/source/client/src/TMQConnector.c +++ b/source/client/src/TMQConnector.c @@ -324,9 +324,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp( (*env)->CallVoidMethod(env, rowobj, g_blockdataSetNumOfRowsFp, (jint)numOfRows); (*env)->CallVoidMethod(env, rowobj, g_blockdataSetNumOfColsFp, (jint)numOfFields); - char *chars = (char *)data; - int32_t len = chars[0] + (chars[1] << 8) + (chars[2] << 16) + (chars[3] << 24); - (*env)->CallVoidMethod(env, rowobj, g_blockdataSetByteArrayFp, len, jniFromNCharToByteArray(env, (char *)data, len)); - + int32_t len = *(int32_t *)data; + (*env)->CallVoidMethod(env, rowobj, g_blockdataSetByteArrayFp, jniFromNCharToByteArray(env, (char *)data, len)); return JNI_SUCCESS; } diff --git a/source/client/src/TSDBJNIConnector.c b/source/client/src/TSDBJNIConnector.c index 246785b5701cf05dc734b3e14d2a4819ef502478..227c2fff1860170f47074f7f3a7a73d1de569510 100644 --- a/source/client/src/TSDBJNIConnector.c +++ b/source/client/src/TSDBJNIConnector.c @@ -592,8 +592,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNI (*env)->CallVoidMethod(env, rowobj, g_blockdataSetNumOfRowsFp, (jint)numOfRows); (*env)->CallVoidMethod(env, rowobj, g_blockdataSetNumOfColsFp, (jint)numOfFields); - char *chars = (char *)data; - int32_t len = chars[0] + (chars[1] << 8) + (chars[2] << 16) + (chars[3] << 24); + int32_t len = *(int32_t *)data; (*env)->CallVoidMethod(env, rowobj, g_blockdataSetByteArrayFp, jniFromNCharToByteArray(env, (char *)data, len)); return JNI_SUCCESS; diff --git a/source/client/src/tmq.c b/source/client/src/tmq.c index 1475663a05e4017a6f2cc28988cf4527c62e8d2c..2132f7a2d69e12da3bc0fa63c6a8cc3e1bb8155f 100644 --- a/source/client/src/tmq.c +++ b/source/client/src/tmq.c @@ -50,19 +50,18 @@ struct tmq_list_t { }; struct tmq_conf_t { - char clientId[256]; - char groupId[TSDB_CGROUP_LEN]; - int8_t autoCommit; - int8_t resetOffset; - int8_t withTbName; - int8_t spEnable; - int32_t spBatchSize; - uint16_t port; - int32_t autoCommitInterval; - char* ip; - char* user; - char* pass; - /*char* db;*/ + char clientId[256]; + char groupId[TSDB_CGROUP_LEN]; + int8_t autoCommit; + int8_t resetOffset; + int8_t withTbName; + int8_t spEnable; + int32_t spBatchSize; + uint16_t port; + int32_t autoCommitInterval; + char* ip; + char* user; + char* pass; tmq_commit_cb* commitCb; void* commitCbUserParam; }; @@ -338,7 +337,7 @@ tmq_list_t* tmq_list_new() { int32_t tmq_list_append(tmq_list_t* list, const char* src) { SArray* container = &list->container; - char* topic = strdup(src); + char* topic = strDupUnquo(src); if (taosArrayPush(container, &topic) == NULL) return -1; return 0; } diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index e8e3237b67af1b857708ee88ba949808452acbea..7927c1e008c66c4fc54156be1d3509574555d01b 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -750,7 +750,6 @@ TEST(testCase, projection_query_stables) { taos_close(pConn); } - TEST(testCase, agg_query_tables) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); ASSERT_NE(pConn, nullptr); @@ -763,7 +762,7 @@ TEST(testCase, agg_query_tables) { } taos_free_result(pRes); - pRes = taos_query(pConn, "show table distributed st1"); + pRes = taos_query(pConn, "show table distributed tup"); if (taos_errno(pRes) != 0) { printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); taos_free_result(pRes); @@ -822,13 +821,29 @@ TEST(testCase, async_api_test) { } #endif + TEST(testCase, update_test) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); ASSERT_NE(pConn, nullptr); - taos_query(pConn, "use abc1"); + TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create database, code:%s", taos_errstr(pRes)); + taos_free_result(pRes); + return; + } + + taos_free_result(pRes); - TAOS_RES* pRes = taos_query(pConn, "create table tup (ts timestamp, k int);"); + pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to use db, code:%s", taos_errstr(pRes)); + taos_free_result(pRes); + return; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table tup (ts timestamp, k int);"); if (taos_errno(pRes) != 0) { printf("failed to create table, reason:%s", taos_errstr(pRes)); } @@ -836,11 +851,10 @@ TEST(testCase, update_test) { taos_free_result(pRes); char s[256] = {0}; - for(int32_t i = 0; i < 7000; ++i) { - sprintf(s, "insert into tup values('2020-1-1 1:1:1', %d)", i); + for(int32_t i = 0; i < 17000; ++i) { + sprintf(s, "insert into tup values(now+%da, %d)", i, i); pRes = taos_query(pConn, s); taos_free_result(pRes); } } - #pragma GCC diagnostic pop diff --git a/source/common/src/tdata.c b/source/common/src/tdata.c deleted file mode 100644 index 6dea4a4e57392be988126c579648f39a8270b9bf..0000000000000000000000000000000000000000 --- a/source/common/src/tdata.c +++ /dev/null @@ -1,14 +0,0 @@ -/* - * 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 . - */ \ No newline at end of file diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 38a2a70894720370085e6c5deb29e9e95c943fb3..8b15f4a1016fd7f1cedc742767398b40dd1f767c 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -228,7 +228,7 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, ui uint32_t finalNumOfRows = numOfRow1 + numOfRow2; if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) { // Handle the bitmap - if (finalNumOfRows > *capacity) { + if (finalNumOfRows > *capacity || numOfRow1 == 0) { char* p = taosMemoryRealloc(pColumnInfoData->varmeta.offset, sizeof(int32_t) * (numOfRow1 + numOfRow2)); if (p == NULL) { return TSDB_CODE_OUT_OF_MEMORY; @@ -262,7 +262,7 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, ui memcpy(pColumnInfoData->pData + oldLen, pSource->pData, len); pColumnInfoData->varmeta.length = len + oldLen; } else { - if (finalNumOfRows > *capacity) { + if (finalNumOfRows > *capacity || numOfRow1 == 0) { ASSERT(finalNumOfRows * pColumnInfoData->info.bytes); char* tmp = taosMemoryRealloc(pColumnInfoData->pData, finalNumOfRows * pColumnInfoData->info.bytes); if (tmp == NULL) { @@ -2119,3 +2119,4 @@ const char* blockDecode(SSDataBlock* pBlock, int32_t numOfCols, int32_t numOfRow ASSERT(pStart - pData == dataLen); return pStart; } + diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index b104e1c2be58503f805fbefee1896e3077ca0524..5b3993dd4027db3f7a86dad6f28bc5feaed84bf9 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -314,7 +314,7 @@ static int32_t taosAddServerLogCfg(SConfig *pCfg) { if (cfgAddInt32(pCfg, "tsdbDebugFlag", tsdbDebugFlag, 0, 255, 0) != 0) return -1; if (cfgAddInt32(pCfg, "tqDebugFlag", tqDebugFlag, 0, 255, 0) != 0) return -1; if (cfgAddInt32(pCfg, "fsDebugFlag", fsDebugFlag, 0, 255, 0) != 0) return -1; - if (cfgAddInt32(pCfg, "fnDebugFlag", fnDebugFlag, 0, 255, 0) != 0) return -1; + if (cfgAddInt32(pCfg, "udfDebugFlag", udfDebugFlag, 0, 255, 0) != 0) return -1; if (cfgAddInt32(pCfg, "smaDebugFlag", smaDebugFlag, 0, 255, 0) != 0) return -1; if (cfgAddInt32(pCfg, "idxDebugFlag", idxDebugFlag, 0, 255, 0) != 0) return -1; return 0; @@ -504,7 +504,7 @@ static void taosSetServerLogCfg(SConfig *pCfg) { tsdbDebugFlag = cfgGetItem(pCfg, "tsdbDebugFlag")->i32; tqDebugFlag = cfgGetItem(pCfg, "tqDebugFlag")->i32; fsDebugFlag = cfgGetItem(pCfg, "fsDebugFlag")->i32; - fnDebugFlag = cfgGetItem(pCfg, "fnDebugFlag")->i32; + udfDebugFlag = cfgGetItem(pCfg, "udfDebugFlag")->i32; smaDebugFlag = cfgGetItem(pCfg, "smaDebugFlag")->i32; idxDebugFlag = cfgGetItem(pCfg, "idxDebugFlag")->i32; } @@ -715,8 +715,6 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) { cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype); } else if (strcasecmp("fsDebugFlag", name) == 0) { fsDebugFlag = cfgGetItem(pCfg, "fsDebugFlag")->i32; - } else if (strcasecmp("fnDebugFlag", name) == 0) { - fnDebugFlag = cfgGetItem(pCfg, "fnDebugFlag")->i32; } break; } @@ -817,6 +815,8 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) { case 'u': { if (strcasecmp("multiProcess", name) == 0) { tsMultiProcess = cfgGetItem(pCfg, "multiProcess")->bval; + } else if (strcasecmp("udfDebugFlag", name) == 0) { + udfDebugFlag = cfgGetItem(pCfg, "udfDebugFlag")->i32; } break; } diff --git a/source/common/src/tmsgtype.c b/source/common/src/tmsgtype.c deleted file mode 100644 index 3ca0f00fc20df54226eb026e2c92e19144de47b2..0000000000000000000000000000000000000000 --- a/source/common/src/tmsgtype.c +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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 . - */ - -#define _DEFAULT_SOURCE -#define TSDB_SQL_C -#include "tmsgtype.h" diff --git a/source/dnode/mgmt/exe/dmMain.c b/source/dnode/mgmt/exe/dmMain.c index 2b0f6a01a0b87cdee8d071d1e53bad398ea90f97..00c32e19907e488c915d4e10ab6865de603716d3 100644 --- a/source/dnode/mgmt/exe/dmMain.c +++ b/source/dnode/mgmt/exe/dmMain.c @@ -216,7 +216,7 @@ int main(int argc, char const *argv[]) { return -1; } - dInfo("start to open dnode"); + dInfo("start to init service"); dmSetSignalHandle(); int32_t code = dmRun(); dInfo("shutting down the service"); diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c index d60b69daba8170ff2a8c691819532e3361229cac..4e3449feb7bfe54a69ad97134cac42641b49a22c 100644 --- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c +++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c @@ -238,10 +238,12 @@ SArray *mmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_REQUEST_VOTE, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_REQUEST_VOTE_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_BATCH, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_SEND, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_RSP, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index a3df32a08c86c583deb4bd51ab31f52c588678aa..993a604b510de8911e1a56046fca116194490c47 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -377,10 +377,12 @@ SArray *vmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_REQUEST_VOTE, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_REQUEST_VOTE_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_BATCH, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_SET_VNODE_STANDBY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c index dc1bcbd258847ed409fa6e4dd5be25c5a21d8c36..051e5defb0a078325fff22ff45594875bb913ca7 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c @@ -173,7 +173,7 @@ static int32_t vmOpenVnodes(SVnodeMgmt *pMgmt) { pThread->pCfgs[pThread->vnodeNum++] = pCfgs[v]; } - dInfo("start %d threads to open %d vnodes", threadNum, numOfVnodes); + dInfo("open %d vnodes with %d threads", numOfVnodes, threadNum); for (int32_t t = 0; t < threadNum; ++t) { SVnodeThread *pThread = &threads[t]; @@ -204,7 +204,7 @@ static int32_t vmOpenVnodes(SVnodeMgmt *pMgmt) { dError("there are total vnodes:%d, opened:%d", pMgmt->state.totalVnodes, pMgmt->state.openVnodes); return -1; } else { - dInfo("total vnodes:%d open successfully", pMgmt->state.totalVnodes); + dInfo("successfully opened %d vnodes", pMgmt->state.totalVnodes); return 0; } } diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c index 436282d9fedc03a7ec64d31f77aa6211a0c0f124..c2e8a552717041798dea4f7ac61045eb198c170d 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c @@ -128,7 +128,7 @@ static void dmClearVars(SDnode *pDnode) { } int32_t dmInitDnode(SDnode *pDnode, EDndNodeType rtype) { - dInfo("start to create dnode"); + dDebug("start to create dnode"); int32_t code = -1; char path[PATH_MAX + 100] = {0}; diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index ad7fbf434405ec72e2e94f3728116f8ad3ccde63..9052fb20cabfa304429b5198d8ddfb4214a2a85b 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -89,7 +89,8 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) { case TDMT_DND_SYSTABLE_RETRIEVE_RSP: case TDMT_SCH_FETCH_RSP: case TDMT_SCH_MERGE_FETCH_RSP: - qWorkerProcessFetchRsp(NULL, NULL, pRpc, 0); + case TDMT_VND_SUBMIT_RSP: + qWorkerProcessRspMsg(NULL, NULL, pRpc, 0); return; case TDMT_MND_STATUS_RSP: if (pEpSet != NULL) { diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c index 2053f3886cec48eb1c23690422c28e8e970533f6..d77b39003af05e995b3af2d5d83d4bc437eae467 100644 --- a/source/dnode/mnode/impl/src/mndSync.c +++ b/source/dnode/mnode/impl/src/mndSync.c @@ -188,7 +188,7 @@ int32_t mndInitSync(SMnode *pMnode) { SNodeInfo *pNode = &pCfg->nodeInfo[0]; tstrncpy(pNode->nodeFqdn, pMgmt->replica.fqdn, sizeof(pNode->nodeFqdn)); pNode->nodePort = pMgmt->replica.port; - mInfo("fqdn:%s port:%u", pNode->nodeFqdn, pNode->nodePort); + mInfo("mnode ep:%s:%u", pNode->nodeFqdn, pNode->nodePort); } tsem_init(&pMgmt->syncSem, 0, 0); diff --git a/source/dnode/qnode/src/qnode.c b/source/dnode/qnode/src/qnode.c index 723402e6397937b080858f86ae15c3b93ebd753c..b65189153ea4f0aa36680586e472eac4007a457f 100644 --- a/source/dnode/qnode/src/qnode.c +++ b/source/dnode/qnode/src/qnode.c @@ -89,9 +89,6 @@ int32_t qndProcessQueryMsg(SQnode *pQnode, int64_t ts, SRpcMsg *pMsg) { case TDMT_SCH_MERGE_FETCH: code = qWorkerProcessFetchMsg(pQnode, pQnode->pQuery, pMsg, ts); break; - case TDMT_SCH_FETCH_RSP: - code = qWorkerProcessFetchRsp(pQnode, pQnode->pQuery, pMsg, ts); - break; case TDMT_SCH_CANCEL_TASK: code = qWorkerProcessCancelMsg(pQnode, pQnode->pQuery, pMsg, ts); break; diff --git a/source/dnode/vnode/CMakeLists.txt b/source/dnode/vnode/CMakeLists.txt index 24c4f2912c82ce001398340609f11d28d7111f15..897e4f26e2fce4fc9f1f280539e8a427845715e2 100644 --- a/source/dnode/vnode/CMakeLists.txt +++ b/source/dnode/vnode/CMakeLists.txt @@ -9,7 +9,6 @@ target_sources( "src/vnd/vnodeCfg.c" "src/vnd/vnodeCommit.c" "src/vnd/vnodeQuery.c" - "src/vnd/vnodeStateMgr.c" "src/vnd/vnodeModule.c" "src/vnd/vnodeSvr.c" "src/vnd/vnodeSync.c" @@ -32,7 +31,6 @@ target_sources( "src/sma/smaUtil.c" "src/sma/smaOpen.c" "src/sma/smaCommit.c" - "src/sma/smaSnapshot.c" "src/sma/smaRollup.c" "src/sma/smaTimeRange.c" @@ -43,7 +41,6 @@ target_sources( "src/tsdb/tsdbOpen.c" "src/tsdb/tsdbMemTable.c" "src/tsdb/tsdbRead.c" - "src/tsdb/tsdbReadImpl.c" "src/tsdb/tsdbCache.c" "src/tsdb/tsdbWrite.c" "src/tsdb/tsdbReaderWriter.c" diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 722087ea45dd472324a07523d86605ae734e5ef1..b87b9a0512485024cb51a19a273347e16ad24f68 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -64,8 +64,8 @@ int32_t vnodeSnapshotRead(SVSnapshotReader *pReader, const void **ppData, uint32 int32_t vnodeProcessCreateTSma(SVnode *pVnode, void *pCont, uint32_t contLen); int32_t vnodeGetAllTableList(SVnode *pVnode, uint64_t uid, SArray *list); int32_t vnodeGetCtbIdList(SVnode *pVnode, int64_t suid, SArray *list); -void * vnodeGetIdx(SVnode *pVnode); -void * vnodeGetIvtIdx(SVnode *pVnode); +void *vnodeGetIdx(SVnode *pVnode); +void *vnodeGetIvtIdx(SVnode *pVnode); int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad); int32_t vnodeValidateTableHash(SVnode *pVnode, char *tableFName); @@ -95,7 +95,7 @@ typedef struct SMetaFltParam { tb_uid_t suid; int16_t cid; int16_t type; - char * val; + char *val; bool reverse; int (*filterFunc)(void *a, void *b, int16_t type); @@ -131,34 +131,53 @@ int32_t tsdbReaderOpen(SVnode *pVnode, SQueryTableDataCond *pCond, SArray *pTabl void tsdbReaderClose(STsdbReader *pReader); bool tsdbNextDataBlock(STsdbReader *pReader); void tsdbRetrieveDataBlockInfo(STsdbReader *pReader, SDataBlockInfo *pDataBlockInfo); -int32_t tsdbRetrieveDataBlockStatisInfo(STsdbReader *pReader, SColumnDataAgg ***pBlockStatis, bool *allHave); +int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SColumnDataAgg ***pBlockStatis, bool *allHave); SArray *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList); int32_t tsdbReaderReset(STsdbReader *pReader, SQueryTableDataCond *pCond, int32_t tWinIdx); int32_t tsdbGetFileBlocksDistInfo(STsdbReader *pReader, STableBlockDistInfo *pTableBlockInfo); int64_t tsdbGetNumOfRowsInMemTable(STsdbReader *pHandle); -void * tsdbGetIdx(SMeta *pMeta); -void * tsdbGetIvtIdx(SMeta *pMeta); +void *tsdbGetIdx(SMeta *pMeta); +void *tsdbGetIvtIdx(SMeta *pMeta); int32_t tsdbLastRowReaderOpen(void *pVnode, int32_t type, SArray *pTableIdList, int32_t *colId, int32_t numOfCols, void **pReader); int32_t tsdbRetrieveLastRow(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds); int32_t tsdbLastrowReaderClose(void *pReader); +int32_t tsdbGetTableSchema(SVnode* pVnode, int64_t uid, STSchema** pSchema, int64_t* suid); // tq -typedef struct STqReadHandle SStreamReader; +typedef struct STqReader { + int64_t ver; + const SSubmitReq *pMsg; + SSubmitBlk *pBlock; + SSubmitMsgIter msgIter; + SSubmitBlkIter blkIter; -SStreamReader *tqInitSubmitMsgScanner(SMeta *pMeta); + SWalReader *pWalReader; -void tqReadHandleSetColIdList(SStreamReader *pReadHandle, SArray *pColIdList); -int32_t tqReadHandleSetTbUidList(SStreamReader *pHandle, const SArray *tbUidList); -int32_t tqReadHandleAddTbUidList(SStreamReader *pHandle, const SArray *tbUidList); -int32_t tqReadHandleRemoveTbUidList(SStreamReader *pHandle, const SArray *tbUidList); + SMeta *pVnodeMeta; + SHashObj *tbIdHash; + SArray *pColIdList; // SArray -int32_t tqReadHandleSetMsg(SStreamReader *pHandle, SSubmitReq *pMsg, int64_t ver); -bool tqNextDataBlock(SStreamReader *pHandle); -bool tqNextDataBlockFilterOut(SStreamReader *pHandle, SHashObj *filterOutUids); -int32_t tqRetrieveDataBlock(SSDataBlock *pBlock, SStreamReader *pHandle); + int32_t cachedSchemaVer; + int64_t cachedSchemaSuid; + SSchemaWrapper *pSchemaWrapper; + STSchema *pSchema; +} STqReader; + +STqReader *tqOpenReader(SVnode *pVnode); +void tqCloseReader(STqReader *); + +void tqReaderSetColIdList(STqReader *pReader, SArray *pColIdList); +int32_t tqReaderSetTbUidList(STqReader *pReader, const SArray *tbUidList); +int32_t tqReaderAddTbUidList(STqReader *pReader, const SArray *tbUidList); +int32_t tqReaderRemoveTbUidList(STqReader *pReader, const SArray *tbUidList); + +int32_t tqReaderSetDataMsg(STqReader *pReader, SSubmitReq *pMsg, int64_t ver); +bool tqNextDataBlock(STqReader *pReader); +bool tqNextDataBlockFilterOut(STqReader *pReader, SHashObj *filterOutUids); +int32_t tqRetrieveDataBlock(SSDataBlock *pBlock, STqReader *pReader); // sma int32_t smaGetTSmaDays(SVnodeCfg *pCfg, void *pCont, uint32_t contLen, int32_t *days); @@ -214,7 +233,7 @@ struct SMetaEntry { int8_t type; int8_t flags; // TODO: need refactor? tb_uid_t uid; - char * name; + char *name; union { struct { SSchemaWrapper schemaRow; @@ -225,7 +244,7 @@ struct SMetaEntry { int64_t ctime; int32_t ttlDays; int32_t commentLen; - char * comment; + char *comment; tb_uid_t suid; uint8_t *pTags; } ctbEntry; @@ -233,7 +252,7 @@ struct SMetaEntry { int64_t ctime; int32_t ttlDays; int32_t commentLen; - char * comment; + char *comment; int32_t ncid; // next column id SSchemaWrapper schemaRow; } ntbEntry; @@ -247,17 +266,17 @@ struct SMetaEntry { struct SMetaReader { int32_t flags; - SMeta * pMeta; + SMeta *pMeta; SDecoder coder; SMetaEntry me; - void * pBuf; + void *pBuf; int32_t szBuf; }; struct SMTbCursor { - TBC * pDbc; - void * pKey; - void * pVal; + TBC *pDbc; + void *pKey; + void *pVal; int32_t kLen; int32_t vLen; SMetaReader mr; diff --git a/source/dnode/vnode/src/inc/tq.h b/source/dnode/vnode/src/inc/tq.h index d10935c0225a9bada2c859fcc11894cdabdfa7e2..9c3bd85c7165003b4989f0f9b797550d0dc271cd 100644 --- a/source/dnode/vnode/src/inc/tq.h +++ b/source/dnode/vnode/src/inc/tq.h @@ -40,38 +40,10 @@ extern "C" { #define tqDebug(...) do { if (tqDebugFlag & DEBUG_DEBUG) { taosPrintLog("TQ ", DEBUG_DEBUG, tqDebugFlag, __VA_ARGS__); }} while(0) #define tqTrace(...) do { if (tqDebugFlag & DEBUG_TRACE) { taosPrintLog("TQ ", DEBUG_TRACE, tqDebugFlag, __VA_ARGS__); }} while(0) -#define IS_META_MSG(x) ( \ - x == TDMT_VND_CREATE_STB \ - || x == TDMT_VND_ALTER_STB \ - || x == TDMT_VND_DROP_STB \ - || x == TDMT_VND_CREATE_TABLE \ - || x == TDMT_VND_ALTER_TABLE \ - || x == TDMT_VND_DROP_TABLE \ - || x == TDMT_VND_DROP_TTL_TABLE \ -) // clang-format on typedef struct STqOffsetStore STqOffsetStore; -// tqRead - -struct STqReadHandle { - int64_t ver; - const SSubmitReq* pMsg; - SSubmitBlk* pBlock; - SSubmitMsgIter msgIter; - SSubmitBlkIter blkIter; - - SMeta* pVnodeMeta; - SHashObj* tbIdHash; - SArray* pColIdList; // SArray - - int32_t cachedSchemaVer; - int64_t cachedSchemaSuid; - SSchemaWrapper* pSchemaWrapper; - STSchema* pSchema; -}; - // tqPush typedef struct { @@ -111,7 +83,7 @@ typedef struct { typedef struct { int8_t subType; - SStreamReader* pExecReader[5]; + STqReader* pExecReader[5]; union { STqExecCol execCol; STqExecTb execTb; @@ -127,8 +99,8 @@ typedef struct { int32_t epoch; int8_t fetchMeta; - // reader - SWalReadHandle* pWalReader; + // TODO remove + SWalReader* pWalReader; // push STqPushHandle pushHandle; diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 0f65a536e0538912637625bb8d9ee7de35a443f2..cd2dfd335106a0fd05466b87ee5eef8b4f3c9ba7 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -245,6 +245,8 @@ int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h); int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey); +int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema); + // structs ======================= typedef struct { int minFid; diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index a198f52beeda0e7600ae32e18eae7f0b8e4508dd..db959a83b00fd4a12074a11ec7071c81d09924ae 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -439,6 +439,7 @@ int32_t metaGetTbTSchemaEx(SMeta *pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sv tDecoderInit(&dc, pData, nData); tDecodeSSchemaWrapper(&dc, pSchemaWrapper); tDecoderClear(&dc); + tdbFree(pData); // convert STSchemaBuilder sb = {0}; diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 74076d323c081c5f9d8a387cff88c467e4b32fe8..341173103c2aa2ce522a31ce7c80e27d62d60005 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -16,6 +16,7 @@ #include "meta.h" static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema); +static int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema); static int metaHandleEntry(SMeta *pMeta, const SMetaEntry *pME); static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME); static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME); @@ -92,7 +93,65 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const } else if (type == TSDB_DATA_TYPE_BOOL) { int val = *(int *)(&pTagVal->i64); int len = sizeof(val); - term = indexTermCreate(suid, ADD_VALUE, TSDB_DATA_TYPE_INT, key, nKey, (const char *)&val, len); + term = indexTermCreate(suid, ADD_VALUE, TSDB_DATA_TYPE_BOOL, key, nKey, (const char *)&val, len); + } + if (term != NULL) { + indexMultiTermAdd(terms, term); + } + } + indexJsonPut(pMeta->pTagIvtIdx, terms, tuid); + indexMultiTermDestroy(terms); +#endif + return 0; +} +int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema) { +#ifdef USE_INVERTED_INDEX + if (pMeta->pTagIvtIdx == NULL || pCtbEntry == NULL) { + return -1; + } + void * data = pCtbEntry->ctbEntry.pTags; + const char *tagName = pSchema->name; + + tb_uid_t suid = pCtbEntry->ctbEntry.suid; + tb_uid_t tuid = pCtbEntry->uid; + const void *pTagData = pCtbEntry->ctbEntry.pTags; + int32_t nTagData = 0; + + SArray *pTagVals = NULL; + if (tTagToValArray((const STag *)data, &pTagVals) != 0) { + return -1; + } + + SIndexMultiTerm *terms = indexMultiTermCreate(); + int16_t nCols = taosArrayGetSize(pTagVals); + for (int i = 0; i < nCols; i++) { + STagVal *pTagVal = (STagVal *)taosArrayGet(pTagVals, i); + char type = pTagVal->type; + + char * key = pTagVal->pKey; + int32_t nKey = strlen(key); + + SIndexTerm *term = NULL; + if (type == TSDB_DATA_TYPE_NULL) { + term = indexTermCreate(suid, DEL_VALUE, TSDB_DATA_TYPE_VARCHAR, key, nKey, NULL, 0); + } else if (type == TSDB_DATA_TYPE_NCHAR) { + if (pTagVal->nData > 0) { + char * val = taosMemoryCalloc(1, pTagVal->nData + VARSTR_HEADER_SIZE); + int32_t len = taosUcs4ToMbs((TdUcs4 *)pTagVal->pData, pTagVal->nData, val + VARSTR_HEADER_SIZE); + memcpy(val, (uint16_t *)&len, VARSTR_HEADER_SIZE); + type = TSDB_DATA_TYPE_VARCHAR; + term = indexTermCreate(suid, DEL_VALUE, type, key, nKey, val, len); + } else if (pTagVal->nData == 0) { + term = indexTermCreate(suid, DEL_VALUE, TSDB_DATA_TYPE_VARCHAR, key, nKey, pTagVal->pData, 0); + } + } else if (type == TSDB_DATA_TYPE_DOUBLE) { + double val = *(double *)(&pTagVal->i64); + int len = sizeof(val); + term = indexTermCreate(suid, DEL_VALUE, type, key, nKey, (const char *)&val, len); + } else if (type == TSDB_DATA_TYPE_BOOL) { + int val = *(int *)(&pTagVal->i64); + int len = sizeof(val); + term = indexTermCreate(suid, DEL_VALUE, TSDB_DATA_TYPE_BOOL, key, nKey, (const char *)&val, len); } if (term != NULL) { indexMultiTermAdd(terms, term); @@ -434,9 +493,33 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) { if (type) *type = e.type; + if (e.type == TSDB_CHILD_TABLE) { + void *tData = NULL; + int tLen = 0; + + if (tdbTbGet(pMeta->pUidIdx, &e.ctbEntry.suid, sizeof(tb_uid_t), &tData, &tLen) == 0) { + version = *(int64_t *)tData; + STbDbKey tbDbKey = {.uid = e.ctbEntry.suid, .version = version}; + if (tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &tData, &tLen) == 0) { + SDecoder tdc = {0}; + SMetaEntry stbEntry = {0}; + + tDecoderInit(&tdc, tData, tLen); + metaDecodeEntry(&tdc, &stbEntry); + const SSchema *pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0]; + if (pTagColumn->type == TSDB_DATA_TYPE_JSON) { + metaDelJsonVarFromIdx(pMeta, &e, pTagColumn); + } + tDecoderClear(&tdc); + } + tdbFree(tData); + } + } + tdbTbDelete(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), &pMeta->txn); tdbTbDelete(pMeta->pNameIdx, e.name, strlen(e.name) + 1, &pMeta->txn); tdbTbDelete(pMeta->pUidIdx, &uid, sizeof(uid), &pMeta->txn); + if (e.type != TSDB_SUPER_TABLE) metaDeleteTtlIdx(pMeta, &e); if (e.type == TSDB_CHILD_TABLE) { diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index ff6915156c924968cef7bf9219d0a476d71ee6d5..4c2e606e0ee23325761ac9ce38c50a65311e4d8a 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -277,6 +277,9 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaInfo pItem->maxDelay = TSDB_MAX_ROLLUP_MAX_DELAY; } pItem->level = (idx == 0 ? TSDB_RETENTION_L1 : TSDB_RETENTION_L2); + smaInfo("vgId:%d table:%" PRIi64 " level:%" PRIi8 " maxdelay:%" PRIi64 " watermark:%" PRIi64 + ", finally maxdelay:%" PRIi32, + SMA_VID(pSma), pRSmaInfo->suid, idx + 1, param->maxdelay[idx], param->watermark[idx], pItem->maxDelay); } return TSDB_CODE_SUCCESS; _err: @@ -325,14 +328,14 @@ int32_t tdProcessRSmaCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, con return TSDB_CODE_FAILED; } - SStreamReader *pReadHandle = tqInitSubmitMsgScanner(pMeta); - if (!pReadHandle) { + STqReader *pReader = tqOpenReader(pVnode); + if (!pReader) { terrno = TSDB_CODE_OUT_OF_MEMORY; goto _err; } SReadHandle handle = { - .reader = pReadHandle, + .tqReader = pReader, .meta = pMeta, .pMsgCb = pMsgCb, .vnode = pVnode, @@ -364,7 +367,7 @@ int32_t tdProcessRSmaCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, con return TSDB_CODE_SUCCESS; _err: tdFreeRSmaInfo(pRSmaInfo); - taosMemoryFree(pReadHandle); + taosMemoryFree(pReader); return TSDB_CODE_FAILED; } @@ -570,11 +573,15 @@ static int32_t tdFetchAndSubmitRSmaResult(SRSmaInfoItem *pItem, int8_t blkType) SSubmitReq *pReq = NULL; // TODO: the schema update should be handled if (buildSubmitReqFromDataBlock(&pReq, pResult, pRSmaInfo->pTSchema, SMA_VID(pSma), pRSmaInfo->suid) < 0) { + smaError("vgId:%d, build submit req for rsma table %" PRIi64 "l evel %" PRIi8 " failed since %s", SMA_VID(pSma), + pRSmaInfo->suid, pItem->level, terrstr()); goto _err; } if (pReq && tdProcessSubmitReq(sinkTsdb, atomic_add_fetch_64(&pRSmaInfo->pStat->submitVer, 1), pReq) < 0) { taosMemoryFreeClear(pReq); + smaError("vgId:%d, process submit req for rsma table %" PRIi64 " level %" PRIi8 " failed since %s", SMA_VID(pSma), + pRSmaInfo->suid, pItem->level, terrstr()); goto _err; } diff --git a/source/dnode/vnode/src/sma/smaSnapshot.c b/source/dnode/vnode/src/sma/smaSnapshot.c deleted file mode 100644 index b2c85642b91aa4cb52e31fdccf713342b6123172..0000000000000000000000000000000000000000 --- a/source/dnode/vnode/src/sma/smaSnapshot.c +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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 "sma.h" \ No newline at end of file diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 739c063f5aeaebe9a17b01cd3b7c551e09abff1a..e21b0fe9e8fc87eabc721b4c0a09394724625978 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -28,8 +28,12 @@ int32_t tqInit() { atomic_store_8(&tqMgmt.inited, 0); return -1; } + if (streamInit() < 0) { + return -1; + } atomic_store_8(&tqMgmt.inited, 1); } + return 0; } @@ -42,6 +46,7 @@ void tqCleanUp() { if (old == 1) { taosTmrCleanUp(tqMgmt.timer); + streamCleanUp(); atomic_store_8(&tqMgmt.inited, 0); } } @@ -144,7 +149,6 @@ int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, con SEncoder encoder; tEncoderInit(&encoder, abuf, len); tEncodeSMqDataRsp(&encoder, pRsp); - /*tEncodeSMqDataBlkRsp(&abuf, pRsp);*/ SRpcMsg rsp = { .info = pMsg->info, @@ -361,8 +365,11 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) { ASSERT(IS_META_MSG(pHead->msgType)); tqInfo("fetch meta msg, ver: %ld, type: %d", pHead->version, pHead->msgType); SMqMetaRsp metaRsp = {0}; - metaRsp.reqOffset = pReq->reqOffset.version; - metaRsp.rspOffset = fetchVer; + /*metaRsp.reqOffset = pReq->reqOffset.version;*/ + /*metaRsp.rspOffset = fetchVer;*/ + /*metaRsp.rspOffsetNew.version = fetchVer;*/ + tqOffsetResetToLog(&metaRsp.reqOffsetNew, pReq->reqOffset.version); + tqOffsetResetToLog(&metaRsp.rspOffsetNew, fetchVer); metaRsp.resMsgType = pHead->msgType; metaRsp.metaRspLen = pHead->bodyLen; metaRsp.metaRsp = pHead->body; @@ -439,27 +446,39 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) { pHandle->execHandle.subType = req.subType; pHandle->fetchMeta = req.withMeta; - pHandle->pWalReader = walOpenReadHandle(pTq->pVnode->pWal); - for (int32_t i = 0; i < 5; i++) { - pHandle->execHandle.pExecReader[i] = tqInitSubmitMsgScanner(pTq->pVnode->pMeta); - } + pHandle->pWalReader = walOpenReader(pTq->pVnode->pWal, NULL); + /*for (int32_t i = 0; i < 5; i++) {*/ + /*pHandle->execHandle.pExecReader[i] = tqOpenReader(pTq->pVnode);*/ + /*}*/ if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) { pHandle->execHandle.execCol.qmsg = req.qmsg; req.qmsg = NULL; for (int32_t i = 0; i < 5; i++) { SReadHandle handle = { - .reader = pHandle->execHandle.pExecReader[i], + .tqReader = pHandle->execHandle.pExecReader[i], .meta = pTq->pVnode->pMeta, .vnode = pTq->pVnode, - .tqReader = true, + .initTableReader = true, + .initTqReader = true, }; pHandle->execHandle.execCol.task[i] = qCreateStreamExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle); ASSERT(pHandle->execHandle.execCol.task[i]); + void* scanner = NULL; + qExtractStreamScanner(pHandle->execHandle.execCol.task[i], &scanner); + ASSERT(scanner); + pHandle->execHandle.pExecReader[i] = qExtractReaderFromStreamScanner(scanner); + ASSERT(pHandle->execHandle.pExecReader[i]); } } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__DB) { + for (int32_t i = 0; i < 5; i++) { + pHandle->execHandle.pExecReader[i] = tqOpenReader(pTq->pVnode); + } pHandle->execHandle.execDb.pFilterOutTbUid = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { + for (int32_t i = 0; i < 5; i++) { + pHandle->execHandle.pExecReader[i] = tqOpenReader(pTq->pVnode); + } pHandle->execHandle.execTb.suid = req.suid; SArray* tbUidList = taosArrayInit(0, sizeof(int64_t)); vnodeGetCtbIdList(pTq->pVnode, req.suid, tbUidList); @@ -469,7 +488,7 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) { tqDebug("vg %d, idx %d, uid: %ld", TD_VID(pTq->pVnode), i, tbUid); } for (int32_t i = 0; i < 5; i++) { - tqReadHandleSetTbUidList(pHandle->execHandle.pExecReader[i], tbUidList); + tqReaderSetTbUidList(pHandle->execHandle.pExecReader[i], tbUidList); } taosArrayDestroy(tbUidList); } @@ -522,19 +541,16 @@ int32_t tqProcessTaskDeployReq(STQ* pTq, char* msg, int32_t msgLen) { if (pTask->execType != TASK_EXEC__NONE) { // expand runners if (pTask->isDataScan) { - SStreamReader* pStreamReader = tqInitSubmitMsgScanner(pTq->pVnode->pMeta); - SReadHandle handle = { - .reader = pStreamReader, - .meta = pTq->pVnode->pMeta, - .vnode = pTq->pVnode, + SReadHandle handle = { + .meta = pTq->pVnode->pMeta, + .vnode = pTq->pVnode, + .initTqReader = 1, }; - /*pTask->exec.inputHandle = pStreamReader;*/ pTask->exec.executor = qCreateStreamExecTaskInfo(pTask->exec.qmsg, &handle); - ASSERT(pTask->exec.executor); } else { pTask->exec.executor = qCreateStreamExecTaskInfo(pTask->exec.qmsg, NULL); - ASSERT(pTask->exec.executor); } + ASSERT(pTask->exec.executor); } // sink diff --git a/source/dnode/vnode/src/tq/tqExec.c b/source/dnode/vnode/src/tq/tqExec.c index 9dd2a0258fd25a5a18c9f67a2b6ca7b1076af62a..16822e6003a12b450348a17c31538e4b46cef46c 100644 --- a/source/dnode/vnode/src/tq/tqExec.c +++ b/source/dnode/vnode/src/tq/tqExec.c @@ -135,8 +135,8 @@ int32_t tqLogScanExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataR } } else if (pExec->subType == TOPIC_SUB_TYPE__TABLE) { pRsp->withSchema = 1; - SStreamReader* pReader = pExec->pExecReader[workerId]; - tqReadHandleSetMsg(pReader, pReq, 0); + STqReader* pReader = pExec->pExecReader[workerId]; + tqReaderSetDataMsg(pReader, pReq, 0); while (tqNextDataBlock(pReader)) { SSDataBlock block = {0}; if (tqRetrieveDataBlock(&block, pReader) < 0) { @@ -153,8 +153,8 @@ int32_t tqLogScanExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataR } } else if (pExec->subType == TOPIC_SUB_TYPE__DB) { pRsp->withSchema = 1; - SStreamReader* pReader = pExec->pExecReader[workerId]; - tqReadHandleSetMsg(pReader, pReq, 0); + STqReader* pReader = pExec->pExecReader[workerId]; + tqReaderSetDataMsg(pReader, pReq, 0); while (tqNextDataBlockFilterOut(pReader, pExec->execDb.pFilterOutTbUid)) { SSDataBlock block = {0}; if (tqRetrieveDataBlock(&block, pReader) < 0) { diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index b262715cdd22e767d7aee5f416ef1acaa1311fc1..67fa4ed1661752aebc151a11babe42c190364d99 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -77,14 +77,14 @@ int32_t tqMetaOpen(STQ* pTq) { STqHandle handle; tDecoderInit(&decoder, (uint8_t*)pVal, vLen); tDecodeSTqHandle(&decoder, &handle); - handle.pWalReader = walOpenReadHandle(pTq->pVnode->pWal); + handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL); for (int32_t i = 0; i < 5; i++) { - handle.execHandle.pExecReader[i] = tqInitSubmitMsgScanner(pTq->pVnode->pMeta); + handle.execHandle.pExecReader[i] = tqOpenReader(pTq->pVnode); } if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) { for (int32_t i = 0; i < 5; i++) { SReadHandle reader = { - .reader = handle.execHandle.pExecReader[i], + .tqReader = handle.execHandle.pExecReader[i], .meta = pTq->pVnode->pMeta, .pMsgCb = &pTq->pVnode->msgCb, .vnode = pTq->pVnode, diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index bc992b2211a62a25c672da55c6d954f987cb0468..53ef17a6baf1403704df388844d47ec6efd0965f 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -15,6 +15,11 @@ #include "tq.h" +int64_t tqScanLog(STQ* pTq, const STqExecHandle* pExec, SMqDataRsp* pRsp, STqOffsetVal offset) { + /*if ()*/ + return 0; +} + int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHead** ppCkHead) { int32_t code = 0; taosThreadMutexLock(&pHandle->pWalReader->mutex); @@ -73,53 +78,107 @@ END: return code; } -SStreamReader* tqInitSubmitMsgScanner(SMeta* pMeta) { - SStreamReader* pReadHandle = taosMemoryMalloc(sizeof(SStreamReader)); - if (pReadHandle == NULL) { +STqReader* tqOpenReader(SVnode* pVnode) { + STqReader* pReader = taosMemoryMalloc(sizeof(STqReader)); + if (pReader == NULL) { return NULL; } - pReadHandle->pVnodeMeta = pMeta; - pReadHandle->pMsg = NULL; - pReadHandle->ver = -1; - pReadHandle->pColIdList = NULL; - pReadHandle->cachedSchemaVer = 0; - pReadHandle->cachedSchemaSuid = 0; - pReadHandle->pSchema = NULL; - pReadHandle->pSchemaWrapper = NULL; - pReadHandle->tbIdHash = NULL; - return pReadHandle; + + // TODO open + /*pReader->pWalReader = walOpenReader(pVnode->pWal, NULL);*/ + + pReader->pVnodeMeta = pVnode->pMeta; + pReader->pMsg = NULL; + pReader->ver = -1; + pReader->pColIdList = NULL; + pReader->cachedSchemaVer = 0; + pReader->cachedSchemaSuid = 0; + pReader->pSchema = NULL; + pReader->pSchemaWrapper = NULL; + pReader->tbIdHash = NULL; + return pReader; +} + +void tqCloseReader(STqReader* pReader) { + // close wal reader + // free cached schema + // free hash + taosMemoryFree(pReader); +} + +int32_t tqNextBlock(STqReader* pReader, SFetchRet* ret) { + bool fromProcessedMsg = pReader->pMsg != NULL; + + while (1) { + if (!fromProcessedMsg) { + if (walNextValidMsg(pReader->pWalReader) < 0) { + ret->fetchType = FETCH_TYPE__NONE; + return -1; + } + void* body = pReader->pWalReader->pHead->head.body; + if (pReader->pWalReader->pHead->head.msgType != TDMT_VND_SUBMIT) { + // TODO do filter + ret->fetchType = FETCH_TYPE__META; + ret->meta = pReader->pWalReader->pHead->head.body; + return 0; + } else { + tqReaderSetDataMsg(pReader, body, pReader->pWalReader->pHead->head.version); + } + } + + while (tqNextDataBlock(pReader)) { + memset(&ret->data, 0, sizeof(SSDataBlock)); + int32_t code = tqRetrieveDataBlock(&ret->data, pReader); + if (code != 0 || ret->data.info.rows == 0) { + if (fromProcessedMsg) { + ret->fetchType = FETCH_TYPE__NONE; + return 0; + } else { + break; + } + } + + ret->fetchType = FETCH_TYPE__DATA; + return 0; + } + + if (fromProcessedMsg) { + ret->fetchType = FETCH_TYPE__NONE; + return 0; + } + } } -int32_t tqReadHandleSetMsg(SStreamReader* pReadHandle, SSubmitReq* pMsg, int64_t ver) { - pReadHandle->pMsg = pMsg; +int32_t tqReaderSetDataMsg(STqReader* pReader, SSubmitReq* pMsg, int64_t ver) { + pReader->pMsg = pMsg; - if (tInitSubmitMsgIter(pMsg, &pReadHandle->msgIter) < 0) return -1; + if (tInitSubmitMsgIter(pMsg, &pReader->msgIter) < 0) return -1; while (true) { - if (tGetSubmitMsgNext(&pReadHandle->msgIter, &pReadHandle->pBlock) < 0) return -1; - if (pReadHandle->pBlock == NULL) break; + if (tGetSubmitMsgNext(&pReader->msgIter, &pReader->pBlock) < 0) return -1; + if (pReader->pBlock == NULL) break; } - if (tInitSubmitMsgIter(pMsg, &pReadHandle->msgIter) < 0) return -1; - pReadHandle->ver = ver; - memset(&pReadHandle->blkIter, 0, sizeof(SSubmitBlkIter)); + if (tInitSubmitMsgIter(pMsg, &pReader->msgIter) < 0) return -1; + pReader->ver = ver; + memset(&pReader->blkIter, 0, sizeof(SSubmitBlkIter)); return 0; } -bool tqNextDataBlock(SStreamReader* pHandle) { - if (pHandle->pMsg == NULL) return false; +bool tqNextDataBlock(STqReader* pReader) { + if (pReader->pMsg == NULL) return false; while (1) { - if (tGetSubmitMsgNext(&pHandle->msgIter, &pHandle->pBlock) < 0) { + if (tGetSubmitMsgNext(&pReader->msgIter, &pReader->pBlock) < 0) { return false; } - if (pHandle->pBlock == NULL) { - pHandle->pMsg = NULL; + if (pReader->pBlock == NULL) { + pReader->pMsg = NULL; return false; } - if (pHandle->tbIdHash == NULL) { + if (pReader->tbIdHash == NULL) { return true; } - void* ret = taosHashGet(pHandle->tbIdHash, &pHandle->msgIter.uid, sizeof(int64_t)); + void* ret = taosHashGet(pReader->tbIdHash, &pReader->msgIter.uid, sizeof(int64_t)); /*tqDebug("search uid %ld", pHandle->msgIter.uid);*/ if (ret != NULL) { /*tqDebug("find uid %ld", pHandle->msgIter.uid);*/ @@ -129,7 +188,7 @@ bool tqNextDataBlock(SStreamReader* pHandle) { return false; } -bool tqNextDataBlockFilterOut(SStreamReader* pHandle, SHashObj* filterOutUids) { +bool tqNextDataBlockFilterOut(STqReader* pHandle, SHashObj* filterOutUids) { while (1) { if (tGetSubmitMsgNext(&pHandle->msgIter, &pHandle->pBlock) < 0) { return false; @@ -145,38 +204,38 @@ bool tqNextDataBlockFilterOut(SStreamReader* pHandle, SHashObj* filterOutUids) { return false; } -int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, SStreamReader* pHandle) { +int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, STqReader* pReader) { // TODO: cache multiple schema - int32_t sversion = htonl(pHandle->pBlock->sversion); - if (pHandle->cachedSchemaSuid == 0 || pHandle->cachedSchemaVer != sversion || - pHandle->cachedSchemaSuid != pHandle->msgIter.suid) { - if (pHandle->pSchema) taosMemoryFree(pHandle->pSchema); - pHandle->pSchema = metaGetTbTSchema(pHandle->pVnodeMeta, pHandle->msgIter.uid, sversion); - if (pHandle->pSchema == NULL) { + int32_t sversion = htonl(pReader->pBlock->sversion); + if (pReader->cachedSchemaSuid == 0 || pReader->cachedSchemaVer != sversion || + pReader->cachedSchemaSuid != pReader->msgIter.suid) { + if (pReader->pSchema) taosMemoryFree(pReader->pSchema); + pReader->pSchema = metaGetTbTSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion); + if (pReader->pSchema == NULL) { tqWarn("cannot found tsschema for table: uid: %ld (suid: %ld), version %d, possibly dropped table", - pHandle->msgIter.uid, pHandle->msgIter.suid, pHandle->cachedSchemaVer); + pReader->msgIter.uid, pReader->msgIter.suid, pReader->cachedSchemaVer); /*ASSERT(0);*/ terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND; return -1; } - if (pHandle->pSchemaWrapper) tDeleteSSchemaWrapper(pHandle->pSchemaWrapper); - pHandle->pSchemaWrapper = metaGetTableSchema(pHandle->pVnodeMeta, pHandle->msgIter.uid, sversion, true); - if (pHandle->pSchemaWrapper == NULL) { + if (pReader->pSchemaWrapper) tDeleteSSchemaWrapper(pReader->pSchemaWrapper); + pReader->pSchemaWrapper = metaGetTableSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, true); + if (pReader->pSchemaWrapper == NULL) { tqWarn("cannot found schema wrapper for table: suid: %ld, version %d, possibly dropped table", - pHandle->msgIter.uid, pHandle->cachedSchemaVer); + pReader->msgIter.uid, pReader->cachedSchemaVer); /*ASSERT(0);*/ terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND; return -1; } - pHandle->cachedSchemaVer = sversion; - pHandle->cachedSchemaSuid = pHandle->msgIter.suid; + pReader->cachedSchemaVer = sversion; + pReader->cachedSchemaSuid = pReader->msgIter.suid; } - STSchema* pTschema = pHandle->pSchema; - SSchemaWrapper* pSchemaWrapper = pHandle->pSchemaWrapper; + STSchema* pTschema = pReader->pSchema; + SSchemaWrapper* pSchemaWrapper = pReader->pSchemaWrapper; - int32_t colNumNeed = taosArrayGetSize(pHandle->pColIdList); + int32_t colNumNeed = taosArrayGetSize(pReader->pColIdList); if (colNumNeed == 0) { int32_t colMeta = 0; @@ -199,7 +258,7 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, SStreamReader* pHandle) { while (colMeta < pSchemaWrapper->nCols && colNeed < colNumNeed) { SSchema* pColSchema = &pSchemaWrapper->pSchema[colMeta]; col_id_t colIdSchema = pColSchema->colId; - col_id_t colIdNeed = *(col_id_t*)taosArrayGet(pHandle->pColIdList, colNeed); + col_id_t colIdNeed = *(col_id_t*)taosArrayGet(pReader->pColIdList, colNeed); if (colIdSchema < colIdNeed) { colMeta++; } else if (colIdSchema > colIdNeed) { @@ -216,7 +275,7 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, SStreamReader* pHandle) { } } - if (blockDataEnsureCapacity(pBlock, pHandle->msgIter.numOfRows) < 0) { + if (blockDataEnsureCapacity(pBlock, pReader->msgIter.numOfRows) < 0) { goto FAIL; } @@ -227,13 +286,12 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, SStreamReader* pHandle) { STSRow* row; int32_t curRow = 0; - tInitSubmitBlkIter(&pHandle->msgIter, pHandle->pBlock, &pHandle->blkIter); + tInitSubmitBlkIter(&pReader->msgIter, pReader->pBlock, &pReader->blkIter); - pBlock->info.groupId = 0; - pBlock->info.uid = pHandle->msgIter.uid; - pBlock->info.rows = pHandle->msgIter.numOfRows; + pBlock->info.uid = pReader->msgIter.uid; + pBlock->info.rows = pReader->msgIter.numOfRows; - while ((row = tGetSubmitBlkNext(&pHandle->blkIter)) != NULL) { + while ((row = tGetSubmitBlkNext(&pReader->blkIter)) != NULL) { tdSTSRowIterReset(&iter, row); // get all wanted col of that block for (int32_t i = 0; i < colActual; i++) { @@ -255,9 +313,9 @@ FAIL: return -1; } -void tqReadHandleSetColIdList(SStreamReader* pReadHandle, SArray* pColIdList) { pReadHandle->pColIdList = pColIdList; } +void tqReaderSetColIdList(STqReader* pReadHandle, SArray* pColIdList) { pReadHandle->pColIdList = pColIdList; } -int tqReadHandleSetTbUidList(SStreamReader* pHandle, const SArray* tbUidList) { +int tqReaderSetTbUidList(STqReader* pHandle, const SArray* tbUidList) { if (pHandle->tbIdHash) { taosHashClear(pHandle->tbIdHash); } @@ -276,7 +334,7 @@ int tqReadHandleSetTbUidList(SStreamReader* pHandle, const SArray* tbUidList) { return 0; } -int tqReadHandleAddTbUidList(SStreamReader* pHandle, const SArray* tbUidList) { +int tqReaderAddTbUidList(STqReader* pHandle, const SArray* tbUidList) { if (pHandle->tbIdHash == NULL) { pHandle->tbIdHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); if (pHandle->tbIdHash == NULL) { @@ -293,7 +351,7 @@ int tqReadHandleAddTbUidList(SStreamReader* pHandle, const SArray* tbUidList) { return 0; } -int tqReadHandleRemoveTbUidList(SStreamReader* pHandle, const SArray* tbUidList) { +int tqReaderRemoveTbUidList(STqReader* pHandle, const SArray* tbUidList) { ASSERT(pHandle->tbIdHash != NULL); for (int32_t i = 0; i < taosArrayGetSize(tbUidList); i++) { diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index dc6fc36035de0f969b17df6a097db8c3145f7862..ea1dfc057f28ea81402f0bd25aac52edc83480fe 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -59,6 +59,8 @@ static void getTableCacheKey(tb_uid_t uid, int cacheType, char *key, int *len) { static void deleteTableCacheLastrow(const void *key, size_t keyLen, void *value) { taosMemoryFree(value); } +static void deleteTableCacheLast(const void *key, size_t keyLen, void *value) { taosArrayDestroy(value); } + static int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { int32_t code = 0; char key[32] = {0}; @@ -309,9 +311,11 @@ static int32_t getTableDelIdx(SDelFReader *pDelFReader, tb_uid_t suid, tb_uid_t if (code) goto _err; // code = tMapDataSearch(&delIdxMap, &idx, tGetDelIdx, tCmprDelIdx, pDelIdx); - pDelIdx = taosArraySearch(pDelIdxArray, &idx, tCmprDelIdx, TD_EQ); + SDelIdx *pIdx = taosArraySearch(pDelIdxArray, &idx, tCmprDelIdx, TD_EQ); if (code) goto _err; + *pDelIdx = *pIdx; + if (pDelIdxArray) { taosArrayDestroy(pDelIdxArray); } @@ -759,7 +763,6 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo for (int i = 0; i < nMax; ++i) { TSDBKEY maxKey = TSDBROW_KEY(max[i]); - // bool deleted = false; bool deleted = tsdbKeyDeleted(&maxKey, pSkyline, &iSkyline); if (!deleted) { // iMerge[nMerge] = i; @@ -816,12 +819,22 @@ _err: return code; } -static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { - int32_t code = 0; +typedef struct { + TSKEY ts; + SColVal colVal; +} SLastCol; + +// static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { +static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) { + int32_t code = 0; + SArray *pSkyline = NULL; + STSRow *pRow = NULL; + STSRow **ppRow = &pRow; STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); int16_t nCol = pTSchema->numOfCols; - SArray *pColArray = taosArrayInit(nCol, sizeof(SColVal)); + // SArray *pColArray = taosArrayInit(nCol, sizeof(SColVal)); + SArray *pColArray = taosArrayInit(nCol, sizeof(SLastCol)); tb_uid_t suid = getTableSuidByUid(uid, pTsdb); @@ -835,9 +848,9 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { tsdbGetTbDataFromMemTable(pTsdb->imem, suid, uid, &pIMem); } - *ppRow = NULL; + *ppLastArray = NULL; - SArray *pSkyline = taosArrayInit(32, sizeof(TSDBKEY)); + pSkyline = taosArrayInit(32, sizeof(TSDBKEY)); SDelIdx delIdx; @@ -941,7 +954,6 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { for (int i = 0; i < nMax; ++i) { TSDBKEY maxKey = TSDBROW_KEY(max[i]); - // bool deleted = false; bool deleted = tsdbKeyDeleted(&maxKey, pSkyline, &iSkyline); if (!deleted) { iMerge[nMerge] = iMax[i]; @@ -968,8 +980,9 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { tRowMergerClear(&merger); } } else { - *ppRow = NULL; - return code; + /* *ppRow = NULL; */ + /* return code; */ + continue; } if (iCol == 0) { @@ -978,7 +991,8 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = maxKey}); - if (taosArrayPush(pColArray, pColVal) == NULL) { + // if (taosArrayPush(pColArray, pColVal) == NULL) { + if (taosArrayPush(pColArray, &(SLastCol){.ts = TSKEY_MAX, .colVal = *pColVal}) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } @@ -989,7 +1003,8 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { for (int16_t i = iCol; i < nCol; ++i) { // tsdbRowGetColVal(*ppRow, pTSchema, i, pColVal); tTSRowGetVal(*ppRow, pTSchema, i, pColVal); - if (taosArrayPush(pColArray, pColVal) == NULL) { + // if (taosArrayPush(pColArray, pColVal) == NULL) { + if (taosArrayPush(pColArray, &(SLastCol){.ts = maxKey, .colVal = *pColVal}) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } @@ -1010,11 +1025,11 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { --nilColCount; } } - /* + if (*ppRow) { taosMemoryFreeClear(*ppRow); } - */ + continue; } @@ -1022,12 +1037,16 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { for (int16_t i = iCol; i < nCol; ++i) { SColVal colVal = {0}; tTSRowGetVal(*ppRow, pTSchema, i, &colVal); + TSKEY rowTs = (*ppRow)->ts; - SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, i); + // SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, i); + SLastCol *tTsVal = (SLastCol *)taosArrayGet(pColArray, i); + SColVal *tColVal = &tTsVal->colVal; if (!colVal.isNone && !colVal.isNull) { if (tColVal->isNull || tColVal->isNone) { - taosArraySet(pColArray, i, &colVal); + // taosArraySet(pColArray, i, &colVal); + taosArraySet(pColArray, i, &(SLastCol){.ts = rowTs, .colVal = colVal}); --nilColCount; } } else { @@ -1052,16 +1071,45 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { } while (nilColCount > 0); // if () new ts row from pColArray if non empty - if (taosArrayGetSize(pColArray) == nCol) { - code = tdSTSRowNew(pColArray, pTSchema, ppRow); - if (code) goto _err; + /* if (taosArrayGetSize(pColArray) == nCol) { */ + /* code = tdSTSRowNew(pColArray, pTSchema, ppRow); */ + /* if (code) goto _err; */ + /* } */ + /* taosArrayDestroy(pColArray); */ + if (taosArrayGetSize(pColArray) <= 0) { + *ppLastArray = NULL; + taosArrayDestroy(pColArray); + } else { + *ppLastArray = pColArray; + } + if (*ppRow) { + taosMemoryFreeClear(*ppRow); + } + + for (int i = 0; i < 3; ++i) { + if (input[i].nextRowClearFn) { + input[i].nextRowClearFn(input[i].iter); + } + } + if (pSkyline) { + taosArrayDestroy(pSkyline); } - taosArrayDestroy(pColArray); taosMemoryFreeClear(pTSchema); return code; _err: taosArrayDestroy(pColArray); + if (*ppRow) { + taosMemoryFreeClear(*ppRow); + } + for (int i = 0; i < 3; ++i) { + if (input[i].nextRowClearFn) { + input[i].nextRowClearFn(input[i].iter); + } + } + if (pSkyline) { + taosArrayDestroy(pSkyline); + } taosMemoryFreeClear(pTSchema); tsdbError("vgId:%d merge last_row failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); return code; @@ -1101,6 +1149,30 @@ int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUH return code; } +int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pTSchema) { + int32_t code = 0; + int16_t nCol = taosArrayGetSize(pLastArray); + SArray *pColArray = taosArrayInit(nCol, sizeof(SColVal)); + + for (int16_t iCol = 0; iCol < nCol; ++iCol) { + SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLastArray, iCol); + SColVal *tColVal = &tTsVal->colVal; + taosArrayPush(pColArray, tColVal); + } + + code = tdSTSRowNew(pColArray, pTSchema, ppRow); + if (code) goto _err; + + taosArrayDestroy(pColArray); + + return code; + +_err: + taosArrayDestroy(pColArray); + + return code; +} + int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **handle) { int32_t code = 0; char key[32] = {0}; @@ -1113,17 +1185,20 @@ int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHand //*ppRow = (STSRow *)taosLRUCacheValue(pCache, h); } else { - STSRow *pRow = NULL; - code = mergeLast(uid, pTsdb, &pRow); + // STSRow *pRow = NULL; + // code = mergeLast(uid, pTsdb, &pRow); + SArray *pLastArray = NULL; + code = mergeLast(uid, pTsdb, &pLastArray); // if table's empty or error, return code of -1 - if (code < 0 || pRow == NULL) { + // if (code < 0 || pRow == NULL) { + if (code < 0 || pLastArray == NULL) { *handle = NULL; return 0; } - _taos_lru_deleter_t deleter = deleteTableCacheLastrow; + _taos_lru_deleter_t deleter = deleteTableCacheLast; LRUStatus status = - taosLRUCacheInsert(pCache, key, keyLen, pRow, TD_ROW_LEN(pRow), deleter, NULL, TAOS_LRU_PRIORITY_LOW); + taosLRUCacheInsert(pCache, key, keyLen, pLastArray, pLastArray->capacity, deleter, NULL, TAOS_LRU_PRIORITY_LOW); if (status != TAOS_LRU_STATUS_OK) { code = -1; } diff --git a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c index 30bc603b309190cc11c7486e2faec998b5c5afab..150ed620bfe7a41c1ad26a9d3a882d6a8eacf3d8 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c @@ -128,6 +128,8 @@ int32_t tsdbRetrieveLastRow(void* pReader, SSDataBlock* pResBlock, const int32_t } pRow = (STSRow*)taosLRUCacheValue(lruCache, h); + // SArray* pLast = (SArray*)taosLRUCacheValue(lruCache, h); + // tsdbCacheLastArray2Row(pLast, &pRow, pr->pSchema); if (pRow->ts > lastKey) { // Set result row into the same rowIndex repeatly, so we need to check if the internal result row has already // appended or not. @@ -140,6 +142,7 @@ int32_t tsdbRetrieveLastRow(void* pReader, SSDataBlock* pResBlock, const int32_t lastKey = pRow->ts; } + // taosMemoryFree(pRow); tsdbCacheRelease(lruCache, h); } } else if (pr->type == LASTROW_RETRIEVE_TYPE_ALL) { @@ -158,8 +161,12 @@ int32_t tsdbRetrieveLastRow(void* pReader, SSDataBlock* pResBlock, const int32_t } pRow = (STSRow*)taosLRUCacheValue(lruCache, h); + // SArray* pLast = (SArray*)taosLRUCacheValue(lruCache, h); + // tsdbCacheLastArray2Row(pLast, &pRow, pr->pSchema); + saveOneRow(pRow, pResBlock, pr, slotIds); + // taosMemoryFree(pRow); tsdbCacheRelease(lruCache, h); pr->tableIndex += 1; diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 6489a1b955d8b4579a47719daec3cf4dd8d31548..8a189d98b33da4363b1ae3b192834fa913c3ae7e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -168,8 +168,6 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel tb_uid_t suid; tb_uid_t uid; - taosArrayClear(pCommitter->aDelData); - if (pTbData) { suid = pTbData->suid; uid = pTbData->uid; @@ -185,6 +183,8 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel code = tsdbReadDelData(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData, NULL); if (code) goto _err; + } else { + taosArrayClear(pCommitter->aDelData); } if (pTbData == NULL && pDelIdx == NULL) goto _exit; @@ -205,7 +205,7 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel if (code) goto _err; // put delIdx - if (taosArrayPush(pCommitter->aDelIdx, &delIdx) == NULL) { + if (taosArrayPush(pCommitter->aDelIdxN, &delIdx) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } @@ -602,7 +602,7 @@ static int32_t tsdbGetOvlpNRow(STbDataIter *pIter, SBlock *pBlock) { iter.pRow = NULL; while (true) { - pRow = tsdbTbDataIterGet(pIter); + pRow = tsdbTbDataIterGet(&iter); if (pRow == NULL) break; key = TSDBROW_KEY(pRow); @@ -610,7 +610,7 @@ static int32_t tsdbGetOvlpNRow(STbDataIter *pIter, SBlock *pBlock) { c = tBlockCmprFn(&(SBlock){.maxKey = key, .minKey = key}, pBlock); if (c == 0) { nRow++; - tsdbTbDataIterNext(pIter); + tsdbTbDataIterNext(&iter); } else if (c > 0) { break; } else { @@ -635,7 +635,7 @@ static int32_t tsdbMergeAsSubBlock(SCommitter *pCommitter, STbDataIter *pIter, S code = tsdbCommitterUpdateRowSchema(pCommitter, pBlockIdx->suid, pBlockIdx->uid, TSDBROW_SVERSION(pRow)); if (code) goto _err; while (true) { - if (pRow) break; + if (pRow == NULL) break; code = tBlockDataAppendRow(pBlockData, pRow, pCommitter->skmRow.pTSchema); if (code) goto _err; diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c index d498fa71ab3cab764c240d7e08b52f36d952ace2..4a33dab08c5d044f812c19354552b11c1436480b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS.c @@ -520,7 +520,7 @@ static int32_t tsdbScanAndTryFixFS(STsdbFS *pFS, int8_t deepScan) { return code; _err: - tsdbError("vgId:%d tsdb can and try fix fs failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + tsdbError("vgId:%d tsdb scan and try fix fs failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); return code; } diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index a50125cc4ba6bb011c9bba8bfe0c6b35f009b868..9381f673d86465742523c3b03eea2585ee8f8c13 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -105,7 +105,7 @@ int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgI // check if table exists (todo: refact) SMetaReader mr = {0}; - SMetaEntry me = {0}; + // SMetaEntry me = {0}; metaReaderInit(&mr, pTsdb->pVnode->pMeta, 0); if (metaGetTableEntryByUid(&mr, pMsgIter->uid) < 0) { metaReaderClear(&mr); @@ -117,6 +117,8 @@ int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgI if (mr.me.type == TSDB_NORMAL_TABLE) { sverNew = mr.me.ntbEntry.schemaRow.version; } else { + tDecoderClear(&mr.coder); + metaGetTableEntryByUid(&mr, mr.me.ctbEntry.suid); sverNew = mr.me.stbEntry.schemaRow.version; } diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index e53a1b43afd9e50c7a3a225909cc137574f433d8..838c61109e137b105d53511f430a3d21528509c6 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -48,14 +48,15 @@ typedef struct SBlockOrderSupporter { typedef struct SIOCostSummary { int64_t blockLoadTime; - int64_t statisInfoLoadTime; + int64_t smaLoadTime; int64_t checkForNextTime; int64_t headFileLoad; int64_t headFileLoadTime; } SIOCostSummary; typedef struct SBlockLoadSuppInfo { - SColumnDataAgg* pstatis; + SArray* pColAgg; + SColumnDataAgg tsColAgg; SColumnDataAgg** plist; int16_t* colIds; // column ids for loading file block data int32_t* slotIds; // colId to slotId @@ -63,10 +64,10 @@ typedef struct SBlockLoadSuppInfo { } SBlockLoadSuppInfo; typedef struct SFilesetIter { - int32_t numOfFiles; // number of total files - int32_t index; // current accessed index in the list - SArray* pFileList; // data file list - int32_t order; + int32_t numOfFiles; // number of total files + int32_t index; // current accessed index in the list + SArray* pFileList; // data file list + int32_t order; } SFilesetIter; typedef struct SFileDataBlockInfo { @@ -119,24 +120,10 @@ struct STsdbReader { int32_t type; // query type: 1. retrieve all data blocks, 2. retrieve direct prev|next rows SBlockLoadSuppInfo suppInfo; - SIOCostSummary cost; - STSchema* pSchema; - SDataFReader* pFileReader; - SVersionRange verRange; -#if 0 - SArray* prev; // previous row which is before than time window - SArray* next; // next row which is after the query time window - SFileBlockInfo* pDataBlockInfo; - SDataCols* pDataCols; // in order to hold current file data block - int32_t allocSize; // allocated data block size - SDataBlockLoadInfo dataBlockLoadInfo; /* record current block load information */ - SLoadCompBlockInfo compBlockLoadInfo; /* record current compblock information in SQueryAttr */ - // SDFileSet* pFileGroup; - // SFSIter fileIter; - // SReadH rhelper; - // SColumnDataAgg* statis; // query level statistics, only one table block statistics info exists at any time - // SColumnDataAgg** pstatis;// the ptr array list to return to caller -#endif + SIOCostSummary cost; + STSchema* pSchema; + SDataFReader* pFileReader; + SVersionRange verRange; }; static SFileDataBlockInfo* getCurrentBlockInfo(SDataBlockIter* pBlockIter); @@ -150,7 +137,7 @@ static int32_t doMergeRowsInBuf(SIterInfo* pIter, int64_t ts, SArray* pDelList, static int32_t doAppendOneRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow); static void setComposedBlockFlag(STsdbReader* pReader, bool composed); static void updateSchema(TSDBROW* pRow, uint64_t uid, STsdbReader* pReader); -static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey); +static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order); static void doMergeMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow, STsdbReader* pReader); @@ -252,33 +239,6 @@ static STimeWindow updateQueryTimeWindow(STsdb* pTsdb, STimeWindow* pWindow) { return win; } -// todo remove this -static void setQueryTimewindow(STsdbReader* pReader, SQueryTableDataCond* pCond, int32_t tWinIdx) { - // pReader->window = pCond->twindows[tWinIdx]; - - // bool updateTs = false; - // int64_t startTs = updateQueryTimeWindow(pReader->pTsdb); - // if (ASCENDING_TRAVERSE(pReader->order)) { - // if (startTs > pReader->window.skey) { - // pReader->window.skey = startTs; - // pCond->twindows[tWinIdx].skey = startTs; - // updateTs = true; - // } - // } else { - // if (startTs > pReader->window.ekey) { - // pReader->window.ekey = startTs; - // pCond->twindows[tWinIdx].ekey = startTs; - // updateTs = true; - // } - // } - - // if (updateTs) { - // tsdbDebug("%p update the query time window, old:%" PRId64 " - %" PRId64 ", new:%" PRId64 " - %" PRId64 ", %s", - // pReader, pCond->twindows[tWinIdx].skey, pCond->twindows[tWinIdx].ekey, pReader->window.skey, - // pReader->window.ekey, pReader->idStr); - // } -} - static void limitOutputBufferSize(const SQueryTableDataCond* pCond, int32_t* capacity) { int32_t rowLen = 0; for (int32_t i = 0; i < pCond->numOfCols; ++i) { @@ -405,21 +365,21 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd pReader->type = pCond->type; pReader->window = updateQueryTimeWindow(pVnode->pTsdb, pCond->twindows); - // todo remove this - setQueryTimewindow(pReader, pCond, 0); ASSERT(pCond->numOfCols > 0); limitOutputBufferSize(pCond, &pReader->capacity); // allocate buffer in order to load data blocks from file SBlockLoadSuppInfo* pSup = &pReader->suppInfo; - pSup->pstatis = taosMemoryCalloc(pCond->numOfCols, sizeof(SColumnDataAgg)); + pSup->pColAgg = taosArrayInit(4, sizeof(SColumnDataAgg)); pSup->plist = taosMemoryCalloc(pCond->numOfCols, POINTER_BYTES); - if (pSup->pstatis == NULL || pSup->plist == NULL) { + if (pSup->pColAgg == NULL || pSup->plist == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _end; } + pSup->tsColAgg.colId = PRIMARYKEY_TIMESTAMP_COL_ID; + pReader->pResBlock = createResBlock(pCond, pReader->capacity); if (pReader->pResBlock == NULL) { code = terrno; @@ -920,200 +880,6 @@ _error: // return midPos; // } -// static int32_t mergeTwoRowFromMem(STsdbReader* pTsdbReadHandle, int32_t capacity, int32_t* curRow, STSRow* row1, -// STSRow* row2, int32_t numOfCols, uint64_t uid, STSchema* pSchema1, STSchema* -// pSchema2, bool update, TSKEY* lastRowKey) { -// #if 1 -// STSchema* pSchema; -// STSRow* row; -// int16_t colId; -// int16_t offset; - -// bool isRow1DataRow = TD_IS_TP_ROW(row1); -// bool isRow2DataRow; -// bool isChosenRowDataRow; -// int32_t chosen_itr; -// SCellVal sVal = {0}; -// TSKEY rowKey = TSKEY_INITIAL_VAL; -// int32_t nResult = 0; -// int32_t mergeOption = 0; // 0 discard 1 overwrite 2 merge - -// // the schema version info is embeded in STSRow -// int32_t numOfColsOfRow1 = 0; - -// if (pSchema1 == NULL) { -// pSchema1 = metaGetTbTSchema(REPO_META(pTsdbReadHandle->pTsdb), uid, TD_ROW_SVER(row1)); -// } - -// #ifdef TD_DEBUG_PRINT_ROW -// char flags[70] = {0}; -// STsdb* pTsdb = pTsdbReadHandle->rhelper.pRepo; -// snprintf(flags, 70, "%s:%d vgId:%d dir:%s row1%s=NULL,row2%s=NULL", __func__, __LINE__, TD_VID(pTsdb->pVnode), -// pTsdb->dir, row1 ? "!" : "", row2 ? "!" : ""); -// tdSRowPrint(row1, pSchema1, flags); -// #endif - -// if (isRow1DataRow) { -// numOfColsOfRow1 = schemaNCols(pSchema1); -// } else { -// numOfColsOfRow1 = tdRowGetNCols(row1); -// } - -// int32_t numOfColsOfRow2 = 0; -// if (row2) { -// isRow2DataRow = TD_IS_TP_ROW(row2); -// if (pSchema2 == NULL) { -// pSchema2 = metaGetTbTSchema(REPO_META(pTsdbReadHandle->pTsdb), uid, TD_ROW_SVER(row2)); -// } -// if (isRow2DataRow) { -// numOfColsOfRow2 = schemaNCols(pSchema2); -// } else { -// numOfColsOfRow2 = tdRowGetNCols(row2); -// } -// } - -// int32_t i = 0, j = 0, k = 0; -// while (i < numOfCols && (j < numOfColsOfRow1 || k < numOfColsOfRow2)) { -// SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i); - -// int32_t colIdOfRow1; -// if (j >= numOfColsOfRow1) { -// colIdOfRow1 = INT32_MAX; -// } else if (isRow1DataRow) { -// colIdOfRow1 = pSchema1->columns[j].colId; -// } else { -// colIdOfRow1 = tdKvRowColIdAt(row1, j); -// } - -// int32_t colIdOfRow2; -// if (k >= numOfColsOfRow2) { -// colIdOfRow2 = INT32_MAX; -// } else if (isRow2DataRow) { -// colIdOfRow2 = pSchema2->columns[k].colId; -// } else { -// colIdOfRow2 = tdKvRowColIdAt(row2, k); -// } - -// if (colIdOfRow1 < colIdOfRow2) { // the most probability -// if (colIdOfRow1 < pColInfo->info.colId) { -// ++j; -// continue; -// } -// row = row1; -// pSchema = pSchema1; -// isChosenRowDataRow = isRow1DataRow; -// chosen_itr = j; -// } else if (colIdOfRow1 == colIdOfRow2) { -// if (colIdOfRow1 < pColInfo->info.colId) { -// ++j; -// ++k; -// continue; -// } -// row = row1; -// pSchema = pSchema1; -// isChosenRowDataRow = isRow1DataRow; -// chosen_itr = j; -// } else { -// if (colIdOfRow2 < pColInfo->info.colId) { -// ++k; -// continue; -// } -// row = row2; -// pSchema = pSchema2; -// chosen_itr = k; -// isChosenRowDataRow = isRow2DataRow; -// } - -// if (isChosenRowDataRow) { -// colId = pSchema->columns[chosen_itr].colId; -// offset = pSchema->columns[chosen_itr].offset; -// // TODO: use STSRowIter -// tdSTpRowGetVal(row, colId, pSchema->columns[chosen_itr].type, pSchema->flen, offset, chosen_itr - 1, &sVal); -// if (colId == PRIMARYKEY_TIMESTAMP_COL_ID) { -// rowKey = *(TSKEY*)sVal.val; -// if (rowKey != *lastRowKey) { -// mergeOption = 1; -// if (*lastRowKey != TSKEY_INITIAL_VAL) { -// ++(*curRow); -// } -// *lastRowKey = rowKey; -// ++nResult; -// } else if (update) { -// mergeOption = 2; -// } else { -// mergeOption = 0; -// break; -// } -// } -// } else { -// // TODO: use STSRowIter -// if (chosen_itr == 0) { -// colId = PRIMARYKEY_TIMESTAMP_COL_ID; -// tdSKvRowGetVal(row, PRIMARYKEY_TIMESTAMP_COL_ID, -1, -1, &sVal); -// rowKey = *(TSKEY*)sVal.val; -// if (rowKey != *lastRowKey) { -// mergeOption = 1; -// if (*lastRowKey != TSKEY_INITIAL_VAL) { -// ++(*curRow); -// } -// *lastRowKey = rowKey; -// ++nResult; -// } else if (update) { -// mergeOption = 2; -// } else { -// mergeOption = 0; -// break; -// } -// } else { -// SKvRowIdx* pColIdx = tdKvRowColIdxAt(row, chosen_itr - 1); -// colId = pColIdx->colId; -// offset = pColIdx->offset; -// tdSKvRowGetVal(row, colId, offset, chosen_itr - 1, &sVal); -// } -// } - -// ASSERT(rowKey != TSKEY_INITIAL_VAL); - -// if (colId == pColInfo->info.colId) { -// if (tdValTypeIsNorm(sVal.valType)) { -// colDataAppend(pColInfo, *curRow, sVal.val, false); -// } else if (tdValTypeIsNull(sVal.valType)) { -// colDataAppend(pColInfo, *curRow, NULL, true); -// } else if (tdValTypeIsNone(sVal.valType)) { -// // TODO: Set null if nothing append for this row -// if (mergeOption == 1) { -// colDataAppend(pColInfo, *curRow, NULL, true); -// } -// } else { -// ASSERT(0); -// } - -// ++i; - -// if (row == row1) { -// ++j; -// } else { -// ++k; -// } -// } else { -// if (mergeOption == 1) { -// colDataAppend(pColInfo, *curRow, NULL, true); -// } -// ++i; -// } -// } - -// if (mergeOption == 1) { -// while (i < numOfCols) { // the remain columns are all null data -// SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i); -// colDataAppend(pColInfo, *curRow, NULL, true); -// ++i; -// } -// } - -// return nResult; -// #endif -// } // static void doCheckGeneratedBlockRange(STsdbReader* pTsdbReadHandle) { // SQueryFilePos* cur = &pTsdbReadHandle->cur; @@ -1393,66 +1159,6 @@ _error: // pTsdbReadHandle->idStr); // } -// int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order) { -// int firstPos, lastPos, midPos = -1; -// int numOfRows; -// TSKEY* keyList; - -// if (num <= 0) return -1; - -// keyList = (TSKEY*)pValue; -// firstPos = 0; -// lastPos = num - 1; - -// if (order == TSDB_ORDER_DESC) { -// // find the first position which is smaller than the key -// while (1) { -// if (key >= keyList[lastPos]) return lastPos; -// if (key == keyList[firstPos]) return firstPos; -// if (key < keyList[firstPos]) return firstPos - 1; - -// numOfRows = lastPos - firstPos + 1; -// midPos = (numOfRows >> 1) + firstPos; - -// if (key < keyList[midPos]) { -// lastPos = midPos - 1; -// } else if (key > keyList[midPos]) { -// firstPos = midPos + 1; -// } else { -// break; -// } -// } - -// } else { -// // find the first position which is bigger than the key -// while (1) { -// if (key <= keyList[firstPos]) return firstPos; -// if (key == keyList[lastPos]) return lastPos; - -// if (key > keyList[lastPos]) { -// lastPos = lastPos + 1; -// if (lastPos >= num) -// return -1; -// else -// return lastPos; -// } - -// numOfRows = lastPos - firstPos + 1; -// midPos = (numOfRows >> 1) + firstPos; - -// if (key < keyList[midPos]) { -// lastPos = midPos - 1; -// } else if (key > keyList[midPos]) { -// firstPos = midPos + 1; -// } else { -// break; -// } -// } -// } - -// return midPos; -// } - static void cleanupBlockOrderSupporter(SBlockOrderSupporter* pSup) { taosMemoryFreeClear(pSup->numOfBlocksPerTable); taosMemoryFreeClear(pSup->indexPerTable); @@ -1710,29 +1416,60 @@ static bool keyOverlapFileBlock(TSDBKEY key, SBlock* pBlock, SVersionRange* pVer (pBlock->minVersion <= pVerRange->maxVer); } +static bool overlapWithDelSkyline(STableBlockScanInfo* pBlockScanInfo, const SBlock* pBlock, int32_t order) { + if (pBlockScanInfo->delSkyline == NULL) { + return false; + } + + TSDBKEY* pFirst = taosArrayGet(pBlockScanInfo->delSkyline, 0); + TSDBKEY* pLast = taosArrayGetLast(pBlockScanInfo->delSkyline); + + // ts is not overlap + if (pBlock->minKey.ts > pLast->ts || pBlock->maxKey.ts < pFirst->ts) { + return false; + } + + int32_t step = ASCENDING_TRAVERSE(order)? 1:-1; + + // version is not overlap + size_t num = taosArrayGetSize(pBlockScanInfo->delSkyline); + for(int32_t i = pBlockScanInfo->fileDelIndex; i < num; i += step) { + TSDBKEY* p = taosArrayGet(pBlockScanInfo->delSkyline, i); + if (p->ts >= pBlock->minKey.ts && p->ts <= pBlock->maxKey.ts) { + if (p->version >= pBlock->minVersion) { + return true; + } + } else if (p->ts > pBlock->maxKey.ts) { + return false; + } + } + + ASSERT(0); + return false; +} + // 1. the version of all rows should be less than the endVersion // 2. current block should not overlap with next neighbor block // 3. current timestamp should not be overlap with each other // 4. output buffer should be large enough to hold all rows in current block +// 5. delete info should not overlap with current block data static bool fileBlockShouldLoad(STsdbReader* pReader, SFileDataBlockInfo* pFBlock, SBlock* pBlock, STableBlockScanInfo* pScanInfo, TSDBKEY key) { int32_t neighborIndex = 0; SBlock* pNeighbor = getNeighborBlockOfSameTable(pFBlock, pScanInfo, &neighborIndex, pReader->order); + // overlap with neighbor bool overlapWithNeighbor = false; if (pNeighbor) { overlapWithNeighbor = overlapWithNeighborBlock(pBlock, pNeighbor, pReader->order); } - bool hasDup = false; - if (pBlock->nSubBlock == 1) { - hasDup = pBlock->hasDup; - } else { - hasDup = true; - } + // has duplicated ts of different version in this block + bool hasDup = (pBlock->nSubBlock == 1)? pBlock->hasDup:true; + bool overlapWithDel= overlapWithDelSkyline(pScanInfo, pBlock, pReader->order); return (overlapWithNeighbor || hasDup || dataBlockPartiallyRequired(&pReader->window, &pReader->verRange, pBlock) || - keyOverlapFileBlock(key, pBlock, &pReader->verRange) || (pBlock->nRow > pReader->capacity)); + keyOverlapFileBlock(key, pBlock, &pReader->verRange) || (pBlock->nRow > pReader->capacity) || overlapWithDel); } static int32_t buildDataBlockFromBuf(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, int64_t endKey) { @@ -1940,6 +1677,7 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* } ASSERT(0); + return -1; } static bool isValidFileBlockRow(SBlockData* pBlockData, SFileBlockDumpInfo* pDumpInfo, @@ -1956,7 +1694,7 @@ static bool isValidFileBlockRow(SBlockData* pBlockData, SFileBlockDumpInfo* pDum } TSDBKEY k = {.ts = ts, .version = ver}; - if (hasBeenDropped(pBlockScanInfo->delSkyline, &pBlockScanInfo->fileDelIndex, &k)) { + if (hasBeenDropped(pBlockScanInfo->delSkyline, &pBlockScanInfo->fileDelIndex, &k, pReader->order)) { return false; } @@ -2485,41 +2223,104 @@ static SVersionRange getQueryVerRange(SVnode* pVnode, SQueryTableDataCond* pCond // taosArrayPush(pTsdbReadHandle->pTableCheckInfo, &info); // } -bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey) { +bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order) { ASSERT(pKey != NULL); if (pDelList == NULL) { return false; } + size_t num = taosArrayGetSize(pDelList); + bool asc = ASCENDING_TRAVERSE(order); + int32_t step = asc? 1:-1; - if (*index >= taosArrayGetSize(pDelList) - 1) { - TSDBKEY* last = taosArrayGetLast(pDelList); - if (pKey->ts > last->ts) { - return false; - } else if (pKey->ts == last->ts) { - size_t size = taosArrayGetSize(pDelList); - TSDBKEY* prev = taosArrayGet(pDelList, size - 2); - if (prev->version >= pKey->version) { - return true; - } else { + if (asc) { + if (*index >= num - 1) { + TSDBKEY* last = taosArrayGetLast(pDelList); + ASSERT(pKey->ts >= last->ts); + + if (pKey->ts > last->ts) { return false; + } else if (pKey->ts == last->ts) { + TSDBKEY* prev = taosArrayGet(pDelList, num - 2); + return (prev->version >= pKey->version); } } else { - ASSERT(0); + TSDBKEY* pCurrent = taosArrayGet(pDelList, *index); + TSDBKEY* pNext = taosArrayGet(pDelList, (*index) + 1); + + if (pKey->ts < pCurrent->ts) { + return false; + } + + if (pCurrent->ts <= pKey->ts && pNext->ts >= pKey->ts && pCurrent->version >= pKey->version) { + return true; + } + + while (pNext->ts <= pKey->ts && (*index) < num - 1) { + (*index) += 1; + + if ((*index) < num - 1) { + pCurrent = taosArrayGet(pDelList, *index); + pNext = taosArrayGet(pDelList, (*index) + 1); + + // it is not a consecutive deletion range, ignore it + if (pCurrent->version == 0 && pNext->version > 0) { + continue; + } + + if (pCurrent->ts <= pKey->ts && pNext->ts >= pKey->ts && pCurrent->version >= pKey->version) { + return true; + } + } + } + + return false; } } else { - TSDBKEY* pCurrent = taosArrayGet(pDelList, *index); - TSDBKEY* pNext = taosArrayGet(pDelList, (*index) + 1); + if (*index <= 0) { + TSDBKEY* pFirst = taosArrayGet(pDelList, 0); - if (pCurrent->ts <= pKey->ts && pNext->ts >= pKey->ts && pCurrent->version >= pKey->version) { - return true; + if (pKey->ts < pFirst->ts) { + return false; + } else if (pKey->ts == pFirst->ts) { + return pFirst->version >= pKey->version; + } else { + ASSERT(0); + } } else { - while (pNext->ts < pKey->ts && (*index) < taosArrayGetSize(pDelList) - 1) { - (*index) += 1; + TSDBKEY* pCurrent = taosArrayGet(pDelList, *index); + TSDBKEY* pPrev = taosArrayGet(pDelList, (*index) - 1); + + if (pKey->ts > pCurrent->ts) { + return false; + } + + if (pPrev->ts <= pKey->ts && pCurrent->ts >= pKey->ts && pPrev->version >= pKey->version) { + return true; + } + + while (pPrev->ts >= pKey->ts && (*index) > 1) { + (*index) += step; + + if ((*index) >= 1) { + pCurrent = taosArrayGet(pDelList, *index); + pPrev = taosArrayGet(pDelList, (*index) - 1); + + // it is not a consecutive deletion range, ignore it + if (pCurrent->version > 0 && pPrev->version == 0) { + continue; + } + + if (pPrev->ts <= pKey->ts && pCurrent->ts >= pKey->ts && pPrev->version >= pKey->version) { + return true; + } + } } return false; } } + + return false; } TSDBROW* getValidRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pReader) { @@ -2536,7 +2337,7 @@ TSDBROW* getValidRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pRea // it is a valid data version if ((key.version <= pReader->verRange.maxVer && key.version >= pReader->verRange.minVer) && - (!hasBeenDropped(pDelList, &pIter->index, &key))) { + (!hasBeenDropped(pDelList, &pIter->index, &key, pReader->order))) { return pRow; } @@ -2555,7 +2356,7 @@ TSDBROW* getValidRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pRea } if (key.version <= pReader->verRange.maxVer && key.version >= pReader->verRange.minVer && - (!hasBeenDropped(pDelList, &pIter->index, &key))) { + (!hasBeenDropped(pDelList, &pIter->index, &key, pReader->order))) { return pRow; } } @@ -2907,162 +2708,6 @@ int32_t tsdbGetStbIdList(SMeta* pMeta, int64_t suid, SArray* list) { return TSDB_CODE_SUCCESS; } -// static void destroyHelper(void* param) { -// if (param == NULL) { -// return; -// } - -// // tQueryInfo* pInfo = (tQueryInfo*)param; -// // if (pInfo->optr != TSDB_RELATION_IN) { -// // taosMemoryFreeClear(pInfo->q); -// // } else { -// // taosHashCleanup((SHashObj *)(pInfo->q)); -// // } - -// taosMemoryFree(param); -// } - -// #define TSDB_PREV_ROW 0x1 -// #define TSDB_NEXT_ROW 0x2 - -// static bool loadBlockOfActiveTable(STsdbReader* pTsdbReadHandle) { -// if (pTsdbReadHandle->checkFiles) { -// // check if the query range overlaps with the file data block -// bool exists = true; - -// int32_t code = buildBlockFromFiles(pTsdbReadHandle, &exists); -// if (code != TSDB_CODE_SUCCESS) { -// pTsdbReadHandle->checkFiles = false; -// return false; -// } - -// if (exists) { -// tsdbRetrieveDataBlock((STsdbReader**)pTsdbReadHandle, NULL); -// if (pTsdbReadHandle->currentLoadExternalRows && pTsdbReadHandle->window.skey == pTsdbReadHandle->window.ekey) { -// SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, 0); -// assert(*(int64_t*)pColInfo->pData == pTsdbReadHandle->window.skey); -// } - -// pTsdbReadHandle->currentLoadExternalRows = false; // clear the flag, since the exact matched row is found. -// return exists; -// } - -// pTsdbReadHandle->checkFiles = false; -// } - -// if (hasMoreDataInCache(pTsdbReadHandle)) { -// pTsdbReadHandle->currentLoadExternalRows = false; -// return true; -// } - -// // current result is empty -// if (pTsdbReadHandle->currentLoadExternalRows && pTsdbReadHandle->window.skey == pTsdbReadHandle->window.ekey && -// pTsdbReadHandle->cur.rows == 0) { -// // SMemTable* pMemRef = pTsdbReadHandle->pMemTable; - -// // doGetExternalRow(pTsdbReadHandle, TSDB_PREV_ROW, pMemRef); -// // doGetExternalRow(pTsdbReadHandle, TSDB_NEXT_ROW, pMemRef); - -// bool result = tsdbGetExternalRow(pTsdbReadHandle); - -// // pTsdbReadHandle->prev = doFreeColumnInfoData(pTsdbReadHandle->prev); -// // pTsdbReadHandle->next = doFreeColumnInfoData(pTsdbReadHandle->next); -// pTsdbReadHandle->currentLoadExternalRows = false; - -// return result; -// } - -// return false; -// } - -// static bool loadDataBlockFromTableSeq(STsdbReader* pTsdbReadHandle) { -// size_t numOfTables = taosArrayGetSize(pTsdbReadHandle->pTableCheckInfo); -// assert(numOfTables > 0); - -// int64_t stime = taosGetTimestampUs(); - -// while (pTsdbReadHandle->activeIndex < numOfTables) { -// if (loadBlockOfActiveTable(pTsdbReadHandle)) { -// return true; -// } - -// STableBlockScanInfo* pCheckInfo = taosArrayGet(pTsdbReadHandle->pTableCheckInfo, pTsdbReadHandle->activeIndex); -// pCheckInfo->numOfBlocks = 0; - -// pTsdbReadHandle->activeIndex += 1; -// pTsdbReadHandle->locateStart = false; -// pTsdbReadHandle->checkFiles = true; -// pTsdbReadHandle->cur.rows = 0; -// pTsdbReadHandle->currentLoadExternalRows = pTsdbReadHandle->loadExternalRow; - -// terrno = TSDB_CODE_SUCCESS; - -// int64_t elapsedTime = taosGetTimestampUs() - stime; -// pTsdbReadHandle->cost.checkForNextTime += elapsedTime; -// } - -// return false; -// } - -// bool tsdbGetExternalRow(STsdbReader* pHandle) { -// STsdbReader* pTsdbReadHandle = (STsdbReader*)pHandle; -// SQueryFilePos* cur = &pTsdbReadHandle->cur; - -// cur->fid = INT32_MIN; -// cur->mixBlock = true; -// if (pTsdbReadHandle->prev == NULL || pTsdbReadHandle->next == NULL) { -// cur->rows = 0; -// return false; -// } - -// int32_t numOfCols = (int32_t)QH_GET_NUM_OF_COLS(pTsdbReadHandle); -// for (int32_t i = 0; i < numOfCols; ++i) { -// SColumnInfoData* pColInfoData = taosArrayGet(pTsdbReadHandle->pColumns, i); -// SColumnInfoData* first = taosArrayGet(pTsdbReadHandle->prev, i); - -// memcpy(pColInfoData->pData, first->pData, pColInfoData->info.bytes); - -// SColumnInfoData* sec = taosArrayGet(pTsdbReadHandle->next, i); -// memcpy(((char*)pColInfoData->pData) + pColInfoData->info.bytes, sec->pData, pColInfoData->info.bytes); - -// if (i == 0 && pColInfoData->info.type == TSDB_DATA_TYPE_TIMESTAMP) { -// cur->win.skey = *(TSKEY*)pColInfoData->pData; -// cur->win.ekey = *(TSKEY*)(((char*)pColInfoData->pData) + TSDB_KEYSIZE); -// } -// } - -// cur->rows = 2; -// return true; -// } - -// static void* doFreeColumnInfoData(SArray* pColumnInfoData) { -// if (pColumnInfoData == NULL) { -// return NULL; -// } - -// size_t cols = taosArrayGetSize(pColumnInfoData); -// for (int32_t i = 0; i < cols; ++i) { -// SColumnInfoData* pColInfo = taosArrayGet(pColumnInfoData, i); -// colDataDestroy(pColInfo); -// } - -// taosArrayDestroy(pColumnInfoData); -// return NULL; -// } - -// static void* destroyTableCheckInfo(SArray* pTableCheckInfo) { -// size_t size = taosArrayGetSize(pTableCheckInfo); -// for (int32_t i = 0; i < size; ++i) { -// STableBlockScanInfo* p = taosArrayGet(pTableCheckInfo, i); -// destroyTableMemIterator(p); - -// taosMemoryFreeClear(p->pCompInfo); -// } - -// taosArrayDestroy(pTableCheckInfo); -// return NULL; -// } - // ====================================== EXPOSED APIs ====================================== int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTableList, STsdbReader** ppReader, const char* idstr) { @@ -3125,16 +2770,11 @@ void tsdbReaderClose(STsdbReader* pReader) { } blockDataDestroy(pReader->pResBlock); - - taosMemoryFreeClear(pReader->suppInfo.pstatis); taosMemoryFreeClear(pReader->suppInfo.plist); + + taosArrayDestroy(pReader->suppInfo.pColAgg); taosMemoryFree(pReader->suppInfo.slotIds); - if (!isEmptyQueryTimeWindow(&pReader->window)) { - // tsdbMayUnTakeMemSnapshot(pTsdbReadHandle); - } else { - ASSERT(pReader->status.pTableMap == NULL); - } #if 0 // if (pReader->status.pTableScanInfo != NULL) { // pReader->status.pTableScanInfo = destroyTableCheckInfo(pReader->status.pTableScanInfo); @@ -3153,7 +2793,7 @@ void tsdbReaderClose(STsdbReader* pReader) { tsdbDebug("%p :io-cost summary: head-file read cnt:%" PRIu64 ", head-file time:%" PRIu64 " us, statis-info:%" PRId64 " us, datablock:%" PRId64 " us, check data:%" PRId64 " us, %s", - pReader, pCost->headFileLoad, pCost->headFileLoadTime, pCost->statisInfoLoadTime, pCost->blockLoadTime, + pReader, pCost->headFileLoad, pCost->headFileLoadTime, pCost->smaLoadTime, pCost->blockLoadTime, pCost->checkForNextTime, pReader->idStr); taosMemoryFree(pReader->idStr); @@ -3206,77 +2846,76 @@ void tsdbRetrieveDataBlockInfo(STsdbReader* pReader, SDataBlockInfo* pDataBlockI pDataBlockInfo->window = pReader->pResBlock->info.window; } -int32_t tsdbRetrieveDataBlockStatisInfo(STsdbReader* pReader, SColumnDataAgg*** pBlockStatis, bool* allHave) { +int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockStatis, bool* allHave) { int32_t code = 0; *allHave = false; + // there is no statistics data for composed block if (pReader->status.composedDataBlock) { *pBlockStatis = NULL; return TSDB_CODE_SUCCESS; } - // SFileBlockInfo* pBlockInfo = &pReader->pDataBlockInfo[c->slot]; - // assert((c->slot >= 0 && c->slot < pReader->numOfBlocks) || ((c->slot == pReader->numOfBlocks) && (c->slot == 0))); - - // // file block with sub-blocks has no statistics data - // if (pBlockInfo->compBlock->numOfSubBlocks > 1) { - // *pBlockStatis = NULL; - // return TSDB_CODE_SUCCESS; - // } - - // int64_t stime = taosGetTimestampUs(); - // int statisStatus = tsdbLoadBlockStatis(&pReader->rhelper, pBlockInfo->compBlock); - // if (statisStatus < TSDB_STATIS_OK) { - // return terrno; - // } else if (statisStatus > TSDB_STATIS_OK) { - // *pBlockStatis = NULL; - // return TSDB_CODE_SUCCESS; - // } - - // tsdbDebug("vgId:%d, succeed to load block statis part for uid %" PRIu64, REPO_ID(pReader->pTsdb), - // TSDB_READ_TABLE_UID(&pReader->rhelper)); - - // int16_t* colIds = pReader->suppInfo.defaultLoadColumn->pData; - - // size_t numOfCols = QH_GET_NUM_OF_COLS(pReader); - // memset(pReader->suppInfo.plist, 0, numOfCols * POINTER_BYTES); - // memset(pReader->suppInfo.pstatis, 0, numOfCols * sizeof(SColumnDataAgg)); - - // for (int32_t i = 0; i < numOfCols; ++i) { - // pReader->suppInfo.pstatis[i].colId = colIds[i]; - // } - - // *allHave = true; - // tsdbGetBlockStatis(&pReader->rhelper, pReader->suppInfo.pstatis, (int)numOfCols, pBlockInfo->compBlock); - - // // always load the first primary timestamp column data - // SColumnDataAgg* pPrimaryColStatis = &pReader->suppInfo.pstatis[0]; - // assert(pPrimaryColStatis->colId == PRIMARYKEY_TIMESTAMP_COL_ID); - - // pPrimaryColStatis->numOfNull = 0; - // pPrimaryColStatis->min = pBlockInfo->compBlock->minKey.ts; - // pPrimaryColStatis->max = pBlockInfo->compBlock->maxKey.ts; - // pReader->suppInfo.plist[0] = &pReader->suppInfo.pstatis[0]; - - // // update the number of NULL data rows - // int32_t* slotIds = pReader->suppInfo.slotIds; - // for (int32_t i = 1; i < numOfCols; ++i) { - // ASSERT(colIds[i] == pReader->pSchema->columns[slotIds[i]].colId); - // if (IS_BSMA_ON(&(pReader->pSchema->columns[slotIds[i]]))) { - // if (pReader->suppInfo.pstatis[i].numOfNull == -1) { // set the column data are all NULL - // pReader->suppInfo.pstatis[i].numOfNull = pBlockInfo->compBlock->numOfRows; - // } - - // pReader->suppInfo.plist[i] = &pReader->suppInfo.pstatis[i]; - // } else { - // *allHave = false; - // } - // } - - // int64_t elapsed = taosGetTimestampUs() - stime; - // pReader->cost.statisInfoLoadTime += elapsed; - - // *pBlockStatis = pReader->suppInfo.plist; + SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(&pReader->status.blockIter); + STableBlockScanInfo* pBlockScanInfo = taosHashGet(pReader->status.pTableMap, &pFBlock->uid, sizeof(pFBlock->uid)); + SBlock* pBlock = taosArrayGet(pBlockScanInfo->pBlockList, pFBlock->tbBlockIdx); + + int64_t stime = taosGetTimestampUs(); + + SBlockLoadSuppInfo* pSup = &pReader->suppInfo; + + if (tBlockHasSma(pBlock)) { + code = tsdbReadBlockSma(pReader->pFileReader, pBlock, pSup->pColAgg, NULL); + if (code != TSDB_CODE_SUCCESS) { + tsdbDebug("vgId:%d, failed to load block SMA for uid %" PRIu64 ", code:%s, %s", 0, pFBlock->uid, tstrerror(code), + pReader->idStr); + return code; + } + } else { + *pBlockStatis = NULL; + return TSDB_CODE_SUCCESS; + } + + *allHave = true; + + // always load the first primary timestamp column data + SColumnDataAgg* pTsAgg = &pSup->tsColAgg; + + pTsAgg->numOfNull = 0; + pTsAgg->colId = PRIMARYKEY_TIMESTAMP_COL_ID; + pTsAgg->min = pReader->pResBlock->info.window.skey; + pTsAgg->max = pReader->pResBlock->info.window.ekey; + pSup->plist[0] = pTsAgg; + + // update the number of NULL data rows + size_t numOfCols = blockDataGetNumOfCols(pReader->pResBlock); + + int32_t i = 0, j = 0; + while (j < numOfCols && i < taosArrayGetSize(pSup->pColAgg)) { + SColumnDataAgg* pAgg = taosArrayGet(pSup->pColAgg, i); + if (pAgg->colId == pSup->colIds[j]) { + if (IS_BSMA_ON(&(pReader->pSchema->columns[i]))) { + pSup->plist[j] = pAgg; + } else { + *allHave = false; + } + i += 1; + j += 1; + } else if (pAgg->colId < pSup->colIds[j]) { + i += 1; + } else if (pSup->colIds[j] < pAgg->colId) { + j += 1; + } + } + + int64_t elapsed = taosGetTimestampUs() - stime; + pReader->cost.smaLoadTime += elapsed; + + *pBlockStatis = pSup->plist; + + tsdbDebug("vgId:%d, succeed to load block SMA for uid %" PRIu64 ", elapsed time:%" PRId64 "us, %s", 0, pFBlock->uid, + elapsed, pReader->idStr); + return code; } @@ -3311,19 +2950,19 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond, int32_ return TSDB_CODE_SUCCESS; } - setQueryTimewindow(pReader, pCond, tWinIdx); - - pReader->order = pCond->order; - pReader->type = BLOCK_LOAD_OFFSET_ORDER; + pReader->order = pCond->order; + pReader->type = BLOCK_LOAD_OFFSET_ORDER; pReader->status.loadFromFile = true; pReader->status.pTableIter = NULL; pReader->window = updateQueryTimeWindow(pReader->pTsdb, &pCond->twindows[tWinIdx]); // allocate buffer in order to load data blocks from file - memset(pReader->suppInfo.pstatis, 0, sizeof(SColumnDataAgg)); + memset(&pReader->suppInfo.tsColAgg, 0, sizeof(SColumnDataAgg)); memset(pReader->suppInfo.plist, 0, POINTER_BYTES); + pReader->suppInfo.tsColAgg.colId = PRIMARYKEY_TIMESTAMP_COL_ID; + // todo set the correct numOfTables int32_t numOfTables = 1; SDataBlockIter* pBlockIter = &pReader->status.blockIter; @@ -3349,114 +2988,80 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond, int32_ return code; } -int32_t tsdbGetFileBlocksDistInfo(STsdbReader* pReader, STableBlockDistInfo* pTableBlockInfo) { - int32_t code = 0; - // pTableBlockInfo->totalSize = 0; - // pTableBlockInfo->totalRows = 0; - - // STsdbFS* pFileHandle = REPO_FS(pReader->pTsdb); - - // // find the start data block in file - // pReader->locateStart = true; - // STsdbKeepCfg* pCfg = REPO_KEEP_CFG(pReader->pTsdb); - // int32_t fid = getFileIdFromKey(pReader->window.skey, pCfg->days, pCfg->precision); - - // tsdbRLockFS(pFileHandle); - // tsdbFSIterInit(&pReader->fileIter, pFileHandle, pReader->order); - // tsdbFSIterSeek(&pReader->fileIter, fid); - // tsdbUnLockFS(pFileHandle); - - // STsdbCfg* pc = REPO_CFG(pReader->pTsdb); - // pTableBlockInfo->defMinRows = pc->minRows; - // pTableBlockInfo->defMaxRows = pc->maxRows; - - // int32_t bucketRange = ceil((pc->maxRows - pc->minRows) / 20.0); - - // pTableBlockInfo->numOfFiles += 1; +static int32_t getBucketIndex(int32_t startRow, int32_t bucketRange, int32_t numOfRows) { + return (numOfRows - startRow) / bucketRange; +} - // int32_t code = TSDB_CODE_SUCCESS; - // int32_t numOfBlocks = 0; - // int32_t numOfTables = (int32_t)taosArrayGetSize(pReader->pTableCheckInfo); - // int defaultRows = 4096; - // STimeWindow win = TSWINDOW_INITIALIZER; +int32_t tsdbGetFileBlocksDistInfo(STsdbReader* pReader, STableBlockDistInfo* pTableBlockInfo) { + int32_t code = TSDB_CODE_SUCCESS; + pTableBlockInfo->totalSize = 0; + pTableBlockInfo->totalRows = 0; - // while (true) { - // numOfBlocks = 0; - // tsdbRLockFS(REPO_FS(pReader->pTsdb)); + // find the start data block in file + SReaderStatus* pStatus = &pReader->status; - // if ((pReader->pFileGroup = tsdbFSIterNext(&pReader->fileIter)) == NULL) { - // tsdbUnLockFS(REPO_FS(pReader->pTsdb)); - // break; - // } + STsdbCfg* pc = &pReader->pTsdb->pVnode->config.tsdbCfg; + pTableBlockInfo->defMinRows = pc->minRows; + pTableBlockInfo->defMaxRows = pc->maxRows; - // tsdbGetFidKeyRange(pCfg->days, pCfg->precision, pReader->pFileGroup->fid, &win.skey, &win.ekey); + int32_t bucketRange = ceil((pc->maxRows - pc->minRows) / 20.0); - // // current file are not overlapped with query time window, ignore remain files - // if ((win.skey > pReader->window.ekey) /* || (!ascTraverse && win.ekey < pTsdbReadHandle->window.ekey)*/) { - // tsdbUnLockFS(REPO_FS(pReader->pTsdb)); - // tsdbDebug("%p remain files are not qualified for qrange:%" PRId64 "-%" PRId64 ", ignore, %s", pReader, - // pReader->window.skey, pReader->window.ekey, pReader->idStr); - // pReader->pFileGroup = NULL; - // break; - // } + pTableBlockInfo->numOfFiles += 1; - // pTableBlockInfo->numOfFiles += 1; - // if (tsdbSetAndOpenReadFSet(&pReader->rhelper, pReader->pFileGroup) < 0) { - // tsdbUnLockFS(REPO_FS(pReader->pTsdb)); - // code = terrno; - // break; - // } + int32_t numOfTables = (int32_t)taosHashGetSize(pStatus->pTableMap); + int defaultRows = 4096; - // tsdbUnLockFS(REPO_FS(pReader->pTsdb)); + SDataBlockIter* pBlockIter = &pStatus->blockIter; + pTableBlockInfo->numOfFiles += pStatus->fileIter.numOfFiles; + pTableBlockInfo->numOfBlocks += pBlockIter->numOfBlocks; - // if (tsdbLoadBlockIdx(&pReader->rhelper) < 0) { - // code = terrno; - // break; - // } + pTableBlockInfo->numOfTables = numOfTables; + bool hasNext = true; - // if ((code = getFileCompInfo(pReader, &numOfBlocks)) != TSDB_CODE_SUCCESS) { - // break; - // } + while (true) { + if (hasNext) { + SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(pBlockIter); + STableBlockScanInfo* pScanInfo = taosHashGet(pStatus->pTableMap, &pFBlock->uid, sizeof(pFBlock->uid)); + SBlock* pBlock = taosArrayGet(pScanInfo->pBlockList, pFBlock->tbBlockIdx); - // tsdbDebug("%p %d blocks found in file for %d table(s), fid:%d, %s", pReader, numOfBlocks, numOfTables, - // pReader->pFileGroup->fid, pReader->idStr); + int32_t numOfRows = pBlock->nRow; + pTableBlockInfo->totalRows += numOfRows; - // if (numOfBlocks == 0) { - // continue; - // } + if (numOfRows > pTableBlockInfo->maxRows) { + pTableBlockInfo->maxRows = numOfRows; + } - // pTableBlockInfo->numOfBlocks += numOfBlocks; + if (numOfRows < pTableBlockInfo->minRows) { + pTableBlockInfo->minRows = numOfRows; + } - // for (int32_t i = 0; i < numOfTables; ++i) { - // STableBlockScanInfo* pCheckInfo = taosArrayGet(pReader->pTableCheckInfo, i); + if (numOfRows < defaultRows) { + pTableBlockInfo->numOfSmallBlocks += 1; + } - // SBlock* pBlock = pCheckInfo->pCompInfo->blocks; + int32_t bucketIndex = getBucketIndex(pTableBlockInfo->defMinRows, bucketRange, numOfRows); + pTableBlockInfo->blockRowsHisto[bucketIndex]++; - // for (int32_t j = 0; j < pCheckInfo->numOfBlocks; ++j) { - // pTableBlockInfo->totalSize += pBlock[j].len; + hasNext = blockIteratorNext(&pStatus->blockIter); - // int32_t numOfRows = pBlock[j].numOfRows; - // pTableBlockInfo->totalRows += numOfRows; + } else { + code = initForFirstBlockInFile(pReader, pBlockIter); + if ((code != TSDB_CODE_SUCCESS) || (pReader->status.loadFromFile == false)) { + break; + } - // if (numOfRows > pTableBlockInfo->maxRows) { - // pTableBlockInfo->maxRows = numOfRows; - // } + pTableBlockInfo->numOfBlocks += pBlockIter->numOfBlocks; + } - // if (numOfRows < pTableBlockInfo->minRows) { - // pTableBlockInfo->minRows = numOfRows; - // } +/* + hasNext = blockIteratorNext(&pStatus->blockIter); +*/ - // if (numOfRows < defaultRows) { - // pTableBlockInfo->numOfSmallBlocks += 1; - // } - // int32_t bucketIndex = getBucketIndex(pTableBlockInfo->defMinRows, bucketRange, numOfRows); - // pTableBlockInfo->blockRowsHisto[bucketIndex]++; - // } - // } - // } +// tsdbDebug("%p %d blocks found in file for %d table(s), fid:%d, %s", pReader, numOfBlocks, numOfTables, +// pReader->pFileGroup->fid, pReader->idStr); + } - // pTableBlockInfo->numOfTables = numOfTables; return code; } @@ -3491,3 +3096,39 @@ int64_t tsdbGetNumOfRowsInMemTable(STsdbReader* pReader) { return rows; } + +int32_t tsdbGetTableSchema(SVnode* pVnode, int64_t uid, STSchema** pSchema, int64_t *suid) { + int32_t sversion = 1; + + SMetaReader mr = {0}; + metaReaderInit(&mr, pVnode->pMeta, 0); + int32_t code = metaGetTableEntryByUid(&mr, uid); + if (code != TSDB_CODE_SUCCESS) { + terrno = TSDB_CODE_TDB_INVALID_TABLE_ID; + metaReaderClear(&mr); + return terrno; + } + + *suid = 0; + + if (mr.me.type == TSDB_CHILD_TABLE) { + *suid = mr.me.ctbEntry.suid; + code = metaGetTableEntryByUid(&mr, *suid); + if (code != TSDB_CODE_SUCCESS) { + terrno = TSDB_CODE_TDB_INVALID_TABLE_ID; + metaReaderClear(&mr); + return terrno; + } + sversion = mr.me.stbEntry.schemaRow.version; + } else { + ASSERT(mr.me.type == TSDB_NORMAL_TABLE); + sversion = mr.me.ntbEntry.schemaRow.version; + } + + metaReaderClear(&mr); + *pSchema = metaGetTbTSchema(pVnode->pMeta, uid, sversion); + + return TSDB_CODE_SUCCESS; +} + + diff --git a/source/dnode/vnode/src/tsdb/tsdbReadImpl.c b/source/dnode/vnode/src/tsdb/tsdbReadImpl.c deleted file mode 100644 index fe0d3a1b6f093a64e595c85f6ba97fecee3a5200..0000000000000000000000000000000000000000 --- a/source/dnode/vnode/src/tsdb/tsdbReadImpl.c +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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 "tsdb.h" diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index c22d1a4064d306b7a96d6908a801df1138d8a27a..a331f88e61523003187850c47c593b28f94b817a 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -49,7 +49,7 @@ int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb } pDelFWriter->fDel.size = TSDB_FHDR_SIZE; - pDelFWriter->fDel.size = 0; + pDelFWriter->fDel.offset = 0; *ppWriter = pDelFWriter; return code; @@ -969,6 +969,8 @@ int32_t tsdbReadColData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBl SBlockData *pBlockData1 = &(SBlockData){0}; SBlockData *pBlockData2 = &(SBlockData){0}; + tBlockDataInit(pBlockData1); + tBlockDataInit(pBlockData2); for (int32_t iSubBlock = 1; iSubBlock < pBlock->nSubBlock; iSubBlock++) { code = tsdbReadSubColData(pReader, pBlockIdx, pBlock, iSubBlock, aColId, nCol, pBlockData1, ppBuf1, ppBuf2); if (code) goto _err; @@ -1106,6 +1108,8 @@ int32_t tsdbReadBlockData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *p SBlockData *pBlockData1 = &(SBlockData){0}; SBlockData *pBlockData2 = &(SBlockData){0}; + tBlockDataInit(pBlockData1); + tBlockDataInit(pBlockData2); for (iSubBlock = 1; iSubBlock < pBlock->nSubBlock; iSubBlock++) { code = tsdbReadSubBlockData(pReader, pBlockIdx, pBlock, iSubBlock, pBlockData1, ppBuf1, ppBuf2); if (code) { @@ -1152,7 +1156,7 @@ _err: int32_t tsdbReadBlockSma(SDataFReader *pReader, SBlock *pBlock, SArray *aColumnDataAgg, uint8_t **ppBuf) { int32_t code = 0; TdFilePtr pFD = pReader->pSmaFD; - int64_t offset = pBlock->aSubBlock[0].offset; + int64_t offset = pBlock->aSubBlock[0].sOffset; int64_t size = pBlock->aSubBlock[0].nSma * sizeof(SColumnDataAgg) + sizeof(TSCKSUM); uint8_t *pBuf = NULL; int64_t n; @@ -1175,10 +1179,13 @@ int32_t tsdbReadBlockSma(SDataFReader *pReader, SBlock *pBlock, SArray *aColumnD if (n < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; + } else if (n < size) { + code = TSDB_CODE_FILE_CORRUPTED; + goto _err; } // check - if (!taosCheckChecksumWhole(NULL, size)) { + if (!taosCheckChecksumWhole(*ppBuf, size)) { code = TSDB_CODE_FILE_CORRUPTED; goto _err; } diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index f906ef1b54e72e5b0a229bcce3f6842e120c31ce..ed8bdc17a50d9f132a0b9651cc4143369e632b57 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -821,16 +821,20 @@ int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest) { int32_t code = 0; int32_t size; + ASSERT(pColDataSrc->nVal > 0); + pColDataDest->cid = pColDataSrc->cid; pColDataDest->type = pColDataSrc->type; pColDataDest->smaOn = pColDataSrc->smaOn; pColDataDest->nVal = pColDataSrc->nVal; pColDataDest->flag = pColDataSrc->flag; - size = BIT2_SIZE(pColDataSrc->nVal); - code = tRealloc(&pColDataDest->pBitMap, size); - if (code) goto _exit; - memcpy(pColDataDest->pBitMap, pColDataSrc->pBitMap, size); + if (pColDataSrc->flag != HAS_NONE && pColDataSrc->flag != HAS_NULL && pColDataSrc->flag != HAS_VALUE) { + size = BIT2_SIZE(pColDataSrc->nVal); + code = tRealloc(&pColDataDest->pBitMap, size); + if (code) goto _exit; + memcpy(pColDataDest->pBitMap, pColDataSrc->pBitMap, size); + } if (IS_VAR_DATA_TYPE(pColDataDest->type)) { size = sizeof(int32_t) * pColDataSrc->nVal; @@ -1230,10 +1234,26 @@ void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) { break; case TSDB_DATA_TYPE_SMALLINT: break; - case TSDB_DATA_TYPE_INT: + case TSDB_DATA_TYPE_INT: { + pColAgg->sum += colVal.value.i32; + if (pColAgg->min > colVal.value.i32) { + pColAgg->min = colVal.value.i32; + } + if (pColAgg->max < colVal.value.i32) { + pColAgg->max = colVal.value.i32; + } break; - case TSDB_DATA_TYPE_BIGINT: + } + case TSDB_DATA_TYPE_BIGINT: { + pColAgg->sum += colVal.value.i64; + if (pColAgg->min > colVal.value.i64) { + pColAgg->min = colVal.value.i64; + } + if (pColAgg->max < colVal.value.i64) { + pColAgg->max = colVal.value.i64; + } break; + } case TSDB_DATA_TYPE_FLOAT: break; case TSDB_DATA_TYPE_DOUBLE: diff --git a/source/dnode/vnode/src/vnd/vnodeStateMgr.c b/source/dnode/vnode/src/vnd/vnodeStateMgr.c deleted file mode 100644 index 6dea4a4e57392be988126c579648f39a8270b9bf..0000000000000000000000000000000000000000 --- a/source/dnode/vnode/src/vnd/vnodeStateMgr.c +++ /dev/null @@ -1,14 +0,0 @@ -/* - * 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 . - */ \ No newline at end of file diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index bceac024bcb180b2c686b2f020e92e2183b033d9..cd25707fce3288d1c79c47a53bf2b939e236e454 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -296,7 +296,7 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) { case TDMT_SCH_MERGE_FETCH: return qWorkerProcessFetchMsg(pVnode, pVnode->pQuery, pMsg, 0); case TDMT_SCH_FETCH_RSP: - return qWorkerProcessFetchRsp(pVnode, pVnode->pQuery, pMsg, 0); + return qWorkerProcessRspMsg(pVnode, pVnode->pQuery, pMsg, 0); case TDMT_SCH_CANCEL_TASK: return qWorkerProcessCancelMsg(pVnode, pVnode->pQuery, pMsg, 0); case TDMT_SCH_DROP_TASK: diff --git a/source/libs/executor/inc/dataSinkInt.h b/source/libs/executor/inc/dataSinkInt.h index dead1aff7383a0f6da2b8d83d290bdd7a1be3a31..9426c99a0fc4fa55429fb1541f80be3efe0ef62f 100644 --- a/source/libs/executor/inc/dataSinkInt.h +++ b/source/libs/executor/inc/dataSinkInt.h @@ -34,7 +34,7 @@ typedef struct SDataSinkManager { typedef int32_t (*FPutDataBlock)(struct SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue); typedef void (*FEndPut)(struct SDataSinkHandle* pHandle, uint64_t useconds); -typedef void (*FGetDataLength)(struct SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryEnd); +typedef void (*FGetDataLength)(struct SDataSinkHandle* pHandle, int64_t* pLen, bool* pQueryEnd); typedef int32_t (*FGetDataBlock)(struct SDataSinkHandle* pHandle, SOutputData* pOutput); typedef int32_t (*FDestroyDataSinker)(struct SDataSinkHandle* pHandle); typedef int32_t (*FGetCacheSize)(struct SDataSinkHandle* pHandle, uint64_t* size); @@ -50,6 +50,7 @@ typedef struct SDataSinkHandle { int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle); int32_t createDataDeleter(SDataSinkManager* pManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle, void *pParam); +int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle, void *pParam); #ifdef __cplusplus } diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 8994c9d192490722c9883c9641c1a14df8b5a786..5df653324dd0bec17e0720cdd92b456df130a5f2 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -348,7 +348,7 @@ typedef struct SessionWindowSupporter { uint8_t parentType; } SessionWindowSupporter; -typedef struct SStreamBlockScanInfo { +typedef struct SStreamScanInfo { uint64_t tableUid; // queried super table uid SExprInfo* pPseudoExpr; int32_t numOfPseudoExpr; @@ -365,7 +365,7 @@ typedef struct SStreamBlockScanInfo { int32_t blockType; // current block type int32_t validBlockIndex; // Is current data has returned? uint64_t numOfExec; // execution times - void* streamBlockReader;// stream block reader handle + STqReader* tqReader; int32_t tsArrayIndex; SArray* tsArray; @@ -374,7 +374,7 @@ typedef struct SStreamBlockScanInfo { EStreamScanMode scanMode; SOperatorInfo* pStreamScanOp; - SOperatorInfo* pSnapshotReadOp; + SOperatorInfo* pTableScanOp; SArray* childIds; SessionWindowSupporter sessionSup; bool assignBlockUid; // assign block uid to groupId, temporarily used for generating rollup SMA. @@ -383,7 +383,12 @@ typedef struct SStreamBlockScanInfo { SSDataBlock* pPullDataRes; // pull data SSDataBlock SSDataBlock* pDeleteDataRes; // delete data SSDataBlock int32_t deleteDataIndex; -} SStreamBlockScanInfo; + + // status for tmq + //SSchemaWrapper schema; + STqOffset offset; + +} SStreamScanInfo; typedef struct SSysTableScanInfo { SRetrieveMetaTableRsp* pRsp; @@ -518,6 +523,7 @@ typedef struct SIndefOperatorInfo { SAggSupporter aggSup; SArray* pPseudoColInfo; SExprSupp scalarSup; + SNode* pCondition; } SIndefOperatorInfo; typedef struct SFillOperatorInfo { @@ -528,6 +534,7 @@ typedef struct SFillOperatorInfo { SSDataBlock* existNewGroupBlock; bool multigroupResult; STimeWindow win; + SNode* pCondition; } SFillOperatorInfo; typedef struct SGroupbyOperatorInfo { @@ -799,7 +806,7 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SExprI SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId, - SExecTaskInfo* pTaskInfo); + SNode* pCondition, SExecTaskInfo* pTaskInfo); SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild); @@ -878,7 +885,7 @@ int32_t decodeOperator(SOperatorInfo* ops, const char* data, int32_t length); void setTaskStatus(SExecTaskInfo* pTaskInfo, int8_t status); int32_t createExecTaskInfoImpl(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, SReadHandle* pHandle, uint64_t taskId, const char* sql, EOPTR_EXEC_MODEL model); -int32_t createDataSinkParam(SDataSinkNode *pNode, void **pParam, qTaskInfo_t* pTaskInfo); +int32_t createDataSinkParam(SDataSinkNode *pNode, void **pParam, qTaskInfo_t* pTaskInfo, SReadHandle* readHandle); int32_t getOperatorExplainExecInfo(SOperatorInfo* operatorInfo, SExplainExecInfo** pRes, int32_t* capacity, int32_t* resNum); diff --git a/source/libs/executor/src/dataDeleter.c b/source/libs/executor/src/dataDeleter.c index 8c220134f026c4be7021ecaba1b7ea6acfd91691..3c56abbd15395d7c1a1f8942e8ea9587a4e1a2ce 100644 --- a/source/libs/executor/src/dataDeleter.c +++ b/source/libs/executor/src/dataDeleter.c @@ -154,7 +154,7 @@ static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) { taosThreadMutexUnlock(&pDeleter->mutex); } -static void getDataLength(SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryEnd) { +static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, bool* pQueryEnd) { SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle; if (taosQueueEmpty(pDeleter->pDataBlocks)) { *pQueryEnd = pDeleter->queryEnd; @@ -168,7 +168,7 @@ static void getDataLength(SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryE taosFreeQitem(pBuf); *pLen = ((SDataCacheEntry*)(pDeleter->nextOutput.pData))->dataLen; *pQueryEnd = pDeleter->queryEnd; - qDebug("got data len %d, row num %d in sink", *pLen, ((SDataCacheEntry*)(pDeleter->nextOutput.pData))->numOfRows); + qDebug("got data len %" PRId64 ", row num %d in sink", *pLen, ((SDataCacheEntry*)(pDeleter->nextOutput.pData))->numOfRows); } static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) { diff --git a/source/libs/executor/src/dataDispatcher.c b/source/libs/executor/src/dataDispatcher.c index 5ee222efb7b78256cb09819ce7d6ac51d650005d..b8495faffd52aa5d4146598bd00bc45034ff6bdf 100644 --- a/source/libs/executor/src/dataDispatcher.c +++ b/source/libs/executor/src/dataDispatcher.c @@ -156,7 +156,7 @@ static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) { taosThreadMutexUnlock(&pDispatcher->mutex); } -static void getDataLength(SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryEnd) { +static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, bool* pQueryEnd) { SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle; if (taosQueueEmpty(pDispatcher->pDataBlocks)) { *pQueryEnd = pDispatcher->queryEnd; @@ -170,7 +170,7 @@ static void getDataLength(SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryE taosFreeQitem(pBuf); *pLen = ((SDataCacheEntry*)(pDispatcher->nextOutput.pData))->dataLen; *pQueryEnd = pDispatcher->queryEnd; - qDebug("got data len %d, row num %d in sink", *pLen, ((SDataCacheEntry*)(pDispatcher->nextOutput.pData))->numOfRows); + qDebug("got data len %" PRId64 ", row num %d in sink", *pLen, ((SDataCacheEntry*)(pDispatcher->nextOutput.pData))->numOfRows); } static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) { diff --git a/source/libs/executor/src/dataInserter.c b/source/libs/executor/src/dataInserter.c index c424cb33fa1a79b50d1b24d13f2e34d0588816b3..e53c9fae6f8a0f8feffde8397a42aa2cb3e334fe 100644 --- a/source/libs/executor/src/dataInserter.c +++ b/source/libs/executor/src/dataInserter.c @@ -24,195 +24,266 @@ extern SDataSinkStat gDataSinkStat; -typedef struct SDataInserterBuf { - int32_t useSize; - int32_t allocSize; - char* pData; -} SDataInserterBuf; - -typedef struct SDataCacheEntry { - int32_t dataLen; - int32_t numOfRows; - int32_t numOfCols; - int8_t compressed; - char data[]; -} SDataCacheEntry; +typedef struct SSubmitRes { + int64_t affectedRows; + int32_t code; + SSubmitRsp *pRsp; +} SSubmitRes; typedef struct SDataInserterHandle { SDataSinkHandle sink; SDataSinkManager* pManager; - SDataBlockDescNode* pSchema; - SDataDeleterNode* pDeleter; - SDeleterParam* pParam; - STaosQueue* pDataBlocks; - SDataInserterBuf nextOutput; + STSchema* pSchema; + SQueryInserterNode* pNode; + SSubmitRes submitRes; + SInserterParam* pParam; + SArray* pDataBlocks; + SHashObj* pCols; int32_t status; bool queryEnd; uint64_t useconds; uint64_t cachedSize; TdThreadMutex mutex; + tsem_t ready; } SDataInserterHandle; -static bool needCompress(const SSDataBlock* pData, int32_t numOfCols) { - if (tsCompressColData < 0 || 0 == pData->info.rows) { - return false; - } +typedef struct SSubmitRspParam { + SDataInserterHandle* pInserter; +} SSubmitRspParam; + +int32_t inserterCallback(void* param, SDataBuf* pMsg, int32_t code) { + SSubmitRspParam* pParam = (SSubmitRspParam*)param; + SDataInserterHandle* pInserter = pParam->pInserter; - for (int32_t col = 0; col < numOfCols; ++col) { - SColumnInfoData* pColRes = taosArrayGet(pData->pDataBlock, col); - int32_t colSize = pColRes->info.bytes * pData->info.rows; - if (NEEDTO_COMPRESS_QUERY(colSize)) { - return true; + pInserter->submitRes.code = code; + + if (code == TSDB_CODE_SUCCESS) { + pInserter->submitRes.pRsp = taosMemoryCalloc(1, sizeof(SSubmitRsp)); + SDecoder coder = {0}; + tDecoderInit(&coder, pMsg->pData, pMsg->len); + code = tDecodeSSubmitRsp(&coder, pInserter->submitRes.pRsp); + if (code) { + tFreeSSubmitRsp(pInserter->submitRes.pRsp); + pInserter->submitRes.code = code; + goto _return; } + + if (pInserter->submitRes.pRsp->nBlocks > 0) { + for (int32_t i = 0; i < pInserter->submitRes.pRsp->nBlocks; ++i) { + SSubmitBlkRsp *blk = pInserter->submitRes.pRsp->pBlocks + i; + if (TSDB_CODE_SUCCESS != blk->code) { + code = blk->code; + tFreeSSubmitRsp(pInserter->submitRes.pRsp); + pInserter->submitRes.code = code; + goto _return; + } + } + } + + pInserter->submitRes.affectedRows += pInserter->submitRes.pRsp->affectedRows; + qDebug("submit rsp received, affectedRows:%d, total:%d", pInserter->submitRes.pRsp->affectedRows, pInserter->submitRes.affectedRows); + + tFreeSSubmitRsp(pInserter->submitRes.pRsp); } - return false; -} +_return: -static void toDataCacheEntry(SDataInserterHandle* pHandle, const SInputData* pInput, SDataInserterBuf* pBuf) { - int32_t numOfCols = LIST_LENGTH(pHandle->pSchema->pSlots); + tsem_post(&pInserter->ready); - SDataCacheEntry* pEntry = (SDataCacheEntry*)pBuf->pData; - pEntry->compressed = 0; - pEntry->numOfRows = pInput->pData->info.rows; - pEntry->numOfCols = taosArrayGetSize(pInput->pData->pDataBlock); - pEntry->dataLen = sizeof(SDeleterRes); + taosMemoryFree(param); + + return TSDB_CODE_SUCCESS; +} - ASSERT(1 == pEntry->numOfRows); - ASSERT(1 == pEntry->numOfCols); - pBuf->useSize = sizeof(SDataCacheEntry); +static int32_t sendSubmitRequest(SDataInserterHandle* pInserter, SSubmitReq* pMsg, void* pTransporter, SEpSet* pEpset) { + // send the fetch remote task result reques + SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo)); + if (NULL == pMsgSendInfo) { + taosMemoryFreeClear(pMsg); + terrno = TSDB_CODE_QRY_OUT_OF_MEMORY; + return terrno; + } - SColumnInfoData* pColRes = (SColumnInfoData*)taosArrayGet(pInput->pData->pDataBlock, 0); + SSubmitRspParam* pParam = taosMemoryCalloc(1, sizeof(SSubmitRspParam)); + pParam->pInserter = pInserter; - SDeleterRes* pRes = (SDeleterRes*)pEntry->data; - pRes->suid = pHandle->pParam->suid; - pRes->uidList = pHandle->pParam->pUidList; - pRes->skey = pHandle->pDeleter->deleteTimeRange.skey; - pRes->ekey = pHandle->pDeleter->deleteTimeRange.ekey; - pRes->affectedRows = *(int64_t*)pColRes->pData; + pMsgSendInfo->param = pParam; + pMsgSendInfo->msgInfo.pData = pMsg; + pMsgSendInfo->msgInfo.len = ntohl(pMsg->length); + pMsgSendInfo->msgType = TDMT_VND_SUBMIT; + pMsgSendInfo->fp = inserterCallback; - pBuf->useSize += pEntry->dataLen; - - atomic_add_fetch_64(&pHandle->cachedSize, pEntry->dataLen); - atomic_add_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen); + int64_t transporterId = 0; + return asyncSendMsgToServer(pTransporter, pEpset, &transporterId, pMsgSendInfo); } -static bool allocBuf(SDataInserterHandle* pDeleter, const SInputData* pInput, SDataInserterBuf* pBuf) { - uint32_t capacity = pDeleter->pManager->cfg.maxDataBlockNumPerQuery; - if (taosQueueItemSize(pDeleter->pDataBlocks) > capacity) { - qError("SinkNode queue is full, no capacity, max:%d, current:%d, no capacity", capacity, - taosQueueItemSize(pDeleter->pDataBlocks)); - return false; + +int32_t dataBlockToSubmit(SDataInserterHandle* pInserter, SSubmitReq** pReq) { + const SArray* pBlocks = pInserter->pDataBlocks; + const STSchema* pTSchema = pInserter->pSchema; + int64_t uid = pInserter->pNode->tableId; + int64_t suid = pInserter->pNode->stableId; + int32_t vgId = pInserter->pNode->vgId; + bool fullCol = (pInserter->pNode->pCols->length == pTSchema->numOfCols); + + SSubmitReq* ret = NULL; + int32_t sz = taosArrayGetSize(pBlocks); + + // cal size + int32_t cap = sizeof(SSubmitReq); + for (int32_t i = 0; i < sz; i++) { + SSDataBlock* pDataBlock = taosArrayGetP(pBlocks, i); + int32_t rows = pDataBlock->info.rows; + // TODO min + int32_t rowSize = pDataBlock->info.rowSize; + int32_t maxLen = TD_ROW_MAX_BYTES_FROM_SCHEMA(pTSchema); + + cap += sizeof(SSubmitBlk) + rows * maxLen; } - pBuf->allocSize = sizeof(SDataCacheEntry) + sizeof(SDeleterRes); + // assign data + // TODO + ret = taosMemoryCalloc(1, cap); + ret->header.vgId = htonl(vgId); + ret->version = htonl(pTSchema->version); + ret->length = sizeof(SSubmitReq); + ret->numOfBlocks = htonl(sz); + + SSubmitBlk* blkHead = POINTER_SHIFT(ret, sizeof(SSubmitReq)); + for (int32_t i = 0; i < sz; i++) { + SSDataBlock* pDataBlock = taosArrayGetP(pBlocks, i); + + blkHead->sversion = htonl(pTSchema->version); + // TODO + blkHead->suid = htobe64(suid); + blkHead->uid = htobe64(uid); + blkHead->schemaLen = htonl(0); + + int32_t rows = 0; + int32_t dataLen = 0; + STSRow* rowData = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk)); + int64_t lastTs = TSKEY_MIN; + bool ignoreRow = false; + for (int32_t j = 0; j < pDataBlock->info.rows; j++) { + SRowBuilder rb = {0}; + tdSRowInit(&rb, pTSchema->version); + tdSRowSetTpInfo(&rb, pTSchema->numOfCols, pTSchema->flen); + tdSRowResetBuf(&rb, rowData); + + ignoreRow = false; + for (int32_t k = 0; k < pTSchema->numOfCols; k++) { + const STColumn* pColumn = &pTSchema->columns[k]; + SColumnInfoData* pColData = NULL; + int16_t colIdx = k; + if (!fullCol) { + int16_t *slotId = taosHashGet(pInserter->pCols, &pColumn->colId, sizeof(pColumn->colId)); + if (NULL == slotId) { + continue; + } + + colIdx = *slotId; + } + + pColData = taosArrayGet(pDataBlock->pDataBlock, colIdx); + if (pColData->info.type != pColumn->type) { + qError("col type mis-match, schema type:%d, type in block:%d", pColumn->type, pColData->info.type); + terrno = TSDB_CODE_APP_ERROR; + return TSDB_CODE_APP_ERROR; + } + + if (colDataIsNull_s(pColData, j)) { + if (0 == k && TSDB_DATA_TYPE_TIMESTAMP == pColumn->type) { + ignoreRow = true; + break; + } + + tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, pColumn->offset, k); + } else { + void* data = colDataGetData(pColData, j); + if (0 == k && TSDB_DATA_TYPE_TIMESTAMP == pColumn->type) { + if (*(int64_t*)data == lastTs) { + ignoreRow = true; + break; + } else { + lastTs = *(int64_t*)data; + } + } + tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, data, true, pColumn->offset, k); + } + } + + if (ignoreRow) { + continue; + } + + rows++; + int32_t rowLen = TD_ROW_LEN(rowData); + rowData = POINTER_SHIFT(rowData, rowLen); + dataLen += rowLen; + } + + blkHead->dataLen = htonl(dataLen); + blkHead->numOfRows = htons(rows); - pBuf->pData = taosMemoryMalloc(pBuf->allocSize); - if (pBuf->pData == NULL) { - qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno)); + ret->length += sizeof(SSubmitBlk) + dataLen; + blkHead = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk) + dataLen); } - return NULL != pBuf->pData; -} + ret->length = htonl(ret->length); -static int32_t updateStatus(SDataInserterHandle* pDeleter) { - taosThreadMutexLock(&pDeleter->mutex); - int32_t blockNums = taosQueueItemSize(pDeleter->pDataBlocks); - int32_t status = - (0 == blockNums ? DS_BUF_EMPTY - : (blockNums < pDeleter->pManager->cfg.maxDataBlockNumPerQuery ? DS_BUF_LOW : DS_BUF_FULL)); - pDeleter->status = status; - taosThreadMutexUnlock(&pDeleter->mutex); - return status; -} + *pReq = ret; -static int32_t getStatus(SDataInserterHandle* pDeleter) { - taosThreadMutexLock(&pDeleter->mutex); - int32_t status = pDeleter->status; - taosThreadMutexUnlock(&pDeleter->mutex); - return status; + return TSDB_CODE_SUCCESS; } + static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) { - SDataInserterHandle* pDeleter = (SDataInserterHandle*)pHandle; - SDataInserterBuf* pBuf = taosAllocateQitem(sizeof(SDataInserterBuf), DEF_QITEM); - if (NULL == pBuf || !allocBuf(pDeleter, pInput, pBuf)) { - return TSDB_CODE_QRY_OUT_OF_MEMORY; + SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle; + taosArrayPush(pInserter->pDataBlocks, &pInput->pData); + SSubmitReq* pMsg = NULL; + int32_t code = dataBlockToSubmit(pInserter, &pMsg); + if (code) { + return code; } - toDataCacheEntry(pDeleter, pInput, pBuf); - taosWriteQitem(pDeleter->pDataBlocks, pBuf); - *pContinue = (DS_BUF_LOW == updateStatus(pDeleter) ? true : false); - return TSDB_CODE_SUCCESS; -} - -static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) { - SDataInserterHandle* pDeleter = (SDataInserterHandle*)pHandle; - taosThreadMutexLock(&pDeleter->mutex); - pDeleter->queryEnd = true; - pDeleter->useconds = useconds; - taosThreadMutexUnlock(&pDeleter->mutex); -} -static void getDataLength(SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryEnd) { - SDataInserterHandle* pDeleter = (SDataInserterHandle*)pHandle; - if (taosQueueEmpty(pDeleter->pDataBlocks)) { - *pQueryEnd = pDeleter->queryEnd; - *pLen = 0; - return; + code = sendSubmitRequest(pInserter, pMsg, pInserter->pParam->readHandle->pMsgCb->clientRpc, &pInserter->pNode->epSet); + if (code) { + return code; } - SDataInserterBuf* pBuf = NULL; - taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf); - memcpy(&pDeleter->nextOutput, pBuf, sizeof(SDataInserterBuf)); - taosFreeQitem(pBuf); - *pLen = ((SDataCacheEntry*)(pDeleter->nextOutput.pData))->dataLen; - *pQueryEnd = pDeleter->queryEnd; - qDebug("got data len %d, row num %d in sink", *pLen, ((SDataCacheEntry*)(pDeleter->nextOutput.pData))->numOfRows); -} + tsem_wait(&pInserter->ready); -static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) { - SDataInserterHandle* pDeleter = (SDataInserterHandle*)pHandle; - if (NULL == pDeleter->nextOutput.pData) { - assert(pDeleter->queryEnd); - pOutput->useconds = pDeleter->useconds; - pOutput->precision = pDeleter->pSchema->precision; - pOutput->bufStatus = DS_BUF_EMPTY; - pOutput->queryEnd = pDeleter->queryEnd; - return TSDB_CODE_SUCCESS; + if (pInserter->submitRes.code) { + return pInserter->submitRes.code; } - SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDeleter->nextOutput.pData); - memcpy(pOutput->pData, pEntry->data, pEntry->dataLen); - pOutput->numOfRows = pEntry->numOfRows; - pOutput->numOfCols = pEntry->numOfCols; - pOutput->compressed = pEntry->compressed; - - atomic_sub_fetch_64(&pDeleter->cachedSize, pEntry->dataLen); - atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen); - - taosMemoryFreeClear(pDeleter->nextOutput.pData); // todo persistent - pOutput->bufStatus = updateStatus(pDeleter); - taosThreadMutexLock(&pDeleter->mutex); - pOutput->queryEnd = pDeleter->queryEnd; - pOutput->useconds = pDeleter->useconds; - pOutput->precision = pDeleter->pSchema->precision; - taosThreadMutexUnlock(&pDeleter->mutex); + + *pContinue = true; return TSDB_CODE_SUCCESS; } +static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) { + SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle; + taosThreadMutexLock(&pInserter->mutex); + pInserter->queryEnd = true; + pInserter->useconds = useconds; + taosThreadMutexUnlock(&pInserter->mutex); +} + +static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, bool* pQueryEnd) { + SDataInserterHandle* pDispatcher = (SDataInserterHandle*)pHandle; + *pLen = pDispatcher->submitRes.affectedRows; + qDebug("got total affectedRows %" PRId64 , *pLen); +} + + static int32_t destroyDataSinker(SDataSinkHandle* pHandle) { - SDataInserterHandle* pDeleter = (SDataInserterHandle*)pHandle; - atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pDeleter->cachedSize); - taosMemoryFreeClear(pDeleter->nextOutput.pData); - while (!taosQueueEmpty(pDeleter->pDataBlocks)) { - SDataInserterBuf* pBuf = NULL; - taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf); - taosMemoryFreeClear(pBuf->pData); - taosFreeQitem(pBuf); - } - taosCloseQueue(pDeleter->pDataBlocks); - taosThreadMutexDestroy(&pDeleter->mutex); + SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle; + atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pInserter->cachedSize); + taosArrayDestroy(pInserter->pDataBlocks); + taosMemoryFree(pInserter->pSchema); + taosThreadMutexDestroy(&pInserter->mutex); return TSDB_CODE_SUCCESS; } @@ -230,25 +301,46 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat return TSDB_CODE_QRY_OUT_OF_MEMORY; } - SDataDeleterNode* pDeleterNode = (SDataDeleterNode *)pDataSink; + SQueryInserterNode* pInserterNode = (SQueryInserterNode *)pDataSink; inserter->sink.fPut = putDataBlock; inserter->sink.fEndPut = endPut; inserter->sink.fGetLen = getDataLength; - inserter->sink.fGetData = getDataBlock; + inserter->sink.fGetData = NULL; inserter->sink.fDestroy = destroyDataSinker; inserter->sink.fGetCacheSize = getCacheSize; inserter->pManager = pManager; - inserter->pDeleter = pDeleterNode; - inserter->pSchema = pDataSink->pInputDataBlockDesc; + inserter->pNode = pInserterNode; inserter->pParam = pParam; inserter->status = DS_BUF_EMPTY; inserter->queryEnd = false; - inserter->pDataBlocks = taosOpenQueue(); + + int64_t suid = 0; + int32_t code = tsdbGetTableSchema(inserter->pParam->readHandle->vnode, pInserterNode->tableId, &inserter->pSchema, &suid); + if (code) { + return code; + } + + if (pInserterNode->stableId != suid) { + terrno = TSDB_CODE_TDB_INVALID_TABLE_ID; + return terrno; + } + + inserter->pDataBlocks = taosArrayInit(1, POINTER_BYTES); taosThreadMutexInit(&inserter->mutex, NULL); if (NULL == inserter->pDataBlocks) { terrno = TSDB_CODE_QRY_OUT_OF_MEMORY; return TSDB_CODE_QRY_OUT_OF_MEMORY; } + + inserter->pCols = taosHashInit(pInserterNode->pCols->length, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT), false, HASH_NO_LOCK); + SNode* pNode = NULL; + FOREACH(pNode, pInserterNode->pCols) { + SColumnNode* pCol = (SColumnNode*)pNode; + taosHashPut(inserter->pCols, &pCol->colId, sizeof(pCol->colId), &pCol->slotId, sizeof(pCol->slotId)); + } + + tsem_init(&inserter->ready, 0, 0); + *pHandle = inserter; return TSDB_CODE_SUCCESS; } diff --git a/source/libs/executor/src/dataSinkMgt.c b/source/libs/executor/src/dataSinkMgt.c index 498171e88cf84f300cb7247866f4807d987762d6..0aa5e6266c06ff2c0fed2dfc1ee33fc75db801ea 100644 --- a/source/libs/executor/src/dataSinkMgt.c +++ b/source/libs/executor/src/dataSinkMgt.c @@ -40,6 +40,8 @@ int32_t dsCreateDataSinker(const SDataSinkNode *pDataSink, DataSinkHandle* pHand return createDataDispatcher(&gDataSinkManager, pDataSink, pHandle); case QUERY_NODE_PHYSICAL_PLAN_DELETE: return createDataDeleter(&gDataSinkManager, pDataSink, pHandle, pParam); + case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: + return createDataInserter(&gDataSinkManager, pDataSink, pHandle, pParam); } return TSDB_CODE_FAILED; } @@ -54,7 +56,7 @@ void dsEndPut(DataSinkHandle handle, uint64_t useconds) { return pHandleImpl->fEndPut(pHandleImpl, useconds); } -void dsGetDataLength(DataSinkHandle handle, int32_t* pLen, bool* pQueryEnd) { +void dsGetDataLength(DataSinkHandle handle, int64_t* pLen, bool* pQueryEnd) { SDataSinkHandle* pHandleImpl = (SDataSinkHandle*)handle; pHandleImpl->fGetLen(pHandleImpl, pLen, pQueryEnd); } diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index be50a1d3bd2b7eeefdd2e730af8a52f189e74ff8..a83565cbe0553d823f79e6787d2f9ee05cd598f9 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -37,7 +37,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu } else { pOperator->status = OP_NOT_OPENED; - SStreamBlockScanInfo* pInfo = pOperator->info; + SStreamScanInfo* pInfo = pOperator->info; pInfo->assignBlockUid = assignUid; // TODO: if a block was set but not consumed, @@ -45,7 +45,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu pInfo->blockType = type; if (type == STREAM_INPUT__DATA_SUBMIT) { - if (tqReadHandleSetMsg(pInfo->streamBlockReader, input, 0) < 0) { + if (tqReaderSetDataMsg(pInfo->tqReader, input, 0) < 0) { qError("submit msg messed up when initing stream block, %s" PRIx64, id); return TSDB_CODE_QRY_APP_ERROR; } @@ -105,7 +105,7 @@ int32_t qSetMultiStreamInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numO return code; } -qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, void* streamReadHandle) { +qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers) { if (msg == NULL) { return NULL; } @@ -120,7 +120,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, void* streamReadHandle) { } qTaskInfo_t pTaskInfo = NULL; - code = qCreateExecTask(streamReadHandle, 0, 0, plan, &pTaskInfo, NULL, NULL, OPTR_EXEC_MODEL_STREAM); + code = qCreateExecTask(readers, 0, 0, plan, &pTaskInfo, NULL, NULL, OPTR_EXEC_MODEL_STREAM); if (code != TSDB_CODE_SUCCESS) { // TODO: destroy SSubplan & pTaskInfo terrno = code; @@ -130,7 +130,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, void* streamReadHandle) { return pTaskInfo; } -static SArray* filterQualifiedChildTables(const SStreamBlockScanInfo* pScanInfo, const SArray* tableIdList) { +static SArray* filterQualifiedChildTables(const SStreamScanInfo* pScanInfo, const SArray* tableIdList) { SArray* qa = taosArrayInit(4, sizeof(tb_uid_t)); // let's discard the tables those are not created according to the queried super table. @@ -168,17 +168,17 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo pInfo = pInfo->pDownstream[0]; } - int32_t code = 0; - SStreamBlockScanInfo* pScanInfo = pInfo->info; + int32_t code = 0; + SStreamScanInfo* pScanInfo = pInfo->info; if (isAdd) { // add new table id SArray* qa = filterQualifiedChildTables(pScanInfo, tableIdList); qDebug(" %d qualified child tables added into stream scanner", (int32_t)taosArrayGetSize(qa)); - code = tqReadHandleAddTbUidList(pScanInfo->streamBlockReader, qa); + code = tqReaderAddTbUidList(pScanInfo->tqReader, qa); taosArrayDestroy(qa); } else { // remove the table id in current list qDebug(" %d remove child tables from the stream scanner", (int32_t)taosArrayGetSize(tableIdList)); - code = tqReadHandleRemoveTbUidList(pScanInfo->streamBlockReader, tableIdList); + code = tqReaderRemoveTbUidList(pScanInfo->tqReader, tableIdList); } return code; diff --git a/source/libs/executor/src/executorMain.c b/source/libs/executor/src/executorMain.c index 7f84b4c1743e49c8cd6c42d452c970bc5ecb49a7..baf667d61887eb87ff927650f6ae2bd5e3390c5a 100644 --- a/source/libs/executor/src/executorMain.c +++ b/source/libs/executor/src/executorMain.c @@ -52,7 +52,7 @@ int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId, if (handle) { void* pSinkParam = NULL; - code = createDataSinkParam(pSubplan->pDataSink, &pSinkParam, pTaskInfo); + code = createDataSinkParam(pSubplan->pDataSink, &pSinkParam, pTaskInfo, readHandle); if (code != TSDB_CODE_SUCCESS) { goto _error; } @@ -236,6 +236,37 @@ int32_t qDeserializeTaskStatus(qTaskInfo_t tinfo, const char* pInput, int32_t le return decodeOperator(pTaskInfo->pRoot, pInput, len); } +int32_t qExtractStreamScanner(qTaskInfo_t tinfo, void** scanner) { + SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo; + SOperatorInfo* pOperator = pTaskInfo->pRoot; + + while (1) { + uint8_t type = pOperator->operatorType; + if (type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) { + *scanner = pOperator->info; + return 0; + } else { + ASSERT(pOperator->numOfDownstream == 1); + pOperator = pOperator->pDownstream[0]; + } + } +} + +void* qExtractReaderFromStreamScanner(void* scanner) { + SStreamScanInfo* pInfo = scanner; + return (void*)pInfo->tqReader; +} + +const SSchemaWrapper* qExtractSchemaFromStreamScanner(void* scanner) { + SStreamScanInfo* pInfo = scanner; + return pInfo->tqReader->pSchemaWrapper; +} + +const STqOffset* qExtractStatusFromStreamScanner(void* scanner) { + SStreamScanInfo* pInfo = scanner; + return &pInfo->offset; +} + int32_t qStreamPrepareScan(qTaskInfo_t tinfo, uint64_t uid, int64_t ts) { SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo; diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 3bf6c9fa0a33d14f1ef51f9d61604cfa034472d7..b638fb82e1281fbba1d6d0d2b7ec0bb3cf01a9cd 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -741,10 +741,10 @@ static int32_t doCreateConstantValColumnAggInfo(SInputColumnInfoData* pInput, SF if (type == TSDB_DATA_TYPE_BIGINT) { int64_t v = pFuncParam->param.i; - *da = (SColumnDataAgg){.numOfNull = 0, .min = v, .max = v, .maxIndex = 0, .minIndex = 0, .sum = v * numOfRows}; + *da = (SColumnDataAgg){.numOfNull = 0, .min = v, .max = v, .sum = v * numOfRows}; } else if (type == TSDB_DATA_TYPE_DOUBLE) { double v = pFuncParam->param.d; - *da = (SColumnDataAgg){.numOfNull = 0, .maxIndex = 0, .minIndex = 0}; + *da = (SColumnDataAgg){.numOfNull = 0}; *(double*)&da->min = v; *(double*)&da->max = v; @@ -752,7 +752,7 @@ static int32_t doCreateConstantValColumnAggInfo(SInputColumnInfoData* pInput, SF } else if (type == TSDB_DATA_TYPE_BOOL) { // todo validate this data type bool v = pFuncParam->param.i; - *da = (SColumnDataAgg){.numOfNull = 0, .maxIndex = 0, .minIndex = 0}; + *da = (SColumnDataAgg){.numOfNull = 0}; *(bool*)&da->min = 0; *(bool*)&da->max = v; *(bool*)&da->sum = v * numOfRows; @@ -1130,7 +1130,7 @@ int32_t loadDataBlockOnDemand(SExecTaskInfo* pTaskInfo, STableScanInfo* pTableSc } else if ((*status) == BLK_DATA_SMA_LOAD) { // this function never returns error? pCost->loadBlockStatis += 1; -// tsdbRetrieveDataBlockStatisInfo(pTableScanInfo->pTsdbReadHandle, &pBlock->pBlockAgg); +// tsdbRetrieveDatablockSMA(pTableScanInfo->pTsdbReadHandle, &pBlock->pBlockAgg); if (pBlock->pBlockAgg == NULL) { // data block statistics does not exist, load data block // pBlock->pDataBlock = tsdbRetrieveDataBlock(pTableScanInfo->pTsdbReadHandle, NULL); @@ -1141,7 +1141,7 @@ int32_t loadDataBlockOnDemand(SExecTaskInfo* pTaskInfo, STableScanInfo* pTableSc // load the data block statistics to perform further filter pCost->loadBlockStatis += 1; -// tsdbRetrieveDataBlockStatisInfo(pTableScanInfo->pTsdbReadHandle, &pBlock->pBlockAgg); +// tsdbRetrieveDatablockSMA(pTableScanInfo->pTsdbReadHandle, &pBlock->pBlockAgg); if (pQueryAttr->topBotQuery && pBlock->pBlockAgg != NULL) { { // set previous window @@ -1994,7 +1994,7 @@ static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) { taosMemoryFreeClear(pMsgBody); } -void qProcessFetchRsp(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) { +void qProcessRspMsg(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) { SMsgSendInfo* pSendInfo = (SMsgSendInfo*)pMsg->info.ahandle; assert(pMsg->info.ahandle != NULL); @@ -2463,6 +2463,8 @@ static void destroySortedMergeOperatorInfo(void* param, int32_t numOfOutput) { blockDataDestroy(pInfo->binfo.pRes); cleanupAggSup(&pInfo->aggSup); + + taosMemoryFreeClear(param); } static bool needToMerge(SSDataBlock* pBlock, SArray* groupInfo, char** buf, int32_t rowIndex) { @@ -2844,17 +2846,17 @@ int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scan } int32_t doPrepareScan(SOperatorInfo* pOperator, uint64_t uid, int64_t ts) { - int32_t type = pOperator->operatorType; + uint8_t type = pOperator->operatorType; pOperator->status = OP_OPENED; if (type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) { - SStreamBlockScanInfo* pScanInfo = pOperator->info; + SStreamScanInfo* pScanInfo = pOperator->info; pScanInfo->blockType = STREAM_INPUT__DATA_SCAN; - pScanInfo->pSnapshotReadOp->status = OP_OPENED; + pScanInfo->pTableScanOp->status = OP_OPENED; - STableScanInfo* pInfo = pScanInfo->pSnapshotReadOp->info; + STableScanInfo* pInfo = pScanInfo->pTableScanOp->info; ASSERT(pInfo->scanMode == TABLE_SCAN__TABLE_ORDER); if (uid == 0) { @@ -2914,8 +2916,8 @@ int32_t doPrepareScan(SOperatorInfo* pOperator, uint64_t uid, int64_t ts) { int32_t doGetScanStatus(SOperatorInfo* pOperator, uint64_t* uid, int64_t* ts) { int32_t type = pOperator->operatorType; if (type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) { - SStreamBlockScanInfo* pScanInfo = pOperator->info; - STableScanInfo* pSnapShotScanInfo = pScanInfo->pSnapshotReadOp->info; + SStreamScanInfo* pScanInfo = pOperator->info; + STableScanInfo* pSnapShotScanInfo = pScanInfo->pTableScanOp->info; *uid = pSnapShotScanInfo->lastStatus.uid; *ts = pSnapShotScanInfo->lastStatus.ts; } else { @@ -3364,7 +3366,7 @@ static void doHandleRemainBlockFromNewGroup(SFillOperatorInfo* pInfo, SResultInf } } -static SSDataBlock* doFill(SOperatorInfo* pOperator) { +static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) { SFillOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -3372,9 +3374,6 @@ static SSDataBlock* doFill(SOperatorInfo* pOperator) { SSDataBlock* pResBlock = pInfo->pRes; blockDataCleanup(pResBlock); - if (pOperator->status == OP_EXEC_DONE) { - return NULL; - } // todo handle different group data interpolation bool n = false; @@ -3440,6 +3439,39 @@ static SSDataBlock* doFill(SOperatorInfo* pOperator) { } } +static SSDataBlock* doFill(SOperatorInfo* pOperator) { + SFillOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + + if (pOperator->status == OP_EXEC_DONE) { + return NULL; + } + + SSDataBlock* fillResult = NULL; + while (true) { + fillResult = doFillImpl(pOperator); + if (fillResult != NULL) { + doFilter(pInfo->pCondition, fillResult); + } + + if (fillResult == NULL) { + doSetOperatorCompleted(pOperator); + break; + } + + if (fillResult->info.rows > 0) { + break; + } + } + + if (fillResult != NULL) { + size_t rows = fillResult->info.rows; + pOperator->resultInfo.totalRows += rows; + } + + return fillResult; +} + static void destroyExprInfo(SExprInfo* pExpr, int32_t numOfExprs) { for (int32_t i = 0; i < numOfExprs; ++i) { SExprInfo* pExprInfo = &pExpr[i]; @@ -3474,7 +3506,6 @@ static void destroyOperatorInfo(SOperatorInfo* pOperator) { } taosMemoryFreeClear(pOperator->exprSupp.pExprInfo); - taosMemoryFreeClear(pOperator->info); taosMemoryFreeClear(pOperator); } @@ -3644,11 +3675,15 @@ void cleanupBasicInfo(SOptrBasicInfo* pInfo) { void destroyBasicOperatorInfo(void* param, int32_t numOfOutput) { SOptrBasicInfo* pInfo = (SOptrBasicInfo*)param; cleanupBasicInfo(pInfo); + + taosMemoryFreeClear(param); } void destroyAggOperatorInfo(void* param, int32_t numOfOutput) { SAggOperatorInfo* pInfo = (SAggOperatorInfo*)param; - cleanupBasicInfo(&pInfo->binfo); + cleanupBasicInfo(&pInfo->binfo); + + taosMemoryFreeClear(param); } void destroySFillOperatorInfo(void* param, int32_t numOfOutput) { @@ -3656,6 +3691,8 @@ void destroySFillOperatorInfo(void* param, int32_t numOfOutput) { pInfo->pFillInfo = taosDestroyFillInfo(pInfo->pFillInfo); pInfo->pRes = blockDataDestroy(pInfo->pRes); taosMemoryFreeClear(pInfo->p); + + taosMemoryFreeClear(param); } static void destroyProjectOperatorInfo(void* param, int32_t numOfOutput) { @@ -3666,6 +3703,8 @@ static void destroyProjectOperatorInfo(void* param, int32_t numOfOutput) { cleanupBasicInfo(&pInfo->binfo); cleanupAggSup(&pInfo->aggSup); taosArrayDestroy(pInfo->pPseudoColInfo); + + taosMemoryFreeClear(param); } void cleanupExprSupp(SExprSupp* pSupp) { @@ -3682,6 +3721,8 @@ static void destroyIndefinitOperatorInfo(void* param, int32_t numOfOutput) { taosArrayDestroy(pInfo->pPseudoColInfo); cleanupAggSup(&pInfo->aggSup); cleanupExprSupp(&pInfo->scalarSup); + + taosMemoryFreeClear(param); } void destroyExchangeOperatorInfo(void* param, int32_t numOfOutput) { @@ -3699,6 +3740,8 @@ void doDestroyExchangeOperatorInfo(void* param) { } tsem_destroy(&pExInfo->ready); + + taosMemoryFreeClear(param); } static SArray* setRowTsColumnOutputInfo(SqlFunctionCtx* pCtx, int32_t numOfCols) { @@ -3832,6 +3875,8 @@ static SSDataBlock* doApplyIndefinitFunction(SOperatorInfo* pOperator) { } } + doFilter(pIndefInfo->pCondition, pInfo->pRes); + size_t rows = pInfo->pRes->info.rows; pOperator->resultInfo.totalRows += rows; @@ -3885,6 +3930,7 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy pInfo->binfo.pRes = pResBlock; pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pSup->pCtx, numOfExpr); + pInfo->pCondition = pPhyNode->node.pConditions; pOperator->name = "IndefinitOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_PROJECT; @@ -3958,6 +4004,7 @@ SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pInfo->pRes = pResBlock; pInfo->multigroupResult = multigroupResult; + pInfo->pCondition = pPhyFillNode->node.pConditions; pOperator->name = "FillOperator"; pOperator->blocking = false; pOperator->status = OP_NOT_OPENED; @@ -4312,11 +4359,11 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo } else if (QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN == type) { SLastRowScanPhysiNode* pScanNode = (SLastRowScanPhysiNode*)pPhyNode; -// int32_t code = createScanTableListInfo(pTableScanNode, pHandle, pTableListInfo, queryId, taskId); -// if (code) { -// pTaskInfo->code = code; -// return NULL; -// } + // int32_t code = createScanTableListInfo(pTableScanNode, pHandle, pTableListInfo, queryId, taskId); + // if (code) { + // pTaskInfo->code = code; + // return NULL; + // } int32_t code = extractTableSchemaVersion(pHandle, pScanNode->uid, pTaskInfo); if (code != TSDB_CODE_SUCCESS) { @@ -4373,8 +4420,8 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo pOptr = createGroupOperatorInfo(ops[0], pExprInfo, num, pResBlock, pColList, pAggNode->node.pConditions, pScalarExprInfo, numOfScalarExpr, pTaskInfo); } else { - pOptr = - createAggregateOperatorInfo(ops[0], pExprInfo, num, pResBlock, pAggNode->node.pConditions, pScalarExprInfo, numOfScalarExpr, pTaskInfo); + pOptr = createAggregateOperatorInfo(ops[0], pExprInfo, num, pResBlock, pAggNode->node.pConditions, + pScalarExprInfo, numOfScalarExpr, pTaskInfo); } } else if (QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL == type || QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL == type) { SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode; @@ -4415,7 +4462,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo .precision = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->node.resType.precision}; int32_t tsSlotId = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId; - pOptr = createMergeAlignedIntervalOperatorInfo(ops[0], pExprInfo, num, pResBlock, &interval, tsSlotId, pTaskInfo); + pOptr = createMergeAlignedIntervalOperatorInfo(ops[0], pExprInfo, num, pResBlock, &interval, tsSlotId, pPhyNode->pConditions, pTaskInfo); } else if (QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL == type) { SMergeIntervalPhysiNode* pIntervalPhyNode = (SMergeIntervalPhysiNode*)pPhyNode; @@ -4541,7 +4588,8 @@ SArray* extractColumnInfo(SNodeList* pNodeList) { return pList; } -STsdbReader* doCreateDataReader(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle, STableListInfo* pTableListInfo, const char* idstr) { +STsdbReader* doCreateDataReader(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle, + STableListInfo* pTableListInfo, const char* idstr) { int32_t code = getTableList(pHandle->meta, pHandle->vnode, &pTableScanNode->scan, pTableListInfo); if (code != TSDB_CODE_SUCCESS) { goto _error; @@ -4587,9 +4635,9 @@ static int32_t extractTbscanInStreamOpTree(SOperatorInfo* pOperator, STableScanI } return extractTbscanInStreamOpTree(pOperator->pDownstream[0], ppInfo); } else { - SStreamBlockScanInfo* pInfo = pOperator->info; - ASSERT(pInfo->pSnapshotReadOp->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN); - *ppInfo = pInfo->pSnapshotReadOp->info; + SStreamScanInfo* pInfo = pOperator->info; + ASSERT(pInfo->pTableScanOp->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN); + *ppInfo = pInfo->pTableScanOp->info; return 0; } } @@ -4737,10 +4785,20 @@ int32_t decodeOperator(SOperatorInfo* ops, const char* result, int32_t length) { return TDB_CODE_SUCCESS; } -int32_t createDataSinkParam(SDataSinkNode* pNode, void** pParam, qTaskInfo_t* pTaskInfo) { +int32_t createDataSinkParam(SDataSinkNode* pNode, void** pParam, qTaskInfo_t* pTaskInfo, SReadHandle* readHandle) { SExecTaskInfo* pTask = *(SExecTaskInfo**)pTaskInfo; switch (pNode->type) { + case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: { + SInserterParam* pInserterParam = taosMemoryCalloc(1, sizeof(SInserterParam)); + if (NULL == pInserterParam) { + return TSDB_CODE_OUT_OF_MEMORY; + } + pInserterParam->readHandle = readHandle; + + *pParam = pInserterParam; + break; + } case QUERY_NODE_PHYSICAL_PLAN_DELETE: { SDeleterParam* pDeleterParam = taosMemoryCalloc(1, sizeof(SDeleterParam)); if (NULL == pDeleterParam) { @@ -4785,7 +4843,6 @@ int32_t createExecTaskInfoImpl(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, SRead (*pTaskInfo)->pRoot = createOperatorTree(pPlan->pNode, *pTaskInfo, pHandle, queryId, taskId, &(*pTaskInfo)->tableqinfoList, pPlan->user); - if (NULL == (*pTaskInfo)->pRoot) { code = (*pTaskInfo)->code; goto _complete; diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index e262a529bbbf3eea0e1de944b918ebb43357a84e..311d7f0d5a0a7355471d6e251043616475065b5d 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -38,6 +38,8 @@ static void destroyGroupOperatorInfo(void* param, int32_t numOfOutput) { taosArrayDestroy(pInfo->pGroupCols); taosArrayDestroy(pInfo->pGroupColVals); cleanupExprSupp(&pInfo->scalarSup); + + taosMemoryFreeClear(param); } static int32_t initGroupOptrInfo(SArray** pGroupColVals, int32_t* keyLen, char** keyBuf, const SArray* pGroupColList) { @@ -724,6 +726,8 @@ static void destroyPartitionOperatorInfo(void* param, int32_t numOfOutput) { taosMemoryFree(pInfo->columnOffset); cleanupExprSupp(&pInfo->scalarSup); + + taosMemoryFreeClear(param); } SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo) { @@ -806,4 +810,4 @@ int32_t setGroupResultOutputBuf(SOperatorInfo* pOperator, SOptrBasicInfo* binfo, setResultRowInitCtx(pResultRow, pCtx, numOfCols, pOperator->exprSupp.rowEntryInfoOffset); return TSDB_CODE_SUCCESS; -} \ No newline at end of file +} diff --git a/source/libs/executor/src/joinoperator.c b/source/libs/executor/src/joinoperator.c index e9995ed77af4b30ab1ce1834c7970b2217c52120..b864fae47f236955fd89a2ce60fd4b6d3d3f65e3 100644 --- a/source/libs/executor/src/joinoperator.c +++ b/source/libs/executor/src/joinoperator.c @@ -104,6 +104,8 @@ void setJoinColumnInfo(SColumnInfo* pColumn, const SColumnNode* pColumnNode) { void destroyMergeJoinOperator(void* param, int32_t numOfOutput) { SJoinOperatorInfo* pJoinOperator = (SJoinOperatorInfo*)param; nodesDestroyNode(pJoinOperator->pCondAfterMerge); + + taosMemoryFreeClear(param); } static void doMergeJoinImpl(struct SOperatorInfo* pOperator, SSDataBlock* pRes) { diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index f5a4358abb35fe920ca086cbf770341fa6fa927c..5aafaa0b453b4cb588e641672e633b99720b374c 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -210,7 +210,10 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanInfo* pTableSca bool allColumnsHaveAgg = true; SColumnDataAgg** pColAgg = NULL; - tsdbRetrieveDataBlockStatisInfo(pTableScanInfo->dataReader, &pColAgg, &allColumnsHaveAgg); + int32_t code = tsdbRetrieveDatablockSMA(pTableScanInfo->dataReader, &pColAgg, &allColumnsHaveAgg); + if (code != TSDB_CODE_SUCCESS) { + longjmp(pTaskInfo->env, code); + } if (allColumnsHaveAgg == true) { int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock); @@ -592,6 +595,8 @@ static void destroyTableScanOperatorInfo(void* param, int32_t numOfOutput) { if (pTableScanInfo->pColMatchInfo != NULL) { taosArrayDestroy(pTableScanInfo->pColMatchInfo); } + + taosMemoryFreeClear(param); } SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* readHandle, @@ -740,6 +745,8 @@ static SSDataBlock* doBlockInfoScan(SOperatorInfo* pOperator) { static void destroyBlockDistScanOperatorInfo(void* param, int32_t numOfOutput) { SBlockDistInfo* pDistInfo = (SBlockDistInfo*)param; blockDataDestroy(pDistInfo->pResBlock); + + taosMemoryFreeClear(param); } SOperatorInfo* createDataBlockInfoScanOperator(void* dataReader, SReadHandle* readHandle, uint64_t uid, @@ -780,7 +787,7 @@ _error: return NULL; } -static void doClearBufferedBlocks(SStreamBlockScanInfo* pInfo) { +static void doClearBufferedBlocks(SStreamScanInfo* pInfo) { size_t total = taosArrayGetSize(pInfo->pBlockLists); pInfo->validBlockIndex = 0; @@ -791,21 +798,20 @@ static void doClearBufferedBlocks(SStreamBlockScanInfo* pInfo) { taosArrayClear(pInfo->pBlockLists); } -static bool isSessionWindow(SStreamBlockScanInfo* pInfo) { +static bool isSessionWindow(SStreamScanInfo* pInfo) { return pInfo->sessionSup.parentType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION || - pInfo->sessionSup.parentType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION; + pInfo->sessionSup.parentType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION; } -static bool isStateWindow(SStreamBlockScanInfo* pInfo) { +static bool isStateWindow(SStreamScanInfo* pInfo) { return pInfo->sessionSup.parentType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE; } -static bool isIntervalWindow(SStreamBlockScanInfo* pInfo) { +static bool isIntervalWindow(SStreamScanInfo* pInfo) { return pInfo->sessionSup.parentType == QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL || - pInfo->sessionSup.parentType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL; + pInfo->sessionSup.parentType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL; } - static uint64_t getGroupId(SOperatorInfo* pOperator, uint64_t uid) { uint64_t* groupId = taosHashGet(pOperator->pTaskInfo->tableqinfoList.map, &uid, sizeof(int64_t)); if (groupId) { @@ -827,19 +833,17 @@ static uint64_t getGroupId(SOperatorInfo* pOperator, uint64_t uid) { */ } -static void setGroupId(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, int32_t groupColIndex, int32_t rowIndex) { +static void setGroupId(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_t groupColIndex, int32_t rowIndex) { ASSERT(rowIndex < pBlock->info.rows); - switch (pBlock->info.type) - { - case STREAM_DELETE_DATA: - case STREAM_RETRIEVE: { - SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, groupColIndex); - uint64_t* groupCol = (uint64_t*)pColInfo->pData; - pInfo->groupId = groupCol[rowIndex]; - } - break; - default: - break; + switch (pBlock->info.type) { + case STREAM_DELETE_DATA: + case STREAM_RETRIEVE: { + SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, groupColIndex); + uint64_t* groupCol = (uint64_t*)pColInfo->pData; + pInfo->groupId = groupCol[rowIndex]; + } break; + default: + break; } } @@ -854,17 +858,17 @@ void resetTableScanInfo(STableScanInfo* pTableScanInfo, STimeWindow* pWin) { pTableScanInfo->currentGroupId = -1; } -static bool prepareRangeScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, int32_t* pRowIndex) { +static bool prepareRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_t* pRowIndex) { if ((*pRowIndex) == pBlock->info.rows) { return false; } ASSERT(taosArrayGetSize(pBlock->pDataBlock) >= 3); SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); - TSKEY* startData = (TSKEY*)pStartTsCol->pData; + TSKEY* startData = (TSKEY*)pStartTsCol->pData; SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); - TSKEY* endData = (TSKEY*)pEndTsCol->pData; - STimeWindow win = {.skey = startData[*pRowIndex], .ekey = endData[*pRowIndex]}; + TSKEY* endData = (TSKEY*)pEndTsCol->pData; + STimeWindow win = {.skey = startData[*pRowIndex], .ekey = endData[*pRowIndex]}; setGroupId(pInfo, pBlock, GROUPID_COLUMN_INDEX, *pRowIndex); (*pRowIndex)++; @@ -877,16 +881,16 @@ static bool prepareRangeScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, i win.skey = TMIN(win.skey, startData[*pRowIndex]); continue; } - ASSERT( (win.skey > startData[*pRowIndex] && win.ekey < endData[*pRowIndex]) || - ( isInTimeWindow(&win, startData[*pRowIndex], 0) || isInTimeWindow(&win, endData[*pRowIndex], 0) ) ); + ASSERT((win.skey > startData[*pRowIndex] && win.ekey < endData[*pRowIndex]) || + (isInTimeWindow(&win, startData[*pRowIndex], 0) || isInTimeWindow(&win, endData[*pRowIndex], 0))); break; } - resetTableScanInfo(pInfo->pSnapshotReadOp->info, &win); + resetTableScanInfo(pInfo->pTableScanOp->info, &win); return true; } -static bool prepareDataScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pSDB, int32_t tsColIndex, int32_t* pRowIndex) { +static bool prepareDataScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32_t tsColIndex, int32_t* pRowIndex) { STimeWindow win = { .skey = INT64_MIN, .ekey = INT64_MAX, @@ -907,11 +911,10 @@ static bool prepareDataScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pSDB, int3 setGroupId(pInfo, pSDB, GROUPID_COLUMN_INDEX, *pRowIndex); (*pRowIndex) += updateSessionWindowInfo(pCurWin, tsCols, NULL, pSDB->info.rows, *pRowIndex, gap, NULL); } else { - win = - getActiveTimeWindow(NULL, &dumyInfo, tsCols[*pRowIndex], &pInfo->interval, pInfo->interval.precision, NULL); + win = getActiveTimeWindow(NULL, &dumyInfo, tsCols[*pRowIndex], &pInfo->interval, pInfo->interval.precision, NULL); setGroupId(pInfo, pSDB, GROUPID_COLUMN_INDEX, *pRowIndex); - (*pRowIndex) += getNumOfRowsInTimeWindow(&pSDB->info, tsCols, *pRowIndex, win.ekey, binarySearchForKey, NULL, - TSDB_ORDER_ASC); + (*pRowIndex) += + getNumOfRowsInTimeWindow(&pSDB->info, tsCols, *pRowIndex, win.ekey, binarySearchForKey, NULL, TSDB_ORDER_ASC); } needRead = true; } else if (isStateWindow(pInfo)) { @@ -929,7 +932,7 @@ static bool prepareDataScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pSDB, int3 if (!needRead) { return false; } - resetTableScanInfo(pInfo->pSnapshotReadOp->info, &win); + resetTableScanInfo(pInfo->pTableScanOp->info, &win); return true; } @@ -946,13 +949,13 @@ static void copyOneRow(SSDataBlock* dest, SSDataBlock* source, int32_t sourceRow dest->info.rows++; } -static SSDataBlock* doRangeScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pSDB, int32_t tsColIndex, int32_t* pRowIndex) { +static SSDataBlock* doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32_t tsColIndex, int32_t* pRowIndex) { while (1) { SSDataBlock* pResult = NULL; - pResult = doTableScan(pInfo->pSnapshotReadOp); + pResult = doTableScan(pInfo->pTableScanOp); if (!pResult && prepareRangeScan(pInfo, pSDB, pRowIndex)) { // scan next window data - pResult = doTableScan(pInfo->pSnapshotReadOp); + pResult = doTableScan(pInfo->pTableScanOp); } if (!pResult) { blockDataCleanup(pSDB); @@ -966,14 +969,14 @@ static SSDataBlock* doRangeScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pSDB, } } -static SSDataBlock* doDataScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pSDB, int32_t tsColIndex, int32_t* pRowIndex) { +static SSDataBlock* doDataScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32_t tsColIndex, int32_t* pRowIndex) { while (1) { SSDataBlock* pResult = NULL; - pResult = doTableScan(pInfo->pSnapshotReadOp); + pResult = doTableScan(pInfo->pTableScanOp); if (pResult == NULL) { if (prepareDataScan(pInfo, pSDB, tsColIndex, pRowIndex)) { // scan next window data - pResult = doTableScan(pInfo->pSnapshotReadOp); + pResult = doTableScan(pInfo->pTableScanOp); } } if (!pResult) { @@ -997,8 +1000,8 @@ static SSDataBlock* doDataScan(SStreamBlockScanInfo* pInfo, SSDataBlock* pSDB, i return pResult; */ } - -static void generateIntervalTs(SStreamBlockScanInfo* pInfo, SSDataBlock* pDelBlock, SOperatorInfo* pOperator, SSDataBlock* pUpdateRes) { +static void generateIntervalTs(SStreamScanInfo* pInfo, SSDataBlock* pDelBlock, SOperatorInfo* pOperator, + SSDataBlock* pUpdateRes) { if (pDelBlock->info.rows == 0) { return; } @@ -1006,18 +1009,20 @@ static void generateIntervalTs(SStreamBlockScanInfo* pInfo, SSDataBlock* pDelBlo blockDataEnsureCapacity(pUpdateRes, 64); ASSERT(taosArrayGetSize(pDelBlock->pDataBlock) >= 3); SColumnInfoData* pStartTsCol = taosArrayGet(pDelBlock->pDataBlock, START_TS_COLUMN_INDEX); - TSKEY* startData = (TSKEY*)pStartTsCol->pData; + TSKEY* startData = (TSKEY*)pStartTsCol->pData; SColumnInfoData* pEndTsCol = taosArrayGet(pDelBlock->pDataBlock, END_TS_COLUMN_INDEX); - TSKEY* endData = (TSKEY*)pEndTsCol->pData; + TSKEY* endData = (TSKEY*)pEndTsCol->pData; SColumnInfoData* pGpCol = taosArrayGet(pDelBlock->pDataBlock, UID_COLUMN_INDEX); - uint64_t* uidCol = (uint64_t*)pGpCol->pData; + uint64_t* uidCol = (uint64_t*)pGpCol->pData; SColumnInfoData* pDestTsCol = taosArrayGet(pUpdateRes->pDataBlock, START_TS_COLUMN_INDEX); SColumnInfoData* pDestGpCol = taosArrayGet(pUpdateRes->pDataBlock, GROUPID_COLUMN_INDEX); - for (int32_t i = pInfo->deleteDataIndex ; i < pDelBlock->info.rows && - i < pDelBlock->info.capacity - (endData[i] - startData[i])/pInfo->interval.interval - 1; i++) { + for (int32_t i = pInfo->deleteDataIndex; + i < pDelBlock->info.rows && + i < pDelBlock->info.capacity - (endData[i] - startData[i]) / pInfo->interval.interval - 1; + i++) { uint64_t groupId = getGroupId(pOperator, uidCol[i]); - for (TSKEY startTs = startData[i]; startTs <= endData[i]; ) { + for (TSKEY startTs = startData[i]; startTs <= endData[i];) { colDataAppend(pDestTsCol, pUpdateRes->info.rows, (const char*)&startTs, false); colDataAppend(pDestGpCol, pUpdateRes->info.rows, (const char*)&groupId, false); pUpdateRes->info.rows++; @@ -1032,33 +1037,36 @@ static void generateIntervalTs(SStreamBlockScanInfo* pInfo, SSDataBlock* pDelBlo } } -static void generateScanRange(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, SOperatorInfo* pOperator, SSDataBlock* pUpdateRes) { - if (pBlock->info.rows == 0) { +static void generateScanRange(SStreamScanInfo* pInfo, SSDataBlock* pBlock, SOperatorInfo* pOperator, + SSDataBlock* pUpdateRes) { + if (pBlock->info.rows == 0) { return; } blockDataCleanup(pUpdateRes); blockDataEnsureCapacity(pUpdateRes, pBlock->info.rows); ASSERT(taosArrayGetSize(pBlock->pDataBlock) >= 3); SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); - TSKEY* startData = (TSKEY*)pStartTsCol->pData; + TSKEY* startData = (TSKEY*)pStartTsCol->pData; SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); - TSKEY* endData = (TSKEY*)pEndTsCol->pData; + TSKEY* endData = (TSKEY*)pEndTsCol->pData; SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, UID_COLUMN_INDEX); - uint64_t* uidCol = (uint64_t*)pGpCol->pData; + uint64_t* uidCol = (uint64_t*)pGpCol->pData; SColumnInfoData* pDestStartCol = taosArrayGet(pUpdateRes->pDataBlock, START_TS_COLUMN_INDEX); SColumnInfoData* pDestEndCol = taosArrayGet(pUpdateRes->pDataBlock, END_TS_COLUMN_INDEX); SColumnInfoData* pDestGpCol = taosArrayGet(pUpdateRes->pDataBlock, GROUPID_COLUMN_INDEX); - int32_t dummy = 0; - for (int32_t i = 0 ; i < pBlock->info.rows; i++) { + int32_t dummy = 0; + for (int32_t i = 0; i < pBlock->info.rows; i++) { uint64_t groupId = getGroupId(pOperator, uidCol[i]); - //gap must be 0. - SResultWindowInfo* pStartWin = getCurSessionWindow(pInfo->sessionSup.pStreamAggSup, startData[i], endData[i], groupId, 0, &dummy); + // gap must be 0. + SResultWindowInfo* pStartWin = + getCurSessionWindow(pInfo->sessionSup.pStreamAggSup, startData[i], endData[i], groupId, 0, &dummy); if (!pStartWin) { // window has been closed. continue; } - SResultWindowInfo* pEndWin = getCurSessionWindow(pInfo->sessionSup.pStreamAggSup, endData[i], endData[i], groupId, 0, &dummy); + SResultWindowInfo* pEndWin = + getCurSessionWindow(pInfo->sessionSup.pStreamAggSup, endData[i], endData[i], groupId, 0, &dummy); ASSERT(pEndWin); colDataAppend(pDestStartCol, i, (const char*)&pStartWin->win.skey, false); colDataAppend(pDestEndCol, i, (const char*)&pEndWin->win.ekey, false); @@ -1066,7 +1074,7 @@ static void generateScanRange(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, pUpdateRes->info.rows++; } } -static void setUpdateData(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, SSDataBlock* pUpdateBlock) { +static void setUpdateData(SStreamScanInfo* pInfo, SSDataBlock* pBlock, SSDataBlock* pUpdateBlock) { blockDataCleanup(pUpdateBlock); int32_t size = taosArrayGetSize(pInfo->tsArray); if (pInfo->tsArrayIndex < size) { @@ -1075,11 +1083,11 @@ static void setUpdateData(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, SSDa blockDataEnsureCapacity(pUpdateBlock, size); int32_t rowId = *(int32_t*)taosArrayGet(pInfo->tsArray, pInfo->tsArrayIndex); - pInfo->groupId = getGroupId(pInfo->pSnapshotReadOp, pBlock->info.uid); + pInfo->groupId = getGroupId(pInfo->pTableScanOp, pBlock->info.uid); int32_t i = 0; for (; i < size; i++) { rowId = *(int32_t*)taosArrayGet(pInfo->tsArray, i + pInfo->tsArrayIndex); - uint64_t id = getGroupId(pInfo->pSnapshotReadOp, pBlock->info.uid); + uint64_t id = getGroupId(pInfo->pTableScanOp, pBlock->info.uid); if (pInfo->groupId != id) { break; } @@ -1098,12 +1106,11 @@ static void setUpdateData(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, SSDa } if (size == 0) { - generateIntervalTs(pInfo, pInfo->pDeleteDataRes, pInfo->pSnapshotReadOp, pUpdateBlock); + generateIntervalTs(pInfo, pInfo->pDeleteDataRes, pInfo->pTableScanOp, pUpdateBlock); } } -static void checkUpdateData(SStreamBlockScanInfo* pInfo, bool invertible, SSDataBlock* pBlock, - bool out) { +static void checkUpdateData(SStreamScanInfo* pInfo, bool invertible, SSDataBlock* pBlock, bool out) { SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, pInfo->primaryTsIndex); ASSERT(pColDataInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP); TSKEY* ts = (TSKEY*)pColDataInfo->pData; @@ -1119,15 +1126,15 @@ static void setBlockGroupId(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32 SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, uidColIndex); uint64_t* uidCol = (uint64_t*)pColDataInfo->pData; ASSERT(pBlock->info.rows > 0); - for (int32_t i = 0 ; i < pBlock->info.rows; i++) { + for (int32_t i = 0; i < pBlock->info.rows; i++) { uidCol[i] = getGroupId(pOperator, uidCol[i]); } } -static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) { +static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { // NOTE: this operator does never check if current status is done or not - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - SStreamBlockScanInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + SStreamScanInfo* pInfo = pOperator->info; pTaskInfo->code = pOperator->fpSet._openFn(pOperator); if (pTaskInfo->code != TSDB_CODE_SUCCESS || pOperator->status == OP_EXEC_DONE) { @@ -1145,36 +1152,35 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) { int32_t current = pInfo->validBlockIndex++; SSDataBlock* pBlock = taosArrayGetP(pInfo->pBlockLists, current); + // TODO move into scan blockDataUpdateTsWindow(pBlock, 0); switch (pBlock->info.type) { - case STREAM_RETRIEVE:{ - pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; - pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RETRIEVE; - copyDataBlock(pInfo->pPullDataRes, pBlock); - pInfo->pullDataResIndex = 0; - prepareDataScan(pInfo, pInfo->pPullDataRes, START_TS_COLUMN_INDEX, &pInfo->pullDataResIndex); - updateInfoAddCloseWindowSBF(pInfo->pUpdateInfo); - } - break; - case STREAM_DELETE_DATA: { - pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; - pInfo->updateResIndex = 0; - if (isIntervalWindow(pInfo)) { - copyDataBlock(pInfo->pDeleteDataRes, pBlock); - generateIntervalTs(pInfo, pInfo->pDeleteDataRes, pInfo->pSnapshotReadOp, pInfo->pUpdateRes); - prepareDataScan(pInfo, pInfo->pUpdateRes, START_TS_COLUMN_INDEX, &pInfo->updateResIndex); - pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER; - } else { - generateScanRange(pInfo, pBlock, pInfo->pSnapshotReadOp, pInfo->pUpdateRes); - prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex); - pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE; - } - pInfo->pUpdateRes->info.type = STREAM_DELETE_DATA; - return pInfo->pUpdateRes; - } - break; - default: - break; + case STREAM_RETRIEVE: { + pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; + pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RETRIEVE; + copyDataBlock(pInfo->pPullDataRes, pBlock); + pInfo->pullDataResIndex = 0; + prepareDataScan(pInfo, pInfo->pPullDataRes, START_TS_COLUMN_INDEX, &pInfo->pullDataResIndex); + updateInfoAddCloseWindowSBF(pInfo->pUpdateInfo); + } break; + case STREAM_DELETE_DATA: { + pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; + pInfo->updateResIndex = 0; + if (isIntervalWindow(pInfo)) { + copyDataBlock(pInfo->pDeleteDataRes, pBlock); + generateIntervalTs(pInfo, pInfo->pDeleteDataRes, pInfo->pTableScanOp, pInfo->pUpdateRes); + prepareDataScan(pInfo, pInfo->pUpdateRes, START_TS_COLUMN_INDEX, &pInfo->updateResIndex); + pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER; + } else { + generateScanRange(pInfo, pBlock, pInfo->pTableScanOp, pInfo->pUpdateRes); + prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex); + pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE; + } + pInfo->pUpdateRes->info.type = STREAM_DELETE_DATA; + return pInfo->pUpdateRes; + } break; + default: + break; } return pBlock; } else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) { @@ -1233,38 +1239,35 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) { SDataBlockInfo* pBlockInfo = &pInfo->pRes->info; blockDataCleanup(pInfo->pRes); - while (tqNextDataBlock(pInfo->streamBlockReader)) { + while (tqNextDataBlock(pInfo->tqReader)) { SSDataBlock block = {0}; // todo refactor - int32_t code = tqRetrieveDataBlock(&block, pInfo->streamBlockReader); - - uint64_t groupId = block.info.groupId; - uint64_t uid = block.info.uid; - int32_t numOfRows = block.info.rows; + int32_t code = tqRetrieveDataBlock(&block, pInfo->tqReader); - if (code != TSDB_CODE_SUCCESS || numOfRows == 0) { + if (code != TSDB_CODE_SUCCESS || block.info.rows == 0) { pTaskInfo->code = code; return NULL; } - pInfo->pRes->info.groupId = groupId; - pInfo->pRes->info.rows = numOfRows; - pInfo->pRes->info.uid = uid; + pInfo->pRes->info.rows = block.info.rows; + pInfo->pRes->info.uid = block.info.uid; pInfo->pRes->info.type = STREAM_NORMAL; - pInfo->pRes->info.capacity = numOfRows; + pInfo->pRes->info.capacity = block.info.rows; + - // for generating rollup SMA result, each time is an independent time serie. - // TODO temporarily used, when the statement of "partition by tbname" is ready, remove this - if (pInfo->assignBlockUid) { - pInfo->pRes->info.groupId = uid; - } else { - pInfo->pRes->info.groupId = groupId; - } - uint64_t* groupIdPre = taosHashGet(pOperator->pTaskInfo->tableqinfoList.map, &uid, sizeof(int64_t)); + uint64_t* groupIdPre = taosHashGet(pOperator->pTaskInfo->tableqinfoList.map, &block.info.uid, sizeof(int64_t)); if (groupIdPre) { pInfo->pRes->info.groupId = *groupIdPre; + } else { + pInfo->pRes->info.groupId = 0; + } + + // for generating rollup SMA result, each time is an independent time serie. + // TODO temporarily used, when the statement of "partition by tbname" is ready, remove this + if (pInfo->assignBlockUid) { + pInfo->pRes->info.groupId = block.info.uid; } // todo extract method @@ -1333,11 +1336,13 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) { } } } + return (pBlockInfo->rows == 0) ? NULL : pInfo->pRes; + } else if (pInfo->blockType == STREAM_INPUT__DATA_SCAN) { // check reader last status // if not match, reset status - SSDataBlock* pResult = doTableScan(pInfo->pSnapshotReadOp); + SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp); return pResult && pResult->info.rows > 0 ? pResult : NULL; } else { @@ -1361,8 +1366,8 @@ static SArray* extractTableIdList(const STableListInfo* pTableGroupInfo) { SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode, SExecTaskInfo* pTaskInfo, STimeWindowAggSupp* pTwSup, uint64_t queryId, uint64_t taskId) { - SStreamBlockScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamBlockScanInfo)); - SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); + SStreamScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamScanInfo)); + SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { terrno = TSDB_CODE_QRY_OUT_OF_MEMORY; @@ -1400,13 +1405,25 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys } if (pHandle) { - SOperatorInfo* pTableScanDummy = createTableScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo); - STableScanInfo* pSTInfo = (STableScanInfo*)pTableScanDummy->info; + SOperatorInfo* pTableScanOp = createTableScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo); + STableScanInfo* pSTInfo = (STableScanInfo*)pTableScanOp->info; SArray* tableList = taosArrayGetP(pTaskInfo->tableqinfoList.pGroupList, 0); - if (pHandle->tqReader) { + if (pHandle->initTableReader) { pSTInfo->scanMode = TABLE_SCAN__TABLE_ORDER; - tsdbReaderOpen(pHandle->vnode, &pSTInfo->cond, tableList, &pSTInfo->dataReader, 0); + pSTInfo->dataReader = NULL; + if (tsdbReaderOpen(pHandle->vnode, &pSTInfo->cond, tableList, &pSTInfo->dataReader, NULL) < 0) { + ASSERT(0); + } + } + + if (pHandle->initTqReader) { + ASSERT(pHandle->tqReader == NULL); + pInfo->tqReader = tqOpenReader(pHandle->vnode); + ASSERT(pInfo->tqReader); + } else { + ASSERT(pHandle->tqReader); + pInfo->tqReader = pHandle->tqReader; } if (pSTInfo->interval.interval > 0) { @@ -1414,18 +1431,17 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys } else { pInfo->pUpdateInfo = NULL; } - pInfo->pSnapshotReadOp = pTableScanDummy; + + pInfo->pTableScanOp = pTableScanOp; pInfo->interval = pSTInfo->interval; pInfo->readHandle = *pHandle; - ASSERT(pHandle->reader); - pInfo->streamBlockReader = pHandle->reader; pInfo->tableUid = pScanPhyNode->uid; // set the extract column id to streamHandle - tqReadHandleSetColIdList((SStreamReader*)pHandle->reader, pColIds); + tqReaderSetColIdList(pInfo->tqReader, pColIds); SArray* tableIdList = extractTableIdList(&pTaskInfo->tableqinfoList); - int32_t code = tqReadHandleSetTbUidList(pHandle->reader, tableIdList); + int32_t code = tqReaderSetTbUidList(pInfo->tqReader, tableIdList); if (code != 0) { taosArrayDestroy(tableIdList); goto _error; @@ -1449,7 +1465,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys pInfo->deleteDataIndex = 0; pInfo->pDeleteDataRes = createPullDataBlock(); - pOperator->name = "StreamBlockScanOperator"; + pOperator->name = "StreamScanOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN; pOperator->blocking = false; pOperator->status = OP_NOT_OPENED; @@ -1458,7 +1474,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys pOperator->pTaskInfo = pTaskInfo; pOperator->fpSet = - createOperatorFpSet(operatorDummyOpenFn, doStreamBlockScan, NULL, NULL, operatorDummyCloseFn, NULL, NULL, NULL); + createOperatorFpSet(operatorDummyOpenFn, doStreamScan, NULL, NULL, operatorDummyCloseFn, NULL, NULL, NULL); return pOperator; @@ -1481,6 +1497,8 @@ static void destroySysScanOperator(void* param, int32_t numOfOutput) { taosArrayDestroy(pInfo->scanCols); taosMemoryFreeClear(pInfo->pUser); + + taosMemoryFreeClear(param); } static int32_t getSysTableDbNameColId(const char* pTable) { @@ -2159,6 +2177,8 @@ static SSDataBlock* doTagScan(SOperatorInfo* pOperator) { static void destroyTagScanOperatorInfo(void* param, int32_t numOfOutput) { STagScanInfo* pInfo = (STagScanInfo*)param; pInfo->pRes = blockDataDestroy(pInfo->pRes); + + taosMemoryFreeClear(param); } SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysiNode* pPhyNode, @@ -2340,7 +2360,7 @@ static int32_t loadDataBlockFromOneTable(SOperatorInfo* pOperator, STableMergeSc bool allColumnsHaveAgg = true; SColumnDataAgg** pColAgg = NULL; STsdbReader* reader = taosArrayGetP(pTableScanInfo->dataReaders, readerIdx); - tsdbRetrieveDataBlockStatisInfo(reader, &pColAgg, &allColumnsHaveAgg); + tsdbRetrieveDatablockSMA(reader, &pColAgg, &allColumnsHaveAgg); if (allColumnsHaveAgg == true) { int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock); @@ -2649,6 +2669,8 @@ void destroyTableMergeScanOperatorInfo(void* param, int32_t numOfOutput) { pTableScanInfo->pSortInputBlock = blockDataDestroy(pTableScanInfo->pSortInputBlock); taosArrayDestroy(pTableScanInfo->pSortInfo); + + taosMemoryFreeClear(param); } typedef struct STableMergeScanExecInfo { @@ -2780,6 +2802,8 @@ static void destroyLastrowScanOperator(void* param, int32_t numOfOutput) { SLastrowScanInfo* pInfo = (SLastrowScanInfo*)param; blockDataDestroy(pInfo->pRes); tsdbLastrowReaderClose(pInfo->pLastrowReader); + + taosMemoryFreeClear(param); } SOperatorInfo* createLastrowScanOperator(SLastRowScanPhysiNode* pScanNode, SReadHandle* readHandle, SArray* pTableList, diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c index 2dc8ced737798f8ebd0bfa75db097e324c4f9cdd..d106d3e7495278e2098713992a1a7322f7c30d29 100644 --- a/source/libs/executor/src/sortoperator.c +++ b/source/libs/executor/src/sortoperator.c @@ -235,6 +235,8 @@ void destroyOrderOperatorInfo(void* param, int32_t numOfOutput) { taosArrayDestroy(pInfo->pSortInfo); taosArrayDestroy(pInfo->pColMatchInfo); + + taosMemoryFreeClear(param); } int32_t getExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExplain, uint32_t* len) { @@ -451,6 +453,8 @@ void destroyGroupSortOperatorInfo(void* param, int32_t numOfOutput) { taosArrayDestroy(pInfo->pSortInfo); taosArrayDestroy(pInfo->pColMatchInfo); + + taosMemoryFreeClear(param); } SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSortPhysiNode* pSortPhyNode, @@ -670,6 +674,8 @@ void destroyMultiwayMergeOperatorInfo(void* param, int32_t numOfOutput) { taosArrayDestroy(pInfo->pSortInfo); taosArrayDestroy(pInfo->pColMatchInfo); + + taosMemoryFreeClear(param); } int32_t getMultiwayMergeExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExplain, uint32_t* len) { diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index deee8b27be8a331af63c45c1b8768473a64651fd..0847b0267bd876f4848314df0cb79aafa885e326 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -1316,7 +1316,7 @@ bool doDeleteIntervalWindow(SAggSupporter* pAggSup, TSKEY ts, uint64_t groupId) // window has been closed return false; } - SFilePage* bufPage = getBufPage(pAggSup->pResultBuf, p1->pageId); + // SFilePage* bufPage = getBufPage(pAggSup->pResultBuf, p1->pageId); // dBufSetBufPageRecycled(pAggSup->pResultBuf, bufPage); taosHashRemove(pAggSup->pResultRowHashTable, pAggSup->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes)); return true; @@ -1419,7 +1419,7 @@ static int32_t closeIntervalWindow(SHashObj* pHashMap, STimeWindowAggSupp* pSup, ASSERT(pRecyPages != NULL); taosArrayPush(pRecyPages, &pPos->pageId); } else { - SFilePage* bufPage = getBufPage(pDiscBuf, pPos->pageId); + // SFilePage* bufPage = getBufPage(pDiscBuf, pPos->pageId); // dBufSetBufPageRecycled(pDiscBuf, bufPage); } char keyBuf[GET_RES_WINDOW_KEY_LEN(sizeof(TSKEY))]; @@ -1446,7 +1446,7 @@ static void freeAllPages(SArray* pageIds, SDiskbasedBuf* pDiskBuf) { int32_t size = taosArrayGetSize(pageIds); for (int32_t i = 0; i < size; i++) { int32_t pageId = *(int32_t*)taosArrayGet(pageIds, i); - SFilePage* bufPage = getBufPage(pDiskBuf, pageId); + // SFilePage* bufPage = getBufPage(pDiskBuf, pageId); // dBufSetBufPageRecycled(pDiskBuf, bufPage); } taosArrayClear(pageIds); @@ -1557,6 +1557,8 @@ static void destroyStateWindowOperatorInfo(void* param, int32_t numOfOutput) { SStateWindowOperatorInfo* pInfo = (SStateWindowOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); taosMemoryFreeClear(pInfo->stateKey.pData); + + taosMemoryFreeClear(param); } void destroyIntervalOperatorInfo(void* param, int32_t numOfOutput) { @@ -1564,6 +1566,8 @@ void destroyIntervalOperatorInfo(void* param, int32_t numOfOutput) { cleanupBasicInfo(&pInfo->binfo); cleanupAggSup(&pInfo->aggSup); taosArrayDestroy(pInfo->pRecycledPages); + + taosMemoryFreeClear(param); } void destroyStreamFinalIntervalOperatorInfo(void* param, int32_t numOfOutput) { @@ -1586,6 +1590,8 @@ void destroyStreamFinalIntervalOperatorInfo(void* param, int32_t numOfOutput) { } } nodesDestroyNode((SNode*)pInfo->pPhyNode); + + taosMemoryFreeClear(param); } static bool allInvertible(SqlFunctionCtx* pFCtx, int32_t numOfCols) { @@ -2319,6 +2325,8 @@ _error: void destroySWindowOperatorInfo(void* param, int32_t numOfOutput) { SSessionAggOperatorInfo* pInfo = (SSessionAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); + + taosMemoryFreeClear(param); } SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, @@ -2995,6 +3003,8 @@ void destroyStreamSessionAggOperatorInfo(void* param, int32_t numOfOutput) { taosMemoryFreeClear(pChInfo); } } + + taosMemoryFreeClear(param); } int32_t initBasicInfoEx(SOptrBasicInfo* pBasicInfo, SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfCols, @@ -3023,7 +3033,7 @@ void initDummyFunction(SqlFunctionCtx* pDummy, SqlFunctionCtx* pCtx, int32_t num void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int64_t gap, int64_t waterMark, uint8_t type) { ASSERT(downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN); - SStreamBlockScanInfo* pScanInfo = downstream->info; + SStreamScanInfo* pScanInfo = downstream->info; pScanInfo->sessionSup = (SessionWindowSupporter){.pStreamAggSup = pAggSup, .gap = gap, .parentType = type}; pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark); } @@ -3189,7 +3199,7 @@ SResultWindowInfo* getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY start *pIndex = index + 1; return pWin; } else if (endTs != INT64_MIN && isInWindow(pWin, endTs, gap)) { - *pIndex = index; + *pIndex = index + 1; return pWin; } } @@ -3442,7 +3452,7 @@ void deleteWindow(SArray* pWinInfos, int32_t index) { taosArrayRemove(pWinInfos, index); } -static void doDeleteSessionWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock, int64_t gap, SArray* result) { +static void doDeleteTimeWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock, int64_t gap, SArray* result) { SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); TSKEY* startDatas = (TSKEY*)pStartTsCol->pData; SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); @@ -3580,8 +3590,8 @@ typedef SResultWindowInfo* (*__get_win_info_)(void*); SResultWindowInfo* getResWinForSession(void* pData) { return (SResultWindowInfo*)pData; } SResultWindowInfo* getResWinForState(void* pData) { return &((SStateWindowInfo*)pData)->winInfo; } -int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, - SArray* pClosed, __get_win_info_ fn, bool delete) { +int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArray* pClosed, __get_win_info_ fn, + bool delete) { // Todo(liuyao) save window to tdb void** pIte = NULL; size_t keyLen = 0; @@ -3700,13 +3710,13 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) { SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo)); // gap must be 0 - doDeleteSessionWindows(&pInfo->streamAggSup, pBlock, 0, pWins); + doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, 0, pWins); if (IS_FINAL_OP(pInfo)) { int32_t childIndex = getChildIndex(pBlock); SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); SStreamSessionAggOperatorInfo* pChildInfo = pChildOp->info; // gap must be 0 - doDeleteSessionWindows(&pChildInfo->streamAggSup, pBlock, 0, NULL); + doDeleteTimeWindows(&pChildInfo->streamAggSup, pBlock, 0, NULL); rebuildTimeWindow(pInfo, pWins, pBlock->info.groupId, pOperator->exprSupp.numOfExprs, pOperator); } copyDeleteWindowInfo(pWins, pInfo->pStDeleted); @@ -3743,8 +3753,8 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { // restore the value pOperator->status = OP_RES_TO_RETURN; - closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, - getResWinForSession, pInfo->ignoreExpiredData); + closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, getResWinForSession, + pInfo->ignoreExpiredData); closeChildSessionWindow(pInfo->pChildren, pInfo->twAggSup.maxTs, pInfo->ignoreExpiredData); copyUpdateResult(pStUpdated, pUpdated); taosHashCleanup(pStUpdated); @@ -3840,7 +3850,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { break; } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) { // gap must be 0 - doDeleteSessionWindows(&pInfo->streamAggSup, pBlock, 0, NULL); + doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, 0, NULL); copyDataBlock(pInfo->pDelRes, pBlock); pInfo->pDelRes->info.type = STREAM_DELETE_RESULT; break; @@ -3954,6 +3964,8 @@ void destroyStreamStateOperatorInfo(void* param, int32_t numOfOutput) { taosMemoryFreeClear(pChInfo); } } + + taosMemoryFreeClear(param); } int64_t getStateWinTsKey(void* data, int32_t index) { @@ -4232,6 +4244,12 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { doClearStateWindows(&pInfo->streamAggSup, pBlock, pInfo->primaryTsIndex, &pInfo->stateCol, pInfo->stateCol.slotId, pSeUpdated, pInfo->pSeDeleted); continue; + } else if (pBlock->info.type == STREAM_DELETE_DATA) { + SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo)); + doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, 0, pWins); + copyDeleteWindowInfo(pWins, pInfo->pSeDeleted); + taosArrayDestroy(pWins); + continue; } else if (pBlock->info.type == STREAM_GET_ALL) { getAllSessionWindow(pInfo->streamAggSup.pResultRows, pUpdated, getResWinForState); continue; @@ -4245,8 +4263,8 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { // restore the value pOperator->status = OP_RES_TO_RETURN; - closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, - getResWinForState, pInfo->ignoreExpiredData); + closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, getResWinForState, + pInfo->ignoreExpiredData); closeChildSessionWindow(pInfo->pChildren, pInfo->twAggSup.maxTs, pInfo->ignoreExpiredData); copyUpdateResult(pSeUpdated, pUpdated); taosHashCleanup(pSeUpdated); @@ -4351,23 +4369,27 @@ _error: } typedef struct SMergeAlignedIntervalAggOperatorInfo { - SIntervalAggOperatorInfo intervalAggOperatorInfo; + SIntervalAggOperatorInfo *intervalAggOperatorInfo; bool hasGroupId; uint64_t groupId; SSDataBlock* prefetchedBlock; bool inputBlocksFinished; + + SNode* pCondition; } SMergeAlignedIntervalAggOperatorInfo; void destroyMergeAlignedIntervalOperatorInfo(void* param, int32_t numOfOutput) { SMergeAlignedIntervalAggOperatorInfo* miaInfo = (SMergeAlignedIntervalAggOperatorInfo*)param; - destroyIntervalOperatorInfo(&miaInfo->intervalAggOperatorInfo, numOfOutput); + destroyIntervalOperatorInfo(miaInfo->intervalAggOperatorInfo, numOfOutput); + + taosMemoryFreeClear(param); } static int32_t outputMergeAlignedIntervalResult(SOperatorInfo* pOperatorInfo, uint64_t tableGroupId, SSDataBlock* pResultBlock, TSKEY wstartTs) { SMergeAlignedIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info; - SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo; + SIntervalAggOperatorInfo* iaInfo = miaInfo->intervalAggOperatorInfo; SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo; SExprSupp* pSup = &pOperatorInfo->exprSupp; @@ -4388,7 +4410,7 @@ static int32_t outputMergeAlignedIntervalResult(SOperatorInfo* pOperatorInfo, ui static void doMergeAlignedIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResultRowInfo, SSDataBlock* pBlock, int32_t scanFlag, SSDataBlock* pResultBlock) { SMergeAlignedIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info; - SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo; + SIntervalAggOperatorInfo* iaInfo = miaInfo->intervalAggOperatorInfo; SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo; SExprSupp* pSup = &pOperatorInfo->exprSupp; @@ -4453,7 +4475,7 @@ static SSDataBlock* doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SMergeAlignedIntervalAggOperatorInfo* miaInfo = pOperator->info; - SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo; + SIntervalAggOperatorInfo* iaInfo = miaInfo->intervalAggOperatorInfo; if (pOperator->status == OP_EXEC_DONE) { return NULL; } @@ -4492,8 +4514,8 @@ static SSDataBlock* doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) { getTableScanInfo(pOperator, &iaInfo->order, &scanFlag); setInputDataBlock(pOperator, pSup->pCtx, pBlock, iaInfo->order, scanFlag, true); doMergeAlignedIntervalAggImpl(pOperator, &iaInfo->binfo.resultRowInfo, pBlock, scanFlag, pRes); - - if (pRes->info.rows >= pOperator->resultInfo.threshold) { + doFilter(miaInfo->pCondition, pRes); + if (pRes->info.rows > 0) { break; } } @@ -4501,7 +4523,7 @@ static SSDataBlock* doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) { pRes->info.groupId = miaInfo->groupId; } - if (pRes->info.rows == 0) { + if (miaInfo->inputBlocksFinished) { doSetOperatorCompleted(pOperator); } @@ -4512,16 +4534,22 @@ static SSDataBlock* doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) { SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval, - int32_t primaryTsSlotId, SExecTaskInfo* pTaskInfo) { + int32_t primaryTsSlotId, SNode* pCondition, SExecTaskInfo* pTaskInfo) { SMergeAlignedIntervalAggOperatorInfo* miaInfo = taosMemoryCalloc(1, sizeof(SMergeAlignedIntervalAggOperatorInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (miaInfo == NULL || pOperator == NULL) { goto _error; } - SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo; + miaInfo->intervalAggOperatorInfo = taosMemoryCalloc(1, sizeof(SIntervalAggOperatorInfo)); + if (miaInfo->intervalAggOperatorInfo == NULL) { + goto _error; + } + + SIntervalAggOperatorInfo* iaInfo = miaInfo->intervalAggOperatorInfo; SExprSupp* pSup = &pOperator->exprSupp; + miaInfo->pCondition = pCondition; iaInfo->win = pTaskInfo->window; iaInfo->order = TSDB_ORDER_ASC; iaInfo->interval = *pInterval; @@ -4596,6 +4624,8 @@ void destroyMergeIntervalOperatorInfo(void* param, int32_t numOfOutput) { SMergeIntervalAggOperatorInfo* miaInfo = (SMergeIntervalAggOperatorInfo*)param; tdListFree(miaInfo->groupIntervals); destroyIntervalOperatorInfo(&miaInfo->intervalAggOperatorInfo, numOfOutput); + + taosMemoryFreeClear(param); } static int32_t finalizeWindowResult(SOperatorInfo* pOperatorInfo, uint64_t tableGroupId, STimeWindow* win, diff --git a/source/libs/function/inc/fnLog.h b/source/libs/function/inc/fnLog.h index d85dd024331d0b2ec7374079cad9af344368a3c4..d8dd1d1e6767e2dca19f88484e0cd222d216d260 100644 --- a/source/libs/function/inc/fnLog.h +++ b/source/libs/function/inc/fnLog.h @@ -10,12 +10,14 @@ extern "C" { #endif -#define fnFatal(...) { if (fnDebugFlag & DEBUG_FATAL) { taosPrintLog("FN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} -#define fnError(...) { if (fnDebugFlag & DEBUG_ERROR) { taosPrintLog("FN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} -#define fnWarn(...) { if (fnDebugFlag & DEBUG_WARN) { taosPrintLog("FN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} -#define fnInfo(...) { if (fnDebugFlag & DEBUG_INFO) { taosPrintLog("FN ", DEBUG_INFO, 255, __VA_ARGS__); }} -#define fnDebug(...) { if (fnDebugFlag & DEBUG_DEBUG) { taosPrintLog("FN ", DEBUG_DEBUG, dDebugFlag, __VA_ARGS__); }} -#define fnTrace(...) { if (fnDebugFlag & DEBUG_TRACE) { taosPrintLog("FN ", DEBUG_TRACE, dDebugFlag, __VA_ARGS__); }} +// clang-format off +#define fnFatal(...) { if (udfDebugFlag & DEBUG_FATAL) { taosPrintLog("UDF FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} +#define fnError(...) { if (udfDebugFlag & DEBUG_ERROR) { taosPrintLog("UDF ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} +#define fnWarn(...) { if (udfDebugFlag & DEBUG_WARN) { taosPrintLog("UDF WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} +#define fnInfo(...) { if (udfDebugFlag & DEBUG_INFO) { taosPrintLog("UDF ", DEBUG_INFO, 255, __VA_ARGS__); }} +#define fnDebug(...) { if (udfDebugFlag & DEBUG_DEBUG) { taosPrintLog("UDF ", DEBUG_DEBUG, udfDebugFlag, __VA_ARGS__); }} +#define fnTrace(...) { if (udfDebugFlag & DEBUG_TRACE) { taosPrintLog("UDF ", DEBUG_TRACE, udfDebugFlag, __VA_ARGS__); }} +// clang-format on #ifdef __cplusplus } diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index f94522f0d8bde5df192d6481f2c2a9ae4cc57291..d8fcca30c0eb17bd6082dd0af2a2b88a65fef72d 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -1080,6 +1080,19 @@ bool getMinmaxFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) { static void saveTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos); static void copyTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos); +static int32_t findRowIndex(int32_t start, int32_t num, SColumnInfoData* pCol, const char* tval) { + // the data is loaded, not only the block SMA value + for(int32_t i = start; i < num + start; ++i) { + char* p = colDataGetData(pCol, i); + if (memcpy((void*)tval, p, pCol->info.bytes) == 0) { + return i; + } + } + + ASSERT(0); +} + + int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { int32_t numOfElems = 0; @@ -1111,15 +1124,14 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { if (isMinFunc) { tval = &pInput->pColumnDataAgg[0]->min; - index = pInput->pColumnDataAgg[0]->minIndex; } else { tval = &pInput->pColumnDataAgg[0]->max; - index = pInput->pColumnDataAgg[0]->maxIndex; } if (!pBuf->assign) { pBuf->v = *(int64_t*)tval; if (pCtx->subsidiaries.num > 0) { + index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval); saveTupleData(pCtx, index, pCtx->pSrcBlock, &pBuf->tuplePos); } } else { @@ -1131,6 +1143,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { if ((prev < val) ^ isMinFunc) { pBuf->v = val; if (pCtx->subsidiaries.num > 0) { + index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval); saveTupleData(pCtx, index, pCtx->pSrcBlock, &pBuf->tuplePos); } } @@ -1143,6 +1156,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { if ((prev < val) ^ isMinFunc) { pBuf->v = val; if (pCtx->subsidiaries.num > 0) { + index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval); saveTupleData(pCtx, index, pCtx->pSrcBlock, &pBuf->tuplePos); } } @@ -1154,6 +1168,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { if ((prev < val) ^ isMinFunc) { pBuf->v = val; if (pCtx->subsidiaries.num > 0) { + index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval); saveTupleData(pCtx, index, pCtx->pSrcBlock, &pBuf->tuplePos); } } @@ -1167,6 +1182,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { } if (pCtx->subsidiaries.num > 0) { + index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval); saveTupleData(pCtx, index, pCtx->pSrcBlock, &pBuf->tuplePos); } } @@ -5547,30 +5563,18 @@ int32_t blockDistFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { } } - int32_t delta = maxVal - minVal; - int32_t step = delta / 50; - if (step == 0) { - step = 1; - } + // maximum number of step is 80 + double factor = pData->numOfBlocks / 80.0; int32_t numOfBuckets = sizeof(pData->blockRowsHisto) / sizeof(pData->blockRowsHisto[0]); - int32_t bucketRange = (pData->maxRows - pData->minRows) / numOfBuckets; - - bool singleModel = false; - if (bucketRange == 0) { - singleModel = true; - step = 20; - bucketRange = (pData->defMaxRows - pData->defMinRows) / numOfBuckets; - } + int32_t bucketRange = (pData->defMaxRows - pData->defMinRows) / numOfBuckets; for (int32_t i = 0; i < tListLen(pData->blockRowsHisto); ++i) { - len = sprintf(st + VARSTR_HEADER_SIZE, "%04d |", pData->defMinRows + bucketRange * (i + 1)); + len = sprintf(st + VARSTR_HEADER_SIZE, "%04d |", pData->defMinRows + bucketRange * i); int32_t num = 0; - if (singleModel && pData->blockRowsHisto[i] > 0) { - num = 20; - } else { - num = (pData->blockRowsHisto[i] + step - 1) / step; + if (pData->blockRowsHisto[i] > 0) { + num = (pData->blockRowsHisto[i]) / factor; } for (int32_t j = 0; j < num; ++j) { @@ -5578,9 +5582,10 @@ int32_t blockDistFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { len += x; } - double v = pData->blockRowsHisto[i] * 100.0 / pData->numOfBlocks; - len += sprintf(st + VARSTR_HEADER_SIZE + len, " %d (%.2f%c)", pData->blockRowsHisto[i], v, '%'); - printf("%s\n", st); + if (num > 0) { + double v = pData->blockRowsHisto[i] * 100.0 / pData->numOfBlocks; + len += sprintf(st + VARSTR_HEADER_SIZE + len, " %d (%.2f%c)", pData->blockRowsHisto[i], v, '%'); + } varDataSetLen(st, len); colDataAppend(pColInfo, row++, st, false); diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 2a94ee43e3f13340cf06919fd111ce44274fdad5..5d5e95cd2b3dda9f99df1ded071cfd1f8ca6bf4d 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -3605,7 +3605,7 @@ static int32_t databaseOptionsToJson(const void* pObj, SJson* pJson) { int32_t code = tjsonAddIntegerToObject(pJson, jkDatabaseOptionsBuffer, pNode->buffer); if (TSDB_CODE_SUCCESS == code) { - code = tjsonAddIntegerToObject(pJson, jkDatabaseOptionsCachelast, pNode->cachelast); + code = tjsonAddIntegerToObject(pJson, jkDatabaseOptionsCachelast, pNode->cacheLast); } if (TSDB_CODE_SUCCESS == code) { code = tjsonAddIntegerToObject(pJson, jkDatabaseOptionsCompressionLevel, pNode->compressionLevel); @@ -3667,7 +3667,7 @@ static int32_t jsonToDatabaseOptions(const SJson* pJson, void* pObj) { int32_t code = tjsonGetIntValue(pJson, jkDatabaseOptionsBuffer, &pNode->buffer); if (TSDB_CODE_SUCCESS == code) { - code = tjsonGetTinyIntValue(pJson, jkDatabaseOptionsCachelast, &pNode->cachelast); + code = tjsonGetTinyIntValue(pJson, jkDatabaseOptionsCachelast, &pNode->cacheLast); } if (TSDB_CODE_SUCCESS == code) { code = tjsonGetTinyIntValue(pJson, jkDatabaseOptionsCompressionLevel, &pNode->compressionLevel); diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index 835f8098a365bf63a26a8e7b94ac19012f55c95c..ee60a14da9896d0b711434a5a6d142cba2b37c80 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -39,6 +39,7 @@ typedef struct SAstCreateContext { typedef enum EDatabaseOptionType { DB_OPTION_BUFFER = 1, DB_OPTION_CACHELAST, + DB_OPTION_CACHELASTSIZE, DB_OPTION_COMP, DB_OPTION_DAYS, DB_OPTION_FSYNC, diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 3c173aead9c0820aa2dea86483ffede66cea1daf..fd79eaa9b7ee0cb2f066020871ee6d42fff185f1 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -172,6 +172,7 @@ exists_opt(A) ::= . db_options(A) ::= . { A = createDefaultDatabaseOptions(pCxt); } db_options(A) ::= db_options(B) BUFFER NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_BUFFER, &C); } db_options(A) ::= db_options(B) CACHELAST NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_CACHELAST, &C); } +db_options(A) ::= db_options(B) CACHELASTSIZE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_CACHELASTSIZE, &C); } db_options(A) ::= db_options(B) COMP NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_COMP, &C); } db_options(A) ::= db_options(B) DURATION NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_DAYS, &C); } db_options(A) ::= db_options(B) DURATION NK_VARIABLE(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_DAYS, &C); } @@ -198,6 +199,7 @@ alter_db_options(A) ::= alter_db_options(B) alter_db_option(C). %destructor alter_db_option { } alter_db_option(A) ::= BUFFER NK_INTEGER(B). { A.type = DB_OPTION_BUFFER; A.val = B; } alter_db_option(A) ::= CACHELAST NK_INTEGER(B). { A.type = DB_OPTION_CACHELAST; A.val = B; } +alter_db_option(A) ::= CACHELASTSIZE NK_INTEGER(B). { A.type = DB_OPTION_CACHELASTSIZE; A.val = B; } alter_db_option(A) ::= FSYNC NK_INTEGER(B). { A.type = DB_OPTION_FSYNC; A.val = B; } alter_db_option(A) ::= KEEP integer_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; } alter_db_option(A) ::= KEEP variable_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 29396f4101ebe4a697c6e3f69d0db23c3ba6b9ad..ab73204fb7a45071fefff4cd1feacf1bdc05b766 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -746,7 +746,8 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) { SDatabaseOptions* pOptions = (SDatabaseOptions*)nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS); CHECK_OUT_OF_MEM(pOptions); pOptions->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE; - pOptions->cachelast = TSDB_DEFAULT_CACHE_LAST_ROW; + pOptions->cacheLast = TSDB_DEFAULT_CACHE_LAST_ROW; + pOptions->cacheLastSize = TSDB_DEFAULT_LAST_ROW_MEM; pOptions->compressionLevel = TSDB_DEFAULT_COMP_LEVEL; pOptions->daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE; pOptions->fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD; @@ -772,7 +773,8 @@ SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) { SDatabaseOptions* pOptions = (SDatabaseOptions*)nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS); CHECK_OUT_OF_MEM(pOptions); pOptions->buffer = -1; - pOptions->cachelast = -1; + pOptions->cacheLast = -1; + pOptions->cacheLastSize = -1; pOptions->compressionLevel = -1; pOptions->daysPerFile = -1; pOptions->fsyncPeriod = -1; @@ -800,7 +802,10 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti ((SDatabaseOptions*)pOptions)->buffer = taosStr2Int32(((SToken*)pVal)->z, NULL, 10); break; case DB_OPTION_CACHELAST: - ((SDatabaseOptions*)pOptions)->cachelast = taosStr2Int8(((SToken*)pVal)->z, NULL, 10); + ((SDatabaseOptions*)pOptions)->cacheLast = taosStr2Int8(((SToken*)pVal)->z, NULL, 10); + break; + case DB_OPTION_CACHELASTSIZE: + ((SDatabaseOptions*)pOptions)->cacheLastSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10); break; case DB_OPTION_COMP: ((SDatabaseOptions*)pOptions)->compressionLevel = taosStr2Int8(((SToken*)pVal)->z, NULL, 10); diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index 38fe8ffc242c4304b771e23651e1dbdacc37cac8..920921a3b35fcbab6084367eb1991b14f0e62cc0 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -53,6 +53,7 @@ static SKeyword keywordTable[] = { {"BY", TK_BY}, {"CACHE", TK_CACHE}, {"CACHELAST", TK_CACHELAST}, + {"CACHELASTSIZE", TK_CACHELASTSIZE}, {"CAST", TK_CAST}, {"CLIENT_VERSION", TK_CLIENT_VERSION}, {"CLUSTER", TK_CLUSTER}, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 0975fe7309189512503285930f7475c432c3e48c..0fbeac47e61a6e412acae6697bc2f55b6d85de1f 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2988,7 +2988,8 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS pReq->compression = pStmt->pOptions->compressionLevel; pReq->replications = pStmt->pOptions->replica; pReq->strict = pStmt->pOptions->strict; - pReq->cacheLastRow = pStmt->pOptions->cachelast; + pReq->cacheLastRow = pStmt->pOptions->cacheLast; + pReq->lastRowMem = pStmt->pOptions->cacheLastSize; pReq->schemaless = pStmt->pOptions->schemaless; pReq->ignoreExist = pStmt->ignoreExists; return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq); @@ -3149,9 +3150,13 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName int32_t code = checkRangeOption(pCxt, "buffer", pOptions->buffer, TSDB_MIN_BUFFER_PER_VNODE, TSDB_MAX_BUFFER_PER_VNODE); if (TSDB_CODE_SUCCESS == code) { - code = checkRangeOption(pCxt, "cacheLast", pOptions->cachelast, TSDB_MIN_DB_CACHE_LAST_ROW, + code = checkRangeOption(pCxt, "cacheLast", pOptions->cacheLast, TSDB_MIN_DB_CACHE_LAST_ROW, TSDB_MAX_DB_CACHE_LAST_ROW); } + if (TSDB_CODE_SUCCESS == code) { + code = checkRangeOption(pCxt, "cacheLastSize", pOptions->cacheLastSize, TSDB_MIN_DB_LAST_ROW_MEM, + TSDB_MAX_DB_LAST_ROW_MEM); + } if (TSDB_CODE_SUCCESS == code) { code = checkRangeOption(pCxt, "compression", pOptions->compressionLevel, TSDB_MIN_COMP_LEVEL, TSDB_MAX_COMP_LEVEL); } @@ -3271,7 +3276,8 @@ static void buildAlterDbReq(STranslateContext* pCxt, SAlterDatabaseStmt* pStmt, pReq->fsyncPeriod = pStmt->pOptions->fsyncPeriod; pReq->walLevel = pStmt->pOptions->walLevel; pReq->strict = pStmt->pOptions->strict; - pReq->cacheLastRow = pStmt->pOptions->cachelast; + pReq->cacheLastRow = pStmt->pOptions->cacheLast; + pReq->lastRowMem = pStmt->pOptions->cacheLastSize; pReq->replications = pStmt->pOptions->replica; return; } diff --git a/source/libs/parser/src/parser.c b/source/libs/parser/src/parser.c index 4f8ea002719df5c37ee3ba53a4622742f3ad1dbb..b36adbe5d4b44c70bab137be83b84c63945ce0e9 100644 --- a/source/libs/parser/src/parser.c +++ b/source/libs/parser/src/parser.c @@ -39,6 +39,9 @@ bool qIsInsertValuesSql(const char* pStr, size_t length) { if (TK_USING == t.type || TK_VALUES == t.type) { return true; } + if (0 == t.type) { + break; + } } while (pStr - pSql < length); return false; } diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 1bc204b9d9a9f2cc45d4ec3d61e5ca30e943f4ca..124d1b227070b217c185d9629bee5c492745cac0 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -104,26 +104,26 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 376 +#define YYNOCODE 377 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - EJoinType yy52; - bool yy89; - SDataType yy224; - int32_t yy228; - SNode* yy248; - SAlterOption yy301; - ENullOrder yy345; - SToken yy401; - EOrder yy482; - int64_t yy525; - SNodeList* yy552; - EFillMode yy582; - int8_t yy695; - EOperatorType yy716; + SToken yy5; + EJoinType yy74; + SNodeList* yy210; + EFillMode yy270; + int64_t yy311; + SAlterOption yy351; + bool yy403; + EOperatorType yy428; + int32_t yy462; + ENullOrder yy477; + int8_t yy535; + SDataType yy552; + EOrder yy553; + SNode* yy652; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -139,17 +139,17 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 661 -#define YYNRULE 485 -#define YYNTOKEN 253 -#define YY_MAX_SHIFT 660 -#define YY_MIN_SHIFTREDUCE 962 -#define YY_MAX_SHIFTREDUCE 1446 -#define YY_ERROR_ACTION 1447 -#define YY_ACCEPT_ACTION 1448 -#define YY_NO_ACTION 1449 -#define YY_MIN_REDUCE 1450 -#define YY_MAX_REDUCE 1934 +#define YYNSTATE 663 +#define YYNRULE 487 +#define YYNTOKEN 254 +#define YY_MAX_SHIFT 662 +#define YY_MIN_SHIFTREDUCE 966 +#define YY_MAX_SHIFTREDUCE 1452 +#define YY_ERROR_ACTION 1453 +#define YY_ACCEPT_ACTION 1454 +#define YY_NO_ACTION 1455 +#define YY_MIN_REDUCE 1456 +#define YY_MAX_REDUCE 1942 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -216,658 +216,656 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2363) +#define YY_ACTTAB_COUNT (2360) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 430, 549, 431, 1485, 438, 1685, 431, 1485, 1576, 549, - /* 10 */ 34, 33, 40, 38, 41, 39, 37, 36, 35, 1753, - /* 20 */ 337, 71, 1248, 1451, 379, 1756, 435, 342, 552, 122, - /* 30 */ 1630, 1632, 1270, 1323, 117, 1246, 1753, 122, 41, 39, - /* 40 */ 37, 36, 35, 1580, 103, 1749, 1755, 102, 101, 100, - /* 50 */ 99, 98, 97, 96, 95, 94, 1318, 570, 554, 1912, - /* 60 */ 14, 1448, 1749, 1755, 326, 1912, 1254, 1769, 62, 120, - /* 70 */ 385, 1012, 1911, 1011, 570, 447, 1909, 120, 159, 40, - /* 80 */ 38, 1386, 1909, 1, 156, 1854, 1855, 337, 1859, 1248, - /* 90 */ 1273, 44, 249, 1854, 548, 1787, 547, 995, 513, 1912, - /* 100 */ 1323, 1013, 1246, 577, 1473, 657, 323, 301, 1739, 1682, - /* 110 */ 576, 142, 161, 1462, 61, 1912, 1909, 482, 481, 1325, - /* 120 */ 1326, 349, 480, 1318, 554, 118, 477, 14, 160, 476, - /* 130 */ 475, 474, 1909, 1254, 1681, 1800, 298, 999, 1000, 89, - /* 140 */ 1770, 579, 1772, 1773, 575, 1739, 570, 61, 610, 1846, - /* 150 */ 2, 34, 33, 304, 1842, 41, 39, 37, 36, 35, - /* 160 */ 220, 221, 1912, 1912, 1249, 1912, 1247, 131, 130, 607, - /* 170 */ 606, 605, 657, 1512, 552, 159, 1910, 1637, 161, 1909, - /* 180 */ 1909, 143, 1909, 418, 325, 1542, 1325, 1326, 1450, 1145, - /* 190 */ 1146, 1252, 1253, 1635, 1301, 1302, 1304, 1305, 1306, 1307, - /* 200 */ 1308, 572, 568, 1316, 1317, 1319, 1320, 1321, 1322, 1324, - /* 210 */ 1327, 61, 112, 111, 110, 109, 108, 107, 106, 105, - /* 220 */ 104, 303, 558, 162, 515, 31, 259, 1417, 214, 174, - /* 230 */ 173, 1249, 219, 1247, 71, 634, 633, 632, 345, 1407, - /* 240 */ 631, 630, 629, 123, 624, 623, 622, 621, 620, 619, - /* 250 */ 618, 617, 133, 613, 162, 61, 1581, 75, 1252, 1253, - /* 260 */ 1273, 1301, 1302, 1304, 1305, 1306, 1307, 1308, 572, 568, - /* 270 */ 1316, 1317, 1319, 1320, 1321, 1322, 1324, 1327, 40, 38, - /* 280 */ 535, 1405, 1406, 1408, 1409, 549, 337, 162, 1248, 627, - /* 290 */ 512, 378, 347, 377, 1228, 1229, 1631, 1632, 370, 1323, - /* 300 */ 1563, 1246, 1103, 601, 600, 599, 1107, 598, 1109, 1110, - /* 310 */ 597, 1112, 594, 122, 1118, 591, 1120, 1121, 588, 585, - /* 320 */ 372, 368, 1318, 498, 479, 478, 14, 525, 1561, 525, - /* 330 */ 373, 1912, 1254, 1912, 554, 40, 38, 1769, 164, 1248, - /* 340 */ 113, 86, 1272, 337, 159, 1248, 159, 468, 1909, 2, - /* 350 */ 1909, 162, 1246, 120, 119, 1585, 1323, 1585, 1246, 447, - /* 360 */ 543, 1012, 1577, 1011, 1912, 1787, 207, 1472, 249, 1854, - /* 370 */ 548, 657, 547, 577, 1787, 1912, 466, 159, 1739, 1318, - /* 380 */ 576, 1909, 542, 1254, 552, 1325, 1326, 612, 159, 1254, - /* 390 */ 1471, 1013, 1909, 103, 554, 162, 102, 101, 100, 99, - /* 400 */ 98, 97, 96, 95, 94, 1800, 8, 1757, 1739, 89, - /* 410 */ 1770, 579, 1772, 1773, 575, 1065, 570, 538, 1753, 1846, - /* 420 */ 541, 559, 657, 304, 1842, 73, 303, 612, 657, 515, - /* 430 */ 1249, 1739, 1247, 34, 33, 1912, 496, 41, 39, 37, - /* 440 */ 36, 35, 1325, 1326, 1749, 1755, 1067, 43, 159, 494, - /* 450 */ 1470, 492, 1909, 1390, 1274, 1037, 570, 1252, 1253, 1272, - /* 460 */ 1301, 1302, 1304, 1305, 1306, 1307, 1308, 572, 568, 1316, - /* 470 */ 1317, 1319, 1320, 1321, 1322, 1324, 1327, 11, 10, 549, - /* 480 */ 1562, 1249, 525, 1247, 525, 549, 1038, 1249, 153, 1247, - /* 490 */ 79, 1739, 1861, 165, 1726, 383, 544, 539, 34, 33, - /* 500 */ 314, 1624, 41, 39, 37, 36, 35, 122, 1252, 1253, - /* 510 */ 1585, 1578, 1585, 122, 1252, 1253, 1858, 1301, 1302, 1304, - /* 520 */ 1305, 1306, 1307, 1308, 572, 568, 1316, 1317, 1319, 1320, - /* 530 */ 1321, 1322, 1324, 1327, 40, 38, 1328, 525, 37, 36, - /* 540 */ 35, 358, 337, 1769, 1248, 525, 162, 120, 384, 315, - /* 550 */ 305, 313, 312, 120, 470, 1323, 388, 1246, 472, 324, - /* 560 */ 1359, 551, 155, 1854, 1855, 1585, 1859, 140, 157, 1854, - /* 570 */ 1855, 1787, 1859, 1585, 1286, 610, 1587, 1271, 1318, 553, - /* 580 */ 471, 1443, 1345, 1333, 1739, 251, 576, 162, 1254, 1272, - /* 590 */ 85, 40, 38, 1515, 131, 130, 607, 606, 605, 337, - /* 600 */ 82, 1248, 34, 33, 1861, 9, 41, 39, 37, 36, - /* 610 */ 35, 1800, 1323, 566, 1246, 90, 1770, 579, 1772, 1773, - /* 620 */ 575, 525, 570, 429, 170, 1846, 433, 657, 1857, 330, - /* 630 */ 1842, 154, 113, 525, 1303, 1318, 1346, 23, 1680, 473, - /* 640 */ 298, 1325, 1326, 158, 403, 1254, 525, 1675, 1469, 1585, - /* 650 */ 69, 1872, 1254, 68, 525, 482, 481, 404, 172, 1351, - /* 660 */ 480, 1585, 9, 118, 477, 446, 1275, 476, 475, 474, - /* 670 */ 1442, 34, 33, 340, 1585, 41, 39, 37, 36, 35, - /* 680 */ 1637, 140, 1585, 525, 657, 604, 1249, 341, 1247, 1739, - /* 690 */ 1587, 615, 1468, 616, 1582, 1557, 1635, 1383, 1325, 1326, - /* 700 */ 1560, 30, 335, 1340, 1341, 1342, 1343, 1344, 1348, 1349, - /* 710 */ 1350, 1585, 437, 1252, 1253, 433, 1301, 1302, 1304, 1305, - /* 720 */ 1306, 1307, 1308, 572, 568, 1316, 1317, 1319, 1320, 1321, - /* 730 */ 1322, 1324, 1327, 1739, 34, 33, 628, 626, 41, 39, - /* 740 */ 37, 36, 35, 1249, 1337, 1247, 27, 1397, 608, 999, - /* 750 */ 1000, 1628, 34, 33, 140, 29, 41, 39, 37, 36, - /* 760 */ 35, 34, 33, 1588, 1303, 41, 39, 37, 36, 35, - /* 770 */ 1252, 1253, 59, 1301, 1302, 1304, 1305, 1306, 1307, 1308, - /* 780 */ 572, 568, 1316, 1317, 1319, 1320, 1321, 1322, 1324, 1327, - /* 790 */ 40, 38, 300, 1272, 1270, 610, 660, 231, 337, 1769, - /* 800 */ 1248, 411, 1574, 1347, 423, 1467, 1466, 1465, 525, 525, - /* 810 */ 266, 1323, 1464, 1246, 131, 130, 607, 606, 605, 1714, - /* 820 */ 506, 396, 1461, 424, 151, 398, 1352, 1787, 7, 650, - /* 830 */ 646, 642, 638, 264, 1318, 577, 1585, 1585, 525, 1460, - /* 840 */ 1739, 525, 576, 343, 1254, 1570, 1739, 1739, 1739, 510, - /* 850 */ 42, 140, 523, 1739, 513, 609, 389, 561, 1628, 87, - /* 860 */ 1587, 2, 229, 1739, 1861, 1683, 1585, 1800, 28, 1585, - /* 870 */ 472, 91, 1770, 579, 1772, 1773, 575, 139, 570, 1459, - /* 880 */ 1739, 1846, 1458, 657, 1457, 1845, 1842, 271, 1856, 1456, - /* 890 */ 1615, 1196, 471, 1866, 1379, 522, 422, 1325, 1326, 417, - /* 900 */ 416, 415, 414, 413, 410, 409, 408, 407, 406, 402, - /* 910 */ 401, 400, 399, 393, 392, 391, 390, 1382, 387, 386, - /* 920 */ 1739, 1455, 1454, 1739, 1637, 1739, 141, 216, 34, 33, - /* 930 */ 1739, 277, 41, 39, 37, 36, 35, 45, 4, 1502, - /* 940 */ 1636, 1572, 1249, 525, 1247, 275, 58, 1568, 1220, 57, - /* 950 */ 209, 34, 33, 1453, 524, 41, 39, 37, 36, 35, - /* 960 */ 210, 483, 1739, 1739, 1769, 176, 426, 1497, 1303, 1252, - /* 970 */ 1253, 1585, 1301, 1302, 1304, 1305, 1306, 1307, 1308, 572, - /* 980 */ 568, 1316, 1317, 1319, 1320, 1321, 1322, 1324, 1327, 485, - /* 990 */ 198, 61, 1787, 196, 1739, 525, 200, 525, 202, 199, - /* 1000 */ 553, 201, 1495, 305, 1286, 1739, 260, 576, 344, 556, - /* 1010 */ 204, 1379, 218, 203, 125, 213, 52, 509, 128, 129, - /* 1020 */ 1759, 50, 1257, 1585, 488, 1585, 235, 11, 10, 88, - /* 1030 */ 571, 603, 1800, 1256, 505, 1345, 90, 1770, 579, 1772, - /* 1040 */ 1773, 575, 1769, 570, 74, 1463, 1846, 1445, 1446, 42, - /* 1050 */ 330, 1842, 154, 222, 1543, 518, 254, 1761, 562, 228, - /* 1060 */ 1096, 42, 1404, 42, 66, 65, 382, 238, 583, 169, - /* 1070 */ 1787, 536, 1873, 465, 499, 376, 243, 1788, 577, 128, - /* 1080 */ 346, 129, 114, 1739, 1491, 576, 128, 1486, 299, 1346, - /* 1090 */ 1353, 366, 1625, 364, 360, 356, 166, 351, 348, 1876, - /* 1100 */ 550, 248, 1309, 253, 270, 256, 258, 3, 53, 1124, - /* 1110 */ 1800, 80, 1351, 5, 90, 1770, 579, 1772, 1773, 575, - /* 1120 */ 1128, 570, 1135, 1133, 1846, 328, 327, 132, 330, 1842, - /* 1130 */ 1925, 162, 652, 350, 1270, 1262, 353, 357, 310, 1880, - /* 1140 */ 1769, 1065, 1212, 311, 267, 405, 1323, 1677, 1255, 171, - /* 1150 */ 412, 193, 419, 1260, 30, 335, 1340, 1341, 1342, 1343, - /* 1160 */ 1344, 1348, 1349, 1350, 1259, 146, 1769, 420, 1787, 1318, - /* 1170 */ 464, 460, 456, 452, 192, 1276, 577, 487, 421, 1254, - /* 1180 */ 425, 1739, 427, 576, 428, 436, 1279, 439, 440, 179, - /* 1190 */ 181, 1278, 497, 442, 1787, 1280, 1277, 441, 184, 444, - /* 1200 */ 72, 186, 577, 190, 445, 188, 206, 1739, 1800, 576, - /* 1210 */ 70, 448, 90, 1770, 579, 1772, 1773, 575, 534, 570, - /* 1220 */ 490, 191, 1846, 467, 484, 469, 330, 1842, 1925, 205, - /* 1230 */ 1575, 1719, 195, 1769, 1800, 1571, 197, 1903, 90, 1770, - /* 1240 */ 579, 1772, 1773, 575, 134, 570, 135, 1573, 1846, 93, - /* 1250 */ 1569, 302, 330, 1842, 1925, 56, 136, 137, 55, 268, - /* 1260 */ 208, 1787, 501, 1865, 500, 189, 182, 504, 187, 577, - /* 1270 */ 211, 507, 443, 511, 1739, 533, 576, 1263, 215, 1258, - /* 1280 */ 519, 514, 320, 1718, 224, 1687, 1769, 126, 516, 127, - /* 1290 */ 554, 180, 322, 226, 269, 520, 1769, 78, 1275, 537, - /* 1300 */ 1586, 1800, 521, 6, 1266, 284, 1770, 579, 1772, 1773, - /* 1310 */ 575, 233, 570, 529, 1787, 568, 1316, 1317, 1319, 1320, - /* 1320 */ 1321, 1322, 577, 1877, 1787, 237, 531, 1739, 530, 576, - /* 1330 */ 532, 1912, 577, 546, 329, 528, 527, 1739, 540, 576, - /* 1340 */ 121, 1379, 1887, 554, 161, 247, 1274, 563, 1909, 560, - /* 1350 */ 1886, 1769, 19, 581, 1800, 331, 1629, 245, 284, 1770, - /* 1360 */ 579, 1772, 1773, 575, 1800, 570, 272, 1769, 91, 1770, - /* 1370 */ 579, 1772, 1773, 575, 1868, 570, 246, 242, 1846, 1787, - /* 1380 */ 1862, 244, 565, 1842, 1912, 1928, 1558, 574, 1827, 263, - /* 1390 */ 653, 656, 1739, 252, 576, 1787, 654, 159, 51, 147, - /* 1400 */ 285, 1909, 148, 577, 1908, 557, 295, 294, 1739, 274, - /* 1410 */ 576, 276, 1733, 255, 63, 1732, 564, 1769, 257, 1800, - /* 1420 */ 1731, 1730, 64, 292, 1770, 579, 1772, 1773, 575, 573, - /* 1430 */ 570, 567, 1818, 1769, 352, 1800, 1727, 355, 354, 144, - /* 1440 */ 1770, 579, 1772, 1773, 575, 1787, 570, 359, 1240, 1241, - /* 1450 */ 1725, 167, 361, 577, 362, 363, 1724, 365, 1739, 1723, - /* 1460 */ 576, 1787, 367, 1722, 369, 1721, 321, 371, 1704, 577, - /* 1470 */ 168, 374, 375, 1215, 1739, 1769, 576, 1214, 1698, 1697, - /* 1480 */ 380, 381, 1696, 555, 1926, 1800, 1695, 1184, 1670, 91, - /* 1490 */ 1770, 579, 1772, 1773, 575, 1769, 570, 1669, 1668, 1846, - /* 1500 */ 67, 1800, 1667, 1787, 1843, 293, 1770, 579, 1772, 1773, - /* 1510 */ 575, 577, 570, 1666, 1665, 1664, 1739, 1663, 576, 394, - /* 1520 */ 395, 1662, 397, 1787, 1661, 1660, 1659, 1658, 526, 1657, - /* 1530 */ 1656, 577, 124, 1647, 1646, 1645, 1739, 1655, 576, 1654, - /* 1540 */ 1653, 1652, 1651, 1800, 1650, 1649, 1648, 288, 1770, 579, - /* 1550 */ 1772, 1773, 575, 1769, 570, 1644, 1643, 1642, 1186, 1641, - /* 1560 */ 1640, 1639, 1638, 1800, 1516, 1769, 175, 293, 1770, 579, - /* 1570 */ 1772, 1773, 575, 1514, 570, 1769, 1482, 1002, 1481, 1001, - /* 1580 */ 177, 1787, 115, 1712, 1706, 545, 1694, 1693, 178, 577, - /* 1590 */ 152, 116, 185, 1787, 1739, 432, 576, 434, 334, 1679, - /* 1600 */ 1564, 577, 1513, 1787, 1511, 183, 1739, 449, 576, 451, - /* 1610 */ 1509, 574, 453, 455, 450, 1031, 1739, 1507, 576, 459, - /* 1620 */ 457, 1800, 454, 1505, 1494, 144, 1770, 579, 1772, 1773, - /* 1630 */ 575, 461, 570, 1800, 1493, 1769, 458, 293, 1770, 579, - /* 1640 */ 1772, 1773, 575, 1800, 570, 462, 463, 292, 1770, 579, - /* 1650 */ 1772, 1773, 575, 1478, 570, 1566, 1819, 1139, 1769, 194, - /* 1660 */ 49, 1138, 1565, 1787, 1064, 1063, 1062, 1061, 336, 625, - /* 1670 */ 1927, 577, 1058, 1057, 1503, 1056, 1739, 1498, 576, 627, - /* 1680 */ 316, 317, 486, 1496, 489, 318, 1787, 1477, 1476, 491, - /* 1690 */ 1475, 338, 493, 495, 577, 92, 1711, 1705, 138, 1739, - /* 1700 */ 1769, 576, 1222, 1800, 502, 1692, 212, 293, 1770, 579, - /* 1710 */ 1772, 1773, 575, 1690, 570, 1691, 1689, 1769, 15, 1686, - /* 1720 */ 1678, 82, 54, 1688, 225, 217, 1800, 223, 1787, 1232, - /* 1730 */ 293, 1770, 579, 1772, 1773, 575, 577, 570, 230, 503, - /* 1740 */ 1419, 1739, 319, 576, 76, 1787, 508, 42, 77, 16, - /* 1750 */ 517, 24, 227, 577, 234, 232, 241, 1401, 1739, 236, - /* 1760 */ 576, 1264, 1403, 145, 48, 1396, 1431, 1769, 1800, 239, - /* 1770 */ 240, 1759, 278, 1770, 579, 1772, 1773, 575, 25, 570, - /* 1780 */ 26, 81, 250, 1376, 1375, 1800, 47, 1758, 1769, 279, - /* 1790 */ 1770, 579, 1772, 1773, 575, 1787, 570, 149, 1436, 18, - /* 1800 */ 1430, 1425, 46, 577, 332, 1435, 17, 1434, 1739, 1769, - /* 1810 */ 576, 333, 10, 1803, 20, 569, 1787, 13, 1338, 1313, - /* 1820 */ 150, 163, 1311, 32, 577, 1294, 1310, 580, 12, 1739, - /* 1830 */ 21, 576, 22, 582, 1125, 1800, 578, 1787, 584, 280, - /* 1840 */ 1770, 579, 1772, 1773, 575, 577, 570, 339, 1122, 586, - /* 1850 */ 1739, 1769, 576, 589, 592, 595, 1800, 1119, 1102, 1117, - /* 1860 */ 287, 1770, 579, 1772, 1773, 575, 587, 570, 1769, 590, - /* 1870 */ 1116, 1113, 593, 1115, 1111, 596, 602, 1800, 83, 1787, - /* 1880 */ 84, 289, 1770, 579, 1772, 1773, 575, 577, 570, 1114, - /* 1890 */ 1134, 60, 1739, 261, 576, 1130, 1787, 1071, 1029, 611, - /* 1900 */ 1053, 262, 614, 1051, 577, 1050, 1049, 1048, 1046, 1739, - /* 1910 */ 1047, 576, 1045, 1044, 1068, 1066, 1041, 1040, 1039, 1800, - /* 1920 */ 1769, 636, 1036, 281, 1770, 579, 1772, 1773, 575, 1035, - /* 1930 */ 570, 1034, 1510, 635, 637, 1508, 1800, 639, 640, 641, - /* 1940 */ 290, 1770, 579, 1772, 1773, 575, 1506, 570, 1787, 643, - /* 1950 */ 644, 645, 1504, 647, 648, 649, 577, 1492, 651, 992, - /* 1960 */ 1474, 1739, 265, 576, 655, 1449, 1250, 273, 658, 659, - /* 1970 */ 1449, 1449, 1449, 1449, 1769, 1449, 1449, 1449, 1449, 1449, - /* 1980 */ 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1800, 1449, - /* 1990 */ 1769, 1449, 282, 1770, 579, 1772, 1773, 575, 1449, 570, - /* 2000 */ 1769, 1449, 1787, 1449, 1449, 1449, 1449, 1449, 1449, 1449, - /* 2010 */ 577, 1449, 1449, 1449, 1449, 1739, 1449, 576, 1787, 1449, - /* 2020 */ 1449, 1449, 1449, 1449, 1449, 1449, 577, 1449, 1787, 1449, - /* 2030 */ 1449, 1739, 1449, 576, 1449, 1449, 577, 1449, 1449, 1449, - /* 2040 */ 1449, 1739, 1800, 576, 1449, 1449, 291, 1770, 579, 1772, - /* 2050 */ 1773, 575, 1769, 570, 1449, 1449, 1449, 1449, 1800, 1449, - /* 2060 */ 1449, 1449, 283, 1770, 579, 1772, 1773, 575, 1800, 570, - /* 2070 */ 1449, 1449, 296, 1770, 579, 1772, 1773, 575, 1449, 570, - /* 2080 */ 1787, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 577, 1449, - /* 2090 */ 1449, 1449, 1449, 1739, 1769, 576, 1449, 1449, 1449, 1449, - /* 2100 */ 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1769, 1449, - /* 2110 */ 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1769, 1449, - /* 2120 */ 1800, 1449, 1787, 1449, 297, 1770, 579, 1772, 1773, 575, - /* 2130 */ 577, 570, 1449, 1449, 1449, 1739, 1787, 576, 1449, 1449, - /* 2140 */ 1449, 1449, 1449, 1449, 577, 1449, 1787, 1449, 1449, 1739, - /* 2150 */ 1449, 576, 1449, 1449, 577, 1449, 1449, 1449, 1449, 1739, - /* 2160 */ 1449, 576, 1800, 1449, 1449, 1449, 1781, 1770, 579, 1772, - /* 2170 */ 1773, 575, 1449, 570, 1449, 1449, 1800, 1769, 1449, 1449, - /* 2180 */ 1780, 1770, 579, 1772, 1773, 575, 1800, 570, 1449, 1449, - /* 2190 */ 1779, 1770, 579, 1772, 1773, 575, 1449, 570, 1769, 1449, - /* 2200 */ 1449, 1449, 1449, 1449, 1449, 1787, 1449, 1449, 1449, 1449, - /* 2210 */ 1449, 1449, 1449, 577, 1449, 1449, 1449, 1449, 1739, 1449, - /* 2220 */ 576, 1449, 1449, 1449, 1449, 1449, 1787, 1449, 1449, 1449, - /* 2230 */ 1449, 1449, 1449, 1449, 577, 1449, 1449, 1449, 1449, 1739, - /* 2240 */ 1449, 576, 1449, 1449, 1449, 1800, 1449, 1449, 1449, 308, - /* 2250 */ 1770, 579, 1772, 1773, 575, 1449, 570, 1769, 1449, 1449, - /* 2260 */ 1449, 1449, 1449, 1449, 1449, 1449, 1800, 1769, 1449, 1449, - /* 2270 */ 307, 1770, 579, 1772, 1773, 575, 1449, 570, 1449, 1449, - /* 2280 */ 1449, 1449, 1449, 1769, 1449, 1787, 1449, 1449, 1449, 1449, - /* 2290 */ 1449, 1449, 1449, 577, 1449, 1787, 1449, 1449, 1739, 1449, - /* 2300 */ 576, 1449, 1449, 577, 1449, 1449, 1449, 1449, 1739, 1449, - /* 2310 */ 576, 1787, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 577, - /* 2320 */ 1449, 1449, 1449, 1449, 1739, 1800, 576, 1449, 1449, 309, - /* 2330 */ 1770, 579, 1772, 1773, 575, 1800, 570, 1449, 1449, 306, - /* 2340 */ 1770, 579, 1772, 1773, 575, 1449, 570, 1449, 1449, 1449, - /* 2350 */ 1449, 1800, 1449, 1449, 1449, 286, 1770, 579, 1772, 1773, - /* 2360 */ 575, 1449, 570, + /* 0 */ 430, 1920, 431, 1491, 438, 71, 431, 1491, 514, 62, + /* 10 */ 1645, 1693, 40, 38, 1919, 550, 323, 325, 1917, 1690, + /* 20 */ 337, 86, 1254, 1457, 34, 33, 1643, 1589, 41, 39, + /* 30 */ 37, 36, 35, 1329, 119, 1252, 1777, 41, 39, 37, + /* 40 */ 36, 35, 1585, 122, 103, 1734, 550, 102, 101, 100, + /* 50 */ 99, 98, 97, 96, 95, 94, 1324, 526, 550, 23, + /* 60 */ 14, 1016, 342, 1015, 1795, 1638, 1640, 1260, 113, 142, + /* 70 */ 1795, 1468, 578, 79, 122, 468, 466, 1747, 543, 577, + /* 80 */ 40, 38, 1392, 120, 1, 1593, 122, 61, 337, 61, + /* 90 */ 1254, 1017, 358, 555, 1586, 555, 379, 552, 155, 1862, + /* 100 */ 1863, 1329, 1867, 1252, 1808, 1479, 659, 1521, 89, 1778, + /* 110 */ 580, 1780, 1781, 576, 120, 571, 542, 553, 1854, 553, + /* 120 */ 1331, 1332, 304, 1850, 1324, 1478, 120, 526, 14, 249, + /* 130 */ 1862, 549, 1456, 548, 1920, 1260, 1920, 1920, 164, 31, + /* 140 */ 259, 156, 1862, 1863, 1777, 1867, 1747, 161, 447, 161, + /* 150 */ 159, 1917, 2, 1917, 1917, 1593, 112, 111, 110, 109, + /* 160 */ 108, 107, 106, 105, 104, 1255, 1747, 1253, 1279, 483, + /* 170 */ 482, 481, 1795, 1920, 659, 480, 220, 221, 118, 477, + /* 180 */ 578, 44, 476, 475, 474, 1747, 160, 577, 1331, 1332, + /* 190 */ 1917, 429, 1258, 1259, 433, 1307, 1308, 1310, 1311, 1312, + /* 200 */ 1313, 1314, 573, 569, 1322, 1323, 1325, 1326, 1327, 1328, + /* 210 */ 1330, 1333, 1808, 1413, 1278, 539, 90, 1778, 580, 1780, + /* 220 */ 1781, 576, 1279, 571, 162, 1454, 1854, 162, 553, 162, + /* 230 */ 330, 1850, 1933, 1255, 314, 1253, 61, 303, 140, 143, + /* 240 */ 516, 1888, 999, 1549, 34, 33, 1645, 1596, 41, 39, + /* 250 */ 37, 36, 35, 341, 536, 1411, 1412, 1414, 1415, 1477, + /* 260 */ 1258, 1259, 1643, 1307, 1308, 1310, 1311, 1312, 1313, 1314, + /* 270 */ 573, 569, 1322, 1323, 1325, 1326, 1327, 1328, 1330, 1333, + /* 280 */ 40, 38, 1003, 1004, 315, 349, 313, 312, 337, 470, + /* 290 */ 1254, 1777, 43, 472, 545, 540, 305, 1353, 11, 10, + /* 300 */ 1747, 1329, 103, 1252, 153, 102, 101, 100, 99, 98, + /* 310 */ 97, 96, 95, 94, 385, 471, 378, 1632, 377, 1795, + /* 320 */ 1358, 1292, 1151, 1152, 1324, 1278, 1920, 554, 14, 1351, + /* 330 */ 1639, 1640, 1747, 437, 577, 1260, 433, 40, 38, 159, + /* 340 */ 483, 482, 481, 1917, 1920, 337, 480, 1254, 1518, 118, + /* 350 */ 477, 301, 2, 476, 475, 474, 605, 1918, 1329, 1808, + /* 360 */ 1252, 1917, 28, 90, 1778, 580, 1780, 1781, 576, 435, + /* 370 */ 571, 71, 370, 1854, 659, 1276, 162, 330, 1850, 154, + /* 380 */ 1396, 1324, 1365, 1352, 117, 1016, 1278, 1015, 1331, 1332, + /* 390 */ 1309, 158, 1260, 1588, 372, 368, 544, 34, 33, 1880, + /* 400 */ 1571, 41, 39, 37, 36, 35, 1357, 479, 478, 8, + /* 410 */ 636, 635, 634, 633, 345, 1017, 632, 631, 630, 123, + /* 420 */ 625, 624, 623, 622, 621, 620, 619, 618, 133, 614, + /* 430 */ 324, 659, 162, 1255, 562, 1253, 34, 33, 140, 613, + /* 440 */ 41, 39, 37, 36, 35, 1331, 1332, 1595, 30, 335, + /* 450 */ 1346, 1347, 1348, 1349, 1350, 1354, 1355, 1356, 1280, 447, + /* 460 */ 1258, 1259, 1476, 1307, 1308, 1310, 1311, 1312, 1313, 1314, + /* 470 */ 573, 569, 1322, 1323, 1325, 1326, 1327, 1328, 1330, 1333, + /* 480 */ 34, 33, 214, 526, 41, 39, 37, 36, 35, 170, + /* 490 */ 1255, 207, 1253, 219, 165, 1281, 340, 37, 36, 35, + /* 500 */ 59, 34, 33, 1747, 140, 41, 39, 37, 36, 35, + /* 510 */ 61, 1593, 75, 1595, 629, 627, 69, 1258, 1259, 68, + /* 520 */ 1307, 1308, 1310, 1311, 1312, 1313, 1314, 573, 569, 1322, + /* 530 */ 1323, 1325, 1326, 1327, 1328, 1330, 1333, 40, 38, 1334, + /* 540 */ 1689, 139, 298, 1475, 343, 337, 1777, 1254, 1277, 162, + /* 550 */ 73, 303, 140, 305, 516, 1234, 1235, 1423, 1329, 418, + /* 560 */ 1252, 1595, 1309, 1109, 602, 601, 600, 1113, 599, 1115, + /* 570 */ 1116, 598, 1118, 595, 1795, 1124, 592, 1126, 1127, 589, + /* 580 */ 586, 1324, 578, 488, 1747, 1449, 1351, 1747, 526, 577, + /* 590 */ 251, 472, 1260, 1474, 40, 38, 1683, 1254, 498, 383, + /* 600 */ 45, 4, 337, 555, 1254, 174, 173, 172, 1260, 9, + /* 610 */ 1252, 1071, 206, 471, 1808, 1329, 1593, 1252, 89, 1778, + /* 620 */ 580, 1780, 1781, 576, 497, 571, 491, 231, 1854, 1473, + /* 630 */ 485, 659, 304, 1850, 1747, 205, 563, 495, 1324, 493, + /* 640 */ 1352, 27, 1260, 1073, 1920, 1331, 1332, 34, 33, 1260, + /* 650 */ 162, 41, 39, 37, 36, 35, 1569, 159, 1869, 1472, + /* 660 */ 1471, 1917, 56, 1357, 611, 55, 9, 1869, 559, 526, + /* 670 */ 1747, 34, 33, 1645, 1448, 41, 39, 37, 36, 35, + /* 680 */ 384, 659, 1866, 131, 130, 608, 607, 606, 659, 1644, + /* 690 */ 1255, 1865, 1253, 1003, 1004, 1869, 513, 1593, 1470, 7, + /* 700 */ 1747, 1747, 1331, 1332, 1570, 30, 335, 1346, 1347, 1348, + /* 710 */ 1349, 1350, 1354, 1355, 1356, 613, 1582, 1258, 1259, 1864, + /* 720 */ 1307, 1308, 1310, 1311, 1312, 1313, 1314, 573, 569, 1322, + /* 730 */ 1323, 1325, 1326, 1327, 1328, 1330, 1333, 1920, 557, 1747, + /* 740 */ 1255, 1688, 1253, 298, 617, 29, 1565, 1255, 1403, 1253, + /* 750 */ 159, 34, 33, 514, 1917, 41, 39, 37, 36, 35, + /* 760 */ 347, 1874, 1385, 1263, 1691, 34, 33, 1258, 1259, 41, + /* 770 */ 39, 37, 36, 35, 1258, 1259, 213, 1307, 1308, 1310, + /* 780 */ 1311, 1312, 1313, 1314, 573, 569, 1322, 1323, 1325, 1326, + /* 790 */ 1327, 1328, 1330, 1333, 40, 38, 300, 1578, 1276, 1467, + /* 800 */ 611, 1920, 337, 1777, 1254, 411, 74, 609, 423, 1466, + /* 810 */ 1636, 1508, 1389, 526, 159, 1329, 499, 1252, 1917, 131, + /* 820 */ 130, 608, 607, 606, 388, 396, 1465, 424, 1464, 398, + /* 830 */ 1339, 1795, 610, 484, 271, 1636, 1278, 1623, 1324, 578, + /* 840 */ 1747, 1593, 1292, 1568, 1747, 526, 577, 34, 33, 1260, + /* 850 */ 1747, 41, 39, 37, 36, 35, 113, 1920, 550, 52, + /* 860 */ 510, 389, 198, 473, 1262, 196, 2, 1747, 560, 1747, + /* 870 */ 159, 1808, 616, 1593, 1917, 90, 1778, 580, 1780, 1781, + /* 880 */ 576, 1463, 571, 1385, 1462, 1854, 122, 1461, 659, 330, + /* 890 */ 1850, 1933, 1460, 1459, 200, 1266, 1497, 199, 567, 1580, + /* 900 */ 1911, 422, 1331, 1332, 417, 416, 415, 414, 413, 410, + /* 910 */ 409, 408, 407, 406, 402, 401, 400, 399, 393, 392, + /* 920 */ 391, 390, 1747, 387, 386, 1747, 120, 526, 1747, 526, + /* 930 */ 628, 141, 1576, 1747, 1747, 526, 277, 526, 403, 611, + /* 940 */ 404, 157, 1862, 1863, 654, 1867, 446, 1255, 1590, 1253, + /* 950 */ 275, 58, 11, 10, 57, 1593, 506, 1593, 131, 130, + /* 960 */ 608, 607, 606, 1593, 210, 1593, 1777, 1451, 1452, 572, + /* 970 */ 176, 426, 373, 42, 1258, 1259, 550, 1307, 1308, 1310, + /* 980 */ 1311, 1312, 1313, 1314, 573, 569, 1322, 1323, 1325, 1326, + /* 990 */ 1327, 1328, 1330, 1333, 1795, 526, 1265, 61, 202, 526, + /* 1000 */ 526, 201, 554, 526, 122, 204, 1722, 1747, 203, 577, + /* 1010 */ 507, 511, 1309, 1584, 524, 1202, 218, 1469, 1764, 604, + /* 1020 */ 1550, 526, 254, 1593, 1761, 555, 465, 1593, 1593, 1761, + /* 1030 */ 1343, 1593, 525, 1388, 1808, 88, 526, 1777, 90, 1778, + /* 1040 */ 580, 1780, 1781, 576, 120, 571, 1503, 260, 1854, 1593, + /* 1050 */ 1757, 1763, 330, 1850, 154, 1757, 1763, 326, 222, 249, + /* 1060 */ 1862, 549, 571, 548, 1593, 1795, 1920, 571, 486, 1501, + /* 1070 */ 66, 65, 382, 578, 1881, 169, 537, 243, 1747, 159, + /* 1080 */ 577, 376, 1767, 1917, 125, 328, 327, 526, 128, 1042, + /* 1090 */ 129, 489, 1796, 50, 299, 1268, 235, 366, 344, 364, + /* 1100 */ 360, 356, 166, 351, 348, 1808, 1329, 1765, 1261, 90, + /* 1110 */ 1778, 580, 1780, 1781, 576, 1593, 571, 42, 1761, 1854, + /* 1120 */ 1769, 1043, 42, 330, 1850, 1933, 519, 346, 42, 1324, + /* 1130 */ 228, 584, 1102, 1777, 1873, 1410, 85, 162, 238, 128, + /* 1140 */ 1260, 129, 114, 128, 1757, 1763, 82, 500, 1492, 1633, + /* 1150 */ 551, 1884, 253, 256, 258, 248, 571, 3, 53, 1359, + /* 1160 */ 80, 1795, 5, 350, 1315, 1276, 353, 357, 310, 578, + /* 1170 */ 270, 1071, 1218, 1130, 1747, 311, 577, 405, 267, 535, + /* 1180 */ 1685, 1134, 171, 1141, 1139, 132, 412, 420, 419, 421, + /* 1190 */ 555, 425, 427, 1282, 1777, 1285, 1284, 428, 436, 439, + /* 1200 */ 179, 1808, 440, 181, 441, 284, 1778, 580, 1780, 1781, + /* 1210 */ 576, 1286, 571, 442, 184, 186, 444, 1283, 188, 70, + /* 1220 */ 445, 448, 1795, 191, 467, 469, 1583, 195, 1579, 197, + /* 1230 */ 578, 1920, 134, 135, 93, 1747, 302, 577, 1269, 268, + /* 1240 */ 1264, 208, 1581, 1577, 161, 136, 137, 1777, 1917, 211, + /* 1250 */ 1727, 555, 502, 501, 508, 505, 512, 534, 1281, 215, + /* 1260 */ 515, 1726, 1808, 520, 1695, 1272, 284, 1778, 580, 1780, + /* 1270 */ 1781, 576, 320, 571, 517, 1795, 569, 1322, 1323, 1325, + /* 1280 */ 1326, 1327, 1328, 578, 126, 322, 521, 127, 1747, 224, + /* 1290 */ 577, 522, 1920, 269, 226, 78, 1594, 530, 1885, 1777, + /* 1300 */ 538, 6, 233, 532, 533, 159, 237, 547, 329, 1917, + /* 1310 */ 531, 541, 1385, 528, 1895, 1808, 529, 247, 121, 91, + /* 1320 */ 1778, 580, 1780, 1781, 576, 1894, 571, 1795, 244, 1854, + /* 1330 */ 246, 1876, 148, 1853, 1850, 578, 1280, 564, 1870, 561, + /* 1340 */ 1747, 331, 577, 242, 19, 245, 1835, 582, 272, 1637, + /* 1350 */ 1566, 252, 1777, 655, 1916, 51, 147, 263, 1741, 558, + /* 1360 */ 1936, 656, 658, 285, 63, 255, 1777, 1808, 276, 565, + /* 1370 */ 257, 91, 1778, 580, 1780, 1781, 576, 1740, 571, 274, + /* 1380 */ 1795, 1854, 1739, 295, 294, 566, 1850, 64, 575, 1738, + /* 1390 */ 352, 1735, 354, 1747, 1795, 577, 355, 1246, 1247, 167, + /* 1400 */ 359, 1733, 578, 361, 362, 363, 1732, 1747, 365, 577, + /* 1410 */ 1731, 1730, 369, 367, 1729, 371, 1712, 168, 374, 1777, + /* 1420 */ 1808, 375, 1221, 1220, 292, 1778, 580, 1780, 1781, 576, + /* 1430 */ 574, 571, 568, 1826, 1808, 1706, 1705, 1777, 144, 1778, + /* 1440 */ 580, 1780, 1781, 576, 380, 571, 381, 1795, 1704, 1703, + /* 1450 */ 1190, 1678, 1677, 1676, 67, 578, 1675, 1674, 1673, 1672, + /* 1460 */ 1747, 1671, 577, 394, 395, 1795, 1670, 397, 1669, 1668, + /* 1470 */ 321, 1667, 1666, 578, 1665, 1664, 1663, 1662, 1747, 1661, + /* 1480 */ 577, 1660, 556, 1934, 1659, 1658, 1657, 1808, 1656, 1777, + /* 1490 */ 1655, 91, 1778, 580, 1780, 1781, 576, 124, 571, 1654, + /* 1500 */ 1653, 1854, 1652, 1651, 1650, 1808, 1851, 1649, 1648, 293, + /* 1510 */ 1778, 580, 1780, 1781, 576, 1192, 571, 1795, 1647, 1646, + /* 1520 */ 1522, 175, 527, 1520, 1488, 578, 152, 1006, 115, 177, + /* 1530 */ 1747, 1777, 577, 1487, 178, 1005, 116, 432, 434, 1720, + /* 1540 */ 1714, 1777, 1702, 185, 183, 1701, 1687, 1572, 1519, 1517, + /* 1550 */ 449, 451, 1515, 455, 1513, 459, 1035, 1808, 450, 1795, + /* 1560 */ 453, 293, 1778, 580, 1780, 1781, 576, 578, 571, 1795, + /* 1570 */ 457, 1511, 1747, 454, 577, 458, 461, 578, 462, 1500, + /* 1580 */ 1499, 1484, 1747, 463, 577, 1574, 1145, 1144, 1573, 194, + /* 1590 */ 1070, 1777, 1069, 1068, 49, 1067, 626, 1509, 1064, 1808, + /* 1600 */ 316, 1063, 628, 288, 1778, 580, 1780, 1781, 576, 1808, + /* 1610 */ 571, 662, 1062, 144, 1778, 580, 1780, 1781, 576, 1795, + /* 1620 */ 571, 1061, 1504, 317, 334, 266, 490, 578, 1502, 318, + /* 1630 */ 1483, 487, 1747, 1777, 577, 492, 1482, 494, 1481, 151, + /* 1640 */ 496, 546, 1719, 92, 652, 648, 644, 640, 264, 1713, + /* 1650 */ 1228, 1777, 1700, 138, 503, 1698, 1699, 1697, 1935, 1808, + /* 1660 */ 1696, 1795, 54, 293, 1778, 580, 1780, 1781, 576, 575, + /* 1670 */ 571, 212, 217, 15, 1747, 87, 577, 1694, 229, 1795, + /* 1680 */ 223, 504, 319, 76, 336, 225, 509, 578, 518, 1238, + /* 1690 */ 1686, 227, 1747, 77, 577, 16, 230, 82, 1425, 1437, + /* 1700 */ 24, 1808, 42, 1777, 232, 292, 1778, 580, 1780, 1781, + /* 1710 */ 576, 523, 571, 236, 1827, 1270, 234, 48, 1407, 1808, + /* 1720 */ 1409, 145, 240, 293, 1778, 580, 1780, 1781, 576, 239, + /* 1730 */ 571, 1795, 25, 241, 1767, 193, 338, 26, 1402, 578, + /* 1740 */ 47, 250, 81, 216, 1747, 17, 577, 1382, 1381, 146, + /* 1750 */ 1766, 149, 1442, 1777, 464, 460, 456, 452, 192, 46, + /* 1760 */ 18, 1431, 13, 1777, 1226, 1436, 209, 332, 1441, 1440, + /* 1770 */ 333, 1808, 10, 1811, 20, 293, 1778, 580, 1780, 1781, + /* 1780 */ 576, 1795, 571, 1319, 570, 72, 1344, 32, 190, 578, + /* 1790 */ 150, 1795, 1317, 1316, 1747, 12, 577, 21, 163, 578, + /* 1800 */ 1300, 581, 579, 22, 1747, 1131, 577, 583, 339, 585, + /* 1810 */ 587, 1128, 588, 1108, 1125, 590, 593, 596, 1123, 1777, + /* 1820 */ 591, 1808, 1122, 1119, 594, 278, 1778, 580, 1780, 1781, + /* 1830 */ 576, 1808, 571, 1117, 597, 279, 1778, 580, 1780, 1781, + /* 1840 */ 576, 603, 571, 83, 84, 1140, 60, 1795, 261, 1121, + /* 1850 */ 189, 182, 1136, 187, 1120, 578, 1033, 443, 612, 1058, + /* 1860 */ 1747, 1777, 577, 1077, 262, 615, 1051, 1056, 1055, 1054, + /* 1870 */ 1053, 1777, 1052, 1050, 1049, 1074, 180, 1072, 1046, 1516, + /* 1880 */ 1045, 1044, 1041, 1777, 1040, 1039, 1038, 1808, 637, 1795, + /* 1890 */ 1514, 280, 1778, 580, 1780, 1781, 576, 578, 571, 1795, + /* 1900 */ 639, 638, 1747, 641, 577, 642, 643, 578, 1512, 645, + /* 1910 */ 646, 1795, 1747, 1510, 577, 647, 649, 650, 1498, 578, + /* 1920 */ 653, 651, 996, 1480, 1747, 1777, 577, 265, 657, 1808, + /* 1930 */ 1455, 1256, 273, 287, 1778, 580, 1780, 1781, 576, 1808, + /* 1940 */ 571, 660, 1777, 289, 1778, 580, 1780, 1781, 576, 661, + /* 1950 */ 571, 1808, 1455, 1795, 1455, 281, 1778, 580, 1780, 1781, + /* 1960 */ 576, 578, 571, 1455, 1455, 1455, 1747, 1455, 577, 1455, + /* 1970 */ 1795, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 578, 1455, + /* 1980 */ 1455, 1455, 1455, 1747, 1777, 577, 1455, 1455, 1455, 1455, + /* 1990 */ 1455, 1455, 1455, 1808, 1777, 1455, 1455, 290, 1778, 580, + /* 2000 */ 1780, 1781, 576, 1455, 571, 1455, 1455, 1455, 1455, 1455, + /* 2010 */ 1808, 1455, 1795, 1455, 282, 1778, 580, 1780, 1781, 576, + /* 2020 */ 578, 571, 1795, 1455, 1455, 1747, 1455, 577, 1455, 1455, + /* 2030 */ 578, 1455, 1455, 1455, 1455, 1747, 1777, 577, 1455, 1455, + /* 2040 */ 1455, 1455, 1455, 1455, 1455, 1455, 1777, 1455, 1455, 1455, + /* 2050 */ 1455, 1455, 1808, 1455, 1455, 1455, 291, 1778, 580, 1780, + /* 2060 */ 1781, 576, 1808, 571, 1795, 1455, 283, 1778, 580, 1780, + /* 2070 */ 1781, 576, 578, 571, 1795, 1455, 1455, 1747, 1455, 577, + /* 2080 */ 1455, 1455, 578, 1455, 1455, 1455, 1455, 1747, 1777, 577, + /* 2090 */ 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1777, 1455, + /* 2100 */ 1455, 1455, 1455, 1455, 1808, 1455, 1455, 1455, 296, 1778, + /* 2110 */ 580, 1780, 1781, 576, 1808, 571, 1795, 1455, 297, 1778, + /* 2120 */ 580, 1780, 1781, 576, 578, 571, 1795, 1455, 1455, 1747, + /* 2130 */ 1455, 577, 1455, 1455, 578, 1455, 1455, 1455, 1455, 1747, + /* 2140 */ 1455, 577, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, + /* 2150 */ 1777, 1455, 1455, 1455, 1455, 1455, 1808, 1455, 1455, 1455, + /* 2160 */ 1789, 1778, 580, 1780, 1781, 576, 1808, 571, 1455, 1777, + /* 2170 */ 1788, 1778, 580, 1780, 1781, 576, 1455, 571, 1795, 1455, + /* 2180 */ 1455, 1455, 1455, 1455, 1455, 1455, 578, 1455, 1455, 1455, + /* 2190 */ 1455, 1747, 1777, 577, 1455, 1455, 1455, 1795, 1455, 1455, + /* 2200 */ 1455, 1455, 1455, 1455, 1455, 578, 1455, 1455, 1455, 1455, + /* 2210 */ 1747, 1777, 577, 1455, 1455, 1455, 1455, 1455, 1808, 1455, + /* 2220 */ 1795, 1455, 1787, 1778, 580, 1780, 1781, 576, 578, 571, + /* 2230 */ 1455, 1455, 1455, 1747, 1455, 577, 1455, 1808, 1455, 1795, + /* 2240 */ 1455, 308, 1778, 580, 1780, 1781, 576, 578, 571, 1455, + /* 2250 */ 1455, 1455, 1747, 1455, 577, 1455, 1455, 1455, 1455, 1455, + /* 2260 */ 1808, 1455, 1455, 1455, 307, 1778, 580, 1780, 1781, 576, + /* 2270 */ 1777, 571, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1808, + /* 2280 */ 1777, 1455, 1455, 309, 1778, 580, 1780, 1781, 576, 1455, + /* 2290 */ 571, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1795, 1455, + /* 2300 */ 1455, 1455, 1455, 1455, 1455, 1455, 578, 1455, 1795, 1455, + /* 2310 */ 1455, 1747, 1455, 577, 1455, 1455, 578, 1455, 1455, 1455, + /* 2320 */ 1455, 1747, 1455, 577, 1455, 1455, 1455, 1455, 1455, 1455, + /* 2330 */ 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1808, 1455, + /* 2340 */ 1455, 1455, 306, 1778, 580, 1780, 1781, 576, 1808, 571, + /* 2350 */ 1455, 1455, 286, 1778, 580, 1780, 1781, 576, 1455, 571, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 260, 264, 262, 263, 260, 0, 262, 263, 286, 264, - /* 10 */ 8, 9, 12, 13, 12, 13, 14, 15, 16, 297, - /* 20 */ 20, 268, 22, 0, 313, 286, 14, 295, 20, 292, - /* 30 */ 298, 299, 20, 33, 281, 35, 297, 292, 12, 13, - /* 40 */ 14, 15, 16, 290, 21, 323, 324, 24, 25, 26, - /* 50 */ 27, 28, 29, 30, 31, 32, 56, 335, 313, 354, - /* 60 */ 60, 253, 323, 324, 325, 354, 66, 256, 4, 332, - /* 70 */ 264, 20, 367, 22, 335, 59, 371, 332, 367, 12, - /* 80 */ 13, 14, 371, 83, 347, 348, 349, 20, 351, 22, - /* 90 */ 20, 83, 347, 348, 349, 284, 351, 4, 299, 354, - /* 100 */ 33, 50, 35, 292, 256, 105, 307, 301, 297, 310, - /* 110 */ 299, 255, 367, 257, 83, 354, 371, 62, 63, 119, - /* 120 */ 120, 313, 67, 56, 313, 70, 71, 60, 367, 74, - /* 130 */ 75, 76, 371, 66, 309, 324, 311, 44, 45, 328, - /* 140 */ 329, 330, 331, 332, 333, 297, 335, 83, 95, 338, - /* 150 */ 83, 8, 9, 342, 343, 12, 13, 14, 15, 16, - /* 160 */ 114, 115, 354, 354, 164, 354, 166, 114, 115, 116, - /* 170 */ 117, 118, 105, 0, 20, 367, 367, 284, 367, 371, - /* 180 */ 371, 269, 371, 77, 291, 273, 119, 120, 0, 119, - /* 190 */ 120, 191, 192, 300, 194, 195, 196, 197, 198, 199, + /* 0 */ 261, 355, 263, 264, 261, 269, 263, 264, 300, 4, + /* 10 */ 285, 0, 12, 13, 368, 265, 308, 292, 372, 311, + /* 20 */ 20, 267, 22, 0, 8, 9, 301, 291, 12, 13, + /* 30 */ 14, 15, 16, 33, 280, 35, 257, 12, 13, 14, + /* 40 */ 15, 16, 288, 293, 21, 0, 265, 24, 25, 26, + /* 50 */ 27, 28, 29, 30, 31, 32, 56, 265, 265, 43, + /* 60 */ 60, 20, 296, 22, 285, 299, 300, 67, 276, 256, + /* 70 */ 285, 258, 293, 267, 293, 283, 35, 298, 293, 300, + /* 80 */ 12, 13, 14, 333, 84, 293, 293, 84, 20, 84, + /* 90 */ 22, 50, 47, 314, 288, 314, 314, 347, 348, 349, + /* 100 */ 350, 33, 352, 35, 325, 257, 106, 0, 329, 330, + /* 110 */ 331, 332, 333, 334, 333, 336, 331, 20, 339, 20, + /* 120 */ 120, 121, 343, 344, 56, 257, 333, 265, 60, 348, + /* 130 */ 349, 350, 0, 352, 355, 67, 355, 355, 276, 340, + /* 140 */ 341, 348, 349, 350, 257, 352, 298, 368, 59, 368, + /* 150 */ 368, 372, 84, 372, 372, 293, 24, 25, 26, 27, + /* 160 */ 28, 29, 30, 31, 32, 165, 298, 167, 20, 62, + /* 170 */ 63, 64, 285, 355, 106, 68, 115, 116, 71, 72, + /* 180 */ 293, 84, 75, 76, 77, 298, 368, 300, 120, 121, + /* 190 */ 372, 262, 192, 193, 265, 195, 196, 197, 198, 199, /* 200 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - /* 210 */ 210, 83, 24, 25, 26, 27, 28, 29, 30, 31, - /* 220 */ 32, 175, 43, 223, 178, 339, 340, 84, 56, 123, - /* 230 */ 124, 164, 114, 166, 268, 62, 63, 64, 65, 191, - /* 240 */ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - /* 250 */ 77, 78, 79, 80, 223, 83, 290, 85, 191, 192, - /* 260 */ 20, 194, 195, 196, 197, 198, 199, 200, 201, 202, - /* 270 */ 203, 204, 205, 206, 207, 208, 209, 210, 12, 13, - /* 280 */ 232, 233, 234, 235, 236, 264, 20, 223, 22, 43, - /* 290 */ 313, 163, 313, 165, 176, 177, 298, 299, 159, 33, - /* 300 */ 0, 35, 96, 97, 98, 99, 100, 101, 102, 103, - /* 310 */ 104, 105, 106, 292, 108, 109, 110, 111, 112, 113, - /* 320 */ 181, 182, 56, 313, 270, 271, 60, 264, 0, 264, - /* 330 */ 84, 354, 66, 354, 313, 12, 13, 256, 275, 22, - /* 340 */ 275, 266, 20, 20, 367, 22, 367, 282, 371, 83, - /* 350 */ 371, 223, 35, 332, 279, 292, 33, 292, 35, 59, - /* 360 */ 20, 20, 287, 22, 354, 284, 115, 256, 347, 348, - /* 370 */ 349, 105, 351, 292, 284, 354, 35, 367, 297, 56, - /* 380 */ 299, 371, 292, 66, 20, 119, 120, 59, 367, 66, - /* 390 */ 256, 50, 371, 21, 313, 223, 24, 25, 26, 27, - /* 400 */ 28, 29, 30, 31, 32, 324, 83, 286, 297, 328, - /* 410 */ 329, 330, 331, 332, 333, 35, 335, 149, 297, 338, - /* 420 */ 330, 242, 105, 342, 343, 174, 175, 59, 105, 178, - /* 430 */ 164, 297, 166, 8, 9, 354, 21, 12, 13, 14, - /* 440 */ 15, 16, 119, 120, 323, 324, 66, 83, 367, 34, - /* 450 */ 256, 36, 371, 14, 20, 35, 335, 191, 192, 20, - /* 460 */ 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - /* 470 */ 204, 205, 206, 207, 208, 209, 210, 1, 2, 264, - /* 480 */ 0, 164, 264, 166, 264, 264, 66, 164, 283, 166, - /* 490 */ 266, 297, 326, 275, 0, 275, 228, 229, 8, 9, - /* 500 */ 37, 296, 12, 13, 14, 15, 16, 292, 191, 192, - /* 510 */ 292, 287, 292, 292, 191, 192, 350, 194, 195, 196, - /* 520 */ 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - /* 530 */ 207, 208, 209, 210, 12, 13, 14, 264, 14, 15, - /* 540 */ 16, 47, 20, 256, 22, 264, 223, 332, 275, 86, - /* 550 */ 60, 88, 89, 332, 91, 33, 275, 35, 95, 276, - /* 560 */ 84, 346, 347, 348, 349, 292, 351, 284, 347, 348, - /* 570 */ 349, 284, 351, 292, 84, 95, 293, 20, 56, 292, - /* 580 */ 117, 156, 92, 14, 297, 151, 299, 223, 66, 20, - /* 590 */ 83, 12, 13, 0, 114, 115, 116, 117, 118, 20, - /* 600 */ 93, 22, 8, 9, 326, 83, 12, 13, 14, 15, - /* 610 */ 16, 324, 33, 60, 35, 328, 329, 330, 331, 332, - /* 620 */ 333, 264, 335, 261, 56, 338, 264, 105, 350, 342, - /* 630 */ 343, 344, 275, 264, 195, 56, 146, 43, 309, 282, - /* 640 */ 311, 119, 120, 356, 275, 66, 264, 292, 256, 292, - /* 650 */ 82, 364, 66, 85, 264, 62, 63, 275, 303, 169, - /* 660 */ 67, 292, 83, 70, 71, 275, 20, 74, 75, 76, - /* 670 */ 245, 8, 9, 276, 292, 12, 13, 14, 15, 16, - /* 680 */ 284, 284, 292, 264, 105, 94, 164, 291, 166, 297, - /* 690 */ 293, 66, 256, 272, 275, 274, 300, 4, 119, 120, - /* 700 */ 0, 211, 212, 213, 214, 215, 216, 217, 218, 219, - /* 710 */ 220, 292, 261, 191, 192, 264, 194, 195, 196, 197, - /* 720 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - /* 730 */ 208, 209, 210, 297, 8, 9, 270, 271, 12, 13, - /* 740 */ 14, 15, 16, 164, 191, 166, 2, 84, 294, 44, - /* 750 */ 45, 297, 8, 9, 284, 2, 12, 13, 14, 15, - /* 760 */ 16, 8, 9, 293, 195, 12, 13, 14, 15, 16, - /* 770 */ 191, 192, 3, 194, 195, 196, 197, 198, 199, 200, - /* 780 */ 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - /* 790 */ 12, 13, 18, 20, 20, 95, 19, 151, 20, 256, - /* 800 */ 22, 27, 285, 146, 30, 256, 256, 256, 264, 264, - /* 810 */ 33, 33, 256, 35, 114, 115, 116, 117, 118, 275, - /* 820 */ 275, 47, 256, 49, 47, 51, 169, 284, 39, 52, - /* 830 */ 53, 54, 55, 56, 56, 292, 292, 292, 264, 256, - /* 840 */ 297, 264, 299, 276, 66, 285, 297, 297, 297, 275, - /* 850 */ 43, 284, 275, 297, 299, 294, 82, 43, 297, 82, - /* 860 */ 293, 83, 85, 297, 326, 310, 292, 324, 211, 292, - /* 870 */ 95, 328, 329, 330, 331, 332, 333, 151, 335, 256, - /* 880 */ 297, 338, 256, 105, 256, 342, 343, 277, 350, 256, - /* 890 */ 280, 84, 117, 221, 222, 118, 122, 119, 120, 125, - /* 900 */ 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - /* 910 */ 136, 137, 138, 139, 140, 141, 142, 224, 144, 145, - /* 920 */ 297, 256, 256, 297, 284, 297, 18, 150, 8, 9, - /* 930 */ 297, 23, 12, 13, 14, 15, 16, 42, 43, 0, - /* 940 */ 300, 285, 164, 264, 166, 37, 38, 285, 171, 41, - /* 950 */ 173, 8, 9, 256, 275, 12, 13, 14, 15, 16, - /* 960 */ 285, 22, 297, 297, 256, 57, 58, 0, 195, 191, - /* 970 */ 192, 292, 194, 195, 196, 197, 198, 199, 200, 201, - /* 980 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 22, - /* 990 */ 87, 83, 284, 90, 297, 264, 87, 264, 87, 90, - /* 1000 */ 292, 90, 0, 60, 84, 297, 275, 299, 275, 240, - /* 1010 */ 87, 222, 43, 90, 43, 56, 151, 152, 43, 43, - /* 1020 */ 46, 43, 35, 292, 22, 292, 43, 1, 2, 121, - /* 1030 */ 285, 285, 324, 35, 317, 92, 328, 329, 330, 331, - /* 1040 */ 332, 333, 256, 335, 85, 257, 338, 119, 120, 43, - /* 1050 */ 342, 343, 344, 84, 273, 84, 374, 83, 244, 84, - /* 1060 */ 84, 43, 84, 43, 156, 157, 158, 84, 43, 161, - /* 1070 */ 284, 365, 364, 265, 320, 167, 361, 284, 292, 43, - /* 1080 */ 265, 43, 43, 297, 0, 299, 43, 263, 180, 146, - /* 1090 */ 84, 183, 296, 185, 186, 187, 188, 189, 190, 327, - /* 1100 */ 352, 345, 84, 368, 84, 368, 368, 355, 288, 84, - /* 1110 */ 324, 83, 169, 225, 328, 329, 330, 331, 332, 333, - /* 1120 */ 84, 335, 84, 84, 338, 12, 13, 84, 342, 343, - /* 1130 */ 344, 223, 48, 322, 20, 22, 264, 47, 321, 353, - /* 1140 */ 256, 35, 162, 270, 315, 264, 33, 264, 35, 42, - /* 1150 */ 304, 33, 302, 166, 211, 212, 213, 214, 215, 216, - /* 1160 */ 217, 218, 219, 220, 166, 47, 256, 146, 284, 56, - /* 1170 */ 52, 53, 54, 55, 56, 20, 292, 4, 302, 66, - /* 1180 */ 264, 297, 264, 299, 258, 258, 20, 319, 299, 268, - /* 1190 */ 268, 20, 19, 314, 284, 20, 20, 312, 268, 312, - /* 1200 */ 82, 268, 292, 85, 305, 268, 33, 297, 324, 299, - /* 1210 */ 268, 264, 328, 329, 330, 331, 332, 333, 105, 335, - /* 1220 */ 47, 268, 338, 258, 51, 284, 342, 343, 344, 56, - /* 1230 */ 284, 297, 284, 256, 324, 284, 284, 353, 328, 329, - /* 1240 */ 330, 331, 332, 333, 284, 335, 284, 284, 338, 264, - /* 1250 */ 284, 258, 342, 343, 344, 82, 284, 284, 85, 319, - /* 1260 */ 266, 284, 318, 353, 172, 147, 148, 299, 150, 292, - /* 1270 */ 266, 264, 154, 264, 297, 230, 299, 164, 266, 166, - /* 1280 */ 148, 297, 312, 297, 292, 297, 256, 308, 297, 308, - /* 1290 */ 313, 173, 297, 266, 280, 306, 256, 266, 20, 231, - /* 1300 */ 292, 324, 305, 237, 191, 328, 329, 330, 331, 332, - /* 1310 */ 333, 308, 335, 297, 284, 202, 203, 204, 205, 206, - /* 1320 */ 207, 208, 292, 327, 284, 308, 297, 297, 239, 299, - /* 1330 */ 297, 354, 292, 155, 297, 238, 226, 297, 297, 299, - /* 1340 */ 292, 222, 360, 313, 367, 322, 20, 243, 371, 241, - /* 1350 */ 360, 256, 83, 288, 324, 246, 297, 358, 328, 329, - /* 1360 */ 330, 331, 332, 333, 324, 335, 264, 256, 328, 329, - /* 1370 */ 330, 331, 332, 333, 363, 335, 357, 362, 338, 284, - /* 1380 */ 326, 359, 342, 343, 354, 375, 274, 292, 341, 266, - /* 1390 */ 36, 258, 297, 369, 299, 284, 259, 367, 316, 311, - /* 1400 */ 278, 371, 360, 292, 370, 370, 278, 278, 297, 267, - /* 1410 */ 299, 254, 0, 369, 174, 0, 370, 256, 369, 324, - /* 1420 */ 0, 0, 42, 328, 329, 330, 331, 332, 333, 334, - /* 1430 */ 335, 336, 337, 256, 74, 324, 0, 184, 35, 328, - /* 1440 */ 329, 330, 331, 332, 333, 284, 335, 184, 35, 35, - /* 1450 */ 0, 35, 35, 292, 35, 184, 0, 184, 297, 0, - /* 1460 */ 299, 284, 35, 0, 22, 0, 289, 35, 0, 292, - /* 1470 */ 83, 169, 168, 166, 297, 256, 299, 164, 0, 0, - /* 1480 */ 160, 159, 0, 372, 373, 324, 0, 46, 0, 328, - /* 1490 */ 329, 330, 331, 332, 333, 256, 335, 0, 0, 338, - /* 1500 */ 143, 324, 0, 284, 343, 328, 329, 330, 331, 332, - /* 1510 */ 333, 292, 335, 0, 0, 0, 297, 0, 299, 138, - /* 1520 */ 35, 0, 138, 284, 0, 0, 0, 0, 289, 0, - /* 1530 */ 0, 292, 42, 0, 0, 0, 297, 0, 299, 0, - /* 1540 */ 0, 0, 0, 324, 0, 0, 0, 328, 329, 330, - /* 1550 */ 331, 332, 333, 256, 335, 0, 0, 0, 22, 0, - /* 1560 */ 0, 0, 0, 324, 0, 256, 56, 328, 329, 330, - /* 1570 */ 331, 332, 333, 0, 335, 256, 0, 14, 0, 14, - /* 1580 */ 42, 284, 39, 0, 0, 366, 0, 0, 40, 292, - /* 1590 */ 43, 39, 155, 284, 297, 46, 299, 46, 289, 0, - /* 1600 */ 0, 292, 0, 284, 0, 39, 297, 35, 299, 39, - /* 1610 */ 0, 292, 35, 39, 47, 61, 297, 0, 299, 39, - /* 1620 */ 35, 324, 47, 0, 0, 328, 329, 330, 331, 332, - /* 1630 */ 333, 35, 335, 324, 0, 256, 47, 328, 329, 330, - /* 1640 */ 331, 332, 333, 324, 335, 47, 39, 328, 329, 330, - /* 1650 */ 331, 332, 333, 0, 335, 0, 337, 35, 256, 90, - /* 1660 */ 92, 22, 0, 284, 35, 35, 35, 35, 289, 43, - /* 1670 */ 373, 292, 35, 35, 0, 35, 297, 0, 299, 43, - /* 1680 */ 22, 22, 49, 0, 35, 22, 284, 0, 0, 35, - /* 1690 */ 0, 289, 35, 22, 292, 20, 0, 0, 170, 297, - /* 1700 */ 256, 299, 35, 324, 22, 0, 148, 328, 329, 330, - /* 1710 */ 331, 332, 333, 0, 335, 0, 0, 256, 83, 0, - /* 1720 */ 0, 93, 151, 0, 39, 84, 324, 83, 284, 179, - /* 1730 */ 328, 329, 330, 331, 332, 333, 292, 335, 46, 151, - /* 1740 */ 84, 297, 151, 299, 83, 284, 153, 43, 83, 227, - /* 1750 */ 149, 83, 147, 292, 84, 83, 46, 84, 297, 83, - /* 1760 */ 299, 22, 84, 83, 43, 84, 35, 256, 324, 83, - /* 1770 */ 43, 46, 328, 329, 330, 331, 332, 333, 83, 335, - /* 1780 */ 43, 83, 46, 84, 84, 324, 43, 46, 256, 328, - /* 1790 */ 329, 330, 331, 332, 333, 284, 335, 46, 84, 43, - /* 1800 */ 35, 84, 221, 292, 35, 35, 227, 35, 297, 256, - /* 1810 */ 299, 35, 2, 83, 43, 83, 284, 227, 191, 84, - /* 1820 */ 46, 46, 84, 83, 292, 22, 84, 94, 83, 297, - /* 1830 */ 83, 299, 83, 35, 84, 324, 193, 284, 83, 328, - /* 1840 */ 329, 330, 331, 332, 333, 292, 335, 35, 84, 35, - /* 1850 */ 297, 256, 299, 35, 35, 35, 324, 84, 22, 107, - /* 1860 */ 328, 329, 330, 331, 332, 333, 83, 335, 256, 83, - /* 1870 */ 107, 84, 83, 107, 84, 83, 95, 324, 83, 284, - /* 1880 */ 83, 328, 329, 330, 331, 332, 333, 292, 335, 107, - /* 1890 */ 35, 83, 297, 43, 299, 22, 284, 66, 61, 60, - /* 1900 */ 35, 43, 81, 35, 292, 35, 35, 35, 22, 297, - /* 1910 */ 35, 299, 35, 35, 66, 35, 35, 35, 35, 324, - /* 1920 */ 256, 47, 35, 328, 329, 330, 331, 332, 333, 35, - /* 1930 */ 335, 35, 0, 35, 39, 0, 324, 35, 47, 39, - /* 1940 */ 328, 329, 330, 331, 332, 333, 0, 335, 284, 35, - /* 1950 */ 47, 39, 0, 35, 47, 39, 292, 0, 35, 35, - /* 1960 */ 0, 297, 22, 299, 21, 376, 22, 22, 21, 20, - /* 1970 */ 376, 376, 376, 376, 256, 376, 376, 376, 376, 376, - /* 1980 */ 376, 376, 376, 376, 376, 376, 376, 376, 324, 376, - /* 1990 */ 256, 376, 328, 329, 330, 331, 332, 333, 376, 335, - /* 2000 */ 256, 376, 284, 376, 376, 376, 376, 376, 376, 376, - /* 2010 */ 292, 376, 376, 376, 376, 297, 376, 299, 284, 376, - /* 2020 */ 376, 376, 376, 376, 376, 376, 292, 376, 284, 376, - /* 2030 */ 376, 297, 376, 299, 376, 376, 292, 376, 376, 376, - /* 2040 */ 376, 297, 324, 299, 376, 376, 328, 329, 330, 331, - /* 2050 */ 332, 333, 256, 335, 376, 376, 376, 376, 324, 376, - /* 2060 */ 376, 376, 328, 329, 330, 331, 332, 333, 324, 335, - /* 2070 */ 376, 376, 328, 329, 330, 331, 332, 333, 376, 335, - /* 2080 */ 284, 376, 376, 376, 376, 376, 376, 376, 292, 376, - /* 2090 */ 376, 376, 376, 297, 256, 299, 376, 376, 376, 376, - /* 2100 */ 376, 376, 376, 376, 376, 376, 376, 376, 256, 376, - /* 2110 */ 376, 376, 376, 376, 376, 376, 376, 376, 256, 376, - /* 2120 */ 324, 376, 284, 376, 328, 329, 330, 331, 332, 333, - /* 2130 */ 292, 335, 376, 376, 376, 297, 284, 299, 376, 376, - /* 2140 */ 376, 376, 376, 376, 292, 376, 284, 376, 376, 297, - /* 2150 */ 376, 299, 376, 376, 292, 376, 376, 376, 376, 297, - /* 2160 */ 376, 299, 324, 376, 376, 376, 328, 329, 330, 331, - /* 2170 */ 332, 333, 376, 335, 376, 376, 324, 256, 376, 376, - /* 2180 */ 328, 329, 330, 331, 332, 333, 324, 335, 376, 376, - /* 2190 */ 328, 329, 330, 331, 332, 333, 376, 335, 256, 376, - /* 2200 */ 376, 376, 376, 376, 376, 284, 376, 376, 376, 376, - /* 2210 */ 376, 376, 376, 292, 376, 376, 376, 376, 297, 376, - /* 2220 */ 299, 376, 376, 376, 376, 376, 284, 376, 376, 376, - /* 2230 */ 376, 376, 376, 376, 292, 376, 376, 376, 376, 297, - /* 2240 */ 376, 299, 376, 376, 376, 324, 376, 376, 376, 328, - /* 2250 */ 329, 330, 331, 332, 333, 376, 335, 256, 376, 376, - /* 2260 */ 376, 376, 376, 376, 376, 376, 324, 256, 376, 376, - /* 2270 */ 328, 329, 330, 331, 332, 333, 376, 335, 376, 376, - /* 2280 */ 376, 376, 376, 256, 376, 284, 376, 376, 376, 376, - /* 2290 */ 376, 376, 376, 292, 376, 284, 376, 376, 297, 376, - /* 2300 */ 299, 376, 376, 292, 376, 376, 376, 376, 297, 376, - /* 2310 */ 299, 284, 376, 376, 376, 376, 376, 376, 376, 292, - /* 2320 */ 376, 376, 376, 376, 297, 324, 299, 376, 376, 328, - /* 2330 */ 329, 330, 331, 332, 333, 324, 335, 376, 376, 328, - /* 2340 */ 329, 330, 331, 332, 333, 376, 335, 376, 376, 376, - /* 2350 */ 376, 324, 376, 376, 376, 328, 329, 330, 331, 332, - /* 2360 */ 333, 376, 335, + /* 210 */ 210, 211, 325, 192, 20, 150, 329, 330, 331, 332, + /* 220 */ 333, 334, 20, 336, 224, 254, 339, 224, 20, 224, + /* 230 */ 343, 344, 345, 165, 37, 167, 84, 176, 285, 270, + /* 240 */ 179, 354, 4, 274, 8, 9, 285, 294, 12, 13, + /* 250 */ 14, 15, 16, 292, 233, 234, 235, 236, 237, 257, + /* 260 */ 192, 193, 301, 195, 196, 197, 198, 199, 200, 201, + /* 270 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + /* 280 */ 12, 13, 44, 45, 87, 314, 89, 90, 20, 92, + /* 290 */ 22, 257, 84, 96, 229, 230, 60, 147, 1, 2, + /* 300 */ 298, 33, 21, 35, 284, 24, 25, 26, 27, 28, + /* 310 */ 29, 30, 31, 32, 265, 118, 164, 297, 166, 285, + /* 320 */ 170, 85, 120, 121, 56, 20, 355, 293, 60, 93, + /* 330 */ 299, 300, 298, 262, 300, 67, 265, 12, 13, 368, + /* 340 */ 62, 63, 64, 372, 355, 20, 68, 22, 0, 71, + /* 350 */ 72, 302, 84, 75, 76, 77, 95, 368, 33, 325, + /* 360 */ 35, 372, 212, 329, 330, 331, 332, 333, 334, 14, + /* 370 */ 336, 269, 160, 339, 106, 20, 224, 343, 344, 345, + /* 380 */ 14, 56, 85, 147, 282, 20, 20, 22, 120, 121, + /* 390 */ 196, 357, 67, 291, 182, 183, 20, 8, 9, 365, + /* 400 */ 0, 12, 13, 14, 15, 16, 170, 271, 272, 84, + /* 410 */ 62, 63, 64, 65, 66, 50, 68, 69, 70, 71, + /* 420 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + /* 430 */ 277, 106, 224, 165, 43, 167, 8, 9, 285, 59, + /* 440 */ 12, 13, 14, 15, 16, 120, 121, 294, 212, 213, + /* 450 */ 214, 215, 216, 217, 218, 219, 220, 221, 20, 59, + /* 460 */ 192, 193, 257, 195, 196, 197, 198, 199, 200, 201, + /* 470 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + /* 480 */ 8, 9, 56, 265, 12, 13, 14, 15, 16, 56, + /* 490 */ 165, 116, 167, 115, 276, 20, 277, 14, 15, 16, + /* 500 */ 3, 8, 9, 298, 285, 12, 13, 14, 15, 16, + /* 510 */ 84, 293, 86, 294, 271, 272, 83, 192, 193, 86, + /* 520 */ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + /* 530 */ 205, 206, 207, 208, 209, 210, 211, 12, 13, 14, + /* 540 */ 310, 152, 312, 257, 277, 20, 257, 22, 20, 224, + /* 550 */ 175, 176, 285, 60, 179, 177, 178, 85, 33, 78, + /* 560 */ 35, 294, 196, 97, 98, 99, 100, 101, 102, 103, + /* 570 */ 104, 105, 106, 107, 285, 109, 110, 111, 112, 113, + /* 580 */ 114, 56, 293, 4, 298, 157, 93, 298, 265, 300, + /* 590 */ 152, 96, 67, 257, 12, 13, 293, 22, 19, 276, + /* 600 */ 42, 43, 20, 314, 22, 124, 125, 304, 67, 84, + /* 610 */ 35, 35, 33, 118, 325, 33, 293, 35, 329, 330, + /* 620 */ 331, 332, 333, 334, 21, 336, 47, 152, 339, 257, + /* 630 */ 51, 106, 343, 344, 298, 56, 245, 34, 56, 36, + /* 640 */ 147, 2, 67, 67, 355, 120, 121, 8, 9, 67, + /* 650 */ 224, 12, 13, 14, 15, 16, 0, 368, 327, 257, + /* 660 */ 257, 372, 83, 170, 96, 86, 84, 327, 43, 265, + /* 670 */ 298, 8, 9, 285, 246, 12, 13, 14, 15, 16, + /* 680 */ 276, 106, 351, 115, 116, 117, 118, 119, 106, 301, + /* 690 */ 165, 351, 167, 44, 45, 327, 314, 293, 257, 39, + /* 700 */ 298, 298, 120, 121, 0, 212, 213, 214, 215, 216, + /* 710 */ 217, 218, 219, 220, 221, 59, 286, 192, 193, 351, + /* 720 */ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + /* 730 */ 205, 206, 207, 208, 209, 210, 211, 355, 241, 298, + /* 740 */ 165, 310, 167, 312, 273, 2, 275, 165, 85, 167, + /* 750 */ 368, 8, 9, 300, 372, 12, 13, 14, 15, 16, + /* 760 */ 314, 222, 223, 35, 311, 8, 9, 192, 193, 12, + /* 770 */ 13, 14, 15, 16, 192, 193, 56, 195, 196, 197, + /* 780 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + /* 790 */ 208, 209, 210, 211, 12, 13, 18, 286, 20, 257, + /* 800 */ 96, 355, 20, 257, 22, 27, 86, 295, 30, 257, + /* 810 */ 298, 0, 4, 265, 368, 33, 314, 35, 372, 115, + /* 820 */ 116, 117, 118, 119, 276, 47, 257, 49, 257, 51, + /* 830 */ 14, 285, 295, 22, 278, 298, 20, 281, 56, 293, + /* 840 */ 298, 293, 85, 0, 298, 265, 300, 8, 9, 67, + /* 850 */ 298, 12, 13, 14, 15, 16, 276, 355, 265, 152, + /* 860 */ 153, 83, 88, 283, 35, 91, 84, 298, 243, 298, + /* 870 */ 368, 325, 67, 293, 372, 329, 330, 331, 332, 333, + /* 880 */ 334, 257, 336, 223, 257, 339, 293, 257, 106, 343, + /* 890 */ 344, 345, 257, 257, 88, 167, 0, 91, 60, 286, + /* 900 */ 354, 123, 120, 121, 126, 127, 128, 129, 130, 131, + /* 910 */ 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + /* 920 */ 142, 143, 298, 145, 146, 298, 333, 265, 298, 265, + /* 930 */ 43, 18, 286, 298, 298, 265, 23, 265, 276, 96, + /* 940 */ 276, 348, 349, 350, 48, 352, 276, 165, 276, 167, + /* 950 */ 37, 38, 1, 2, 41, 293, 318, 293, 115, 116, + /* 960 */ 117, 118, 119, 293, 286, 293, 257, 120, 121, 286, + /* 970 */ 57, 58, 85, 43, 192, 193, 265, 195, 196, 197, + /* 980 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + /* 990 */ 208, 209, 210, 211, 285, 265, 167, 84, 88, 265, + /* 1000 */ 265, 91, 293, 265, 293, 88, 276, 298, 91, 300, + /* 1010 */ 276, 276, 196, 287, 276, 85, 43, 258, 287, 286, + /* 1020 */ 274, 265, 375, 293, 298, 314, 266, 293, 293, 298, + /* 1030 */ 192, 293, 276, 225, 325, 122, 265, 257, 329, 330, + /* 1040 */ 331, 332, 333, 334, 333, 336, 0, 276, 339, 293, + /* 1050 */ 324, 325, 343, 344, 345, 324, 325, 326, 85, 348, + /* 1060 */ 349, 350, 336, 352, 293, 285, 355, 336, 22, 0, + /* 1070 */ 157, 158, 159, 293, 365, 162, 366, 362, 298, 368, + /* 1080 */ 300, 168, 46, 372, 43, 12, 13, 265, 43, 35, + /* 1090 */ 43, 22, 285, 43, 181, 22, 43, 184, 276, 186, + /* 1100 */ 187, 188, 189, 190, 191, 325, 33, 287, 35, 329, + /* 1110 */ 330, 331, 332, 333, 334, 293, 336, 43, 298, 339, + /* 1120 */ 84, 67, 43, 343, 344, 345, 85, 266, 43, 56, + /* 1130 */ 85, 43, 85, 257, 354, 85, 84, 224, 85, 43, + /* 1140 */ 67, 43, 43, 43, 324, 325, 94, 321, 264, 297, + /* 1150 */ 353, 328, 369, 369, 369, 346, 336, 356, 289, 85, + /* 1160 */ 84, 285, 226, 323, 85, 20, 265, 47, 322, 293, + /* 1170 */ 85, 35, 163, 85, 298, 271, 300, 265, 316, 106, + /* 1180 */ 265, 85, 42, 85, 85, 85, 305, 147, 303, 303, + /* 1190 */ 314, 265, 265, 20, 257, 20, 20, 259, 259, 320, + /* 1200 */ 269, 325, 300, 269, 313, 329, 330, 331, 332, 333, + /* 1210 */ 334, 20, 336, 315, 269, 269, 313, 20, 269, 269, + /* 1220 */ 306, 265, 285, 269, 259, 285, 285, 285, 285, 285, + /* 1230 */ 293, 355, 285, 285, 265, 298, 259, 300, 165, 320, + /* 1240 */ 167, 267, 285, 285, 368, 285, 285, 257, 372, 267, + /* 1250 */ 298, 314, 319, 173, 265, 300, 265, 231, 20, 267, + /* 1260 */ 298, 298, 325, 149, 298, 192, 329, 330, 331, 332, + /* 1270 */ 333, 334, 313, 336, 298, 285, 203, 204, 205, 206, + /* 1280 */ 207, 208, 209, 293, 309, 298, 307, 309, 298, 293, + /* 1290 */ 300, 306, 355, 281, 267, 267, 293, 298, 328, 257, + /* 1300 */ 232, 238, 309, 298, 298, 368, 309, 156, 298, 372, + /* 1310 */ 240, 298, 223, 227, 361, 325, 239, 323, 293, 329, + /* 1320 */ 330, 331, 332, 333, 334, 361, 336, 285, 360, 339, + /* 1330 */ 358, 364, 361, 343, 344, 293, 20, 244, 327, 242, + /* 1340 */ 298, 247, 300, 363, 84, 359, 342, 289, 265, 298, + /* 1350 */ 275, 370, 257, 36, 371, 317, 312, 267, 0, 371, + /* 1360 */ 376, 260, 259, 279, 175, 370, 257, 325, 255, 371, + /* 1370 */ 370, 329, 330, 331, 332, 333, 334, 0, 336, 268, + /* 1380 */ 285, 339, 0, 279, 279, 343, 344, 42, 293, 0, + /* 1390 */ 75, 0, 35, 298, 285, 300, 185, 35, 35, 35, + /* 1400 */ 185, 0, 293, 35, 35, 185, 0, 298, 185, 300, + /* 1410 */ 0, 0, 22, 35, 0, 35, 0, 84, 170, 257, + /* 1420 */ 325, 169, 167, 165, 329, 330, 331, 332, 333, 334, + /* 1430 */ 335, 336, 337, 338, 325, 0, 0, 257, 329, 330, + /* 1440 */ 331, 332, 333, 334, 161, 336, 160, 285, 0, 0, + /* 1450 */ 46, 0, 0, 0, 144, 293, 0, 0, 0, 0, + /* 1460 */ 298, 0, 300, 139, 35, 285, 0, 139, 0, 0, + /* 1470 */ 290, 0, 0, 293, 0, 0, 0, 0, 298, 0, + /* 1480 */ 300, 0, 373, 374, 0, 0, 0, 325, 0, 257, + /* 1490 */ 0, 329, 330, 331, 332, 333, 334, 42, 336, 0, + /* 1500 */ 0, 339, 0, 0, 0, 325, 344, 0, 0, 329, + /* 1510 */ 330, 331, 332, 333, 334, 22, 336, 285, 0, 0, + /* 1520 */ 0, 56, 290, 0, 0, 293, 43, 14, 39, 42, + /* 1530 */ 298, 257, 300, 0, 40, 14, 39, 46, 46, 0, + /* 1540 */ 0, 257, 0, 156, 39, 0, 0, 0, 0, 0, + /* 1550 */ 35, 39, 0, 39, 0, 39, 61, 325, 47, 285, + /* 1560 */ 35, 329, 330, 331, 332, 333, 334, 293, 336, 285, + /* 1570 */ 35, 0, 298, 47, 300, 47, 35, 293, 47, 0, + /* 1580 */ 0, 0, 298, 39, 300, 0, 35, 22, 0, 91, + /* 1590 */ 35, 257, 35, 35, 93, 35, 43, 0, 35, 325, + /* 1600 */ 22, 35, 43, 329, 330, 331, 332, 333, 334, 325, + /* 1610 */ 336, 19, 35, 329, 330, 331, 332, 333, 334, 285, + /* 1620 */ 336, 35, 0, 22, 290, 33, 35, 293, 0, 22, + /* 1630 */ 0, 49, 298, 257, 300, 35, 0, 35, 0, 47, + /* 1640 */ 22, 367, 0, 20, 52, 53, 54, 55, 56, 0, + /* 1650 */ 35, 257, 0, 171, 22, 0, 0, 0, 374, 325, + /* 1660 */ 0, 285, 152, 329, 330, 331, 332, 333, 334, 293, + /* 1670 */ 336, 149, 85, 84, 298, 83, 300, 0, 86, 285, + /* 1680 */ 84, 152, 152, 84, 290, 39, 154, 293, 150, 180, + /* 1690 */ 0, 148, 298, 84, 300, 228, 46, 94, 85, 35, + /* 1700 */ 84, 325, 43, 257, 84, 329, 330, 331, 332, 333, + /* 1710 */ 334, 119, 336, 84, 338, 22, 85, 43, 85, 325, + /* 1720 */ 85, 84, 43, 329, 330, 331, 332, 333, 334, 84, + /* 1730 */ 336, 285, 84, 46, 46, 33, 290, 43, 85, 293, + /* 1740 */ 43, 46, 84, 151, 298, 228, 300, 85, 85, 47, + /* 1750 */ 46, 46, 85, 257, 52, 53, 54, 55, 56, 222, + /* 1760 */ 43, 85, 228, 257, 172, 35, 174, 35, 35, 35, + /* 1770 */ 35, 325, 2, 84, 43, 329, 330, 331, 332, 333, + /* 1780 */ 334, 285, 336, 85, 84, 83, 192, 84, 86, 293, + /* 1790 */ 46, 285, 85, 85, 298, 84, 300, 84, 46, 293, + /* 1800 */ 22, 95, 194, 84, 298, 85, 300, 35, 35, 84, + /* 1810 */ 35, 85, 84, 22, 85, 35, 35, 35, 108, 257, + /* 1820 */ 84, 325, 108, 85, 84, 329, 330, 331, 332, 333, + /* 1830 */ 334, 325, 336, 85, 84, 329, 330, 331, 332, 333, + /* 1840 */ 334, 96, 336, 84, 84, 35, 84, 285, 43, 108, + /* 1850 */ 148, 149, 22, 151, 108, 293, 61, 155, 60, 35, + /* 1860 */ 298, 257, 300, 67, 43, 82, 22, 35, 35, 35, + /* 1870 */ 35, 257, 35, 35, 35, 67, 174, 35, 35, 0, + /* 1880 */ 35, 35, 35, 257, 35, 35, 35, 325, 35, 285, + /* 1890 */ 0, 329, 330, 331, 332, 333, 334, 293, 336, 285, + /* 1900 */ 39, 47, 298, 35, 300, 47, 39, 293, 0, 35, + /* 1910 */ 47, 285, 298, 0, 300, 39, 35, 47, 0, 293, + /* 1920 */ 35, 39, 35, 0, 298, 257, 300, 22, 21, 325, + /* 1930 */ 377, 22, 22, 329, 330, 331, 332, 333, 334, 325, + /* 1940 */ 336, 21, 257, 329, 330, 331, 332, 333, 334, 20, + /* 1950 */ 336, 325, 377, 285, 377, 329, 330, 331, 332, 333, + /* 1960 */ 334, 293, 336, 377, 377, 377, 298, 377, 300, 377, + /* 1970 */ 285, 377, 377, 377, 377, 377, 377, 377, 293, 377, + /* 1980 */ 377, 377, 377, 298, 257, 300, 377, 377, 377, 377, + /* 1990 */ 377, 377, 377, 325, 257, 377, 377, 329, 330, 331, + /* 2000 */ 332, 333, 334, 377, 336, 377, 377, 377, 377, 377, + /* 2010 */ 325, 377, 285, 377, 329, 330, 331, 332, 333, 334, + /* 2020 */ 293, 336, 285, 377, 377, 298, 377, 300, 377, 377, + /* 2030 */ 293, 377, 377, 377, 377, 298, 257, 300, 377, 377, + /* 2040 */ 377, 377, 377, 377, 377, 377, 257, 377, 377, 377, + /* 2050 */ 377, 377, 325, 377, 377, 377, 329, 330, 331, 332, + /* 2060 */ 333, 334, 325, 336, 285, 377, 329, 330, 331, 332, + /* 2070 */ 333, 334, 293, 336, 285, 377, 377, 298, 377, 300, + /* 2080 */ 377, 377, 293, 377, 377, 377, 377, 298, 257, 300, + /* 2090 */ 377, 377, 377, 377, 377, 377, 377, 377, 257, 377, + /* 2100 */ 377, 377, 377, 377, 325, 377, 377, 377, 329, 330, + /* 2110 */ 331, 332, 333, 334, 325, 336, 285, 377, 329, 330, + /* 2120 */ 331, 332, 333, 334, 293, 336, 285, 377, 377, 298, + /* 2130 */ 377, 300, 377, 377, 293, 377, 377, 377, 377, 298, + /* 2140 */ 377, 300, 377, 377, 377, 377, 377, 377, 377, 377, + /* 2150 */ 257, 377, 377, 377, 377, 377, 325, 377, 377, 377, + /* 2160 */ 329, 330, 331, 332, 333, 334, 325, 336, 377, 257, + /* 2170 */ 329, 330, 331, 332, 333, 334, 377, 336, 285, 377, + /* 2180 */ 377, 377, 377, 377, 377, 377, 293, 377, 377, 377, + /* 2190 */ 377, 298, 257, 300, 377, 377, 377, 285, 377, 377, + /* 2200 */ 377, 377, 377, 377, 377, 293, 377, 377, 377, 377, + /* 2210 */ 298, 257, 300, 377, 377, 377, 377, 377, 325, 377, + /* 2220 */ 285, 377, 329, 330, 331, 332, 333, 334, 293, 336, + /* 2230 */ 377, 377, 377, 298, 377, 300, 377, 325, 377, 285, + /* 2240 */ 377, 329, 330, 331, 332, 333, 334, 293, 336, 377, + /* 2250 */ 377, 377, 298, 377, 300, 377, 377, 377, 377, 377, + /* 2260 */ 325, 377, 377, 377, 329, 330, 331, 332, 333, 334, + /* 2270 */ 257, 336, 377, 377, 377, 377, 377, 377, 377, 325, + /* 2280 */ 257, 377, 377, 329, 330, 331, 332, 333, 334, 377, + /* 2290 */ 336, 377, 377, 377, 377, 377, 377, 377, 285, 377, + /* 2300 */ 377, 377, 377, 377, 377, 377, 293, 377, 285, 377, + /* 2310 */ 377, 298, 377, 300, 377, 377, 293, 377, 377, 377, + /* 2320 */ 377, 298, 377, 300, 377, 377, 377, 377, 377, 377, + /* 2330 */ 377, 377, 377, 377, 377, 377, 377, 377, 325, 377, + /* 2340 */ 377, 377, 329, 330, 331, 332, 333, 334, 325, 336, + /* 2350 */ 377, 377, 329, 330, 331, 332, 333, 334, 377, 336, }; -#define YY_SHIFT_COUNT (660) +#define YY_SHIFT_COUNT (662) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (1960) +#define YY_SHIFT_MAX (1929) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 908, 0, 0, 67, 67, 266, 266, 266, 323, 323, - /* 10 */ 266, 266, 522, 579, 778, 579, 579, 579, 579, 579, - /* 20 */ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - /* 30 */ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - /* 40 */ 579, 579, 579, 364, 364, 8, 8, 8, 1113, 1113, - /* 50 */ 1113, 128, 172, 31, 31, 154, 154, 93, 93, 64, - /* 60 */ 70, 31, 31, 154, 154, 154, 154, 154, 154, 154, - /* 70 */ 154, 154, 16, 154, 154, 154, 240, 322, 154, 154, - /* 80 */ 322, 340, 154, 322, 322, 322, 154, 368, 774, 490, - /* 90 */ 943, 943, 372, 55, 317, 317, 317, 317, 317, 317, - /* 100 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - /* 110 */ 317, 317, 317, 463, 70, 12, 12, 300, 380, 328, - /* 120 */ 434, 434, 434, 380, 557, 240, 5, 5, 322, 322, - /* 130 */ 586, 586, 591, 625, 206, 206, 206, 206, 206, 206, - /* 140 */ 206, 777, 23, 593, 425, 48, 341, 251, 268, 439, - /* 150 */ 569, 51, 705, 775, 646, 672, 789, 672, 895, 769, - /* 160 */ 769, 769, 693, 773, 1028, 888, 1114, 1090, 1106, 980, - /* 170 */ 1114, 1114, 1107, 1021, 1021, 1114, 1114, 1155, 1155, 1166, - /* 180 */ 16, 240, 16, 1171, 1175, 16, 1171, 16, 1176, 16, - /* 190 */ 16, 1114, 16, 1155, 322, 322, 322, 322, 322, 322, - /* 200 */ 322, 322, 322, 322, 322, 1114, 1155, 586, 1166, 368, - /* 210 */ 1092, 240, 368, 1114, 1114, 1171, 368, 1045, 586, 586, - /* 220 */ 586, 586, 1045, 586, 1132, 557, 1176, 368, 591, 368, - /* 230 */ 557, 1278, 586, 1068, 1045, 586, 586, 1068, 1045, 586, - /* 240 */ 586, 322, 1066, 1178, 1068, 1089, 1097, 1110, 888, 1119, - /* 250 */ 557, 1326, 1104, 1108, 1109, 1104, 1108, 1104, 1108, 1269, - /* 260 */ 1028, 586, 625, 1114, 368, 1354, 1155, 2363, 2363, 2363, - /* 270 */ 2363, 2363, 2363, 2363, 173, 1118, 188, 1173, 143, 594, - /* 280 */ 663, 744, 753, 726, 920, 480, 2, 2, 2, 2, - /* 290 */ 2, 2, 2, 2, 700, 53, 26, 26, 46, 139, - /* 300 */ 568, 106, 415, 118, 476, 657, 524, 524, 524, 524, - /* 310 */ 494, 246, 903, 909, 911, 923, 939, 967, 1002, 959, - /* 320 */ 865, 807, 969, 971, 975, 976, 978, 987, 998, 983, - /* 330 */ 1026, 928, 179, 814, 1006, 553, 1018, 974, 1020, 1025, - /* 340 */ 1036, 1038, 1039, 1043, 507, 420, 1084, 1412, 1240, 1415, - /* 350 */ 1420, 1380, 1421, 1360, 1436, 1403, 1253, 1413, 1414, 1416, - /* 360 */ 1263, 1450, 1417, 1419, 1271, 1456, 1273, 1459, 1427, 1463, - /* 370 */ 1442, 1465, 1432, 1468, 1387, 1302, 1304, 1307, 1313, 1478, - /* 380 */ 1479, 1320, 1322, 1482, 1486, 1441, 1488, 1497, 1498, 1357, - /* 390 */ 1502, 1513, 1514, 1515, 1517, 1381, 1485, 1521, 1384, 1524, - /* 400 */ 1525, 1526, 1527, 1529, 1530, 1537, 1539, 1540, 1541, 1542, - /* 410 */ 1544, 1545, 1546, 1490, 1533, 1534, 1535, 1555, 1556, 1557, - /* 420 */ 1536, 1559, 1560, 1561, 1562, 1564, 1510, 1573, 1576, 1538, - /* 430 */ 1543, 1547, 1563, 1549, 1565, 1551, 1578, 1548, 1552, 1583, - /* 440 */ 1584, 1586, 1566, 1437, 1587, 1599, 1600, 1554, 1602, 1604, - /* 450 */ 1572, 1567, 1570, 1610, 1577, 1575, 1574, 1617, 1585, 1589, - /* 460 */ 1580, 1623, 1596, 1598, 1607, 1624, 1634, 1653, 1655, 1568, - /* 470 */ 1569, 1622, 1639, 1662, 1629, 1630, 1631, 1632, 1626, 1636, - /* 480 */ 1637, 1638, 1640, 1674, 1658, 1677, 1659, 1633, 1683, 1663, - /* 490 */ 1649, 1687, 1654, 1688, 1657, 1690, 1671, 1675, 1696, 1571, - /* 500 */ 1667, 1697, 1528, 1682, 1588, 1558, 1705, 1713, 1591, 1593, - /* 510 */ 1715, 1716, 1723, 1635, 1641, 1550, 1719, 1644, 1601, 1661, - /* 520 */ 1720, 1685, 1605, 1665, 1628, 1692, 1704, 1522, 1668, 1656, - /* 530 */ 1672, 1670, 1673, 1676, 1739, 1721, 1678, 1680, 1686, 1695, - /* 540 */ 1681, 1727, 1710, 1725, 1698, 1737, 1579, 1699, 1700, 1736, - /* 550 */ 1581, 1743, 1741, 1751, 1714, 1756, 1590, 1717, 1731, 1765, - /* 560 */ 1769, 1770, 1772, 1776, 1717, 1810, 1627, 1771, 1730, 1735, - /* 570 */ 1732, 1738, 1740, 1742, 1774, 1745, 1747, 1775, 1803, 1643, - /* 580 */ 1749, 1733, 1750, 1798, 1812, 1755, 1764, 1814, 1783, 1773, - /* 590 */ 1818, 1786, 1787, 1819, 1789, 1790, 1820, 1792, 1752, 1763, - /* 600 */ 1766, 1782, 1836, 1781, 1795, 1797, 1855, 1808, 1850, 1850, - /* 610 */ 1873, 1837, 1839, 1865, 1831, 1821, 1858, 1868, 1870, 1871, - /* 620 */ 1872, 1875, 1886, 1877, 1878, 1848, 1626, 1880, 1636, 1881, - /* 630 */ 1882, 1883, 1887, 1894, 1896, 1932, 1898, 1874, 1895, 1935, - /* 640 */ 1902, 1891, 1900, 1946, 1914, 1903, 1912, 1952, 1918, 1907, - /* 650 */ 1916, 1957, 1923, 1924, 1960, 1940, 1943, 1944, 1945, 1947, - /* 660 */ 1949, + /* 0 */ 913, 0, 0, 68, 68, 268, 268, 268, 325, 325, + /* 10 */ 268, 268, 525, 582, 782, 582, 582, 582, 582, 582, + /* 20 */ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, + /* 30 */ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, + /* 40 */ 582, 582, 582, 208, 208, 97, 97, 97, 1073, 1073, + /* 50 */ 1073, 152, 426, 3, 3, 99, 99, 238, 238, 5, + /* 60 */ 202, 3, 3, 99, 99, 99, 99, 99, 99, 99, + /* 70 */ 99, 99, 89, 99, 99, 99, 148, 305, 99, 99, + /* 80 */ 305, 376, 99, 305, 305, 305, 99, 380, 778, 236, + /* 90 */ 493, 493, 281, 278, 575, 575, 575, 575, 575, 575, + /* 100 */ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, + /* 110 */ 575, 575, 575, 197, 202, 355, 355, 400, 576, 656, + /* 120 */ 438, 438, 438, 576, 528, 148, 11, 11, 305, 305, + /* 130 */ 541, 541, 261, 805, 466, 466, 466, 466, 466, 466, + /* 140 */ 466, 1592, 23, 107, 428, 21, 41, 375, 65, 366, + /* 150 */ 816, 365, 649, 495, 475, 539, 660, 539, 558, 497, + /* 160 */ 497, 497, 808, 194, 1076, 936, 1145, 1120, 1136, 1009, + /* 170 */ 1145, 1145, 1140, 1040, 1040, 1145, 1145, 1173, 1173, 1175, + /* 180 */ 89, 148, 89, 1176, 1191, 89, 1176, 89, 1197, 89, + /* 190 */ 89, 1145, 89, 1173, 305, 305, 305, 305, 305, 305, + /* 200 */ 305, 305, 305, 305, 305, 1145, 1173, 541, 1175, 380, + /* 210 */ 1080, 148, 380, 1145, 1145, 1176, 380, 1026, 541, 541, + /* 220 */ 541, 541, 1026, 541, 1114, 528, 1197, 380, 261, 380, + /* 230 */ 528, 1238, 541, 1068, 1026, 541, 541, 1068, 1026, 541, + /* 240 */ 541, 305, 1063, 1151, 1068, 1070, 1077, 1086, 936, 1089, + /* 250 */ 528, 1316, 1093, 1097, 1094, 1093, 1097, 1093, 1097, 1260, + /* 260 */ 1076, 541, 805, 1145, 380, 1317, 1173, 2360, 2360, 2360, + /* 270 */ 2360, 2360, 2360, 2360, 348, 1702, 132, 579, 472, 16, + /* 280 */ 663, 639, 743, 389, 757, 704, 839, 839, 839, 839, + /* 290 */ 839, 839, 839, 839, 843, 568, 25, 25, 61, 212, + /* 300 */ 433, 481, 603, 378, 297, 150, 483, 483, 483, 483, + /* 310 */ 45, 887, 774, 806, 910, 917, 811, 1046, 1069, 720, + /* 320 */ 707, 930, 973, 1041, 1045, 1047, 1050, 728, 829, 1053, + /* 330 */ 951, 847, 625, 391, 1074, 838, 1079, 1036, 1085, 1088, + /* 340 */ 1096, 1098, 1099, 1100, 1052, 1054, 896, 1358, 1189, 1377, + /* 350 */ 1382, 1345, 1389, 1315, 1391, 1357, 1211, 1362, 1363, 1364, + /* 360 */ 1215, 1401, 1368, 1369, 1220, 1406, 1223, 1410, 1378, 1411, + /* 370 */ 1390, 1414, 1380, 1416, 1333, 1248, 1252, 1255, 1258, 1435, + /* 380 */ 1436, 1283, 1286, 1448, 1449, 1404, 1451, 1452, 1453, 1310, + /* 390 */ 1456, 1457, 1458, 1459, 1461, 1324, 1429, 1466, 1328, 1468, + /* 400 */ 1469, 1471, 1472, 1474, 1475, 1476, 1477, 1479, 1481, 1484, + /* 410 */ 1485, 1486, 1488, 1455, 1490, 1499, 1500, 1502, 1503, 1504, + /* 420 */ 1493, 1507, 1508, 1518, 1519, 1520, 1465, 1523, 1524, 1487, + /* 430 */ 1489, 1483, 1513, 1491, 1521, 1492, 1533, 1494, 1497, 1539, + /* 440 */ 1540, 1542, 1505, 1387, 1545, 1546, 1547, 1495, 1548, 1549, + /* 450 */ 1515, 1511, 1512, 1552, 1525, 1526, 1514, 1554, 1535, 1528, + /* 460 */ 1516, 1571, 1541, 1531, 1544, 1579, 1580, 1581, 1585, 1501, + /* 470 */ 1498, 1551, 1565, 1588, 1555, 1557, 1558, 1560, 1553, 1559, + /* 480 */ 1563, 1566, 1577, 1586, 1597, 1578, 1622, 1601, 1582, 1628, + /* 490 */ 1607, 1591, 1630, 1600, 1636, 1602, 1638, 1618, 1623, 1642, + /* 500 */ 1510, 1615, 1649, 1482, 1632, 1529, 1522, 1652, 1655, 1530, + /* 510 */ 1532, 1656, 1657, 1660, 1589, 1587, 1509, 1677, 1596, 1538, + /* 520 */ 1599, 1690, 1646, 1543, 1609, 1603, 1650, 1659, 1467, 1616, + /* 530 */ 1613, 1620, 1631, 1633, 1629, 1693, 1674, 1635, 1637, 1645, + /* 540 */ 1648, 1653, 1679, 1687, 1688, 1658, 1694, 1517, 1662, 1663, + /* 550 */ 1695, 1537, 1697, 1704, 1705, 1667, 1717, 1534, 1676, 1664, + /* 560 */ 1730, 1732, 1733, 1734, 1735, 1676, 1770, 1594, 1731, 1689, + /* 570 */ 1698, 1700, 1707, 1703, 1708, 1744, 1711, 1713, 1752, 1778, + /* 580 */ 1608, 1719, 1706, 1720, 1772, 1773, 1725, 1726, 1775, 1728, + /* 590 */ 1729, 1780, 1736, 1738, 1781, 1740, 1748, 1782, 1750, 1710, + /* 600 */ 1714, 1741, 1746, 1791, 1745, 1759, 1760, 1810, 1762, 1805, + /* 610 */ 1805, 1830, 1795, 1798, 1824, 1796, 1783, 1821, 1832, 1833, + /* 620 */ 1834, 1835, 1837, 1844, 1838, 1839, 1808, 1553, 1842, 1559, + /* 630 */ 1843, 1845, 1846, 1847, 1849, 1850, 1851, 1879, 1853, 1854, + /* 640 */ 1861, 1890, 1868, 1858, 1867, 1908, 1874, 1863, 1876, 1913, + /* 650 */ 1881, 1870, 1882, 1918, 1885, 1887, 1923, 1905, 1907, 1909, + /* 660 */ 1910, 1920, 1929, }; #define YY_REDUCE_COUNT (273) -#define YY_REDUCE_MIN (-295) -#define YY_REDUCE_MAX (2027) +#define YY_REDUCE_MIN (-354) +#define YY_REDUCE_MAX (2023) static const short yy_reduce_ofst[] = { - /* 0 */ -192, -189, 81, 287, 708, 786, 884, 910, 977, 1030, - /* 10 */ 543, 1040, 1095, 1111, 1161, 1177, 1239, 1219, 1297, 1309, - /* 20 */ 1319, 1379, 1402, 1444, 1461, 1511, 1532, 1553, 1595, 1612, - /* 30 */ 1664, 1718, 1734, 1744, 1796, 1838, 1852, 1862, 1921, 1942, - /* 40 */ 2001, 2011, 2027, -255, 21, 215, -263, 221, -261, -278, - /* 50 */ 121, -289, -23, -21, 10, 65, 357, -260, -256, -295, - /* 60 */ -268, -239, -191, 63, 218, 220, 273, 281, 369, 382, - /* 70 */ 390, 419, -247, 544, 545, 574, -201, 283, 577, 679, - /* 80 */ -107, 90, 731, 397, 396, 567, 733, 75, -194, -114, - /* 90 */ -114, -114, -144, -88, -152, 111, 134, 194, 392, 436, - /* 100 */ 549, 550, 551, 556, 566, 583, 623, 626, 628, 633, - /* 110 */ 665, 666, 697, 205, -2, 362, 451, -34, 54, 224, - /* 120 */ 166, 278, 538, 466, 355, 555, -175, 329, 470, 640, - /* 130 */ 454, 561, 610, 421, 517, 560, 656, 662, 675, 745, - /* 140 */ 746, 717, 788, 781, 682, 706, 808, 754, 715, 793, - /* 150 */ 793, 815, 824, 796, 772, 748, 748, 748, 756, 735, - /* 160 */ 737, 738, 752, 793, 820, 811, 872, 817, 873, 829, - /* 170 */ 881, 883, 846, 850, 876, 916, 918, 926, 927, 868, - /* 180 */ 921, 889, 922, 885, 879, 930, 887, 933, 899, 937, - /* 190 */ 942, 947, 953, 965, 941, 946, 948, 951, 952, 960, - /* 200 */ 962, 963, 966, 972, 973, 985, 993, 934, 940, 994, - /* 210 */ 944, 968, 1004, 1007, 1009, 970, 1012, 979, 984, 986, - /* 220 */ 988, 991, 981, 995, 989, 992, 997, 1027, 1014, 1031, - /* 230 */ 1008, 996, 1016, 982, 1003, 1029, 1033, 990, 1017, 1037, - /* 240 */ 1041, 793, 1011, 1015, 1042, 1022, 999, 1019, 1023, 748, - /* 250 */ 1048, 1054, 1034, 1024, 1010, 1035, 1044, 1046, 1049, 1047, - /* 260 */ 1065, 1059, 1112, 1102, 1123, 1137, 1133, 1082, 1088, 1122, - /* 270 */ 1128, 1129, 1142, 1157, + /* 0 */ -29, -221, 289, 34, 709, -113, 546, 780, 876, 937, + /* 10 */ 990, 1042, 1095, 1109, 1162, 1180, 1232, 1274, 1284, 1334, + /* 20 */ 1376, 1394, 1446, 1496, 1506, 1562, 1604, 1614, 1626, 1668, + /* 30 */ 1685, 1727, 1737, 1779, 1789, 1831, 1841, 1893, 1912, 1935, + /* 40 */ 1954, 2013, 2023, -219, 711, -250, -207, 593, 731, 726, + /* 50 */ 820, -218, 382, 446, 502, -208, 580, -261, -257, -354, + /* 60 */ -234, -182, -11, -138, 218, 323, 404, 548, 662, 664, + /* 70 */ 670, 672, 102, 730, 734, 735, -292, 153, 738, 756, + /* 80 */ -275, -215, 771, 219, -39, 267, 822, -246, 49, -201, + /* 90 */ -201, -201, -187, -31, -152, -132, 2, 205, 286, 336, + /* 100 */ 372, 402, 403, 441, 542, 552, 569, 571, 624, 627, + /* 110 */ 630, 635, 636, 20, 31, -71, 71, -264, 136, -194, + /* 120 */ 331, 340, 368, 243, 303, 453, 230, 431, -47, 388, + /* 130 */ 512, 537, 556, 471, 430, 511, 613, 646, 678, 683, + /* 140 */ 733, 638, 759, 746, 647, 710, 760, 826, 715, 807, + /* 150 */ 807, 861, 884, 852, 823, 797, 797, 797, 809, 783, + /* 160 */ 784, 785, 801, 807, 869, 840, 901, 846, 904, 862, + /* 170 */ 912, 915, 881, 885, 886, 926, 927, 938, 939, 879, + /* 180 */ 931, 902, 934, 891, 898, 945, 903, 946, 914, 949, + /* 190 */ 950, 956, 954, 965, 940, 941, 942, 943, 944, 947, + /* 200 */ 948, 957, 958, 960, 961, 969, 977, 952, 919, 974, + /* 210 */ 933, 955, 982, 989, 991, 959, 992, 975, 962, 963, + /* 220 */ 966, 976, 978, 987, 979, 996, 985, 1027, 1012, 1028, + /* 230 */ 1003, 970, 999, 953, 993, 1005, 1006, 964, 997, 1010, + /* 240 */ 1013, 807, 967, 980, 971, 968, 986, 972, 994, 797, + /* 250 */ 1025, 1011, 983, 981, 984, 988, 995, 998, 1000, 1004, + /* 260 */ 1058, 1051, 1075, 1083, 1090, 1101, 1103, 1038, 1044, 1084, + /* 270 */ 1104, 1105, 1111, 1113, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 10 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 20 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 30 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 40 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 50 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 60 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 70 */ 1447, 1447, 1520, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 80 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1518, 1671, 1447, - /* 90 */ 1848, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 100 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 110 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1520, 1447, 1518, - /* 120 */ 1860, 1860, 1860, 1447, 1447, 1447, 1715, 1715, 1447, 1447, - /* 130 */ 1447, 1447, 1614, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 140 */ 1447, 1707, 1447, 1447, 1929, 1447, 1447, 1713, 1883, 1447, - /* 150 */ 1447, 1447, 1447, 1567, 1875, 1852, 1866, 1853, 1850, 1914, - /* 160 */ 1914, 1914, 1869, 1447, 1583, 1879, 1447, 1447, 1447, 1699, - /* 170 */ 1447, 1447, 1676, 1673, 1673, 1447, 1447, 1447, 1447, 1447, - /* 180 */ 1520, 1447, 1520, 1447, 1447, 1520, 1447, 1520, 1447, 1520, - /* 190 */ 1520, 1447, 1520, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 200 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1518, - /* 210 */ 1709, 1447, 1518, 1447, 1447, 1447, 1518, 1888, 1447, 1447, - /* 220 */ 1447, 1447, 1888, 1447, 1447, 1447, 1447, 1518, 1447, 1518, - /* 230 */ 1447, 1447, 1447, 1890, 1888, 1447, 1447, 1890, 1888, 1447, - /* 240 */ 1447, 1447, 1902, 1898, 1890, 1906, 1904, 1881, 1879, 1866, - /* 250 */ 1447, 1447, 1920, 1916, 1932, 1920, 1916, 1920, 1916, 1447, - /* 260 */ 1583, 1447, 1447, 1447, 1518, 1479, 1447, 1701, 1715, 1617, - /* 270 */ 1617, 1617, 1521, 1452, 1447, 1447, 1447, 1447, 1447, 1447, - /* 280 */ 1447, 1447, 1447, 1447, 1447, 1447, 1786, 1901, 1900, 1824, - /* 290 */ 1823, 1822, 1820, 1785, 1447, 1579, 1784, 1783, 1447, 1447, - /* 300 */ 1447, 1447, 1447, 1447, 1447, 1447, 1777, 1778, 1776, 1775, - /* 310 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 320 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 330 */ 1849, 1447, 1917, 1921, 1447, 1447, 1447, 1760, 1447, 1447, - /* 340 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 350 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 360 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 370 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 380 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 390 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 400 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 410 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 420 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 430 */ 1447, 1484, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 440 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 450 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 460 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 470 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1548, 1547, - /* 480 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 490 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 500 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 510 */ 1447, 1447, 1447, 1447, 1447, 1447, 1719, 1447, 1447, 1447, - /* 520 */ 1447, 1447, 1447, 1447, 1447, 1447, 1882, 1447, 1447, 1447, - /* 530 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 540 */ 1447, 1447, 1447, 1760, 1447, 1899, 1447, 1859, 1855, 1447, - /* 550 */ 1447, 1851, 1759, 1447, 1447, 1915, 1447, 1447, 1447, 1447, - /* 560 */ 1447, 1447, 1447, 1447, 1447, 1844, 1447, 1817, 1802, 1447, - /* 570 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1771, - /* 580 */ 1447, 1447, 1447, 1447, 1447, 1611, 1447, 1447, 1447, 1447, - /* 590 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1596, 1594, - /* 600 */ 1593, 1592, 1447, 1589, 1447, 1447, 1447, 1447, 1620, 1619, - /* 610 */ 1447, 1447, 1447, 1447, 1447, 1447, 1540, 1447, 1447, 1447, - /* 620 */ 1447, 1447, 1447, 1447, 1447, 1447, 1531, 1447, 1530, 1447, - /* 630 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 640 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 650 */ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, - /* 660 */ 1447, + /* 0 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 10 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 20 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 30 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 40 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 50 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 60 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 70 */ 1453, 1453, 1526, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 80 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1524, 1679, 1453, + /* 90 */ 1856, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 100 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 110 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1526, 1453, 1524, + /* 120 */ 1868, 1868, 1868, 1453, 1453, 1453, 1723, 1723, 1453, 1453, + /* 130 */ 1453, 1453, 1622, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 140 */ 1453, 1715, 1453, 1453, 1937, 1453, 1453, 1721, 1891, 1453, + /* 150 */ 1453, 1453, 1453, 1575, 1883, 1860, 1874, 1861, 1858, 1922, + /* 160 */ 1922, 1922, 1877, 1453, 1591, 1887, 1453, 1453, 1453, 1707, + /* 170 */ 1453, 1453, 1684, 1681, 1681, 1453, 1453, 1453, 1453, 1453, + /* 180 */ 1526, 1453, 1526, 1453, 1453, 1526, 1453, 1526, 1453, 1526, + /* 190 */ 1526, 1453, 1526, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 200 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1524, + /* 210 */ 1717, 1453, 1524, 1453, 1453, 1453, 1524, 1896, 1453, 1453, + /* 220 */ 1453, 1453, 1896, 1453, 1453, 1453, 1453, 1524, 1453, 1524, + /* 230 */ 1453, 1453, 1453, 1898, 1896, 1453, 1453, 1898, 1896, 1453, + /* 240 */ 1453, 1453, 1910, 1906, 1898, 1914, 1912, 1889, 1887, 1874, + /* 250 */ 1453, 1453, 1928, 1924, 1940, 1928, 1924, 1928, 1924, 1453, + /* 260 */ 1591, 1453, 1453, 1453, 1524, 1485, 1453, 1709, 1723, 1625, + /* 270 */ 1625, 1625, 1527, 1458, 1453, 1453, 1453, 1453, 1453, 1453, + /* 280 */ 1453, 1453, 1453, 1453, 1453, 1453, 1794, 1909, 1908, 1832, + /* 290 */ 1831, 1830, 1828, 1793, 1453, 1587, 1792, 1791, 1453, 1453, + /* 300 */ 1453, 1453, 1453, 1453, 1453, 1453, 1785, 1786, 1784, 1783, + /* 310 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 320 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 330 */ 1857, 1453, 1925, 1929, 1453, 1453, 1453, 1768, 1453, 1453, + /* 340 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 350 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 360 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 370 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 380 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 390 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 400 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 410 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 420 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 430 */ 1453, 1490, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 440 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 450 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 460 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 470 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1556, 1555, + /* 480 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 490 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 500 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 510 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1727, 1453, 1453, + /* 520 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1890, 1453, 1453, + /* 530 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 540 */ 1453, 1453, 1453, 1453, 1768, 1453, 1907, 1453, 1867, 1863, + /* 550 */ 1453, 1453, 1859, 1767, 1453, 1453, 1923, 1453, 1453, 1453, + /* 560 */ 1453, 1453, 1453, 1453, 1453, 1453, 1852, 1453, 1825, 1810, + /* 570 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 580 */ 1779, 1453, 1453, 1453, 1453, 1453, 1619, 1453, 1453, 1453, + /* 590 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1604, + /* 600 */ 1602, 1601, 1600, 1453, 1597, 1453, 1453, 1453, 1453, 1628, + /* 610 */ 1627, 1453, 1453, 1453, 1453, 1453, 1453, 1547, 1453, 1453, + /* 620 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1538, 1453, 1537, + /* 630 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 640 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 650 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, + /* 660 */ 1453, 1453, 1453, }; /********** End of lemon-generated parsing tables *****************************/ @@ -951,6 +949,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* EXISTS => nothing */ 0, /* BUFFER => nothing */ 0, /* CACHELAST => nothing */ + 0, /* CACHELASTSIZE => nothing */ 0, /* COMP => nothing */ 0, /* DURATION => nothing */ 0, /* NK_VARIABLE => nothing */ @@ -1135,11 +1134,11 @@ static const YYCODETYPE yyFallback[] = { 0, /* ASC => nothing */ 0, /* NULLS => nothing */ 0, /* ID => nothing */ - 247, /* NK_BITNOT => ID */ - 247, /* VALUES => ID */ - 247, /* IMPORT => ID */ - 247, /* NK_SEMI => ID */ - 247, /* FILE => ID */ + 248, /* NK_BITNOT => ID */ + 248, /* VALUES => ID */ + 248, /* IMPORT => ID */ + 248, /* NK_SEMI => ID */ + 248, /* FILE => ID */ }; #endif /* YYFALLBACK */ @@ -1291,318 +1290,319 @@ static const char *const yyTokenName[] = { /* 61 */ "EXISTS", /* 62 */ "BUFFER", /* 63 */ "CACHELAST", - /* 64 */ "COMP", - /* 65 */ "DURATION", - /* 66 */ "NK_VARIABLE", - /* 67 */ "FSYNC", - /* 68 */ "MAXROWS", - /* 69 */ "MINROWS", - /* 70 */ "KEEP", - /* 71 */ "PAGES", - /* 72 */ "PAGESIZE", - /* 73 */ "PRECISION", - /* 74 */ "REPLICA", - /* 75 */ "STRICT", - /* 76 */ "WAL", - /* 77 */ "VGROUPS", - /* 78 */ "SINGLE_STABLE", - /* 79 */ "RETENTIONS", - /* 80 */ "SCHEMALESS", - /* 81 */ "NK_COLON", - /* 82 */ "TABLE", - /* 83 */ "NK_LP", - /* 84 */ "NK_RP", - /* 85 */ "STABLE", - /* 86 */ "ADD", - /* 87 */ "COLUMN", - /* 88 */ "MODIFY", - /* 89 */ "RENAME", - /* 90 */ "TAG", - /* 91 */ "SET", - /* 92 */ "NK_EQ", - /* 93 */ "USING", - /* 94 */ "TAGS", - /* 95 */ "COMMENT", - /* 96 */ "BOOL", - /* 97 */ "TINYINT", - /* 98 */ "SMALLINT", - /* 99 */ "INT", - /* 100 */ "INTEGER", - /* 101 */ "BIGINT", - /* 102 */ "FLOAT", - /* 103 */ "DOUBLE", - /* 104 */ "BINARY", - /* 105 */ "TIMESTAMP", - /* 106 */ "NCHAR", - /* 107 */ "UNSIGNED", - /* 108 */ "JSON", - /* 109 */ "VARCHAR", - /* 110 */ "MEDIUMBLOB", - /* 111 */ "BLOB", - /* 112 */ "VARBINARY", - /* 113 */ "DECIMAL", - /* 114 */ "MAX_DELAY", - /* 115 */ "WATERMARK", - /* 116 */ "ROLLUP", - /* 117 */ "TTL", - /* 118 */ "SMA", - /* 119 */ "FIRST", - /* 120 */ "LAST", - /* 121 */ "SHOW", - /* 122 */ "DATABASES", - /* 123 */ "TABLES", - /* 124 */ "STABLES", - /* 125 */ "MNODES", - /* 126 */ "MODULES", - /* 127 */ "QNODES", - /* 128 */ "FUNCTIONS", - /* 129 */ "INDEXES", - /* 130 */ "ACCOUNTS", - /* 131 */ "APPS", - /* 132 */ "CONNECTIONS", - /* 133 */ "LICENCE", - /* 134 */ "GRANTS", - /* 135 */ "QUERIES", - /* 136 */ "SCORES", - /* 137 */ "TOPICS", - /* 138 */ "VARIABLES", - /* 139 */ "BNODES", - /* 140 */ "SNODES", - /* 141 */ "CLUSTER", - /* 142 */ "TRANSACTIONS", - /* 143 */ "DISTRIBUTED", - /* 144 */ "CONSUMERS", - /* 145 */ "SUBSCRIPTIONS", - /* 146 */ "LIKE", - /* 147 */ "INDEX", - /* 148 */ "FUNCTION", - /* 149 */ "INTERVAL", - /* 150 */ "TOPIC", - /* 151 */ "AS", - /* 152 */ "WITH", - /* 153 */ "META", - /* 154 */ "CONSUMER", - /* 155 */ "GROUP", - /* 156 */ "DESC", - /* 157 */ "DESCRIBE", - /* 158 */ "RESET", - /* 159 */ "QUERY", - /* 160 */ "CACHE", - /* 161 */ "EXPLAIN", - /* 162 */ "ANALYZE", - /* 163 */ "VERBOSE", - /* 164 */ "NK_BOOL", - /* 165 */ "RATIO", - /* 166 */ "NK_FLOAT", - /* 167 */ "COMPACT", - /* 168 */ "VNODES", - /* 169 */ "IN", - /* 170 */ "OUTPUTTYPE", - /* 171 */ "AGGREGATE", - /* 172 */ "BUFSIZE", - /* 173 */ "STREAM", - /* 174 */ "INTO", - /* 175 */ "TRIGGER", - /* 176 */ "AT_ONCE", - /* 177 */ "WINDOW_CLOSE", - /* 178 */ "IGNORE", - /* 179 */ "EXPIRED", - /* 180 */ "KILL", - /* 181 */ "CONNECTION", - /* 182 */ "TRANSACTION", - /* 183 */ "BALANCE", - /* 184 */ "VGROUP", - /* 185 */ "MERGE", - /* 186 */ "REDISTRIBUTE", - /* 187 */ "SPLIT", - /* 188 */ "SYNCDB", - /* 189 */ "DELETE", - /* 190 */ "INSERT", - /* 191 */ "NULL", - /* 192 */ "NK_QUESTION", - /* 193 */ "NK_ARROW", - /* 194 */ "ROWTS", - /* 195 */ "TBNAME", - /* 196 */ "QSTARTTS", - /* 197 */ "QENDTS", - /* 198 */ "WSTARTTS", - /* 199 */ "WENDTS", - /* 200 */ "WDURATION", - /* 201 */ "CAST", - /* 202 */ "NOW", - /* 203 */ "TODAY", - /* 204 */ "TIMEZONE", - /* 205 */ "CLIENT_VERSION", - /* 206 */ "SERVER_VERSION", - /* 207 */ "SERVER_STATUS", - /* 208 */ "CURRENT_USER", - /* 209 */ "COUNT", - /* 210 */ "LAST_ROW", - /* 211 */ "BETWEEN", - /* 212 */ "IS", - /* 213 */ "NK_LT", - /* 214 */ "NK_GT", - /* 215 */ "NK_LE", - /* 216 */ "NK_GE", - /* 217 */ "NK_NE", - /* 218 */ "MATCH", - /* 219 */ "NMATCH", - /* 220 */ "CONTAINS", - /* 221 */ "JOIN", - /* 222 */ "INNER", - /* 223 */ "SELECT", - /* 224 */ "DISTINCT", - /* 225 */ "WHERE", - /* 226 */ "PARTITION", - /* 227 */ "BY", - /* 228 */ "SESSION", - /* 229 */ "STATE_WINDOW", - /* 230 */ "SLIDING", - /* 231 */ "FILL", - /* 232 */ "VALUE", - /* 233 */ "NONE", - /* 234 */ "PREV", - /* 235 */ "LINEAR", - /* 236 */ "NEXT", - /* 237 */ "HAVING", - /* 238 */ "RANGE", - /* 239 */ "EVERY", - /* 240 */ "ORDER", - /* 241 */ "SLIMIT", - /* 242 */ "SOFFSET", - /* 243 */ "LIMIT", - /* 244 */ "OFFSET", - /* 245 */ "ASC", - /* 246 */ "NULLS", - /* 247 */ "ID", - /* 248 */ "NK_BITNOT", - /* 249 */ "VALUES", - /* 250 */ "IMPORT", - /* 251 */ "NK_SEMI", - /* 252 */ "FILE", - /* 253 */ "cmd", - /* 254 */ "account_options", - /* 255 */ "alter_account_options", - /* 256 */ "literal", - /* 257 */ "alter_account_option", - /* 258 */ "user_name", - /* 259 */ "sysinfo_opt", - /* 260 */ "privileges", - /* 261 */ "priv_level", - /* 262 */ "priv_type_list", - /* 263 */ "priv_type", - /* 264 */ "db_name", - /* 265 */ "dnode_endpoint", - /* 266 */ "not_exists_opt", - /* 267 */ "db_options", - /* 268 */ "exists_opt", - /* 269 */ "alter_db_options", - /* 270 */ "integer_list", - /* 271 */ "variable_list", - /* 272 */ "retention_list", - /* 273 */ "alter_db_option", - /* 274 */ "retention", - /* 275 */ "full_table_name", - /* 276 */ "column_def_list", - /* 277 */ "tags_def_opt", - /* 278 */ "table_options", - /* 279 */ "multi_create_clause", - /* 280 */ "tags_def", - /* 281 */ "multi_drop_clause", - /* 282 */ "alter_table_clause", - /* 283 */ "alter_table_options", - /* 284 */ "column_name", - /* 285 */ "type_name", - /* 286 */ "signed_literal", - /* 287 */ "create_subtable_clause", - /* 288 */ "specific_cols_opt", - /* 289 */ "expression_list", - /* 290 */ "drop_table_clause", - /* 291 */ "col_name_list", - /* 292 */ "table_name", - /* 293 */ "column_def", - /* 294 */ "duration_list", - /* 295 */ "rollup_func_list", - /* 296 */ "alter_table_option", - /* 297 */ "duration_literal", - /* 298 */ "rollup_func_name", - /* 299 */ "function_name", - /* 300 */ "col_name", - /* 301 */ "db_name_cond_opt", - /* 302 */ "like_pattern_opt", - /* 303 */ "table_name_cond", - /* 304 */ "from_db_opt", - /* 305 */ "index_name", - /* 306 */ "index_options", - /* 307 */ "func_list", - /* 308 */ "sliding_opt", - /* 309 */ "sma_stream_opt", - /* 310 */ "func", - /* 311 */ "stream_options", - /* 312 */ "topic_name", - /* 313 */ "query_expression", - /* 314 */ "cgroup_name", - /* 315 */ "analyze_opt", - /* 316 */ "explain_options", - /* 317 */ "agg_func_opt", - /* 318 */ "bufsize_opt", - /* 319 */ "stream_name", - /* 320 */ "into_opt", - /* 321 */ "dnode_list", - /* 322 */ "where_clause_opt", - /* 323 */ "signed", - /* 324 */ "literal_func", - /* 325 */ "literal_list", - /* 326 */ "table_alias", - /* 327 */ "column_alias", - /* 328 */ "expression", - /* 329 */ "pseudo_column", - /* 330 */ "column_reference", - /* 331 */ "function_expression", - /* 332 */ "subquery", - /* 333 */ "star_func", - /* 334 */ "star_func_para_list", - /* 335 */ "noarg_func", - /* 336 */ "other_para_list", - /* 337 */ "star_func_para", - /* 338 */ "predicate", - /* 339 */ "compare_op", - /* 340 */ "in_op", - /* 341 */ "in_predicate_value", - /* 342 */ "boolean_value_expression", - /* 343 */ "boolean_primary", - /* 344 */ "common_expression", - /* 345 */ "from_clause_opt", - /* 346 */ "table_reference_list", - /* 347 */ "table_reference", - /* 348 */ "table_primary", - /* 349 */ "joined_table", - /* 350 */ "alias_opt", - /* 351 */ "parenthesized_joined_table", - /* 352 */ "join_type", - /* 353 */ "search_condition", - /* 354 */ "query_specification", - /* 355 */ "set_quantifier_opt", - /* 356 */ "select_list", - /* 357 */ "partition_by_clause_opt", - /* 358 */ "range_opt", - /* 359 */ "every_opt", - /* 360 */ "fill_opt", - /* 361 */ "twindow_clause_opt", - /* 362 */ "group_by_clause_opt", - /* 363 */ "having_clause_opt", - /* 364 */ "select_item", - /* 365 */ "fill_mode", - /* 366 */ "group_by_list", - /* 367 */ "query_expression_body", - /* 368 */ "order_by_clause_opt", - /* 369 */ "slimit_clause_opt", - /* 370 */ "limit_clause_opt", - /* 371 */ "query_primary", - /* 372 */ "sort_specification_list", - /* 373 */ "sort_specification", - /* 374 */ "ordering_specification_opt", - /* 375 */ "null_ordering_opt", + /* 64 */ "CACHELASTSIZE", + /* 65 */ "COMP", + /* 66 */ "DURATION", + /* 67 */ "NK_VARIABLE", + /* 68 */ "FSYNC", + /* 69 */ "MAXROWS", + /* 70 */ "MINROWS", + /* 71 */ "KEEP", + /* 72 */ "PAGES", + /* 73 */ "PAGESIZE", + /* 74 */ "PRECISION", + /* 75 */ "REPLICA", + /* 76 */ "STRICT", + /* 77 */ "WAL", + /* 78 */ "VGROUPS", + /* 79 */ "SINGLE_STABLE", + /* 80 */ "RETENTIONS", + /* 81 */ "SCHEMALESS", + /* 82 */ "NK_COLON", + /* 83 */ "TABLE", + /* 84 */ "NK_LP", + /* 85 */ "NK_RP", + /* 86 */ "STABLE", + /* 87 */ "ADD", + /* 88 */ "COLUMN", + /* 89 */ "MODIFY", + /* 90 */ "RENAME", + /* 91 */ "TAG", + /* 92 */ "SET", + /* 93 */ "NK_EQ", + /* 94 */ "USING", + /* 95 */ "TAGS", + /* 96 */ "COMMENT", + /* 97 */ "BOOL", + /* 98 */ "TINYINT", + /* 99 */ "SMALLINT", + /* 100 */ "INT", + /* 101 */ "INTEGER", + /* 102 */ "BIGINT", + /* 103 */ "FLOAT", + /* 104 */ "DOUBLE", + /* 105 */ "BINARY", + /* 106 */ "TIMESTAMP", + /* 107 */ "NCHAR", + /* 108 */ "UNSIGNED", + /* 109 */ "JSON", + /* 110 */ "VARCHAR", + /* 111 */ "MEDIUMBLOB", + /* 112 */ "BLOB", + /* 113 */ "VARBINARY", + /* 114 */ "DECIMAL", + /* 115 */ "MAX_DELAY", + /* 116 */ "WATERMARK", + /* 117 */ "ROLLUP", + /* 118 */ "TTL", + /* 119 */ "SMA", + /* 120 */ "FIRST", + /* 121 */ "LAST", + /* 122 */ "SHOW", + /* 123 */ "DATABASES", + /* 124 */ "TABLES", + /* 125 */ "STABLES", + /* 126 */ "MNODES", + /* 127 */ "MODULES", + /* 128 */ "QNODES", + /* 129 */ "FUNCTIONS", + /* 130 */ "INDEXES", + /* 131 */ "ACCOUNTS", + /* 132 */ "APPS", + /* 133 */ "CONNECTIONS", + /* 134 */ "LICENCE", + /* 135 */ "GRANTS", + /* 136 */ "QUERIES", + /* 137 */ "SCORES", + /* 138 */ "TOPICS", + /* 139 */ "VARIABLES", + /* 140 */ "BNODES", + /* 141 */ "SNODES", + /* 142 */ "CLUSTER", + /* 143 */ "TRANSACTIONS", + /* 144 */ "DISTRIBUTED", + /* 145 */ "CONSUMERS", + /* 146 */ "SUBSCRIPTIONS", + /* 147 */ "LIKE", + /* 148 */ "INDEX", + /* 149 */ "FUNCTION", + /* 150 */ "INTERVAL", + /* 151 */ "TOPIC", + /* 152 */ "AS", + /* 153 */ "WITH", + /* 154 */ "META", + /* 155 */ "CONSUMER", + /* 156 */ "GROUP", + /* 157 */ "DESC", + /* 158 */ "DESCRIBE", + /* 159 */ "RESET", + /* 160 */ "QUERY", + /* 161 */ "CACHE", + /* 162 */ "EXPLAIN", + /* 163 */ "ANALYZE", + /* 164 */ "VERBOSE", + /* 165 */ "NK_BOOL", + /* 166 */ "RATIO", + /* 167 */ "NK_FLOAT", + /* 168 */ "COMPACT", + /* 169 */ "VNODES", + /* 170 */ "IN", + /* 171 */ "OUTPUTTYPE", + /* 172 */ "AGGREGATE", + /* 173 */ "BUFSIZE", + /* 174 */ "STREAM", + /* 175 */ "INTO", + /* 176 */ "TRIGGER", + /* 177 */ "AT_ONCE", + /* 178 */ "WINDOW_CLOSE", + /* 179 */ "IGNORE", + /* 180 */ "EXPIRED", + /* 181 */ "KILL", + /* 182 */ "CONNECTION", + /* 183 */ "TRANSACTION", + /* 184 */ "BALANCE", + /* 185 */ "VGROUP", + /* 186 */ "MERGE", + /* 187 */ "REDISTRIBUTE", + /* 188 */ "SPLIT", + /* 189 */ "SYNCDB", + /* 190 */ "DELETE", + /* 191 */ "INSERT", + /* 192 */ "NULL", + /* 193 */ "NK_QUESTION", + /* 194 */ "NK_ARROW", + /* 195 */ "ROWTS", + /* 196 */ "TBNAME", + /* 197 */ "QSTARTTS", + /* 198 */ "QENDTS", + /* 199 */ "WSTARTTS", + /* 200 */ "WENDTS", + /* 201 */ "WDURATION", + /* 202 */ "CAST", + /* 203 */ "NOW", + /* 204 */ "TODAY", + /* 205 */ "TIMEZONE", + /* 206 */ "CLIENT_VERSION", + /* 207 */ "SERVER_VERSION", + /* 208 */ "SERVER_STATUS", + /* 209 */ "CURRENT_USER", + /* 210 */ "COUNT", + /* 211 */ "LAST_ROW", + /* 212 */ "BETWEEN", + /* 213 */ "IS", + /* 214 */ "NK_LT", + /* 215 */ "NK_GT", + /* 216 */ "NK_LE", + /* 217 */ "NK_GE", + /* 218 */ "NK_NE", + /* 219 */ "MATCH", + /* 220 */ "NMATCH", + /* 221 */ "CONTAINS", + /* 222 */ "JOIN", + /* 223 */ "INNER", + /* 224 */ "SELECT", + /* 225 */ "DISTINCT", + /* 226 */ "WHERE", + /* 227 */ "PARTITION", + /* 228 */ "BY", + /* 229 */ "SESSION", + /* 230 */ "STATE_WINDOW", + /* 231 */ "SLIDING", + /* 232 */ "FILL", + /* 233 */ "VALUE", + /* 234 */ "NONE", + /* 235 */ "PREV", + /* 236 */ "LINEAR", + /* 237 */ "NEXT", + /* 238 */ "HAVING", + /* 239 */ "RANGE", + /* 240 */ "EVERY", + /* 241 */ "ORDER", + /* 242 */ "SLIMIT", + /* 243 */ "SOFFSET", + /* 244 */ "LIMIT", + /* 245 */ "OFFSET", + /* 246 */ "ASC", + /* 247 */ "NULLS", + /* 248 */ "ID", + /* 249 */ "NK_BITNOT", + /* 250 */ "VALUES", + /* 251 */ "IMPORT", + /* 252 */ "NK_SEMI", + /* 253 */ "FILE", + /* 254 */ "cmd", + /* 255 */ "account_options", + /* 256 */ "alter_account_options", + /* 257 */ "literal", + /* 258 */ "alter_account_option", + /* 259 */ "user_name", + /* 260 */ "sysinfo_opt", + /* 261 */ "privileges", + /* 262 */ "priv_level", + /* 263 */ "priv_type_list", + /* 264 */ "priv_type", + /* 265 */ "db_name", + /* 266 */ "dnode_endpoint", + /* 267 */ "not_exists_opt", + /* 268 */ "db_options", + /* 269 */ "exists_opt", + /* 270 */ "alter_db_options", + /* 271 */ "integer_list", + /* 272 */ "variable_list", + /* 273 */ "retention_list", + /* 274 */ "alter_db_option", + /* 275 */ "retention", + /* 276 */ "full_table_name", + /* 277 */ "column_def_list", + /* 278 */ "tags_def_opt", + /* 279 */ "table_options", + /* 280 */ "multi_create_clause", + /* 281 */ "tags_def", + /* 282 */ "multi_drop_clause", + /* 283 */ "alter_table_clause", + /* 284 */ "alter_table_options", + /* 285 */ "column_name", + /* 286 */ "type_name", + /* 287 */ "signed_literal", + /* 288 */ "create_subtable_clause", + /* 289 */ "specific_cols_opt", + /* 290 */ "expression_list", + /* 291 */ "drop_table_clause", + /* 292 */ "col_name_list", + /* 293 */ "table_name", + /* 294 */ "column_def", + /* 295 */ "duration_list", + /* 296 */ "rollup_func_list", + /* 297 */ "alter_table_option", + /* 298 */ "duration_literal", + /* 299 */ "rollup_func_name", + /* 300 */ "function_name", + /* 301 */ "col_name", + /* 302 */ "db_name_cond_opt", + /* 303 */ "like_pattern_opt", + /* 304 */ "table_name_cond", + /* 305 */ "from_db_opt", + /* 306 */ "index_name", + /* 307 */ "index_options", + /* 308 */ "func_list", + /* 309 */ "sliding_opt", + /* 310 */ "sma_stream_opt", + /* 311 */ "func", + /* 312 */ "stream_options", + /* 313 */ "topic_name", + /* 314 */ "query_expression", + /* 315 */ "cgroup_name", + /* 316 */ "analyze_opt", + /* 317 */ "explain_options", + /* 318 */ "agg_func_opt", + /* 319 */ "bufsize_opt", + /* 320 */ "stream_name", + /* 321 */ "into_opt", + /* 322 */ "dnode_list", + /* 323 */ "where_clause_opt", + /* 324 */ "signed", + /* 325 */ "literal_func", + /* 326 */ "literal_list", + /* 327 */ "table_alias", + /* 328 */ "column_alias", + /* 329 */ "expression", + /* 330 */ "pseudo_column", + /* 331 */ "column_reference", + /* 332 */ "function_expression", + /* 333 */ "subquery", + /* 334 */ "star_func", + /* 335 */ "star_func_para_list", + /* 336 */ "noarg_func", + /* 337 */ "other_para_list", + /* 338 */ "star_func_para", + /* 339 */ "predicate", + /* 340 */ "compare_op", + /* 341 */ "in_op", + /* 342 */ "in_predicate_value", + /* 343 */ "boolean_value_expression", + /* 344 */ "boolean_primary", + /* 345 */ "common_expression", + /* 346 */ "from_clause_opt", + /* 347 */ "table_reference_list", + /* 348 */ "table_reference", + /* 349 */ "table_primary", + /* 350 */ "joined_table", + /* 351 */ "alias_opt", + /* 352 */ "parenthesized_joined_table", + /* 353 */ "join_type", + /* 354 */ "search_condition", + /* 355 */ "query_specification", + /* 356 */ "set_quantifier_opt", + /* 357 */ "select_list", + /* 358 */ "partition_by_clause_opt", + /* 359 */ "range_opt", + /* 360 */ "every_opt", + /* 361 */ "fill_opt", + /* 362 */ "twindow_clause_opt", + /* 363 */ "group_by_clause_opt", + /* 364 */ "having_clause_opt", + /* 365 */ "select_item", + /* 366 */ "fill_mode", + /* 367 */ "group_by_list", + /* 368 */ "query_expression_body", + /* 369 */ "order_by_clause_opt", + /* 370 */ "slimit_clause_opt", + /* 371 */ "limit_clause_opt", + /* 372 */ "query_primary", + /* 373 */ "sort_specification_list", + /* 374 */ "sort_specification", + /* 375 */ "ordering_specification_opt", + /* 376 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -1684,417 +1684,419 @@ static const char *const yyRuleName[] = { /* 71 */ "db_options ::=", /* 72 */ "db_options ::= db_options BUFFER NK_INTEGER", /* 73 */ "db_options ::= db_options CACHELAST NK_INTEGER", - /* 74 */ "db_options ::= db_options COMP NK_INTEGER", - /* 75 */ "db_options ::= db_options DURATION NK_INTEGER", - /* 76 */ "db_options ::= db_options DURATION NK_VARIABLE", - /* 77 */ "db_options ::= db_options FSYNC NK_INTEGER", - /* 78 */ "db_options ::= db_options MAXROWS NK_INTEGER", - /* 79 */ "db_options ::= db_options MINROWS NK_INTEGER", - /* 80 */ "db_options ::= db_options KEEP integer_list", - /* 81 */ "db_options ::= db_options KEEP variable_list", - /* 82 */ "db_options ::= db_options PAGES NK_INTEGER", - /* 83 */ "db_options ::= db_options PAGESIZE NK_INTEGER", - /* 84 */ "db_options ::= db_options PRECISION NK_STRING", - /* 85 */ "db_options ::= db_options REPLICA NK_INTEGER", - /* 86 */ "db_options ::= db_options STRICT NK_INTEGER", - /* 87 */ "db_options ::= db_options WAL NK_INTEGER", - /* 88 */ "db_options ::= db_options VGROUPS NK_INTEGER", - /* 89 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", - /* 90 */ "db_options ::= db_options RETENTIONS retention_list", - /* 91 */ "db_options ::= db_options SCHEMALESS NK_INTEGER", - /* 92 */ "alter_db_options ::= alter_db_option", - /* 93 */ "alter_db_options ::= alter_db_options alter_db_option", - /* 94 */ "alter_db_option ::= BUFFER NK_INTEGER", - /* 95 */ "alter_db_option ::= CACHELAST NK_INTEGER", - /* 96 */ "alter_db_option ::= FSYNC NK_INTEGER", - /* 97 */ "alter_db_option ::= KEEP integer_list", - /* 98 */ "alter_db_option ::= KEEP variable_list", - /* 99 */ "alter_db_option ::= PAGES NK_INTEGER", - /* 100 */ "alter_db_option ::= REPLICA NK_INTEGER", - /* 101 */ "alter_db_option ::= STRICT NK_INTEGER", - /* 102 */ "alter_db_option ::= WAL NK_INTEGER", - /* 103 */ "integer_list ::= NK_INTEGER", - /* 104 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", - /* 105 */ "variable_list ::= NK_VARIABLE", - /* 106 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", - /* 107 */ "retention_list ::= retention", - /* 108 */ "retention_list ::= retention_list NK_COMMA retention", - /* 109 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", - /* 110 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", - /* 111 */ "cmd ::= CREATE TABLE multi_create_clause", - /* 112 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", - /* 113 */ "cmd ::= DROP TABLE multi_drop_clause", - /* 114 */ "cmd ::= DROP STABLE exists_opt full_table_name", - /* 115 */ "cmd ::= ALTER TABLE alter_table_clause", - /* 116 */ "cmd ::= ALTER STABLE alter_table_clause", - /* 117 */ "alter_table_clause ::= full_table_name alter_table_options", - /* 118 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", - /* 119 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", - /* 120 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", - /* 121 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", - /* 122 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", - /* 123 */ "alter_table_clause ::= full_table_name DROP TAG column_name", - /* 124 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", - /* 125 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", - /* 126 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", - /* 127 */ "multi_create_clause ::= create_subtable_clause", - /* 128 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", - /* 129 */ "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", - /* 130 */ "multi_drop_clause ::= drop_table_clause", - /* 131 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", - /* 132 */ "drop_table_clause ::= exists_opt full_table_name", - /* 133 */ "specific_cols_opt ::=", - /* 134 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", - /* 135 */ "full_table_name ::= table_name", - /* 136 */ "full_table_name ::= db_name NK_DOT table_name", - /* 137 */ "column_def_list ::= column_def", - /* 138 */ "column_def_list ::= column_def_list NK_COMMA column_def", - /* 139 */ "column_def ::= column_name type_name", - /* 140 */ "column_def ::= column_name type_name COMMENT NK_STRING", - /* 141 */ "type_name ::= BOOL", - /* 142 */ "type_name ::= TINYINT", - /* 143 */ "type_name ::= SMALLINT", - /* 144 */ "type_name ::= INT", - /* 145 */ "type_name ::= INTEGER", - /* 146 */ "type_name ::= BIGINT", - /* 147 */ "type_name ::= FLOAT", - /* 148 */ "type_name ::= DOUBLE", - /* 149 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", - /* 150 */ "type_name ::= TIMESTAMP", - /* 151 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", - /* 152 */ "type_name ::= TINYINT UNSIGNED", - /* 153 */ "type_name ::= SMALLINT UNSIGNED", - /* 154 */ "type_name ::= INT UNSIGNED", - /* 155 */ "type_name ::= BIGINT UNSIGNED", - /* 156 */ "type_name ::= JSON", - /* 157 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", - /* 158 */ "type_name ::= MEDIUMBLOB", - /* 159 */ "type_name ::= BLOB", - /* 160 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", - /* 161 */ "type_name ::= DECIMAL", - /* 162 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", - /* 163 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", - /* 164 */ "tags_def_opt ::=", - /* 165 */ "tags_def_opt ::= tags_def", - /* 166 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", - /* 167 */ "table_options ::=", - /* 168 */ "table_options ::= table_options COMMENT NK_STRING", - /* 169 */ "table_options ::= table_options MAX_DELAY duration_list", - /* 170 */ "table_options ::= table_options WATERMARK duration_list", - /* 171 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", - /* 172 */ "table_options ::= table_options TTL NK_INTEGER", - /* 173 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", - /* 174 */ "alter_table_options ::= alter_table_option", - /* 175 */ "alter_table_options ::= alter_table_options alter_table_option", - /* 176 */ "alter_table_option ::= COMMENT NK_STRING", - /* 177 */ "alter_table_option ::= TTL NK_INTEGER", - /* 178 */ "duration_list ::= duration_literal", - /* 179 */ "duration_list ::= duration_list NK_COMMA duration_literal", - /* 180 */ "rollup_func_list ::= rollup_func_name", - /* 181 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", - /* 182 */ "rollup_func_name ::= function_name", - /* 183 */ "rollup_func_name ::= FIRST", - /* 184 */ "rollup_func_name ::= LAST", - /* 185 */ "col_name_list ::= col_name", - /* 186 */ "col_name_list ::= col_name_list NK_COMMA col_name", - /* 187 */ "col_name ::= column_name", - /* 188 */ "cmd ::= SHOW DNODES", - /* 189 */ "cmd ::= SHOW USERS", - /* 190 */ "cmd ::= SHOW DATABASES", - /* 191 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", - /* 192 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", - /* 193 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", - /* 194 */ "cmd ::= SHOW MNODES", - /* 195 */ "cmd ::= SHOW MODULES", - /* 196 */ "cmd ::= SHOW QNODES", - /* 197 */ "cmd ::= SHOW FUNCTIONS", - /* 198 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", - /* 199 */ "cmd ::= SHOW STREAMS", - /* 200 */ "cmd ::= SHOW ACCOUNTS", - /* 201 */ "cmd ::= SHOW APPS", - /* 202 */ "cmd ::= SHOW CONNECTIONS", - /* 203 */ "cmd ::= SHOW LICENCE", - /* 204 */ "cmd ::= SHOW GRANTS", - /* 205 */ "cmd ::= SHOW CREATE DATABASE db_name", - /* 206 */ "cmd ::= SHOW CREATE TABLE full_table_name", - /* 207 */ "cmd ::= SHOW CREATE STABLE full_table_name", - /* 208 */ "cmd ::= SHOW QUERIES", - /* 209 */ "cmd ::= SHOW SCORES", - /* 210 */ "cmd ::= SHOW TOPICS", - /* 211 */ "cmd ::= SHOW VARIABLES", - /* 212 */ "cmd ::= SHOW LOCAL VARIABLES", - /* 213 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", - /* 214 */ "cmd ::= SHOW BNODES", - /* 215 */ "cmd ::= SHOW SNODES", - /* 216 */ "cmd ::= SHOW CLUSTER", - /* 217 */ "cmd ::= SHOW TRANSACTIONS", - /* 218 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", - /* 219 */ "cmd ::= SHOW CONSUMERS", - /* 220 */ "cmd ::= SHOW SUBSCRIPTIONS", - /* 221 */ "db_name_cond_opt ::=", - /* 222 */ "db_name_cond_opt ::= db_name NK_DOT", - /* 223 */ "like_pattern_opt ::=", - /* 224 */ "like_pattern_opt ::= LIKE NK_STRING", - /* 225 */ "table_name_cond ::= table_name", - /* 226 */ "from_db_opt ::=", - /* 227 */ "from_db_opt ::= FROM db_name", - /* 228 */ "cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options", - /* 229 */ "cmd ::= DROP INDEX exists_opt index_name", - /* 230 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", - /* 231 */ "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", - /* 232 */ "func_list ::= func", - /* 233 */ "func_list ::= func_list NK_COMMA func", - /* 234 */ "func ::= function_name NK_LP expression_list NK_RP", - /* 235 */ "sma_stream_opt ::=", - /* 236 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", - /* 237 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", - /* 238 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", - /* 239 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", - /* 240 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", - /* 241 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", - /* 242 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", - /* 243 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 244 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", - /* 245 */ "cmd ::= DESC full_table_name", - /* 246 */ "cmd ::= DESCRIBE full_table_name", - /* 247 */ "cmd ::= RESET QUERY CACHE", - /* 248 */ "cmd ::= EXPLAIN analyze_opt explain_options query_expression", - /* 249 */ "analyze_opt ::=", - /* 250 */ "analyze_opt ::= ANALYZE", - /* 251 */ "explain_options ::=", - /* 252 */ "explain_options ::= explain_options VERBOSE NK_BOOL", - /* 253 */ "explain_options ::= explain_options RATIO NK_FLOAT", - /* 254 */ "cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP", - /* 255 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", - /* 256 */ "cmd ::= DROP FUNCTION exists_opt function_name", - /* 257 */ "agg_func_opt ::=", - /* 258 */ "agg_func_opt ::= AGGREGATE", - /* 259 */ "bufsize_opt ::=", - /* 260 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 261 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression", - /* 262 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 263 */ "into_opt ::=", - /* 264 */ "into_opt ::= INTO full_table_name", - /* 265 */ "stream_options ::=", - /* 266 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 267 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 268 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 269 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 270 */ "stream_options ::= stream_options IGNORE EXPIRED", - /* 271 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 272 */ "cmd ::= KILL QUERY NK_STRING", - /* 273 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 274 */ "cmd ::= BALANCE VGROUP", - /* 275 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 276 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 277 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 278 */ "dnode_list ::= DNODE NK_INTEGER", - /* 279 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 280 */ "cmd ::= SYNCDB db_name REPLICA", - /* 281 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 282 */ "cmd ::= query_expression", - /* 283 */ "cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression", - /* 284 */ "literal ::= NK_INTEGER", - /* 285 */ "literal ::= NK_FLOAT", - /* 286 */ "literal ::= NK_STRING", - /* 287 */ "literal ::= NK_BOOL", - /* 288 */ "literal ::= TIMESTAMP NK_STRING", - /* 289 */ "literal ::= duration_literal", - /* 290 */ "literal ::= NULL", - /* 291 */ "literal ::= NK_QUESTION", - /* 292 */ "duration_literal ::= NK_VARIABLE", - /* 293 */ "signed ::= NK_INTEGER", - /* 294 */ "signed ::= NK_PLUS NK_INTEGER", - /* 295 */ "signed ::= NK_MINUS NK_INTEGER", - /* 296 */ "signed ::= NK_FLOAT", - /* 297 */ "signed ::= NK_PLUS NK_FLOAT", - /* 298 */ "signed ::= NK_MINUS NK_FLOAT", - /* 299 */ "signed_literal ::= signed", - /* 300 */ "signed_literal ::= NK_STRING", - /* 301 */ "signed_literal ::= NK_BOOL", - /* 302 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 303 */ "signed_literal ::= duration_literal", - /* 304 */ "signed_literal ::= NULL", - /* 305 */ "signed_literal ::= literal_func", - /* 306 */ "literal_list ::= signed_literal", - /* 307 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 308 */ "db_name ::= NK_ID", - /* 309 */ "table_name ::= NK_ID", - /* 310 */ "column_name ::= NK_ID", - /* 311 */ "function_name ::= NK_ID", - /* 312 */ "table_alias ::= NK_ID", - /* 313 */ "column_alias ::= NK_ID", - /* 314 */ "user_name ::= NK_ID", - /* 315 */ "index_name ::= NK_ID", - /* 316 */ "topic_name ::= NK_ID", - /* 317 */ "stream_name ::= NK_ID", - /* 318 */ "cgroup_name ::= NK_ID", - /* 319 */ "expression ::= literal", - /* 320 */ "expression ::= pseudo_column", - /* 321 */ "expression ::= column_reference", - /* 322 */ "expression ::= function_expression", - /* 323 */ "expression ::= subquery", - /* 324 */ "expression ::= NK_LP expression NK_RP", - /* 325 */ "expression ::= NK_PLUS expression", - /* 326 */ "expression ::= NK_MINUS expression", - /* 327 */ "expression ::= expression NK_PLUS expression", - /* 328 */ "expression ::= expression NK_MINUS expression", - /* 329 */ "expression ::= expression NK_STAR expression", - /* 330 */ "expression ::= expression NK_SLASH expression", - /* 331 */ "expression ::= expression NK_REM expression", - /* 332 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 333 */ "expression ::= expression NK_BITAND expression", - /* 334 */ "expression ::= expression NK_BITOR expression", - /* 335 */ "expression_list ::= expression", - /* 336 */ "expression_list ::= expression_list NK_COMMA expression", - /* 337 */ "column_reference ::= column_name", - /* 338 */ "column_reference ::= table_name NK_DOT column_name", - /* 339 */ "pseudo_column ::= ROWTS", - /* 340 */ "pseudo_column ::= TBNAME", - /* 341 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 342 */ "pseudo_column ::= QSTARTTS", - /* 343 */ "pseudo_column ::= QENDTS", - /* 344 */ "pseudo_column ::= WSTARTTS", - /* 345 */ "pseudo_column ::= WENDTS", - /* 346 */ "pseudo_column ::= WDURATION", - /* 347 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 348 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 349 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", - /* 350 */ "function_expression ::= literal_func", - /* 351 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 352 */ "literal_func ::= NOW", - /* 353 */ "noarg_func ::= NOW", - /* 354 */ "noarg_func ::= TODAY", - /* 355 */ "noarg_func ::= TIMEZONE", - /* 356 */ "noarg_func ::= DATABASE", - /* 357 */ "noarg_func ::= CLIENT_VERSION", - /* 358 */ "noarg_func ::= SERVER_VERSION", - /* 359 */ "noarg_func ::= SERVER_STATUS", - /* 360 */ "noarg_func ::= CURRENT_USER", - /* 361 */ "noarg_func ::= USER", - /* 362 */ "star_func ::= COUNT", - /* 363 */ "star_func ::= FIRST", - /* 364 */ "star_func ::= LAST", - /* 365 */ "star_func ::= LAST_ROW", - /* 366 */ "star_func_para_list ::= NK_STAR", - /* 367 */ "star_func_para_list ::= other_para_list", - /* 368 */ "other_para_list ::= star_func_para", - /* 369 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 370 */ "star_func_para ::= expression", - /* 371 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 372 */ "predicate ::= expression compare_op expression", - /* 373 */ "predicate ::= expression BETWEEN expression AND expression", - /* 374 */ "predicate ::= expression NOT BETWEEN expression AND expression", - /* 375 */ "predicate ::= expression IS NULL", - /* 376 */ "predicate ::= expression IS NOT NULL", - /* 377 */ "predicate ::= expression in_op in_predicate_value", - /* 378 */ "compare_op ::= NK_LT", - /* 379 */ "compare_op ::= NK_GT", - /* 380 */ "compare_op ::= NK_LE", - /* 381 */ "compare_op ::= NK_GE", - /* 382 */ "compare_op ::= NK_NE", - /* 383 */ "compare_op ::= NK_EQ", - /* 384 */ "compare_op ::= LIKE", - /* 385 */ "compare_op ::= NOT LIKE", - /* 386 */ "compare_op ::= MATCH", - /* 387 */ "compare_op ::= NMATCH", - /* 388 */ "compare_op ::= CONTAINS", - /* 389 */ "in_op ::= IN", - /* 390 */ "in_op ::= NOT IN", - /* 391 */ "in_predicate_value ::= NK_LP expression_list NK_RP", - /* 392 */ "boolean_value_expression ::= boolean_primary", - /* 393 */ "boolean_value_expression ::= NOT boolean_primary", - /* 394 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 395 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 396 */ "boolean_primary ::= predicate", - /* 397 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 398 */ "common_expression ::= expression", - /* 399 */ "common_expression ::= boolean_value_expression", - /* 400 */ "from_clause_opt ::=", - /* 401 */ "from_clause_opt ::= FROM table_reference_list", - /* 402 */ "table_reference_list ::= table_reference", - /* 403 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 404 */ "table_reference ::= table_primary", - /* 405 */ "table_reference ::= joined_table", - /* 406 */ "table_primary ::= table_name alias_opt", - /* 407 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 408 */ "table_primary ::= subquery alias_opt", - /* 409 */ "table_primary ::= parenthesized_joined_table", - /* 410 */ "alias_opt ::=", - /* 411 */ "alias_opt ::= table_alias", - /* 412 */ "alias_opt ::= AS table_alias", - /* 413 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 414 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 415 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 416 */ "join_type ::=", - /* 417 */ "join_type ::= INNER", - /* 418 */ "query_specification ::= SELECT set_quantifier_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", - /* 419 */ "set_quantifier_opt ::=", - /* 420 */ "set_quantifier_opt ::= DISTINCT", - /* 421 */ "set_quantifier_opt ::= ALL", - /* 422 */ "select_list ::= select_item", - /* 423 */ "select_list ::= select_list NK_COMMA select_item", - /* 424 */ "select_item ::= NK_STAR", - /* 425 */ "select_item ::= common_expression", - /* 426 */ "select_item ::= common_expression column_alias", - /* 427 */ "select_item ::= common_expression AS column_alias", - /* 428 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 429 */ "where_clause_opt ::=", - /* 430 */ "where_clause_opt ::= WHERE search_condition", - /* 431 */ "partition_by_clause_opt ::=", - /* 432 */ "partition_by_clause_opt ::= PARTITION BY expression_list", - /* 433 */ "twindow_clause_opt ::=", - /* 434 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", - /* 435 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", - /* 436 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 437 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 438 */ "sliding_opt ::=", - /* 439 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 440 */ "fill_opt ::=", - /* 441 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 442 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 443 */ "fill_mode ::= NONE", - /* 444 */ "fill_mode ::= PREV", - /* 445 */ "fill_mode ::= NULL", - /* 446 */ "fill_mode ::= LINEAR", - /* 447 */ "fill_mode ::= NEXT", - /* 448 */ "group_by_clause_opt ::=", - /* 449 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 450 */ "group_by_list ::= expression", - /* 451 */ "group_by_list ::= group_by_list NK_COMMA expression", - /* 452 */ "having_clause_opt ::=", - /* 453 */ "having_clause_opt ::= HAVING search_condition", - /* 454 */ "range_opt ::=", - /* 455 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", - /* 456 */ "every_opt ::=", - /* 457 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 458 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 459 */ "query_expression_body ::= query_primary", - /* 460 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 461 */ "query_expression_body ::= query_expression_body UNION query_expression_body", - /* 462 */ "query_primary ::= query_specification", - /* 463 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", - /* 464 */ "order_by_clause_opt ::=", - /* 465 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 466 */ "slimit_clause_opt ::=", - /* 467 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 468 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 469 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 470 */ "limit_clause_opt ::=", - /* 471 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 472 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 473 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 474 */ "subquery ::= NK_LP query_expression NK_RP", - /* 475 */ "search_condition ::= common_expression", - /* 476 */ "sort_specification_list ::= sort_specification", - /* 477 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 478 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", - /* 479 */ "ordering_specification_opt ::=", - /* 480 */ "ordering_specification_opt ::= ASC", - /* 481 */ "ordering_specification_opt ::= DESC", - /* 482 */ "null_ordering_opt ::=", - /* 483 */ "null_ordering_opt ::= NULLS FIRST", - /* 484 */ "null_ordering_opt ::= NULLS LAST", + /* 74 */ "db_options ::= db_options CACHELASTSIZE NK_INTEGER", + /* 75 */ "db_options ::= db_options COMP NK_INTEGER", + /* 76 */ "db_options ::= db_options DURATION NK_INTEGER", + /* 77 */ "db_options ::= db_options DURATION NK_VARIABLE", + /* 78 */ "db_options ::= db_options FSYNC NK_INTEGER", + /* 79 */ "db_options ::= db_options MAXROWS NK_INTEGER", + /* 80 */ "db_options ::= db_options MINROWS NK_INTEGER", + /* 81 */ "db_options ::= db_options KEEP integer_list", + /* 82 */ "db_options ::= db_options KEEP variable_list", + /* 83 */ "db_options ::= db_options PAGES NK_INTEGER", + /* 84 */ "db_options ::= db_options PAGESIZE NK_INTEGER", + /* 85 */ "db_options ::= db_options PRECISION NK_STRING", + /* 86 */ "db_options ::= db_options REPLICA NK_INTEGER", + /* 87 */ "db_options ::= db_options STRICT NK_INTEGER", + /* 88 */ "db_options ::= db_options WAL NK_INTEGER", + /* 89 */ "db_options ::= db_options VGROUPS NK_INTEGER", + /* 90 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", + /* 91 */ "db_options ::= db_options RETENTIONS retention_list", + /* 92 */ "db_options ::= db_options SCHEMALESS NK_INTEGER", + /* 93 */ "alter_db_options ::= alter_db_option", + /* 94 */ "alter_db_options ::= alter_db_options alter_db_option", + /* 95 */ "alter_db_option ::= BUFFER NK_INTEGER", + /* 96 */ "alter_db_option ::= CACHELAST NK_INTEGER", + /* 97 */ "alter_db_option ::= CACHELASTSIZE NK_INTEGER", + /* 98 */ "alter_db_option ::= FSYNC NK_INTEGER", + /* 99 */ "alter_db_option ::= KEEP integer_list", + /* 100 */ "alter_db_option ::= KEEP variable_list", + /* 101 */ "alter_db_option ::= PAGES NK_INTEGER", + /* 102 */ "alter_db_option ::= REPLICA NK_INTEGER", + /* 103 */ "alter_db_option ::= STRICT NK_INTEGER", + /* 104 */ "alter_db_option ::= WAL NK_INTEGER", + /* 105 */ "integer_list ::= NK_INTEGER", + /* 106 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", + /* 107 */ "variable_list ::= NK_VARIABLE", + /* 108 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", + /* 109 */ "retention_list ::= retention", + /* 110 */ "retention_list ::= retention_list NK_COMMA retention", + /* 111 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", + /* 112 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", + /* 113 */ "cmd ::= CREATE TABLE multi_create_clause", + /* 114 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", + /* 115 */ "cmd ::= DROP TABLE multi_drop_clause", + /* 116 */ "cmd ::= DROP STABLE exists_opt full_table_name", + /* 117 */ "cmd ::= ALTER TABLE alter_table_clause", + /* 118 */ "cmd ::= ALTER STABLE alter_table_clause", + /* 119 */ "alter_table_clause ::= full_table_name alter_table_options", + /* 120 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", + /* 121 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", + /* 122 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", + /* 123 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", + /* 124 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", + /* 125 */ "alter_table_clause ::= full_table_name DROP TAG column_name", + /* 126 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", + /* 127 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", + /* 128 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", + /* 129 */ "multi_create_clause ::= create_subtable_clause", + /* 130 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", + /* 131 */ "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", + /* 132 */ "multi_drop_clause ::= drop_table_clause", + /* 133 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", + /* 134 */ "drop_table_clause ::= exists_opt full_table_name", + /* 135 */ "specific_cols_opt ::=", + /* 136 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", + /* 137 */ "full_table_name ::= table_name", + /* 138 */ "full_table_name ::= db_name NK_DOT table_name", + /* 139 */ "column_def_list ::= column_def", + /* 140 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 141 */ "column_def ::= column_name type_name", + /* 142 */ "column_def ::= column_name type_name COMMENT NK_STRING", + /* 143 */ "type_name ::= BOOL", + /* 144 */ "type_name ::= TINYINT", + /* 145 */ "type_name ::= SMALLINT", + /* 146 */ "type_name ::= INT", + /* 147 */ "type_name ::= INTEGER", + /* 148 */ "type_name ::= BIGINT", + /* 149 */ "type_name ::= FLOAT", + /* 150 */ "type_name ::= DOUBLE", + /* 151 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 152 */ "type_name ::= TIMESTAMP", + /* 153 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 154 */ "type_name ::= TINYINT UNSIGNED", + /* 155 */ "type_name ::= SMALLINT UNSIGNED", + /* 156 */ "type_name ::= INT UNSIGNED", + /* 157 */ "type_name ::= BIGINT UNSIGNED", + /* 158 */ "type_name ::= JSON", + /* 159 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 160 */ "type_name ::= MEDIUMBLOB", + /* 161 */ "type_name ::= BLOB", + /* 162 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 163 */ "type_name ::= DECIMAL", + /* 164 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 165 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 166 */ "tags_def_opt ::=", + /* 167 */ "tags_def_opt ::= tags_def", + /* 168 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", + /* 169 */ "table_options ::=", + /* 170 */ "table_options ::= table_options COMMENT NK_STRING", + /* 171 */ "table_options ::= table_options MAX_DELAY duration_list", + /* 172 */ "table_options ::= table_options WATERMARK duration_list", + /* 173 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", + /* 174 */ "table_options ::= table_options TTL NK_INTEGER", + /* 175 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", + /* 176 */ "alter_table_options ::= alter_table_option", + /* 177 */ "alter_table_options ::= alter_table_options alter_table_option", + /* 178 */ "alter_table_option ::= COMMENT NK_STRING", + /* 179 */ "alter_table_option ::= TTL NK_INTEGER", + /* 180 */ "duration_list ::= duration_literal", + /* 181 */ "duration_list ::= duration_list NK_COMMA duration_literal", + /* 182 */ "rollup_func_list ::= rollup_func_name", + /* 183 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", + /* 184 */ "rollup_func_name ::= function_name", + /* 185 */ "rollup_func_name ::= FIRST", + /* 186 */ "rollup_func_name ::= LAST", + /* 187 */ "col_name_list ::= col_name", + /* 188 */ "col_name_list ::= col_name_list NK_COMMA col_name", + /* 189 */ "col_name ::= column_name", + /* 190 */ "cmd ::= SHOW DNODES", + /* 191 */ "cmd ::= SHOW USERS", + /* 192 */ "cmd ::= SHOW DATABASES", + /* 193 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", + /* 194 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", + /* 195 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", + /* 196 */ "cmd ::= SHOW MNODES", + /* 197 */ "cmd ::= SHOW MODULES", + /* 198 */ "cmd ::= SHOW QNODES", + /* 199 */ "cmd ::= SHOW FUNCTIONS", + /* 200 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", + /* 201 */ "cmd ::= SHOW STREAMS", + /* 202 */ "cmd ::= SHOW ACCOUNTS", + /* 203 */ "cmd ::= SHOW APPS", + /* 204 */ "cmd ::= SHOW CONNECTIONS", + /* 205 */ "cmd ::= SHOW LICENCE", + /* 206 */ "cmd ::= SHOW GRANTS", + /* 207 */ "cmd ::= SHOW CREATE DATABASE db_name", + /* 208 */ "cmd ::= SHOW CREATE TABLE full_table_name", + /* 209 */ "cmd ::= SHOW CREATE STABLE full_table_name", + /* 210 */ "cmd ::= SHOW QUERIES", + /* 211 */ "cmd ::= SHOW SCORES", + /* 212 */ "cmd ::= SHOW TOPICS", + /* 213 */ "cmd ::= SHOW VARIABLES", + /* 214 */ "cmd ::= SHOW LOCAL VARIABLES", + /* 215 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", + /* 216 */ "cmd ::= SHOW BNODES", + /* 217 */ "cmd ::= SHOW SNODES", + /* 218 */ "cmd ::= SHOW CLUSTER", + /* 219 */ "cmd ::= SHOW TRANSACTIONS", + /* 220 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", + /* 221 */ "cmd ::= SHOW CONSUMERS", + /* 222 */ "cmd ::= SHOW SUBSCRIPTIONS", + /* 223 */ "db_name_cond_opt ::=", + /* 224 */ "db_name_cond_opt ::= db_name NK_DOT", + /* 225 */ "like_pattern_opt ::=", + /* 226 */ "like_pattern_opt ::= LIKE NK_STRING", + /* 227 */ "table_name_cond ::= table_name", + /* 228 */ "from_db_opt ::=", + /* 229 */ "from_db_opt ::= FROM db_name", + /* 230 */ "cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options", + /* 231 */ "cmd ::= DROP INDEX exists_opt index_name", + /* 232 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", + /* 233 */ "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", + /* 234 */ "func_list ::= func", + /* 235 */ "func_list ::= func_list NK_COMMA func", + /* 236 */ "func ::= function_name NK_LP expression_list NK_RP", + /* 237 */ "sma_stream_opt ::=", + /* 238 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", + /* 239 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", + /* 240 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", + /* 241 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", + /* 242 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", + /* 243 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", + /* 244 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", + /* 245 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 246 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", + /* 247 */ "cmd ::= DESC full_table_name", + /* 248 */ "cmd ::= DESCRIBE full_table_name", + /* 249 */ "cmd ::= RESET QUERY CACHE", + /* 250 */ "cmd ::= EXPLAIN analyze_opt explain_options query_expression", + /* 251 */ "analyze_opt ::=", + /* 252 */ "analyze_opt ::= ANALYZE", + /* 253 */ "explain_options ::=", + /* 254 */ "explain_options ::= explain_options VERBOSE NK_BOOL", + /* 255 */ "explain_options ::= explain_options RATIO NK_FLOAT", + /* 256 */ "cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP", + /* 257 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", + /* 258 */ "cmd ::= DROP FUNCTION exists_opt function_name", + /* 259 */ "agg_func_opt ::=", + /* 260 */ "agg_func_opt ::= AGGREGATE", + /* 261 */ "bufsize_opt ::=", + /* 262 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", + /* 263 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression", + /* 264 */ "cmd ::= DROP STREAM exists_opt stream_name", + /* 265 */ "into_opt ::=", + /* 266 */ "into_opt ::= INTO full_table_name", + /* 267 */ "stream_options ::=", + /* 268 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 269 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 270 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 271 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 272 */ "stream_options ::= stream_options IGNORE EXPIRED", + /* 273 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 274 */ "cmd ::= KILL QUERY NK_STRING", + /* 275 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 276 */ "cmd ::= BALANCE VGROUP", + /* 277 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 278 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 279 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 280 */ "dnode_list ::= DNODE NK_INTEGER", + /* 281 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 282 */ "cmd ::= SYNCDB db_name REPLICA", + /* 283 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 284 */ "cmd ::= query_expression", + /* 285 */ "cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression", + /* 286 */ "literal ::= NK_INTEGER", + /* 287 */ "literal ::= NK_FLOAT", + /* 288 */ "literal ::= NK_STRING", + /* 289 */ "literal ::= NK_BOOL", + /* 290 */ "literal ::= TIMESTAMP NK_STRING", + /* 291 */ "literal ::= duration_literal", + /* 292 */ "literal ::= NULL", + /* 293 */ "literal ::= NK_QUESTION", + /* 294 */ "duration_literal ::= NK_VARIABLE", + /* 295 */ "signed ::= NK_INTEGER", + /* 296 */ "signed ::= NK_PLUS NK_INTEGER", + /* 297 */ "signed ::= NK_MINUS NK_INTEGER", + /* 298 */ "signed ::= NK_FLOAT", + /* 299 */ "signed ::= NK_PLUS NK_FLOAT", + /* 300 */ "signed ::= NK_MINUS NK_FLOAT", + /* 301 */ "signed_literal ::= signed", + /* 302 */ "signed_literal ::= NK_STRING", + /* 303 */ "signed_literal ::= NK_BOOL", + /* 304 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 305 */ "signed_literal ::= duration_literal", + /* 306 */ "signed_literal ::= NULL", + /* 307 */ "signed_literal ::= literal_func", + /* 308 */ "literal_list ::= signed_literal", + /* 309 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 310 */ "db_name ::= NK_ID", + /* 311 */ "table_name ::= NK_ID", + /* 312 */ "column_name ::= NK_ID", + /* 313 */ "function_name ::= NK_ID", + /* 314 */ "table_alias ::= NK_ID", + /* 315 */ "column_alias ::= NK_ID", + /* 316 */ "user_name ::= NK_ID", + /* 317 */ "index_name ::= NK_ID", + /* 318 */ "topic_name ::= NK_ID", + /* 319 */ "stream_name ::= NK_ID", + /* 320 */ "cgroup_name ::= NK_ID", + /* 321 */ "expression ::= literal", + /* 322 */ "expression ::= pseudo_column", + /* 323 */ "expression ::= column_reference", + /* 324 */ "expression ::= function_expression", + /* 325 */ "expression ::= subquery", + /* 326 */ "expression ::= NK_LP expression NK_RP", + /* 327 */ "expression ::= NK_PLUS expression", + /* 328 */ "expression ::= NK_MINUS expression", + /* 329 */ "expression ::= expression NK_PLUS expression", + /* 330 */ "expression ::= expression NK_MINUS expression", + /* 331 */ "expression ::= expression NK_STAR expression", + /* 332 */ "expression ::= expression NK_SLASH expression", + /* 333 */ "expression ::= expression NK_REM expression", + /* 334 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 335 */ "expression ::= expression NK_BITAND expression", + /* 336 */ "expression ::= expression NK_BITOR expression", + /* 337 */ "expression_list ::= expression", + /* 338 */ "expression_list ::= expression_list NK_COMMA expression", + /* 339 */ "column_reference ::= column_name", + /* 340 */ "column_reference ::= table_name NK_DOT column_name", + /* 341 */ "pseudo_column ::= ROWTS", + /* 342 */ "pseudo_column ::= TBNAME", + /* 343 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 344 */ "pseudo_column ::= QSTARTTS", + /* 345 */ "pseudo_column ::= QENDTS", + /* 346 */ "pseudo_column ::= WSTARTTS", + /* 347 */ "pseudo_column ::= WENDTS", + /* 348 */ "pseudo_column ::= WDURATION", + /* 349 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 350 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 351 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", + /* 352 */ "function_expression ::= literal_func", + /* 353 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 354 */ "literal_func ::= NOW", + /* 355 */ "noarg_func ::= NOW", + /* 356 */ "noarg_func ::= TODAY", + /* 357 */ "noarg_func ::= TIMEZONE", + /* 358 */ "noarg_func ::= DATABASE", + /* 359 */ "noarg_func ::= CLIENT_VERSION", + /* 360 */ "noarg_func ::= SERVER_VERSION", + /* 361 */ "noarg_func ::= SERVER_STATUS", + /* 362 */ "noarg_func ::= CURRENT_USER", + /* 363 */ "noarg_func ::= USER", + /* 364 */ "star_func ::= COUNT", + /* 365 */ "star_func ::= FIRST", + /* 366 */ "star_func ::= LAST", + /* 367 */ "star_func ::= LAST_ROW", + /* 368 */ "star_func_para_list ::= NK_STAR", + /* 369 */ "star_func_para_list ::= other_para_list", + /* 370 */ "other_para_list ::= star_func_para", + /* 371 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 372 */ "star_func_para ::= expression", + /* 373 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 374 */ "predicate ::= expression compare_op expression", + /* 375 */ "predicate ::= expression BETWEEN expression AND expression", + /* 376 */ "predicate ::= expression NOT BETWEEN expression AND expression", + /* 377 */ "predicate ::= expression IS NULL", + /* 378 */ "predicate ::= expression IS NOT NULL", + /* 379 */ "predicate ::= expression in_op in_predicate_value", + /* 380 */ "compare_op ::= NK_LT", + /* 381 */ "compare_op ::= NK_GT", + /* 382 */ "compare_op ::= NK_LE", + /* 383 */ "compare_op ::= NK_GE", + /* 384 */ "compare_op ::= NK_NE", + /* 385 */ "compare_op ::= NK_EQ", + /* 386 */ "compare_op ::= LIKE", + /* 387 */ "compare_op ::= NOT LIKE", + /* 388 */ "compare_op ::= MATCH", + /* 389 */ "compare_op ::= NMATCH", + /* 390 */ "compare_op ::= CONTAINS", + /* 391 */ "in_op ::= IN", + /* 392 */ "in_op ::= NOT IN", + /* 393 */ "in_predicate_value ::= NK_LP expression_list NK_RP", + /* 394 */ "boolean_value_expression ::= boolean_primary", + /* 395 */ "boolean_value_expression ::= NOT boolean_primary", + /* 396 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 397 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 398 */ "boolean_primary ::= predicate", + /* 399 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 400 */ "common_expression ::= expression", + /* 401 */ "common_expression ::= boolean_value_expression", + /* 402 */ "from_clause_opt ::=", + /* 403 */ "from_clause_opt ::= FROM table_reference_list", + /* 404 */ "table_reference_list ::= table_reference", + /* 405 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 406 */ "table_reference ::= table_primary", + /* 407 */ "table_reference ::= joined_table", + /* 408 */ "table_primary ::= table_name alias_opt", + /* 409 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 410 */ "table_primary ::= subquery alias_opt", + /* 411 */ "table_primary ::= parenthesized_joined_table", + /* 412 */ "alias_opt ::=", + /* 413 */ "alias_opt ::= table_alias", + /* 414 */ "alias_opt ::= AS table_alias", + /* 415 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 416 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 417 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 418 */ "join_type ::=", + /* 419 */ "join_type ::= INNER", + /* 420 */ "query_specification ::= SELECT set_quantifier_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", + /* 421 */ "set_quantifier_opt ::=", + /* 422 */ "set_quantifier_opt ::= DISTINCT", + /* 423 */ "set_quantifier_opt ::= ALL", + /* 424 */ "select_list ::= select_item", + /* 425 */ "select_list ::= select_list NK_COMMA select_item", + /* 426 */ "select_item ::= NK_STAR", + /* 427 */ "select_item ::= common_expression", + /* 428 */ "select_item ::= common_expression column_alias", + /* 429 */ "select_item ::= common_expression AS column_alias", + /* 430 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 431 */ "where_clause_opt ::=", + /* 432 */ "where_clause_opt ::= WHERE search_condition", + /* 433 */ "partition_by_clause_opt ::=", + /* 434 */ "partition_by_clause_opt ::= PARTITION BY expression_list", + /* 435 */ "twindow_clause_opt ::=", + /* 436 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", + /* 437 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", + /* 438 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 439 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 440 */ "sliding_opt ::=", + /* 441 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 442 */ "fill_opt ::=", + /* 443 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 444 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 445 */ "fill_mode ::= NONE", + /* 446 */ "fill_mode ::= PREV", + /* 447 */ "fill_mode ::= NULL", + /* 448 */ "fill_mode ::= LINEAR", + /* 449 */ "fill_mode ::= NEXT", + /* 450 */ "group_by_clause_opt ::=", + /* 451 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 452 */ "group_by_list ::= expression", + /* 453 */ "group_by_list ::= group_by_list NK_COMMA expression", + /* 454 */ "having_clause_opt ::=", + /* 455 */ "having_clause_opt ::= HAVING search_condition", + /* 456 */ "range_opt ::=", + /* 457 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", + /* 458 */ "every_opt ::=", + /* 459 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 460 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 461 */ "query_expression_body ::= query_primary", + /* 462 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 463 */ "query_expression_body ::= query_expression_body UNION query_expression_body", + /* 464 */ "query_primary ::= query_specification", + /* 465 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", + /* 466 */ "order_by_clause_opt ::=", + /* 467 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 468 */ "slimit_clause_opt ::=", + /* 469 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 470 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 471 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 472 */ "limit_clause_opt ::=", + /* 473 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 474 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 475 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 476 */ "subquery ::= NK_LP query_expression NK_RP", + /* 477 */ "search_condition ::= common_expression", + /* 478 */ "sort_specification_list ::= sort_specification", + /* 479 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 480 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", + /* 481 */ "ordering_specification_opt ::=", + /* 482 */ "ordering_specification_opt ::= ASC", + /* 483 */ "ordering_specification_opt ::= DESC", + /* 484 */ "null_ordering_opt ::=", + /* 485 */ "null_ordering_opt ::= NULLS FIRST", + /* 486 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -2221,181 +2223,181 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 253: /* cmd */ - case 256: /* literal */ - case 267: /* db_options */ - case 269: /* alter_db_options */ - case 274: /* retention */ - case 275: /* full_table_name */ - case 278: /* table_options */ - case 282: /* alter_table_clause */ - case 283: /* alter_table_options */ - case 286: /* signed_literal */ - case 287: /* create_subtable_clause */ - case 290: /* drop_table_clause */ - case 293: /* column_def */ - case 297: /* duration_literal */ - case 298: /* rollup_func_name */ - case 300: /* col_name */ - case 301: /* db_name_cond_opt */ - case 302: /* like_pattern_opt */ - case 303: /* table_name_cond */ - case 304: /* from_db_opt */ - case 306: /* index_options */ - case 308: /* sliding_opt */ - case 309: /* sma_stream_opt */ - case 310: /* func */ - case 311: /* stream_options */ - case 313: /* query_expression */ - case 316: /* explain_options */ - case 320: /* into_opt */ - case 322: /* where_clause_opt */ - case 323: /* signed */ - case 324: /* literal_func */ - case 328: /* expression */ - case 329: /* pseudo_column */ - case 330: /* column_reference */ - case 331: /* function_expression */ - case 332: /* subquery */ - case 337: /* star_func_para */ - case 338: /* predicate */ - case 341: /* in_predicate_value */ - case 342: /* boolean_value_expression */ - case 343: /* boolean_primary */ - case 344: /* common_expression */ - case 345: /* from_clause_opt */ - case 346: /* table_reference_list */ - case 347: /* table_reference */ - case 348: /* table_primary */ - case 349: /* joined_table */ - case 351: /* parenthesized_joined_table */ - case 353: /* search_condition */ - case 354: /* query_specification */ - case 358: /* range_opt */ - case 359: /* every_opt */ - case 360: /* fill_opt */ - case 361: /* twindow_clause_opt */ - case 363: /* having_clause_opt */ - case 364: /* select_item */ - case 367: /* query_expression_body */ - case 369: /* slimit_clause_opt */ - case 370: /* limit_clause_opt */ - case 371: /* query_primary */ - case 373: /* sort_specification */ + case 254: /* cmd */ + case 257: /* literal */ + case 268: /* db_options */ + case 270: /* alter_db_options */ + case 275: /* retention */ + case 276: /* full_table_name */ + case 279: /* table_options */ + case 283: /* alter_table_clause */ + case 284: /* alter_table_options */ + case 287: /* signed_literal */ + case 288: /* create_subtable_clause */ + case 291: /* drop_table_clause */ + case 294: /* column_def */ + case 298: /* duration_literal */ + case 299: /* rollup_func_name */ + case 301: /* col_name */ + case 302: /* db_name_cond_opt */ + case 303: /* like_pattern_opt */ + case 304: /* table_name_cond */ + case 305: /* from_db_opt */ + case 307: /* index_options */ + case 309: /* sliding_opt */ + case 310: /* sma_stream_opt */ + case 311: /* func */ + case 312: /* stream_options */ + case 314: /* query_expression */ + case 317: /* explain_options */ + case 321: /* into_opt */ + case 323: /* where_clause_opt */ + case 324: /* signed */ + case 325: /* literal_func */ + case 329: /* expression */ + case 330: /* pseudo_column */ + case 331: /* column_reference */ + case 332: /* function_expression */ + case 333: /* subquery */ + case 338: /* star_func_para */ + case 339: /* predicate */ + case 342: /* in_predicate_value */ + case 343: /* boolean_value_expression */ + case 344: /* boolean_primary */ + case 345: /* common_expression */ + case 346: /* from_clause_opt */ + case 347: /* table_reference_list */ + case 348: /* table_reference */ + case 349: /* table_primary */ + case 350: /* joined_table */ + case 352: /* parenthesized_joined_table */ + case 354: /* search_condition */ + case 355: /* query_specification */ + case 359: /* range_opt */ + case 360: /* every_opt */ + case 361: /* fill_opt */ + case 362: /* twindow_clause_opt */ + case 364: /* having_clause_opt */ + case 365: /* select_item */ + case 368: /* query_expression_body */ + case 370: /* slimit_clause_opt */ + case 371: /* limit_clause_opt */ + case 372: /* query_primary */ + case 374: /* sort_specification */ { - nodesDestroyNode((yypminor->yy248)); + nodesDestroyNode((yypminor->yy652)); } break; - case 254: /* account_options */ - case 255: /* alter_account_options */ - case 257: /* alter_account_option */ - case 318: /* bufsize_opt */ + case 255: /* account_options */ + case 256: /* alter_account_options */ + case 258: /* alter_account_option */ + case 319: /* bufsize_opt */ { } break; - case 258: /* user_name */ - case 261: /* priv_level */ - case 264: /* db_name */ - case 265: /* dnode_endpoint */ - case 284: /* column_name */ - case 292: /* table_name */ - case 299: /* function_name */ - case 305: /* index_name */ - case 312: /* topic_name */ - case 314: /* cgroup_name */ - case 319: /* stream_name */ - case 326: /* table_alias */ - case 327: /* column_alias */ - case 333: /* star_func */ - case 335: /* noarg_func */ - case 350: /* alias_opt */ + case 259: /* user_name */ + case 262: /* priv_level */ + case 265: /* db_name */ + case 266: /* dnode_endpoint */ + case 285: /* column_name */ + case 293: /* table_name */ + case 300: /* function_name */ + case 306: /* index_name */ + case 313: /* topic_name */ + case 315: /* cgroup_name */ + case 320: /* stream_name */ + case 327: /* table_alias */ + case 328: /* column_alias */ + case 334: /* star_func */ + case 336: /* noarg_func */ + case 351: /* alias_opt */ { } break; - case 259: /* sysinfo_opt */ + case 260: /* sysinfo_opt */ { } break; - case 260: /* privileges */ - case 262: /* priv_type_list */ - case 263: /* priv_type */ + case 261: /* privileges */ + case 263: /* priv_type_list */ + case 264: /* priv_type */ { } break; - case 266: /* not_exists_opt */ - case 268: /* exists_opt */ - case 315: /* analyze_opt */ - case 317: /* agg_func_opt */ - case 355: /* set_quantifier_opt */ + case 267: /* not_exists_opt */ + case 269: /* exists_opt */ + case 316: /* analyze_opt */ + case 318: /* agg_func_opt */ + case 356: /* set_quantifier_opt */ { } break; - case 270: /* integer_list */ - case 271: /* variable_list */ - case 272: /* retention_list */ - case 276: /* column_def_list */ - case 277: /* tags_def_opt */ - case 279: /* multi_create_clause */ - case 280: /* tags_def */ - case 281: /* multi_drop_clause */ - case 288: /* specific_cols_opt */ - case 289: /* expression_list */ - case 291: /* col_name_list */ - case 294: /* duration_list */ - case 295: /* rollup_func_list */ - case 307: /* func_list */ - case 321: /* dnode_list */ - case 325: /* literal_list */ - case 334: /* star_func_para_list */ - case 336: /* other_para_list */ - case 356: /* select_list */ - case 357: /* partition_by_clause_opt */ - case 362: /* group_by_clause_opt */ - case 366: /* group_by_list */ - case 368: /* order_by_clause_opt */ - case 372: /* sort_specification_list */ + case 271: /* integer_list */ + case 272: /* variable_list */ + case 273: /* retention_list */ + case 277: /* column_def_list */ + case 278: /* tags_def_opt */ + case 280: /* multi_create_clause */ + case 281: /* tags_def */ + case 282: /* multi_drop_clause */ + case 289: /* specific_cols_opt */ + case 290: /* expression_list */ + case 292: /* col_name_list */ + case 295: /* duration_list */ + case 296: /* rollup_func_list */ + case 308: /* func_list */ + case 322: /* dnode_list */ + case 326: /* literal_list */ + case 335: /* star_func_para_list */ + case 337: /* other_para_list */ + case 357: /* select_list */ + case 358: /* partition_by_clause_opt */ + case 363: /* group_by_clause_opt */ + case 367: /* group_by_list */ + case 369: /* order_by_clause_opt */ + case 373: /* sort_specification_list */ { - nodesDestroyList((yypminor->yy552)); + nodesDestroyList((yypminor->yy210)); } break; - case 273: /* alter_db_option */ - case 296: /* alter_table_option */ + case 274: /* alter_db_option */ + case 297: /* alter_table_option */ { } break; - case 285: /* type_name */ + case 286: /* type_name */ { } break; - case 339: /* compare_op */ - case 340: /* in_op */ + case 340: /* compare_op */ + case 341: /* in_op */ { } break; - case 352: /* join_type */ + case 353: /* join_type */ { } break; - case 365: /* fill_mode */ + case 366: /* fill_mode */ { } break; - case 374: /* ordering_specification_opt */ + case 375: /* ordering_specification_opt */ { } break; - case 375: /* null_ordering_opt */ + case 376: /* null_ordering_opt */ { } @@ -2694,491 +2696,493 @@ static const struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ signed char nrhs; /* Negative of the number of RHS symbols in the rule */ } yyRuleInfo[] = { - { 253, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ - { 253, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ - { 254, 0 }, /* (2) account_options ::= */ - { 254, -3 }, /* (3) account_options ::= account_options PPS literal */ - { 254, -3 }, /* (4) account_options ::= account_options TSERIES literal */ - { 254, -3 }, /* (5) account_options ::= account_options STORAGE literal */ - { 254, -3 }, /* (6) account_options ::= account_options STREAMS literal */ - { 254, -3 }, /* (7) account_options ::= account_options QTIME literal */ - { 254, -3 }, /* (8) account_options ::= account_options DBS literal */ - { 254, -3 }, /* (9) account_options ::= account_options USERS literal */ - { 254, -3 }, /* (10) account_options ::= account_options CONNS literal */ - { 254, -3 }, /* (11) account_options ::= account_options STATE literal */ - { 255, -1 }, /* (12) alter_account_options ::= alter_account_option */ - { 255, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ - { 257, -2 }, /* (14) alter_account_option ::= PASS literal */ - { 257, -2 }, /* (15) alter_account_option ::= PPS literal */ - { 257, -2 }, /* (16) alter_account_option ::= TSERIES literal */ - { 257, -2 }, /* (17) alter_account_option ::= STORAGE literal */ - { 257, -2 }, /* (18) alter_account_option ::= STREAMS literal */ - { 257, -2 }, /* (19) alter_account_option ::= QTIME literal */ - { 257, -2 }, /* (20) alter_account_option ::= DBS literal */ - { 257, -2 }, /* (21) alter_account_option ::= USERS literal */ - { 257, -2 }, /* (22) alter_account_option ::= CONNS literal */ - { 257, -2 }, /* (23) alter_account_option ::= STATE literal */ - { 253, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ - { 253, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ - { 253, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ - { 253, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ - { 253, -3 }, /* (28) cmd ::= DROP USER user_name */ - { 259, 0 }, /* (29) sysinfo_opt ::= */ - { 259, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ - { 253, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ - { 253, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ - { 260, -1 }, /* (33) privileges ::= ALL */ - { 260, -1 }, /* (34) privileges ::= priv_type_list */ - { 262, -1 }, /* (35) priv_type_list ::= priv_type */ - { 262, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ - { 263, -1 }, /* (37) priv_type ::= READ */ - { 263, -1 }, /* (38) priv_type ::= WRITE */ - { 261, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ - { 261, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ - { 253, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ - { 253, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ - { 253, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ - { 253, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ - { 253, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ - { 253, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ - { 253, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ - { 253, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ - { 265, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ - { 265, -1 }, /* (50) dnode_endpoint ::= NK_ID */ - { 265, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ - { 253, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ - { 253, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ - { 253, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ - { 253, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ - { 253, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ - { 253, -2 }, /* (64) cmd ::= USE db_name */ - { 253, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ - { 253, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ - { 266, -3 }, /* (67) not_exists_opt ::= IF NOT EXISTS */ - { 266, 0 }, /* (68) not_exists_opt ::= */ - { 268, -2 }, /* (69) exists_opt ::= IF EXISTS */ - { 268, 0 }, /* (70) exists_opt ::= */ - { 267, 0 }, /* (71) db_options ::= */ - { 267, -3 }, /* (72) db_options ::= db_options BUFFER NK_INTEGER */ - { 267, -3 }, /* (73) db_options ::= db_options CACHELAST NK_INTEGER */ - { 267, -3 }, /* (74) db_options ::= db_options COMP NK_INTEGER */ - { 267, -3 }, /* (75) db_options ::= db_options DURATION NK_INTEGER */ - { 267, -3 }, /* (76) db_options ::= db_options DURATION NK_VARIABLE */ - { 267, -3 }, /* (77) db_options ::= db_options FSYNC NK_INTEGER */ - { 267, -3 }, /* (78) db_options ::= db_options MAXROWS NK_INTEGER */ - { 267, -3 }, /* (79) db_options ::= db_options MINROWS NK_INTEGER */ - { 267, -3 }, /* (80) db_options ::= db_options KEEP integer_list */ - { 267, -3 }, /* (81) db_options ::= db_options KEEP variable_list */ - { 267, -3 }, /* (82) db_options ::= db_options PAGES NK_INTEGER */ - { 267, -3 }, /* (83) db_options ::= db_options PAGESIZE NK_INTEGER */ - { 267, -3 }, /* (84) db_options ::= db_options PRECISION NK_STRING */ - { 267, -3 }, /* (85) db_options ::= db_options REPLICA NK_INTEGER */ - { 267, -3 }, /* (86) db_options ::= db_options STRICT NK_INTEGER */ - { 267, -3 }, /* (87) db_options ::= db_options WAL NK_INTEGER */ - { 267, -3 }, /* (88) db_options ::= db_options VGROUPS NK_INTEGER */ - { 267, -3 }, /* (89) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ - { 267, -3 }, /* (90) db_options ::= db_options RETENTIONS retention_list */ - { 267, -3 }, /* (91) db_options ::= db_options SCHEMALESS NK_INTEGER */ - { 269, -1 }, /* (92) alter_db_options ::= alter_db_option */ - { 269, -2 }, /* (93) alter_db_options ::= alter_db_options alter_db_option */ - { 273, -2 }, /* (94) alter_db_option ::= BUFFER NK_INTEGER */ - { 273, -2 }, /* (95) alter_db_option ::= CACHELAST NK_INTEGER */ - { 273, -2 }, /* (96) alter_db_option ::= FSYNC NK_INTEGER */ - { 273, -2 }, /* (97) alter_db_option ::= KEEP integer_list */ - { 273, -2 }, /* (98) alter_db_option ::= KEEP variable_list */ - { 273, -2 }, /* (99) alter_db_option ::= PAGES NK_INTEGER */ - { 273, -2 }, /* (100) alter_db_option ::= REPLICA NK_INTEGER */ - { 273, -2 }, /* (101) alter_db_option ::= STRICT NK_INTEGER */ - { 273, -2 }, /* (102) alter_db_option ::= WAL NK_INTEGER */ - { 270, -1 }, /* (103) integer_list ::= NK_INTEGER */ - { 270, -3 }, /* (104) integer_list ::= integer_list NK_COMMA NK_INTEGER */ - { 271, -1 }, /* (105) variable_list ::= NK_VARIABLE */ - { 271, -3 }, /* (106) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ - { 272, -1 }, /* (107) retention_list ::= retention */ - { 272, -3 }, /* (108) retention_list ::= retention_list NK_COMMA retention */ - { 274, -3 }, /* (109) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ - { 253, -9 }, /* (110) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - { 253, -3 }, /* (111) cmd ::= CREATE TABLE multi_create_clause */ - { 253, -9 }, /* (112) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ - { 253, -3 }, /* (113) cmd ::= DROP TABLE multi_drop_clause */ - { 253, -4 }, /* (114) cmd ::= DROP STABLE exists_opt full_table_name */ - { 253, -3 }, /* (115) cmd ::= ALTER TABLE alter_table_clause */ - { 253, -3 }, /* (116) cmd ::= ALTER STABLE alter_table_clause */ - { 282, -2 }, /* (117) alter_table_clause ::= full_table_name alter_table_options */ - { 282, -5 }, /* (118) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ - { 282, -4 }, /* (119) alter_table_clause ::= full_table_name DROP COLUMN column_name */ - { 282, -5 }, /* (120) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ - { 282, -5 }, /* (121) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ - { 282, -5 }, /* (122) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ - { 282, -4 }, /* (123) alter_table_clause ::= full_table_name DROP TAG column_name */ - { 282, -5 }, /* (124) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ - { 282, -5 }, /* (125) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ - { 282, -6 }, /* (126) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ - { 279, -1 }, /* (127) multi_create_clause ::= create_subtable_clause */ - { 279, -2 }, /* (128) multi_create_clause ::= multi_create_clause create_subtable_clause */ - { 287, -10 }, /* (129) 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 */ - { 281, -1 }, /* (130) multi_drop_clause ::= drop_table_clause */ - { 281, -2 }, /* (131) multi_drop_clause ::= multi_drop_clause drop_table_clause */ - { 290, -2 }, /* (132) drop_table_clause ::= exists_opt full_table_name */ - { 288, 0 }, /* (133) specific_cols_opt ::= */ - { 288, -3 }, /* (134) specific_cols_opt ::= NK_LP col_name_list NK_RP */ - { 275, -1 }, /* (135) full_table_name ::= table_name */ - { 275, -3 }, /* (136) full_table_name ::= db_name NK_DOT table_name */ - { 276, -1 }, /* (137) column_def_list ::= column_def */ - { 276, -3 }, /* (138) column_def_list ::= column_def_list NK_COMMA column_def */ - { 293, -2 }, /* (139) column_def ::= column_name type_name */ - { 293, -4 }, /* (140) column_def ::= column_name type_name COMMENT NK_STRING */ - { 285, -1 }, /* (141) type_name ::= BOOL */ - { 285, -1 }, /* (142) type_name ::= TINYINT */ - { 285, -1 }, /* (143) type_name ::= SMALLINT */ - { 285, -1 }, /* (144) type_name ::= INT */ - { 285, -1 }, /* (145) type_name ::= INTEGER */ - { 285, -1 }, /* (146) type_name ::= BIGINT */ - { 285, -1 }, /* (147) type_name ::= FLOAT */ - { 285, -1 }, /* (148) type_name ::= DOUBLE */ - { 285, -4 }, /* (149) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 285, -1 }, /* (150) type_name ::= TIMESTAMP */ - { 285, -4 }, /* (151) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 285, -2 }, /* (152) type_name ::= TINYINT UNSIGNED */ - { 285, -2 }, /* (153) type_name ::= SMALLINT UNSIGNED */ - { 285, -2 }, /* (154) type_name ::= INT UNSIGNED */ - { 285, -2 }, /* (155) type_name ::= BIGINT UNSIGNED */ - { 285, -1 }, /* (156) type_name ::= JSON */ - { 285, -4 }, /* (157) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 285, -1 }, /* (158) type_name ::= MEDIUMBLOB */ - { 285, -1 }, /* (159) type_name ::= BLOB */ - { 285, -4 }, /* (160) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 285, -1 }, /* (161) type_name ::= DECIMAL */ - { 285, -4 }, /* (162) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 285, -6 }, /* (163) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 277, 0 }, /* (164) tags_def_opt ::= */ - { 277, -1 }, /* (165) tags_def_opt ::= tags_def */ - { 280, -4 }, /* (166) tags_def ::= TAGS NK_LP column_def_list NK_RP */ - { 278, 0 }, /* (167) table_options ::= */ - { 278, -3 }, /* (168) table_options ::= table_options COMMENT NK_STRING */ - { 278, -3 }, /* (169) table_options ::= table_options MAX_DELAY duration_list */ - { 278, -3 }, /* (170) table_options ::= table_options WATERMARK duration_list */ - { 278, -5 }, /* (171) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ - { 278, -3 }, /* (172) table_options ::= table_options TTL NK_INTEGER */ - { 278, -5 }, /* (173) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ - { 283, -1 }, /* (174) alter_table_options ::= alter_table_option */ - { 283, -2 }, /* (175) alter_table_options ::= alter_table_options alter_table_option */ - { 296, -2 }, /* (176) alter_table_option ::= COMMENT NK_STRING */ - { 296, -2 }, /* (177) alter_table_option ::= TTL NK_INTEGER */ - { 294, -1 }, /* (178) duration_list ::= duration_literal */ - { 294, -3 }, /* (179) duration_list ::= duration_list NK_COMMA duration_literal */ - { 295, -1 }, /* (180) rollup_func_list ::= rollup_func_name */ - { 295, -3 }, /* (181) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ - { 298, -1 }, /* (182) rollup_func_name ::= function_name */ - { 298, -1 }, /* (183) rollup_func_name ::= FIRST */ - { 298, -1 }, /* (184) rollup_func_name ::= LAST */ - { 291, -1 }, /* (185) col_name_list ::= col_name */ - { 291, -3 }, /* (186) col_name_list ::= col_name_list NK_COMMA col_name */ - { 300, -1 }, /* (187) col_name ::= column_name */ - { 253, -2 }, /* (188) cmd ::= SHOW DNODES */ - { 253, -2 }, /* (189) cmd ::= SHOW USERS */ - { 253, -2 }, /* (190) cmd ::= SHOW DATABASES */ - { 253, -4 }, /* (191) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ - { 253, -4 }, /* (192) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ - { 253, -3 }, /* (193) cmd ::= SHOW db_name_cond_opt VGROUPS */ - { 253, -2 }, /* (194) cmd ::= SHOW MNODES */ - { 253, -2 }, /* (195) cmd ::= SHOW MODULES */ - { 253, -2 }, /* (196) cmd ::= SHOW QNODES */ - { 253, -2 }, /* (197) cmd ::= SHOW FUNCTIONS */ - { 253, -5 }, /* (198) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ - { 253, -2 }, /* (199) cmd ::= SHOW STREAMS */ - { 253, -2 }, /* (200) cmd ::= SHOW ACCOUNTS */ - { 253, -2 }, /* (201) cmd ::= SHOW APPS */ - { 253, -2 }, /* (202) cmd ::= SHOW CONNECTIONS */ - { 253, -2 }, /* (203) cmd ::= SHOW LICENCE */ - { 253, -2 }, /* (204) cmd ::= SHOW GRANTS */ - { 253, -4 }, /* (205) cmd ::= SHOW CREATE DATABASE db_name */ - { 253, -4 }, /* (206) cmd ::= SHOW CREATE TABLE full_table_name */ - { 253, -4 }, /* (207) cmd ::= SHOW CREATE STABLE full_table_name */ - { 253, -2 }, /* (208) cmd ::= SHOW QUERIES */ - { 253, -2 }, /* (209) cmd ::= SHOW SCORES */ - { 253, -2 }, /* (210) cmd ::= SHOW TOPICS */ - { 253, -2 }, /* (211) cmd ::= SHOW VARIABLES */ - { 253, -3 }, /* (212) cmd ::= SHOW LOCAL VARIABLES */ - { 253, -4 }, /* (213) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ - { 253, -2 }, /* (214) cmd ::= SHOW BNODES */ - { 253, -2 }, /* (215) cmd ::= SHOW SNODES */ - { 253, -2 }, /* (216) cmd ::= SHOW CLUSTER */ - { 253, -2 }, /* (217) cmd ::= SHOW TRANSACTIONS */ - { 253, -4 }, /* (218) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ - { 253, -2 }, /* (219) cmd ::= SHOW CONSUMERS */ - { 253, -2 }, /* (220) cmd ::= SHOW SUBSCRIPTIONS */ - { 301, 0 }, /* (221) db_name_cond_opt ::= */ - { 301, -2 }, /* (222) db_name_cond_opt ::= db_name NK_DOT */ - { 302, 0 }, /* (223) like_pattern_opt ::= */ - { 302, -2 }, /* (224) like_pattern_opt ::= LIKE NK_STRING */ - { 303, -1 }, /* (225) table_name_cond ::= table_name */ - { 304, 0 }, /* (226) from_db_opt ::= */ - { 304, -2 }, /* (227) from_db_opt ::= FROM db_name */ - { 253, -8 }, /* (228) cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ - { 253, -4 }, /* (229) cmd ::= DROP INDEX exists_opt index_name */ - { 306, -10 }, /* (230) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ - { 306, -12 }, /* (231) 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 */ - { 307, -1 }, /* (232) func_list ::= func */ - { 307, -3 }, /* (233) func_list ::= func_list NK_COMMA func */ - { 310, -4 }, /* (234) func ::= function_name NK_LP expression_list NK_RP */ - { 309, 0 }, /* (235) sma_stream_opt ::= */ - { 309, -3 }, /* (236) sma_stream_opt ::= stream_options WATERMARK duration_literal */ - { 309, -3 }, /* (237) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ - { 253, -6 }, /* (238) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ - { 253, -7 }, /* (239) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ - { 253, -9 }, /* (240) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - { 253, -7 }, /* (241) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - { 253, -9 }, /* (242) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ - { 253, -4 }, /* (243) cmd ::= DROP TOPIC exists_opt topic_name */ - { 253, -7 }, /* (244) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ - { 253, -2 }, /* (245) cmd ::= DESC full_table_name */ - { 253, -2 }, /* (246) cmd ::= DESCRIBE full_table_name */ - { 253, -3 }, /* (247) cmd ::= RESET QUERY CACHE */ - { 253, -4 }, /* (248) cmd ::= EXPLAIN analyze_opt explain_options query_expression */ - { 315, 0 }, /* (249) analyze_opt ::= */ - { 315, -1 }, /* (250) analyze_opt ::= ANALYZE */ - { 316, 0 }, /* (251) explain_options ::= */ - { 316, -3 }, /* (252) explain_options ::= explain_options VERBOSE NK_BOOL */ - { 316, -3 }, /* (253) explain_options ::= explain_options RATIO NK_FLOAT */ - { 253, -6 }, /* (254) cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ - { 253, -10 }, /* (255) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ - { 253, -4 }, /* (256) cmd ::= DROP FUNCTION exists_opt function_name */ - { 317, 0 }, /* (257) agg_func_opt ::= */ - { 317, -1 }, /* (258) agg_func_opt ::= AGGREGATE */ - { 318, 0 }, /* (259) bufsize_opt ::= */ - { 318, -2 }, /* (260) bufsize_opt ::= BUFSIZE NK_INTEGER */ - { 253, -8 }, /* (261) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ - { 253, -4 }, /* (262) cmd ::= DROP STREAM exists_opt stream_name */ - { 320, 0 }, /* (263) into_opt ::= */ - { 320, -2 }, /* (264) into_opt ::= INTO full_table_name */ - { 311, 0 }, /* (265) stream_options ::= */ - { 311, -3 }, /* (266) stream_options ::= stream_options TRIGGER AT_ONCE */ - { 311, -3 }, /* (267) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - { 311, -4 }, /* (268) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - { 311, -3 }, /* (269) stream_options ::= stream_options WATERMARK duration_literal */ - { 311, -3 }, /* (270) stream_options ::= stream_options IGNORE EXPIRED */ - { 253, -3 }, /* (271) cmd ::= KILL CONNECTION NK_INTEGER */ - { 253, -3 }, /* (272) cmd ::= KILL QUERY NK_STRING */ - { 253, -3 }, /* (273) cmd ::= KILL TRANSACTION NK_INTEGER */ - { 253, -2 }, /* (274) cmd ::= BALANCE VGROUP */ - { 253, -4 }, /* (275) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ - { 253, -4 }, /* (276) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ - { 253, -3 }, /* (277) cmd ::= SPLIT VGROUP NK_INTEGER */ - { 321, -2 }, /* (278) dnode_list ::= DNODE NK_INTEGER */ - { 321, -3 }, /* (279) dnode_list ::= dnode_list DNODE NK_INTEGER */ - { 253, -3 }, /* (280) cmd ::= SYNCDB db_name REPLICA */ - { 253, -4 }, /* (281) cmd ::= DELETE FROM full_table_name where_clause_opt */ - { 253, -1 }, /* (282) cmd ::= query_expression */ - { 253, -5 }, /* (283) cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ - { 256, -1 }, /* (284) literal ::= NK_INTEGER */ - { 256, -1 }, /* (285) literal ::= NK_FLOAT */ - { 256, -1 }, /* (286) literal ::= NK_STRING */ - { 256, -1 }, /* (287) literal ::= NK_BOOL */ - { 256, -2 }, /* (288) literal ::= TIMESTAMP NK_STRING */ - { 256, -1 }, /* (289) literal ::= duration_literal */ - { 256, -1 }, /* (290) literal ::= NULL */ - { 256, -1 }, /* (291) literal ::= NK_QUESTION */ - { 297, -1 }, /* (292) duration_literal ::= NK_VARIABLE */ - { 323, -1 }, /* (293) signed ::= NK_INTEGER */ - { 323, -2 }, /* (294) signed ::= NK_PLUS NK_INTEGER */ - { 323, -2 }, /* (295) signed ::= NK_MINUS NK_INTEGER */ - { 323, -1 }, /* (296) signed ::= NK_FLOAT */ - { 323, -2 }, /* (297) signed ::= NK_PLUS NK_FLOAT */ - { 323, -2 }, /* (298) signed ::= NK_MINUS NK_FLOAT */ - { 286, -1 }, /* (299) signed_literal ::= signed */ - { 286, -1 }, /* (300) signed_literal ::= NK_STRING */ - { 286, -1 }, /* (301) signed_literal ::= NK_BOOL */ - { 286, -2 }, /* (302) signed_literal ::= TIMESTAMP NK_STRING */ - { 286, -1 }, /* (303) signed_literal ::= duration_literal */ - { 286, -1 }, /* (304) signed_literal ::= NULL */ - { 286, -1 }, /* (305) signed_literal ::= literal_func */ - { 325, -1 }, /* (306) literal_list ::= signed_literal */ - { 325, -3 }, /* (307) literal_list ::= literal_list NK_COMMA signed_literal */ - { 264, -1 }, /* (308) db_name ::= NK_ID */ - { 292, -1 }, /* (309) table_name ::= NK_ID */ - { 284, -1 }, /* (310) column_name ::= NK_ID */ - { 299, -1 }, /* (311) function_name ::= NK_ID */ - { 326, -1 }, /* (312) table_alias ::= NK_ID */ - { 327, -1 }, /* (313) column_alias ::= NK_ID */ - { 258, -1 }, /* (314) user_name ::= NK_ID */ - { 305, -1 }, /* (315) index_name ::= NK_ID */ - { 312, -1 }, /* (316) topic_name ::= NK_ID */ - { 319, -1 }, /* (317) stream_name ::= NK_ID */ - { 314, -1 }, /* (318) cgroup_name ::= NK_ID */ - { 328, -1 }, /* (319) expression ::= literal */ - { 328, -1 }, /* (320) expression ::= pseudo_column */ - { 328, -1 }, /* (321) expression ::= column_reference */ - { 328, -1 }, /* (322) expression ::= function_expression */ - { 328, -1 }, /* (323) expression ::= subquery */ - { 328, -3 }, /* (324) expression ::= NK_LP expression NK_RP */ - { 328, -2 }, /* (325) expression ::= NK_PLUS expression */ - { 328, -2 }, /* (326) expression ::= NK_MINUS expression */ - { 328, -3 }, /* (327) expression ::= expression NK_PLUS expression */ - { 328, -3 }, /* (328) expression ::= expression NK_MINUS expression */ - { 328, -3 }, /* (329) expression ::= expression NK_STAR expression */ - { 328, -3 }, /* (330) expression ::= expression NK_SLASH expression */ - { 328, -3 }, /* (331) expression ::= expression NK_REM expression */ - { 328, -3 }, /* (332) expression ::= column_reference NK_ARROW NK_STRING */ - { 328, -3 }, /* (333) expression ::= expression NK_BITAND expression */ - { 328, -3 }, /* (334) expression ::= expression NK_BITOR expression */ - { 289, -1 }, /* (335) expression_list ::= expression */ - { 289, -3 }, /* (336) expression_list ::= expression_list NK_COMMA expression */ - { 330, -1 }, /* (337) column_reference ::= column_name */ - { 330, -3 }, /* (338) column_reference ::= table_name NK_DOT column_name */ - { 329, -1 }, /* (339) pseudo_column ::= ROWTS */ - { 329, -1 }, /* (340) pseudo_column ::= TBNAME */ - { 329, -3 }, /* (341) pseudo_column ::= table_name NK_DOT TBNAME */ - { 329, -1 }, /* (342) pseudo_column ::= QSTARTTS */ - { 329, -1 }, /* (343) pseudo_column ::= QENDTS */ - { 329, -1 }, /* (344) pseudo_column ::= WSTARTTS */ - { 329, -1 }, /* (345) pseudo_column ::= WENDTS */ - { 329, -1 }, /* (346) pseudo_column ::= WDURATION */ - { 331, -4 }, /* (347) function_expression ::= function_name NK_LP expression_list NK_RP */ - { 331, -4 }, /* (348) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ - { 331, -6 }, /* (349) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ - { 331, -1 }, /* (350) function_expression ::= literal_func */ - { 324, -3 }, /* (351) literal_func ::= noarg_func NK_LP NK_RP */ - { 324, -1 }, /* (352) literal_func ::= NOW */ - { 335, -1 }, /* (353) noarg_func ::= NOW */ - { 335, -1 }, /* (354) noarg_func ::= TODAY */ - { 335, -1 }, /* (355) noarg_func ::= TIMEZONE */ - { 335, -1 }, /* (356) noarg_func ::= DATABASE */ - { 335, -1 }, /* (357) noarg_func ::= CLIENT_VERSION */ - { 335, -1 }, /* (358) noarg_func ::= SERVER_VERSION */ - { 335, -1 }, /* (359) noarg_func ::= SERVER_STATUS */ - { 335, -1 }, /* (360) noarg_func ::= CURRENT_USER */ - { 335, -1 }, /* (361) noarg_func ::= USER */ - { 333, -1 }, /* (362) star_func ::= COUNT */ - { 333, -1 }, /* (363) star_func ::= FIRST */ - { 333, -1 }, /* (364) star_func ::= LAST */ - { 333, -1 }, /* (365) star_func ::= LAST_ROW */ - { 334, -1 }, /* (366) star_func_para_list ::= NK_STAR */ - { 334, -1 }, /* (367) star_func_para_list ::= other_para_list */ - { 336, -1 }, /* (368) other_para_list ::= star_func_para */ - { 336, -3 }, /* (369) other_para_list ::= other_para_list NK_COMMA star_func_para */ - { 337, -1 }, /* (370) star_func_para ::= expression */ - { 337, -3 }, /* (371) star_func_para ::= table_name NK_DOT NK_STAR */ - { 338, -3 }, /* (372) predicate ::= expression compare_op expression */ - { 338, -5 }, /* (373) predicate ::= expression BETWEEN expression AND expression */ - { 338, -6 }, /* (374) predicate ::= expression NOT BETWEEN expression AND expression */ - { 338, -3 }, /* (375) predicate ::= expression IS NULL */ - { 338, -4 }, /* (376) predicate ::= expression IS NOT NULL */ - { 338, -3 }, /* (377) predicate ::= expression in_op in_predicate_value */ - { 339, -1 }, /* (378) compare_op ::= NK_LT */ - { 339, -1 }, /* (379) compare_op ::= NK_GT */ - { 339, -1 }, /* (380) compare_op ::= NK_LE */ - { 339, -1 }, /* (381) compare_op ::= NK_GE */ - { 339, -1 }, /* (382) compare_op ::= NK_NE */ - { 339, -1 }, /* (383) compare_op ::= NK_EQ */ - { 339, -1 }, /* (384) compare_op ::= LIKE */ - { 339, -2 }, /* (385) compare_op ::= NOT LIKE */ - { 339, -1 }, /* (386) compare_op ::= MATCH */ - { 339, -1 }, /* (387) compare_op ::= NMATCH */ - { 339, -1 }, /* (388) compare_op ::= CONTAINS */ - { 340, -1 }, /* (389) in_op ::= IN */ - { 340, -2 }, /* (390) in_op ::= NOT IN */ - { 341, -3 }, /* (391) in_predicate_value ::= NK_LP expression_list NK_RP */ - { 342, -1 }, /* (392) boolean_value_expression ::= boolean_primary */ - { 342, -2 }, /* (393) boolean_value_expression ::= NOT boolean_primary */ - { 342, -3 }, /* (394) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 342, -3 }, /* (395) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 343, -1 }, /* (396) boolean_primary ::= predicate */ - { 343, -3 }, /* (397) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 344, -1 }, /* (398) common_expression ::= expression */ - { 344, -1 }, /* (399) common_expression ::= boolean_value_expression */ - { 345, 0 }, /* (400) from_clause_opt ::= */ - { 345, -2 }, /* (401) from_clause_opt ::= FROM table_reference_list */ - { 346, -1 }, /* (402) table_reference_list ::= table_reference */ - { 346, -3 }, /* (403) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 347, -1 }, /* (404) table_reference ::= table_primary */ - { 347, -1 }, /* (405) table_reference ::= joined_table */ - { 348, -2 }, /* (406) table_primary ::= table_name alias_opt */ - { 348, -4 }, /* (407) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 348, -2 }, /* (408) table_primary ::= subquery alias_opt */ - { 348, -1 }, /* (409) table_primary ::= parenthesized_joined_table */ - { 350, 0 }, /* (410) alias_opt ::= */ - { 350, -1 }, /* (411) alias_opt ::= table_alias */ - { 350, -2 }, /* (412) alias_opt ::= AS table_alias */ - { 351, -3 }, /* (413) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 351, -3 }, /* (414) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 349, -6 }, /* (415) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 352, 0 }, /* (416) join_type ::= */ - { 352, -1 }, /* (417) join_type ::= INNER */ - { 354, -12 }, /* (418) query_specification ::= SELECT set_quantifier_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 */ - { 355, 0 }, /* (419) set_quantifier_opt ::= */ - { 355, -1 }, /* (420) set_quantifier_opt ::= DISTINCT */ - { 355, -1 }, /* (421) set_quantifier_opt ::= ALL */ - { 356, -1 }, /* (422) select_list ::= select_item */ - { 356, -3 }, /* (423) select_list ::= select_list NK_COMMA select_item */ - { 364, -1 }, /* (424) select_item ::= NK_STAR */ - { 364, -1 }, /* (425) select_item ::= common_expression */ - { 364, -2 }, /* (426) select_item ::= common_expression column_alias */ - { 364, -3 }, /* (427) select_item ::= common_expression AS column_alias */ - { 364, -3 }, /* (428) select_item ::= table_name NK_DOT NK_STAR */ - { 322, 0 }, /* (429) where_clause_opt ::= */ - { 322, -2 }, /* (430) where_clause_opt ::= WHERE search_condition */ - { 357, 0 }, /* (431) partition_by_clause_opt ::= */ - { 357, -3 }, /* (432) partition_by_clause_opt ::= PARTITION BY expression_list */ - { 361, 0 }, /* (433) twindow_clause_opt ::= */ - { 361, -6 }, /* (434) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ - { 361, -4 }, /* (435) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ - { 361, -6 }, /* (436) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 361, -8 }, /* (437) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 308, 0 }, /* (438) sliding_opt ::= */ - { 308, -4 }, /* (439) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 360, 0 }, /* (440) fill_opt ::= */ - { 360, -4 }, /* (441) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 360, -6 }, /* (442) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 365, -1 }, /* (443) fill_mode ::= NONE */ - { 365, -1 }, /* (444) fill_mode ::= PREV */ - { 365, -1 }, /* (445) fill_mode ::= NULL */ - { 365, -1 }, /* (446) fill_mode ::= LINEAR */ - { 365, -1 }, /* (447) fill_mode ::= NEXT */ - { 362, 0 }, /* (448) group_by_clause_opt ::= */ - { 362, -3 }, /* (449) group_by_clause_opt ::= GROUP BY group_by_list */ - { 366, -1 }, /* (450) group_by_list ::= expression */ - { 366, -3 }, /* (451) group_by_list ::= group_by_list NK_COMMA expression */ - { 363, 0 }, /* (452) having_clause_opt ::= */ - { 363, -2 }, /* (453) having_clause_opt ::= HAVING search_condition */ - { 358, 0 }, /* (454) range_opt ::= */ - { 358, -6 }, /* (455) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ - { 359, 0 }, /* (456) every_opt ::= */ - { 359, -4 }, /* (457) every_opt ::= EVERY NK_LP duration_literal NK_RP */ - { 313, -4 }, /* (458) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 367, -1 }, /* (459) query_expression_body ::= query_primary */ - { 367, -4 }, /* (460) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 367, -3 }, /* (461) query_expression_body ::= query_expression_body UNION query_expression_body */ - { 371, -1 }, /* (462) query_primary ::= query_specification */ - { 371, -6 }, /* (463) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ - { 368, 0 }, /* (464) order_by_clause_opt ::= */ - { 368, -3 }, /* (465) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 369, 0 }, /* (466) slimit_clause_opt ::= */ - { 369, -2 }, /* (467) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 369, -4 }, /* (468) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 369, -4 }, /* (469) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 370, 0 }, /* (470) limit_clause_opt ::= */ - { 370, -2 }, /* (471) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 370, -4 }, /* (472) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 370, -4 }, /* (473) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 332, -3 }, /* (474) subquery ::= NK_LP query_expression NK_RP */ - { 353, -1 }, /* (475) search_condition ::= common_expression */ - { 372, -1 }, /* (476) sort_specification_list ::= sort_specification */ - { 372, -3 }, /* (477) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 373, -3 }, /* (478) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ - { 374, 0 }, /* (479) ordering_specification_opt ::= */ - { 374, -1 }, /* (480) ordering_specification_opt ::= ASC */ - { 374, -1 }, /* (481) ordering_specification_opt ::= DESC */ - { 375, 0 }, /* (482) null_ordering_opt ::= */ - { 375, -2 }, /* (483) null_ordering_opt ::= NULLS FIRST */ - { 375, -2 }, /* (484) null_ordering_opt ::= NULLS LAST */ + { 254, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ + { 254, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ + { 255, 0 }, /* (2) account_options ::= */ + { 255, -3 }, /* (3) account_options ::= account_options PPS literal */ + { 255, -3 }, /* (4) account_options ::= account_options TSERIES literal */ + { 255, -3 }, /* (5) account_options ::= account_options STORAGE literal */ + { 255, -3 }, /* (6) account_options ::= account_options STREAMS literal */ + { 255, -3 }, /* (7) account_options ::= account_options QTIME literal */ + { 255, -3 }, /* (8) account_options ::= account_options DBS literal */ + { 255, -3 }, /* (9) account_options ::= account_options USERS literal */ + { 255, -3 }, /* (10) account_options ::= account_options CONNS literal */ + { 255, -3 }, /* (11) account_options ::= account_options STATE literal */ + { 256, -1 }, /* (12) alter_account_options ::= alter_account_option */ + { 256, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ + { 258, -2 }, /* (14) alter_account_option ::= PASS literal */ + { 258, -2 }, /* (15) alter_account_option ::= PPS literal */ + { 258, -2 }, /* (16) alter_account_option ::= TSERIES literal */ + { 258, -2 }, /* (17) alter_account_option ::= STORAGE literal */ + { 258, -2 }, /* (18) alter_account_option ::= STREAMS literal */ + { 258, -2 }, /* (19) alter_account_option ::= QTIME literal */ + { 258, -2 }, /* (20) alter_account_option ::= DBS literal */ + { 258, -2 }, /* (21) alter_account_option ::= USERS literal */ + { 258, -2 }, /* (22) alter_account_option ::= CONNS literal */ + { 258, -2 }, /* (23) alter_account_option ::= STATE literal */ + { 254, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ + { 254, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ + { 254, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ + { 254, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ + { 254, -3 }, /* (28) cmd ::= DROP USER user_name */ + { 260, 0 }, /* (29) sysinfo_opt ::= */ + { 260, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ + { 254, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ + { 254, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ + { 261, -1 }, /* (33) privileges ::= ALL */ + { 261, -1 }, /* (34) privileges ::= priv_type_list */ + { 263, -1 }, /* (35) priv_type_list ::= priv_type */ + { 263, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ + { 264, -1 }, /* (37) priv_type ::= READ */ + { 264, -1 }, /* (38) priv_type ::= WRITE */ + { 262, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ + { 262, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ + { 254, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ + { 254, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ + { 254, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ + { 254, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ + { 254, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ + { 254, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ + { 254, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ + { 254, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ + { 266, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ + { 266, -1 }, /* (50) dnode_endpoint ::= NK_ID */ + { 266, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ + { 254, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ + { 254, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ + { 254, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ + { 254, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ + { 254, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ + { 254, -2 }, /* (64) cmd ::= USE db_name */ + { 254, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ + { 254, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ + { 267, -3 }, /* (67) not_exists_opt ::= IF NOT EXISTS */ + { 267, 0 }, /* (68) not_exists_opt ::= */ + { 269, -2 }, /* (69) exists_opt ::= IF EXISTS */ + { 269, 0 }, /* (70) exists_opt ::= */ + { 268, 0 }, /* (71) db_options ::= */ + { 268, -3 }, /* (72) db_options ::= db_options BUFFER NK_INTEGER */ + { 268, -3 }, /* (73) db_options ::= db_options CACHELAST NK_INTEGER */ + { 268, -3 }, /* (74) db_options ::= db_options CACHELASTSIZE NK_INTEGER */ + { 268, -3 }, /* (75) db_options ::= db_options COMP NK_INTEGER */ + { 268, -3 }, /* (76) db_options ::= db_options DURATION NK_INTEGER */ + { 268, -3 }, /* (77) db_options ::= db_options DURATION NK_VARIABLE */ + { 268, -3 }, /* (78) db_options ::= db_options FSYNC NK_INTEGER */ + { 268, -3 }, /* (79) db_options ::= db_options MAXROWS NK_INTEGER */ + { 268, -3 }, /* (80) db_options ::= db_options MINROWS NK_INTEGER */ + { 268, -3 }, /* (81) db_options ::= db_options KEEP integer_list */ + { 268, -3 }, /* (82) db_options ::= db_options KEEP variable_list */ + { 268, -3 }, /* (83) db_options ::= db_options PAGES NK_INTEGER */ + { 268, -3 }, /* (84) db_options ::= db_options PAGESIZE NK_INTEGER */ + { 268, -3 }, /* (85) db_options ::= db_options PRECISION NK_STRING */ + { 268, -3 }, /* (86) db_options ::= db_options REPLICA NK_INTEGER */ + { 268, -3 }, /* (87) db_options ::= db_options STRICT NK_INTEGER */ + { 268, -3 }, /* (88) db_options ::= db_options WAL NK_INTEGER */ + { 268, -3 }, /* (89) db_options ::= db_options VGROUPS NK_INTEGER */ + { 268, -3 }, /* (90) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ + { 268, -3 }, /* (91) db_options ::= db_options RETENTIONS retention_list */ + { 268, -3 }, /* (92) db_options ::= db_options SCHEMALESS NK_INTEGER */ + { 270, -1 }, /* (93) alter_db_options ::= alter_db_option */ + { 270, -2 }, /* (94) alter_db_options ::= alter_db_options alter_db_option */ + { 274, -2 }, /* (95) alter_db_option ::= BUFFER NK_INTEGER */ + { 274, -2 }, /* (96) alter_db_option ::= CACHELAST NK_INTEGER */ + { 274, -2 }, /* (97) alter_db_option ::= CACHELASTSIZE NK_INTEGER */ + { 274, -2 }, /* (98) alter_db_option ::= FSYNC NK_INTEGER */ + { 274, -2 }, /* (99) alter_db_option ::= KEEP integer_list */ + { 274, -2 }, /* (100) alter_db_option ::= KEEP variable_list */ + { 274, -2 }, /* (101) alter_db_option ::= PAGES NK_INTEGER */ + { 274, -2 }, /* (102) alter_db_option ::= REPLICA NK_INTEGER */ + { 274, -2 }, /* (103) alter_db_option ::= STRICT NK_INTEGER */ + { 274, -2 }, /* (104) alter_db_option ::= WAL NK_INTEGER */ + { 271, -1 }, /* (105) integer_list ::= NK_INTEGER */ + { 271, -3 }, /* (106) integer_list ::= integer_list NK_COMMA NK_INTEGER */ + { 272, -1 }, /* (107) variable_list ::= NK_VARIABLE */ + { 272, -3 }, /* (108) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ + { 273, -1 }, /* (109) retention_list ::= retention */ + { 273, -3 }, /* (110) retention_list ::= retention_list NK_COMMA retention */ + { 275, -3 }, /* (111) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ + { 254, -9 }, /* (112) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + { 254, -3 }, /* (113) cmd ::= CREATE TABLE multi_create_clause */ + { 254, -9 }, /* (114) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ + { 254, -3 }, /* (115) cmd ::= DROP TABLE multi_drop_clause */ + { 254, -4 }, /* (116) cmd ::= DROP STABLE exists_opt full_table_name */ + { 254, -3 }, /* (117) cmd ::= ALTER TABLE alter_table_clause */ + { 254, -3 }, /* (118) cmd ::= ALTER STABLE alter_table_clause */ + { 283, -2 }, /* (119) alter_table_clause ::= full_table_name alter_table_options */ + { 283, -5 }, /* (120) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + { 283, -4 }, /* (121) alter_table_clause ::= full_table_name DROP COLUMN column_name */ + { 283, -5 }, /* (122) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + { 283, -5 }, /* (123) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + { 283, -5 }, /* (124) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + { 283, -4 }, /* (125) alter_table_clause ::= full_table_name DROP TAG column_name */ + { 283, -5 }, /* (126) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + { 283, -5 }, /* (127) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + { 283, -6 }, /* (128) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ + { 280, -1 }, /* (129) multi_create_clause ::= create_subtable_clause */ + { 280, -2 }, /* (130) multi_create_clause ::= multi_create_clause create_subtable_clause */ + { 288, -10 }, /* (131) 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 */ + { 282, -1 }, /* (132) multi_drop_clause ::= drop_table_clause */ + { 282, -2 }, /* (133) multi_drop_clause ::= multi_drop_clause drop_table_clause */ + { 291, -2 }, /* (134) drop_table_clause ::= exists_opt full_table_name */ + { 289, 0 }, /* (135) specific_cols_opt ::= */ + { 289, -3 }, /* (136) specific_cols_opt ::= NK_LP col_name_list NK_RP */ + { 276, -1 }, /* (137) full_table_name ::= table_name */ + { 276, -3 }, /* (138) full_table_name ::= db_name NK_DOT table_name */ + { 277, -1 }, /* (139) column_def_list ::= column_def */ + { 277, -3 }, /* (140) column_def_list ::= column_def_list NK_COMMA column_def */ + { 294, -2 }, /* (141) column_def ::= column_name type_name */ + { 294, -4 }, /* (142) column_def ::= column_name type_name COMMENT NK_STRING */ + { 286, -1 }, /* (143) type_name ::= BOOL */ + { 286, -1 }, /* (144) type_name ::= TINYINT */ + { 286, -1 }, /* (145) type_name ::= SMALLINT */ + { 286, -1 }, /* (146) type_name ::= INT */ + { 286, -1 }, /* (147) type_name ::= INTEGER */ + { 286, -1 }, /* (148) type_name ::= BIGINT */ + { 286, -1 }, /* (149) type_name ::= FLOAT */ + { 286, -1 }, /* (150) type_name ::= DOUBLE */ + { 286, -4 }, /* (151) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 286, -1 }, /* (152) type_name ::= TIMESTAMP */ + { 286, -4 }, /* (153) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 286, -2 }, /* (154) type_name ::= TINYINT UNSIGNED */ + { 286, -2 }, /* (155) type_name ::= SMALLINT UNSIGNED */ + { 286, -2 }, /* (156) type_name ::= INT UNSIGNED */ + { 286, -2 }, /* (157) type_name ::= BIGINT UNSIGNED */ + { 286, -1 }, /* (158) type_name ::= JSON */ + { 286, -4 }, /* (159) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 286, -1 }, /* (160) type_name ::= MEDIUMBLOB */ + { 286, -1 }, /* (161) type_name ::= BLOB */ + { 286, -4 }, /* (162) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 286, -1 }, /* (163) type_name ::= DECIMAL */ + { 286, -4 }, /* (164) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 286, -6 }, /* (165) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 278, 0 }, /* (166) tags_def_opt ::= */ + { 278, -1 }, /* (167) tags_def_opt ::= tags_def */ + { 281, -4 }, /* (168) tags_def ::= TAGS NK_LP column_def_list NK_RP */ + { 279, 0 }, /* (169) table_options ::= */ + { 279, -3 }, /* (170) table_options ::= table_options COMMENT NK_STRING */ + { 279, -3 }, /* (171) table_options ::= table_options MAX_DELAY duration_list */ + { 279, -3 }, /* (172) table_options ::= table_options WATERMARK duration_list */ + { 279, -5 }, /* (173) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ + { 279, -3 }, /* (174) table_options ::= table_options TTL NK_INTEGER */ + { 279, -5 }, /* (175) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + { 284, -1 }, /* (176) alter_table_options ::= alter_table_option */ + { 284, -2 }, /* (177) alter_table_options ::= alter_table_options alter_table_option */ + { 297, -2 }, /* (178) alter_table_option ::= COMMENT NK_STRING */ + { 297, -2 }, /* (179) alter_table_option ::= TTL NK_INTEGER */ + { 295, -1 }, /* (180) duration_list ::= duration_literal */ + { 295, -3 }, /* (181) duration_list ::= duration_list NK_COMMA duration_literal */ + { 296, -1 }, /* (182) rollup_func_list ::= rollup_func_name */ + { 296, -3 }, /* (183) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ + { 299, -1 }, /* (184) rollup_func_name ::= function_name */ + { 299, -1 }, /* (185) rollup_func_name ::= FIRST */ + { 299, -1 }, /* (186) rollup_func_name ::= LAST */ + { 292, -1 }, /* (187) col_name_list ::= col_name */ + { 292, -3 }, /* (188) col_name_list ::= col_name_list NK_COMMA col_name */ + { 301, -1 }, /* (189) col_name ::= column_name */ + { 254, -2 }, /* (190) cmd ::= SHOW DNODES */ + { 254, -2 }, /* (191) cmd ::= SHOW USERS */ + { 254, -2 }, /* (192) cmd ::= SHOW DATABASES */ + { 254, -4 }, /* (193) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ + { 254, -4 }, /* (194) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ + { 254, -3 }, /* (195) cmd ::= SHOW db_name_cond_opt VGROUPS */ + { 254, -2 }, /* (196) cmd ::= SHOW MNODES */ + { 254, -2 }, /* (197) cmd ::= SHOW MODULES */ + { 254, -2 }, /* (198) cmd ::= SHOW QNODES */ + { 254, -2 }, /* (199) cmd ::= SHOW FUNCTIONS */ + { 254, -5 }, /* (200) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ + { 254, -2 }, /* (201) cmd ::= SHOW STREAMS */ + { 254, -2 }, /* (202) cmd ::= SHOW ACCOUNTS */ + { 254, -2 }, /* (203) cmd ::= SHOW APPS */ + { 254, -2 }, /* (204) cmd ::= SHOW CONNECTIONS */ + { 254, -2 }, /* (205) cmd ::= SHOW LICENCE */ + { 254, -2 }, /* (206) cmd ::= SHOW GRANTS */ + { 254, -4 }, /* (207) cmd ::= SHOW CREATE DATABASE db_name */ + { 254, -4 }, /* (208) cmd ::= SHOW CREATE TABLE full_table_name */ + { 254, -4 }, /* (209) cmd ::= SHOW CREATE STABLE full_table_name */ + { 254, -2 }, /* (210) cmd ::= SHOW QUERIES */ + { 254, -2 }, /* (211) cmd ::= SHOW SCORES */ + { 254, -2 }, /* (212) cmd ::= SHOW TOPICS */ + { 254, -2 }, /* (213) cmd ::= SHOW VARIABLES */ + { 254, -3 }, /* (214) cmd ::= SHOW LOCAL VARIABLES */ + { 254, -4 }, /* (215) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + { 254, -2 }, /* (216) cmd ::= SHOW BNODES */ + { 254, -2 }, /* (217) cmd ::= SHOW SNODES */ + { 254, -2 }, /* (218) cmd ::= SHOW CLUSTER */ + { 254, -2 }, /* (219) cmd ::= SHOW TRANSACTIONS */ + { 254, -4 }, /* (220) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ + { 254, -2 }, /* (221) cmd ::= SHOW CONSUMERS */ + { 254, -2 }, /* (222) cmd ::= SHOW SUBSCRIPTIONS */ + { 302, 0 }, /* (223) db_name_cond_opt ::= */ + { 302, -2 }, /* (224) db_name_cond_opt ::= db_name NK_DOT */ + { 303, 0 }, /* (225) like_pattern_opt ::= */ + { 303, -2 }, /* (226) like_pattern_opt ::= LIKE NK_STRING */ + { 304, -1 }, /* (227) table_name_cond ::= table_name */ + { 305, 0 }, /* (228) from_db_opt ::= */ + { 305, -2 }, /* (229) from_db_opt ::= FROM db_name */ + { 254, -8 }, /* (230) cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ + { 254, -4 }, /* (231) cmd ::= DROP INDEX exists_opt index_name */ + { 307, -10 }, /* (232) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ + { 307, -12 }, /* (233) 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 */ + { 308, -1 }, /* (234) func_list ::= func */ + { 308, -3 }, /* (235) func_list ::= func_list NK_COMMA func */ + { 311, -4 }, /* (236) func ::= function_name NK_LP expression_list NK_RP */ + { 310, 0 }, /* (237) sma_stream_opt ::= */ + { 310, -3 }, /* (238) sma_stream_opt ::= stream_options WATERMARK duration_literal */ + { 310, -3 }, /* (239) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ + { 254, -6 }, /* (240) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ + { 254, -7 }, /* (241) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ + { 254, -9 }, /* (242) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ + { 254, -7 }, /* (243) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ + { 254, -9 }, /* (244) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + { 254, -4 }, /* (245) cmd ::= DROP TOPIC exists_opt topic_name */ + { 254, -7 }, /* (246) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ + { 254, -2 }, /* (247) cmd ::= DESC full_table_name */ + { 254, -2 }, /* (248) cmd ::= DESCRIBE full_table_name */ + { 254, -3 }, /* (249) cmd ::= RESET QUERY CACHE */ + { 254, -4 }, /* (250) cmd ::= EXPLAIN analyze_opt explain_options query_expression */ + { 316, 0 }, /* (251) analyze_opt ::= */ + { 316, -1 }, /* (252) analyze_opt ::= ANALYZE */ + { 317, 0 }, /* (253) explain_options ::= */ + { 317, -3 }, /* (254) explain_options ::= explain_options VERBOSE NK_BOOL */ + { 317, -3 }, /* (255) explain_options ::= explain_options RATIO NK_FLOAT */ + { 254, -6 }, /* (256) cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ + { 254, -10 }, /* (257) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ + { 254, -4 }, /* (258) cmd ::= DROP FUNCTION exists_opt function_name */ + { 318, 0 }, /* (259) agg_func_opt ::= */ + { 318, -1 }, /* (260) agg_func_opt ::= AGGREGATE */ + { 319, 0 }, /* (261) bufsize_opt ::= */ + { 319, -2 }, /* (262) bufsize_opt ::= BUFSIZE NK_INTEGER */ + { 254, -8 }, /* (263) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ + { 254, -4 }, /* (264) cmd ::= DROP STREAM exists_opt stream_name */ + { 321, 0 }, /* (265) into_opt ::= */ + { 321, -2 }, /* (266) into_opt ::= INTO full_table_name */ + { 312, 0 }, /* (267) stream_options ::= */ + { 312, -3 }, /* (268) stream_options ::= stream_options TRIGGER AT_ONCE */ + { 312, -3 }, /* (269) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + { 312, -4 }, /* (270) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + { 312, -3 }, /* (271) stream_options ::= stream_options WATERMARK duration_literal */ + { 312, -3 }, /* (272) stream_options ::= stream_options IGNORE EXPIRED */ + { 254, -3 }, /* (273) cmd ::= KILL CONNECTION NK_INTEGER */ + { 254, -3 }, /* (274) cmd ::= KILL QUERY NK_STRING */ + { 254, -3 }, /* (275) cmd ::= KILL TRANSACTION NK_INTEGER */ + { 254, -2 }, /* (276) cmd ::= BALANCE VGROUP */ + { 254, -4 }, /* (277) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + { 254, -4 }, /* (278) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + { 254, -3 }, /* (279) cmd ::= SPLIT VGROUP NK_INTEGER */ + { 322, -2 }, /* (280) dnode_list ::= DNODE NK_INTEGER */ + { 322, -3 }, /* (281) dnode_list ::= dnode_list DNODE NK_INTEGER */ + { 254, -3 }, /* (282) cmd ::= SYNCDB db_name REPLICA */ + { 254, -4 }, /* (283) cmd ::= DELETE FROM full_table_name where_clause_opt */ + { 254, -1 }, /* (284) cmd ::= query_expression */ + { 254, -5 }, /* (285) cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ + { 257, -1 }, /* (286) literal ::= NK_INTEGER */ + { 257, -1 }, /* (287) literal ::= NK_FLOAT */ + { 257, -1 }, /* (288) literal ::= NK_STRING */ + { 257, -1 }, /* (289) literal ::= NK_BOOL */ + { 257, -2 }, /* (290) literal ::= TIMESTAMP NK_STRING */ + { 257, -1 }, /* (291) literal ::= duration_literal */ + { 257, -1 }, /* (292) literal ::= NULL */ + { 257, -1 }, /* (293) literal ::= NK_QUESTION */ + { 298, -1 }, /* (294) duration_literal ::= NK_VARIABLE */ + { 324, -1 }, /* (295) signed ::= NK_INTEGER */ + { 324, -2 }, /* (296) signed ::= NK_PLUS NK_INTEGER */ + { 324, -2 }, /* (297) signed ::= NK_MINUS NK_INTEGER */ + { 324, -1 }, /* (298) signed ::= NK_FLOAT */ + { 324, -2 }, /* (299) signed ::= NK_PLUS NK_FLOAT */ + { 324, -2 }, /* (300) signed ::= NK_MINUS NK_FLOAT */ + { 287, -1 }, /* (301) signed_literal ::= signed */ + { 287, -1 }, /* (302) signed_literal ::= NK_STRING */ + { 287, -1 }, /* (303) signed_literal ::= NK_BOOL */ + { 287, -2 }, /* (304) signed_literal ::= TIMESTAMP NK_STRING */ + { 287, -1 }, /* (305) signed_literal ::= duration_literal */ + { 287, -1 }, /* (306) signed_literal ::= NULL */ + { 287, -1 }, /* (307) signed_literal ::= literal_func */ + { 326, -1 }, /* (308) literal_list ::= signed_literal */ + { 326, -3 }, /* (309) literal_list ::= literal_list NK_COMMA signed_literal */ + { 265, -1 }, /* (310) db_name ::= NK_ID */ + { 293, -1 }, /* (311) table_name ::= NK_ID */ + { 285, -1 }, /* (312) column_name ::= NK_ID */ + { 300, -1 }, /* (313) function_name ::= NK_ID */ + { 327, -1 }, /* (314) table_alias ::= NK_ID */ + { 328, -1 }, /* (315) column_alias ::= NK_ID */ + { 259, -1 }, /* (316) user_name ::= NK_ID */ + { 306, -1 }, /* (317) index_name ::= NK_ID */ + { 313, -1 }, /* (318) topic_name ::= NK_ID */ + { 320, -1 }, /* (319) stream_name ::= NK_ID */ + { 315, -1 }, /* (320) cgroup_name ::= NK_ID */ + { 329, -1 }, /* (321) expression ::= literal */ + { 329, -1 }, /* (322) expression ::= pseudo_column */ + { 329, -1 }, /* (323) expression ::= column_reference */ + { 329, -1 }, /* (324) expression ::= function_expression */ + { 329, -1 }, /* (325) expression ::= subquery */ + { 329, -3 }, /* (326) expression ::= NK_LP expression NK_RP */ + { 329, -2 }, /* (327) expression ::= NK_PLUS expression */ + { 329, -2 }, /* (328) expression ::= NK_MINUS expression */ + { 329, -3 }, /* (329) expression ::= expression NK_PLUS expression */ + { 329, -3 }, /* (330) expression ::= expression NK_MINUS expression */ + { 329, -3 }, /* (331) expression ::= expression NK_STAR expression */ + { 329, -3 }, /* (332) expression ::= expression NK_SLASH expression */ + { 329, -3 }, /* (333) expression ::= expression NK_REM expression */ + { 329, -3 }, /* (334) expression ::= column_reference NK_ARROW NK_STRING */ + { 329, -3 }, /* (335) expression ::= expression NK_BITAND expression */ + { 329, -3 }, /* (336) expression ::= expression NK_BITOR expression */ + { 290, -1 }, /* (337) expression_list ::= expression */ + { 290, -3 }, /* (338) expression_list ::= expression_list NK_COMMA expression */ + { 331, -1 }, /* (339) column_reference ::= column_name */ + { 331, -3 }, /* (340) column_reference ::= table_name NK_DOT column_name */ + { 330, -1 }, /* (341) pseudo_column ::= ROWTS */ + { 330, -1 }, /* (342) pseudo_column ::= TBNAME */ + { 330, -3 }, /* (343) pseudo_column ::= table_name NK_DOT TBNAME */ + { 330, -1 }, /* (344) pseudo_column ::= QSTARTTS */ + { 330, -1 }, /* (345) pseudo_column ::= QENDTS */ + { 330, -1 }, /* (346) pseudo_column ::= WSTARTTS */ + { 330, -1 }, /* (347) pseudo_column ::= WENDTS */ + { 330, -1 }, /* (348) pseudo_column ::= WDURATION */ + { 332, -4 }, /* (349) function_expression ::= function_name NK_LP expression_list NK_RP */ + { 332, -4 }, /* (350) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ + { 332, -6 }, /* (351) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ + { 332, -1 }, /* (352) function_expression ::= literal_func */ + { 325, -3 }, /* (353) literal_func ::= noarg_func NK_LP NK_RP */ + { 325, -1 }, /* (354) literal_func ::= NOW */ + { 336, -1 }, /* (355) noarg_func ::= NOW */ + { 336, -1 }, /* (356) noarg_func ::= TODAY */ + { 336, -1 }, /* (357) noarg_func ::= TIMEZONE */ + { 336, -1 }, /* (358) noarg_func ::= DATABASE */ + { 336, -1 }, /* (359) noarg_func ::= CLIENT_VERSION */ + { 336, -1 }, /* (360) noarg_func ::= SERVER_VERSION */ + { 336, -1 }, /* (361) noarg_func ::= SERVER_STATUS */ + { 336, -1 }, /* (362) noarg_func ::= CURRENT_USER */ + { 336, -1 }, /* (363) noarg_func ::= USER */ + { 334, -1 }, /* (364) star_func ::= COUNT */ + { 334, -1 }, /* (365) star_func ::= FIRST */ + { 334, -1 }, /* (366) star_func ::= LAST */ + { 334, -1 }, /* (367) star_func ::= LAST_ROW */ + { 335, -1 }, /* (368) star_func_para_list ::= NK_STAR */ + { 335, -1 }, /* (369) star_func_para_list ::= other_para_list */ + { 337, -1 }, /* (370) other_para_list ::= star_func_para */ + { 337, -3 }, /* (371) other_para_list ::= other_para_list NK_COMMA star_func_para */ + { 338, -1 }, /* (372) star_func_para ::= expression */ + { 338, -3 }, /* (373) star_func_para ::= table_name NK_DOT NK_STAR */ + { 339, -3 }, /* (374) predicate ::= expression compare_op expression */ + { 339, -5 }, /* (375) predicate ::= expression BETWEEN expression AND expression */ + { 339, -6 }, /* (376) predicate ::= expression NOT BETWEEN expression AND expression */ + { 339, -3 }, /* (377) predicate ::= expression IS NULL */ + { 339, -4 }, /* (378) predicate ::= expression IS NOT NULL */ + { 339, -3 }, /* (379) predicate ::= expression in_op in_predicate_value */ + { 340, -1 }, /* (380) compare_op ::= NK_LT */ + { 340, -1 }, /* (381) compare_op ::= NK_GT */ + { 340, -1 }, /* (382) compare_op ::= NK_LE */ + { 340, -1 }, /* (383) compare_op ::= NK_GE */ + { 340, -1 }, /* (384) compare_op ::= NK_NE */ + { 340, -1 }, /* (385) compare_op ::= NK_EQ */ + { 340, -1 }, /* (386) compare_op ::= LIKE */ + { 340, -2 }, /* (387) compare_op ::= NOT LIKE */ + { 340, -1 }, /* (388) compare_op ::= MATCH */ + { 340, -1 }, /* (389) compare_op ::= NMATCH */ + { 340, -1 }, /* (390) compare_op ::= CONTAINS */ + { 341, -1 }, /* (391) in_op ::= IN */ + { 341, -2 }, /* (392) in_op ::= NOT IN */ + { 342, -3 }, /* (393) in_predicate_value ::= NK_LP expression_list NK_RP */ + { 343, -1 }, /* (394) boolean_value_expression ::= boolean_primary */ + { 343, -2 }, /* (395) boolean_value_expression ::= NOT boolean_primary */ + { 343, -3 }, /* (396) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 343, -3 }, /* (397) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 344, -1 }, /* (398) boolean_primary ::= predicate */ + { 344, -3 }, /* (399) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 345, -1 }, /* (400) common_expression ::= expression */ + { 345, -1 }, /* (401) common_expression ::= boolean_value_expression */ + { 346, 0 }, /* (402) from_clause_opt ::= */ + { 346, -2 }, /* (403) from_clause_opt ::= FROM table_reference_list */ + { 347, -1 }, /* (404) table_reference_list ::= table_reference */ + { 347, -3 }, /* (405) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 348, -1 }, /* (406) table_reference ::= table_primary */ + { 348, -1 }, /* (407) table_reference ::= joined_table */ + { 349, -2 }, /* (408) table_primary ::= table_name alias_opt */ + { 349, -4 }, /* (409) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 349, -2 }, /* (410) table_primary ::= subquery alias_opt */ + { 349, -1 }, /* (411) table_primary ::= parenthesized_joined_table */ + { 351, 0 }, /* (412) alias_opt ::= */ + { 351, -1 }, /* (413) alias_opt ::= table_alias */ + { 351, -2 }, /* (414) alias_opt ::= AS table_alias */ + { 352, -3 }, /* (415) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 352, -3 }, /* (416) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 350, -6 }, /* (417) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 353, 0 }, /* (418) join_type ::= */ + { 353, -1 }, /* (419) join_type ::= INNER */ + { 355, -12 }, /* (420) query_specification ::= SELECT set_quantifier_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 */ + { 356, 0 }, /* (421) set_quantifier_opt ::= */ + { 356, -1 }, /* (422) set_quantifier_opt ::= DISTINCT */ + { 356, -1 }, /* (423) set_quantifier_opt ::= ALL */ + { 357, -1 }, /* (424) select_list ::= select_item */ + { 357, -3 }, /* (425) select_list ::= select_list NK_COMMA select_item */ + { 365, -1 }, /* (426) select_item ::= NK_STAR */ + { 365, -1 }, /* (427) select_item ::= common_expression */ + { 365, -2 }, /* (428) select_item ::= common_expression column_alias */ + { 365, -3 }, /* (429) select_item ::= common_expression AS column_alias */ + { 365, -3 }, /* (430) select_item ::= table_name NK_DOT NK_STAR */ + { 323, 0 }, /* (431) where_clause_opt ::= */ + { 323, -2 }, /* (432) where_clause_opt ::= WHERE search_condition */ + { 358, 0 }, /* (433) partition_by_clause_opt ::= */ + { 358, -3 }, /* (434) partition_by_clause_opt ::= PARTITION BY expression_list */ + { 362, 0 }, /* (435) twindow_clause_opt ::= */ + { 362, -6 }, /* (436) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + { 362, -4 }, /* (437) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ + { 362, -6 }, /* (438) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 362, -8 }, /* (439) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 309, 0 }, /* (440) sliding_opt ::= */ + { 309, -4 }, /* (441) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 361, 0 }, /* (442) fill_opt ::= */ + { 361, -4 }, /* (443) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 361, -6 }, /* (444) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 366, -1 }, /* (445) fill_mode ::= NONE */ + { 366, -1 }, /* (446) fill_mode ::= PREV */ + { 366, -1 }, /* (447) fill_mode ::= NULL */ + { 366, -1 }, /* (448) fill_mode ::= LINEAR */ + { 366, -1 }, /* (449) fill_mode ::= NEXT */ + { 363, 0 }, /* (450) group_by_clause_opt ::= */ + { 363, -3 }, /* (451) group_by_clause_opt ::= GROUP BY group_by_list */ + { 367, -1 }, /* (452) group_by_list ::= expression */ + { 367, -3 }, /* (453) group_by_list ::= group_by_list NK_COMMA expression */ + { 364, 0 }, /* (454) having_clause_opt ::= */ + { 364, -2 }, /* (455) having_clause_opt ::= HAVING search_condition */ + { 359, 0 }, /* (456) range_opt ::= */ + { 359, -6 }, /* (457) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ + { 360, 0 }, /* (458) every_opt ::= */ + { 360, -4 }, /* (459) every_opt ::= EVERY NK_LP duration_literal NK_RP */ + { 314, -4 }, /* (460) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 368, -1 }, /* (461) query_expression_body ::= query_primary */ + { 368, -4 }, /* (462) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 368, -3 }, /* (463) query_expression_body ::= query_expression_body UNION query_expression_body */ + { 372, -1 }, /* (464) query_primary ::= query_specification */ + { 372, -6 }, /* (465) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ + { 369, 0 }, /* (466) order_by_clause_opt ::= */ + { 369, -3 }, /* (467) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 370, 0 }, /* (468) slimit_clause_opt ::= */ + { 370, -2 }, /* (469) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 370, -4 }, /* (470) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 370, -4 }, /* (471) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 371, 0 }, /* (472) limit_clause_opt ::= */ + { 371, -2 }, /* (473) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 371, -4 }, /* (474) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 371, -4 }, /* (475) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 333, -3 }, /* (476) subquery ::= NK_LP query_expression NK_RP */ + { 354, -1 }, /* (477) search_condition ::= common_expression */ + { 373, -1 }, /* (478) sort_specification_list ::= sort_specification */ + { 373, -3 }, /* (479) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 374, -3 }, /* (480) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ + { 375, 0 }, /* (481) ordering_specification_opt ::= */ + { 375, -1 }, /* (482) ordering_specification_opt ::= ASC */ + { 375, -1 }, /* (483) ordering_specification_opt ::= DESC */ + { 376, 0 }, /* (484) null_ordering_opt ::= */ + { 376, -2 }, /* (485) null_ordering_opt ::= NULLS FIRST */ + { 376, -2 }, /* (486) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -3267,11 +3271,11 @@ static YYACTIONTYPE yy_reduce( YYMINORTYPE yylhsminor; case 0: /* cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } - yy_destructor(yypParser,254,&yymsp[0].minor); + yy_destructor(yypParser,255,&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,255,&yymsp[0].minor); + yy_destructor(yypParser,256,&yymsp[0].minor); break; case 2: /* account_options ::= */ { } @@ -3285,20 +3289,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,254,&yymsp[-2].minor); +{ yy_destructor(yypParser,255,&yymsp[-2].minor); { } - yy_destructor(yypParser,256,&yymsp[0].minor); + yy_destructor(yypParser,257,&yymsp[0].minor); } break; case 12: /* alter_account_options ::= alter_account_option */ -{ yy_destructor(yypParser,257,&yymsp[0].minor); +{ yy_destructor(yypParser,258,&yymsp[0].minor); { } } break; case 13: /* alter_account_options ::= alter_account_options alter_account_option */ -{ yy_destructor(yypParser,255,&yymsp[-1].minor); +{ yy_destructor(yypParser,256,&yymsp[-1].minor); { } - yy_destructor(yypParser,257,&yymsp[0].minor); + yy_destructor(yypParser,258,&yymsp[0].minor); } break; case 14: /* alter_account_option ::= PASS literal */ @@ -3312,72 +3316,72 @@ static YYACTIONTYPE yy_reduce( case 22: /* alter_account_option ::= CONNS literal */ yytestcase(yyruleno==22); case 23: /* alter_account_option ::= STATE literal */ yytestcase(yyruleno==23); { } - yy_destructor(yypParser,256,&yymsp[0].minor); + yy_destructor(yypParser,257,&yymsp[0].minor); break; case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ -{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy401, &yymsp[-1].minor.yy0, yymsp[0].minor.yy695); } +{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy5, &yymsp[-1].minor.yy0, yymsp[0].minor.yy535); } break; case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy401, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy5, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } break; case 26: /* cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy401, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy5, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } break; case 27: /* cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy401, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy5, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } break; case 28: /* cmd ::= DROP USER user_name */ -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy401); } +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy5); } break; case 29: /* sysinfo_opt ::= */ -{ yymsp[1].minor.yy695 = 1; } +{ yymsp[1].minor.yy535 = 1; } break; case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */ -{ yymsp[-1].minor.yy695 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } +{ yymsp[-1].minor.yy535 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } break; case 31: /* cmd ::= GRANT privileges ON priv_level TO user_name */ -{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy525, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy401); } +{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy311, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5); } break; case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */ -{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy525, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy401); } +{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy311, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5); } break; case 33: /* privileges ::= ALL */ -{ yymsp[0].minor.yy525 = PRIVILEGE_TYPE_ALL; } +{ yymsp[0].minor.yy311 = PRIVILEGE_TYPE_ALL; } break; case 34: /* privileges ::= priv_type_list */ case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35); -{ yylhsminor.yy525 = yymsp[0].minor.yy525; } - yymsp[0].minor.yy525 = yylhsminor.yy525; +{ yylhsminor.yy311 = yymsp[0].minor.yy311; } + yymsp[0].minor.yy311 = yylhsminor.yy311; break; case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ -{ yylhsminor.yy525 = yymsp[-2].minor.yy525 | yymsp[0].minor.yy525; } - yymsp[-2].minor.yy525 = yylhsminor.yy525; +{ yylhsminor.yy311 = yymsp[-2].minor.yy311 | yymsp[0].minor.yy311; } + yymsp[-2].minor.yy311 = yylhsminor.yy311; break; case 37: /* priv_type ::= READ */ -{ yymsp[0].minor.yy525 = PRIVILEGE_TYPE_READ; } +{ yymsp[0].minor.yy311 = PRIVILEGE_TYPE_READ; } break; case 38: /* priv_type ::= WRITE */ -{ yymsp[0].minor.yy525 = PRIVILEGE_TYPE_WRITE; } +{ yymsp[0].minor.yy311 = PRIVILEGE_TYPE_WRITE; } break; case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ -{ yylhsminor.yy401 = yymsp[-2].minor.yy0; } - yymsp[-2].minor.yy401 = yylhsminor.yy401; +{ yylhsminor.yy5 = yymsp[-2].minor.yy0; } + yymsp[-2].minor.yy5 = yylhsminor.yy5; break; case 40: /* priv_level ::= db_name NK_DOT NK_STAR */ -{ yylhsminor.yy401 = yymsp[-2].minor.yy401; } - yymsp[-2].minor.yy401 = yylhsminor.yy401; +{ yylhsminor.yy5 = yymsp[-2].minor.yy5; } + yymsp[-2].minor.yy5 = yylhsminor.yy5; break; case 41: /* cmd ::= CREATE DNODE dnode_endpoint */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy401, NULL); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy5, NULL); } break; case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0); } break; case 43: /* cmd ::= DROP DNODE NK_INTEGER */ { pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy0); } break; case 44: /* cmd ::= DROP DNODE dnode_endpoint */ -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy401); } +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy5); } break; case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } @@ -3394,32 +3398,32 @@ static YYACTIONTYPE yy_reduce( case 49: /* dnode_endpoint ::= NK_STRING */ case 50: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==50); case 51: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==51); - case 308: /* db_name ::= NK_ID */ yytestcase(yyruleno==308); - case 309: /* table_name ::= NK_ID */ yytestcase(yyruleno==309); - case 310: /* column_name ::= NK_ID */ yytestcase(yyruleno==310); - case 311: /* function_name ::= NK_ID */ yytestcase(yyruleno==311); - case 312: /* table_alias ::= NK_ID */ yytestcase(yyruleno==312); - case 313: /* column_alias ::= NK_ID */ yytestcase(yyruleno==313); - case 314: /* user_name ::= NK_ID */ yytestcase(yyruleno==314); - case 315: /* index_name ::= NK_ID */ yytestcase(yyruleno==315); - case 316: /* topic_name ::= NK_ID */ yytestcase(yyruleno==316); - case 317: /* stream_name ::= NK_ID */ yytestcase(yyruleno==317); - case 318: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==318); - case 353: /* noarg_func ::= NOW */ yytestcase(yyruleno==353); - case 354: /* noarg_func ::= TODAY */ yytestcase(yyruleno==354); - case 355: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==355); - case 356: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==356); - case 357: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==357); - case 358: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==358); - case 359: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==359); - case 360: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==360); - case 361: /* noarg_func ::= USER */ yytestcase(yyruleno==361); - case 362: /* star_func ::= COUNT */ yytestcase(yyruleno==362); - case 363: /* star_func ::= FIRST */ yytestcase(yyruleno==363); - case 364: /* star_func ::= LAST */ yytestcase(yyruleno==364); - case 365: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==365); -{ yylhsminor.yy401 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy401 = yylhsminor.yy401; + case 310: /* db_name ::= NK_ID */ yytestcase(yyruleno==310); + case 311: /* table_name ::= NK_ID */ yytestcase(yyruleno==311); + case 312: /* column_name ::= NK_ID */ yytestcase(yyruleno==312); + case 313: /* function_name ::= NK_ID */ yytestcase(yyruleno==313); + case 314: /* table_alias ::= NK_ID */ yytestcase(yyruleno==314); + case 315: /* column_alias ::= NK_ID */ yytestcase(yyruleno==315); + case 316: /* user_name ::= NK_ID */ yytestcase(yyruleno==316); + case 317: /* index_name ::= NK_ID */ yytestcase(yyruleno==317); + case 318: /* topic_name ::= NK_ID */ yytestcase(yyruleno==318); + case 319: /* stream_name ::= NK_ID */ yytestcase(yyruleno==319); + case 320: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==320); + case 355: /* noarg_func ::= NOW */ yytestcase(yyruleno==355); + case 356: /* noarg_func ::= TODAY */ yytestcase(yyruleno==356); + case 357: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==357); + case 358: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==358); + case 359: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==359); + case 360: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==360); + case 361: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==361); + case 362: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==362); + case 363: /* noarg_func ::= USER */ yytestcase(yyruleno==363); + case 364: /* star_func ::= COUNT */ yytestcase(yyruleno==364); + case 365: /* star_func ::= FIRST */ yytestcase(yyruleno==365); + case 366: /* star_func ::= LAST */ yytestcase(yyruleno==366); + case 367: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==367); +{ yylhsminor.yy5 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy5 = yylhsminor.yy5; break; case 52: /* cmd ::= ALTER LOCAL NK_STRING */ { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } @@ -3452,1227 +3456,1234 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_MNODE_STMT, &yymsp[0].minor.yy0); } break; case 62: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ -{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy89, &yymsp[-1].minor.yy401, yymsp[0].minor.yy248); } +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy403, &yymsp[-1].minor.yy5, yymsp[0].minor.yy652); } break; case 63: /* cmd ::= DROP DATABASE exists_opt db_name */ -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy401); } +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } break; case 64: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy401); } +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy5); } break; case 65: /* cmd ::= ALTER DATABASE db_name alter_db_options */ -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy401, yymsp[0].minor.yy248); } +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy5, yymsp[0].minor.yy652); } break; case 66: /* cmd ::= FLUSH DATABASE db_name */ -{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy401); } +{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy5); } break; case 67: /* not_exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy89 = true; } +{ yymsp[-2].minor.yy403 = true; } break; case 68: /* not_exists_opt ::= */ case 70: /* exists_opt ::= */ yytestcase(yyruleno==70); - case 249: /* analyze_opt ::= */ yytestcase(yyruleno==249); - case 257: /* agg_func_opt ::= */ yytestcase(yyruleno==257); - case 419: /* set_quantifier_opt ::= */ yytestcase(yyruleno==419); -{ yymsp[1].minor.yy89 = false; } + case 251: /* analyze_opt ::= */ yytestcase(yyruleno==251); + case 259: /* agg_func_opt ::= */ yytestcase(yyruleno==259); + case 421: /* set_quantifier_opt ::= */ yytestcase(yyruleno==421); +{ yymsp[1].minor.yy403 = false; } break; case 69: /* exists_opt ::= IF EXISTS */ -{ yymsp[-1].minor.yy89 = true; } +{ yymsp[-1].minor.yy403 = true; } break; case 71: /* db_options ::= */ -{ yymsp[1].minor.yy248 = createDefaultDatabaseOptions(pCxt); } +{ yymsp[1].minor.yy652 = createDefaultDatabaseOptions(pCxt); } break; case 72: /* db_options ::= db_options BUFFER NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; case 73: /* db_options ::= db_options CACHELAST NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 74: /* db_options ::= db_options CACHELASTSIZE NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_CACHELASTSIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 75: /* db_options ::= db_options COMP NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 74: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 76: /* db_options ::= db_options DURATION NK_INTEGER */ + case 77: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==77); +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 75: /* db_options ::= db_options DURATION NK_INTEGER */ - case 76: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==76); -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 78: /* db_options ::= db_options FSYNC NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 77: /* db_options ::= db_options FSYNC NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 79: /* db_options ::= db_options MAXROWS NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 78: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 80: /* db_options ::= db_options MINROWS NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 79: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 81: /* db_options ::= db_options KEEP integer_list */ + case 82: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==82); +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_KEEP, yymsp[0].minor.yy210); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 80: /* db_options ::= db_options KEEP integer_list */ - case 81: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==81); -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_KEEP, yymsp[0].minor.yy552); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 82: /* db_options ::= db_options PAGES NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 83: /* db_options ::= db_options PAGESIZE NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 84: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 85: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 86: /* db_options ::= db_options STRICT NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 87: /* db_options ::= db_options WAL NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 88: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 89: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 90: /* db_options ::= db_options RETENTIONS retention_list */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_RETENTIONS, yymsp[0].minor.yy552); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 91: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ -{ yylhsminor.yy248 = setDatabaseOption(pCxt, yymsp[-2].minor.yy248, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 92: /* alter_db_options ::= alter_db_option */ -{ yylhsminor.yy248 = createAlterDatabaseOptions(pCxt); yylhsminor.yy248 = setAlterDatabaseOption(pCxt, yylhsminor.yy248, &yymsp[0].minor.yy301); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 93: /* alter_db_options ::= alter_db_options alter_db_option */ -{ yylhsminor.yy248 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy248, &yymsp[0].minor.yy301); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; - break; - case 94: /* alter_db_option ::= BUFFER NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } - break; - case 95: /* alter_db_option ::= CACHELAST NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = DB_OPTION_CACHELAST; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } - break; - case 96: /* alter_db_option ::= FSYNC NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } - break; - case 97: /* alter_db_option ::= KEEP integer_list */ - case 98: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==98); -{ yymsp[-1].minor.yy301.type = DB_OPTION_KEEP; yymsp[-1].minor.yy301.pList = yymsp[0].minor.yy552; } - break; - case 99: /* alter_db_option ::= PAGES NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = DB_OPTION_PAGES; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } - break; - case 100: /* alter_db_option ::= REPLICA NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } - break; - case 101: /* alter_db_option ::= STRICT NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = DB_OPTION_STRICT; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } - break; - case 102: /* alter_db_option ::= WAL NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = DB_OPTION_WAL; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } - break; - case 103: /* integer_list ::= NK_INTEGER */ -{ yylhsminor.yy552 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy552 = yylhsminor.yy552; - break; - case 104: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 279: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==279); -{ yylhsminor.yy552 = addNodeToList(pCxt, yymsp[-2].minor.yy552, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy552 = yylhsminor.yy552; - break; - case 105: /* variable_list ::= NK_VARIABLE */ -{ yylhsminor.yy552 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy552 = yylhsminor.yy552; - break; - case 106: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ -{ yylhsminor.yy552 = addNodeToList(pCxt, yymsp[-2].minor.yy552, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy552 = yylhsminor.yy552; - break; - case 107: /* retention_list ::= retention */ - case 127: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==127); - case 130: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==130); - case 137: /* column_def_list ::= column_def */ yytestcase(yyruleno==137); - case 180: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==180); - case 185: /* col_name_list ::= col_name */ yytestcase(yyruleno==185); - case 232: /* func_list ::= func */ yytestcase(yyruleno==232); - case 306: /* literal_list ::= signed_literal */ yytestcase(yyruleno==306); - case 368: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==368); - case 422: /* select_list ::= select_item */ yytestcase(yyruleno==422); - case 476: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==476); -{ yylhsminor.yy552 = createNodeList(pCxt, yymsp[0].minor.yy248); } - yymsp[0].minor.yy552 = yylhsminor.yy552; - break; - case 108: /* retention_list ::= retention_list NK_COMMA retention */ - case 138: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==138); - case 181: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==181); - case 186: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==186); - case 233: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==233); - case 307: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==307); - case 369: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==369); - case 423: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==423); - case 477: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==477); -{ yylhsminor.yy552 = addNodeToList(pCxt, yymsp[-2].minor.yy552, yymsp[0].minor.yy248); } - yymsp[-2].minor.yy552 = yylhsminor.yy552; - break; - case 109: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ -{ yylhsminor.yy248 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 110: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - case 112: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==112); -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy89, yymsp[-5].minor.yy248, yymsp[-3].minor.yy552, yymsp[-1].minor.yy552, yymsp[0].minor.yy248); } - break; - case 111: /* cmd ::= CREATE TABLE multi_create_clause */ -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy552); } - break; - case 113: /* cmd ::= DROP TABLE multi_drop_clause */ -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy552); } - break; - case 114: /* cmd ::= DROP STABLE exists_opt full_table_name */ -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy89, yymsp[0].minor.yy248); } - break; - case 115: /* cmd ::= ALTER TABLE alter_table_clause */ - case 282: /* cmd ::= query_expression */ yytestcase(yyruleno==282); -{ pCxt->pRootNode = yymsp[0].minor.yy248; } - break; - case 116: /* cmd ::= ALTER STABLE alter_table_clause */ -{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy248); } - break; - case 117: /* alter_table_clause ::= full_table_name alter_table_options */ -{ yylhsminor.yy248 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy248, yymsp[0].minor.yy248); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 83: /* db_options ::= db_options PAGES NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 84: /* db_options ::= db_options PAGESIZE NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 85: /* db_options ::= db_options PRECISION NK_STRING */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 86: /* db_options ::= db_options REPLICA NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 87: /* db_options ::= db_options STRICT NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 88: /* db_options ::= db_options WAL NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 89: /* db_options ::= db_options VGROUPS NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 90: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 91: /* db_options ::= db_options RETENTIONS retention_list */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_RETENTIONS, yymsp[0].minor.yy210); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 92: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ +{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 93: /* alter_db_options ::= alter_db_option */ +{ yylhsminor.yy652 = createAlterDatabaseOptions(pCxt); yylhsminor.yy652 = setAlterDatabaseOption(pCxt, yylhsminor.yy652, &yymsp[0].minor.yy351); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 94: /* alter_db_options ::= alter_db_options alter_db_option */ +{ yylhsminor.yy652 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy652, &yymsp[0].minor.yy351); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; + break; + case 95: /* alter_db_option ::= BUFFER NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 96: /* alter_db_option ::= CACHELAST NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_CACHELAST; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 97: /* alter_db_option ::= CACHELASTSIZE NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_CACHELASTSIZE; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 98: /* alter_db_option ::= FSYNC NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 99: /* alter_db_option ::= KEEP integer_list */ + case 100: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==100); +{ yymsp[-1].minor.yy351.type = DB_OPTION_KEEP; yymsp[-1].minor.yy351.pList = yymsp[0].minor.yy210; } + break; + case 101: /* alter_db_option ::= PAGES NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_PAGES; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 102: /* alter_db_option ::= REPLICA NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 103: /* alter_db_option ::= STRICT NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_STRICT; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 104: /* alter_db_option ::= WAL NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = DB_OPTION_WAL; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + break; + case 105: /* integer_list ::= NK_INTEGER */ +{ yylhsminor.yy210 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy210 = yylhsminor.yy210; + break; + case 106: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ + case 281: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==281); +{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy210 = yylhsminor.yy210; + break; + case 107: /* variable_list ::= NK_VARIABLE */ +{ yylhsminor.yy210 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy210 = yylhsminor.yy210; + break; + case 108: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ +{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy210 = yylhsminor.yy210; + break; + case 109: /* retention_list ::= retention */ + case 129: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==129); + case 132: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==132); + case 139: /* column_def_list ::= column_def */ yytestcase(yyruleno==139); + case 182: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==182); + case 187: /* col_name_list ::= col_name */ yytestcase(yyruleno==187); + case 234: /* func_list ::= func */ yytestcase(yyruleno==234); + case 308: /* literal_list ::= signed_literal */ yytestcase(yyruleno==308); + case 370: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==370); + case 424: /* select_list ::= select_item */ yytestcase(yyruleno==424); + case 478: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==478); +{ yylhsminor.yy210 = createNodeList(pCxt, yymsp[0].minor.yy652); } + yymsp[0].minor.yy210 = yylhsminor.yy210; + break; + case 110: /* retention_list ::= retention_list NK_COMMA retention */ + case 140: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==140); + case 183: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==183); + case 188: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==188); + case 235: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==235); + case 309: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==309); + case 371: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==371); + case 425: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==425); + case 479: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==479); +{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, yymsp[0].minor.yy652); } + yymsp[-2].minor.yy210 = yylhsminor.yy210; + break; + case 111: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ +{ yylhsminor.yy652 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 112: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + case 114: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==114); +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy403, yymsp[-5].minor.yy652, yymsp[-3].minor.yy210, yymsp[-1].minor.yy210, yymsp[0].minor.yy652); } + break; + case 113: /* cmd ::= CREATE TABLE multi_create_clause */ +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy210); } + break; + case 115: /* cmd ::= DROP TABLE multi_drop_clause */ +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy210); } + break; + case 116: /* cmd ::= DROP STABLE exists_opt full_table_name */ +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy403, yymsp[0].minor.yy652); } + break; + case 117: /* cmd ::= ALTER TABLE alter_table_clause */ + case 284: /* cmd ::= query_expression */ yytestcase(yyruleno==284); +{ pCxt->pRootNode = yymsp[0].minor.yy652; } + break; + case 118: /* cmd ::= ALTER STABLE alter_table_clause */ +{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy652); } + break; + case 119: /* alter_table_clause ::= full_table_name alter_table_options */ +{ yylhsminor.yy652 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 118: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ -{ yylhsminor.yy248 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy248, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy401, yymsp[0].minor.yy224); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 120: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ +{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 119: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ -{ yylhsminor.yy248 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy248, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy401); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; - break; - case 120: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ -{ yylhsminor.yy248 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy248, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy401, yymsp[0].minor.yy224); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 121: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ +{ yylhsminor.yy652 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy652, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy5); } + yymsp[-3].minor.yy652 = yylhsminor.yy652; + break; + case 122: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ +{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 121: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ -{ yylhsminor.yy248 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy248, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy401, &yymsp[0].minor.yy401); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 123: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ +{ yylhsminor.yy652 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 122: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ -{ yylhsminor.yy248 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy248, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy401, yymsp[0].minor.yy224); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 124: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ +{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 123: /* alter_table_clause ::= full_table_name DROP TAG column_name */ -{ yylhsminor.yy248 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy248, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy401); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + case 125: /* alter_table_clause ::= full_table_name DROP TAG column_name */ +{ yylhsminor.yy652 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy652, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy5); } + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 124: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ -{ yylhsminor.yy248 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy248, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy401, yymsp[0].minor.yy224); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 126: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ +{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 125: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ -{ yylhsminor.yy248 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy248, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy401, &yymsp[0].minor.yy401); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 127: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ +{ yylhsminor.yy652 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 126: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ -{ yylhsminor.yy248 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy248, &yymsp[-2].minor.yy401, yymsp[0].minor.yy248); } - yymsp[-5].minor.yy248 = yylhsminor.yy248; + case 128: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ +{ yylhsminor.yy652 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy652, &yymsp[-2].minor.yy5, yymsp[0].minor.yy652); } + yymsp[-5].minor.yy652 = yylhsminor.yy652; break; - case 128: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ - case 131: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==131); -{ yylhsminor.yy552 = addNodeToList(pCxt, yymsp[-1].minor.yy552, yymsp[0].minor.yy248); } - yymsp[-1].minor.yy552 = yylhsminor.yy552; + case 130: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ + case 133: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==133); +{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-1].minor.yy210, yymsp[0].minor.yy652); } + yymsp[-1].minor.yy210 = yylhsminor.yy210; break; - case 129: /* 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.yy248 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy89, yymsp[-8].minor.yy248, yymsp[-6].minor.yy248, yymsp[-5].minor.yy552, yymsp[-2].minor.yy552, yymsp[0].minor.yy248); } - yymsp[-9].minor.yy248 = yylhsminor.yy248; + case 131: /* 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.yy652 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy403, yymsp[-8].minor.yy652, yymsp[-6].minor.yy652, yymsp[-5].minor.yy210, yymsp[-2].minor.yy210, yymsp[0].minor.yy652); } + yymsp[-9].minor.yy652 = yylhsminor.yy652; break; - case 132: /* drop_table_clause ::= exists_opt full_table_name */ -{ yylhsminor.yy248 = createDropTableClause(pCxt, yymsp[-1].minor.yy89, yymsp[0].minor.yy248); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 134: /* drop_table_clause ::= exists_opt full_table_name */ +{ yylhsminor.yy652 = createDropTableClause(pCxt, yymsp[-1].minor.yy403, yymsp[0].minor.yy652); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 133: /* specific_cols_opt ::= */ - case 164: /* tags_def_opt ::= */ yytestcase(yyruleno==164); - case 431: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==431); - case 448: /* group_by_clause_opt ::= */ yytestcase(yyruleno==448); - case 464: /* order_by_clause_opt ::= */ yytestcase(yyruleno==464); -{ yymsp[1].minor.yy552 = NULL; } + case 135: /* specific_cols_opt ::= */ + case 166: /* tags_def_opt ::= */ yytestcase(yyruleno==166); + case 433: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==433); + case 450: /* group_by_clause_opt ::= */ yytestcase(yyruleno==450); + case 466: /* order_by_clause_opt ::= */ yytestcase(yyruleno==466); +{ yymsp[1].minor.yy210 = NULL; } break; - case 134: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ -{ yymsp[-2].minor.yy552 = yymsp[-1].minor.yy552; } + case 136: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ +{ yymsp[-2].minor.yy210 = yymsp[-1].minor.yy210; } break; - case 135: /* full_table_name ::= table_name */ -{ yylhsminor.yy248 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy401, NULL); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 137: /* full_table_name ::= table_name */ +{ yylhsminor.yy652 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy5, NULL); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 136: /* full_table_name ::= db_name NK_DOT table_name */ -{ yylhsminor.yy248 = createRealTableNode(pCxt, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy401, NULL); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 138: /* full_table_name ::= db_name NK_DOT table_name */ +{ yylhsminor.yy652 = createRealTableNode(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5, NULL); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 139: /* column_def ::= column_name type_name */ -{ yylhsminor.yy248 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy401, yymsp[0].minor.yy224, NULL); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 141: /* column_def ::= column_name type_name */ +{ yylhsminor.yy652 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552, NULL); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 140: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy248 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy401, yymsp[-2].minor.yy224, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + case 142: /* column_def ::= column_name type_name COMMENT NK_STRING */ +{ yylhsminor.yy652 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy5, yymsp[-2].minor.yy552, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 141: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_BOOL); } + case 143: /* type_name ::= BOOL */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_BOOL); } break; - case 142: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_TINYINT); } + case 144: /* type_name ::= TINYINT */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; - case 143: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_SMALLINT); } + case 145: /* type_name ::= SMALLINT */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; - case 144: /* type_name ::= INT */ - case 145: /* type_name ::= INTEGER */ yytestcase(yyruleno==145); -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_INT); } + case 146: /* type_name ::= INT */ + case 147: /* type_name ::= INTEGER */ yytestcase(yyruleno==147); +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_INT); } break; - case 146: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_BIGINT); } + case 148: /* type_name ::= BIGINT */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; - case 147: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_FLOAT); } + case 149: /* type_name ::= FLOAT */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; - case 148: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_DOUBLE); } + case 150: /* type_name ::= DOUBLE */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; - case 149: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } + case 151: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; - case 150: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } + case 152: /* type_name ::= TIMESTAMP */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; - case 151: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } + case 153: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; - case 152: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_UTINYINT); } + case 154: /* type_name ::= TINYINT UNSIGNED */ +{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; - case 153: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_USMALLINT); } + case 155: /* type_name ::= SMALLINT UNSIGNED */ +{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; - case 154: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_UINT); } + case 156: /* type_name ::= INT UNSIGNED */ +{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_UINT); } break; - case 155: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_UBIGINT); } + case 157: /* type_name ::= BIGINT UNSIGNED */ +{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; - case 156: /* type_name ::= JSON */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_JSON); } + case 158: /* type_name ::= JSON */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_JSON); } break; - case 157: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } + case 159: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; - case 158: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } + case 160: /* type_name ::= MEDIUMBLOB */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; - case 159: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_BLOB); } + case 161: /* type_name ::= BLOB */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_BLOB); } break; - case 160: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } + case 162: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; - case 161: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 163: /* type_name ::= DECIMAL */ +{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 162: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 164: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy552 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 163: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy224 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 165: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy552 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 165: /* tags_def_opt ::= tags_def */ - case 367: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==367); -{ yylhsminor.yy552 = yymsp[0].minor.yy552; } - yymsp[0].minor.yy552 = yylhsminor.yy552; + case 167: /* tags_def_opt ::= tags_def */ + case 369: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==369); +{ yylhsminor.yy210 = yymsp[0].minor.yy210; } + yymsp[0].minor.yy210 = yylhsminor.yy210; break; - case 166: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ -{ yymsp[-3].minor.yy552 = yymsp[-1].minor.yy552; } + case 168: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ +{ yymsp[-3].minor.yy210 = yymsp[-1].minor.yy210; } break; - case 167: /* table_options ::= */ -{ yymsp[1].minor.yy248 = createDefaultTableOptions(pCxt); } + case 169: /* table_options ::= */ +{ yymsp[1].minor.yy652 = createDefaultTableOptions(pCxt); } break; - case 168: /* table_options ::= table_options COMMENT NK_STRING */ -{ yylhsminor.yy248 = setTableOption(pCxt, yymsp[-2].minor.yy248, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 170: /* table_options ::= table_options COMMENT NK_STRING */ +{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 169: /* table_options ::= table_options MAX_DELAY duration_list */ -{ yylhsminor.yy248 = setTableOption(pCxt, yymsp[-2].minor.yy248, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy552); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 171: /* table_options ::= table_options MAX_DELAY duration_list */ +{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy210); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 170: /* table_options ::= table_options WATERMARK duration_list */ -{ yylhsminor.yy248 = setTableOption(pCxt, yymsp[-2].minor.yy248, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy552); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 172: /* table_options ::= table_options WATERMARK duration_list */ +{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy210); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 171: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ -{ yylhsminor.yy248 = setTableOption(pCxt, yymsp[-4].minor.yy248, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy552); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 173: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ +{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-4].minor.yy652, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy210); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 172: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy248 = setTableOption(pCxt, yymsp[-2].minor.yy248, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 174: /* table_options ::= table_options TTL NK_INTEGER */ +{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 173: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -{ yylhsminor.yy248 = setTableOption(pCxt, yymsp[-4].minor.yy248, TABLE_OPTION_SMA, yymsp[-1].minor.yy552); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + case 175: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ +{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-4].minor.yy652, TABLE_OPTION_SMA, yymsp[-1].minor.yy210); } + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 174: /* alter_table_options ::= alter_table_option */ -{ yylhsminor.yy248 = createAlterTableOptions(pCxt); yylhsminor.yy248 = setTableOption(pCxt, yylhsminor.yy248, yymsp[0].minor.yy301.type, &yymsp[0].minor.yy301.val); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 176: /* alter_table_options ::= alter_table_option */ +{ yylhsminor.yy652 = createAlterTableOptions(pCxt); yylhsminor.yy652 = setTableOption(pCxt, yylhsminor.yy652, yymsp[0].minor.yy351.type, &yymsp[0].minor.yy351.val); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 175: /* alter_table_options ::= alter_table_options alter_table_option */ -{ yylhsminor.yy248 = setTableOption(pCxt, yymsp[-1].minor.yy248, yymsp[0].minor.yy301.type, &yymsp[0].minor.yy301.val); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 177: /* alter_table_options ::= alter_table_options alter_table_option */ +{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-1].minor.yy652, yymsp[0].minor.yy351.type, &yymsp[0].minor.yy351.val); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 176: /* alter_table_option ::= COMMENT NK_STRING */ -{ yymsp[-1].minor.yy301.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } + case 178: /* alter_table_option ::= COMMENT NK_STRING */ +{ yymsp[-1].minor.yy351.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } break; - case 177: /* alter_table_option ::= TTL NK_INTEGER */ -{ yymsp[-1].minor.yy301.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy301.val = yymsp[0].minor.yy0; } + case 179: /* alter_table_option ::= TTL NK_INTEGER */ +{ yymsp[-1].minor.yy351.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } break; - case 178: /* duration_list ::= duration_literal */ - case 335: /* expression_list ::= expression */ yytestcase(yyruleno==335); -{ yylhsminor.yy552 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy248)); } - yymsp[0].minor.yy552 = yylhsminor.yy552; + case 180: /* duration_list ::= duration_literal */ + case 337: /* expression_list ::= expression */ yytestcase(yyruleno==337); +{ yylhsminor.yy210 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy652)); } + yymsp[0].minor.yy210 = yylhsminor.yy210; break; - case 179: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 336: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==336); -{ yylhsminor.yy552 = addNodeToList(pCxt, yymsp[-2].minor.yy552, releaseRawExprNode(pCxt, yymsp[0].minor.yy248)); } - yymsp[-2].minor.yy552 = yylhsminor.yy552; + case 181: /* duration_list ::= duration_list NK_COMMA duration_literal */ + case 338: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==338); +{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, releaseRawExprNode(pCxt, yymsp[0].minor.yy652)); } + yymsp[-2].minor.yy210 = yylhsminor.yy210; break; - case 182: /* rollup_func_name ::= function_name */ -{ yylhsminor.yy248 = createFunctionNode(pCxt, &yymsp[0].minor.yy401, NULL); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 184: /* rollup_func_name ::= function_name */ +{ yylhsminor.yy652 = createFunctionNode(pCxt, &yymsp[0].minor.yy5, NULL); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 183: /* rollup_func_name ::= FIRST */ - case 184: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==184); -{ yylhsminor.yy248 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 185: /* rollup_func_name ::= FIRST */ + case 186: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==186); +{ yylhsminor.yy652 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 187: /* col_name ::= column_name */ -{ yylhsminor.yy248 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy401); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 189: /* col_name ::= column_name */ +{ yylhsminor.yy652 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy5); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 188: /* cmd ::= SHOW DNODES */ + case 190: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } break; - case 189: /* cmd ::= SHOW USERS */ + case 191: /* cmd ::= SHOW USERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); } break; - case 190: /* cmd ::= SHOW DATABASES */ + case 192: /* cmd ::= SHOW DATABASES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; - case 191: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy248, yymsp[0].minor.yy248, OP_TYPE_LIKE); } + case 193: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy652, yymsp[0].minor.yy652, OP_TYPE_LIKE); } break; - case 192: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy248, yymsp[0].minor.yy248, OP_TYPE_LIKE); } + case 194: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy652, yymsp[0].minor.yy652, OP_TYPE_LIKE); } break; - case 193: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy248, NULL, OP_TYPE_LIKE); } + case 195: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy652, NULL, OP_TYPE_LIKE); } break; - case 194: /* cmd ::= SHOW MNODES */ + case 196: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } break; - case 195: /* cmd ::= SHOW MODULES */ + case 197: /* cmd ::= SHOW MODULES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MODULES_STMT); } break; - case 196: /* cmd ::= SHOW QNODES */ + case 198: /* cmd ::= SHOW QNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); } break; - case 197: /* cmd ::= SHOW FUNCTIONS */ + case 199: /* cmd ::= SHOW FUNCTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } break; - case 198: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy248, yymsp[-1].minor.yy248, OP_TYPE_EQUAL); } + case 200: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy652, yymsp[-1].minor.yy652, OP_TYPE_EQUAL); } break; - case 199: /* cmd ::= SHOW STREAMS */ + case 201: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } break; - case 200: /* cmd ::= SHOW ACCOUNTS */ + case 202: /* cmd ::= SHOW ACCOUNTS */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } break; - case 201: /* cmd ::= SHOW APPS */ + case 203: /* cmd ::= SHOW APPS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT); } break; - case 202: /* cmd ::= SHOW CONNECTIONS */ + case 204: /* cmd ::= SHOW CONNECTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT); } break; - case 203: /* cmd ::= SHOW LICENCE */ - case 204: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==204); + case 205: /* cmd ::= SHOW LICENCE */ + case 206: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==206); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCE_STMT); } break; - case 205: /* cmd ::= SHOW CREATE DATABASE db_name */ -{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy401); } + case 207: /* cmd ::= SHOW CREATE DATABASE db_name */ +{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy5); } break; - case 206: /* cmd ::= SHOW CREATE TABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy248); } + case 208: /* cmd ::= SHOW CREATE TABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy652); } break; - case 207: /* cmd ::= SHOW CREATE STABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy248); } + case 209: /* cmd ::= SHOW CREATE STABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy652); } break; - case 208: /* cmd ::= SHOW QUERIES */ + case 210: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } break; - case 209: /* cmd ::= SHOW SCORES */ + case 211: /* cmd ::= SHOW SCORES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); } break; - case 210: /* cmd ::= SHOW TOPICS */ + case 212: /* cmd ::= SHOW TOPICS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); } break; - case 211: /* cmd ::= SHOW VARIABLES */ + case 213: /* cmd ::= SHOW VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } break; - case 212: /* cmd ::= SHOW LOCAL VARIABLES */ + case 214: /* cmd ::= SHOW LOCAL VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); } break; - case 213: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + case 215: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ { pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-1].minor.yy0)); } break; - case 214: /* cmd ::= SHOW BNODES */ + case 216: /* cmd ::= SHOW BNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); } break; - case 215: /* cmd ::= SHOW SNODES */ + case 217: /* cmd ::= SHOW SNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } break; - case 216: /* cmd ::= SHOW CLUSTER */ + case 218: /* cmd ::= SHOW CLUSTER */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } break; - case 217: /* cmd ::= SHOW TRANSACTIONS */ + case 219: /* cmd ::= SHOW TRANSACTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } break; - case 218: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ -{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy248); } + case 220: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ +{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy652); } break; - case 219: /* cmd ::= SHOW CONSUMERS */ + case 221: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } break; - case 220: /* cmd ::= SHOW SUBSCRIPTIONS */ + case 222: /* cmd ::= SHOW SUBSCRIPTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } break; - case 221: /* db_name_cond_opt ::= */ - case 226: /* from_db_opt ::= */ yytestcase(yyruleno==226); -{ yymsp[1].minor.yy248 = createDefaultDatabaseCondValue(pCxt); } + case 223: /* db_name_cond_opt ::= */ + case 228: /* from_db_opt ::= */ yytestcase(yyruleno==228); +{ yymsp[1].minor.yy652 = createDefaultDatabaseCondValue(pCxt); } break; - case 222: /* db_name_cond_opt ::= db_name NK_DOT */ -{ yylhsminor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy401); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 224: /* db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy5); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 223: /* like_pattern_opt ::= */ - case 263: /* into_opt ::= */ yytestcase(yyruleno==263); - case 400: /* from_clause_opt ::= */ yytestcase(yyruleno==400); - case 429: /* where_clause_opt ::= */ yytestcase(yyruleno==429); - case 433: /* twindow_clause_opt ::= */ yytestcase(yyruleno==433); - case 438: /* sliding_opt ::= */ yytestcase(yyruleno==438); - case 440: /* fill_opt ::= */ yytestcase(yyruleno==440); - case 452: /* having_clause_opt ::= */ yytestcase(yyruleno==452); - case 454: /* range_opt ::= */ yytestcase(yyruleno==454); - case 456: /* every_opt ::= */ yytestcase(yyruleno==456); - case 466: /* slimit_clause_opt ::= */ yytestcase(yyruleno==466); - case 470: /* limit_clause_opt ::= */ yytestcase(yyruleno==470); -{ yymsp[1].minor.yy248 = NULL; } + case 225: /* like_pattern_opt ::= */ + case 265: /* into_opt ::= */ yytestcase(yyruleno==265); + case 402: /* from_clause_opt ::= */ yytestcase(yyruleno==402); + case 431: /* where_clause_opt ::= */ yytestcase(yyruleno==431); + case 435: /* twindow_clause_opt ::= */ yytestcase(yyruleno==435); + case 440: /* sliding_opt ::= */ yytestcase(yyruleno==440); + case 442: /* fill_opt ::= */ yytestcase(yyruleno==442); + case 454: /* having_clause_opt ::= */ yytestcase(yyruleno==454); + case 456: /* range_opt ::= */ yytestcase(yyruleno==456); + case 458: /* every_opt ::= */ yytestcase(yyruleno==458); + case 468: /* slimit_clause_opt ::= */ yytestcase(yyruleno==468); + case 472: /* limit_clause_opt ::= */ yytestcase(yyruleno==472); +{ yymsp[1].minor.yy652 = NULL; } break; - case 224: /* like_pattern_opt ::= LIKE NK_STRING */ -{ yymsp[-1].minor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + case 226: /* like_pattern_opt ::= LIKE NK_STRING */ +{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; - case 225: /* table_name_cond ::= table_name */ -{ yylhsminor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy401); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 227: /* table_name_cond ::= table_name */ +{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy5); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 227: /* from_db_opt ::= FROM db_name */ -{ yymsp[-1].minor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy401); } + case 229: /* from_db_opt ::= FROM db_name */ +{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy5); } break; - case 228: /* cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy89, &yymsp[-3].minor.yy401, &yymsp[-1].minor.yy401, NULL, yymsp[0].minor.yy248); } + case 230: /* cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy403, &yymsp[-3].minor.yy5, &yymsp[-1].minor.yy5, NULL, yymsp[0].minor.yy652); } break; - case 229: /* cmd ::= DROP INDEX exists_opt index_name */ -{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy401); } + case 231: /* cmd ::= DROP INDEX exists_opt index_name */ +{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } break; - case 230: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-9].minor.yy248 = createIndexOption(pCxt, yymsp[-7].minor.yy552, releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), NULL, yymsp[-1].minor.yy248, yymsp[0].minor.yy248); } + case 232: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-9].minor.yy652 = createIndexOption(pCxt, yymsp[-7].minor.yy210, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), NULL, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } break; - case 231: /* 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.yy248 = createIndexOption(pCxt, yymsp[-9].minor.yy552, releaseRawExprNode(pCxt, yymsp[-5].minor.yy248), releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), yymsp[-1].minor.yy248, yymsp[0].minor.yy248); } + case 233: /* 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.yy652 = createIndexOption(pCxt, yymsp[-9].minor.yy210, releaseRawExprNode(pCxt, yymsp[-5].minor.yy652), releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } break; - case 234: /* func ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy248 = createFunctionNode(pCxt, &yymsp[-3].minor.yy401, yymsp[-1].minor.yy552); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + case 236: /* func ::= function_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy652 = createFunctionNode(pCxt, &yymsp[-3].minor.yy5, yymsp[-1].minor.yy210); } + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 235: /* sma_stream_opt ::= */ - case 265: /* stream_options ::= */ yytestcase(yyruleno==265); -{ yymsp[1].minor.yy248 = createStreamOptions(pCxt); } + case 237: /* sma_stream_opt ::= */ + case 267: /* stream_options ::= */ yytestcase(yyruleno==267); +{ yymsp[1].minor.yy652 = createStreamOptions(pCxt); } break; - case 236: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ - case 269: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==269); -{ ((SStreamOptions*)yymsp[-2].minor.yy248)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy248); yylhsminor.yy248 = yymsp[-2].minor.yy248; } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 238: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ + case 271: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==271); +{ ((SStreamOptions*)yymsp[-2].minor.yy652)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); yylhsminor.yy652 = yymsp[-2].minor.yy652; } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 237: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-2].minor.yy248)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy248); yylhsminor.yy248 = yymsp[-2].minor.yy248; } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 239: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy652)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); yylhsminor.yy652 = yymsp[-2].minor.yy652; } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 238: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ -{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy89, &yymsp[-2].minor.yy401, yymsp[0].minor.yy248); } + case 240: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ +{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy403, &yymsp[-2].minor.yy5, yymsp[0].minor.yy652); } break; - case 239: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy89, &yymsp[-3].minor.yy401, &yymsp[0].minor.yy401, false); } + case 241: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy403, &yymsp[-3].minor.yy5, &yymsp[0].minor.yy5, false); } break; - case 240: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy89, &yymsp[-5].minor.yy401, &yymsp[0].minor.yy401, true); } + case 242: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy403, &yymsp[-5].minor.yy5, &yymsp[0].minor.yy5, true); } break; - case 241: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy89, &yymsp[-3].minor.yy401, yymsp[0].minor.yy248, false); } + case 243: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy403, &yymsp[-3].minor.yy5, yymsp[0].minor.yy652, false); } break; - case 242: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy89, &yymsp[-5].minor.yy401, yymsp[0].minor.yy248, true); } + case 244: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy403, &yymsp[-5].minor.yy5, yymsp[0].minor.yy652, true); } break; - case 243: /* cmd ::= DROP TOPIC exists_opt topic_name */ -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy401); } + case 245: /* cmd ::= DROP TOPIC exists_opt topic_name */ +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } break; - case 244: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy89, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy401); } + case 246: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ +{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy403, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5); } break; - case 245: /* cmd ::= DESC full_table_name */ - case 246: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==246); -{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy248); } + case 247: /* cmd ::= DESC full_table_name */ + case 248: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==248); +{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy652); } break; - case 247: /* cmd ::= RESET QUERY CACHE */ + case 249: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } break; - case 248: /* cmd ::= EXPLAIN analyze_opt explain_options query_expression */ -{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy89, yymsp[-1].minor.yy248, yymsp[0].minor.yy248); } + case 250: /* cmd ::= EXPLAIN analyze_opt explain_options query_expression */ +{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy403, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } break; - case 250: /* analyze_opt ::= ANALYZE */ - case 258: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==258); - case 420: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==420); -{ yymsp[0].minor.yy89 = true; } + case 252: /* analyze_opt ::= ANALYZE */ + case 260: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==260); + case 422: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==422); +{ yymsp[0].minor.yy403 = true; } break; - case 251: /* explain_options ::= */ -{ yymsp[1].minor.yy248 = createDefaultExplainOptions(pCxt); } + case 253: /* explain_options ::= */ +{ yymsp[1].minor.yy652 = createDefaultExplainOptions(pCxt); } break; - case 252: /* explain_options ::= explain_options VERBOSE NK_BOOL */ -{ yylhsminor.yy248 = setExplainVerbose(pCxt, yymsp[-2].minor.yy248, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 254: /* explain_options ::= explain_options VERBOSE NK_BOOL */ +{ yylhsminor.yy652 = setExplainVerbose(pCxt, yymsp[-2].minor.yy652, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 253: /* explain_options ::= explain_options RATIO NK_FLOAT */ -{ yylhsminor.yy248 = setExplainRatio(pCxt, yymsp[-2].minor.yy248, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 255: /* explain_options ::= explain_options RATIO NK_FLOAT */ +{ yylhsminor.yy652 = setExplainRatio(pCxt, yymsp[-2].minor.yy652, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 254: /* cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ -{ pCxt->pRootNode = createCompactStmt(pCxt, yymsp[-1].minor.yy552); } + case 256: /* cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ +{ pCxt->pRootNode = createCompactStmt(pCxt, yymsp[-1].minor.yy210); } break; - case 255: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ -{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy89, yymsp[-8].minor.yy89, &yymsp[-5].minor.yy401, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy224, yymsp[0].minor.yy228); } + case 257: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ +{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy403, yymsp[-8].minor.yy403, &yymsp[-5].minor.yy5, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy552, yymsp[0].minor.yy462); } break; - case 256: /* cmd ::= DROP FUNCTION exists_opt function_name */ -{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy401); } + case 258: /* cmd ::= DROP FUNCTION exists_opt function_name */ +{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } break; - case 259: /* bufsize_opt ::= */ -{ yymsp[1].minor.yy228 = 0; } + case 261: /* bufsize_opt ::= */ +{ yymsp[1].minor.yy462 = 0; } break; - case 260: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ -{ yymsp[-1].minor.yy228 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } + case 262: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ +{ yymsp[-1].minor.yy462 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } break; - case 261: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ -{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-5].minor.yy89, &yymsp[-4].minor.yy401, yymsp[-2].minor.yy248, yymsp[-3].minor.yy248, yymsp[0].minor.yy248); } + case 263: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ +{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-5].minor.yy403, &yymsp[-4].minor.yy5, yymsp[-2].minor.yy652, yymsp[-3].minor.yy652, yymsp[0].minor.yy652); } break; - case 262: /* cmd ::= DROP STREAM exists_opt stream_name */ -{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy401); } + case 264: /* cmd ::= DROP STREAM exists_opt stream_name */ +{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } break; - case 264: /* into_opt ::= INTO full_table_name */ - case 401: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==401); - case 430: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==430); - case 453: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==453); -{ yymsp[-1].minor.yy248 = yymsp[0].minor.yy248; } + case 266: /* into_opt ::= INTO full_table_name */ + case 403: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==403); + case 432: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==432); + case 455: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==455); +{ yymsp[-1].minor.yy652 = yymsp[0].minor.yy652; } break; - case 266: /* stream_options ::= stream_options TRIGGER AT_ONCE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy248)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy248 = yymsp[-2].minor.yy248; } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 268: /* stream_options ::= stream_options TRIGGER AT_ONCE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy652)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy652 = yymsp[-2].minor.yy652; } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 267: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy248)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy248 = yymsp[-2].minor.yy248; } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 269: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy652)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy652 = yymsp[-2].minor.yy652; } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 268: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-3].minor.yy248)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy248)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy248); yylhsminor.yy248 = yymsp[-3].minor.yy248; } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + case 270: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-3].minor.yy652)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy652)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); yylhsminor.yy652 = yymsp[-3].minor.yy652; } + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 270: /* stream_options ::= stream_options IGNORE EXPIRED */ -{ ((SStreamOptions*)yymsp[-2].minor.yy248)->ignoreExpired = true; yylhsminor.yy248 = yymsp[-2].minor.yy248; } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 272: /* stream_options ::= stream_options IGNORE EXPIRED */ +{ ((SStreamOptions*)yymsp[-2].minor.yy652)->ignoreExpired = true; yylhsminor.yy652 = yymsp[-2].minor.yy652; } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 271: /* cmd ::= KILL CONNECTION NK_INTEGER */ + case 273: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } break; - case 272: /* cmd ::= KILL QUERY NK_STRING */ + case 274: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 273: /* cmd ::= KILL TRANSACTION NK_INTEGER */ + case 275: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } break; - case 274: /* cmd ::= BALANCE VGROUP */ + case 276: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } break; - case 275: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + case 277: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 276: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ -{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy552); } + case 278: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ +{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy210); } break; - case 277: /* cmd ::= SPLIT VGROUP NK_INTEGER */ + case 279: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 278: /* dnode_list ::= DNODE NK_INTEGER */ -{ yymsp[-1].minor.yy552 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - break; - case 280: /* cmd ::= SYNCDB db_name REPLICA */ -{ pCxt->pRootNode = createSyncdbStmt(pCxt, &yymsp[-1].minor.yy401); } - break; - case 281: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ -{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy248, yymsp[0].minor.yy248); } - break; - case 283: /* cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-2].minor.yy248, yymsp[-1].minor.yy552, yymsp[0].minor.yy248); } - break; - case 284: /* literal ::= NK_INTEGER */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 285: /* literal ::= NK_FLOAT */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 286: /* literal ::= NK_STRING */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 287: /* literal ::= NK_BOOL */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 288: /* literal ::= TIMESTAMP NK_STRING */ -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; - break; - case 289: /* literal ::= duration_literal */ - case 299: /* signed_literal ::= signed */ yytestcase(yyruleno==299); - case 319: /* expression ::= literal */ yytestcase(yyruleno==319); - case 320: /* expression ::= pseudo_column */ yytestcase(yyruleno==320); - case 321: /* expression ::= column_reference */ yytestcase(yyruleno==321); - case 322: /* expression ::= function_expression */ yytestcase(yyruleno==322); - case 323: /* expression ::= subquery */ yytestcase(yyruleno==323); - case 350: /* function_expression ::= literal_func */ yytestcase(yyruleno==350); - case 392: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==392); - case 396: /* boolean_primary ::= predicate */ yytestcase(yyruleno==396); - case 398: /* common_expression ::= expression */ yytestcase(yyruleno==398); - case 399: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==399); - case 402: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==402); - case 404: /* table_reference ::= table_primary */ yytestcase(yyruleno==404); - case 405: /* table_reference ::= joined_table */ yytestcase(yyruleno==405); - case 409: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==409); - case 459: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==459); - case 462: /* query_primary ::= query_specification */ yytestcase(yyruleno==462); -{ yylhsminor.yy248 = yymsp[0].minor.yy248; } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 290: /* literal ::= NULL */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 291: /* literal ::= NK_QUESTION */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 292: /* duration_literal ::= NK_VARIABLE */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 293: /* signed ::= NK_INTEGER */ -{ yylhsminor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 294: /* signed ::= NK_PLUS NK_INTEGER */ -{ yymsp[-1].minor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } - break; - case 295: /* signed ::= NK_MINUS NK_INTEGER */ + case 280: /* dnode_list ::= DNODE NK_INTEGER */ +{ yymsp[-1].minor.yy210 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + break; + case 282: /* cmd ::= SYNCDB db_name REPLICA */ +{ pCxt->pRootNode = createSyncdbStmt(pCxt, &yymsp[-1].minor.yy5); } + break; + case 283: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ +{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + break; + case 285: /* cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-2].minor.yy652, yymsp[-1].minor.yy210, yymsp[0].minor.yy652); } + break; + case 286: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 287: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 288: /* literal ::= NK_STRING */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 289: /* literal ::= NK_BOOL */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 290: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; + break; + case 291: /* literal ::= duration_literal */ + case 301: /* signed_literal ::= signed */ yytestcase(yyruleno==301); + case 321: /* expression ::= literal */ yytestcase(yyruleno==321); + case 322: /* expression ::= pseudo_column */ yytestcase(yyruleno==322); + case 323: /* expression ::= column_reference */ yytestcase(yyruleno==323); + case 324: /* expression ::= function_expression */ yytestcase(yyruleno==324); + case 325: /* expression ::= subquery */ yytestcase(yyruleno==325); + case 352: /* function_expression ::= literal_func */ yytestcase(yyruleno==352); + case 394: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==394); + case 398: /* boolean_primary ::= predicate */ yytestcase(yyruleno==398); + case 400: /* common_expression ::= expression */ yytestcase(yyruleno==400); + case 401: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==401); + case 404: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==404); + case 406: /* table_reference ::= table_primary */ yytestcase(yyruleno==406); + case 407: /* table_reference ::= joined_table */ yytestcase(yyruleno==407); + case 411: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==411); + case 461: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==461); + case 464: /* query_primary ::= query_specification */ yytestcase(yyruleno==464); +{ yylhsminor.yy652 = yymsp[0].minor.yy652; } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 292: /* literal ::= NULL */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 293: /* literal ::= NK_QUESTION */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 294: /* duration_literal ::= NK_VARIABLE */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 295: /* signed ::= NK_INTEGER */ +{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 296: /* signed ::= NK_PLUS NK_INTEGER */ +{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } + break; + case 297: /* 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.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); + yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 296: /* signed ::= NK_FLOAT */ -{ yylhsminor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 298: /* signed ::= NK_FLOAT */ +{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 297: /* signed ::= NK_PLUS NK_FLOAT */ -{ yymsp[-1].minor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + case 299: /* signed ::= NK_PLUS NK_FLOAT */ +{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 298: /* signed ::= NK_MINUS NK_FLOAT */ + case 300: /* 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.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); + yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 300: /* signed_literal ::= NK_STRING */ -{ yylhsminor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 302: /* signed_literal ::= NK_STRING */ +{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 301: /* signed_literal ::= NK_BOOL */ -{ yylhsminor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 303: /* signed_literal ::= NK_BOOL */ +{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 302: /* signed_literal ::= TIMESTAMP NK_STRING */ -{ yymsp[-1].minor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + case 304: /* signed_literal ::= TIMESTAMP NK_STRING */ +{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 303: /* signed_literal ::= duration_literal */ - case 305: /* signed_literal ::= literal_func */ yytestcase(yyruleno==305); - case 370: /* star_func_para ::= expression */ yytestcase(yyruleno==370); - case 425: /* select_item ::= common_expression */ yytestcase(yyruleno==425); - case 475: /* search_condition ::= common_expression */ yytestcase(yyruleno==475); -{ yylhsminor.yy248 = releaseRawExprNode(pCxt, yymsp[0].minor.yy248); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 305: /* signed_literal ::= duration_literal */ + case 307: /* signed_literal ::= literal_func */ yytestcase(yyruleno==307); + case 372: /* star_func_para ::= expression */ yytestcase(yyruleno==372); + case 427: /* select_item ::= common_expression */ yytestcase(yyruleno==427); + case 477: /* search_condition ::= common_expression */ yytestcase(yyruleno==477); +{ yylhsminor.yy652 = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 304: /* signed_literal ::= NULL */ -{ yylhsminor.yy248 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 306: /* signed_literal ::= NULL */ +{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 324: /* expression ::= NK_LP expression NK_RP */ - case 397: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==397); -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy248)); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 326: /* expression ::= NK_LP expression NK_RP */ + case 399: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==399); +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 325: /* expression ::= NK_PLUS expression */ + case 327: /* expression ::= NK_PLUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy248)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy652)); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 326: /* expression ::= NK_MINUS expression */ + case 328: /* expression ::= NK_MINUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy248), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy652), NULL)); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 327: /* expression ::= expression NK_PLUS expression */ + case 329: /* expression ::= expression NK_PLUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 328: /* expression ::= expression NK_MINUS expression */ + case 330: /* expression ::= expression NK_MINUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 329: /* expression ::= expression NK_STAR expression */ + case 331: /* expression ::= expression NK_STAR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 330: /* expression ::= expression NK_SLASH expression */ + case 332: /* expression ::= expression NK_SLASH expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 331: /* expression ::= expression NK_REM expression */ + case 333: /* expression ::= expression NK_REM expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 332: /* expression ::= column_reference NK_ARROW NK_STRING */ + case 334: /* expression ::= column_reference NK_ARROW NK_STRING */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 333: /* expression ::= expression NK_BITAND expression */ + case 335: /* expression ::= expression NK_BITAND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 334: /* expression ::= expression NK_BITOR expression */ + case 336: /* expression ::= expression NK_BITOR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 337: /* column_reference ::= column_name */ -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy401, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy401)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 338: /* column_reference ::= table_name NK_DOT column_name */ -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy401, createColumnNode(pCxt, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy401)); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 339: /* pseudo_column ::= ROWTS */ - case 340: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==340); - case 342: /* pseudo_column ::= QSTARTTS */ yytestcase(yyruleno==342); - case 343: /* pseudo_column ::= QENDTS */ yytestcase(yyruleno==343); - case 344: /* pseudo_column ::= WSTARTTS */ yytestcase(yyruleno==344); - case 345: /* pseudo_column ::= WENDTS */ yytestcase(yyruleno==345); - case 346: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==346); - case 352: /* literal_func ::= NOW */ yytestcase(yyruleno==352); -{ yylhsminor.yy248 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } - yymsp[0].minor.yy248 = yylhsminor.yy248; - break; - case 341: /* pseudo_column ::= table_name NK_DOT TBNAME */ -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy401)))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 347: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 348: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==348); -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy401, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy401, yymsp[-1].minor.yy552)); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; - break; - case 349: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), yymsp[-1].minor.yy224)); } - yymsp[-5].minor.yy248 = yylhsminor.yy248; - break; - case 351: /* literal_func ::= noarg_func NK_LP NK_RP */ -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy401, NULL)); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 366: /* star_func_para_list ::= NK_STAR */ -{ yylhsminor.yy552 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy552 = yylhsminor.yy552; - break; - case 371: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 428: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==428); -{ yylhsminor.yy248 = createColumnNode(pCxt, &yymsp[-2].minor.yy401, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; - break; - case 372: /* predicate ::= expression compare_op expression */ - case 377: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==377); + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 339: /* column_reference ::= column_name */ +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy5, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy5)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 340: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5, createColumnNode(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5)); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 341: /* pseudo_column ::= ROWTS */ + case 342: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==342); + case 344: /* pseudo_column ::= QSTARTTS */ yytestcase(yyruleno==344); + case 345: /* pseudo_column ::= QENDTS */ yytestcase(yyruleno==345); + case 346: /* pseudo_column ::= WSTARTTS */ yytestcase(yyruleno==346); + case 347: /* pseudo_column ::= WENDTS */ yytestcase(yyruleno==347); + case 348: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==348); + case 354: /* literal_func ::= NOW */ yytestcase(yyruleno==354); +{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } + yymsp[0].minor.yy652 = yylhsminor.yy652; + break; + case 343: /* pseudo_column ::= table_name NK_DOT TBNAME */ +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy5)))); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 349: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 350: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==350); +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy5, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy5, yymsp[-1].minor.yy210)); } + yymsp[-3].minor.yy652 = yylhsminor.yy652; + break; + case 351: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), yymsp[-1].minor.yy552)); } + yymsp[-5].minor.yy652 = yylhsminor.yy652; + break; + case 353: /* literal_func ::= noarg_func NK_LP NK_RP */ +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy5, NULL)); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 368: /* star_func_para_list ::= NK_STAR */ +{ yylhsminor.yy210 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy210 = yylhsminor.yy210; + break; + case 373: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 430: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==430); +{ yylhsminor.yy652 = createColumnNode(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; + break; + case 374: /* predicate ::= expression compare_op expression */ + case 379: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==379); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy716, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy428, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 373: /* predicate ::= expression BETWEEN expression AND expression */ + case 375: /* predicate ::= expression BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy248), releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy652), releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-4].minor.yy248 = yylhsminor.yy248; + yymsp[-4].minor.yy652 = yylhsminor.yy652; break; - case 374: /* predicate ::= expression NOT BETWEEN expression AND expression */ + case 376: /* predicate ::= expression NOT BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy248), releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy652), releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-5].minor.yy248 = yylhsminor.yy248; + yymsp[-5].minor.yy652 = yylhsminor.yy652; break; - case 375: /* predicate ::= expression IS NULL */ + case 377: /* predicate ::= expression IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), NULL)); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 376: /* predicate ::= expression IS NOT NULL */ + case 378: /* predicate ::= expression IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), NULL)); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 378: /* compare_op ::= NK_LT */ -{ yymsp[0].minor.yy716 = OP_TYPE_LOWER_THAN; } + case 380: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy428 = OP_TYPE_LOWER_THAN; } break; - case 379: /* compare_op ::= NK_GT */ -{ yymsp[0].minor.yy716 = OP_TYPE_GREATER_THAN; } + case 381: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy428 = OP_TYPE_GREATER_THAN; } break; - case 380: /* compare_op ::= NK_LE */ -{ yymsp[0].minor.yy716 = OP_TYPE_LOWER_EQUAL; } + case 382: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy428 = OP_TYPE_LOWER_EQUAL; } break; - case 381: /* compare_op ::= NK_GE */ -{ yymsp[0].minor.yy716 = OP_TYPE_GREATER_EQUAL; } + case 383: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy428 = OP_TYPE_GREATER_EQUAL; } break; - case 382: /* compare_op ::= NK_NE */ -{ yymsp[0].minor.yy716 = OP_TYPE_NOT_EQUAL; } + case 384: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy428 = OP_TYPE_NOT_EQUAL; } break; - case 383: /* compare_op ::= NK_EQ */ -{ yymsp[0].minor.yy716 = OP_TYPE_EQUAL; } + case 385: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy428 = OP_TYPE_EQUAL; } break; - case 384: /* compare_op ::= LIKE */ -{ yymsp[0].minor.yy716 = OP_TYPE_LIKE; } + case 386: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy428 = OP_TYPE_LIKE; } break; - case 385: /* compare_op ::= NOT LIKE */ -{ yymsp[-1].minor.yy716 = OP_TYPE_NOT_LIKE; } + case 387: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy428 = OP_TYPE_NOT_LIKE; } break; - case 386: /* compare_op ::= MATCH */ -{ yymsp[0].minor.yy716 = OP_TYPE_MATCH; } + case 388: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy428 = OP_TYPE_MATCH; } break; - case 387: /* compare_op ::= NMATCH */ -{ yymsp[0].minor.yy716 = OP_TYPE_NMATCH; } + case 389: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy428 = OP_TYPE_NMATCH; } break; - case 388: /* compare_op ::= CONTAINS */ -{ yymsp[0].minor.yy716 = OP_TYPE_JSON_CONTAINS; } + case 390: /* compare_op ::= CONTAINS */ +{ yymsp[0].minor.yy428 = OP_TYPE_JSON_CONTAINS; } break; - case 389: /* in_op ::= IN */ -{ yymsp[0].minor.yy716 = OP_TYPE_IN; } + case 391: /* in_op ::= IN */ +{ yymsp[0].minor.yy428 = OP_TYPE_IN; } break; - case 390: /* in_op ::= NOT IN */ -{ yymsp[-1].minor.yy716 = OP_TYPE_NOT_IN; } + case 392: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy428 = OP_TYPE_NOT_IN; } break; - case 391: /* in_predicate_value ::= NK_LP expression_list NK_RP */ -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy552)); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 393: /* in_predicate_value ::= NK_LP expression_list NK_RP */ +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy210)); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 393: /* boolean_value_expression ::= NOT boolean_primary */ + case 395: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy248), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy652), NULL)); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 394: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 396: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 395: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 397: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy248); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy248); - yylhsminor.yy248 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); + yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 403: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yylhsminor.yy248 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy248, yymsp[0].minor.yy248, NULL); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 405: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy652 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy652, yymsp[0].minor.yy652, NULL); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 406: /* table_primary ::= table_name alias_opt */ -{ yylhsminor.yy248 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy401, &yymsp[0].minor.yy401); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 408: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy652 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 407: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ yylhsminor.yy248 = createRealTableNode(pCxt, &yymsp[-3].minor.yy401, &yymsp[-1].minor.yy401, &yymsp[0].minor.yy401); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + case 409: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy652 = createRealTableNode(pCxt, &yymsp[-3].minor.yy5, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 408: /* table_primary ::= subquery alias_opt */ -{ yylhsminor.yy248 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy248), &yymsp[0].minor.yy401); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 410: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy652 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652), &yymsp[0].minor.yy5); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 410: /* alias_opt ::= */ -{ yymsp[1].minor.yy401 = nil_token; } + case 412: /* alias_opt ::= */ +{ yymsp[1].minor.yy5 = nil_token; } break; - case 411: /* alias_opt ::= table_alias */ -{ yylhsminor.yy401 = yymsp[0].minor.yy401; } - yymsp[0].minor.yy401 = yylhsminor.yy401; + case 413: /* alias_opt ::= table_alias */ +{ yylhsminor.yy5 = yymsp[0].minor.yy5; } + yymsp[0].minor.yy5 = yylhsminor.yy5; break; - case 412: /* alias_opt ::= AS table_alias */ -{ yymsp[-1].minor.yy401 = yymsp[0].minor.yy401; } + case 414: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy5 = yymsp[0].minor.yy5; } break; - case 413: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 414: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==414); -{ yymsp[-2].minor.yy248 = yymsp[-1].minor.yy248; } + case 415: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 416: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==416); +{ yymsp[-2].minor.yy652 = yymsp[-1].minor.yy652; } break; - case 415: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ yylhsminor.yy248 = createJoinTableNode(pCxt, yymsp[-4].minor.yy52, yymsp[-5].minor.yy248, yymsp[-2].minor.yy248, yymsp[0].minor.yy248); } - yymsp[-5].minor.yy248 = yylhsminor.yy248; + case 417: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy652 = createJoinTableNode(pCxt, yymsp[-4].minor.yy74, yymsp[-5].minor.yy652, yymsp[-2].minor.yy652, yymsp[0].minor.yy652); } + yymsp[-5].minor.yy652 = yylhsminor.yy652; break; - case 416: /* join_type ::= */ -{ yymsp[1].minor.yy52 = JOIN_TYPE_INNER; } + case 418: /* join_type ::= */ +{ yymsp[1].minor.yy74 = JOIN_TYPE_INNER; } break; - case 417: /* join_type ::= INNER */ -{ yymsp[0].minor.yy52 = JOIN_TYPE_INNER; } + case 419: /* join_type ::= INNER */ +{ yymsp[0].minor.yy74 = JOIN_TYPE_INNER; } break; - case 418: /* query_specification ::= SELECT set_quantifier_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 */ + case 420: /* query_specification ::= SELECT set_quantifier_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[-11].minor.yy248 = createSelectStmt(pCxt, yymsp[-10].minor.yy89, yymsp[-9].minor.yy552, yymsp[-8].minor.yy248); - yymsp[-11].minor.yy248 = addWhereClause(pCxt, yymsp[-11].minor.yy248, yymsp[-7].minor.yy248); - yymsp[-11].minor.yy248 = addPartitionByClause(pCxt, yymsp[-11].minor.yy248, yymsp[-6].minor.yy552); - yymsp[-11].minor.yy248 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy248, yymsp[-2].minor.yy248); - yymsp[-11].minor.yy248 = addGroupByClause(pCxt, yymsp[-11].minor.yy248, yymsp[-1].minor.yy552); - yymsp[-11].minor.yy248 = addHavingClause(pCxt, yymsp[-11].minor.yy248, yymsp[0].minor.yy248); - yymsp[-11].minor.yy248 = addRangeClause(pCxt, yymsp[-11].minor.yy248, yymsp[-5].minor.yy248); - yymsp[-11].minor.yy248 = addEveryClause(pCxt, yymsp[-11].minor.yy248, yymsp[-4].minor.yy248); - yymsp[-11].minor.yy248 = addFillClause(pCxt, yymsp[-11].minor.yy248, yymsp[-3].minor.yy248); + yymsp[-11].minor.yy652 = createSelectStmt(pCxt, yymsp[-10].minor.yy403, yymsp[-9].minor.yy210, yymsp[-8].minor.yy652); + yymsp[-11].minor.yy652 = addWhereClause(pCxt, yymsp[-11].minor.yy652, yymsp[-7].minor.yy652); + yymsp[-11].minor.yy652 = addPartitionByClause(pCxt, yymsp[-11].minor.yy652, yymsp[-6].minor.yy210); + yymsp[-11].minor.yy652 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy652, yymsp[-2].minor.yy652); + yymsp[-11].minor.yy652 = addGroupByClause(pCxt, yymsp[-11].minor.yy652, yymsp[-1].minor.yy210); + yymsp[-11].minor.yy652 = addHavingClause(pCxt, yymsp[-11].minor.yy652, yymsp[0].minor.yy652); + yymsp[-11].minor.yy652 = addRangeClause(pCxt, yymsp[-11].minor.yy652, yymsp[-5].minor.yy652); + yymsp[-11].minor.yy652 = addEveryClause(pCxt, yymsp[-11].minor.yy652, yymsp[-4].minor.yy652); + yymsp[-11].minor.yy652 = addFillClause(pCxt, yymsp[-11].minor.yy652, yymsp[-3].minor.yy652); } break; - case 421: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy89 = false; } + case 423: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy403 = false; } break; - case 424: /* select_item ::= NK_STAR */ -{ yylhsminor.yy248 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy248 = yylhsminor.yy248; + case 426: /* select_item ::= NK_STAR */ +{ yylhsminor.yy652 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy652 = yylhsminor.yy652; break; - case 426: /* select_item ::= common_expression column_alias */ -{ yylhsminor.yy248 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy248), &yymsp[0].minor.yy401); } - yymsp[-1].minor.yy248 = yylhsminor.yy248; + case 428: /* select_item ::= common_expression column_alias */ +{ yylhsminor.yy652 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652), &yymsp[0].minor.yy5); } + yymsp[-1].minor.yy652 = yylhsminor.yy652; break; - case 427: /* select_item ::= common_expression AS column_alias */ -{ yylhsminor.yy248 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), &yymsp[0].minor.yy401); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 429: /* select_item ::= common_expression AS column_alias */ +{ yylhsminor.yy652 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), &yymsp[0].minor.yy5); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 432: /* partition_by_clause_opt ::= PARTITION BY expression_list */ - case 449: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==449); - case 465: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==465); -{ yymsp[-2].minor.yy552 = yymsp[0].minor.yy552; } + case 434: /* partition_by_clause_opt ::= PARTITION BY expression_list */ + case 451: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==451); + case 467: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==467); +{ yymsp[-2].minor.yy210 = yymsp[0].minor.yy210; } break; - case 434: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ -{ yymsp[-5].minor.yy248 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), releaseRawExprNode(pCxt, yymsp[-1].minor.yy248)); } + case 436: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ +{ yymsp[-5].minor.yy652 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } break; - case 435: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ -{ yymsp[-3].minor.yy248 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy248)); } + case 437: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ +{ yymsp[-3].minor.yy652 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } break; - case 436: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-5].minor.yy248 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), NULL, yymsp[-1].minor.yy248, yymsp[0].minor.yy248); } + case 438: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy652 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), NULL, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } break; - case 437: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-7].minor.yy248 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy248), releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), yymsp[-1].minor.yy248, yymsp[0].minor.yy248); } + case 439: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy652 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy652), releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } break; - case 439: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - case 457: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==457); -{ yymsp[-3].minor.yy248 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy248); } + case 441: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + case 459: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==459); +{ yymsp[-3].minor.yy652 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy652); } break; - case 441: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ yymsp[-3].minor.yy248 = createFillNode(pCxt, yymsp[-1].minor.yy582, NULL); } + case 443: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy652 = createFillNode(pCxt, yymsp[-1].minor.yy270, NULL); } break; - case 442: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ yymsp[-5].minor.yy248 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy552)); } + case 444: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ yymsp[-5].minor.yy652 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy210)); } break; - case 443: /* fill_mode ::= NONE */ -{ yymsp[0].minor.yy582 = FILL_MODE_NONE; } + case 445: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy270 = FILL_MODE_NONE; } break; - case 444: /* fill_mode ::= PREV */ -{ yymsp[0].minor.yy582 = FILL_MODE_PREV; } + case 446: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy270 = FILL_MODE_PREV; } break; - case 445: /* fill_mode ::= NULL */ -{ yymsp[0].minor.yy582 = FILL_MODE_NULL; } + case 447: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy270 = FILL_MODE_NULL; } break; - case 446: /* fill_mode ::= LINEAR */ -{ yymsp[0].minor.yy582 = FILL_MODE_LINEAR; } + case 448: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy270 = FILL_MODE_LINEAR; } break; - case 447: /* fill_mode ::= NEXT */ -{ yymsp[0].minor.yy582 = FILL_MODE_NEXT; } + case 449: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy270 = FILL_MODE_NEXT; } break; - case 450: /* group_by_list ::= expression */ -{ yylhsminor.yy552 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); } - yymsp[0].minor.yy552 = yylhsminor.yy552; + case 452: /* group_by_list ::= expression */ +{ yylhsminor.yy210 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } + yymsp[0].minor.yy210 = yylhsminor.yy210; break; - case 451: /* group_by_list ::= group_by_list NK_COMMA expression */ -{ yylhsminor.yy552 = addNodeToList(pCxt, yymsp[-2].minor.yy552, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy248))); } - yymsp[-2].minor.yy552 = yylhsminor.yy552; + case 453: /* group_by_list ::= group_by_list NK_COMMA expression */ +{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } + yymsp[-2].minor.yy210 = yylhsminor.yy210; break; - case 455: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ -{ yymsp[-5].minor.yy248 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy248), releaseRawExprNode(pCxt, yymsp[-1].minor.yy248)); } + case 457: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ +{ yymsp[-5].minor.yy652 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } break; - case 458: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 460: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy248 = addOrderByClause(pCxt, yymsp[-3].minor.yy248, yymsp[-2].minor.yy552); - yylhsminor.yy248 = addSlimitClause(pCxt, yylhsminor.yy248, yymsp[-1].minor.yy248); - yylhsminor.yy248 = addLimitClause(pCxt, yylhsminor.yy248, yymsp[0].minor.yy248); + yylhsminor.yy652 = addOrderByClause(pCxt, yymsp[-3].minor.yy652, yymsp[-2].minor.yy210); + yylhsminor.yy652 = addSlimitClause(pCxt, yylhsminor.yy652, yymsp[-1].minor.yy652); + yylhsminor.yy652 = addLimitClause(pCxt, yylhsminor.yy652, yymsp[0].minor.yy652); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 460: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ yylhsminor.yy248 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy248, yymsp[0].minor.yy248); } - yymsp[-3].minor.yy248 = yylhsminor.yy248; + case 462: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ yylhsminor.yy652 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy652, yymsp[0].minor.yy652); } + yymsp[-3].minor.yy652 = yylhsminor.yy652; break; - case 461: /* query_expression_body ::= query_expression_body UNION query_expression_body */ -{ yylhsminor.yy248 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy248, yymsp[0].minor.yy248); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 463: /* query_expression_body ::= query_expression_body UNION query_expression_body */ +{ yylhsminor.yy652 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy652, yymsp[0].minor.yy652); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 463: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ -{ yymsp[-5].minor.yy248 = yymsp[-4].minor.yy248; } - yy_destructor(yypParser,368,&yymsp[-3].minor); - yy_destructor(yypParser,369,&yymsp[-2].minor); - yy_destructor(yypParser,370,&yymsp[-1].minor); + case 465: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ +{ yymsp[-5].minor.yy652 = yymsp[-4].minor.yy652; } + yy_destructor(yypParser,369,&yymsp[-3].minor); + yy_destructor(yypParser,370,&yymsp[-2].minor); + yy_destructor(yypParser,371,&yymsp[-1].minor); break; - case 467: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 471: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==471); -{ yymsp[-1].minor.yy248 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 469: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 473: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==473); +{ yymsp[-1].minor.yy652 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 468: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 472: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==472); -{ yymsp[-3].minor.yy248 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 470: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 474: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==474); +{ yymsp[-3].minor.yy652 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 469: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 473: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==473); -{ yymsp[-3].minor.yy248 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 471: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 475: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==475); +{ yymsp[-3].minor.yy652 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 474: /* subquery ::= NK_LP query_expression NK_RP */ -{ yylhsminor.yy248 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy248); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 476: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy652); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 478: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy248 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy248), yymsp[-1].minor.yy482, yymsp[0].minor.yy345); } - yymsp[-2].minor.yy248 = yylhsminor.yy248; + case 480: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy652 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), yymsp[-1].minor.yy553, yymsp[0].minor.yy477); } + yymsp[-2].minor.yy652 = yylhsminor.yy652; break; - case 479: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy482 = ORDER_ASC; } + case 481: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy553 = ORDER_ASC; } break; - case 480: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy482 = ORDER_ASC; } + case 482: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy553 = ORDER_ASC; } break; - case 481: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy482 = ORDER_DESC; } + case 483: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy553 = ORDER_DESC; } break; - case 482: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy345 = NULL_ORDER_DEFAULT; } + case 484: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy477 = NULL_ORDER_DEFAULT; } break; - case 483: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy345 = NULL_ORDER_FIRST; } + case 485: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy477 = NULL_ORDER_FIRST; } break; - case 484: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy345 = NULL_ORDER_LAST; } + case 486: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy477 = NULL_ORDER_LAST; } break; default: break; diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp index 10921a2082526fcce2d11b0b1ead561b55492b3e..b39a066ba1d95634d5277932fab81ee4043d1683 100644 --- a/source/libs/parser/test/parInitialCTest.cpp +++ b/source/libs/parser/test/parInitialCTest.cpp @@ -77,6 +77,7 @@ TEST_F(ParserInitialCTest, createDatabase) { expect.ignoreExist = igExists; expect.buffer = TSDB_DEFAULT_BUFFER_PER_VNODE; expect.cacheLastRow = TSDB_DEFAULT_CACHE_LAST_ROW; + expect.lastRowMem = TSDB_DEFAULT_LAST_ROW_MEM; expect.compression = TSDB_DEFAULT_COMP_LEVEL; expect.daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE; expect.fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD; @@ -97,7 +98,8 @@ TEST_F(ParserInitialCTest, createDatabase) { }; auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; }; - auto setDbCachelastFunc = [&](int8_t CACHELAST) { expect.cacheLastRow = CACHELAST; }; + auto setDbCachelastFunc = [&](int8_t cachelast) { expect.cacheLastRow = cachelast; }; + auto setDbCachelastSize = [&](int8_t cachelastSize) { expect.lastRowMem = cachelastSize; }; auto setDbCompressionFunc = [&](int8_t compressionLevel) { expect.compression = compressionLevel; }; auto setDbDaysFunc = [&](int32_t daysPerFile) { expect.daysPerFile = daysPerFile; }; auto setDbFsyncFunc = [&](int32_t fsyncPeriod) { expect.fsyncPeriod = fsyncPeriod; }; @@ -154,6 +156,7 @@ TEST_F(ParserInitialCTest, createDatabase) { ASSERT_EQ(req.replications, expect.replications); ASSERT_EQ(req.strict, expect.strict); ASSERT_EQ(req.cacheLastRow, expect.cacheLastRow); + ASSERT_EQ(req.lastRowMem, expect.lastRowMem); // ASSERT_EQ(req.schemaless, expect.schemaless); ASSERT_EQ(req.ignoreExist, expect.ignoreExist); ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions); @@ -179,6 +182,7 @@ TEST_F(ParserInitialCTest, createDatabase) { setCreateDbReqFunc("wxy_db", 1); setDbBufferFunc(64); setDbCachelastFunc(2); + setDbCachelastSize(20); setDbCompressionFunc(1); setDbDaysFunc(100 * 1440); setDbFsyncFunc(100); @@ -200,6 +204,7 @@ TEST_F(ParserInitialCTest, createDatabase) { run("CREATE DATABASE IF NOT EXISTS wxy_db " "BUFFER 64 " "CACHELAST 2 " + "CACHELASTSIZE 20 " "COMP 1 " "DURATION 100 " "FSYNC 100 " diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index e7589fb0df363bd0cf6c9c5945cd80d6da9bca00..703395b0d5587f373fe2982f5863e817914e5e0d 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -1340,6 +1340,17 @@ static void doSetLogicNodeParent(SLogicNode* pNode, SLogicNode* pParent) { static void setLogicNodeParent(SLogicNode* pNode) { doSetLogicNodeParent(pNode, NULL); } +static void setLogicSubplanType(SLogicSubplan* pSubplan) { + if (QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY != nodeType(pSubplan->pNode)) { + pSubplan->subplanType = SUBPLAN_TYPE_SCAN; + } else { + SVnodeModifyLogicNode* pModify = (SVnodeModifyLogicNode*)pSubplan->pNode; + pSubplan->subplanType = (MODIFY_TABLE_TYPE_INSERT == pModify->modifyType && NULL != pModify->node.pChildren) + ? SUBPLAN_TYPE_SCAN + : SUBPLAN_TYPE_MODIFY; + } +} + int32_t createLogicPlan(SPlanContext* pCxt, SLogicSubplan** pLogicSubplan) { SLogicPlanContext cxt = {.pPlanCxt = pCxt}; @@ -1354,11 +1365,7 @@ int32_t createLogicPlan(SPlanContext* pCxt, SLogicSubplan** pLogicSubplan) { int32_t code = createQueryLogicNode(&cxt, pCxt->pAstRoot, &pSubplan->pNode); if (TSDB_CODE_SUCCESS == code) { setLogicNodeParent(pSubplan->pNode); - if (QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY == nodeType(pSubplan->pNode)) { - pSubplan->subplanType = SUBPLAN_TYPE_MODIFY; - } else { - pSubplan->subplanType = SUBPLAN_TYPE_SCAN; - } + setLogicSubplanType(pSubplan); } if (TSDB_CODE_SUCCESS == code) { diff --git a/source/libs/planner/src/planPhysiCreater.c b/source/libs/planner/src/planPhysiCreater.c index 6d5d5e220bf01f7d8307d6e57301dd73d836e840..18d69d21d82eb86c21e98a0c956e0d404eb895de 100644 --- a/source/libs/planner/src/planPhysiCreater.c +++ b/source/libs/planner/src/planPhysiCreater.c @@ -1566,7 +1566,7 @@ static int32_t buildInsertSelectSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLog if (TSDB_CODE_SUCCESS == code) { code = createQueryInserter(pCxt, pModify, pSubplan, &pSubplan->pDataSink); } - pSubplan->msgType = TDMT_VND_SUBMIT; + pSubplan->msgType = TDMT_SCH_MERGE_QUERY; return code; } diff --git a/source/libs/planner/src/planSpliter.c b/source/libs/planner/src/planSpliter.c index 0863b5f21f2a1236560ab91b49635bdf2576883d..2137108386f0c55fc37293ae4a97e5c5de51d865 100644 --- a/source/libs/planner/src/planSpliter.c +++ b/source/libs/planner/src/planSpliter.c @@ -39,7 +39,6 @@ typedef struct SSplitRule { FSplit splitFunc; } SSplitRule; -// typedef bool (*FSplFindSplitNode)(SSplitContext* pCxt, SLogicSubplan* pSubplan, void* pInfo); typedef bool (*FSplFindSplitNode)(SSplitContext* pCxt, SLogicSubplan* pSubplan, SLogicNode* pNode, void* pInfo); static void splSetSubplanVgroups(SLogicSubplan* pSubplan, SLogicNode* pNode) { @@ -67,6 +66,19 @@ static SLogicSubplan* splCreateScanSubplan(SSplitContext* pCxt, SLogicNode* pNod return pSubplan; } +static SLogicSubplan* splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode, ESubplanType subplanType) { + SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); + if (NULL == pSubplan) { + return NULL; + } + pSubplan->id.queryId = pCxt->queryId; + pSubplan->id.groupId = pCxt->groupId; + pSubplan->subplanType = subplanType; + pSubplan->pNode = pNode; + pNode->pParent = NULL; + return pSubplan; +} + static int32_t splCreateExchangeNode(SSplitContext* pCxt, SLogicNode* pChild, SExchangeLogicNode** pOutput) { SExchangeLogicNode* pExchange = (SExchangeLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE); if (NULL == pExchange) { @@ -98,6 +110,43 @@ static int32_t splCreateExchangeNodeForSubplan(SSplitContext* pCxt, SLogicSubpla return code; } +static bool splIsChildSubplan(SLogicNode* pLogicNode, int32_t groupId) { + if (QUERY_NODE_LOGIC_PLAN_EXCHANGE == nodeType(pLogicNode)) { + return ((SExchangeLogicNode*)pLogicNode)->srcGroupId == groupId; + } + + if (QUERY_NODE_LOGIC_PLAN_MERGE == nodeType(pLogicNode)) { + return ((SMergeLogicNode*)pLogicNode)->srcGroupId == groupId; + } + + SNode* pChild; + FOREACH(pChild, pLogicNode->pChildren) { + bool isChild = splIsChildSubplan((SLogicNode*)pChild, groupId); + if (isChild) { + return isChild; + } + } + return false; +} + +static int32_t splMountSubplan(SLogicSubplan* pParent, SNodeList* pChildren) { + SNode* pChild = NULL; + WHERE_EACH(pChild, pChildren) { + if (splIsChildSubplan(pParent->pNode, ((SLogicSubplan*)pChild)->id.groupId)) { + int32_t code = nodesListMakeAppend(&pParent->pChildren, pChild); + if (TSDB_CODE_SUCCESS == code) { + REPLACE_NODE(NULL); + ERASE_NODE(pChildren); + continue; + } else { + return code; + } + } + WHERE_NEXT; + } + return TSDB_CODE_SUCCESS; +} + static bool splMatchByNode(SSplitContext* pCxt, SLogicSubplan* pSubplan, SLogicNode* pNode, FSplFindSplitNode func, void* pInfo) { if (func(pCxt, pSubplan, pNode, pInfo)) { @@ -982,56 +1031,6 @@ static int32_t singleTableJoinSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan return code; } -static bool unionIsChildSubplan(SLogicNode* pLogicNode, int32_t groupId) { - if (QUERY_NODE_LOGIC_PLAN_EXCHANGE == nodeType(pLogicNode)) { - return ((SExchangeLogicNode*)pLogicNode)->srcGroupId == groupId; - } - - if (QUERY_NODE_LOGIC_PLAN_MERGE == nodeType(pLogicNode)) { - return ((SMergeLogicNode*)pLogicNode)->srcGroupId == groupId; - } - - SNode* pChild; - FOREACH(pChild, pLogicNode->pChildren) { - bool isChild = unionIsChildSubplan((SLogicNode*)pChild, groupId); - if (isChild) { - return isChild; - } - } - return false; -} - -static int32_t unionMountSubplan(SLogicSubplan* pParent, SNodeList* pChildren) { - SNode* pChild = NULL; - WHERE_EACH(pChild, pChildren) { - if (unionIsChildSubplan(pParent->pNode, ((SLogicSubplan*)pChild)->id.groupId)) { - int32_t code = nodesListMakeAppend(&pParent->pChildren, pChild); - if (TSDB_CODE_SUCCESS == code) { - REPLACE_NODE(NULL); - ERASE_NODE(pChildren); - continue; - } else { - return code; - } - } - WHERE_NEXT; - } - return TSDB_CODE_SUCCESS; -} - -static SLogicSubplan* unionCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode, ESubplanType subplanType) { - SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); - if (NULL == pSubplan) { - return NULL; - } - pSubplan->id.queryId = pCxt->queryId; - pSubplan->id.groupId = pCxt->groupId; - pSubplan->subplanType = subplanType; - pSubplan->pNode = pNode; - pNode->pParent = NULL; - return pSubplan; -} - static int32_t unionSplitSubplan(SSplitContext* pCxt, SLogicSubplan* pUnionSubplan, SLogicNode* pSplitNode) { SNodeList* pSubplanChildren = pUnionSubplan->pChildren; pUnionSubplan->pChildren = NULL; @@ -1040,11 +1039,11 @@ static int32_t unionSplitSubplan(SSplitContext* pCxt, SLogicSubplan* pUnionSubpl SNode* pChild = NULL; FOREACH(pChild, pSplitNode->pChildren) { - SLogicSubplan* pNewSubplan = unionCreateSubplan(pCxt, (SLogicNode*)pChild, pUnionSubplan->subplanType); + SLogicSubplan* pNewSubplan = splCreateSubplan(pCxt, (SLogicNode*)pChild, pUnionSubplan->subplanType); code = nodesListMakeStrictAppend(&pUnionSubplan->pChildren, (SNode*)pNewSubplan); if (TSDB_CODE_SUCCESS == code) { REPLACE_NODE(NULL); - code = unionMountSubplan(pNewSubplan, pSubplanChildren); + code = splMountSubplan(pNewSubplan, pSubplanChildren); } if (TSDB_CODE_SUCCESS != code) { break; @@ -1219,14 +1218,24 @@ static int32_t insertSelectSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) { return TSDB_CODE_SUCCESS; } - int32_t code = splCreateExchangeNodeForSubplan(pCxt, info.pSubplan, info.pQueryRoot, info.pSubplan->subplanType); + SLogicSubplan* pNewSubplan = NULL; + SNodeList* pSubplanChildren = info.pSubplan->pChildren; + ESubplanType subplanType = info.pSubplan->subplanType; + int32_t code = splCreateExchangeNodeForSubplan(pCxt, info.pSubplan, info.pQueryRoot, SUBPLAN_TYPE_MODIFY); if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppend(&info.pSubplan->pChildren, (SNode*)splCreateScanSubplan(pCxt, info.pQueryRoot, 0)); + pNewSubplan = splCreateSubplan(pCxt, info.pQueryRoot, subplanType); + if (NULL == pNewSubplan) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } if (TSDB_CODE_SUCCESS == code) { - info.pSubplan->subplanType = SUBPLAN_TYPE_MODIFY; - SPLIT_FLAG_SET_MASK(info.pSubplan->splitFlag, SPLIT_FLAG_INSERT_SPLIT); + code = nodesListMakeStrictAppend(&info.pSubplan->pChildren, (SNode*)pNewSubplan); } + if (TSDB_CODE_SUCCESS == code) { + code = splMountSubplan(pNewSubplan, pSubplanChildren); + } + + SPLIT_FLAG_SET_MASK(info.pSubplan->splitFlag, SPLIT_FLAG_INSERT_SPLIT); ++(pCxt->groupId); pCxt->split = true; return code; diff --git a/source/libs/qworker/inc/qwInt.h b/source/libs/qworker/inc/qwInt.h index 2b1e535e8c261ab6c96648d77af7aa6d4224fdf6..539643c3907cc20de3bee586d21135fbe8adb748 100644 --- a/source/libs/qworker/inc/qwInt.h +++ b/source/libs/qworker/inc/qwInt.h @@ -80,12 +80,19 @@ typedef struct SQWDebug { extern SQWDebug gQWDebug; +typedef struct SQWMsgInfo { + int8_t taskType; + int8_t explain; + int8_t needFetch; +} SQWMsgInfo; + typedef struct SQWMsg { void *node; int32_t code; int32_t msgType; char *msg; int32_t msgLen; + SQWMsgInfo msgInfo; SRpcHandleInfo connInfo; } SQWMsg; @@ -122,15 +129,18 @@ typedef struct SQWTaskCtx { int8_t phase; int8_t taskType; int8_t explain; + int8_t needFetch; int32_t queryType; int32_t fetchType; int32_t execId; + bool queryRsped; bool queryFetched; bool queryEnd; bool queryContinue; bool queryInQueue; int32_t rspCode; + int64_t affectedRows; // for insert ...select stmt SRpcHandleInfo ctrlConnInfo; SRpcHandleInfo dataConnInfo; @@ -162,7 +172,7 @@ typedef struct SQWMsgStat { uint64_t queryProcessed; uint64_t cqueryProcessed; uint64_t fetchProcessed; - uint64_t fetchRspProcessed; + uint64_t rspProcessed; uint64_t cancelProcessed; uint64_t dropProcessed; uint64_t hbProcessed; @@ -212,8 +222,8 @@ typedef struct SQWorkerMgmt { #define QW_STAT_GET(_item) atomic_load_64(&(_item)) #define QW_GET_EVENT(ctx, event) atomic_load_8(&(ctx)->events[event]) -#define QW_IS_EVENT_RECEIVED(ctx, event) (QW_GET_EVENT(ctx, event) == QW_EVENT_RECEIVED) -#define QW_IS_EVENT_PROCESSED(ctx, event) (QW_GET_EVENT(ctx, event) == QW_EVENT_PROCESSED) +#define QW_EVENT_RECEIVED(ctx, event) (QW_GET_EVENT(ctx, event) == QW_EVENT_RECEIVED) +#define QW_EVENT_PROCESSED(ctx, event) (QW_GET_EVENT(ctx, event) == QW_EVENT_PROCESSED) #define QW_SET_EVENT_RECEIVED(ctx, event) atomic_store_8(&(ctx)->events[event], QW_EVENT_RECEIVED) #define QW_SET_EVENT_PROCESSED(ctx, event) atomic_store_8(&(ctx)->events[event], QW_EVENT_PROCESSED) @@ -222,13 +232,8 @@ typedef struct SQWorkerMgmt { #define QW_SET_RSP_CODE(ctx, code) atomic_store_32(&(ctx)->rspCode, code) #define QW_UPDATE_RSP_CODE(ctx, code) atomic_val_compare_exchange_32(&(ctx)->rspCode, 0, code) -#define QW_IS_QUERY_RUNNING(ctx) (QW_GET_PHASE(ctx) == QW_PHASE_PRE_QUERY || QW_GET_PHASE(ctx) == QW_PHASE_PRE_CQUERY) +#define QW_QUERY_RUNNING(ctx) (QW_GET_PHASE(ctx) == QW_PHASE_PRE_QUERY || QW_GET_PHASE(ctx) == QW_PHASE_PRE_CQUERY) -#define QW_TASK_NOT_EXIST(code) (TSDB_CODE_QRY_SCH_NOT_EXIST == (code) || TSDB_CODE_QRY_TASK_NOT_EXIST == (code)) -#define QW_TASK_ALREADY_EXIST(code) (TSDB_CODE_QRY_TASK_ALREADY_EXIST == (code)) -#define QW_TASK_READY(status) \ - (status == JOB_TASK_STATUS_SUCC || status == JOB_TASK_STATUS_FAIL || status == JOB_TASK_STATUS_CANCELLED || \ - status == JOB_TASK_STATUS_PART_SUCC) #define QW_SET_QTID(id, qId, tId, eId) \ do { \ *(uint64_t *)(id) = (qId); \ diff --git a/source/libs/qworker/inc/qwMsg.h b/source/libs/qworker/inc/qwMsg.h index 7becaf06eb414da2636e43889fd05a84deb7dd14..704cd3142845c07976f1d8a4b8a798bc99e775d3 100644 --- a/source/libs/qworker/inc/qwMsg.h +++ b/source/libs/qworker/inc/qwMsg.h @@ -25,7 +25,7 @@ extern "C" { int32_t qwAbortPrerocessQuery(QW_FPARAMS_DEF); int32_t qwPrerocessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg); -int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType, int8_t explain, const char* sql); +int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, const char* sql); int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg); int32_t qwProcessReady(QW_FPARAMS_DEF, SQWMsg *qwMsg); int32_t qwProcessFetch(QW_FPARAMS_DEF, SQWMsg *qwMsg); @@ -38,7 +38,7 @@ int32_t qwBuildAndSendCancelRsp(SRpcHandleInfo *pConn, int32_t code); int32_t qwBuildAndSendFetchRsp(int32_t rspType, SRpcHandleInfo *pConn, SRetrieveTableRsp *pRsp, int32_t dataLength, int32_t code); void qwBuildFetchRsp(void *msg, SOutputData *input, int32_t len, bool qComplete); int32_t qwBuildAndSendCQueryMsg(QW_FPARAMS_DEF, SRpcHandleInfo *pConn); -int32_t qwBuildAndSendQueryRsp(int32_t rspType, SRpcHandleInfo *pConn, int32_t code, STbVerInfo* tbInfo); +int32_t qwBuildAndSendQueryRsp(int32_t rspType, SRpcHandleInfo *pConn, int32_t code, SQWTaskCtx *ctx); int32_t qwBuildAndSendExplainRsp(SRpcHandleInfo *pConn, SExplainExecInfo *execInfo, int32_t num); void qwFreeFetchRsp(void *msg); int32_t qwMallocFetchRsp(int32_t length, SRetrieveTableRsp **rsp); diff --git a/source/libs/qworker/src/qwMsg.c b/source/libs/qworker/src/qwMsg.c index ea5aa3c563bf8f7527395bd0bcd4f72b1149019d..73110472f7e35e71ee4bf478c422664212e9660c 100644 --- a/source/libs/qworker/src/qwMsg.c +++ b/source/libs/qworker/src/qwMsg.c @@ -43,13 +43,16 @@ void qwFreeFetchRsp(void *msg) { } } -int32_t qwBuildAndSendQueryRsp(int32_t rspType, SRpcHandleInfo *pConn, int32_t code, STbVerInfo* tbInfo) { +int32_t qwBuildAndSendQueryRsp(int32_t rspType, SRpcHandleInfo *pConn, int32_t code, SQWTaskCtx *ctx) { + STbVerInfo* tbInfo = ctx ? &ctx->tbInfo : NULL; + int64_t affectedRows = ctx ? ctx->affectedRows : 0; SQueryTableRsp *pRsp = (SQueryTableRsp *)rpcMallocCont(sizeof(SQueryTableRsp)); - pRsp->code = code; + pRsp->code = htonl(code); + pRsp->affectedRows = htobe64(affectedRows); if (tbInfo) { strcpy(pRsp->tbFName, tbInfo->tbFName); - pRsp->sversion = tbInfo->sversion; - pRsp->tversion = tbInfo->tversion; + pRsp->sversion = htonl(tbInfo->sversion); + pRsp->tversion = htonl(tbInfo->tversion); } SRpcMsg rpcRsp = { @@ -366,10 +369,14 @@ int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int int32_t eId = msg->execId; SQWMsg qwMsg = {.node = node, .msg = msg->msg + msg->sqlLen, .msgLen = msg->phyLen, .connInfo = pMsg->info, .msgType = pMsg->msgType}; + qwMsg.msgInfo.explain = msg->explain; + qwMsg.msgInfo.taskType = msg->taskType; + qwMsg.msgInfo.needFetch = msg->needFetch; + char * sql = strndup(msg->msg, msg->sqlLen); QW_SCH_TASK_DLOG("processQuery start, node:%p, type:%s, handle:%p, sql:%s", node, TMSG_INFO(pMsg->msgType), pMsg->info.handle, sql); - QW_ERR_RET(qwProcessQuery(QW_FPARAMS(), &qwMsg, msg->taskType, msg->explain, sql)); + QW_ERR_RET(qwProcessQuery(QW_FPARAMS(), &qwMsg, sql)); QW_SCH_TASK_DLOG("processQuery end, node:%p", node); return TSDB_CODE_SUCCESS; @@ -447,14 +454,14 @@ int32_t qWorkerProcessFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int return TSDB_CODE_SUCCESS; } -int32_t qWorkerProcessFetchRsp(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts) { +int32_t qWorkerProcessRspMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts) { SQWorker * mgmt = (SQWorker *)qWorkerMgmt; if (mgmt) { qwUpdateTimeInQueue(mgmt, ts, FETCH_QUEUE); - QW_STAT_INC(mgmt->stat.msgStat.fetchRspProcessed, 1); + QW_STAT_INC(mgmt->stat.msgStat.rspProcessed, 1); } - qProcessFetchRsp(NULL, pMsg, NULL); + qProcessRspMsg(NULL, pMsg, NULL); pMsg->pCont = NULL; return TSDB_CODE_SUCCESS; } diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index 3f8d62b1aad38f2ed159c2eb9139ee0a85bb65e9..cf8116fee74a49b49198969d268a5dac62624889 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -57,6 +57,10 @@ int32_t qwHandleTaskComplete(QW_FPARAMS_DEF, SQWTaskCtx *ctx) { connInfo.ahandle = NULL; QW_ERR_RET(qwBuildAndSendExplainRsp(&connInfo, execInfo, resNum)); } + + if (!ctx->needFetch) { + dsGetDataLength(ctx->sinkHandle, &ctx->affectedRows, NULL); + } } return TSDB_CODE_SUCCESS; @@ -123,11 +127,11 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryEnd) { break; } - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_READY) && execNum >= QW_DEFAULT_SHORT_RUN_TIMES) { + if (ctx->needFetch && (!ctx->queryRsped) && execNum >= QW_DEFAULT_SHORT_RUN_TIMES) { break; } - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { + if (QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { break; } @@ -184,7 +188,7 @@ int32_t qwGenerateSchHbRsp(SQWorker *mgmt, SQWSchStatus *sch, SQWHbInfo *hbInfo) } int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, void **rspMsg, SOutputData *pOutput) { - int32_t len = 0; + int64_t len = 0; SRetrieveTableRsp *rsp = NULL; bool queryEnd = false; int32_t code = 0; @@ -243,7 +247,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, } int32_t qwGetDeleteResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, SDeleteRes *pRes) { - int32_t len = 0; + int64_t len = 0; bool queryEnd = false; int32_t code = 0; SOutputData output = {0}; @@ -251,7 +255,7 @@ int32_t qwGetDeleteResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, SDeleteRes *pRes dsGetDataLength(ctx->sinkHandle, &len, &queryEnd); if (len <= 0 || len != sizeof(SDeleterRes)) { - QW_TASK_ELOG("invalid length from dsGetDataLength, length:%d", len); + QW_TASK_ELOG("invalid length from dsGetDataLength, length:%" PRId64, len); QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); } @@ -282,7 +286,6 @@ int32_t qwGetDeleteResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, SDeleteRes *pRes int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *input, SQWPhaseOutput *output) { int32_t code = 0; SQWTaskCtx *ctx = NULL; - SRpcHandleInfo *cancelConnection = NULL; QW_TASK_DLOG("start to handle event at phase %s", qwPhaseStr(phase)); @@ -303,13 +306,13 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu switch (phase) { case QW_PHASE_PRE_QUERY: { - if (QW_IS_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { QW_TASK_ELOG("task already dropped at wrong phase %s", qwPhaseStr(phase)); QW_ERR_JRET(TSDB_CODE_QRY_TASK_STATUS_ERROR); break; } - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { QW_ERR_JRET(qwDropTask(QW_FPARAMS())); //qwBuildAndSendDropRsp(&ctx->ctrlConnInfo, code); @@ -323,29 +326,29 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu break; } case QW_PHASE_PRE_FETCH: { - if (QW_IS_EVENT_PROCESSED(ctx, QW_EVENT_DROP) || QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP) || QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { QW_TASK_WLOG("task dropping or already dropped, phase:%s", qwPhaseStr(phase)); QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); } - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { + if (QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { QW_TASK_WLOG("last fetch still not processed, phase:%s", qwPhaseStr(phase)); QW_ERR_JRET(TSDB_CODE_QRY_DUPLICATTED_OPERATION); } - if (!QW_IS_EVENT_PROCESSED(ctx, QW_EVENT_READY)) { + if (!ctx->queryRsped) { QW_TASK_ELOG("ready msg has not been processed, phase:%s", qwPhaseStr(phase)); QW_ERR_JRET(TSDB_CODE_QRY_TASK_MSG_ERROR); } break; } case QW_PHASE_PRE_CQUERY: { - if (QW_IS_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { QW_TASK_WLOG("task already dropped, phase:%s", qwPhaseStr(phase)); QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); } - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { QW_ERR_JRET(qwDropTask(QW_FPARAMS())); //qwBuildAndSendDropRsp(&ctx->ctrlConnInfo, code); @@ -374,11 +377,6 @@ _return: qwReleaseTaskCtx(mgmt, ctx); } - if (cancelConnection) { - qwBuildAndSendCancelRsp(cancelConnection, code); - QW_TASK_DLOG("cancel rsp send, handle:%p, code:%x - %s", cancelConnection->handle, code, tstrerror(code)); - } - if (code != TSDB_CODE_SUCCESS) { QW_TASK_ELOG("end to handle event at phase %s, code:%s", qwPhaseStr(phase), tstrerror(code)); } else { @@ -400,7 +398,7 @@ int32_t qwHandlePostPhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inp QW_LOCK(QW_WRITE, &ctx->lock); - if (QW_IS_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { QW_TASK_WLOG("task already dropped, phase:%s", qwPhaseStr(phase)); QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); } @@ -409,10 +407,10 @@ int32_t qwHandlePostPhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inp connInfo = ctx->ctrlConnInfo; rspConnection = &connInfo; - QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_READY); + ctx->queryRsped = true; } - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { if (QW_PHASE_POST_FETCH == phase) { QW_TASK_WLOG("drop received at wrong phase %s", qwPhaseStr(phase)); QW_ERR_JRET(TSDB_CODE_QRY_APP_ERROR); @@ -440,7 +438,7 @@ _return: } if (rspConnection) { - qwBuildAndSendQueryRsp(input->msgType + 1, rspConnection, code, ctx ? &ctx->tbInfo : NULL); + qwBuildAndSendQueryRsp(input->msgType + 1, rspConnection, code, ctx); QW_TASK_DLOG("query msg rsped, handle:%p, code:%x - %s", rspConnection->handle, code, tstrerror(code)); } @@ -501,7 +499,7 @@ _return: } -int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType, int8_t explain, const char* sql) { +int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, const char* sql) { int32_t code = 0; bool queryRsped = false; SSubplan *plan = NULL; @@ -514,8 +512,9 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType, int8_t ex QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx)); - ctx->taskType = taskType; - ctx->explain = explain; + ctx->taskType = qwMsg->msgInfo.taskType; + ctx->explain = qwMsg->msgInfo.explain; + ctx->needFetch = qwMsg->msgInfo.needFetch; ctx->queryType = qwMsg->msgType; QW_TASK_DLOGL("subplan json string, len:%d, %s", qwMsg->msgLen, qwMsg->msg); @@ -585,7 +584,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) { QW_ERR_JRET(qwExecTask(QW_FPARAMS(), ctx, &queryEnd)); - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { + if (QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { SOutputData sOutput = {0}; QW_ERR_JRET(qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput)); @@ -622,7 +621,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) { break; } - if (code && QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { + if (code && QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_FETCH); qwFreeFetchRsp(rsp); rsp = NULL; @@ -686,7 +685,7 @@ int32_t qwProcessFetch(QW_FPARAMS_DEF, SQWMsg *qwMsg) { locked = true; // RC WARNING - if (QW_IS_QUERY_RUNNING(ctx)) { + if (QW_QUERY_RUNNING(ctx)) { atomic_store_8((int8_t *)&ctx->queryContinue, 1); } else if (0 == atomic_load_8((int8_t *)&ctx->queryInQueue)) { qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_EXEC); @@ -714,7 +713,7 @@ _return: if (code || rsp) { qwBuildAndSendFetchRsp(qwMsg->msgType + 1, &qwMsg->connInfo, rsp, dataLen, code); - QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code, tstrerror(code), + QW_TASK_DLOG("%s send, handle:%p, code:%x - %s, dataLen:%d", TMSG_INFO(qwMsg->msgType + 1), qwMsg->connInfo.handle, code, tstrerror(code), dataLen); } @@ -733,12 +732,12 @@ int32_t qwProcessDrop(QW_FPARAMS_DEF, SQWMsg *qwMsg) { locked = true; - if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { + if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { QW_TASK_WLOG_E("task already dropping"); QW_ERR_JRET(TSDB_CODE_QRY_DUPLICATTED_OPERATION); } - if (QW_IS_QUERY_RUNNING(ctx)) { + if (QW_QUERY_RUNNING(ctx)) { QW_ERR_JRET(qwKillTaskHandle(QW_FPARAMS(), ctx)); qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_DROP); } else if (ctx->phase > 0) { diff --git a/source/libs/qworker/test/qworkerTests.cpp b/source/libs/qworker/test/qworkerTests.cpp index be54db51de1c077092d1bdaa05959c58169c9f98..1f76ea1e7e294090019d8f67e108b1b97cb84d6b 100644 --- a/source/libs/qworker/test/qworkerTests.cpp +++ b/source/libs/qworker/test/qworkerTests.cpp @@ -332,7 +332,7 @@ void qwtEndPut(DataSinkHandle handle, uint64_t useconds) { qwtTestSinkQueryEnd = true; } -void qwtGetDataLength(DataSinkHandle handle, int32_t* pLen, bool* pQueryEnd) { +void qwtGetDataLength(DataSinkHandle handle, int64_t* pLen, bool* pQueryEnd) { static int32_t in = 0; if (in > 0) { diff --git a/source/libs/scheduler/inc/schInt.h b/source/libs/scheduler/inc/schInt.h index 7289e4b6bec7572c76a8c99b1d6ba8ebd394c552..9018deaf13d14b77bdb00d18035a9bb72c860b7b 100644 --- a/source/libs/scheduler/inc/schInt.h +++ b/source/libs/scheduler/inc/schInt.h @@ -296,8 +296,8 @@ extern SSchedulerMgmt schMgmt; #define SCH_TASK_ID(_task) ((_task) ? (_task)->taskId : -1) #define SCH_TASK_EID(_task) ((_task) ? (_task)->execId : -1) -#define SCH_IS_DATA_SRC_QRY_TASK(task) ((task)->plan->subplanType == SUBPLAN_TYPE_SCAN) -#define SCH_IS_DATA_SRC_TASK(task) (((task)->plan->subplanType == SUBPLAN_TYPE_SCAN) || ((task)->plan->subplanType == SUBPLAN_TYPE_MODIFY)) +#define SCH_IS_DATA_BIND_QRY_TASK(task) ((task)->plan->subplanType == SUBPLAN_TYPE_SCAN) +#define SCH_IS_DATA_BIND_TASK(task) (((task)->plan->subplanType == SUBPLAN_TYPE_SCAN) || ((task)->plan->subplanType == SUBPLAN_TYPE_MODIFY)) #define SCH_IS_LEAF_TASK(_job, _task) (((_task)->level->level + 1) == (_job)->levelNum) #define SCH_SET_TASK_STATUS(task, st) atomic_store_8(&(task)->status, st) @@ -317,8 +317,9 @@ extern SSchedulerMgmt schMgmt; #define SCH_SET_JOB_NEED_FLOW_CTRL(_job) (_job)->attr.needFlowCtrl = true #define SCH_JOB_NEED_FLOW_CTRL(_job) ((_job)->attr.needFlowCtrl) -#define SCH_TASK_NEED_FLOW_CTRL(_job, _task) (SCH_IS_DATA_SRC_QRY_TASK(_task) && SCH_JOB_NEED_FLOW_CTRL(_job) && SCH_IS_LEVEL_UNFINISHED((_task)->level)) -#define SCH_FETCH_TYPE(_pSrcTask) (SCH_IS_DATA_SRC_QRY_TASK(_pSrcTask) ? TDMT_SCH_FETCH : TDMT_SCH_MERGE_FETCH) +#define SCH_TASK_NEED_FLOW_CTRL(_job, _task) (SCH_IS_DATA_BIND_QRY_TASK(_task) && SCH_JOB_NEED_FLOW_CTRL(_job) && SCH_IS_LEVEL_UNFINISHED((_task)->level)) +#define SCH_FETCH_TYPE(_pSrcTask) (SCH_IS_DATA_BIND_QRY_TASK(_pSrcTask) ? TDMT_SCH_FETCH : TDMT_SCH_MERGE_FETCH) +#define SCH_TASK_NEED_FETCH(_task) ((_task)->plan->subplanType != SUBPLAN_TYPE_MODIFY) #define SCH_SET_JOB_TYPE(_job, type) do { if ((type) != SUBPLAN_TYPE_MODIFY) { (_job)->attr.queryJob = true; } } while (0) #define SCH_IS_QUERY_JOB(_job) ((_job)->attr.queryJob) diff --git a/source/libs/scheduler/src/schJob.c b/source/libs/scheduler/src/schJob.c index 858f68e7ae4cfbb23efb7b25fc38582c8435d155..13100afb8bcc89add22402b8b33e3cc490be19e3 100644 --- a/source/libs/scheduler/src/schJob.c +++ b/source/libs/scheduler/src/schJob.c @@ -247,7 +247,7 @@ int32_t schBuildTaskRalation(SSchJob *pJob, SHashObj *planToTask) { int32_t schAppendJobDataSrc(SSchJob *pJob, SSchTask *pTask) { - if (!SCH_IS_DATA_SRC_QRY_TASK(pTask)) { + if (!SCH_IS_DATA_BIND_QRY_TASK(pTask)) { return TSDB_CODE_SUCCESS; } @@ -879,7 +879,7 @@ int32_t schProcessOnCbBegin(SSchJob** job, SSchTask** task, uint64_t qId, int64_ } if (schJobNeedToStop(pJob, &status)) { - SCH_TASK_ELOG("will not do further processing cause of job status %s", jobTaskStatusStr(status)); + SCH_TASK_DLOG("will not do further processing cause of job status %s", jobTaskStatusStr(status)); SCH_ERR_JRET(TSDB_CODE_SCH_IGNORE_ERROR); } diff --git a/source/libs/scheduler/src/schRemote.c b/source/libs/scheduler/src/schRemote.c index e1035c4fca59c15bdedc1c0ae1011a994bfb9398..f9c3d80e46ba3709b9be8edd08bc8528e634b889 100644 --- a/source/libs/scheduler/src/schRemote.c +++ b/source/libs/scheduler/src/schRemote.c @@ -21,44 +21,30 @@ #include "tref.h" #include "trpc.h" -int32_t schValidateReceivedMsgType(SSchJob *pJob, SSchTask *pTask, int32_t msgType) { +int32_t schValidateRspMsgType(SSchJob *pJob, SSchTask *pTask, int32_t msgType) { int32_t lastMsgType = pTask->lastMsgType; int32_t taskStatus = SCH_GET_TASK_STATUS(pTask); - int32_t reqMsgType = msgType - 1; + int32_t reqMsgType = (msgType & 1U) ? msgType : (msgType - 1); switch (msgType) { case TDMT_SCH_LINK_BROKEN: case TDMT_SCH_EXPLAIN_RSP: return TSDB_CODE_SUCCESS; - case TDMT_SCH_MERGE_QUERY_RSP: - case TDMT_SCH_QUERY_RSP: // query_rsp may be processed later than ready_rsp - if (lastMsgType != reqMsgType && -1 != lastMsgType) { - SCH_TASK_DLOG("rsp msg type mis-match, last sent msgType:%s, rspType:%s", TMSG_INFO(lastMsgType), - TMSG_INFO(msgType)); - } - - if (taskStatus != JOB_TASK_STATUS_EXEC && taskStatus != JOB_TASK_STATUS_PART_SUCC) { - SCH_TASK_DLOG("rsp msg conflicted with task status, status:%s, rspType:%s", jobTaskStatusStr(taskStatus), - TMSG_INFO(msgType)); - } - - // SCH_SET_TASK_LASTMSG_TYPE(pTask, -1); - return TSDB_CODE_SUCCESS; case TDMT_SCH_FETCH_RSP: case TDMT_SCH_MERGE_FETCH_RSP: - if (lastMsgType != reqMsgType && -1 != lastMsgType) { + if (lastMsgType != reqMsgType) { SCH_TASK_ELOG("rsp msg type mis-match, last sent msgType:%s, rspType:%s", TMSG_INFO(lastMsgType), TMSG_INFO(msgType)); SCH_ERR_RET(TSDB_CODE_SCH_STATUS_ERROR); - } - - if (taskStatus != JOB_TASK_STATUS_EXEC && taskStatus != JOB_TASK_STATUS_PART_SUCC) { + } + if (taskStatus != JOB_TASK_STATUS_PART_SUCC) { SCH_TASK_ELOG("rsp msg conflicted with task status, status:%s, rspType:%s", jobTaskStatusStr(taskStatus), TMSG_INFO(msgType)); SCH_ERR_RET(TSDB_CODE_SCH_STATUS_ERROR); } - // SCH_SET_TASK_LASTMSG_TYPE(pTask, -1); return TSDB_CODE_SUCCESS; + case TDMT_SCH_MERGE_QUERY_RSP: + case TDMT_SCH_QUERY_RSP: case TDMT_VND_CREATE_TABLE_RSP: case TDMT_VND_DROP_TABLE_RSP: case TDMT_VND_ALTER_TABLE_RSP: @@ -77,14 +63,12 @@ int32_t schValidateReceivedMsgType(SSchJob *pJob, SSchTask *pTask, int32_t msgTy SCH_ERR_RET(TSDB_CODE_SCH_STATUS_ERROR); } - if (taskStatus != JOB_TASK_STATUS_EXEC && taskStatus != JOB_TASK_STATUS_PART_SUCC) { + if (taskStatus != JOB_TASK_STATUS_EXEC) { SCH_TASK_ELOG("rsp msg conflicted with task status, status:%s, rspType:%s", jobTaskStatusStr(taskStatus), TMSG_INFO(msgType)); SCH_ERR_RET(TSDB_CODE_SCH_STATUS_ERROR); } - // SCH_SET_TASK_LASTMSG_TYPE(pTask, -1); - return TSDB_CODE_SUCCESS; } @@ -98,7 +82,7 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDa bool dropExecNode = (msgType == TDMT_SCH_LINK_BROKEN || SCH_NETWORK_ERR(rspCode)); SCH_ERR_JRET(schUpdateTaskHandle(pJob, pTask, dropExecNode, pMsg->handle, execId)); - SCH_ERR_JRET(schValidateReceivedMsgType(pJob, pTask, msgType)); + SCH_ERR_JRET(schValidateRspMsgType(pJob, pTask, msgType)); int32_t reqType = IsReq(pMsg) ? pMsg->msgType : (pMsg->msgType - 1); if (SCH_NEED_REDIRECT(reqType, rspCode, pMsg->len)) { @@ -259,18 +243,25 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDa } case TDMT_SCH_QUERY_RSP: case TDMT_SCH_MERGE_QUERY_RSP: { - SQueryTableRsp *rsp = (SQueryTableRsp *)msg; - SCH_ERR_JRET(rspCode); if (NULL == msg) { SCH_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT); } + + SQueryTableRsp *rsp = (SQueryTableRsp *)msg; + rsp->code = ntohl(rsp->code); + rsp->sversion = ntohl(rsp->sversion); + rsp->tversion = ntohl(rsp->tversion); + rsp->affectedRows = be64toh(rsp->affectedRows); + SCH_ERR_JRET(rsp->code); SCH_ERR_JRET(schSaveJobQueryRes(pJob, rsp)); - taosMemoryFreeClear(msg); + atomic_add_fetch_32(&pJob->resNumOfRows, rsp->affectedRows); + taosMemoryFreeClear(msg); + SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask)); break; @@ -1010,6 +1001,7 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr, pMsg->execId = htonl(pTask->execId); pMsg->taskType = TASK_TYPE_TEMP; pMsg->explain = SCH_IS_EXPLAIN_JOB(pJob); + pMsg->needFetch = SCH_TASK_NEED_FETCH(pTask); pMsg->phyLen = htonl(pTask->msgLen); pMsg->sqlLen = htonl(len); diff --git a/source/libs/scheduler/src/schTask.c b/source/libs/scheduler/src/schTask.c index 45cb0ab93504a839b368f0d12fa038053d93e7b6..d56397283c3ab7a3ec76f42f771332272e6763bd 100644 --- a/source/libs/scheduler/src/schTask.c +++ b/source/libs/scheduler/src/schTask.c @@ -276,7 +276,7 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) { } int32_t schRescheduleTask(SSchJob *pJob, SSchTask *pTask) { - if (SCH_IS_DATA_SRC_QRY_TASK(pTask)) { + if (SCH_IS_DATA_BIND_TASK(pTask)) { return TSDB_CODE_SUCCESS; } @@ -313,7 +313,7 @@ int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf* pData, int32 pTask->lastMsgType = 0; memset(&pTask->succeedAddr, 0, sizeof(pTask->succeedAddr)); - if (SCH_IS_DATA_SRC_QRY_TASK(pTask)) { + if (SCH_IS_DATA_BIND_TASK(pTask)) { if (pData) { SCH_ERR_JRET(schUpdateTaskCandidateAddr(pJob, pTask, pData->pEpSet)); } @@ -358,7 +358,7 @@ _return: int32_t schHandleRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf* pData, int32_t rspCode) { int32_t code = 0; - if (SCH_IS_DATA_SRC_QRY_TASK(pTask)) { + if (SCH_IS_DATA_BIND_TASK(pTask)) { if (NULL == pData->pEpSet) { SCH_TASK_ELOG("no epset updated while got error %s", tstrerror(rspCode)); SCH_ERR_JRET(rspCode); @@ -492,7 +492,7 @@ int32_t schTaskCheckSetRetry(SSchJob *pJob, SSchTask *pTask, int32_t errCode, bo return TSDB_CODE_SUCCESS; } - if (SCH_IS_DATA_SRC_TASK(pTask)) { + if (SCH_IS_DATA_BIND_TASK(pTask)) { if ((pTask->execId + 1) >= SCH_TASK_NUM_OF_EPS(&pTask->plan->execNode)) { *needRetry = false; SCH_TASK_DLOG("task no more retry since all ep tried, execId:%d, epNum:%d", pTask->execId, @@ -528,7 +528,7 @@ int32_t schHandleTaskRetry(SSchJob *pJob, SSchTask *pTask) { schDeregisterTaskHb(pJob, pTask); - if (SCH_IS_DATA_SRC_TASK(pTask)) { + if (SCH_IS_DATA_BIND_TASK(pTask)) { SCH_SWITCH_EPSET(&pTask->plan->execNode); } else { int32_t candidateNum = taosArrayGetSize(pTask->candidateAddrs); @@ -596,7 +596,7 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) { return TSDB_CODE_SUCCESS; } - if (SCH_IS_DATA_SRC_QRY_TASK(pTask)) { + if (SCH_IS_DATA_BIND_TASK(pTask)) { SCH_TASK_ELOG("no execNode specifed for data src task, numOfEps:%d", pTask->plan->execNode.epSet.numOfEps); SCH_ERR_RET(TSDB_CODE_QRY_APP_ERROR); } diff --git a/source/libs/stream/inc/streamInc.h b/source/libs/stream/inc/streamInc.h index 2f41c083549d0cc6f060fe888df5fd697099aa95..1629c863d5389614f01ea726d69e885d42f76ce9 100644 --- a/source/libs/stream/inc/streamInc.h +++ b/source/libs/stream/inc/streamInc.h @@ -17,6 +17,7 @@ #define _STREAM_INC_H_ #include "executor.h" +#include "tref.h" #include "tstream.h" #ifdef __cplusplus @@ -24,8 +25,9 @@ extern "C" { #endif typedef struct { - int8_t inited; - void* timer; + int8_t inited; + int32_t refPool; + void* timer; } SStreamGlobalEnv; static SStreamGlobalEnv streamEnv; diff --git a/source/libs/stream/src/stream.c b/source/libs/stream/src/stream.c index 56d063ae5141ac203d905a8d58c2d588f018e683..8b8badd67aa0d6b33222b0c4c91d7801a6b7c6ec 100644 --- a/source/libs/stream/src/stream.c +++ b/source/libs/stream/src/stream.c @@ -76,9 +76,6 @@ void streamTriggerByTimer(void* param, void* tmrId) { int32_t streamSetupTrigger(SStreamTask* pTask) { if (pTask->triggerParam != 0) { - if (streamInit() < 0) { - return -1; - } pTask->timer = taosTmrStart(streamTriggerByTimer, (int32_t)pTask->triggerParam, pTask, streamEnv.timer); pTask->triggerStatus = TASK_TRIGGER_STATUS__IN_ACTIVE; } diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 8936cd6ed9bfc6ee33d19d5dcca8ea527b71c837..9742f93824120f4f6ca21401c695de7f2524d240 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -67,7 +67,6 @@ typedef struct SSyncNode { char path[TSDB_FILENAME_LEN]; char raftStorePath[TSDB_FILENAME_LEN * 2]; char configPath[TSDB_FILENAME_LEN * 2]; - int32_t batchSize; // sync io SWal* pWal; diff --git a/source/libs/sync/inc/syncOnMessage.h b/source/libs/sync/inc/syncOnMessage.h deleted file mode 100644 index 2f8856e652a84332a9455fb1f6bc26bf8a975e89..0000000000000000000000000000000000000000 --- a/source/libs/sync/inc/syncOnMessage.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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 _TD_LIBS_SYNC_ON_MESSAGE_H -#define _TD_LIBS_SYNC_ON_MESSAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#include "taosdef.h" - -// TLA+ Spec -// Receive(m) == -// LET i == m.mdest -// j == m.msource -// IN \* Any RPC with a newer term causes the recipient to advance -// \* its term first. Responses with stale terms are ignored. -// \/ UpdateTerm(i, j, m) -// \/ /\ m.mtype = RequestVoteRequest -// /\ HandleRequestVoteRequest(i, j, m) -// \/ /\ m.mtype = RequestVoteResponse -// /\ \/ DropStaleResponse(i, j, m) -// \/ HandleRequestVoteResponse(i, j, m) -// \/ /\ m.mtype = AppendEntriesRequest -// /\ HandleAppendEntriesRequest(i, j, m) -// \/ /\ m.mtype = AppendEntriesResponse -// /\ \/ DropStaleResponse(i, j, m) -// \/ HandleAppendEntriesResponse(i, j, m) - -// DuplicateMessage(m) == -// /\ Send(m) -// /\ UNCHANGED <> - -// DropMessage(m) == -// /\ Discard(m) -// /\ UNCHANGED <> - -// Next == /\ \/ \E i \in Server : Restart(i) -// \/ \E i \in Server : Timeout(i) -// \/ \E i,j \in Server : RequestVote(i, j) -// \/ \E i \in Server : BecomeLeader(i) -// \/ \E i \in Server, v \in Value : ClientRequest(i, v) -// \/ \E i \in Server : AdvanceCommitIndex(i) -// \/ \E i,j \in Server : AppendEntries(i, j) -// \/ \E m \in DOMAIN messages : Receive(m) -// \/ \E m \in DOMAIN messages : DuplicateMessage(m) -// \/ \E m \in DOMAIN messages : DropMessage(m) -// \* History variable that tracks every log ever: -// /\ allLogs' = allLogs \cup {log[i] : i \in Server} -// - -#ifdef __cplusplus -} -#endif - -#endif /*_TD_LIBS_SYNC_ON_MESSAGE_H*/ diff --git a/source/libs/sync/inc/syncRaftLog.h b/source/libs/sync/inc/syncRaftLog.h index f3ed9e302b5b0bc23397051bf665feab335754f7..65ec77e38ff10ff77de1d4000515439ad7844ef9 100644 --- a/source/libs/sync/inc/syncRaftLog.h +++ b/source/libs/sync/inc/syncRaftLog.h @@ -32,8 +32,8 @@ typedef struct SSyncLogStoreData { SSyncNode* pSyncNode; SWal* pWal; - TdThreadMutex mutex; - SWalReadHandle* pWalHandle; + TdThreadMutex mutex; + SWalReader* pWalHandle; // SyncIndex beginIndex; // valid begin index, default 0, may be set beginIndex > 0 } SSyncLogStoreData; diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 885ab1acae068d8d8f98fdde20be2eea2cc3d0c9..e43c1e4b33d73b05501f2d567056a9a20f781446 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -162,6 +162,17 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { pReply->success = false; pReply->matchIndex = SYNC_INDEX_INVALID; + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); + SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg); @@ -334,270 +345,16 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { pReply->matchIndex = pMsg->prevLogIndex; } - SRpcMsg rpcMsg; - syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); - syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg); - syncAppendEntriesReplyDestroy(pReply); - - // maybe update commit index from leader - if (pMsg->commitIndex > ths->commitIndex) { - // has commit entry in local - if (pMsg->commitIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) { - SyncIndex beginIndex = ths->commitIndex + 1; - SyncIndex endIndex = pMsg->commitIndex; - - // update commit index - ths->commitIndex = pMsg->commitIndex; - - // call back Wal - ths->pLogStore->updateCommitIndex(ths->pLogStore, ths->commitIndex); - - int32_t code = syncNodeCommit(ths, beginIndex, endIndex, ths->state); - ASSERT(code == 0); - } - } - } - - return ret; -} - -#if 0 - -int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { - int32_t ret = 0; - - char logBuf[128] = {0}; - snprintf(logBuf, sizeof(logBuf), "==syncNodeOnAppendEntriesCb== term:%lu", ths->pRaftStore->currentTerm); - syncAppendEntriesLog2(logBuf, pMsg); - - if (pMsg->term > ths->pRaftStore->currentTerm) { - syncNodeUpdateTerm(ths, pMsg->term); - } - ASSERT(pMsg->term <= ths->pRaftStore->currentTerm); - - // reset elect timer - if (pMsg->term == ths->pRaftStore->currentTerm) { - ths->leaderCache = pMsg->srcId; - syncNodeResetElectTimer(ths); - } - ASSERT(pMsg->dataLen >= 0); - - SyncTerm localPreLogTerm = 0; - if (pMsg->prevLogIndex >= SYNC_INDEX_BEGIN && pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) { - SSyncRaftEntry* pEntry = ths->pLogStore->getEntry(ths->pLogStore, pMsg->prevLogIndex); - if (pEntry == NULL) { - char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "getEntry error, index:%ld, since %s", pMsg->prevLogIndex, terrstr()); - syncNodeErrorLog(ths, logBuf); - return -1; - } - - localPreLogTerm = pEntry->term; - syncEntryDestory(pEntry); - } - - bool logOK = - (pMsg->prevLogIndex == SYNC_INDEX_INVALID) || - ((pMsg->prevLogIndex >= SYNC_INDEX_BEGIN) && - (pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) && (pMsg->prevLogTerm == localPreLogTerm)); - - // reject request - if ((pMsg->term < ths->pRaftStore->currentTerm) || - ((pMsg->term == ths->pRaftStore->currentTerm) && (ths->state == TAOS_SYNC_STATE_FOLLOWER) && !logOK)) { - sTrace( - "syncNodeOnAppendEntriesCb --> reject, pMsg->term:%lu, ths->pRaftStore->currentTerm:%lu, ths->state:%d, " - "logOK:%d", - pMsg->term, ths->pRaftStore->currentTerm, ths->state, logOK); - - SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId); - pReply->srcId = ths->myRaftId; - pReply->destId = pMsg->srcId; - pReply->term = ths->pRaftStore->currentTerm; - pReply->success = false; - pReply->matchIndex = SYNC_INDEX_INVALID; - - SRpcMsg rpcMsg; - syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); - syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg); - syncAppendEntriesReplyDestroy(pReply); - - return ret; - } - - // return to follower state - if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_CANDIDATE) { - sTrace( - "syncNodeOnAppendEntriesCb --> return to follower, pMsg->term:%lu, ths->pRaftStore->currentTerm:%lu, " - "ths->state:%d, logOK:%d", - pMsg->term, ths->pRaftStore->currentTerm, ths->state, logOK); - - syncNodeBecomeFollower(ths, "from candidate by append entries"); - - // ret or reply? - return ret; - } - - // accept request - if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_FOLLOWER && logOK) { - // preIndex = -1, or has preIndex entry in local log - ASSERT(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)); - - // has extra entries (> preIndex) in local log - bool hasExtraEntries = pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore); - - // has entries in SyncAppendEntries msg - bool hasAppendEntries = pMsg->dataLen > 0; - - sTrace( - "syncNodeOnAppendEntriesCb --> accept, pMsg->term:%lu, ths->pRaftStore->currentTerm:%lu, ths->state:%d, " - "logOK:%d, hasExtraEntries:%d, hasAppendEntries:%d", - pMsg->term, ths->pRaftStore->currentTerm, ths->state, logOK, hasExtraEntries, hasAppendEntries); - - if (hasExtraEntries && hasAppendEntries) { - // not conflict by default - bool conflict = false; - - SyncIndex extraIndex = pMsg->prevLogIndex + 1; - SSyncRaftEntry* pExtraEntry = ths->pLogStore->getEntry(ths->pLogStore, extraIndex); - if (pExtraEntry == NULL) { - char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "getEntry error2, index:%ld, since %s", extraIndex, terrstr()); - syncNodeErrorLog(ths, logBuf); - return -1; - } - - SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen); - if (pAppendEntry == NULL) { - syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry error"); - return -1; - } - - // log not match, conflict - ASSERT(extraIndex == pAppendEntry->index); - if (pExtraEntry->term != pAppendEntry->term) { - conflict = true; - } - - if (conflict) { - // roll back - SyncIndex delBegin = ths->pLogStore->getLastIndex(ths->pLogStore); - SyncIndex delEnd = extraIndex; - - sTrace("syncNodeOnAppendEntriesCb --> conflict:%d, delBegin:%ld, delEnd:%ld", conflict, delBegin, delEnd); - - // notice! reverse roll back! - for (SyncIndex index = delEnd; index >= delBegin; --index) { - if (ths->pFsm->FpRollBackCb != NULL) { - SSyncRaftEntry* pRollBackEntry = ths->pLogStore->getEntry(ths->pLogStore, index); - if (pRollBackEntry == NULL) { - char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "getEntry error3, index:%ld, since %s", index, terrstr()); - syncNodeErrorLog(ths, logBuf); - return -1; - } - - // if (pRollBackEntry->msgType != TDMT_SYNC_NOOP) { - if (syncUtilUserRollback(pRollBackEntry->msgType)) { - SRpcMsg rpcMsg; - syncEntry2OriginalRpc(pRollBackEntry, &rpcMsg); - - SFsmCbMeta cbMeta = {0}; - cbMeta.index = pRollBackEntry->index; - cbMeta.lastConfigIndex = syncNodeGetSnapshotConfigIndex(ths, cbMeta.index); - cbMeta.isWeak = pRollBackEntry->isWeak; - cbMeta.code = 0; - cbMeta.state = ths->state; - cbMeta.seqNum = pRollBackEntry->seqNum; - ths->pFsm->FpRollBackCb(ths->pFsm, &rpcMsg, cbMeta); - rpcFreeCont(rpcMsg.pCont); - } - - syncEntryDestory(pRollBackEntry); - } - } - - // delete confict entries - ths->pLogStore->truncate(ths->pLogStore, extraIndex); - - // append new entries - ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry); - - // pre commit - SRpcMsg rpcMsg; - syncEntry2OriginalRpc(pAppendEntry, &rpcMsg); - if (ths->pFsm != NULL) { - // if (ths->pFsm->FpPreCommitCb != NULL && pAppendEntry->originalRpcType != TDMT_SYNC_NOOP) { - if (ths->pFsm->FpPreCommitCb != NULL && syncUtilUserPreCommit(pAppendEntry->originalRpcType)) { - SFsmCbMeta cbMeta = {0}; - cbMeta.index = pAppendEntry->index; - cbMeta.lastConfigIndex = syncNodeGetSnapshotConfigIndex(ths, cbMeta.index); - cbMeta.isWeak = pAppendEntry->isWeak; - cbMeta.code = 2; - cbMeta.state = ths->state; - cbMeta.seqNum = pAppendEntry->seqNum; - ths->pFsm->FpPreCommitCb(ths->pFsm, &rpcMsg, cbMeta); - } - } - rpcFreeCont(rpcMsg.pCont); - } - - // free memory - syncEntryDestory(pExtraEntry); - syncEntryDestory(pAppendEntry); - - } else if (hasExtraEntries && !hasAppendEntries) { - // do nothing - - } else if (!hasExtraEntries && hasAppendEntries) { - SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen); - if (pAppendEntry == NULL) { - syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry2 error"); - return -1; - } - - // append new entries - ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry); - - // pre commit - SRpcMsg rpcMsg; - syncEntry2OriginalRpc(pAppendEntry, &rpcMsg); - if (ths->pFsm != NULL) { - // if (ths->pFsm->FpPreCommitCb != NULL && pAppendEntry->originalRpcType != TDMT_SYNC_NOOP) { - if (ths->pFsm->FpPreCommitCb != NULL && syncUtilUserPreCommit(pAppendEntry->originalRpcType)) { - SFsmCbMeta cbMeta = {0}; - cbMeta.index = pAppendEntry->index; - cbMeta.lastConfigIndex = syncNodeGetSnapshotConfigIndex(ths, cbMeta.index); - cbMeta.isWeak = pAppendEntry->isWeak; - cbMeta.code = 3; - cbMeta.state = ths->state; - cbMeta.seqNum = pAppendEntry->seqNum; - ths->pFsm->FpPreCommitCb(ths->pFsm, &rpcMsg, cbMeta); - } - } - rpcFreeCont(rpcMsg.pCont); - - // free memory - syncEntryDestory(pAppendEntry); - - } else if (!hasExtraEntries && !hasAppendEntries) { - // do nothing - - } else { - syncNodeLog3("", ths); - ASSERT(0); - } - - SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId); - pReply->srcId = ths->myRaftId; - pReply->destId = pMsg->srcId; - pReply->term = ths->pRaftStore->currentTerm; - pReply->success = true; - - if (hasAppendEntries) { - pReply->matchIndex = pMsg->prevLogIndex + 1; - } else { - pReply->matchIndex = pMsg->prevLogIndex; - } + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); @@ -626,8 +383,6 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { return ret; } -#endif - static int32_t syncNodeMakeLogSame(SSyncNode* ths, SyncAppendEntries* pMsg) { int32_t code; @@ -842,8 +597,8 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc do { char logBuf[128]; snprintf(logBuf, sizeof(logBuf), - "recv sync-append-entries-batch, fake match2, pre-index:%ld, pre-term:%lu, datalen:%d", - pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen); + "recv sync-append-entries-batch, fake match2, {pre-index:%ld, pre-term:%lu, datalen:%d, datacount:%d}", + pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen, pMsg->dataCount); syncNodeEventLog(ths, logBuf); } while (0); @@ -876,7 +631,7 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc code = syncNodePreCommit(ths, pAppendEntry); ASSERT(code == 0); - syncEntryDestory(pAppendEntry); + // syncEntryDestory(pAppendEntry); } // fsync once @@ -897,6 +652,17 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc pReply->success = true; pReply->matchIndex = matchIndex; + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); + // send response SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); @@ -931,8 +697,8 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc do { char logBuf[128]; snprintf(logBuf, sizeof(logBuf), - "recv sync-append-entries-batch, not match, pre-index:%ld, pre-term:%lu, datalen:%d", - pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen); + "recv sync-append-entries-batch, not match, {pre-index:%ld, pre-term:%lu, datalen:%d, datacount:%d}", + pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen, pMsg->dataCount); syncNodeEventLog(ths, logBuf); } while (0); @@ -945,6 +711,17 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc pReply->success = false; pReply->matchIndex = SYNC_INDEX_INVALID; + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); + // send response SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); @@ -976,8 +753,9 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc do { char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "recv sync-append-entries, match, pre-index:%ld, pre-term:%lu, datalen:%d", - pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen); + snprintf(logBuf, sizeof(logBuf), + "recv sync-append-entries-batch, match, {pre-index:%ld, pre-term:%lu, datalen:%d, datacount:%d}", + pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen, pMsg->dataCount); syncNodeEventLog(ths, logBuf); } while (0); @@ -999,7 +777,7 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc code = syncNodePreCommit(ths, pAppendEntry); ASSERT(code == 0); - syncEntryDestory(pAppendEntry); + // syncEntryDestory(pAppendEntry); } // fsync once @@ -1017,6 +795,17 @@ int32_t syncNodeOnAppendEntriesSnapshot2Cb(SSyncNode* ths, SyncAppendEntriesBatc pReply->success = true; pReply->matchIndex = hasAppendEntries ? pMsg->prevLogIndex + pMsg->dataCount : pMsg->prevLogIndex; + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); + // send response SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); @@ -1226,6 +1015,17 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs pReply->success = true; pReply->matchIndex = matchIndex; + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); + // send response SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); @@ -1271,6 +1071,17 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs pReply->success = false; pReply->matchIndex = SYNC_INDEX_INVALID; + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); + // send response SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); @@ -1336,6 +1147,17 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs pReply->success = true; pReply->matchIndex = hasAppendEntries ? pMsg->prevLogIndex + 1 : pMsg->prevLogIndex; + // msg event log + do { + char host[128]; + uint16_t port; + syncUtilU642Addr(pReply->destId.addr, host, sizeof(host), &port); + sDebug( + "vgId:%d, send sync-append-entries-reply to %s:%d, {term:%lu, pterm:%lu, success:%d, " + "match-index:%ld}", + ths->vgId, host, port, pReply->term, pReply->privateTerm, pReply->success, pReply->matchIndex); + } while (0); + // send response SRpcMsg rpcMsg; syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index e4724fc999dcedb565e309f5591818d03f6775b9..3f19b6759e9dcc4924681e5978065cbe602e019f 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -174,8 +174,12 @@ int32_t syncNodeOnAppendEntriesReplySnapshot2Cb(SSyncNode* ths, SyncAppendEntrie SyncIndex newNextIndex = pMsg->matchIndex + 1; SyncIndex newMatchIndex = pMsg->matchIndex; - if (ths->pLogStore->syncLogExist(ths->pLogStore, newNextIndex) && - ths->pLogStore->syncLogExist(ths->pLogStore, newNextIndex - 1)) { + bool needStartSnapshot = false; + if (newMatchIndex >= SYNC_INDEX_BEGIN && !ths->pLogStore->syncLogExist(ths->pLogStore, newMatchIndex)) { + needStartSnapshot = true; + } + + if (!needStartSnapshot) { // update next-index, match-index syncIndexMgrSetIndex(ths->pNextIndex, &(pMsg->srcId), newNextIndex); syncIndexMgrSetIndex(ths->pMatchIndex, &(pMsg->srcId), newMatchIndex); @@ -197,15 +201,36 @@ int32_t syncNodeOnAppendEntriesReplySnapshot2Cb(SSyncNode* ths, SyncAppendEntrie syncIndexMgrSetIndex(ths->pMatchIndex, &(pMsg->srcId), newMatchIndex); } + // event log, update next-index + do { + char host[64]; + int16_t port; + syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); + + char logBuf[256]; + snprintf(logBuf, sizeof(logBuf), "reset next-index:%ld, match-index:%ld for %s:%d", newNextIndex, newMatchIndex, + host, port); + syncNodeEventLog(ths, logBuf); + + } while (0); + } else { SyncIndex nextIndex = syncIndexMgrGetIndex(ths->pNextIndex, &(pMsg->srcId)); if (nextIndex > SYNC_INDEX_BEGIN) { --nextIndex; - if (ths->pLogStore->syncLogExist(ths->pLogStore, nextIndex) && - ths->pLogStore->syncLogExist(ths->pLogStore, nextIndex - 1)) { + bool needStartSnapshot = false; + if (nextIndex >= SYNC_INDEX_BEGIN && !ths->pLogStore->syncLogExist(ths->pLogStore, nextIndex)) { + needStartSnapshot = true; + } + if (nextIndex - 1 >= SYNC_INDEX_BEGIN && !ths->pLogStore->syncLogExist(ths->pLogStore, nextIndex - 1)) { + needStartSnapshot = true; + } + + if (!needStartSnapshot) { // do nothing + } else { SSyncRaftEntry* pEntry; int32_t code = ths->pLogStore->syncLogGetEntry(ths->pLogStore, nextIndex, &pEntry); @@ -227,6 +252,21 @@ int32_t syncNodeOnAppendEntriesReplySnapshot2Cb(SSyncNode* ths, SyncAppendEntrie nextIndex = SYNC_INDEX_BEGIN; } syncIndexMgrSetIndex(ths->pNextIndex, &(pMsg->srcId), nextIndex); + + // event log, update next-index + do { + char host[64]; + int16_t port; + syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); + + SyncIndex newNextIndex = nextIndex; + SyncIndex newMatchIndex = syncIndexMgrGetIndex(ths->pMatchIndex, &(pMsg->srcId)); + char logBuf[256]; + snprintf(logBuf, sizeof(logBuf), "reset2 next-index:%ld, match-index:%ld for %s:%d", newNextIndex, newMatchIndex, + host, port); + syncNodeEventLog(ths, logBuf); + + } while (0); } return 0; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index cc6057b031db0e92ed062e26b64973c63e6d5d58..7fa13c9dc8088cdabd98082e62752e1536806f46 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1025,14 +1025,14 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) { pSyncNode->FpOnSnapshotRsp = syncNodeOnSnapshotRspCb; if (pSyncNode->pRaftCfg->snapshotStrategy) { - sInfo("sync node use snapshot"); + sInfo("vgId:%d, sync node use snapshot", pSyncNode->vgId); pSyncNode->FpOnRequestVote = syncNodeOnRequestVoteSnapshotCb; pSyncNode->FpOnRequestVoteReply = syncNodeOnRequestVoteReplySnapshotCb; pSyncNode->FpOnAppendEntries = syncNodeOnAppendEntriesSnapshotCb; pSyncNode->FpOnAppendEntriesReply = syncNodeOnAppendEntriesReplySnapshotCb; } else { - sInfo("sync node do not use snapshot"); + sInfo("vgId:%d, sync node do not use snapshot", pSyncNode->vgId); pSyncNode->FpOnRequestVote = syncNodeOnRequestVoteCb; pSyncNode->FpOnRequestVoteReply = syncNodeOnRequestVoteReplyCb; pSyncNode->FpOnAppendEntries = syncNodeOnAppendEntriesCb; @@ -1311,8 +1311,10 @@ int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode, SRp pMsg->info.noResp = 1; pSyncNode->FpSendMsg(&epSet, pMsg); } else { - sTrace("syncNodeSendMsgById pSyncNode->FpSendMsg is NULL"); + sError("vgId:%d, sync send msg by id error, fp-send-msg is null", pSyncNode->vgId); + return -1; } + return 0; } @@ -1326,7 +1328,7 @@ int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, S pMsg->info.noResp = 1; pSyncNode->FpSendMsg(&epSet, pMsg); } else { - sTrace("syncNodeSendMsgByInfo pSyncNode->FpSendMsg is NULL"); + sError("vgId:%d, sync send msg by info error, fp-send-msg is null", pSyncNode->vgId); } return 0; } @@ -1526,12 +1528,14 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) { if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) { snprintf(logBuf, sizeof(logBuf), "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, " + "strategy:%d, batch:%d, " "replica-num:%d, " "lconfig:%ld, changing:%d, restore:%d, %s", pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm, pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex, - pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, - pSyncNode->changing, pSyncNode->restoreFinish, printStr); + pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy, pSyncNode->pRaftCfg->batchSize, + pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, pSyncNode->changing, + pSyncNode->restoreFinish, printStr); } else { snprintf(logBuf, sizeof(logBuf), "%s", str); } @@ -1543,12 +1547,14 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) { if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) { snprintf(s, len, "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, " + "strategy:%d, batch:%d, " "replica-num:%d, " "lconfig:%ld, changing:%d, restore:%d, %s", pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm, pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex, - pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, - pSyncNode->changing, pSyncNode->restoreFinish, printStr); + pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy, pSyncNode->pRaftCfg->batchSize, + pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, pSyncNode->changing, + pSyncNode->restoreFinish, printStr); } else { snprintf(s, len, "%s", str); } diff --git a/source/libs/sync/src/syncMessage.c b/source/libs/sync/src/syncMessage.c index e53b9d5e367735baae6800a848929fdced87965c..697c25f3040d8cb09baefb5c45ef2691d6408973 100644 --- a/source/libs/sync/src/syncMessage.c +++ b/source/libs/sync/src/syncMessage.c @@ -1605,7 +1605,7 @@ void syncAppendEntriesLog2(char* s, const SyncAppendEntries* pMsg) { SyncAppendEntriesBatch* syncAppendEntriesBatchBuild(SSyncRaftEntry** entryPArr, int32_t arrSize, int32_t vgId) { ASSERT(entryPArr != NULL); - ASSERT(arrSize > 0); + ASSERT(arrSize >= 0); int32_t dataLen = 0; int32_t metaArrayLen = sizeof(SOffsetAndContLen) * arrSize; // diff --git a/source/libs/sync/src/syncOnMessage.c b/source/libs/sync/src/syncOnMessage.c deleted file mode 100644 index ce8bed9cd39c44df9b090ae931cba063d1dda53c..0000000000000000000000000000000000000000 --- a/source/libs/sync/src/syncOnMessage.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 "syncOnMessage.h" - -// TLA+ Spec -// Receive(m) == -// LET i == m.mdest -// j == m.msource -// IN \* Any RPC with a newer term causes the recipient to advance -// \* its term first. Responses with stale terms are ignored. -// \/ UpdateTerm(i, j, m) -// \/ /\ m.mtype = RequestVoteRequest -// /\ HandleRequestVoteRequest(i, j, m) -// \/ /\ m.mtype = RequestVoteResponse -// /\ \/ DropStaleResponse(i, j, m) -// \/ HandleRequestVoteResponse(i, j, m) -// \/ /\ m.mtype = AppendEntriesRequest -// /\ HandleAppendEntriesRequest(i, j, m) -// \/ /\ m.mtype = AppendEntriesResponse -// /\ \/ DropStaleResponse(i, j, m) -// \/ HandleAppendEntriesResponse(i, j, m) - -// DuplicateMessage(m) == -// /\ Send(m) -// /\ UNCHANGED <> - -// DropMessage(m) == -// /\ Discard(m) -// /\ UNCHANGED <> - -// Next == /\ \/ \E i \in Server : Restart(i) -// \/ \E i \in Server : Timeout(i) -// \/ \E i,j \in Server : RequestVote(i, j) -// \/ \E i \in Server : BecomeLeader(i) -// \/ \E i \in Server, v \in Value : ClientRequest(i, v) -// \/ \E i \in Server : AdvanceCommitIndex(i) -// \/ \E i,j \in Server : AppendEntries(i, j) -// \/ \E m \in DOMAIN messages : Receive(m) -// \/ \E m \in DOMAIN messages : DuplicateMessage(m) -// \/ \E m \in DOMAIN messages : DropMessage(m) -// \* History variable that tracks every log ever: -// /\ allLogs' = allLogs \cup {log[i] : i \in Server} -// \ No newline at end of file diff --git a/source/libs/sync/src/syncRaftCfg.c b/source/libs/sync/src/syncRaftCfg.c index ead1168632a154be285c07c4a7183a2a202451dd..6c381f6e7d9ad61a35bcffe4a9e7bf8141c90c06 100644 --- a/source/libs/sync/src/syncRaftCfg.c +++ b/source/libs/sync/src/syncRaftCfg.c @@ -101,7 +101,7 @@ cJSON *syncCfg2Json(SSyncCfg *pSyncCfg) { char *syncCfg2Str(SSyncCfg *pSyncCfg) { cJSON *pJson = syncCfg2Json(pSyncCfg); - char * serialized = cJSON_Print(pJson); + char *serialized = cJSON_Print(pJson); cJSON_Delete(pJson); return serialized; } @@ -109,7 +109,7 @@ char *syncCfg2Str(SSyncCfg *pSyncCfg) { char *syncCfg2SimpleStr(SSyncCfg *pSyncCfg) { if (pSyncCfg != NULL) { int32_t len = 512; - char * s = taosMemoryMalloc(len); + char *s = taosMemoryMalloc(len); memset(s, 0, len); snprintf(s, len, "{replica-num:%d, my-index:%d, ", pSyncCfg->replicaNum, pSyncCfg->myIndex); @@ -206,7 +206,7 @@ cJSON *raftCfg2Json(SRaftCfg *pRaftCfg) { char *raftCfg2Str(SRaftCfg *pRaftCfg) { cJSON *pJson = raftCfg2Json(pRaftCfg); - char * serialized = cJSON_Print(pJson); + char *serialized = cJSON_Print(pJson); cJSON_Delete(pJson); return serialized; } @@ -285,7 +285,7 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) { (pRaftCfg->configIndexArr)[i] = atoll(pIndex->valuestring); } - cJSON * pJsonSyncCfg = cJSON_GetObjectItem(pJson, "SSyncCfg"); + cJSON *pJsonSyncCfg = cJSON_GetObjectItem(pJson, "SSyncCfg"); int32_t code = syncCfgFromJson(pJsonSyncCfg, &(pRaftCfg->cfg)); ASSERT(code == 0); diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c index 83495e74866df4650b48e6cd116c40c03cae6366..3a44933eeab29c6ef50cd02b7875b6f54271f0a8 100644 --- a/source/libs/sync/src/syncRaftLog.c +++ b/source/libs/sync/src/syncRaftLog.c @@ -62,7 +62,7 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) { ASSERT(pData->pWal != NULL); taosThreadMutexInit(&(pData->mutex), NULL); - pData->pWalHandle = walOpenReadHandle(pData->pWal); + pData->pWalHandle = walOpenReader(pData->pWal, NULL); ASSERT(pData->pWalHandle != NULL); pLogStore->appendEntry = logStoreAppendEntry; @@ -95,7 +95,7 @@ void logStoreDestory(SSyncLogStore* pLogStore) { taosThreadMutexLock(&(pData->mutex)); if (pData->pWalHandle != NULL) { - walCloseReadHandle(pData->pWalHandle); + walCloseReader(pData->pWalHandle); pData->pWalHandle = NULL; } taosThreadMutexUnlock(&(pData->mutex)); @@ -255,7 +255,7 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, *ppEntry = NULL; // SWalReadHandle* pWalHandle = walOpenReadHandle(pWal); - SWalReadHandle* pWalHandle = pData->pWalHandle; + SWalReader* pWalHandle = pData->pWalHandle; if (pWalHandle == NULL) { terrno = TSDB_CODE_SYN_INTERNAL_ERROR; return -1; @@ -263,7 +263,7 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, taosThreadMutexLock(&(pData->mutex)); - code = walReadWithHandle(pWalHandle, index); + code = walReadVer(pWalHandle, index); if (code != 0) { int32_t err = terrno; const char* errStr = tstrerror(err); @@ -326,6 +326,14 @@ static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIn ASSERT(0); } + + // event log + do { + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "wal truncate, from-index:%ld", fromIndex); + syncNodeEventLog(pData->pSyncNode, logBuf); + } while (0); + return code; } @@ -398,10 +406,10 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) { taosThreadMutexLock(&(pData->mutex)); // SWalReadHandle* pWalHandle = walOpenReadHandle(pWal); - SWalReadHandle* pWalHandle = pData->pWalHandle; + SWalReader* pWalHandle = pData->pWalHandle; ASSERT(pWalHandle != NULL); - int32_t code = walReadWithHandle(pWalHandle, index); + int32_t code = walReadVer(pWalHandle, index); if (code != 0) { int32_t err = terrno; const char* errStr = tstrerror(err); @@ -463,6 +471,14 @@ int32_t logStoreTruncate(SSyncLogStore* pLogStore, SyncIndex fromIndex) { ASSERT(0); } + + // event log + do { + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "wal truncate, from-index:%ld", fromIndex); + syncNodeEventLog(pData->pSyncNode, logBuf); + } while (0); + return 0; } diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index da31e9c4c46f3fac3625844b8af69e2a78e49cdd..f1c093fe378f874eaf2c393a7620c8861c8731ac 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -148,7 +148,7 @@ int32_t syncNodeAppendEntriesPeersSnapshot2(SSyncNode* pSyncNode) { // get entry batch int32_t getCount = 0; SyncIndex getEntryIndex = nextIndex; - for (int32_t i = 0; i < pSyncNode->batchSize; ++i) { + for (int32_t i = 0; i < pSyncNode->pRaftCfg->batchSize; ++i) { SSyncRaftEntry* pEntry = NULL; int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, getEntryIndex, &pEntry); if (code == 0) { @@ -162,12 +162,22 @@ int32_t syncNodeAppendEntriesPeersSnapshot2(SSyncNode* pSyncNode) { } } + // event log + do { + char logBuf[128]; + char host[64]; + uint16_t port; + syncUtilU642Addr(pDestId->addr, host, sizeof(host), &port); + snprintf(logBuf, sizeof(logBuf), "build batch:%d for %s:%d", getCount, host, port); + syncNodeEventLog(pSyncNode, logBuf); + } while (0); + // build msg SyncAppendEntriesBatch* pMsg = syncAppendEntriesBatchBuild(entryPArr, getCount, pSyncNode->vgId); ASSERT(pMsg != NULL); // free entries - for (int32_t i = 0; i < pSyncNode->batchSize; ++i) { + for (int32_t i = 0; i < pSyncNode->pRaftCfg->batchSize; ++i) { SSyncRaftEntry* pEntry = entryPArr[i]; if (pEntry != NULL) { syncEntryDestory(pEntry); diff --git a/source/libs/sync/test/CMakeLists.txt b/source/libs/sync/test/CMakeLists.txt index 37d9707cfd85c395786d68730b149e50e325fe40..e1f3a2b2fc18d1d0481576ccbb3363cf95c5358a 100644 --- a/source/libs/sync/test/CMakeLists.txt +++ b/source/libs/sync/test/CMakeLists.txt @@ -54,6 +54,7 @@ add_executable(syncRaftLogTest2 "") add_executable(syncRaftLogTest3 "") add_executable(syncLeaderTransferTest "") add_executable(syncReconfigFinishTest "") +add_executable(syncRestoreFromSnapshot "") target_sources(syncTest @@ -280,6 +281,10 @@ target_sources(syncReconfigFinishTest PRIVATE "syncReconfigFinishTest.cpp" ) +target_sources(syncRestoreFromSnapshot + PRIVATE + "syncRestoreFromSnapshot.cpp" +) target_include_directories(syncTest @@ -562,6 +567,11 @@ target_include_directories(syncReconfigFinishTest "${TD_SOURCE_DIR}/include/libs/sync" "${CMAKE_CURRENT_SOURCE_DIR}/../inc" ) +target_include_directories(syncRestoreFromSnapshot + PUBLIC + "${TD_SOURCE_DIR}/include/libs/sync" + "${CMAKE_CURRENT_SOURCE_DIR}/../inc" +) target_link_libraries(syncTest @@ -788,6 +798,10 @@ target_link_libraries(syncReconfigFinishTest sync gtest_main ) +target_link_libraries(syncRestoreFromSnapshot + sync + gtest_main +) enable_testing() diff --git a/source/libs/sync/test/syncLogStoreTest.cpp b/source/libs/sync/test/syncLogStoreTest.cpp index 27e1009335a82e42e0d8e8e1b00f8cfe709e9534..9cb8194aa732101cae417bf6402513aec86791ab 100644 --- a/source/libs/sync/test/syncLogStoreTest.cpp +++ b/source/libs/sync/test/syncLogStoreTest.cpp @@ -85,6 +85,7 @@ void logStoreTest() { } int main(int argc, char** argv) { + gRaftDetailLog = true; tsAsyncLog = 0; sDebugFlag = DEBUG_TRACE + DEBUG_SCREEN + DEBUG_FILE; diff --git a/source/libs/sync/test/syncRestoreFromSnapshot.cpp b/source/libs/sync/test/syncRestoreFromSnapshot.cpp new file mode 100644 index 0000000000000000000000000000000000000000..470dd678b09bfd5ff03d9eff3bbe76c1524c06ab --- /dev/null +++ b/source/libs/sync/test/syncRestoreFromSnapshot.cpp @@ -0,0 +1,78 @@ +#include +#include +#include "syncEnv.h" +#include "syncIO.h" +#include "syncInt.h" +#include "syncRaftLog.h" +#include "syncRaftStore.h" +#include "syncUtil.h" +#include "wal.h" + +void logTest() { + sTrace("--- sync log test: trace"); + sDebug("--- sync log test: debug"); + sInfo("--- sync log test: info"); + sWarn("--- sync log test: warn"); + sError("--- sync log test: error"); + sFatal("--- sync log test: fatal"); +} + +void init() { + int code = walInit(); + assert(code == 0); +} + +void cleanup() { walCleanUp(); } + +SWal* createWal(char* path, int32_t vgId) { + SWalCfg walCfg; + memset(&walCfg, 0, sizeof(SWalCfg)); + walCfg.vgId = vgId; + walCfg.fsyncPeriod = 1000; + walCfg.retentionPeriod = 1000; + walCfg.rollPeriod = 1000; + walCfg.retentionSize = 1000; + walCfg.segSize = 1000; + walCfg.level = TAOS_WAL_FSYNC; + SWal* pWal = walOpen(path, &walCfg); + assert(pWal != NULL); + return pWal; +} + +SSyncNode* createSyncNode(SWal* pWal) { + SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode)); + memset(pSyncNode, 0, sizeof(SSyncNode)); + pSyncNode->pWal = pWal; + return pSyncNode; +} + +void usage(char* exe) { printf("usage: %s path vgId snapshotIndex \n", exe); } + +int main(int argc, char** argv) { + if (argc != 4) { + usage(argv[0]); + exit(-1); + } + char* path = argv[1]; + int32_t vgId = atoi(argv[2]); + int64_t snapshotIndex = atoll(argv[3]); + + init(); + SWal* pWal = createWal(path, vgId); + assert(pWal != NULL); + SSyncNode* pSyncNode = createSyncNode(pWal); + assert(pSyncNode != NULL); + + SSyncLogStore* pLog = logStoreCreate(pSyncNode); + assert(pLog != NULL); + + int32_t code = pLog->syncLogRestoreFromSnapshot(pLog, snapshotIndex); + assert(code == 0); + + walClose(pWal); + logStoreDestory(pLog); + taosMemoryFree(pSyncNode); + + cleanup(); + return 0; +} diff --git a/source/common/src/tmsgcb.c b/source/libs/transport/src/tmsgcb.c similarity index 77% rename from source/common/src/tmsgcb.c rename to source/libs/transport/src/tmsgcb.c index b8eec655b125eadf3a8e4f199168ef4bf96109a0..aefc25fab45dd5e49ad7667176d9e4aabd867298 100644 --- a/source/common/src/tmsgcb.c +++ b/source/libs/transport/src/tmsgcb.c @@ -16,20 +16,33 @@ #define _DEFAULT_SOURCE #include "tmsgcb.h" #include "taoserror.h" +#include "trpc.h" static SMsgCb defaultMsgCb; void tmsgSetDefault(const SMsgCb* msgcb) { defaultMsgCb = *msgcb; } int32_t tmsgPutToQueue(const SMsgCb* msgcb, EQueueType qtype, SRpcMsg* pMsg) { - return (*msgcb->putToQueueFp)(msgcb->mgmt, qtype, pMsg); + int32_t code = (*msgcb->putToQueueFp)(msgcb->mgmt, qtype, pMsg); + if (code != 0) { + rpcFreeCont(pMsg->pCont); + pMsg->pCont = NULL; + } + return code; } int32_t tmsgGetQueueSize(const SMsgCb* msgcb, int32_t vgId, EQueueType qtype) { return (*msgcb->qsizeFp)(msgcb->mgmt, vgId, qtype); } -int32_t tmsgSendReq(const SEpSet* epSet, SRpcMsg* pMsg) { return (*defaultMsgCb.sendReqFp)(epSet, pMsg); } +int32_t tmsgSendReq(const SEpSet* epSet, SRpcMsg* pMsg) { + int32_t code = (*defaultMsgCb.sendReqFp)(epSet, pMsg); + if (code != 0) { + rpcFreeCont(pMsg->pCont); + pMsg->pCont = NULL; + } + return code; +} void tmsgSendRsp(SRpcMsg* pMsg) { return (*defaultMsgCb.sendRspFp)(pMsg); } diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 8b771f6f8affe92b8049fe92f0dab64cd26ad2a0..4b6ff43ba807ee620374c54a8f8b83bda49ee656 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -573,8 +573,8 @@ static void cliRecvCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { return; } if (nread < 0) { - tError("%s conn %p read error: %s, ref: %d", CONN_GET_INST_LABEL(conn), conn, uv_err_name(nread), - T_REF_VAL_GET(conn)); + tWarn("%s conn %p read error: %s, ref: %d", CONN_GET_INST_LABEL(conn), conn, uv_err_name(nread), + T_REF_VAL_GET(conn)); conn->broken = true; cliHandleExcept(conn); } diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index 3f4a5628f9f8afb52e25db7286e0891ee1fa962e..9e4abf09cf867931d149d6a2222c5d08f0c75813 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -305,7 +305,7 @@ void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) { return; } - tError("%s conn %p read error: %s", transLabel(pTransInst), conn, uv_err_name(nread)); + tWarn("%s conn %p read error: %s", transLabel(pTransInst), conn, uv_err_name(nread)); if (nread < 0) { conn->broken = true; if (conn->status == ConnAcquire) { @@ -390,8 +390,9 @@ static void uvPrepareSendData(SSvrMsg* smsg, uv_buf_t* wb) { pHead->traceId = pMsg->info.traceId; pHead->hasEpSet = pMsg->info.hasEpSet; + if (pConn->status == ConnNormal) { - pHead->msgType = pConn->inType + 1; + pHead->msgType = (0 == pMsg->msgType ? pConn->inType + 1 : pMsg->msgType); } else { if (smsg->type == Release) { pHead->msgType = 0; @@ -400,11 +401,8 @@ static void uvPrepareSendData(SSvrMsg* smsg, uv_buf_t* wb) { destroyConnRegArg(pConn); transUnrefSrvHandle(pConn); } else { - pHead->msgType = pMsg->msgType; // set up resp msg type - if (pHead->msgType == 0 && transMsgLenFromCont(pMsg->contLen) == sizeof(STransMsgHead)) { - pHead->msgType = pConn->inType + 1; - } + pHead->msgType = (0 == pMsg->msgType ? pConn->inType + 1 : pMsg->msgType); } } diff --git a/source/libs/transport/test/CMakeLists.txt b/source/libs/transport/test/CMakeLists.txt index 98a252e008d85b27206fa58055f757dd02d64a78..5645f49284027c17a2b2abc1f085a3140d57bbe4 100644 --- a/source/libs/transport/test/CMakeLists.txt +++ b/source/libs/transport/test/CMakeLists.txt @@ -1,30 +1,16 @@ add_executable(transportTest "") -add_executable(client "") -add_executable(server "") add_executable(transUT "") -add_executable(syncClient "") add_executable(pushServer "") target_sources(transUT PRIVATE "transUT.cpp" -) +) + target_sources(transportTest PRIVATE "transportTests.cpp" -) -target_sources (client - PRIVATE - "rclient.c" -) -target_sources (server - PRIVATE - "rserver.c" -) -target_sources (syncClient - PRIVATE - "syncClient.c" -) +) target_sources(pushServer PRIVATE @@ -35,7 +21,7 @@ target_include_directories(transportTest PUBLIC "${TD_SOURCE_DIR}/include/libs/transport" "${CMAKE_CURRENT_SOURCE_DIR}/../inc" -) +) target_link_libraries (transportTest os @@ -44,64 +30,27 @@ target_link_libraries (transportTest gtest_main transport ) -target_link_libraries (transUT - os - util - common - gtest_main - transport -) - -target_include_directories(client - PUBLIC - "${TD_SOURCE_DIR}/include/libs/transport" - "${CMAKE_CURRENT_SOURCE_DIR}/../inc" -) -target_link_libraries (client +target_link_libraries (transUT os util common gtest_main transport ) -target_include_directories(server - PUBLIC - "${TD_SOURCE_DIR}/include/libs/transport" - "${CMAKE_CURRENT_SOURCE_DIR}/../inc" -) target_include_directories(transUT PUBLIC "${TD_SOURCE_DIR}/include/libs/transport" "${CMAKE_CURRENT_SOURCE_DIR}/../inc" -) - -target_link_libraries (server - os - util - common - gtest_main - transport -) -target_include_directories(syncClient - PUBLIC - "${TD_SOURCE_DIR}/include/libs/transport" - "${CMAKE_CURRENT_SOURCE_DIR}/../inc" -) -target_link_libraries (syncClient - os - util - common - gtest_main - transport ) target_include_directories(pushServer PUBLIC "${TD_SOURCE_DIR}/include/libs/transport" "${CMAKE_CURRENT_SOURCE_DIR}/../inc" -) +) + target_link_libraries (pushServer os util @@ -110,7 +59,6 @@ target_link_libraries (pushServer transport ) - add_test( NAME transUT COMMAND transUT diff --git a/source/libs/transport/test/rclient.c b/source/libs/transport/test/rclient.c deleted file mode 100644 index 55e6dd000a1270889894fe28f0a024164e5255eb..0000000000000000000000000000000000000000 --- a/source/libs/transport/test/rclient.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * 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 -#include "os.h" -#include "taoserror.h" -#include "tglobal.h" -#include "transLog.h" -#include "trpc.h" -#include "tutil.h" - -typedef struct { - int index; - SEpSet epSet; - int num; - int numOfReqs; - int msgSize; - tsem_t rspSem; - tsem_t * pOverSem; - TdThread thread; - void * pRpc; -} SInfo; -static void processResponse(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet) { - SInfo *pInfo = (SInfo *)pMsg->info.ahandle; - // tError("thread:%d, response is received, type:%d contLen:%d code:0x%x", pInfo->index, pMsg->msgType, pMsg->contLen, - // pMsg->code); - - if (pEpSet) pInfo->epSet = *pEpSet; - - rpcFreeCont(pMsg->pCont); - // tsem_post(&pInfo->rspSem); - tsem_post(&pInfo->rspSem); -} - -static int tcount = 0; - -static void *sendRequest(void *param) { - SInfo * pInfo = (SInfo *)param; - SRpcMsg rpcMsg = {0}; - - tError("thread:%d, start to send request", pInfo->index); - - tError("thread:%d, reqs: %d", pInfo->index, pInfo->numOfReqs); - int u100 = 0; - int u500 = 0; - int u1000 = 0; - int u10000 = 0; - - while (pInfo->numOfReqs == 0 || pInfo->num < pInfo->numOfReqs) { - pInfo->num++; - rpcMsg.pCont = rpcMallocCont(pInfo->msgSize); - rpcMsg.contLen = pInfo->msgSize; - rpcMsg.info.ahandle = pInfo; - rpcMsg.msgType = 1; - // tDebug("thread:%d, send request, contLen:%d num:%d", pInfo->index, pInfo->msgSize, pInfo->num); - int64_t start = taosGetTimestampUs(); - rpcSendRequest(pInfo->pRpc, &pInfo->epSet, &rpcMsg, NULL); - if (pInfo->num % 20000 == 0) tError("thread:%d, %d requests have been sent", pInfo->index, pInfo->num); - // tsem_wait(&pInfo->rspSem); - tsem_wait(&pInfo->rspSem); - int64_t end = taosGetTimestampUs() - start; - if (end <= 100) { - u100++; - } else if (end > 100 && end <= 500) { - u500++; - } else if (end > 500 && end < 1000) { - u1000++; - } else { - u10000++; - } - - tDebug("recv response succefully"); - - // taosSsleep(100); - } - - tError("send and recv sum: %d, %d, %d, %d", u100, u500, u1000, u10000); - tError("thread:%d, it is over", pInfo->index); - tcount++; - - return NULL; -} - -int main(int argc, char *argv[]) { - SRpcInit rpcInit; - SEpSet epSet = {0}; - int msgSize = 128; - int numOfReqs = 0; - int appThreads = 1; - char serverIp[40] = "127.0.0.1"; - char secret[20] = "mypassword"; - struct timeval systemTime; - int64_t startTime, endTime; - TdThreadAttr thattr; - - // server info - epSet.inUse = 0; - addEpIntoEpSet(&epSet, serverIp, 7000); - addEpIntoEpSet(&epSet, "192.168.0.1", 7000); - - // client info - memset(&rpcInit, 0, sizeof(rpcInit)); - rpcInit.localPort = 0; - rpcInit.label = "APP"; - rpcInit.numOfThreads = 1; - rpcInit.cfp = processResponse; - rpcInit.sessions = 100; - rpcInit.idleTime = 100; - rpcInit.user = "michael"; - rpcInit.connType = TAOS_CONN_CLIENT; - rpcDebugFlag = 131; - - for (int i = 1; i < argc; ++i) { - if (strcmp(argv[i], "-p") == 0 && i < argc - 1) { - epSet.eps[0].port = atoi(argv[++i]); - } else if (strcmp(argv[i], "-i") == 0 && i < argc - 1) { - tstrncpy(epSet.eps[0].fqdn, argv[++i], sizeof(epSet.eps[0].fqdn)); - } else if (strcmp(argv[i], "-t") == 0 && i < argc - 1) { - rpcInit.numOfThreads = atoi(argv[++i]); - } else if (strcmp(argv[i], "-m") == 0 && i < argc - 1) { - msgSize = atoi(argv[++i]); - } else if (strcmp(argv[i], "-s") == 0 && i < argc - 1) { - rpcInit.sessions = atoi(argv[++i]); - } else if (strcmp(argv[i], "-n") == 0 && i < argc - 1) { - numOfReqs = atoi(argv[++i]); - } else if (strcmp(argv[i], "-a") == 0 && i < argc - 1) { - appThreads = atoi(argv[++i]); - } else if (strcmp(argv[i], "-o") == 0 && i < argc - 1) { - tsCompressMsgSize = atoi(argv[++i]); - } else if (strcmp(argv[i], "-u") == 0 && i < argc - 1) { - rpcInit.user = argv[++i]; - } else if (strcmp(argv[i], "-k") == 0 && i < argc - 1) { - } else if (strcmp(argv[i], "-spi") == 0 && i < argc - 1) { - } else if (strcmp(argv[i], "-d") == 0 && i < argc - 1) { - rpcDebugFlag = atoi(argv[++i]); - } else { - printf("\nusage: %s [options] \n", argv[0]); - printf(" [-i ip]: first server IP address, default is:%s\n", serverIp); - printf(" [-p port]: server port number, default is:%d\n", epSet.eps[0].port); - printf(" [-t threads]: number of rpc threads, default is:%d\n", rpcInit.numOfThreads); - printf(" [-s sessions]: number of rpc sessions, default is:%d\n", rpcInit.sessions); - printf(" [-m msgSize]: message body size, default is:%d\n", msgSize); - printf(" [-a threads]: number of app threads, default is:%d\n", appThreads); - printf(" [-n requests]: number of requests per thread, default is:%d\n", numOfReqs); - printf(" [-o compSize]: compression message size, default is:%d\n", tsCompressMsgSize); - printf(" [-u user]: user name for the connection, default is:%s\n", rpcInit.user); - printf(" [-d debugFlag]: debug flag, default:%d\n", rpcDebugFlag); - printf(" [-h help]: print out this help\n\n"); - exit(0); - } - } - - const char *path = TD_TMP_DIR_PATH "transport/client"; - taosRemoveDir(path); - taosMkDir(path); - tstrncpy(tsLogDir, path, PATH_MAX); - taosInitLog("client.log", 10); - - void *pRpc = rpcOpen(&rpcInit); - if (pRpc == NULL) { - tError("failed to initialize RPC"); - return -1; - } - - tError("client is initialized"); - tError("threads:%d msgSize:%d requests:%d", appThreads, msgSize, numOfReqs); - - taosGetTimeOfDay(&systemTime); - startTime = systemTime.tv_sec * 1000000 + systemTime.tv_usec; - - SInfo *pInfo = (SInfo *)taosMemoryCalloc(1, sizeof(SInfo) * appThreads); - - taosThreadAttrInit(&thattr); - taosThreadAttrSetDetachState(&thattr, PTHREAD_CREATE_JOINABLE); - - for (int i = 0; i < appThreads; ++i) { - pInfo->index = i; - pInfo->epSet = epSet; - pInfo->numOfReqs = numOfReqs; - pInfo->msgSize = msgSize; - tsem_init(&pInfo->rspSem, 0, 0); - pInfo->pRpc = pRpc; - taosThreadCreate(&pInfo->thread, &thattr, sendRequest, pInfo); - pInfo++; - } - - do { - taosUsleep(1); - } while (tcount < appThreads); - - taosGetTimeOfDay(&systemTime); - endTime = systemTime.tv_sec * 1000000 + systemTime.tv_usec; - float usedTime = (endTime - startTime) / 1000.0f; // mseconds - - tError("it takes %.3f mseconds to send %d requests to server", usedTime, numOfReqs * appThreads); - tError("Performance: %.3f requests per second, msgSize:%d bytes", 1000.0 * numOfReqs * appThreads / usedTime, - msgSize); - - int ch = getchar(); - UNUSED(ch); - - taosCloseLog(); - - return 0; -} diff --git a/source/libs/transport/test/rsclient.c b/source/libs/transport/test/rsclient.c deleted file mode 100644 index e7fc7b45e1ed74b3a8d82983ba381757cadfc831..0000000000000000000000000000000000000000 --- a/source/libs/transport/test/rsclient.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * 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 "os.h" -#include "tutil.h" -#include "tglobal.h" -#include "rpcLog.h" -#include "trpc.h" -#include "taoserror.h" - -typedef struct { - int index; - SRpcEpSet epSet; - int num; - int numOfReqs; - int msgSize; - tsem_t rspSem; - tsem_t *pOverSem; - TdThread thread; - void *pRpc; -} SInfo; - - -static int tcount = 0; -static int terror = 0; - -static void *sendRequest(void *param) { - SInfo *pInfo = (SInfo *)param; - SRpcMsg rpcMsg, rspMsg; - - tDebug("thread:%d, start to send request", pInfo->index); - - while ( pInfo->numOfReqs == 0 || pInfo->num < pInfo->numOfReqs) { - pInfo->num++; - rpcMsg.pCont = rpcMallocCont(pInfo->msgSize); - rpcMsg.contLen = pInfo->msgSize; - rpcMsg.handle = pInfo; - rpcMsg.msgType = 1; - tDebug("thread:%d, send request, contLen:%d num:%d", pInfo->index, pInfo->msgSize, pInfo->num); - - rpcSendRecv(pInfo->pRpc, &pInfo->epSet, &rpcMsg, &rspMsg); - - // handle response - if (rspMsg.code != 0) terror++; - - tDebug("thread:%d, rspLen:%d code:%d", pInfo->index, rspMsg.contLen, rspMsg.code); - - rpcFreeCont(rspMsg.pCont); - - if ( pInfo->num % 20000 == 0 ) - tInfo("thread:%d, %d requests have been sent", pInfo->index, pInfo->num); - } - - tDebug("thread:%d, it is over", pInfo->index); - tcount++; - - return NULL; -} - -int main(int argc, char *argv[]) { - SRpcInit rpcInit; - SRpcEpSet epSet; - int msgSize = 128; - int numOfReqs = 0; - int appThreads = 1; - char serverIp[40] = "127.0.0.1"; - char secret[TSDB_KEY_LEN] = "mypassword"; - struct timeval systemTime; - int64_t startTime, endTime; - TdThreadAttr thattr; - - // server info - epSet.numOfEps = 1; - epSet.inUse = 0; - epSet.port[0] = 7000; - epSet.port[1] = 7000; - strcpy(epSet.fqdn[0], serverIp); - strcpy(epSet.fqdn[1], "192.168.0.1"); - - // client info - memset(&rpcInit, 0, sizeof(rpcInit)); - //rpcInit.localIp = "0.0.0.0"; - rpcInit.localPort = 0; - rpcInit.label = "APP"; - rpcInit.numOfThreads = 1; - rpcInit.sessions = 100; - rpcInit.idleTime = 3000; //tsShellActivityTimer*1000; - rpcInit.user = "michael"; - rpcInit.secret = secret; - rpcInit.ckey = "key"; - rpcInit.spi = 1; - rpcInit.connType = TAOS_CONN_CLIENT; - - for (int i=1; iindex = i; - pInfo->epSet = epSet; - pInfo->numOfReqs = numOfReqs; - pInfo->msgSize = msgSize; - tsem_init(&pInfo->rspSem, 0, 0); - pInfo->pRpc = pRpc; - taosThreadCreate(&pInfo->thread, &thattr, sendRequest, pInfo); - pInfo++; - } - - do { - taosUsleep(1); - } while ( tcount < appThreads); - - taosGetTimeOfDay(&systemTime); - endTime = systemTime.tv_sec*1000000 + systemTime.tv_usec; - float usedTime = (endTime - startTime)/1000.0; // mseconds - - tInfo("it takes %.3f mseconds to send %d requests to server, error num:%d", usedTime, numOfReqs*appThreads, terror); - tInfo("Performance: %.3f requests per second, msgSize:%d bytes", 1000.0*numOfReqs*appThreads/usedTime, msgSize); - - taosCloseLog(); - - return 0; -} - - diff --git a/source/libs/transport/test/rserver.c b/source/libs/transport/test/rserver.c deleted file mode 100644 index 1fd78be77de7575d47e3d2ce70bf6e0908dfec8e..0000000000000000000000000000000000000000 --- a/source/libs/transport/test/rserver.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * 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 . - */ - -//#define _DEFAULT_SOURCE -#include "os.h" -#include "tglobal.h" -#include "tqueue.h" -#include "transLog.h" -#include "trpc.h" - -int msgSize = 128; -int commit = 0; -TdFilePtr pDataFile = NULL; -STaosQueue *qhandle = NULL; -STaosQset * qset = NULL; - -void processShellMsg() { - static int num = 0; - STaosQall *qall; - SRpcMsg * pRpcMsg, rpcMsg; - int type; - void * pvnode; - - qall = taosAllocateQall(); - - while (1) { - int numOfMsgs = taosReadAllQitemsFromQset(qset, qall, &pvnode, NULL); - tDebug("%d shell msgs are received", numOfMsgs); - if (numOfMsgs <= 0) break; - - for (int i = 0; i < numOfMsgs; ++i) { - taosGetQitem(qall, (void **)&pRpcMsg); - - if (pDataFile != NULL) { - if (taosWriteFile(pDataFile, pRpcMsg->pCont, pRpcMsg->contLen) < 0) { - tInfo("failed to write data file, reason:%s", strerror(errno)); - } - } - } - - if (commit >= 2) { - num += numOfMsgs; - // if (taosFsync(pDataFile) < 0) { - // tInfo("failed to flush data to file, reason:%s", strerror(errno)); - //} - - if (num % 10000 == 0) { - tInfo("%d request have been written into disk", num); - } - } - - taosResetQitems(qall); - for (int i = 0; i < numOfMsgs; ++i) { - taosGetQitem(qall, (void **)&pRpcMsg); - rpcFreeCont(pRpcMsg->pCont); - - memset(&rpcMsg, 0, sizeof(rpcMsg)); - rpcMsg.pCont = rpcMallocCont(msgSize); - rpcMsg.contLen = msgSize; - rpcMsg.info = pRpcMsg->info; - rpcMsg.code = 0; - rpcSendResponse(&rpcMsg); - - taosFreeQitem(pRpcMsg); - } - } - - taosFreeQall(qall); -} - -int retrieveAuthInfo(void *parent, char *meterId, char *spi, char *encrypt, char *secret, char *ckey) { - // app shall retrieve the auth info based on meterID from DB or a data file - // demo code here only for simple demo - int ret = 0; - - if (strcmp(meterId, "michael") == 0) { - *spi = 1; - *encrypt = 0; - strcpy(secret, "mypassword"); - strcpy(ckey, "key"); - } else if (strcmp(meterId, "jeff") == 0) { - *spi = 0; - *encrypt = 0; - } else { - ret = -1; // user not there - } - - return ret; -} - -void processRequestMsg(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet) { - SRpcMsg *pTemp; - - pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM); - memcpy(pTemp, pMsg, sizeof(SRpcMsg)); - - tDebug("request is received, type:%d, contLen:%d, item:%p", pMsg->msgType, pMsg->contLen, pTemp); - taosWriteQitem(qhandle, pTemp); -} - -int main(int argc, char *argv[]) { - SRpcInit rpcInit; - char dataName[20] = "server.data"; - - taosBlockSIGPIPE(); - - memset(&rpcInit, 0, sizeof(rpcInit)); - rpcInit.localPort = 7000; - rpcInit.label = "SER"; - rpcInit.numOfThreads = 1; - rpcInit.cfp = processRequestMsg; - rpcInit.sessions = 1000; - rpcInit.idleTime = 2 * 1500; - - rpcDebugFlag = 131; - - for (int i = 1; i < argc; ++i) { - if (strcmp(argv[i], "-p") == 0 && i < argc - 1) { - rpcInit.localPort = atoi(argv[++i]); - } else if (strcmp(argv[i], "-t") == 0 && i < argc - 1) { - rpcInit.numOfThreads = atoi(argv[++i]); - } else if (strcmp(argv[i], "-m") == 0 && i < argc - 1) { - msgSize = atoi(argv[++i]); - } else if (strcmp(argv[i], "-s") == 0 && i < argc - 1) { - rpcInit.sessions = atoi(argv[++i]); - } else if (strcmp(argv[i], "-o") == 0 && i < argc - 1) { - tsCompressMsgSize = atoi(argv[++i]); - } else if (strcmp(argv[i], "-w") == 0 && i < argc - 1) { - commit = atoi(argv[++i]); - } else if (strcmp(argv[i], "-d") == 0 && i < argc - 1) { - rpcDebugFlag = atoi(argv[++i]); - dDebugFlag = rpcDebugFlag; - uDebugFlag = rpcDebugFlag; - } else { - printf("\nusage: %s [options] \n", argv[0]); - printf(" [-p port]: server port number, default is:%d\n", rpcInit.localPort); - printf(" [-t threads]: number of rpc threads, default is:%d\n", rpcInit.numOfThreads); - printf(" [-s sessions]: number of sessions, default is:%d\n", rpcInit.sessions); - printf(" [-m msgSize]: message body size, default is:%d\n", msgSize); - printf(" [-o compSize]: compression message size, default is:%d\n", tsCompressMsgSize); - printf(" [-w write]: write received data to file(0, 1, 2), default is:%d\n", commit); - printf(" [-d debugFlag]: debug flag, default:%d\n", rpcDebugFlag); - printf(" [-h help]: print out this help\n\n"); - exit(0); - } - } - - tsAsyncLog = 0; - rpcInit.connType = TAOS_CONN_SERVER; - - const char *path = TD_TMP_DIR_PATH "transport/server"; - taosRemoveDir(path); - taosMkDir(path); - tstrncpy(tsLogDir, path, PATH_MAX); - taosInitLog("server.log", 10); - - void *pRpc = rpcOpen(&rpcInit); - if (pRpc == NULL) { - tError("failed to start RPC server"); - return -1; - } - // sleep(5); - - tInfo("RPC server is running, ctrl-c to exit"); - - if (commit) { - pDataFile = taosOpenFile(dataName, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND); - if (pDataFile == NULL) tInfo("failed to open data file, reason:%s", strerror(errno)); - } - qhandle = taosOpenQueue(); - qset = taosOpenQset(); - taosAddIntoQset(qset, qhandle, NULL); - - processShellMsg(); - - if (pDataFile != NULL) { - taosCloseFile(&pDataFile); - taosRemoveFile(dataName); - } - - return 0; -} diff --git a/source/libs/transport/test/syncClient.c b/source/libs/transport/test/syncClient.c deleted file mode 100644 index bc6461eaed1f5d2c7ca9d82f9ae47dbebf4fc02b..0000000000000000000000000000000000000000 --- a/source/libs/transport/test/syncClient.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * 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 -#include "os.h" -#include "taoserror.h" -#include "tglobal.h" -#include "transLog.h" -#include "trpc.h" -#include "tutil.h" - -typedef struct { - int index; - SEpSet epSet; - int num; - int numOfReqs; - int msgSize; - tsem_t rspSem; - tsem_t * pOverSem; - TdThread thread; - void * pRpc; -} SInfo; -static void processResponse(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet) { - SInfo *pInfo = (SInfo *)pMsg->info.ahandle; - tDebug("thread:%d, response is received, type:%d contLen:%d code:0x%x", pInfo->index, pMsg->msgType, pMsg->contLen, - pMsg->code); - - if (pEpSet) pInfo->epSet = *pEpSet; - - rpcFreeCont(pMsg->pCont); - // tsem_post(&pInfo->rspSem); - tsem_post(&pInfo->rspSem); -} - -static int tcount = 0; - -static void *sendRequest(void *param) { - SInfo * pInfo = (SInfo *)param; - SRpcMsg rpcMsg = {0}; - - tDebug("thread:%d, start to send request", pInfo->index); - - tDebug("thread:%d, reqs: %d", pInfo->index, pInfo->numOfReqs); - int u100 = 0; - int u500 = 0; - int u1000 = 0; - int u10000 = 0; - SRpcMsg respMsg = {0}; - while (pInfo->numOfReqs == 0 || pInfo->num < pInfo->numOfReqs) { - pInfo->num++; - rpcMsg.pCont = rpcMallocCont(pInfo->msgSize); - rpcMsg.contLen = pInfo->msgSize; - rpcMsg.info.ahandle = pInfo; - rpcMsg.msgType = 1; - // tDebug("thread:%d, send request, contLen:%d num:%d", pInfo->index, pInfo->msgSize, pInfo->num); - int64_t start = taosGetTimestampUs(); - rpcSendRecv(pInfo->pRpc, &pInfo->epSet, &rpcMsg, &respMsg); - // rpcSendRequest(pInfo->pRpc, &pInfo->epSet, &rpcMsg, NULL); - if (pInfo->num % 20000 == 0) tInfo("thread:%d, %d requests have been sent", pInfo->index, pInfo->num); - // tsem_wait(&pInfo->rspSem); - // wtsem_wait(&pInfo->rspSem); - int64_t end = taosGetTimestampUs() - start; - if (end <= 100) { - u100++; - } else if (end > 100 && end <= 500) { - u500++; - } else if (end > 500 && end < 1000) { - u1000++; - } else { - u10000++; - } - - tDebug("recv response succefully"); - - // taosSsleep(100); - } - - tError("send and recv sum: %d, %d, %d, %d", u100, u500, u1000, u10000); - tDebug("thread:%d, it is over", pInfo->index); - tcount++; - - return NULL; -} - -int main(int argc, char *argv[]) { - SRpcInit rpcInit; - SEpSet epSet = {0}; - int msgSize = 128; - int numOfReqs = 0; - int appThreads = 1; - char serverIp[40] = "127.0.0.1"; - char secret[20] = "mypassword"; - struct timeval systemTime; - int64_t startTime, endTime; - TdThreadAttr thattr; - - // server info - epSet.inUse = 0; - addEpIntoEpSet(&epSet, serverIp, 7000); - addEpIntoEpSet(&epSet, "192.168.0.1", 7000); - - // client info - memset(&rpcInit, 0, sizeof(rpcInit)); - rpcInit.localPort = 0; - rpcInit.label = "APP"; - rpcInit.numOfThreads = 1; - rpcInit.cfp = processResponse; - rpcInit.sessions = 100; - rpcInit.idleTime = 100; - rpcInit.user = "michael"; - rpcInit.connType = TAOS_CONN_CLIENT; - - for (int i = 1; i < argc; ++i) { - if (strcmp(argv[i], "-p") == 0 && i < argc - 1) { - epSet.eps[0].port = atoi(argv[++i]); - } else if (strcmp(argv[i], "-i") == 0 && i < argc - 1) { - tstrncpy(epSet.eps[0].fqdn, argv[++i], sizeof(epSet.eps[0].fqdn)); - } else if (strcmp(argv[i], "-t") == 0 && i < argc - 1) { - rpcInit.numOfThreads = atoi(argv[++i]); - } else if (strcmp(argv[i], "-m") == 0 && i < argc - 1) { - msgSize = atoi(argv[++i]); - } else if (strcmp(argv[i], "-s") == 0 && i < argc - 1) { - rpcInit.sessions = atoi(argv[++i]); - } else if (strcmp(argv[i], "-n") == 0 && i < argc - 1) { - numOfReqs = atoi(argv[++i]); - } else if (strcmp(argv[i], "-a") == 0 && i < argc - 1) { - appThreads = atoi(argv[++i]); - } else if (strcmp(argv[i], "-o") == 0 && i < argc - 1) { - tsCompressMsgSize = atoi(argv[++i]); - } else if (strcmp(argv[i], "-u") == 0 && i < argc - 1) { - rpcInit.user = argv[++i]; - } else if (strcmp(argv[i], "-k") == 0 && i < argc - 1) { - } else if (strcmp(argv[i], "-spi") == 0 && i < argc - 1) { - } else if (strcmp(argv[i], "-d") == 0 && i < argc - 1) { - rpcDebugFlag = atoi(argv[++i]); - } else { - printf("\nusage: %s [options] \n", argv[0]); - printf(" [-i ip]: first server IP address, default is:%s\n", serverIp); - printf(" [-p port]: server port number, default is:%d\n", epSet.eps[0].port); - printf(" [-t threads]: number of rpc threads, default is:%d\n", rpcInit.numOfThreads); - printf(" [-s sessions]: number of rpc sessions, default is:%d\n", rpcInit.sessions); - printf(" [-m msgSize]: message body size, default is:%d\n", msgSize); - printf(" [-a threads]: number of app threads, default is:%d\n", appThreads); - printf(" [-n requests]: number of requests per thread, default is:%d\n", numOfReqs); - printf(" [-o compSize]: compression message size, default is:%d\n", tsCompressMsgSize); - printf(" [-u user]: user name for the connection, default is:%s\n", rpcInit.user); - printf(" [-d debugFlag]: debug flag, default:%d\n", rpcDebugFlag); - printf(" [-h help]: print out this help\n\n"); - exit(0); - } - } - - taosInitLog("client.log", 10); - - void *pRpc = rpcOpen(&rpcInit); - if (pRpc == NULL) { - tError("failed to initialize RPC"); - return -1; - } - - tInfo("client is initialized"); - tInfo("threads:%d msgSize:%d requests:%d", appThreads, msgSize, numOfReqs); - - taosGetTimeOfDay(&systemTime); - startTime = systemTime.tv_sec * 1000000 + systemTime.tv_usec; - - SInfo *pInfo = (SInfo *)taosMemoryCalloc(1, sizeof(SInfo) * appThreads); - - taosThreadAttrInit(&thattr); - taosThreadAttrSetDetachState(&thattr, PTHREAD_CREATE_JOINABLE); - - for (int i = 0; i < appThreads; ++i) { - pInfo->index = i; - pInfo->epSet = epSet; - pInfo->numOfReqs = numOfReqs; - pInfo->msgSize = msgSize; - tsem_init(&pInfo->rspSem, 0, 0); - pInfo->pRpc = pRpc; - taosThreadCreate(&pInfo->thread, &thattr, sendRequest, pInfo); - pInfo++; - } - - do { - taosUsleep(1); - } while (tcount < appThreads); - - taosGetTimeOfDay(&systemTime); - endTime = systemTime.tv_sec * 1000000 + systemTime.tv_usec; - float usedTime = (endTime - startTime) / 1000.0f; // mseconds - - tInfo("it takes %.3f mseconds to send %d requests to server", usedTime, numOfReqs * appThreads); - tInfo("Performance: %.3f requests per second, msgSize:%d bytes", 1000.0 * numOfReqs * appThreads / usedTime, msgSize); - - int ch = getchar(); - UNUSED(ch); - - taosCloseLog(); - - return 0; -} diff --git a/source/libs/wal/inc/walInt.h b/source/libs/wal/inc/walInt.h index c23d0802c166097f813ccbf3f6dc271e6bc28240..2767780ff356e753f88cac1cf91abf07dad22ad5 100644 --- a/source/libs/wal/inc/walInt.h +++ b/source/libs/wal/inc/walInt.h @@ -19,6 +19,7 @@ #include "taoserror.h" #include "tchecksum.h" #include "tcoding.h" +#include "tcommon.h" #include "tcompare.h" #include "wal.h" diff --git a/source/libs/wal/src/walRead.c b/source/libs/wal/src/walRead.c index e7f0b31cccf3c83bd2f9c3acaeb0b43ed6e7bc19..b5c75ce3c48ddf745b1e45fab3a6053ecec7290d 100644 --- a/source/libs/wal/src/walRead.c +++ b/source/libs/wal/src/walRead.c @@ -16,20 +16,29 @@ #include "taoserror.h" #include "walInt.h" -SWalReadHandle *walOpenReadHandle(SWal *pWal) { - SWalReadHandle *pRead = taosMemoryMalloc(sizeof(SWalReadHandle)); +static int32_t walFetchHeadNew(SWalReader *pRead, int64_t fetchVer); +static int32_t walFetchBodyNew(SWalReader *pRead); +static int32_t walSkipFetchBodyNew(SWalReader *pRead); + +SWalReader *walOpenReader(SWal *pWal, SWalFilterCond *cond) { + SWalReader *pRead = taosMemoryMalloc(sizeof(SWalReader)); if (pRead == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } pRead->pWal = pWal; - pRead->pReadIdxTFile = NULL; - pRead->pReadLogTFile = NULL; + pRead->pIdxFile = NULL; + pRead->pLogFile = NULL; pRead->curVersion = -1; pRead->curFileFirstVer = -1; pRead->capacity = 0; - pRead->status = 0; + if (cond) + pRead->cond = *cond; + else { + pRead->cond.scanMeta = 0; + pRead->cond.scanUncommited = 0; + } taosThreadMutexInit(&pRead->mutex, NULL); @@ -39,26 +48,46 @@ SWalReadHandle *walOpenReadHandle(SWal *pWal) { taosMemoryFree(pRead); return NULL; } + return pRead; } -void walCloseReadHandle(SWalReadHandle *pRead) { - taosCloseFile(&pRead->pReadIdxTFile); - taosCloseFile(&pRead->pReadLogTFile); +void walCloseReader(SWalReader *pRead) { + taosCloseFile(&pRead->pIdxFile); + taosCloseFile(&pRead->pLogFile); taosMemoryFreeClear(pRead->pHead); taosMemoryFree(pRead); } -int32_t walRegisterRead(SWalReadHandle *pRead, int64_t ver) { - // TODO - return 0; +int32_t walNextValidMsg(SWalReader *pRead) { + int64_t fetchVer = pRead->curVersion; + int64_t endVer = pRead->cond.scanUncommited ? walGetLastVer(pRead->pWal) : walGetCommittedVer(pRead->pWal); + while (fetchVer <= endVer) { + if (walFetchHeadNew(pRead, fetchVer) < 0) { + return -1; + } + if (pRead->pHead->head.msgType == TDMT_VND_SUBMIT || + (IS_META_MSG(pRead->pHead->head.msgType) && pRead->cond.scanMeta)) { + if (walFetchBodyNew(pRead) < 0) { + return -1; + } + return 0; + } else { + if (walSkipFetchBodyNew(pRead) < 0) { + return -1; + } + fetchVer++; + ASSERT(fetchVer == pRead->curVersion); + } + } + return -1; } -static int64_t walReadSeekFilePos(SWalReadHandle *pRead, int64_t fileFirstVer, int64_t ver) { +static int64_t walReadSeekFilePos(SWalReader *pRead, int64_t fileFirstVer, int64_t ver) { int64_t ret = 0; - TdFilePtr pIdxTFile = pRead->pReadIdxTFile; - TdFilePtr pLogTFile = pRead->pReadLogTFile; + TdFilePtr pIdxTFile = pRead->pIdxFile; + TdFilePtr pLogTFile = pRead->pLogFile; // seek position int64_t offset = (ver - fileFirstVer) * sizeof(SWalIdxEntry); @@ -90,11 +119,11 @@ static int64_t walReadSeekFilePos(SWalReadHandle *pRead, int64_t fileFirstVer, i return ret; } -static int32_t walReadChangeFile(SWalReadHandle *pRead, int64_t fileFirstVer) { +static int32_t walReadChangeFile(SWalReader *pRead, int64_t fileFirstVer) { char fnameStr[WAL_FILE_LEN]; - taosCloseFile(&pRead->pReadIdxTFile); - taosCloseFile(&pRead->pReadLogTFile); + taosCloseFile(&pRead->pIdxFile); + taosCloseFile(&pRead->pLogFile); walBuildLogName(pRead->pWal, fileFirstVer, fnameStr); TdFilePtr pLogTFile = taosOpenFile(fnameStr, TD_FILE_READ); @@ -104,7 +133,7 @@ static int32_t walReadChangeFile(SWalReadHandle *pRead, int64_t fileFirstVer) { return -1; } - pRead->pReadLogTFile = pLogTFile; + pRead->pLogFile = pLogTFile; walBuildIdxName(pRead->pWal, fileFirstVer, fnameStr); TdFilePtr pIdxTFile = taosOpenFile(fnameStr, TD_FILE_READ); @@ -114,11 +143,11 @@ static int32_t walReadChangeFile(SWalReadHandle *pRead, int64_t fileFirstVer) { return -1; } - pRead->pReadIdxTFile = pIdxTFile; + pRead->pIdxFile = pIdxTFile; return 0; } -static int32_t walReadSeekVer(SWalReadHandle *pRead, int64_t ver) { +static int32_t walReadSeekVer(SWalReader *pRead, int64_t ver) { SWal *pWal = pRead->pWal; if (ver == pRead->curVersion) { return 0; @@ -153,9 +182,94 @@ static int32_t walReadSeekVer(SWalReadHandle *pRead, int64_t ver) { return 0; } -void walSetReaderCapacity(SWalReadHandle *pRead, int32_t capacity) { pRead->capacity = capacity; } +void walSetReaderCapacity(SWalReader *pRead, int32_t capacity) { pRead->capacity = capacity; } + +static int32_t walFetchHeadNew(SWalReader *pRead, int64_t fetchVer) { + int64_t contLen; + if (pRead->curVersion != fetchVer) { + if (walReadSeekVer(pRead, fetchVer) < 0) return -1; + } + contLen = taosReadFile(pRead->pLogFile, pRead->pHead, sizeof(SWalCkHead)); + if (contLen != sizeof(SWalCkHead)) { + if (contLen < 0) { + terrno = TAOS_SYSTEM_ERROR(errno); + } else { + terrno = TSDB_CODE_WAL_FILE_CORRUPTED; + } + pRead->curVersion = -1; + return -1; + } + return 0; +} + +static int32_t walFetchBodyNew(SWalReader *pRead) { + SWalCont *pReadHead = &pRead->pHead->head; + int64_t ver = pReadHead->version; + + if (pRead->capacity < pReadHead->bodyLen) { + void *ptr = taosMemoryRealloc(pRead->pHead, sizeof(SWalCkHead) + pReadHead->bodyLen); + if (ptr == NULL) { + terrno = TSDB_CODE_WAL_OUT_OF_MEMORY; + return -1; + } + pRead->pHead = ptr; + pReadHead = &pRead->pHead->head; + pRead->capacity = pReadHead->bodyLen; + } + + if (pReadHead->bodyLen != taosReadFile(pRead->pLogFile, pReadHead->body, pReadHead->bodyLen)) { + if (pReadHead->bodyLen < 0) { + terrno = TAOS_SYSTEM_ERROR(errno); + wError("wal fetch body error: %" PRId64 ", read request version:%" PRId64 ", since %s", + pRead->pHead->head.version, ver, tstrerror(terrno)); + } else { + wError("wal fetch body error: %" PRId64 ", read request version:%" PRId64 ", since file corrupted", + pRead->pHead->head.version, ver); + terrno = TSDB_CODE_WAL_FILE_CORRUPTED; + } + pRead->curVersion = -1; + ASSERT(0); + return -1; + } + + if (pReadHead->version != ver) { + wError("wal fetch body error: %" PRId64 ", read request version:%" PRId64 "", pRead->pHead->head.version, ver); + pRead->curVersion = -1; + terrno = TSDB_CODE_WAL_FILE_CORRUPTED; + ASSERT(0); + return -1; + } + + if (walValidBodyCksum(pRead->pHead) != 0) { + wError("wal fetch body error: % " PRId64 ", since body checksum not passed", ver); + pRead->curVersion = -1; + terrno = TSDB_CODE_WAL_FILE_CORRUPTED; + ASSERT(0); + return -1; + } + + pRead->curVersion = ver + 1; + return 0; +} + +static int32_t walSkipFetchBodyNew(SWalReader *pRead) { + int64_t code; + + ASSERT(pRead->curVersion == pRead->pHead->head.version); -int32_t walFetchHead(SWalReadHandle *pRead, int64_t ver, SWalCkHead *pHead) { + code = taosLSeekFile(pRead->pLogFile, pRead->pHead->head.bodyLen, SEEK_CUR); + if (code < 0) { + terrno = TAOS_SYSTEM_ERROR(errno); + pRead->curVersion = -1; + return -1; + } + + pRead->curVersion++; + + return 0; +} + +int32_t walFetchHead(SWalReader *pRead, int64_t ver, SWalCkHead *pHead) { int64_t code; // TODO: valid ver @@ -168,9 +282,9 @@ int32_t walFetchHead(SWalReadHandle *pRead, int64_t ver, SWalCkHead *pHead) { if (code < 0) return -1; } - ASSERT(taosValidFile(pRead->pReadLogTFile) == true); + ASSERT(taosValidFile(pRead->pLogFile) == true); - code = taosReadFile(pRead->pReadLogTFile, pHead, sizeof(SWalCkHead)); + code = taosReadFile(pRead->pLogFile, pHead, sizeof(SWalCkHead)); if (code != sizeof(SWalCkHead)) { return -1; } @@ -186,12 +300,12 @@ int32_t walFetchHead(SWalReadHandle *pRead, int64_t ver, SWalCkHead *pHead) { return 0; } -int32_t walSkipFetchBody(SWalReadHandle *pRead, const SWalCkHead *pHead) { +int32_t walSkipFetchBody(SWalReader *pRead, const SWalCkHead *pHead) { int64_t code; ASSERT(pRead->curVersion == pHead->head.version); - code = taosLSeekFile(pRead->pReadLogTFile, pHead->head.bodyLen, SEEK_CUR); + code = taosLSeekFile(pRead->pLogFile, pHead->head.bodyLen, SEEK_CUR); if (code < 0) { terrno = TAOS_SYSTEM_ERROR(errno); pRead->curVersion = -1; @@ -203,7 +317,7 @@ int32_t walSkipFetchBody(SWalReadHandle *pRead, const SWalCkHead *pHead) { return 0; } -int32_t walFetchBody(SWalReadHandle *pRead, SWalCkHead **ppHead) { +int32_t walFetchBody(SWalReader *pRead, SWalCkHead **ppHead) { SWalCont *pReadHead = &((*ppHead)->head); int64_t ver = pReadHead->version; @@ -218,7 +332,7 @@ int32_t walFetchBody(SWalReadHandle *pRead, SWalCkHead **ppHead) { pRead->capacity = pReadHead->bodyLen; } - if (pReadHead->bodyLen != taosReadFile(pRead->pReadLogTFile, pReadHead->body, pReadHead->bodyLen)) { + if (pReadHead->bodyLen != taosReadFile(pRead->pLogFile, pReadHead->body, pReadHead->bodyLen)) { ASSERT(0); return -1; } @@ -241,9 +355,9 @@ int32_t walFetchBody(SWalReadHandle *pRead, SWalCkHead **ppHead) { return 0; } -int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalCont **ppHead) { +int32_t walReadWithHandle_s(SWalReader *pRead, int64_t ver, SWalCont **ppHead) { taosThreadMutexLock(&pRead->mutex); - if (walReadWithHandle(pRead, ver) < 0) { + if (walReadVer(pRead, ver) < 0) { taosThreadMutexUnlock(&pRead->mutex); return -1; } @@ -257,7 +371,7 @@ int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalCont **ppHea return 0; } -int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) { +int32_t walReadVer(SWalReader *pRead, int64_t ver) { int64_t code; if (pRead->pWal->vers.firstVer == -1) { @@ -280,9 +394,9 @@ int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) { return -1; } - ASSERT(taosValidFile(pRead->pReadLogTFile) == true); + ASSERT(taosValidFile(pRead->pLogFile) == true); - code = taosReadFile(pRead->pReadLogTFile, pRead->pHead, sizeof(SWalCkHead)); + code = taosReadFile(pRead->pLogFile, pRead->pHead, sizeof(SWalCkHead)); if (code != sizeof(SWalCkHead)) { if (code < 0) terrno = TAOS_SYSTEM_ERROR(errno); @@ -310,7 +424,7 @@ int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) { pRead->capacity = pRead->pHead->head.bodyLen; } - if ((code = taosReadFile(pRead->pReadLogTFile, pRead->pHead->head.body, pRead->pHead->head.bodyLen)) != + if ((code = taosReadFile(pRead->pLogFile, pRead->pHead->head.body, pRead->pHead->head.bodyLen)) != pRead->pHead->head.bodyLen) { if (code < 0) terrno = TAOS_SYSTEM_ERROR(errno); @@ -340,46 +454,3 @@ int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) { return 0; } - -#if 0 -int32_t walRead(SWal *pWal, SWalHead **ppHead, int64_t ver) { - int code; - code = walSeekVer(pWal, ver); - if (code != 0) { - return code; - } - if (*ppHead == NULL) { - void *ptr = taosMemoryRealloc(*ppHead, sizeof(SWalHead)); - if (ptr == NULL) { - return -1; - } - *ppHead = ptr; - } - if (tfRead(pWal->pWriteLogTFile, *ppHead, sizeof(SWalHead)) != sizeof(SWalHead)) { - return -1; - } - // TODO: endian compatibility processing after read - if (walValidHeadCksum(*ppHead) != 0) { - return -1; - } - void *ptr = taosMemoryRealloc(*ppHead, sizeof(SWalHead) + (*ppHead)->head.len); - if (ptr == NULL) { - taosMemoryFree(*ppHead); - *ppHead = NULL; - return -1; - } - if (tfRead(pWal->pWriteLogTFile, (*ppHead)->head.body, (*ppHead)->head.len) != (*ppHead)->head.len) { - return -1; - } - // TODO: endian compatibility processing after read - if (walValidBodyCksum(*ppHead) != 0) { - return -1; - } - - return 0; -} - -int32_t walReadWithFp(SWal *pWal, FWalWrite writeFp, int64_t verStart, int32_t readNum) { -return 0; -} -#endif diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c index 27f12259bc07fabd97e33d17143a12df17ded58a..445cdea45beb239da1f71c44308e913a1ae8dbe3 100644 --- a/source/libs/wal/src/walWrite.c +++ b/source/libs/wal/src/walWrite.c @@ -79,19 +79,21 @@ int32_t walCommit(SWal *pWal, int64_t ver) { } int32_t walRollback(SWal *pWal, int64_t ver) { + taosThreadMutexLock(&pWal->mutex); int64_t code; char fnameStr[WAL_FILE_LEN]; if (ver > pWal->vers.lastVer || ver < pWal->vers.commitVer) { terrno = TSDB_CODE_WAL_INVALID_VER; + taosThreadMutexUnlock(&pWal->mutex); return -1; } - taosThreadMutexLock(&pWal->mutex); // find correct file if (ver < walGetLastFileFirstVer(pWal)) { // change current files code = walChangeWrite(pWal, ver); if (code < 0) { + taosThreadMutexUnlock(&pWal->mutex); return -1; } @@ -146,6 +148,7 @@ int32_t walRollback(SWal *pWal, int64_t ver) { ASSERT(taosValidFile(pLogTFile)); int64_t size = taosReadFile(pLogTFile, &head, sizeof(SWalCkHead)); if (size != sizeof(SWalCkHead)) { + taosThreadMutexUnlock(&pWal->mutex); return -1; } code = walValidHeadCksum(&head); @@ -154,11 +157,13 @@ int32_t walRollback(SWal *pWal, int64_t ver) { if (code != 0) { terrno = TSDB_CODE_WAL_FILE_CORRUPTED; ASSERT(0); + taosThreadMutexUnlock(&pWal->mutex); return -1; } if (head.head.version != ver) { ASSERT(0); terrno = TSDB_CODE_WAL_FILE_CORRUPTED; + taosThreadMutexUnlock(&pWal->mutex); return -1; } @@ -167,12 +172,14 @@ int32_t walRollback(SWal *pWal, int64_t ver) { if (code < 0) { ASSERT(0); terrno = TAOS_SYSTEM_ERROR(errno); + taosThreadMutexUnlock(&pWal->mutex); return -1; } code = taosFtruncateFile(pIdxTFile, idxOff); if (code < 0) { ASSERT(0); terrno = TAOS_SYSTEM_ERROR(errno); + taosThreadMutexUnlock(&pWal->mutex); return -1; } pWal->vers.lastVer = ver - 1; diff --git a/source/libs/wal/test/walMetaTest.cpp b/source/libs/wal/test/walMetaTest.cpp index 89c4fd9ef27feb187c99da0736054d1673298050..97b98520169017b8f3cd10befea8c6f551a2b870 100644 --- a/source/libs/wal/test/walMetaTest.cpp +++ b/source/libs/wal/test/walMetaTest.cpp @@ -292,8 +292,8 @@ TEST_F(WalCleanDeleteEnv, roll) { TEST_F(WalKeepEnv, readHandleRead) { walResetEnv(); - int code; - SWalReadHandle* pRead = walOpenReadHandle(pWal); + int code; + SWalReader* pRead = walOpenReader(pWal, NULL); ASSERT(pRead != NULL); int i; @@ -306,7 +306,7 @@ TEST_F(WalKeepEnv, readHandleRead) { } for (int i = 0; i < 1000; i++) { int ver = taosRand() % 100; - code = walReadWithHandle(pRead, ver); + code = walReadVer(pRead, ver); ASSERT_EQ(code, 0); // printf("rrbody: \n"); @@ -325,7 +325,7 @@ TEST_F(WalKeepEnv, readHandleRead) { EXPECT_EQ(newStr[j], pRead->pHead->head.body[j]); } } - walCloseReadHandle(pRead); + walCloseReader(pRead); } TEST_F(WalRetentionEnv, repairMeta1) { @@ -354,12 +354,12 @@ TEST_F(WalRetentionEnv, repairMeta1) { ASSERT_EQ(pWal->vers.lastVer, 99); - SWalReadHandle* pRead = walOpenReadHandle(pWal); + SWalReader* pRead = walOpenReader(pWal, NULL); ASSERT(pRead != NULL); for (int i = 0; i < 1000; i++) { int ver = taosRand() % 100; - code = walReadWithHandle(pRead, ver); + code = walReadVer(pRead, ver); ASSERT_EQ(code, 0); // printf("rrbody: \n"); @@ -389,7 +389,7 @@ TEST_F(WalRetentionEnv, repairMeta1) { for (int i = 0; i < 1000; i++) { int ver = taosRand() % 200; - code = walReadWithHandle(pRead, ver); + code = walReadVer(pRead, ver); ASSERT_EQ(code, 0); // printf("rrbody: \n"); diff --git a/source/os/src/osStrptime.c b/source/os/src/osStrptime.c deleted file mode 100644 index 8d878577ea2f30afbef3dd44cd3503b28e646ef7..0000000000000000000000000000000000000000 --- a/source/os/src/osStrptime.c +++ /dev/null @@ -1,405 +0,0 @@ -/* $Id$ */ -/* $NetBSD: strptime.c,v 1.18 1999/04/29 02:58:30 tv Exp $ */ - -/*- -* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. -* All rights reserved. -* -* This code was contributed to The NetBSD Foundation by Klaus Klein. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* 3. All advertising materials mentioning features or use of this software -* must display the following acknowledgement: -* This product includes software developed by the NetBSD -* Foundation, Inc. and its contributors. -* 4. Neither the name of The NetBSD Foundation nor the names of its -* contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS -* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS -* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ -// -//#include "lukemftp.h" - -// #ifdef WINDOWS - -// #include -// #include -// #include -// #include -// //#define TM_YEAR_BASE 1970 //origin -// #define TM_YEAR_BASE 1900 //slguan -// /* -// * We do not implement alternate representations. However, we always -// * check whether a given modifier is allowed for a certain conversion. -// */ -// #define ALT_E 0x01 -// #define ALT_O 0x02 -// #define LEGAL_ALT(x) { if (alt_format & ~(x)) return (0); } - - -// static int conv_num(const char **buf, int *dest, int llim, int ulim) -// { -// int result = 0; - -// /* The limit also determines the number of valid digits. */ -// int rulim = ulim; - -// if (**buf < '0' || **buf > '9') -// return (0); - -// do { -// result *= 10; -// result += *(*buf)++ - '0'; -// rulim /= 10; -// } while ((result * 10 <= ulim) && rulim && **buf >= '0' && **buf <= '9'); - -// if (result < llim || result > ulim) -// return (0); - -// *dest = result; -// return (1); -// } - -// static const char *day[7] = { -// "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", -// "Friday", "Saturday" -// }; -// static const char *abday[7] = { -// "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" -// }; -// static const char *mon[12] = { -// "January", "February", "March", "April", "May", "June", "July", -// "August", "September", "October", "November", "December" -// }; -// static const char *abmon[12] = { -// "Jan", "Feb", "Mar", "Apr", "May", "Jun", -// "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -// }; -// static const char *am_pm[2] = { -// "AM", "PM" -// }; - -// #endif - -// char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm) { -// #ifdef WINDOWS -// char c; -// const char *bp; -// size_t len = 0; -// int alt_format, i, split_year = 0; - -// bp = buf; - -// while ((c = *fmt) != '\0') { -// /* Clear `alternate' modifier prior to new conversion. */ -// alt_format = 0; - -// /* Eat up white-space. */ -// if (isspace(c)) { -// while (isspace(*bp)) -// bp++; - -// fmt++; -// continue; -// } - -// if ((c = *fmt++) != '%') -// goto literal; - - -// again: switch (c = *fmt++) { -// case '%': /* "%%" is converted to "%". */ -// literal : -// if (c != *bp++) -// return (0); -// break; - -// /* -// * "Alternative" modifiers. Just set the appropriate flag -// * and start over again. -// */ -// case 'E': /* "%E?" alternative conversion modifier. */ -// LEGAL_ALT(0); -// alt_format |= ALT_E; -// goto again; - -// case 'O': /* "%O?" alternative conversion modifier. */ -// LEGAL_ALT(0); -// alt_format |= ALT_O; -// goto again; - -// /* -// * "Complex" conversion rules, implemented through recursion. -// */ -// case 'c': /* Date and time, using the locale's format. */ -// LEGAL_ALT(ALT_E); -// if (!(bp = taosStrpTime(bp, "%x %X", tm))) -// return (0); -// break; - -// case 'D': /* The date as "%m/%d/%y". */ -// LEGAL_ALT(0); -// if (!(bp = taosStrpTime(bp, "%m/%d/%y", tm))) -// return (0); -// break; - -// case 'R': /* The time as "%H:%M". */ -// LEGAL_ALT(0); -// if (!(bp = taosStrpTime(bp, "%H:%M", tm))) -// return (0); -// break; - -// case 'r': /* The time in 12-hour clock representation. */ -// LEGAL_ALT(0); -// if (!(bp = taosStrpTime(bp, "%I:%M:%S %p", tm))) -// return (0); -// break; - -// case 'T': /* The time as "%H:%M:%S". */ -// LEGAL_ALT(0); -// if (!(bp = taosStrpTime(bp, "%H:%M:%S", tm))) -// return (0); -// break; - -// case 'X': /* The time, using the locale's format. */ -// LEGAL_ALT(ALT_E); -// if (!(bp = taosStrpTime(bp, "%H:%M:%S", tm))) -// return (0); -// break; - -// case 'x': /* The date, using the locale's format. */ -// LEGAL_ALT(ALT_E); -// if (!(bp = taosStrpTime(bp, "%m/%d/%y", tm))) -// return (0); -// break; - -// /* -// * "Elementary" conversion rules. -// */ -// case 'A': /* The day of week, using the locale's form. */ -// case 'a': -// LEGAL_ALT(0); -// for (i = 0; i < 7; i++) { -// /* Full name. */ -// len = strlen(day[i]); -// if (strncmp(day[i], bp, len) == 0) -// break; - -// /* Abbreviated name. */ -// len = strlen(abday[i]); -// if (strncmp(abday[i], bp, len) == 0) -// break; -// } - -// /* Nothing matched. */ -// if (i == 7) -// return (0); - -// tm->tm_wday = i; -// bp += len; -// break; - -// case 'B': /* The month, using the locale's form. */ -// case 'b': -// case 'h': -// LEGAL_ALT(0); -// for (i = 0; i < 12; i++) { -// /* Full name. */ -// len = strlen(mon[i]); -// if (strncmp(mon[i], bp, len) == 0) -// break; - -// /* Abbreviated name. */ -// len = strlen(abmon[i]); -// if (strncmp(abmon[i], bp, len) == 0) -// break; -// } - -// /* Nothing matched. */ -// if (i == 12) -// return (0); - -// tm->tm_mon = i; -// bp += len; -// break; - -// case 'C': /* The century number. */ -// LEGAL_ALT(ALT_E); -// if (!(conv_num(&bp, &i, 0, 99))) -// return (0); - -// if (split_year) { -// tm->tm_year = (tm->tm_year % 100) + (i * 100); -// } -// else { -// tm->tm_year = i * 100; -// split_year = 1; -// } -// break; - -// case 'd': /* The day of month. */ -// case 'e': -// LEGAL_ALT(ALT_O); -// if (!(conv_num(&bp, &tm->tm_mday, 1, 31))) -// return (0); -// break; - -// case 'k': /* The hour (24-hour clock representation). */ -// LEGAL_ALT(0); -// /* FALLTHROUGH */ -// case 'H': -// LEGAL_ALT(ALT_O); -// if (!(conv_num(&bp, &tm->tm_hour, 0, 23))) -// return (0); -// break; - -// case 'l': /* The hour (12-hour clock representation). */ -// LEGAL_ALT(0); -// /* FALLTHROUGH */ -// case 'I': -// LEGAL_ALT(ALT_O); -// if (!(conv_num(&bp, &tm->tm_hour, 1, 12))) -// return (0); -// if (tm->tm_hour == 12) -// tm->tm_hour = 0; -// break; - -// case 'j': /* The day of year. */ -// LEGAL_ALT(0); -// if (!(conv_num(&bp, &i, 1, 366))) -// return (0); -// tm->tm_yday = i - 1; -// break; - -// case 'M': /* The minute. */ -// LEGAL_ALT(ALT_O); -// if (!(conv_num(&bp, &tm->tm_min, 0, 59))) -// return (0); -// break; - -// case 'm': /* The month. */ -// LEGAL_ALT(ALT_O); -// if (!(conv_num(&bp, &i, 1, 12))) -// return (0); -// tm->tm_mon = i - 1; -// break; - -// case 'p': /* The locale's equivalent of AM/PM. */ -// LEGAL_ALT(0); -// /* AM? */ -// if (strcmp(am_pm[0], bp) == 0) { -// if (tm->tm_hour > 11) -// return (0); - -// bp += strlen(am_pm[0]); -// break; -// } -// /* PM? */ -// else if (strcmp(am_pm[1], bp) == 0) { -// if (tm->tm_hour > 11) -// return (0); - -// tm->tm_hour += 12; -// bp += strlen(am_pm[1]); -// break; -// } - -// /* Nothing matched. */ -// return (0); - -// case 'S': /* The seconds. */ -// LEGAL_ALT(ALT_O); -// if (!(conv_num(&bp, &tm->tm_sec, 0, 61))) -// return (0); -// break; - -// case 'U': /* The week of year, beginning on sunday. */ -// case 'W': /* The week of year, beginning on monday. */ -// LEGAL_ALT(ALT_O); -// /* -// * XXX This is bogus, as we can not assume any valid -// * information present in the tm structure at this -// * point to calculate a real value, so just check the -// * range for now. -// */ -// if (!(conv_num(&bp, &i, 0, 53))) -// return (0); -// break; - -// case 'w': /* The day of week, beginning on sunday. */ -// LEGAL_ALT(ALT_O); -// if (!(conv_num(&bp, &tm->tm_wday, 0, 6))) -// return (0); -// break; - -// case 'Y': /* The year. */ -// LEGAL_ALT(ALT_E); -// if (!(conv_num(&bp, &i, 0, 9999))) -// return (0); - -// tm->tm_year = i - TM_YEAR_BASE; -// break; - -// case 'y': /* The year within 100 years of the epoch. */ -// LEGAL_ALT(ALT_E | ALT_O); -// if (!(conv_num(&bp, &i, 0, 99))) -// return (0); - -// if (split_year) { -// tm->tm_year = ((tm->tm_year / 100) * 100) + i; -// break; -// } -// split_year = 1; -// if (i <= 68) -// tm->tm_year = i + 2000 - TM_YEAR_BASE; -// else -// tm->tm_year = i + 1900 - TM_YEAR_BASE; -// break; - -// /* -// * Miscellaneous conversions. -// */ -// case 'n': /* Any kind of white-space. */ -// case 't': -// LEGAL_ALT(0); -// while (isspace(*bp)) -// bp++; -// break; - - -// default: /* Unknown/unsupported conversion. */ -// return (0); -// } - - -// } - -// /* LINTED functional specification */ -// return ((char *)bp); -// #elif defined(_TD_DARWIN_64) -// return strptime(buf, fmt, tm); -// #else -// return strptime(buf, fmt, tm); -// #endif -// } - - - diff --git a/source/os/src/osTimezone.c b/source/os/src/osTimezone.c index 724f81c66ce2ace2015c32bdb1372815fc4407c5..2ce2033a00ef92523cf724c9a16e4bb7ecbed2ef 100644 --- a/source/os/src/osTimezone.c +++ b/source/os/src/osTimezone.c @@ -857,19 +857,27 @@ void taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone) { return; } buf[n] = '\0'; - for (int i = n - 1; i >= 0; --i) { - if (buf[i] == '/') { - if (tz) { - tz = buf + i + 1; - break; - } - tz = buf + i + 1; - } - } - if (!tz || 0 == strchr(tz, '/')) { + + char *zi = strstr(buf, "zoneinfo"); + if (!zi) { printf("parsing /etc/localtime failed"); return; } + tz = zi + strlen("zoneinfo") + 1; + + //for (int i = n - 1; i >= 0; --i) { + // if (buf[i] == '/') { + // if (tz) { + // tz = buf + i + 1; + // break; + // } + // tz = buf + i + 1; + // } + //} + //if (!tz || 0 == strchr(tz, '/')) { + // printf("parsing /etc/localtime failed"); + // return; + //} setenv("TZ", tz, 1); tzset(); @@ -900,7 +908,7 @@ void taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone) { int n = readlink("/etc/localtime", buf, sizeof(buf)); if (n < 0) { printf("read /etc/localtime error, reason:%s", strerror(errno)); - + if (taosCheckExistFile("/etc/timezone")) { /* * NOTE: do not remove it. @@ -962,19 +970,27 @@ void taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone) { return; } buf[n] = '\0'; - for (int i = n - 1; i >= 0; --i) { - if (buf[i] == '/') { - if (tz) { - tz = buf + i + 1; - break; - } - tz = buf + i + 1; - } - } - if (!tz || 0 == strchr(tz, '/')) { + + char *zi = strstr(buf, "zoneinfo"); + if (!zi) { printf("parsing /etc/localtime failed"); return; } + tz = zi + strlen("zoneinfo") + 1; + + //for (int i = n - 1; i >= 0; --i) { + // if (buf[i] == '/') { + // if (tz) { + // tz = buf + i + 1; + // break; + // } + // tz = buf + i + 1; + // } + //} + //if (!tz || 0 == strchr(tz, '/')) { + // printf("parsing /etc/localtime failed"); + // return; + //} setenv("TZ", tz, 1); tzset(); diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 0439ed148bdaee8d5fee012eb961d57283e62aaa..9d7656de3585a8d00c3f4f079755fa5496586d21 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -94,7 +94,7 @@ int32_t tdbDebugFlag = 131; int32_t tqDebugFlag = 135; int32_t fsDebugFlag = 135; int32_t metaDebugFlag = 135; -int32_t fnDebugFlag = 135; +int32_t udfDebugFlag = 135; int32_t smaDebugFlag = 135; int32_t idxDebugFlag = 135; @@ -758,7 +758,7 @@ void taosSetAllDebugFlag(int32_t flag) { tsdbDebugFlag = flag; tqDebugFlag = flag; fsDebugFlag = flag; - fnDebugFlag = flag; + udfDebugFlag = flag; smaDebugFlag = flag; idxDebugFlag = flag; diff --git a/source/util/src/tpagedbuf.c b/source/util/src/tpagedbuf.c index f50fd22ba6f577797eae6196582a4c164aa38358..0e608d0da22da836f0a357c7bd4f9b194c11fd13 100644 --- a/source/util/src/tpagedbuf.c +++ b/source/util/src/tpagedbuf.c @@ -518,8 +518,8 @@ void releaseBufPageInfo(SDiskbasedBuf* pBuf, SPageInfo* pi) { #ifdef BUF_PAGE_DEBUG uDebug("page_releaseBufPageInfo pageId:%d, used:%d, offset:%"PRId64, pi->pageId, pi->used, pi->offset); #endif - assert(pi->pData != NULL && pi->used == true); -// assert(pi->pData != NULL); + // assert(pi->pData != NULL && pi->used == true); + assert(pi->pData != NULL); pi->used = false; pBuf->statis.releasePages += 1; } diff --git a/source/util/src/ttrace.c b/source/util/src/ttrace.c deleted file mode 100644 index f183fd58fd6acd7b4e111575de1414cc4776c9d0..0000000000000000000000000000000000000000 --- a/source/util/src/ttrace.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * 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 "ttrace.h" -#include "taos.h" -#include "thash.h" -#include "tuuid.h" - -// clang-format off -//static TdThreadOnce init = PTHREAD_ONCE_INIT; -//static void * ids = NULL; -//static TdThreadMutex mtx; -// -//void traceInit() { -// ids = taosHashInit(4096, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK); -// taosThreadMutexInit(&mtx, NULL); -//} -//void traceCreateEnv() { -// taosThreadOnce(&init, traceInit); -//} -//void traceDestroyEnv() { -// taosThreadMutexDestroy(&mtx); -// taosHashCleanup(ids); -//} -// -//STraceId traceInitId(STraceSubId *h, STraceSubId *l) { -// STraceId id = *h; -// id = ((id << 32) & 0xFFFFFFFF) | ((*l) & 0xFFFFFFFF); -// return id; -//} -//void traceId2Str(STraceId *id, char *buf) { -// int32_t f = (*id >> 32) & 0xFFFFFFFF; -// int32_t s = (*id) & 0xFFFFFFFF; -// sprintf(buf, "%d:%d", f, s); -//} -// -//void traceSetSubId(STraceId *id, STraceSubId *subId) { -// int32_t parent = ((*id >> 32) & 0xFFFFFFFF); -// taosThreadMutexLock(&mtx); -// taosHashPut(ids, subId, sizeof(*subId), &parent, sizeof(parent)); -// taosThreadMutexUnlock(&mtx); -//} -// -//STraceSubId traceGetParentId(STraceId *id) { -// int32_t parent = ((*id >> 32) & 0xFFFFFFFF); -// taosThreadMutexLock(&mtx); -// STraceSubId *p = taosHashGet(ids, (void *)&parent, sizeof(parent)); -// parent = *p; -// taosThreadMutexUnlock(&mtx); -// -// return parent; -//} -// -//STraceSubId traceGenSubId() { -// return tGenIdPI32(); -//} -//void traceSetRootId(STraceId *traceid, int64_t rootId) { -// traceId->rootId = rootId; -//} -//int64_t traceGetRootId(STraceId *traceId); -// -//void traceSetMsgId(STraceId *traceid, int64_t msgId); -//int64_t traceGetMsgId(STraceId *traceid); -// -//char *trace2Str(STraceId *id); -// -//void traceSetSubId(STraceId *id, int32_t *subId); -// clang-format on diff --git a/source/util/src/tutil.c b/source/util/src/tutil.c index addb9f55ba9760f8f5d6f915836ca22260f67333..7f3728e2ad837bb8cc1c578357ca643491e307f6 100644 --- a/source/util/src/tutil.c +++ b/source/util/src/tutil.c @@ -64,6 +64,20 @@ int32_t strdequote(char *z) { return j + 1; // only one quote, do nothing } +char *strDupUnquo(const char *src) { + if (src == NULL) return NULL; + if (src[0] != '`') return strdup(src); + int32_t len = (int32_t)strlen(src); + if (src[len - 1] != '`') return NULL; + char *ret = taosMemoryMalloc(len); + if (ret == NULL) return NULL; + for (int32_t i = 0; i < len - 1; i++) { + ret[i] = src[i + 1]; + } + ret[len - 1] = 0; + return ret; +} + size_t strtrim(char *z) { int32_t i = 0; int32_t j = 0; diff --git a/tests/pytest/crash_gen.sh b/tests/pytest/crash_gen.sh index 127e13c5be1ea562cbe536bbb05f6ecd5844b0ea..539314dea46d7901a4e6d58f8aed0f7aeef603e1 100755 --- a/tests/pytest/crash_gen.sh +++ b/tests/pytest/crash_gen.sh @@ -48,7 +48,12 @@ fi PYTHON_EXEC=python3.8 # First we need to set up a path for Python to find our own TAOS modules, so that "import" can work. -export PYTHONPATH=$(pwd)/../../src/connector/python:$(pwd) +# export PYTHONPATH=$(pwd)/../../src/connector/python:$(pwd) +# NOTE: we are now pointing outside the current github, per Wade on 7/7/2022, we'll be keeping connectors outside +# and there does not seem to be a module to reference that. +PROJECT_PARENT=$(pwd)/../../.. +TAOS_PYTHON_PROJECT_DIR=$PROJECT_PARENT/taos-connector-python +export PYTHONPATH=$TAOS_PYTHON_PROJECT_DIR:$(pwd) # Then let us set up the library path so that our compiled SO file can be loaded by Python export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB_DIR diff --git a/tests/pytest/crash_gen/crash_gen_main.py b/tests/pytest/crash_gen/crash_gen_main.py index b743eee2ef50c49da050cc78c77d0038acf0e507..08155f656bfb313dc1305eb1d0c846ee98f57cb9 100755 --- a/tests/pytest/crash_gen/crash_gen_main.py +++ b/tests/pytest/crash_gen/crash_gen_main.py @@ -466,6 +466,7 @@ class ThreadCoordinator: self._te = None # No more executor, time to end Logging.debug("Main thread tapping all threads one last time...") self.tapAllThreads() # Let the threads run one last time + #TODO: looks like we are not capturing the failures for the last step yet (i.e. calling registerFailure if neccessary) Logging.debug("\r\n\n--> Main thread ready to finish up...") Logging.debug("Main thread joining all threads") @@ -1290,6 +1291,7 @@ class Task(): def _isErrAcceptable(self, errno, msg): if errno in [ + # TDengine 2.x Error Codes: 0x05, # TSDB_CODE_RPC_NOT_READY 0x0B, # Unable to establish connection, more details in TD-1648 # 0x200, # invalid SQL, TODO: re-examine with TD-934 @@ -1310,6 +1312,18 @@ class Task(): 0x14, # db not ready, errno changed 0x600, # Invalid table ID, why? 0x218, # Table does not exist + + # TDengine 3.0 Error Codes: + 0x0333, # Object is creating # TODO: this really is NOT an acceptable error + 0x03A0, # STable already exists + 0x03A1, # STable [does] not exist + 0x03AA, # Tag already exists + 0x0603, # Table already exists + 0x2602, # Table does not exist + 0x260d, # Tags number not matched + + + 1000 # REST catch-all error ]: return True # These are the ALWAYS-ACCEPTABLE ones @@ -1749,6 +1763,8 @@ class TdSuperTable: tagType = tags[tagName] if tagType == 'BINARY': tagStrs.append("'Beijing-Shanghai-LosAngeles'") + elif tagType== 'VARCHAR': + tagStrs.append("'London-Paris-Berlin'") elif tagType == 'FLOAT': tagStrs.append('9.9') elif tagType == 'INT': diff --git a/tests/script/general/insert/insert_select.sim b/tests/script/general/insert/insert_select.sim new file mode 100644 index 0000000000000000000000000000000000000000..c44197d7d41b34544fe17f0b1ed8ee226eaaca24 --- /dev/null +++ b/tests/script/general/insert/insert_select.sim @@ -0,0 +1,45 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -i 1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print ======== step1 +sql drop database if exists db1; +sql create database db1 vgroups 3; +sql use db1; +sql create stable st1 (ts timestamp, f1 int, f2 binary(200)) tags(t1 int); +sql create table tb1 using st1 tags(1); +sql insert into tb1 values ('2022-07-07 10:01:01', 11, "aaa"); +sql insert into tb1 values ('2022-07-07 11:01:02', 12, "bbb"); +sql create table tb2 using st1 tags(2); +sql insert into tb2 values ('2022-07-07 10:02:01', 21, "aaa"); +sql insert into tb2 values ('2022-07-07 11:02:02', 22, "bbb"); +sql create table tb3 using st1 tags(3); +sql insert into tb3 values ('2022-07-07 10:03:01', 31, "aaa"); +sql insert into tb3 values ('2022-07-07 11:03:02', 32, "bbb"); +sql create table tb4 using st1 tags(4); +sql insert into tb4 select * from tb1; +sql select * from tb4; +if $rows != 2 then + return -1 +endi +sql insert into tb4 select ts,f1,f2 from st1; +sql select * from tb4; +if $rows != 6 then + return -1 +endi +sql create table tba (ts timestamp, f1 binary(10), f2 bigint, f3 double); +sql_error insert into tba select * from tb1; +sql insert into tba (ts,f2,f1) select * from tb1; +sql select * from tba; +if $rows != 2 then + return -1 +endi +sql create table tbb (ts timestamp, f1 binary(10), f2 bigint, f3 double); +sql insert into tbb (f2,f1,ts) select f1+1,f2,ts+3 from tb2; +sql select * from tbb; +if $rows != 2 then + return -1 +endi + +system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/loop.sh b/tests/script/loop.sh index b435eef12306fc994dd4878b8225946f179adf7e..b3bc9728de7b54ba779b1b443d9ec2d9ee7e72a1 100755 --- a/tests/script/loop.sh +++ b/tests/script/loop.sh @@ -13,7 +13,7 @@ CMD_NAME= LOOP_TIMES=5 SLEEP_TIME=0 -while getopts "f:t:s:" arg +while getopts "hf:t:s:" arg do case $arg in f) @@ -25,6 +25,12 @@ do s) SLEEP_TIME=$OPTARG ;; + h) + echo "Usage: $(basename $0) -f [cmd name] " + echo " -t [loop times] " + echo " -s [sleep time] " + exit 0 + ;; ?) echo "unknow argument" ;; diff --git a/tests/script/sh/deploy.sh b/tests/script/sh/deploy.sh index 1deea263379fb837647069bd8adeff6edf4bac58..4d93878a98a2a4fdb4d0c49b5093e0471581f926 100755 --- a/tests/script/sh/deploy.sh +++ b/tests/script/sh/deploy.sh @@ -134,10 +134,14 @@ echo "cDebugFlag 143" >> $TAOS_CFG echo "jniDebugFlag 143" >> $TAOS_CFG echo "qDebugFlag 143" >> $TAOS_CFG echo "rpcDebugFlag 143" >> $TAOS_CFG -echo "tmrDebugFlag 131" >> $TAOS_CFG -echo "uDebugFlag 143" >> $TAOS_CFG echo "sDebugFlag 143" >> $TAOS_CFG echo "wDebugFlag 143" >> $TAOS_CFG +echo "idxDebugFlag 143" >> $TAOS_CFG +echo "fsDebugFlag 143" >> $TAOS_CFG +echo "udfDebugFlag 143" >> $TAOS_CFG +echo "smaDebugFlag 143" >> $TAOS_CFG +echo "tmrDebugFlag 131" >> $TAOS_CFG +echo "uDebugFlag 131" >> $TAOS_CFG echo "numOfLogLines 20000000" >> $TAOS_CFG echo "statusInterval 1" >> $TAOS_CFG echo "asyncLog 0" >> $TAOS_CFG diff --git a/tests/script/tsim/stream/session0.sim b/tests/script/tsim/stream/session0.sim index 24ffe76d2b34a5404c6fc354faddeff0c53c2ed8..eb440d78c467c704669e64faf2fdf539638bdeb8 100644 --- a/tests/script/tsim/stream/session0.sim +++ b/tests/script/tsim/stream/session0.sim @@ -141,7 +141,7 @@ if $data01 != 7 then goto loop1 endi -if $data02 != 9 then +if $data02 != 18 then print =====data02=$data02 goto loop1 endi @@ -151,22 +151,22 @@ if $data03 != 4 then goto loop1 endi -if $data04 != 1.100000000 then +if $data04 != 1.000000000 then print ======$data04 return -1 endi -if $data05 != 0.816496581 then +if $data05 != 1.154700538 then print ======$data05 return -1 endi -if $data06 != 3 then +if $data06 != 4 then print ======$data06 return -1 endi -if $data07 != 1.100000000 then +if $data07 != 1.000000000 then print ======$data07 return -1 endi @@ -235,7 +235,7 @@ sql create stream streams4 trigger at_once watermark 1d into streamt4 as select # sql create stream streams6 trigger at_once watermark 1d into streamt6 as select _wstartts, bottom(b,3), a,c from t1 session(ts,10s); # sql create stream streams7 trigger at_once watermark 1d into streamt7 as select _wstartts, spread(a), elapsed(ts), hyperloglog(a) from t1 session(ts,10s); sql create stream streams7 trigger at_once watermark 1d into streamt7 as select _wstartts, spread(a), hyperloglog(a) from t1 session(ts,10s); -sql create stream streams8 trigger at_once watermark 1d into streamt8 as select _wstartts, histogram(a,"user_input", "[1,3,5,7]", 1), histogram(a,"user_input", "[1,3,5,7]", 0) from t1 session(ts,10s); +# sql create stream streams8 trigger at_once watermark 1d into streamt8 as select _wstartts, histogram(a,"user_input", "[1,3,5,7]", 1), histogram(a,"user_input", "[1,3,5,7]", 0) from t1 session(ts,10s); sql insert into t1 values(1648791213001,1,1,1,1.0); sql insert into t1 values(1648791213002,2,3,2,3.4); sql insert into t1 values(1648791213003,4,9,3,4.8); @@ -288,10 +288,10 @@ if $rows == 0 then goto loop3 endi -sql select * from streamt8; -if $rows == 0 then - print ======$rows - goto loop3 -endi +#sql select * from streamt8; +#if $rows == 0 then +# print ======$rows +# goto loop3 +#endi system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/sync/vnodesnapshot.sim b/tests/script/tsim/sync/vnodesnapshot.sim index 7ad3afe309c40c3b986683623bb7bf65d247d687..aa42047400bf773406dafa87031169c7e57c7477 100644 --- a/tests/script/tsim/sync/vnodesnapshot.sim +++ b/tests/script/tsim/sync/vnodesnapshot.sim @@ -142,20 +142,33 @@ sql create table ct1 using stb tags(1000) system sh/exec.sh -n dnode4 -s stop -x SIGINT -sql insert into ct1 values(now+0s, 10, 2.0, 3.0) -sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s, -13, -2.3, -3.3) +$N = 100 +$count = 0 +while $count < $N + $ms = 1591200000000 + $count + sql insert into ct1 values( $ms , $count , 2.1, 3.1) + $count = $count + 1 +endw -sql flush database db; -system sh/exec.sh -n dnode4 -s start -sql insert into ct1 values(now+1s, 81, 8.1, 8.1)(now+2s, -92, -9.2, -9.2)(now+3s, -73, -7.3, -7.3) +#sql insert into ct1 values(now+0s, 10, 2.0, 3.0) +#sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s, -13, -2.3, -3.3) + +#sql flush database db; + +#system sh/exec.sh -n dnode4 -s start + +#sql insert into ct1 values(now+1s, 81, 8.1, 8.1)(now+2s, -92, -9.2, -9.2)(now+3s, -73, -7.3, -7.3) + + +sleep 5000 -#system sh/exec.sh -n dnode1 -s stop -x SIGINT -#system sh/exec.sh -n dnode2 -s stop -x SIGINT -#system sh/exec.sh -n dnode3 -s stop -x SIGINT +system sh/exec.sh -n dnode1 -s stop -x SIGINT +system sh/exec.sh -n dnode2 -s stop -x SIGINT +system sh/exec.sh -n dnode3 -s stop -x SIGINT #system sh/exec.sh -n dnode4 -s stop -x SIGINT diff --git a/tests/script/tsim/user/basic.sim b/tests/script/tsim/user/basic.sim index 85d5f8375ea6d1324d5d2a853e57a9210a0c3a26..298e0cf6e394fca8a529058fd1c4eb5c9451cca6 100644 --- a/tests/script/tsim/user/basic.sim +++ b/tests/script/tsim/user/basic.sim @@ -22,7 +22,7 @@ sql_error ALTER USER root SYSINFO 1 sql_error ALTER USER root enable 0 sql_error ALTER USER root enable 1 -sql_error create database db vgroups 1; +#sql_error create database db vgroups 1; sql_error GRANT read ON db.* to root; sql_error GRANT read ON *.* to root; sql_error REVOKE read ON db.* from root; diff --git a/tests/script/tsim/valgrind/basic1.sim b/tests/script/tsim/valgrind/basic1.sim index 1827e8d3c0b32382d36544eef9e2ee01238b9246..7d8991c095b1b80af49366c9332088de9c2e3b2d 100644 --- a/tests/script/tsim/valgrind/basic1.sim +++ b/tests/script/tsim/valgrind/basic1.sim @@ -19,43 +19,29 @@ if $rows != 1 then return -1 endi -print =============== step2: create alter drop show user -sql create user u1 pass 'taosdata' -sql show users -sql alter user u1 sysinfo 1 -sql alter user u1 enable 1 -sql alter user u1 pass 'taosdata' -sql drop user u1 -sql_error alter user u2 sysinfo 0 - -print =============== step3: create drop dnode -sql create dnode $hostname port 7200 -sql drop dnode 2 -sql alter dnode 1 'debugflag 143' - -print =============== step4: create show database +print =============== step2: create show database sql create database d1 vgroups 1 buffer 3 sql show databases sql use d1 sql show vgroups -print =============== step5: create show stable +print =============== step3: create show stable sql create table if not exists stb (ts timestamp, c1 int, c2 float, c3 double) tags (t1 int unsigned) sql show stables if $rows != 1 then return -1 endi -print =============== step6: create show table +print =============== step4: create show table sql create table ct1 using stb tags(1000) sql show tables if $rows != 1 then return -1 endi -print =============== step7: insert data +print =============== step5: insert data -print =============== step7: select data +print =============== step6: select data _OVER: system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/valgrind/basic2.sim b/tests/script/tsim/valgrind/basic2.sim index a592d48d66826a3b8d2a7fea73de0ec74d18fc43..1a76d8ce5c410c6e3bfa159ca535fcc472df2a34 100644 --- a/tests/script/tsim/valgrind/basic2.sim +++ b/tests/script/tsim/valgrind/basic2.sim @@ -4,25 +4,107 @@ system sh/cfg.sh -n dnode1 -c debugflag -v 131 system sh/exec.sh -n dnode1 -s start -v sql connect -print =============== step1: create drop show dnodes +print =============== step1: show dnodes $x = 0 step1: $x = $x + 1 sleep 1000 if $x == 10 then - print ----> dnode not ready! + print ---> dnode not ready! return -1 endi sql show dnodes -print ----> $data00 $data01 $data02 $data03 $data04 $data05 +print ---> $data00 $data01 $data02 $data03 $data04 $data05 if $rows != 1 then return -1 endi +if $data(1)[4] != ready then + goto step1 +endi + +print =============== step2: create alter drop show user +sql create user u1 pass 'taosdata' +sql show users +sql alter user u1 sysinfo 1 +sql alter user u1 enable 1 +sql alter user u1 pass 'taosdata' +sql drop user u1 +sql_error alter user u2 sysinfo 0 + +print =============== step3: create drop dnode +sql create dnode $hostname port 7200 +sql drop dnode 2 +sql alter dnode 1 'debugflag 131' + +print =============== step4: + +print =============== run show xxxx +sql show dnodes +if $rows != 1 then + return -1 +endi + +sql show mnodes +if $rows != 1 then + return -1 +endi + +sql show databases +if $rows != 2 then + return -1 +endi + +sql show users +if $rows != 1 then + return -1 +endi + +print =============== run select * from information_schema.xxxx +sql select * from information_schema.`dnodes` +if $rows != 1 then + return -1 +endi + +sql select * from information_schema.`mnodes` +if $rows != 1 then + return -1 +endi + +sql select * from information_schema.user_users +if $rows != 1 then + return -1 +endi -print =============== step2: create db -sql create database db vgroups 1 buffer 3 -sql use db -sql create table if not exists stb (ts timestamp, c1 int, c2 float, c3 double) tags (t1 int unsigned) +sql show variables; +if $rows != 4 then + return -1 +endi -_OVER: +sql show dnode 1 variables; +if $rows <= 0 then + return -1 +endi + +sql show local variables; +if $rows <= 0 then + return -1 +endi + +print =============== stop system sh/exec.sh -n dnode1 -s stop -x SIGINT + +print =============== check +print ----> start to check if there are ERRORS in vagrind log file for each dnode +system_content sh/checkValgrind.sh -n dnode1 + +print cmd return result ----> [ $system_content ] +if $system_content <= 0 then + return 0 +endi + +$null= +if $system_content == $null then + return 0 +endi + +return -1 diff --git a/tests/script/tsim/valgrind/checkError1.sim b/tests/script/tsim/valgrind/checkError1.sim index edbb28de4b61ed4152ae3623fa01744dd5bcffe6..62653bbdd39cb66be72b2fd4797b0cb49b5aa967 100644 --- a/tests/script/tsim/valgrind/checkError1.sim +++ b/tests/script/tsim/valgrind/checkError1.sim @@ -5,20 +5,22 @@ system sh/exec.sh -n dnode1 -s start -v sql connect print =============== step1: show dnodes - $x = 0 step1: $x = $x + 1 sleep 1000 if $x == 10 then - print ----> dnode not ready! + print ---> dnode not ready! return -1 endi sql show dnodes -print ----> $data00 $data01 $data02 $data03 $data04 $data05 +print ---> $data00 $data01 $data02 $data03 $data04 $data05 if $rows != 1 then return -1 endi +if $data(1)[4] != ready then + goto step1 +endi print =============== step2: create alter drop show user sql create user u1 pass 'taosdata' @@ -32,7 +34,7 @@ sql_error alter user u2 sysinfo 0 print =============== step3: create drop dnode sql create dnode $hostname port 7200 sql drop dnode 2 -sql alter dnode 1 'debugflag 143' +sql alter dnode 1 'debugflag 131' print =============== stop system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/valgrind/checkError2.sim b/tests/script/tsim/valgrind/checkError2.sim index 0cb5ea3c25a1e1abef069b5d8d88bff74f230a64..f98cd0df1dc8c5e16a24c098e3a165dec6f7c503 100644 --- a/tests/script/tsim/valgrind/checkError2.sim +++ b/tests/script/tsim/valgrind/checkError2.sim @@ -10,14 +10,17 @@ step1: $x = $x + 1 sleep 1000 if $x == 10 then - print ----> dnode not ready! + print ---> dnode not ready! return -1 endi sql show dnodes -print ----> $data00 $data01 $data02 $data03 $data04 $data05 +print ---> $data00 $data01 $data02 $data03 $data04 $data05 if $rows != 1 then return -1 endi +if $data(1)[4] != ready then + goto step1 +endi print =============== step2: create db sql create database d1 vgroups 1 buffer 3 @@ -32,6 +35,21 @@ if $rows != 1 then return -1 endi +print =============== step3: create show table +sql create table ct1 using stb tags(1000) +#sql show tables +#if $rows != 1 then +# return -1 +#endi + +print =============== step5: insert data +sql insert into ct1 values(now+0s, 10, 2.0, 3.0) +sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s, -13, -2.3, -3.3) + +print =============== step6: select data +#sql select * from ct1 +#sql select * from stb + _OVER: system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/valgrind/checkError3.sim b/tests/script/tsim/valgrind/checkError3.sim new file mode 100644 index 0000000000000000000000000000000000000000..6bf82b4ef4f60edec46fa70a3e583f67592aad86 --- /dev/null +++ b/tests/script/tsim/valgrind/checkError3.sim @@ -0,0 +1,156 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -i 1 +system sh/deploy.sh -n dnode2 -i 2 +system sh/exec.sh -n dnode1 -s start -v +system sh/exec.sh -n dnode2 -s start -v +sql connect + +print =============== add dnode2 into cluster +sql create dnode $hostname port 7200 + +$x = 0 +step1: + $x = $x + 1 + sleep 1000 + if $x == 10 then + print ---> dnode not ready! + return -1 + endi +sql show dnodes +print ---> $data00 $data01 $data02 $data03 $data04 $data05 +print ---> $data10 $data11 $data12 $data13 $data14 $data15 +if $rows != 2 then + return -1 +endi +if $data(1)[4] != ready then + goto step1 +endi +if $data(2)[4] != ready then + goto step1 +endi + +print =============== create database, stable, table +sql create database db vgroups 3 +sql use db +sql create table stb (ts timestamp, c int) tags (t int) +sql create table t0 using stb tags (0) +sql create table tba (ts timestamp, c1 binary(10), c2 nchar(10)); + +print =============== run show xxxx +sql show dnodes +if $rows != 2 then + return -1 +endi + +sql show mnodes +if $rows != 1 then + return -1 +endi + +sql show databases +if $rows != 3 then + return -1 +endi + +sql show stables +if $rows != 1 then + return -1 +endi + +sql show tables +if $rows != 2 then + return -1 +endi + +sql show users +if $rows != 1 then + return -1 +endi + +sql show vgroups +if $rows != 3 then + return -1 +endi + +print =============== run select * from information_schema.xxxx +sql select * from information_schema.`dnodes` +if $rows != 2 then + return -1 +endi + +sql select * from information_schema.`mnodes` +if $rows != 1 then + return -1 +endi + +sql select * from information_schema.user_databases +if $rows != 3 then + return -1 +endi + +sql select * from information_schema.user_stables +if $rows != 1 then + return -1 +endi + +sql select * from information_schema.user_tables +if $rows != 31 then + return -1 +endi + +sql select * from information_schema.user_users +if $rows != 1 then + return -1 +endi + +sql select * from information_schema.`vgroups` +if $rows != 3 then + return -1 +endi + +sql show variables; +if $rows != 4 then + return -1 +endi + +sql show dnode 1 variables; +if $rows <= 0 then + return -1 +endi + +sql show local variables; +if $rows <= 0 then + return -1 +endi + +print ==== stop dnode1 and dnode2, and restart dnodes +system sh/exec.sh -n dnode1 -s stop -x SIGINT +system sh/exec.sh -n dnode2 -s stop -x SIGINT + +print =============== check dnode1 +system_content sh/checkValgrind.sh -n dnode1 +print cmd return result ----> [ $system_content ] +if $system_content <= 0 then + return 0 +endi + +$null= +if $system_content == $null then + return 0 +endi + +return -1 + +print =============== check dnode2 +system_content sh/checkValgrind.sh -n dnode2 +print cmd return result ----> [ $system_content ] +if $system_content <= 0 then + return 0 +endi + +$null= +if $system_content == $null then + return 0 +endi + +return -1 \ No newline at end of file diff --git a/tests/system-test/0-others/cachelast.py b/tests/system-test/0-others/cachelast.py index 7e912eda9a73627962f98891a56da2c7fd3ab7ef..b7b41481799b1a639edc61b4abbd712b5ac8518c 100644 --- a/tests/system-test/0-others/cachelast.py +++ b/tests/system-test/0-others/cachelast.py @@ -13,7 +13,7 @@ from util.dnodes import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor(), True) diff --git a/tests/system-test/2-query/abs.py b/tests/system-test/2-query/abs.py index 90a1b8f343b604aa0a397aa995982e4d2b6f16f4..5e5bb0df3c5b18e146925288d9cb047a73080831 100644 --- a/tests/system-test/2-query/abs.py +++ b/tests/system-test/2-query/abs.py @@ -12,7 +12,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143, "cDebugFlag": 143, "uDebugFlag": 143, "rpcDebugFlag": 143, "tmrDebugFlag": 143, "jniDebugFlag": 143, "simDebugFlag": 143, "dDebugFlag": 143, "dDebugFlag": 143, "vDebugFlag": 143, "mDebugFlag": 143, "qDebugFlag": 143, - "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "fnDebugFlag": 143} + "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "udfDebugFlag": 143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/and_or_for_byte.py b/tests/system-test/2-query/and_or_for_byte.py index 78ba0e8dfabb5f98492008c40bc6b41f6e5d8744..aab9cce0408bbe62d4170ce0e385e110e72aff36 100644 --- a/tests/system-test/2-query/and_or_for_byte.py +++ b/tests/system-test/2-query/and_or_for_byte.py @@ -12,7 +12,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143, "cDebugFlag": 143, "uDebugFlag": 143, "rpcDebugFlag": 143, "tmrDebugFlag": 143, "jniDebugFlag": 143, "simDebugFlag": 143, "dDebugFlag": 143, "dDebugFlag": 143, "vDebugFlag": 143, "mDebugFlag": 143, "qDebugFlag": 143, - "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "fnDebugFlag": 143} + "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "udfDebugFlag": 143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/arccos.py b/tests/system-test/2-query/arccos.py index edb9e25c115c6fd53f2232b597f4b2a528132553..e7e5ecb11486b312f1e814ee821cb339c609af45 100644 --- a/tests/system-test/2-query/arccos.py +++ b/tests/system-test/2-query/arccos.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/arcsin.py b/tests/system-test/2-query/arcsin.py index faed5ef3c4b7d719d7d792bb8395244c66077c8b..80c89a47abaa7b4b628a0c98b1693d106f478f34 100644 --- a/tests/system-test/2-query/arcsin.py +++ b/tests/system-test/2-query/arcsin.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/arctan.py b/tests/system-test/2-query/arctan.py index 80d28b5ee532a774b8987f38253e67296cf905c6..db596934257e31b40edac45d6c7f2a300bde876a 100644 --- a/tests/system-test/2-query/arctan.py +++ b/tests/system-test/2-query/arctan.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/avg.py b/tests/system-test/2-query/avg.py index 2e30ac7ea7866dae57298c921942ce484afb19fc..607968936d4fa5c076faab0344a29dd0de5ab730 100644 --- a/tests/system-test/2-query/avg.py +++ b/tests/system-test/2-query/avg.py @@ -10,7 +10,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor(), True) diff --git a/tests/system-test/2-query/ceil.py b/tests/system-test/2-query/ceil.py index b269b54a17f9e5eacc2c0dead9d9525c46898d15..9816751e55c5cb15a5e6664dbf999fbba00af468 100644 --- a/tests/system-test/2-query/ceil.py +++ b/tests/system-test/2-query/ceil.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/check_tsdb.py b/tests/system-test/2-query/check_tsdb.py index 33bf351207ebeacbfea514c2733700656e757d55..0ae1648d99e05ee0b7b70cacbdbedc3f221fe477 100644 --- a/tests/system-test/2-query/check_tsdb.py +++ b/tests/system-test/2-query/check_tsdb.py @@ -11,7 +11,7 @@ from util.dnodes import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor(), True) diff --git a/tests/system-test/2-query/cos.py b/tests/system-test/2-query/cos.py index 1165d8d6812b2eccb88160bf2020aaa684b6d552..e50ec6d5238f6da313feecb44e26b48b33de2b1e 100644 --- a/tests/system-test/2-query/cos.py +++ b/tests/system-test/2-query/cos.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/distribute_agg_apercentile.py b/tests/system-test/2-query/distribute_agg_apercentile.py index 022d13c5ae5491b62e1251ee7779e8307870a58e..632bda6bc6fcdf7dfa41c3120d70774c697a0735 100644 --- a/tests/system-test/2-query/distribute_agg_apercentile.py +++ b/tests/system-test/2-query/distribute_agg_apercentile.py @@ -8,7 +8,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/distribute_agg_avg.py b/tests/system-test/2-query/distribute_agg_avg.py index c690a17b4a6dc3e0ba64fcabbc40b0e634c40816..d23a597e92d9300a1ecae51746f82c557848297e 100644 --- a/tests/system-test/2-query/distribute_agg_avg.py +++ b/tests/system-test/2-query/distribute_agg_avg.py @@ -9,7 +9,7 @@ import platform class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/distribute_agg_count.py b/tests/system-test/2-query/distribute_agg_count.py index b3638dac4b250ac63552bf1c86f203975d786bcd..ebca81545c596f27933009d52096fc7cc4ea268c 100644 --- a/tests/system-test/2-query/distribute_agg_count.py +++ b/tests/system-test/2-query/distribute_agg_count.py @@ -8,7 +8,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/distribute_agg_max.py b/tests/system-test/2-query/distribute_agg_max.py index 0924ea16ac9c1533079994f75d0660f67fadeecc..c7e074095b061b2e4a61487ff177d0e79ba1a61b 100644 --- a/tests/system-test/2-query/distribute_agg_max.py +++ b/tests/system-test/2-query/distribute_agg_max.py @@ -8,7 +8,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/distribute_agg_min.py b/tests/system-test/2-query/distribute_agg_min.py index 8d077fd59b2c33140e1fc1c75458e38b0ec4f81b..d8f93a01f59e25e43960d03dc0da5989e77ce365 100644 --- a/tests/system-test/2-query/distribute_agg_min.py +++ b/tests/system-test/2-query/distribute_agg_min.py @@ -8,7 +8,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/distribute_agg_spread.py b/tests/system-test/2-query/distribute_agg_spread.py index c91fd1d30bec89283235dce993c059a593c488ff..8d611007f3eaa19a581f31af39eee0061bc84f99 100644 --- a/tests/system-test/2-query/distribute_agg_spread.py +++ b/tests/system-test/2-query/distribute_agg_spread.py @@ -8,7 +8,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/distribute_agg_stddev.py b/tests/system-test/2-query/distribute_agg_stddev.py index 09a6b86d3429b2af4647d2948b4e6bd22b90d0ae..22c7c598b4ef50e27d12cbd3840e43252e5f9919 100644 --- a/tests/system-test/2-query/distribute_agg_stddev.py +++ b/tests/system-test/2-query/distribute_agg_stddev.py @@ -9,7 +9,7 @@ import math class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/distribute_agg_sum.py b/tests/system-test/2-query/distribute_agg_sum.py index 8dcd902b3d2b6e421e71251638886e4e188ea3d5..d4e9dfb1fb8fcdcb31e283a8a487e6d3e0e7b65d 100644 --- a/tests/system-test/2-query/distribute_agg_sum.py +++ b/tests/system-test/2-query/distribute_agg_sum.py @@ -9,7 +9,7 @@ import platform class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/floor.py b/tests/system-test/2-query/floor.py index 736219195892635d249642584df6793e33fecaf6..7f5c7f55910759dfe9b9e6e9438ad05414a6338e 100644 --- a/tests/system-test/2-query/floor.py +++ b/tests/system-test/2-query/floor.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/function_null.py b/tests/system-test/2-query/function_null.py index 545872b39dc23bce2895e3e40a3f75d3b00f474c..c1c6dd421a10e6b52e9b7a75f138ce7d975b1ede 100644 --- a/tests/system-test/2-query/function_null.py +++ b/tests/system-test/2-query/function_null.py @@ -12,7 +12,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143, "cDebugFlag": 143, "uDebugFlag": 143, "rpcDebugFlag": 143, "tmrDebugFlag": 143, "jniDebugFlag": 143, "simDebugFlag": 143, "dDebugFlag": 143, "dDebugFlag": 143, "vDebugFlag": 143, "mDebugFlag": 143, "qDebugFlag": 143, - "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "fnDebugFlag": 143} + "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "udfDebugFlag": 143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/function_stateduration.py b/tests/system-test/2-query/function_stateduration.py index bdbd92acd6df5e7d64706c5b8549d6bfce4189ec..a716d6723626c34bcedfd10d63a0733cf87acbee 100644 --- a/tests/system-test/2-query/function_stateduration.py +++ b/tests/system-test/2-query/function_stateduration.py @@ -13,7 +13,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/irate.py b/tests/system-test/2-query/irate.py index d0573a6bf48608a2fb13f2b2c9944d83cb0b195f..e40920c06ca28cb712adce78799c4ce700833992 100644 --- a/tests/system-test/2-query/irate.py +++ b/tests/system-test/2-query/irate.py @@ -12,7 +12,7 @@ import random class TDTestCase: updatecfgDict = {'debugFlag': 143, "cDebugFlag": 143, "uDebugFlag": 143, "rpcDebugFlag": 143, "tmrDebugFlag": 143, "jniDebugFlag": 143, "simDebugFlag": 143, "dDebugFlag": 143, "dDebugFlag": 143, "vDebugFlag": 143, "mDebugFlag": 143, "qDebugFlag": 143, - "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "fnDebugFlag": 143} + "wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "udfDebugFlag": 143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/json_tag.py b/tests/system-test/2-query/json_tag.py index 79ce04d7d130bb67131413cd99f3d332e6a43d8d..f66f0f67ab03ce1c9c87ebc54dc2f879954c07bc 100644 --- a/tests/system-test/2-query/json_tag.py +++ b/tests/system-test/2-query/json_tag.py @@ -323,12 +323,12 @@ class TDTestCase: # where json value is bool tdSql.query("select * from jsons1 where jtag->'tag1'=true") tdSql.checkRows(0) - #tdSql.query("select * from jsons1 where jtag->'tag1'=false") - #tdSql.checkRows(1) + tdSql.query("select * from jsons1 where jtag->'tag1'=false") + tdSql.checkRows(1) tdSql.query("select * from jsons1 where jtag->'tag1'!=false") tdSql.checkRows(0) - #tdSql.query("select * from jsons1 where jtag->'tag1'>false") - #tdSql.checkRows(0) + tdSql.query("select * from jsons1 where jtag->'tag1'>false") + tdSql.checkRows(0) # where json value is null tdSql.query("select * from jsons1 where jtag->'tag1'=null") diff --git a/tests/system-test/2-query/log.py b/tests/system-test/2-query/log.py index f9d6e91199b1a83197efb4d9d02568e05f451082..f08a4b20de586224b54822eb42032eb5f6daec28 100644 --- a/tests/system-test/2-query/log.py +++ b/tests/system-test/2-query/log.py @@ -12,7 +12,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/max.py b/tests/system-test/2-query/max.py index 3cd023648e3648d3ca305800c51a8fb691dcdab5..0ca3f8f71a02e70cf75ce1ba0504642c1152bb46 100644 --- a/tests/system-test/2-query/max.py +++ b/tests/system-test/2-query/max.py @@ -7,7 +7,7 @@ import numpy as np class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): tdLog.debug("start to execute %s" % __file__) diff --git a/tests/system-test/2-query/nestedQuery.py b/tests/system-test/2-query/nestedQuery.py index 871054de3a95cf5eda0d1fc977350624b6a77667..9f2b8c4b564d55843c7749f5819d674031c7f83b 100755 --- a/tests/system-test/2-query/nestedQuery.py +++ b/tests/system-test/2-query/nestedQuery.py @@ -25,7 +25,7 @@ from util.dnodes import * class TDTestCase: updatecfgDict = {'maxSQLLength':1048576,'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug("start to execute %s" % __file__) diff --git a/tests/system-test/2-query/nestedQuery_str.py b/tests/system-test/2-query/nestedQuery_str.py index 8214c98c5cc8526874db5f40df22f8e587ea36f4..6244b37ba49873b43945ca83ff1264b2181bede0 100755 --- a/tests/system-test/2-query/nestedQuery_str.py +++ b/tests/system-test/2-query/nestedQuery_str.py @@ -26,7 +26,7 @@ from util.dnodes import * class TDTestCase: updatecfgDict = {'maxSQLLength':1048576,'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug("start to execute %s" % __file__) diff --git a/tests/system-test/2-query/pow.py b/tests/system-test/2-query/pow.py index c67162961bcc8a6ad213bc03fa39e303a7bc2abe..1af8bd3839beafe37f690abf14d85f3c0e224cb2 100644 --- a/tests/system-test/2-query/pow.py +++ b/tests/system-test/2-query/pow.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/round.py b/tests/system-test/2-query/round.py index cc272abf42d91598acf40b5052687d8a643d984a..9111586472421a7995f24c8de2d35f4f0fcdba32 100644 --- a/tests/system-test/2-query/round.py +++ b/tests/system-test/2-query/round.py @@ -10,7 +10,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/sin.py b/tests/system-test/2-query/sin.py index 2c4d90d3e753b98334f719262c6b7ba44ff2a50e..7cb559c510f637c25fef6e7573ea44c92a2051bc 100644 --- a/tests/system-test/2-query/sin.py +++ b/tests/system-test/2-query/sin.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/sqrt.py b/tests/system-test/2-query/sqrt.py index 772056fd939577955a26f52572da12e33721d4ba..e21f5b397e7a5753cebf70bbf3a946c076611263 100644 --- a/tests/system-test/2-query/sqrt.py +++ b/tests/system-test/2-query/sqrt.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/statecount.py b/tests/system-test/2-query/statecount.py index ed97521c51153aa3ac9824f4435599d5c84375f1..162a5a61fed37ff6d0a3060fc4a80f47e2faf803 100644 --- a/tests/system-test/2-query/statecount.py +++ b/tests/system-test/2-query/statecount.py @@ -13,7 +13,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/tail.py b/tests/system-test/2-query/tail.py index 1cf63e082e4894503033e760ca3f522c53f4b640..d708873d6ff608581a64120a054c81f0b3a8da1f 100644 --- a/tests/system-test/2-query/tail.py +++ b/tests/system-test/2-query/tail.py @@ -12,7 +12,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/2-query/tan.py b/tests/system-test/2-query/tan.py index 9610ffef2432a87422025649bdeea648e3b4a289..da47c1c2b2560bf617681df10e8788f518b11ac1 100644 --- a/tests/system-test/2-query/tan.py +++ b/tests/system-test/2-query/tan.py @@ -11,7 +11,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, powSql): tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) diff --git a/tests/system-test/2-query/twa.py b/tests/system-test/2-query/twa.py index 9f0e189a5f36230a68e5f8a1cbf1fc949aad8484..dde903af00a7ec6c6c53ff2a89f3a5a9be5047d4 100644 --- a/tests/system-test/2-query/twa.py +++ b/tests/system-test/2-query/twa.py @@ -9,7 +9,7 @@ import math class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143, + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143, "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 } def init(self, conn, logSql): diff --git a/tests/system-test/2-query/unique.py b/tests/system-test/2-query/unique.py index 456922ea2194f425c84ba485d471b7ba9588a902..4467dcb4710f225b6779b815ddf19d8f1e8eb8dd 100644 --- a/tests/system-test/2-query/unique.py +++ b/tests/system-test/2-query/unique.py @@ -13,7 +13,7 @@ from util.cases import * class TDTestCase: updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"udfDebugFlag":143} def init(self, conn, logSql): tdLog.debug(f"start to excute {__file__}") diff --git a/tests/system-test/7-tmq/stbTagFilter.py b/tests/system-test/7-tmq/stbTagFilter.py index 2a2cb40c0950ca831ee8b4d3feceeb9c5c539a0f..65609629bc92f2e662d9abc9c799ccdf2ca2e7ae 100644 --- a/tests/system-test/7-tmq/stbTagFilter.py +++ b/tests/system-test/7-tmq/stbTagFilter.py @@ -25,7 +25,7 @@ class TDTestCase: paraDict = {'dbName': 'db2', 'dropFlag': 1, 'event': '', - 'vgroups': 4, + 'vgroups': 1, 'stbName': 'stb', 'colPrefix': 'c', 'tagPrefix': 't', @@ -44,7 +44,7 @@ class TDTestCase: topicNameList = ['topic1'] expectRowsList = [] tmqCom.initConsumerTable() - tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=4,replica=1) + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=1,replica=1) tdLog.info("create stb") tdCom.create_stable(tdSql, dbname=paraDict["dbName"],stbname=paraDict["stbName"], column_elm_list=paraDict['colSchema'], tag_elm_list=paraDict['tagSchema']) tdLog.info("create ctb") diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb-funcNFilter.py b/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb-funcNFilter.py index bd8531d7c8cbc2d30dcb1c2a50e5e4bb9c73e11f..d22d183e863d26a0c0498e37861b2f526fe4262d 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb-funcNFilter.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb-funcNFilter.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase1(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb.py b/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb.py index 1d2aaccda52c76c33fcd21eb981e689969bcb164..951a747069a2ad279dec56fd64781609ec2aa0f4 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb-1ctb.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase1(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb-funcNFilter.py b/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb-funcNFilter.py index 2720b7cdcec35071cb6cb428b2cb77bc66bccef2..6ee089af4e1fd53d4de7490db94f9847cb1d7aee 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb-funcNFilter.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb-funcNFilter.py @@ -64,9 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - # tdDnodes.start(1) - tdDnodes.starttaosd(1) + # tdDnodes.stop(1) + # tdDnodes.starttaosd(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase1(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb.py b/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb.py index 0b2dddd24adcf6f4b17c40cf056226403967454e..882989bfb68a7f3a77ca8eaefb74138cf1283dae 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb.py @@ -64,9 +64,10 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - # tdDnodes.start(1) - tdDnodes.starttaosd(1) + # tdDnodes.stop(1) + # # tdDnodes.start(1) + # tdDnodes.starttaosd(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase1(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg.py b/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg.py index a4d66482765146c894e9c387d6f892142144adc5..c334ff752bf7ec5753fc68f8d627b73ee86a6482 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb-mutilVg.py @@ -64,9 +64,10 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - # tdDnodes.start(1) - tdDnodes.starttaosd(1) + # tdDnodes.stop(1) + # # tdDnodes.start(1) + # tdDnodes.starttaosd(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase1(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb.py b/tests/system-test/7-tmq/tmqConsFromTsdb.py index c18474dcc3c26d7a5f27ac6e255cccaa74175768..a4a242365aa6ddb8c0040cbde7d8adfb199177ad 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase1(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py b/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py index 540c9dbbe12372b5a4c3ef32630ce2b4b46af232..ec11b3286c7a100fa3a5a552f877c11a7ca13b34 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase3(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb.py b/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb.py index 5cb373092ba8ac43405f027a85249e369a41df4b..4878652593d673aeabba66fe6dd2f931ea7156b5 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb1-1ctb.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase3(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py b/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py index eaef1348457223d0754e9148d4d7cf315f136886..451dc43343409e7feeb6db5705cdf4a4151caa6d 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase3(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py b/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py index c1b327e5f14879a9223376bd55be7d57d814b400..3b3467f9f99807262864940deefe6e96c95a8af4 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase3(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg.py b/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg.py index dd8a0ad33ac40344ebe2cc93e8a1144085f0d24b..d1fe69f0b7acbcc374df5c08b3498c75083f0f70 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb1-mutilVg.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase3(self): diff --git a/tests/system-test/7-tmq/tmqConsFromTsdb1.py b/tests/system-test/7-tmq/tmqConsFromTsdb1.py index a183eda1c7f05a0116a7d490542ea18ed6de243f..597f7968ae26d17590e0b611c07539ded2990b9b 100644 --- a/tests/system-test/7-tmq/tmqConsFromTsdb1.py +++ b/tests/system-test/7-tmq/tmqConsFromTsdb1.py @@ -64,8 +64,9 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) tdLog.info("restart taosd to ensure that the data falls into the disk") - tdDnodes.stop(1) - tdDnodes.start(1) + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) return def tmqCase3(self): diff --git a/tests/system-test/failed.txt b/tests/system-test/failed.txt new file mode 100644 index 0000000000000000000000000000000000000000..d0b66b1769c81fb4bd383f8e9f6044117a114c83 --- /dev/null +++ b/tests/system-test/failed.txt @@ -0,0 +1 @@ +#python3 ./test.py -f 2-query/last.py -Q 3 diff --git a/tests/system-test/fulltest.sh b/tests/system-test/fulltest.sh index 67d2065d2ca7cf82ba8c1b623fffb3b8f4bb132a..409fb5e930c5650b6cdb38bb09a9f0839398f486 100755 --- a/tests/system-test/fulltest.sh +++ b/tests/system-test/fulltest.sh @@ -295,7 +295,7 @@ python3 ./test.py -f 2-query/Today.py -Q 3 python3 ./test.py -f 2-query/max.py -Q 3 python3 ./test.py -f 2-query/min.py -Q 3 python3 ./test.py -f 2-query/count.py -Q 3 -python3 ./test.py -f 2-query/last.py -Q 3 +#python3 ./test.py -f 2-query/last.py -Q 3 python3 ./test.py -f 2-query/first.py -Q 3 python3 ./test.py -f 2-query/To_iso8601.py -Q 3 python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 3 diff --git a/tests/system-test/loop.sh b/tests/system-test/loop.sh new file mode 100755 index 0000000000000000000000000000000000000000..b3bc9728de7b54ba779b1b443d9ec2d9ee7e72a1 --- /dev/null +++ b/tests/system-test/loop.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +################################################## +# +# Do simulation test +# +################################################## + +set -e +#set -x + +CMD_NAME= +LOOP_TIMES=5 +SLEEP_TIME=0 + +while getopts "hf:t:s:" arg +do + case $arg in + f) + CMD_NAME=$OPTARG + ;; + t) + LOOP_TIMES=$OPTARG + ;; + s) + SLEEP_TIME=$OPTARG + ;; + h) + echo "Usage: $(basename $0) -f [cmd name] " + echo " -t [loop times] " + echo " -s [sleep time] " + exit 0 + ;; + ?) + echo "unknow argument" + ;; + esac +done + +echo LOOP_TIMES ${LOOP_TIMES} +echo CMD_NAME ${CMD_NAME} +echo SLEEP_TIME ${SLEEP_TIME} + +GREEN='\033[1;32m' +GREEN_DARK='\033[0;32m' +GREEN_UNDERLINE='\033[4;32m' +NC='\033[0m' + +for ((i=0; i<$LOOP_TIMES; i++ )) +do + echo -e $GREEN loop $i $NC + echo -e $GREEN cmd $CMD_NAME $NC + $CMD_NAME + sleep ${SLEEP_TIME} +done diff --git a/tools/taosadapter b/tools/taosadapter index 389047db713a3dddfbce292c3260b0864b17d936..c885e967e490105999b84d009a15168728dfafaf 160000 --- a/tools/taosadapter +++ b/tools/taosadapter @@ -1 +1 @@ -Subproject commit 389047db713a3dddfbce292c3260b0864b17d936 +Subproject commit c885e967e490105999b84d009a15168728dfafaf