diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c7e31bfbb..90e841d5e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ endif(${BUILD_TEST}) add_subdirectory(source) add_subdirectory(tools) -add_subdirectory(tests) +add_subdirectory(utils) add_subdirectory(examples/c) # docs diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 3c7067a9f8..b905e30489 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG f169c0f + GIT_TAG a4d9b92 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/cmake/taosws_CMakeLists.txt.in b/cmake/taosws_CMakeLists.txt.in index 09a762e7cc..54e898ecc0 100644 --- a/cmake/taosws_CMakeLists.txt.in +++ b/cmake/taosws_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosws-rs ExternalProject_Add(taosws-rs GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git - GIT_TAG b91b39c + GIT_TAG 6fc47d7 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/docs/en/12-taos-sql/10-function.md b/docs/en/12-taos-sql/10-function.md index f39096cf5e..f74d0dbe5c 100644 --- a/docs/en/12-taos-sql/10-function.md +++ b/docs/en/12-taos-sql/10-function.md @@ -917,7 +917,7 @@ SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause]; **Return value type**:Same as the data type of the column being operated upon -**Applicable data types**: Numeric +**Applicable data types**: Numeric, Timestamp **Applicable table types**: standard tables and supertables @@ -932,7 +932,7 @@ SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause]; **Return value type**:Same as the data type of the column being operated upon -**Applicable data types**: Numeric +**Applicable data types**: Numeric, Timestamp **Applicable table types**: standard tables and supertables diff --git a/docs/zh/07-develop/_sub_java.mdx b/docs/zh/07-develop/_sub_java.mdx index d14b5fd609..e7de158cc8 100644 --- a/docs/zh/07-develop/_sub_java.mdx +++ b/docs/zh/07-develop/_sub_java.mdx @@ -1,7 +1,5 @@ ```java {{#include docs/examples/java/src/main/java/com/taos/example/SubscribeDemo.java}} -{{#include docs/examples/java/src/main/java/com/taos/example/MetersDeserializer.java}} -{{#include docs/examples/java/src/main/java/com/taos/example/Meters.java}} ``` ```java {{#include docs/examples/java/src/main/java/com/taos/example/MetersDeserializer.java}} diff --git a/include/common/taosdef.h b/include/common/taosdef.h index 9bfee56e29..bf4de9d4de 100644 --- a/include/common/taosdef.h +++ b/include/common/taosdef.h @@ -65,13 +65,6 @@ typedef enum { TSDB_STATIS_NONE = 1, // statis part not exist } ETsdbStatisStatus; -typedef enum { - TSDB_SMA_STAT_UNKNOWN = -1, // unknown - TSDB_SMA_STAT_OK = 0, // ready to provide service - TSDB_SMA_STAT_EXPIRED = 1, // not ready or expired - TSDB_SMA_STAT_DROPPED = 2, // sma dropped -} ETsdbSmaStat; // bit operation - typedef enum { TSDB_SMA_TYPE_BLOCK = 0, // Block-wise SMA TSDB_SMA_TYPE_TIME_RANGE = 1, // Time-range-wise SMA diff --git a/include/common/tcommon.h b/include/common/tcommon.h index 891c9ab040..37db574d98 100644 --- a/include/common/tcommon.h +++ b/include/common/tcommon.h @@ -184,7 +184,6 @@ typedef struct SQueryTableDataCond { STimeWindow twindows; int64_t startVersion; int64_t endVersion; - int64_t schemaVersion; } SQueryTableDataCond; int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock); diff --git a/include/common/tdatablock.h b/include/common/tdatablock.h index 410fa02ded..73d043b2d0 100644 --- a/include/common/tdatablock.h +++ b/include/common/tdatablock.h @@ -184,7 +184,8 @@ static FORCE_INLINE void colDataAppendDouble(SColumnInfoData* pColumnInfoData, u int32_t getJsonValueLen(const char* data); int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, bool isNull); -int32_t colDataAppendNItems(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, uint32_t numOfRows); +int32_t colDataAppendNItems(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, + uint32_t numOfRows); int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, int32_t* capacity, const SColumnInfoData* pSource, int32_t numOfRow2); int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* pSource, int32_t numOfRows, @@ -225,15 +226,16 @@ size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize); int32_t blockDataTrimFirstNRows(SSDataBlock* pBlock, size_t n); int32_t blockDataKeepFirstNRows(SSDataBlock* pBlock, size_t n); -int32_t assignOneDataBlock(SSDataBlock* dst, const SSDataBlock* src); -int32_t copyDataBlock(SSDataBlock* dst, const SSDataBlock* src); +int32_t assignOneDataBlock(SSDataBlock* dst, const SSDataBlock* src); +int32_t copyDataBlock(SSDataBlock* dst, const SSDataBlock* src); SSDataBlock* createDataBlock(); void* blockDataDestroy(SSDataBlock* pBlock); void blockDataFreeRes(SSDataBlock* pBlock); SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData); +SSDataBlock* createSpecialDataBlock(EStreamType type); -int32_t blockDataAppendColInfo(SSDataBlock* pBlock, SColumnInfoData* pColInfoData); +int32_t blockDataAppendColInfo(SSDataBlock* pBlock, SColumnInfoData* pColInfoData); SColumnInfoData createColumnInfoData(int16_t type, int32_t bytes, int16_t colId); SColumnInfoData* bdGetColumnInfoData(const SSDataBlock* pBlock, int32_t index); @@ -249,7 +251,6 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** dumpBuf); int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataBlocks, STSchema* pTSchema, int32_t vgId, tb_uid_t suid); - char* buildCtbNameByGroupId(const char* stbName, uint64_t groupId); static FORCE_INLINE int32_t blockGetEncodeSize(const SSDataBlock* pBlock) { diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 3c81551955..d826f312e5 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -785,6 +785,8 @@ typedef struct { int32_t walRollPeriod; int64_t walSegmentSize; int32_t sstTrigger; + int16_t hashPrefix; + int16_t hashSuffix; } SCreateDbReq; int32_t tSerializeSCreateDbReq(void* buf, int32_t bufLen, SCreateDbReq* pReq); @@ -1068,6 +1070,7 @@ typedef struct { typedef struct { int32_t vgId; int32_t syncState; + int64_t cacheUsage; int64_t numOfTables; int64_t numOfTimeSeries; int64_t totalStorage; @@ -1192,6 +1195,9 @@ typedef struct { int64_t walRetentionSize; int32_t walRollPeriod; int64_t walSegmentSize; + int16_t sstTrigger; + int16_t hashPrefix; + int16_t hashSuffix; } SCreateVnodeReq; int32_t tSerializeSCreateVnodeReq(void* buf, int32_t bufLen, SCreateVnodeReq* pReq); diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 5bc0fc82e3..c7cce6a183 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -103,224 +103,226 @@ #define TK_WAL_ROLL_PERIOD 85 #define TK_WAL_SEGMENT_SIZE 86 #define TK_SST_TRIGGER 87 -#define TK_NK_COLON 88 -#define TK_TABLE 89 -#define TK_NK_LP 90 -#define TK_NK_RP 91 -#define TK_STABLE 92 -#define TK_ADD 93 -#define TK_COLUMN 94 -#define TK_MODIFY 95 -#define TK_RENAME 96 -#define TK_TAG 97 -#define TK_SET 98 -#define TK_NK_EQ 99 -#define TK_USING 100 -#define TK_TAGS 101 -#define TK_COMMENT 102 -#define TK_BOOL 103 -#define TK_TINYINT 104 -#define TK_SMALLINT 105 -#define TK_INT 106 -#define TK_INTEGER 107 -#define TK_BIGINT 108 -#define TK_FLOAT 109 -#define TK_DOUBLE 110 -#define TK_BINARY 111 -#define TK_TIMESTAMP 112 -#define TK_NCHAR 113 -#define TK_UNSIGNED 114 -#define TK_JSON 115 -#define TK_VARCHAR 116 -#define TK_MEDIUMBLOB 117 -#define TK_BLOB 118 -#define TK_VARBINARY 119 -#define TK_DECIMAL 120 -#define TK_MAX_DELAY 121 -#define TK_WATERMARK 122 -#define TK_ROLLUP 123 -#define TK_TTL 124 -#define TK_SMA 125 -#define TK_FIRST 126 -#define TK_LAST 127 -#define TK_SHOW 128 -#define TK_DATABASES 129 -#define TK_TABLES 130 -#define TK_STABLES 131 -#define TK_MNODES 132 -#define TK_MODULES 133 -#define TK_QNODES 134 -#define TK_FUNCTIONS 135 -#define TK_INDEXES 136 -#define TK_ACCOUNTS 137 -#define TK_APPS 138 -#define TK_CONNECTIONS 139 -#define TK_LICENCES 140 -#define TK_GRANTS 141 -#define TK_QUERIES 142 -#define TK_SCORES 143 -#define TK_TOPICS 144 -#define TK_VARIABLES 145 -#define TK_BNODES 146 -#define TK_SNODES 147 -#define TK_CLUSTER 148 -#define TK_TRANSACTIONS 149 -#define TK_DISTRIBUTED 150 -#define TK_CONSUMERS 151 -#define TK_SUBSCRIPTIONS 152 -#define TK_VNODES 153 -#define TK_LIKE 154 -#define TK_INDEX 155 -#define TK_FUNCTION 156 -#define TK_INTERVAL 157 -#define TK_TOPIC 158 -#define TK_AS 159 -#define TK_WITH 160 -#define TK_META 161 -#define TK_CONSUMER 162 -#define TK_GROUP 163 -#define TK_DESC 164 -#define TK_DESCRIBE 165 -#define TK_RESET 166 -#define TK_QUERY 167 -#define TK_CACHE 168 -#define TK_EXPLAIN 169 -#define TK_ANALYZE 170 -#define TK_VERBOSE 171 -#define TK_NK_BOOL 172 -#define TK_RATIO 173 -#define TK_NK_FLOAT 174 -#define TK_OUTPUTTYPE 175 -#define TK_AGGREGATE 176 -#define TK_BUFSIZE 177 -#define TK_STREAM 178 -#define TK_INTO 179 -#define TK_TRIGGER 180 -#define TK_AT_ONCE 181 -#define TK_WINDOW_CLOSE 182 -#define TK_IGNORE 183 -#define TK_EXPIRED 184 -#define TK_KILL 185 -#define TK_CONNECTION 186 -#define TK_TRANSACTION 187 -#define TK_BALANCE 188 -#define TK_VGROUP 189 -#define TK_MERGE 190 -#define TK_REDISTRIBUTE 191 -#define TK_SPLIT 192 -#define TK_DELETE 193 -#define TK_INSERT 194 -#define TK_NULL 195 -#define TK_NK_QUESTION 196 -#define TK_NK_ARROW 197 -#define TK_ROWTS 198 -#define TK_TBNAME 199 -#define TK_QSTART 200 -#define TK_QEND 201 -#define TK_QDURATION 202 -#define TK_WSTART 203 -#define TK_WEND 204 -#define TK_WDURATION 205 -#define TK_CAST 206 -#define TK_NOW 207 -#define TK_TODAY 208 -#define TK_TIMEZONE 209 -#define TK_CLIENT_VERSION 210 -#define TK_SERVER_VERSION 211 -#define TK_SERVER_STATUS 212 -#define TK_CURRENT_USER 213 -#define TK_COUNT 214 -#define TK_LAST_ROW 215 -#define TK_BETWEEN 216 -#define TK_IS 217 -#define TK_NK_LT 218 -#define TK_NK_GT 219 -#define TK_NK_LE 220 -#define TK_NK_GE 221 -#define TK_NK_NE 222 -#define TK_MATCH 223 -#define TK_NMATCH 224 -#define TK_CONTAINS 225 -#define TK_IN 226 -#define TK_JOIN 227 -#define TK_INNER 228 -#define TK_SELECT 229 -#define TK_DISTINCT 230 -#define TK_WHERE 231 -#define TK_PARTITION 232 -#define TK_BY 233 -#define TK_SESSION 234 -#define TK_STATE_WINDOW 235 -#define TK_SLIDING 236 -#define TK_FILL 237 -#define TK_VALUE 238 -#define TK_NONE 239 -#define TK_PREV 240 -#define TK_LINEAR 241 -#define TK_NEXT 242 -#define TK_HAVING 243 -#define TK_RANGE 244 -#define TK_EVERY 245 -#define TK_ORDER 246 -#define TK_SLIMIT 247 -#define TK_SOFFSET 248 -#define TK_LIMIT 249 -#define TK_OFFSET 250 -#define TK_ASC 251 -#define TK_NULLS 252 -#define TK_ABORT 253 -#define TK_AFTER 254 -#define TK_ATTACH 255 -#define TK_BEFORE 256 -#define TK_BEGIN 257 -#define TK_BITAND 258 -#define TK_BITNOT 259 -#define TK_BITOR 260 -#define TK_BLOCKS 261 -#define TK_CHANGE 262 -#define TK_COMMA 263 -#define TK_COMPACT 264 -#define TK_CONCAT 265 -#define TK_CONFLICT 266 -#define TK_COPY 267 -#define TK_DEFERRED 268 -#define TK_DELIMITERS 269 -#define TK_DETACH 270 -#define TK_DIVIDE 271 -#define TK_DOT 272 -#define TK_EACH 273 -#define TK_END 274 -#define TK_FAIL 275 -#define TK_FILE 276 -#define TK_FOR 277 -#define TK_GLOB 278 -#define TK_ID 279 -#define TK_IMMEDIATE 280 -#define TK_IMPORT 281 -#define TK_INITIALLY 282 -#define TK_INSTEAD 283 -#define TK_ISNULL 284 -#define TK_KEY 285 -#define TK_NK_BITNOT 286 -#define TK_NK_SEMI 287 -#define TK_NOTNULL 288 -#define TK_OF 289 -#define TK_PLUS 290 -#define TK_PRIVILEGE 291 -#define TK_RAISE 292 -#define TK_REPLACE 293 -#define TK_RESTRICT 294 -#define TK_ROW 295 -#define TK_SEMI 296 -#define TK_STAR 297 -#define TK_STATEMENT 298 -#define TK_STRING 299 -#define TK_TIMES 300 -#define TK_UPDATE 301 -#define TK_VALUES 302 -#define TK_VARIABLE 303 -#define TK_VIEW 304 -#define TK_WAL 305 +#define TK_TABLE_PREFIX 88 +#define TK_TABLE_SUFFIX 89 +#define TK_NK_COLON 90 +#define TK_TABLE 91 +#define TK_NK_LP 92 +#define TK_NK_RP 93 +#define TK_STABLE 94 +#define TK_ADD 95 +#define TK_COLUMN 96 +#define TK_MODIFY 97 +#define TK_RENAME 98 +#define TK_TAG 99 +#define TK_SET 100 +#define TK_NK_EQ 101 +#define TK_USING 102 +#define TK_TAGS 103 +#define TK_COMMENT 104 +#define TK_BOOL 105 +#define TK_TINYINT 106 +#define TK_SMALLINT 107 +#define TK_INT 108 +#define TK_INTEGER 109 +#define TK_BIGINT 110 +#define TK_FLOAT 111 +#define TK_DOUBLE 112 +#define TK_BINARY 113 +#define TK_TIMESTAMP 114 +#define TK_NCHAR 115 +#define TK_UNSIGNED 116 +#define TK_JSON 117 +#define TK_VARCHAR 118 +#define TK_MEDIUMBLOB 119 +#define TK_BLOB 120 +#define TK_VARBINARY 121 +#define TK_DECIMAL 122 +#define TK_MAX_DELAY 123 +#define TK_WATERMARK 124 +#define TK_ROLLUP 125 +#define TK_TTL 126 +#define TK_SMA 127 +#define TK_FIRST 128 +#define TK_LAST 129 +#define TK_SHOW 130 +#define TK_DATABASES 131 +#define TK_TABLES 132 +#define TK_STABLES 133 +#define TK_MNODES 134 +#define TK_MODULES 135 +#define TK_QNODES 136 +#define TK_FUNCTIONS 137 +#define TK_INDEXES 138 +#define TK_ACCOUNTS 139 +#define TK_APPS 140 +#define TK_CONNECTIONS 141 +#define TK_LICENCES 142 +#define TK_GRANTS 143 +#define TK_QUERIES 144 +#define TK_SCORES 145 +#define TK_TOPICS 146 +#define TK_VARIABLES 147 +#define TK_BNODES 148 +#define TK_SNODES 149 +#define TK_CLUSTER 150 +#define TK_TRANSACTIONS 151 +#define TK_DISTRIBUTED 152 +#define TK_CONSUMERS 153 +#define TK_SUBSCRIPTIONS 154 +#define TK_VNODES 155 +#define TK_LIKE 156 +#define TK_INDEX 157 +#define TK_FUNCTION 158 +#define TK_INTERVAL 159 +#define TK_TOPIC 160 +#define TK_AS 161 +#define TK_WITH 162 +#define TK_META 163 +#define TK_CONSUMER 164 +#define TK_GROUP 165 +#define TK_DESC 166 +#define TK_DESCRIBE 167 +#define TK_RESET 168 +#define TK_QUERY 169 +#define TK_CACHE 170 +#define TK_EXPLAIN 171 +#define TK_ANALYZE 172 +#define TK_VERBOSE 173 +#define TK_NK_BOOL 174 +#define TK_RATIO 175 +#define TK_NK_FLOAT 176 +#define TK_OUTPUTTYPE 177 +#define TK_AGGREGATE 178 +#define TK_BUFSIZE 179 +#define TK_STREAM 180 +#define TK_INTO 181 +#define TK_TRIGGER 182 +#define TK_AT_ONCE 183 +#define TK_WINDOW_CLOSE 184 +#define TK_IGNORE 185 +#define TK_EXPIRED 186 +#define TK_KILL 187 +#define TK_CONNECTION 188 +#define TK_TRANSACTION 189 +#define TK_BALANCE 190 +#define TK_VGROUP 191 +#define TK_MERGE 192 +#define TK_REDISTRIBUTE 193 +#define TK_SPLIT 194 +#define TK_DELETE 195 +#define TK_INSERT 196 +#define TK_NULL 197 +#define TK_NK_QUESTION 198 +#define TK_NK_ARROW 199 +#define TK_ROWTS 200 +#define TK_TBNAME 201 +#define TK_QSTART 202 +#define TK_QEND 203 +#define TK_QDURATION 204 +#define TK_WSTART 205 +#define TK_WEND 206 +#define TK_WDURATION 207 +#define TK_CAST 208 +#define TK_NOW 209 +#define TK_TODAY 210 +#define TK_TIMEZONE 211 +#define TK_CLIENT_VERSION 212 +#define TK_SERVER_VERSION 213 +#define TK_SERVER_STATUS 214 +#define TK_CURRENT_USER 215 +#define TK_COUNT 216 +#define TK_LAST_ROW 217 +#define TK_BETWEEN 218 +#define TK_IS 219 +#define TK_NK_LT 220 +#define TK_NK_GT 221 +#define TK_NK_LE 222 +#define TK_NK_GE 223 +#define TK_NK_NE 224 +#define TK_MATCH 225 +#define TK_NMATCH 226 +#define TK_CONTAINS 227 +#define TK_IN 228 +#define TK_JOIN 229 +#define TK_INNER 230 +#define TK_SELECT 231 +#define TK_DISTINCT 232 +#define TK_WHERE 233 +#define TK_PARTITION 234 +#define TK_BY 235 +#define TK_SESSION 236 +#define TK_STATE_WINDOW 237 +#define TK_SLIDING 238 +#define TK_FILL 239 +#define TK_VALUE 240 +#define TK_NONE 241 +#define TK_PREV 242 +#define TK_LINEAR 243 +#define TK_NEXT 244 +#define TK_HAVING 245 +#define TK_RANGE 246 +#define TK_EVERY 247 +#define TK_ORDER 248 +#define TK_SLIMIT 249 +#define TK_SOFFSET 250 +#define TK_LIMIT 251 +#define TK_OFFSET 252 +#define TK_ASC 253 +#define TK_NULLS 254 +#define TK_ABORT 255 +#define TK_AFTER 256 +#define TK_ATTACH 257 +#define TK_BEFORE 258 +#define TK_BEGIN 259 +#define TK_BITAND 260 +#define TK_BITNOT 261 +#define TK_BITOR 262 +#define TK_BLOCKS 263 +#define TK_CHANGE 264 +#define TK_COMMA 265 +#define TK_COMPACT 266 +#define TK_CONCAT 267 +#define TK_CONFLICT 268 +#define TK_COPY 269 +#define TK_DEFERRED 270 +#define TK_DELIMITERS 271 +#define TK_DETACH 272 +#define TK_DIVIDE 273 +#define TK_DOT 274 +#define TK_EACH 275 +#define TK_END 276 +#define TK_FAIL 277 +#define TK_FILE 278 +#define TK_FOR 279 +#define TK_GLOB 280 +#define TK_ID 281 +#define TK_IMMEDIATE 282 +#define TK_IMPORT 283 +#define TK_INITIALLY 284 +#define TK_INSTEAD 285 +#define TK_ISNULL 286 +#define TK_KEY 287 +#define TK_NK_BITNOT 288 +#define TK_NK_SEMI 289 +#define TK_NOTNULL 290 +#define TK_OF 291 +#define TK_PLUS 292 +#define TK_PRIVILEGE 293 +#define TK_RAISE 294 +#define TK_REPLACE 295 +#define TK_RESTRICT 296 +#define TK_ROW 297 +#define TK_SEMI 298 +#define TK_STAR 299 +#define TK_STATEMENT 300 +#define TK_STRING 301 +#define TK_TIMES 302 +#define TK_UPDATE 303 +#define TK_VALUES 304 +#define TK_VARIABLE 305 +#define TK_VIEW 306 +#define TK_WAL 307 #define TK_NK_SPACE 300 #define TK_NK_COMMENT 301 diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index f47c309330..ea70a42147 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -82,6 +82,8 @@ typedef struct SDatabaseOptions { bool walRetentionSizeIsSet; bool walRollPeriodIsSet; int32_t sstTrigger; + int32_t tablePrefix; + int32_t tableSuffix; } SDatabaseOptions; typedef struct SCreateDatabaseStmt { diff --git a/include/util/taoserror.h b/include/util/taoserror.h index e39172d74e..d16a599811 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -616,6 +616,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_RSMA_FETCH_MSG_MSSED_UP TAOS_DEF_ERROR_CODE(0, 0x3155) #define TSDB_CODE_RSMA_EMPTY_INFO TAOS_DEF_ERROR_CODE(0, 0x3156) #define TSDB_CODE_RSMA_INVALID_SCHEMA TAOS_DEF_ERROR_CODE(0, 0x3157) +#define TSDB_CODE_RSMA_REGEX_MATCH TAOS_DEF_ERROR_CODE(0, 0x3158) //index #define TSDB_CODE_INDEX_REBUILDING TAOS_DEF_ERROR_CODE(0, 0x3200) diff --git a/include/util/tdef.h b/include/util/tdef.h index 48f37fca28..57fde32bed 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -362,6 +362,12 @@ typedef enum ELogicConditionType { #define TSDB_MIN_SST_TRIGGER 1 #define TSDB_MAX_SST_TRIGGER 128 #define TSDB_DEFAULT_SST_TRIGGER 8 +#define TSDB_MIN_HASH_PREFIX 0 +#define TSDB_MAX_HASH_PREFIX 128 +#define TSDB_DEFAULT_HASH_PREFIX 0 +#define TSDB_MIN_HASH_SUFFIX 0 +#define TSDB_MAX_HASH_SUFFIX 128 +#define TSDB_DEFAULT_HASH_SUFFIX 0 #define TSDB_DB_MIN_WAL_RETENTION_PERIOD -1 #define TSDB_REP_DEF_DB_WAL_RET_PERIOD 0 diff --git a/include/util/trbtree.h b/include/util/trbtree.h new file mode 100644 index 0000000000..f6d37e3d75 --- /dev/null +++ b/include/util/trbtree.h @@ -0,0 +1,78 @@ +/* + * 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_UTIL_RBTREE_H_ +#define _TD_UTIL_RBTREE_H_ + +#include "os.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct SRBTree SRBTree; +typedef struct SRBTreeNode SRBTreeNode; +typedef struct SRBTreeIter SRBTreeIter; + +typedef int32_t (*tRBTreeCmprFn)(const void *, const void *); + +// SRBTree ============================================= +#define tRBTreeMin(T) ((T)->min == ((T)->NIL) ? NULL : (T)->min) +#define tRBTreeMax(T) ((T)->max == ((T)->NIL) ? NULL : (T)->max) + +void tRBTreeCreate(SRBTree *pTree, tRBTreeCmprFn cmprFn); +SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *z); +void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *z); +SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey); +SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey); + +// SRBTreeIter ============================================= +#define tRBTreeIterCreate(tree, ascend) \ + (SRBTreeIter) { .asc = (ascend), .pTree = (tree), .pNode = (ascend) ? (tree)->min : (tree)->max } + +SRBTreeNode *tRBTreeIterNext(SRBTreeIter *pIter); + +// STRUCT ============================================= +typedef enum { RED, BLACK } ECOLOR; +struct SRBTreeNode { + ECOLOR color; + SRBTreeNode *parent; + SRBTreeNode *left; + SRBTreeNode *right; +}; + +#define RBTREE_NODE_PAYLOAD(N) ((const void *)&(N)[1]) + +struct SRBTree { + tRBTreeCmprFn cmprFn; + int64_t n; + SRBTreeNode *root; + SRBTreeNode *min; + SRBTreeNode *max; + SRBTreeNode *NIL; + SRBTreeNode NILNODE; +}; + +struct SRBTreeIter { + int8_t asc; + SRBTree *pTree; + SRBTreeNode *pNode; +}; + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_UTIL_RBTREE_H_*/ \ No newline at end of file diff --git a/include/util/tutil.h b/include/util/tutil.h index 6a1a40f14c..a0c7b3d7ad 100644 --- a/include/util/tutil.h +++ b/include/util/tutil.h @@ -20,6 +20,7 @@ #include "tcrc32c.h" #include "tdef.h" #include "tmd5.h" +#include "thash.h" #ifdef __cplusplus extern "C" { @@ -68,6 +69,8 @@ static FORCE_INLINE void taosEncryptPass_c(uint8_t *inBuf, size_t len, char *tar memcpy(target, buf, TSDB_PASSWORD_LEN); } +#define taosGetTbHashVal(tbname, tblen, method, prefix, suffix) MurmurHash3_32((tbname), (tblen)) + #ifdef __cplusplus } #endif diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index f91ceb3184..5ebc2729f8 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -1672,7 +1672,12 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int break; } } - if (!needConvert) return TSDB_CODE_SUCCESS; + + if (!needConvert) { + return TSDB_CODE_SUCCESS; + } + + tscDebug("start to convert form json format string"); char* p = (char*)pResultInfo->pData; int32_t dataLen = estimateJsonLen(pResultInfo, numOfCols, numOfRows); diff --git a/source/client/src/taosx.c b/source/client/src/clientRawBlockWrite.c similarity index 97% rename from source/client/src/taosx.c rename to source/client/src/clientRawBlockWrite.c index f016120a1f..c135965f07 100644 --- a/source/client/src/taosx.c +++ b/source/client/src/clientRawBlockWrite.c @@ -765,23 +765,25 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) { } taosArrayPush(pRequest->tableList, &pName); + pCreateReq->flags |= TD_CREATE_IF_NOT_EXISTS; // change tag cid to new cid - if(pCreateReq->type == TSDB_CHILD_TABLE){ + if (pCreateReq->type == TSDB_CHILD_TABLE) { STableMeta* pTableMeta = NULL; SName sName = {0}; toName(pTscObj->acctId, pRequest->pDb, pCreateReq->ctb.name, &sName); code = catalogGetTableMeta(pCatalog, &conn, &sName, &pTableMeta); - if(code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { uError("taosCreateTable:catalogGetTableMeta failed. table name: %s", pCreateReq->ctb.name); goto end; } - for(int32_t i = 0; i < taosArrayGetSize(pCreateReq->ctb.tagName); i++){ + for (int32_t i = 0; i < taosArrayGetSize(pCreateReq->ctb.tagName); i++) { char* tName = taosArrayGet(pCreateReq->ctb.tagName, i); - for(int32_t j = pTableMeta->tableInfo.numOfColumns; j < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; j++){ - SSchema *tag = &pTableMeta->schema[j]; - if(strcmp(tag->name, tName) == 0 && tag->type != TSDB_DATA_TYPE_JSON){ - tTagSetCid((STag *)pCreateReq->ctb.pTag, i, tag->colId); + for (int32_t j = pTableMeta->tableInfo.numOfColumns; + j < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; j++) { + SSchema* tag = &pTableMeta->schema[j]; + if (strcmp(tag->name, tName) == 0 && tag->type != TSDB_DATA_TYPE_JSON) { + tTagSetCid((STag*)pCreateReq->ctb.pTag, i, tag->colId); } } } @@ -1322,12 +1324,12 @@ end: return code; } -static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) { - int32_t code = TSDB_CODE_SUCCESS; - SHashObj* pVgHash = NULL; - SQuery* pQuery = NULL; - SMqRspObj rspObj = {0}; - SDecoder decoder = {0}; +static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) { + int32_t code = TSDB_CODE_SUCCESS; + SHashObj* pVgHash = NULL; + SQuery* pQuery = NULL; + SMqRspObj rspObj = {0}; + SDecoder decoder = {0}; STableMeta* pTableMeta = NULL; terrno = TSDB_CODE_SUCCESS; @@ -1405,7 +1407,7 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) { } code = catalogGetTableMeta(pCatalog, &conn, &pName, &pTableMeta); - if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST){ + if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST) { uError("WriteRaw:catalogGetTableMeta table not exist. table name: %s", tbName); code = TSDB_CODE_SUCCESS; continue; @@ -1466,7 +1468,7 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) { } // pSW->pSchema should be same as pTableMeta->schema -// ASSERT(pSW->nCols == pTableMeta->tableInfo.numOfColumns); + // ASSERT(pSW->nCols == pTableMeta->tableInfo.numOfColumns); uint64_t suid = (TSDB_NORMAL_TABLE == pTableMeta->tableType ? 0 : pTableMeta->suid); uint64_t uid = pTableMeta->uid; int16_t sver = pTableMeta->sversion; @@ -1494,10 +1496,10 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) { int32_t offset = 0; for (int32_t k = 0; k < pTableMeta->tableInfo.numOfColumns; k++) { const SSchema* pColumn = &pTableMeta->schema[k]; - int32_t* index = taosHashGet(schemaHash, pColumn->name, strlen(pColumn->name)); - if(!index){ + int32_t* index = taosHashGet(schemaHash, pColumn->name, strlen(pColumn->name)); + if (!index) { tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k); - }else{ + } else { char* colData = rspObj.resInfo.row[*index]; if (!colData) { tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k); @@ -1668,7 +1670,7 @@ int32_t tmq_write_raw(TAOS* taos, tmq_raw_data raw) { } else if (raw.raw_type == TDMT_VND_DELETE) { return taosDeleteData(taos, raw.raw, raw.raw_len); } else if (raw.raw_type == RES_TYPE__TMQ) { - return tmqWriteRaw(taos, raw.raw, raw.raw_len); + return tmqWriteRawDataImpl(taos, raw.raw, raw.raw_len); } return TSDB_CODE_INVALID_PARA; } diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index c6ba2d6892..f2493f6c57 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -547,6 +547,8 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { goto end; } needCheckMeta = true; + taosHashCleanup(hashTmp); + hashTmp = NULL; } else { uError("SML:0x%" PRIx64 " load table meta error: %s", info->id, tstrerror(code)); goto end; @@ -576,7 +578,6 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { sTableData->tableMeta = pTableMeta; tableMetaSml = (SSmlSTableMeta **)taosHashIterate(info->superTables, tableMetaSml); - taosHashCleanup(hashTmp); } return 0; diff --git a/source/client/src/tmq.c b/source/client/src/clientTmq.c similarity index 100% rename from source/client/src/tmq.c rename to source/client/src/clientTmq.c diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 3edf26cca7..61fc530f57 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -90,7 +90,7 @@ static const SSysDbTableSchema userDBSchema[] = { {.name = "minrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "maxrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "comp", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true}, - {.name = "precision", .bytes = 2 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "precision", .bytes = 2 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "retentions", .bytes = 60 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "single_stable", .bytes = 1, .type = TSDB_DATA_TYPE_BOOL, .sysInfo = true}, @@ -102,6 +102,7 @@ static const SSysDbTableSchema userDBSchema[] = { {.name = "wal_retention_size", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = true}, {.name = "wal_roll_period", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "wal_segment_size", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = true}, + {.name = "sst_trigger", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true}, }; static const SSysDbTableSchema userFuncSchema[] = { @@ -206,6 +207,7 @@ static const SSysDbTableSchema vgroupsSchema[] = { {.name = "v3_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "v3_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "status", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "cacheload", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "nfiles", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "file_size", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "tsma", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true}, diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index c7f372f17b..16b8e55cf7 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -140,7 +140,8 @@ int32_t colDataReserve(SColumnInfoData* pColumnInfoData, size_t newSize) { return TSDB_CODE_SUCCESS; } -static void doCopyNItems(struct SColumnInfoData* pColumnInfoData, int32_t currentRow, const char* pData, int32_t itemLen, int32_t numOfRows) { +static void doCopyNItems(struct SColumnInfoData* pColumnInfoData, int32_t currentRow, const char* pData, + int32_t itemLen, int32_t numOfRows) { ASSERT(pColumnInfoData->info.bytes >= itemLen); size_t start = 1; @@ -148,21 +149,23 @@ static void doCopyNItems(struct SColumnInfoData* pColumnInfoData, int32_t curren memcpy(pColumnInfoData->pData, pData, itemLen); int32_t t = 0; - int32_t count = log(numOfRows)/log(2); - while(t < count) { + int32_t count = log(numOfRows) / log(2); + while (t < count) { int32_t xlen = 1 << t; - memcpy(pColumnInfoData->pData + start * itemLen + pColumnInfoData->varmeta.length, pColumnInfoData->pData, xlen * itemLen); + memcpy(pColumnInfoData->pData + start * itemLen + pColumnInfoData->varmeta.length, pColumnInfoData->pData, + xlen * itemLen); t += 1; start += xlen; } // the tail part if (numOfRows > start) { - memcpy(pColumnInfoData->pData + start * itemLen + currentRow * itemLen, pColumnInfoData->pData, (numOfRows - start) * itemLen); + memcpy(pColumnInfoData->pData + start * itemLen + currentRow * itemLen, pColumnInfoData->pData, + (numOfRows - start) * itemLen); } if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) { - for(int32_t i = 0; i < numOfRows; ++i) { + for (int32_t i = 0; i < numOfRows; ++i) { pColumnInfoData->varmeta.offset[i + currentRow] = pColumnInfoData->varmeta.length + i * itemLen; } @@ -170,7 +173,8 @@ static void doCopyNItems(struct SColumnInfoData* pColumnInfoData, int32_t curren } } -int32_t colDataAppendNItems(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, uint32_t numOfRows) { +int32_t colDataAppendNItems(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, + uint32_t numOfRows) { ASSERT(pData != NULL && pColumnInfoData != NULL); int32_t len = pColumnInfoData->info.bytes; @@ -278,7 +282,7 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, int } else { if (finalNumOfRows > *capacity || (numOfRow1 == 0 && pColumnInfoData->info.bytes != 0)) { // all data may be null, when the pColumnInfoData->info.type == 0, bytes == 0; -// ASSERT(finalNumOfRows * pColumnInfoData->info.bytes); + // ASSERT(finalNumOfRows * pColumnInfoData->info.bytes); char* tmp = taosMemoryRealloc(pColumnInfoData->pData, finalNumOfRows * pColumnInfoData->info.bytes); if (tmp == NULL) { return TSDB_CODE_VND_OUT_OF_MEMORY; @@ -557,7 +561,7 @@ int32_t blockDataToBuf(char* buf, const SSDataBlock* pBlock) { } int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf) { - int32_t numOfRows = *(int32_t*) buf; + int32_t numOfRows = *(int32_t*)buf; blockDataEnsureCapacity(pBlock, numOfRows); pBlock->info.rows = numOfRows; @@ -676,7 +680,8 @@ size_t blockDataGetRowSize(SSDataBlock* pBlock) { * @return */ size_t blockDataGetSerialMetaSize(uint32_t numOfCols) { - // | version | total length | total rows | total columns | flag seg| block group id | column schema | each column length | + // | version | total length | total rows | total columns | flag seg| block group id | column schema | each column + // length | return sizeof(int32_t) + sizeof(int32_t) + sizeof(int32_t) + sizeof(int32_t) + sizeof(int32_t) + sizeof(uint64_t) + numOfCols * (sizeof(int8_t) + sizeof(int32_t)) + numOfCols * sizeof(int32_t); } @@ -1302,6 +1307,40 @@ int32_t copyDataBlock(SSDataBlock* dst, const SSDataBlock* src) { return TSDB_CODE_SUCCESS; } +SSDataBlock* createSpecialDataBlock(EStreamType type) { + SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock)); + pBlock->info.hasVarCol = false; + pBlock->info.groupId = 0; + pBlock->info.rows = 0; + pBlock->info.type = type; + pBlock->info.rowSize = + sizeof(TSKEY) + sizeof(TSKEY) + sizeof(uint64_t) + sizeof(uint64_t) + sizeof(TSKEY) + sizeof(TSKEY); + pBlock->info.watermark = INT64_MIN; + + pBlock->pDataBlock = taosArrayInit(6, sizeof(SColumnInfoData)); + SColumnInfoData infoData = {0}; + infoData.info.type = TSDB_DATA_TYPE_TIMESTAMP; + infoData.info.bytes = sizeof(TSKEY); + // window start ts + taosArrayPush(pBlock->pDataBlock, &infoData); + // window end ts + taosArrayPush(pBlock->pDataBlock, &infoData); + + infoData.info.type = TSDB_DATA_TYPE_UBIGINT; + infoData.info.bytes = sizeof(uint64_t); + // uid + taosArrayPush(pBlock->pDataBlock, &infoData); + // group id + taosArrayPush(pBlock->pDataBlock, &infoData); + + // calculate start ts + taosArrayPush(pBlock->pDataBlock, &infoData); + // calculate end ts + taosArrayPush(pBlock->pDataBlock, &infoData); + + return pBlock; +} + SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) { if (pDataBlock == NULL) { return NULL; @@ -1426,7 +1465,7 @@ size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize) { } void colDataDestroy(SColumnInfoData* pColData) { - if(!pColData) return; + if (!pColData) return; if (IS_VAR_DATA_TYPE(pColData->info.type)) { taosMemoryFreeClear(pColData->varmeta.offset); } else { @@ -1693,7 +1732,7 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) { } struct tm ptm = {0}; taosLocalTime(&tt, &ptm); - size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm); + size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm); if (precision == TSDB_TIME_PRECISION_NANO) { sprintf(buf + pos, ".%09d", ms); @@ -1847,20 +1886,20 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf) break; case TSDB_DATA_TYPE_VARCHAR: { memset(pBuf, 0, sizeof(pBuf)); - char* pData = colDataGetVarData(pColInfoData, j); + char* pData = colDataGetVarData(pColInfoData, j); int32_t dataSize = TMIN(sizeof(pBuf), varDataLen(pData)); memcpy(pBuf, varDataVal(pData), dataSize); len += snprintf(dumpBuf + len, size - len, " %15s |", pBuf); if (len >= size - 1) return dumpBuf; - } break; + } break; case TSDB_DATA_TYPE_NCHAR: { - char* pData = colDataGetVarData(pColInfoData, j); + char* pData = colDataGetVarData(pColInfoData, j); int32_t dataSize = TMIN(sizeof(pBuf), varDataLen(pData)); memset(pBuf, 0, sizeof(pBuf)); - taosUcs4ToMbs((TdUcs4 *)varDataVal(pData), dataSize, pBuf); + taosUcs4ToMbs((TdUcs4*)varDataVal(pData), dataSize, pBuf); len += snprintf(dumpBuf + len, size - len, " %15s |", pBuf); if (len >= size - 1) return dumpBuf; - } break; + } break; } } len += snprintf(dumpBuf + len, size - len, "\n"); @@ -1877,7 +1916,7 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf) * @param pDataBlocks * @param vgId * @param suid - * + * */ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataBlock, STSchema* pTSchema, int32_t vgId, tb_uid_t suid) { @@ -1904,8 +1943,8 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataB tdSRowInit(&rb, pTSchema->version); for (int32_t i = 0; i < sz; ++i) { - int32_t colNum = taosArrayGetSize(pDataBlock->pDataBlock); - int32_t rows = pDataBlock->info.rows; + int32_t colNum = taosArrayGetSize(pDataBlock->pDataBlock); + int32_t rows = pDataBlock->info.rows; // int32_t rowSize = pDataBlock->info.rowSize; // int64_t groupId = pDataBlock->info.groupId; @@ -1926,7 +1965,7 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataB msgLen += sizeof(SSubmitBlk); int32_t dataLen = 0; - for (int32_t j = 0; j < rows; ++j) { // iterate by row + for (int32_t j = 0; j < rows; ++j) { // iterate by row tdSRowResetBuf(&rb, POINTER_SHIFT(pDataBuf, msgLen + dataLen)); // set row buf bool isStartKey = false; int32_t offset = 0; @@ -2081,6 +2120,7 @@ void blockEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_ int32_t* rows = (int32_t*)data; *rows = pBlock->info.rows; data += sizeof(int32_t); + ASSERT(*rows > 0); int32_t* cols = (int32_t*)data; *cols = numOfCols; @@ -2089,7 +2129,7 @@ void blockEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_ // flag segment. // the inital bit is for column info int32_t* flagSegment = (int32_t*)data; - *flagSegment = (1<<31); + *flagSegment = (1 << 31); data += sizeof(int32_t); @@ -2144,12 +2184,14 @@ void blockEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_ *actualLen = *dataLen; *groupId = pBlock->info.groupId; + ASSERT(*dataLen > 0); + uDebug("build data block, actualLen:%d, rows:%d, cols:%d", *dataLen, *rows, *cols); } const char* blockDecode(SSDataBlock* pBlock, const char* pData) { const char* pStart = pData; - int32_t version = *(int32_t*) pStart; + int32_t version = *(int32_t*)pStart; pStart += sizeof(int32_t); ASSERT(version == 1); @@ -2158,7 +2200,7 @@ const char* blockDecode(SSDataBlock* pBlock, const char* pData) { pStart += sizeof(int32_t); // total rows sizeof(int32_t) - int32_t numOfRows = *(int32_t*)pStart; + int32_t numOfRows = *(int32_t*)pStart; pStart += sizeof(int32_t); // total columns sizeof(int32_t) diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 908f7c014e..c436e4ffd2 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -129,10 +129,6 @@ int32_t tsMinIntervalTime = 1; int32_t tsQueryBufferSize = -1; int64_t tsQueryBufferSizeBytes = -1; -// tsdb config -// For backward compatibility -bool tsdbForceKeepFile = false; - int32_t tsDiskCfgNum = 0; SDiskCfg tsDiskCfg[TFS_MAX_DISKS] = {0}; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index afbc349392..c08817aaf4 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -994,6 +994,7 @@ int32_t tSerializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { SVnodeLoad *pload = taosArrayGet(pReq->pVloads, i); if (tEncodeI32(&encoder, pload->vgId) < 0) return -1; if (tEncodeI32(&encoder, pload->syncState) < 0) return -1; + if (tEncodeI64(&encoder, pload->cacheUsage) < 0) return -1; if (tEncodeI64(&encoder, pload->numOfTables) < 0) return -1; if (tEncodeI64(&encoder, pload->numOfTimeSeries) < 0) return -1; if (tEncodeI64(&encoder, pload->totalStorage) < 0) return -1; @@ -1063,6 +1064,7 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { SVnodeLoad vload = {0}; if (tDecodeI32(&decoder, &vload.vgId) < 0) return -1; if (tDecodeI32(&decoder, &vload.syncState) < 0) return -1; + if (tDecodeI64(&decoder, &vload.cacheUsage) < 0) return -1; if (tDecodeI64(&decoder, &vload.numOfTables) < 0) return -1; if (tDecodeI64(&decoder, &vload.numOfTimeSeries) < 0) return -1; if (tDecodeI64(&decoder, &vload.totalStorage) < 0) return -1; @@ -2025,6 +2027,8 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) { if (tEncodeI32(&encoder, pReq->walRollPeriod) < 0) return -1; if (tEncodeI64(&encoder, pReq->walSegmentSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->sstTrigger) < 0) return -1; + if (tEncodeI16(&encoder, pReq->hashPrefix) < 0) return -1; + if (tEncodeI16(&encoder, pReq->hashSuffix) < 0) return -1; if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1; if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1; for (int32_t i = 0; i < pReq->numOfRetensions; ++i) { @@ -2072,6 +2076,8 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) if (tDecodeI32(&decoder, &pReq->walRollPeriod) < 0) return -1; if (tDecodeI64(&decoder, &pReq->walSegmentSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->sstTrigger) < 0) return -1; + if (tDecodeI16(&decoder, &pReq->hashPrefix) < 0) return -1; + if (tDecodeI16(&decoder, &pReq->hashSuffix) < 0) return -1; if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1; if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1; pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention)); @@ -3766,6 +3772,9 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR if (tEncodeI64(&encoder, pReq->walRetentionSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->walRollPeriod) < 0) return -1; if (tEncodeI64(&encoder, pReq->walSegmentSize) < 0) return -1; + if (tEncodeI16(&encoder, pReq->sstTrigger) < 0) return -1; + if (tEncodeI16(&encoder, pReq->hashPrefix) < 0) return -1; + if (tEncodeI16(&encoder, pReq->hashSuffix) < 0) return -1; tEndEncode(&encoder); @@ -3838,6 +3847,9 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq * if (tDecodeI64(&decoder, &pReq->walRetentionSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->walRollPeriod) < 0) return -1; if (tDecodeI64(&decoder, &pReq->walSegmentSize) < 0) return -1; + if (tDecodeI16(&decoder, &pReq->sstTrigger) < 0) return -1; + if (tDecodeI16(&decoder, &pReq->hashPrefix) < 0) return -1; + if (tDecodeI16(&decoder, &pReq->hashSuffix) < 0) return -1; tEndDecode(&decoder); tDecoderClear(&decoder); diff --git a/source/common/src/trow.c b/source/common/src/trow.c index 565498a47b..9880fe362e 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -538,12 +538,12 @@ bool tdSTSRowIterGetTpVal(STSRowIter *pIter, col_type_t colType, int32_t offset, } else { pVal->val = POINTER_SHIFT(TD_ROW_DATA(pRow), offset); } - return TSDB_CODE_SUCCESS; + return true; } if (tdGetBitmapValType(pIter->pBitmap, pIter->colIdx - 1, &pVal->valType, 0) != TSDB_CODE_SUCCESS) { pVal->valType = TD_VTYPE_NONE; - return terrno; + return true; } if (pVal->valType == TD_VTYPE_NORM) { diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index e610b41a04..830bf9523a 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -167,9 +167,12 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) { pCfg->walCfg.segSize = pCreate->walSegmentSize; pCfg->walCfg.level = pCreate->walLevel; + pCfg->sstTrigger = pCreate->sstTrigger; pCfg->hashBegin = pCreate->hashBegin; pCfg->hashEnd = pCreate->hashEnd; pCfg->hashMethod = pCreate->hashMethod; + pCfg->hashPrefix = pCreate->hashPrefix; + pCfg->hashSuffix = pCreate->hashSuffix; pCfg->standby = pCfg->standby; pCfg->syncCfg.myIndex = pCreate->selfIndex; @@ -219,8 +222,11 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return -1; } - dDebug("vgId:%d, start to create vnode, tsma:%d standby:%d cacheLast:%d cacheLastSize:%d", createReq.vgId, - createReq.isTsma, createReq.standby, createReq.cacheLast, createReq.cacheLastSize); + dInfo("vgId:%d, start to create vnode, tsma:%d standby:%d cacheLast:%d cacheLastSize:%d sstTrigger:%d", + createReq.vgId, createReq.isTsma, createReq.standby, createReq.cacheLast, createReq.cacheLastSize, + createReq.sstTrigger); + dInfo("vgId:%d, hashMethod:%d begin:%u end:%u prefix:%d surfix:%d", createReq.vgId, createReq.hashMethod, + createReq.hashBegin, createReq.hashEnd, createReq.hashPrefix, createReq.hashSuffix); vmGenerateVnodeCfg(&createReq, &vnodeCfg); if (vmTsmaAdjustDays(&vnodeCfg, &createReq) < 0) { diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index ea05215fe9..9632be1b24 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -305,11 +305,14 @@ typedef struct { int8_t hashMethod; // default is 1 int8_t cacheLast; int8_t schemaless; + int16_t hashPrefix; + int16_t hashSuffix; + int16_t sstTrigger; int32_t numOfRetensions; SArray* pRetensions; int32_t walRetentionPeriod; - int64_t walRetentionSize; int32_t walRollPeriod; + int64_t walRetentionSize; int64_t walSegmentSize; } SDbCfg; @@ -340,6 +343,7 @@ typedef struct { uint32_t hashEnd; char dbName[TSDB_DB_FNAME_LEN]; int64_t dbUid; + int64_t cacheUsage; int64_t numOfTables; int64_t numOfTimeSeries; int64_t totalStorage; diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index fee322ecad..77c9d0bb79 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -30,7 +30,7 @@ #include "systable.h" #define DB_VER_NUMBER 1 -#define DB_RESERVE_SIZE 64 +#define DB_RESERVE_SIZE 58 static SSdbRaw *mndDbActionEncode(SDbObj *pDb); static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw); @@ -124,6 +124,9 @@ static SSdbRaw *mndDbActionEncode(SDbObj *pDb) { SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walRetentionSize, _OVER) SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walRollPeriod, _OVER) SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walSegmentSize, _OVER) + SDB_SET_INT16(pRaw, dataPos, pDb->cfg.sstTrigger, _OVER) + SDB_SET_INT16(pRaw, dataPos, pDb->cfg.hashPrefix, _OVER) + SDB_SET_INT16(pRaw, dataPos, pDb->cfg.hashSuffix, _OVER) SDB_SET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER) SDB_SET_DATALEN(pRaw, dataPos, _OVER) @@ -207,6 +210,9 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) { SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walRetentionSize, _OVER) SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRollPeriod, _OVER) SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walSegmentSize, _OVER) + SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.sstTrigger, _OVER) + SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashPrefix, _OVER) + SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashSuffix, _OVER) SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER) taosInitRWLatch(&pDb->lock); @@ -254,6 +260,7 @@ static int32_t mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew) { pOld->cfg.strict = pNew->cfg.strict; pOld->cfg.cacheLast = pNew->cfg.cacheLast; pOld->cfg.replications = pNew->cfg.replications; + pOld->cfg.sstTrigger = pNew->cfg.sstTrigger; taosWUnLockLatch(&pOld->lock); return 0; } @@ -330,6 +337,9 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) { if (pCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return -1; if (pCfg->walRollPeriod < TSDB_DB_MIN_WAL_ROLL_PERIOD) return -1; if (pCfg->walSegmentSize < TSDB_DB_MIN_WAL_SEGMENT_SIZE) return -1; + if (pCfg->sstTrigger < TSDB_MIN_SST_TRIGGER || pCfg->sstTrigger > TSDB_MAX_SST_TRIGGER) return -1; + if (pCfg->hashPrefix < TSDB_MIN_HASH_PREFIX || pCfg->hashPrefix > TSDB_MAX_HASH_PREFIX) return -1; + if (pCfg->hashSuffix < TSDB_MIN_HASH_SUFFIX || pCfg->hashSuffix > TSDB_MAX_HASH_SUFFIX) return -1; terrno = 0; return terrno; @@ -363,6 +373,9 @@ static void mndSetDefaultDbCfg(SDbCfg *pCfg) { pCfg->walRetentionSize = TSDB_REPS_DEF_DB_WAL_RET_SIZE; if (pCfg->walRollPeriod < 0) pCfg->walRollPeriod = TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD; if (pCfg->walSegmentSize < 0) pCfg->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE; + if (pCfg->sstTrigger <= 0) pCfg->sstTrigger = TSDB_DEFAULT_SST_TRIGGER; + if (pCfg->hashPrefix < 0) pCfg->hashPrefix = TSDB_DEFAULT_HASH_PREFIX; + if (pCfg->hashSuffix < 0) pCfg->hashSuffix = TSDB_DEFAULT_HASH_SUFFIX; } static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) { @@ -479,6 +492,9 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, .walRetentionSize = pCreate->walRetentionSize, .walRollPeriod = pCreate->walRollPeriod, .walSegmentSize = pCreate->walSegmentSize, + .sstTrigger = pCreate->sstTrigger, + .hashPrefix = pCreate->hashPrefix, + .hashSuffix = pCreate->hashSuffix, }; dbObj.cfg.numOfRetensions = pCreate->numOfRetensions; @@ -1536,6 +1552,24 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes); } + const char *precStr = NULL; + switch (pDb->cfg.precision) { + case TSDB_TIME_PRECISION_MILLI: + precStr = TSDB_TIME_PRECISION_MILLI_STR; + break; + case TSDB_TIME_PRECISION_MICRO: + precStr = TSDB_TIME_PRECISION_MICRO_STR; + break; + case TSDB_TIME_PRECISION_NANO: + precStr = TSDB_TIME_PRECISION_NANO_STR; + break; + default: + precStr = "none"; + break; + } + char precVstr[10] = {0}; + STR_WITH_SIZE_TO_VARSTR(precVstr, precStr, 2); + char *statusStr = "ready"; if (objStatus == SDB_STATUS_CREATING) { statusStr = "creating"; @@ -1546,7 +1580,6 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, statusStr = "unsynced"; } } - char statusVstr[24] = {0}; STR_WITH_SIZE_TO_VARSTR(statusVstr, statusStr, strlen(statusStr)); @@ -1557,6 +1590,8 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, colDataAppend(pColInfo, rows, buf, false); } else if (i == 3) { colDataAppend(pColInfo, rows, (const char *)&numOfTables, false); + } else if (i == 14) { + colDataAppend(pColInfo, rows, precVstr, false); } else if (i == 15) { colDataAppend(pColInfo, rows, statusVstr, false); } else { @@ -1621,23 +1656,6 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.compression, false); - const char *precStr = NULL; - switch (pDb->cfg.precision) { - case TSDB_TIME_PRECISION_MILLI: - precStr = TSDB_TIME_PRECISION_MILLI_STR; - break; - case TSDB_TIME_PRECISION_MICRO: - precStr = TSDB_TIME_PRECISION_MICRO_STR; - break; - case TSDB_TIME_PRECISION_NANO: - precStr = TSDB_TIME_PRECISION_NANO_STR; - break; - default: - precStr = "none"; - break; - } - char precVstr[10] = {0}; - STR_WITH_SIZE_TO_VARSTR(precVstr, precStr, 2); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, rows, (const char *)precVstr, false); @@ -1682,6 +1700,9 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walSegmentSize, false); + + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.sstTrigger, false); } taosMemoryFree(buf); diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index fc5e20ef28..26b4080d14 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -347,6 +347,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId); if (pVgroup != NULL) { if (pVload->syncState == TAOS_SYNC_STATE_LEADER) { + pVgroup->cacheUsage = pVload->cacheUsage; pVgroup->numOfTables = pVload->numOfTables; pVgroup->numOfTimeSeries = pVload->numOfTimeSeries; pVgroup->totalStorage = pVload->totalStorage; @@ -853,8 +854,8 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) { } int32_t code = -1; - SSdb *pSdb = pMnode->pSdb; - void *pIter = NULL; + SSdb *pSdb = pMnode->pSdb; + void *pIter = NULL; while (1) { SDnodeObj *pDnode = NULL; pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode); @@ -877,7 +878,7 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) { sdbRelease(pSdb, pDnode); } - + if (code == -1) { terrno = TSDB_CODE_MND_DNODE_NOT_EXIST; } diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 6ab979213d..de29dea511 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -234,6 +234,9 @@ void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVg createReq.walRetentionSize = pDb->cfg.walRetentionSize; createReq.walRollPeriod = pDb->cfg.walRollPeriod; createReq.walSegmentSize = pDb->cfg.walSegmentSize; + createReq.sstTrigger = pDb->cfg.sstTrigger; + createReq.hashPrefix = pDb->cfg.hashPrefix; + createReq.hashSuffix = pDb->cfg.hashSuffix; for (int32_t v = 0; v < pVgroup->replica; ++v) { SReplica *pReplica = &createReq.replicas[v]; @@ -693,6 +696,9 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppendNULL(pColInfo, numOfRows); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->cacheUsage, false); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppendNULL(pColInfo, numOfRows); diff --git a/source/dnode/vnode/CMakeLists.txt b/source/dnode/vnode/CMakeLists.txt index a3e17f5377..7a99d26683 100644 --- a/source/dnode/vnode/CMakeLists.txt +++ b/source/dnode/vnode/CMakeLists.txt @@ -29,6 +29,7 @@ target_sources( # sma "src/sma/smaEnv.c" "src/sma/smaUtil.c" + "src/sma/smaFS.c" "src/sma/smaOpen.c" "src/sma/smaCommit.c" "src/sma/smaRollup.c" @@ -49,6 +50,10 @@ target_sources( "src/tsdb/tsdbSnapshot.c" "src/tsdb/tsdbCacheRead.c" "src/tsdb/tsdbRetention.c" + "src/tsdb/tsdbDiskData.c" + "src/tsdb/tsdbCompress.c" + "src/tsdb/tsdbCompact.c" + "src/tsdb/tsdbMergeTree.c" # tq "src/tq/tq.c" diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 5d4285b7c2..8e545eb527 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -155,6 +155,7 @@ int32_t tsdbGetTableSchema(SVnode *pVnode, int64_t uid, STSchema **pSchema, int6 void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity); size_t tsdbCacheGetCapacity(SVnode *pVnode); +size_t tsdbCacheGetUsage(SVnode *pVnode); // tq typedef struct SMetaTableInfo { @@ -287,6 +288,9 @@ struct SVnodeCfg { SVnodeStats vndStats; uint32_t hashBegin; uint32_t hashEnd; + int16_t sstTrigger; + int16_t hashPrefix; + int16_t hashSuffix; }; typedef struct { diff --git a/source/dnode/vnode/src/inc/sma.h b/source/dnode/vnode/src/inc/sma.h index c29c4cb6c4..e303faf7de 100644 --- a/source/dnode/vnode/src/inc/sma.h +++ b/source/dnode/vnode/src/inc/sma.h @@ -38,9 +38,10 @@ typedef struct SSmaEnv SSmaEnv; typedef struct SSmaStat SSmaStat; typedef struct STSmaStat STSmaStat; typedef struct SRSmaStat SRSmaStat; -typedef struct SSmaKey SSmaKey; +typedef struct SRSmaRef SRSmaRef; typedef struct SRSmaInfo SRSmaInfo; typedef struct SRSmaInfoItem SRSmaInfoItem; +typedef struct SRSmaFS SRSmaFS; typedef struct SQTaskFile SQTaskFile; typedef struct SQTaskFReader SQTaskFReader; typedef struct SQTaskFWriter SQTaskFWriter; @@ -54,10 +55,21 @@ struct SSmaEnv { #define SMA_ENV_FLG_CLOSE ((int8_t)0x1) +struct SRSmaRef { + int64_t refId; // for SRSmaStat + int64_t suid; +}; + typedef struct { int8_t inited; int32_t rsetId; void *tmrHandle; // shared by all fetch tasks + /** + * @brief key: void* of SRSmaInfoItem, value: SRSmaRef + * N.B. Although there is a very small possibility that "void*" point to different objects while with the same + * address after release/renew, the functionality is not affected as it just used to fetch the rsma results. + */ + SHashObj *refHash; // shared by all vgroups } SSmaMgmt; #define SMA_ENV_LOCK(env) (&(env)->lock) @@ -73,20 +85,25 @@ struct STSmaStat { struct SQTaskFile { volatile int32_t nRef; - int64_t commitID; + int32_t padding; + int64_t version; int64_t size; }; struct SQTaskFReader { - SSma *pSma; - SQTaskFile fTask; - TdFilePtr pReadH; + SSma *pSma; + int64_t version; + TdFilePtr pReadH; }; struct SQTaskFWriter { - SSma *pSma; - SQTaskFile fTask; - TdFilePtr pWriteH; - char *fname; + SSma *pSma; + int64_t version; + TdFilePtr pWriteH; + char *fname; +}; + +struct SRSmaFS { + SArray *aQTaskInf; // array of SQTaskFile }; struct SRSmaStat { @@ -98,7 +115,7 @@ struct SRSmaStat { volatile int32_t nFetchAll; // active number of fetch all int8_t triggerStat; // shared by fetch tasks int8_t commitStat; // 0 not in committing, 1 in committing - SArray *aTaskFile; // qTaskFiles committed recently(for recovery/snapshot r/w) + SRSmaFS fs; // for recovery/snapshot r/w SHashObj *infoHash; // key: suid, value: SRSmaInfo tsem_t notEmpty; // has items in queue buffer }; @@ -118,6 +135,7 @@ struct SSmaStat { #define RSMA_TRIGGER_STAT(r) (&(r)->triggerStat) #define RSMA_COMMIT_STAT(r) (&(r)->commitStat) #define RSMA_REF_ID(r) ((r)->refId) +#define RSMA_FS(r) (&(r)->fs) #define RSMA_FS_LOCK(r) (&(r)->lock) struct SRSmaInfoItem { @@ -132,7 +150,6 @@ struct SRSmaInfoItem { struct SRSmaInfo { STSchema *pTSchema; int64_t suid; - int64_t refId; // refId of SRSmaStat int64_t lastRecv; // ms int8_t assigned; // 0 idle, 1 assgined for exec int8_t delFlag; @@ -163,14 +180,6 @@ enum { TASK_TRIGGER_STAT_DROPPED = 5, }; -enum { - RSMA_ROLE_CREATE = 0, - RSMA_ROLE_DROP = 1, - RSMA_ROLE_SUBMIT = 2, - RSMA_ROLE_FETCH = 3, - RSMA_ROLE_ITERATE = 4, -}; - enum { RSMA_RESTORE_REBOOT = 1, RSMA_RESTORE_SYNC = 2, @@ -182,88 +191,34 @@ typedef enum { RSMA_EXEC_COMMIT = 3, // triggered by commit } ERsmaExecType; -void tdDestroySmaEnv(SSmaEnv *pSmaEnv); -void *tdFreeSmaEnv(SSmaEnv *pSmaEnv); - -int32_t tdDropTSma(SSma *pSma, char *pMsg); -int32_t tdDropTSmaData(SSma *pSma, int64_t indexUid); -int32_t tdInsertRSmaData(SSma *pSma, char *msg); - +// sma +int32_t tdCheckAndInitSmaEnv(SSma *pSma, int8_t smaType); +void tdDestroySmaEnv(SSmaEnv *pSmaEnv); +void *tdFreeSmaEnv(SSmaEnv *pSmaEnv); int32_t tdRefSmaStat(SSma *pSma, SSmaStat *pStat); int32_t tdUnRefSmaStat(SSma *pSma, SSmaStat *pStat); -int32_t tdRefRSmaInfo(SSma *pSma, SRSmaInfo *pRSmaInfo); -int32_t tdUnRefRSmaInfo(SSma *pSma, SRSmaInfo *pRSmaInfo); - +int32_t tdLockSma(SSma *pSma); +int32_t tdUnLockSma(SSma *pSma); void *tdAcquireSmaRef(int32_t rsetId, int64_t refId); int32_t tdReleaseSmaRef(int32_t rsetId, int64_t refId); -int32_t tdCheckAndInitSmaEnv(SSma *pSma, int8_t smaType); +// rsma +int32_t tdRefRSmaInfo(SSma *pSma, SRSmaInfo *pRSmaInfo); +int32_t tdUnRefRSmaInfo(SSma *pSma, SRSmaInfo *pRSmaInfo); +void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo, bool isDeepFree); +int32_t tdRSmaFSOpen(SSma *pSma, int64_t version); +void tdRSmaFSClose(SRSmaFS *fs); +int32_t tdRSmaFSRef(SSma *pSma, SRSmaStat *pStat, int64_t version); +void tdRSmaFSUnRef(SSma *pSma, SRSmaStat *pStat, int64_t version); +int32_t tdRSmaFSUpsertQTaskFile(SRSmaFS *pFS, SQTaskFile *qTaskFile); +int32_t tdRSmaRestore(SSma *pSma, int8_t type, int64_t committedVer); +int32_t tdRSmaProcessCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, const char *tbName); +int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type); +int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash); +int32_t tdRSmaProcessRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer); -int32_t tdLockSma(SSma *pSma); -int32_t tdUnLockSma(SSma *pSma); - -static FORCE_INLINE int8_t tdSmaStat(STSmaStat *pTStat) { - if (pTStat) { - return atomic_load_8(&pTStat->state); - } - return TSDB_SMA_STAT_UNKNOWN; -} - -static FORCE_INLINE bool tdSmaStatIsOK(STSmaStat *pTStat, int8_t *state) { - if (!pTStat) { - return false; - } - - if (state) { - *state = atomic_load_8(&pTStat->state); - return *state == TSDB_SMA_STAT_OK; - } - return atomic_load_8(&pTStat->state) == TSDB_SMA_STAT_OK; -} - -static FORCE_INLINE bool tdSmaStatIsExpired(STSmaStat *pTStat) { - return pTStat ? (atomic_load_8(&pTStat->state) & TSDB_SMA_STAT_EXPIRED) : true; -} - -static FORCE_INLINE bool tdSmaStatIsDropped(STSmaStat *pTStat) { - return pTStat ? (atomic_load_8(&pTStat->state) & TSDB_SMA_STAT_DROPPED) : true; -} - -static FORCE_INLINE void tdSmaStatSetOK(STSmaStat *pTStat) { - if (pTStat) { - atomic_store_8(&pTStat->state, TSDB_SMA_STAT_OK); - } -} - -static FORCE_INLINE void tdSmaStatSetExpired(STSmaStat *pTStat) { - if (pTStat) { - atomic_or_fetch_8(&pTStat->state, TSDB_SMA_STAT_EXPIRED); - } -} - -static FORCE_INLINE void tdSmaStatSetDropped(STSmaStat *pTStat) { - if (pTStat) { - atomic_or_fetch_8(&pTStat->state, TSDB_SMA_STAT_DROPPED); - } -} - -void tdRSmaQTaskInfoGetFileName(int32_t vid, int64_t version, char *outputName); -void tdRSmaQTaskInfoGetFullName(int32_t vid, int64_t version, const char *path, char *outputName); -int32_t tdCloneRSmaInfo(SSma *pSma, SRSmaInfo *pInfo); -void tdFreeQTaskInfo(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level); -static int32_t tdDestroySmaState(SSmaStat *pSmaStat, int8_t smaType); -void *tdFreeSmaState(SSmaStat *pSmaStat, int8_t smaType); -void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo, bool isDeepFree); -int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash); -int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type); - -int32_t tdProcessRSmaCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, const char *tbName); -int32_t tdProcessRSmaRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer); -int32_t tdRsmaRestore(SSma *pSma, int8_t type, int64_t committedVer); - -int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg); -int32_t tdProcessTSmaInsertImpl(SSma *pSma, int64_t indexUid, const char *msg); -int32_t tdProcessTSmaGetDaysImpl(SVnodeCfg *pCfg, void *pCont, uint32_t contLen, int32_t *days); +void tdRSmaQTaskInfoGetFileName(int32_t vid, int64_t version, char *outputName); +void tdRSmaQTaskInfoGetFullName(int32_t vid, int64_t version, const char *path, char *outputName); // smaFileUtil ================ diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index d1f5cfb122..7546b0943e 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -42,15 +42,15 @@ typedef struct SMemTable SMemTable; typedef struct STbDataIter STbDataIter; typedef struct SMapData SMapData; typedef struct SBlockIdx SBlockIdx; -typedef struct SBlock SBlock; -typedef struct SBlockL SBlockL; +typedef struct SDataBlk SDataBlk; +typedef struct SSstBlk SSstBlk; typedef struct SColData SColData; typedef struct SDiskDataHdr SDiskDataHdr; typedef struct SBlockData SBlockData; typedef struct SDelFile SDelFile; typedef struct SHeadFile SHeadFile; typedef struct SDataFile SDataFile; -typedef struct SLastFile SLastFile; +typedef struct SSstFile SSstFile; typedef struct SSmaFile SSmaFile; typedef struct SDFileSet SDFileSet; typedef struct SDataFWriter SDataFWriter; @@ -64,10 +64,13 @@ typedef struct STsdbReadSnap STsdbReadSnap; typedef struct SBlockInfo SBlockInfo; typedef struct SSmaInfo SSmaInfo; typedef struct SBlockCol SBlockCol; +typedef struct SVersionRange SVersionRange; -#define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F) -#define TSDB_MAX_SUBBLOCKS 8 -#define TSDB_FHDR_SIZE 512 +#define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F) +#define TSDB_MAX_SUBBLOCKS 8 +#define TSDB_MAX_LAST_FILE 16 +#define TSDB_DEFAULT_LAST_FILE 8 +#define TSDB_FHDR_SIZE 512 #define HAS_NONE ((int8_t)0x1) #define HAS_NULL ((int8_t)0x2) @@ -111,15 +114,15 @@ int32_t tTABLEIDCmprFn(const void *p1, const void *p2); int32_t tPutBlockCol(uint8_t *p, void *ph); int32_t tGetBlockCol(uint8_t *p, void *ph); int32_t tBlockColCmprFn(const void *p1, const void *p2); -// SBlock -void tBlockReset(SBlock *pBlock); -int32_t tPutBlock(uint8_t *p, void *ph); -int32_t tGetBlock(uint8_t *p, void *ph); -int32_t tBlockCmprFn(const void *p1, const void *p2); -bool tBlockHasSma(SBlock *pBlock); -// SBlockL -int32_t tPutBlockL(uint8_t *p, void *ph); -int32_t tGetBlockL(uint8_t *p, void *ph); +// SDataBlk +void tDataBlkReset(SDataBlk *pBlock); +int32_t tPutDataBlk(uint8_t *p, void *ph); +int32_t tGetDataBlk(uint8_t *p, void *ph); +int32_t tDataBlkCmprFn(const void *p1, const void *p2); +bool tDataBlkHasSma(SDataBlk *pDataBlk); +// SSstBlk +int32_t tPutSstBlk(uint8_t *p, void *ph); +int32_t tGetSstBlk(uint8_t *p, void *ph); // SBlockIdx int32_t tPutBlockIdx(uint8_t *p, void *ph); int32_t tGetBlockIdx(uint8_t *p, void *ph); @@ -170,6 +173,7 @@ int32_t tGetDelData(uint8_t *p, void *ph); void tMapDataReset(SMapData *pMapData); void tMapDataClear(SMapData *pMapData); int32_t tMapDataPutItem(SMapData *pMapData, void *pItem, int32_t (*tPutItemFn)(uint8_t *, void *)); +int32_t tMapDataCopy(SMapData *pFrom, SMapData *pTo); void tMapDataGetItemByIdx(SMapData *pMapData, int32_t idx, void *pItem, int32_t (*tGetItemFn)(uint8_t *, void *)); int32_t tMapDataSearch(SMapData *pMapData, void *pSearchItem, int32_t (*tGetItemFn)(uint8_t *, void *), int32_t (*tItemCmprFn)(const void *, const void *), void *pItem); @@ -215,7 +219,7 @@ bool tsdbDelFileIsSame(SDelFile *pDelFile1, SDelFile *pDelFile2); int32_t tsdbDFileRollback(STsdb *pTsdb, SDFileSet *pSet, EDataFileT ftype); int32_t tPutHeadFile(uint8_t *p, SHeadFile *pHeadFile); int32_t tPutDataFile(uint8_t *p, SDataFile *pDataFile); -int32_t tPutLastFile(uint8_t *p, SLastFile *pLastFile); +int32_t tPutSstFile(uint8_t *p, SSstFile *pSstFile); int32_t tPutSmaFile(uint8_t *p, SSmaFile *pSmaFile); int32_t tPutDelFile(uint8_t *p, SDelFile *pDelFile); int32_t tGetDelFile(uint8_t *p, SDelFile *pDelFile); @@ -224,7 +228,7 @@ int32_t tGetDFileSet(uint8_t *p, SDFileSet *pSet); void tsdbHeadFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SHeadFile *pHeadF, char fname[]); void tsdbDataFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SDataFile *pDataF, char fname[]); -void tsdbLastFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SLastFile *pLastF, char fname[]); +void tsdbSstFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSstFile *pSstF, char fname[]); void tsdbSmaFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSmaFile *pSmaF, char fname[]); // SDelFile void tsdbDelFileName(STsdb *pTsdb, SDelFile *pFile, char fname[]); @@ -250,7 +254,7 @@ int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync); int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter); int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SArray *aBlockIdx); int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *pMapData, SBlockIdx *pBlockIdx); -int32_t tsdbWriteBlockL(SDataFWriter *pWriter, SArray *aBlockL); +int32_t tsdbWriteSstBlk(SDataFWriter *pWriter, SArray *aSstBlk); int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo, int8_t cmprAlg, int8_t toLast); @@ -260,10 +264,10 @@ int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pS int32_t tsdbDataFReaderClose(SDataFReader **ppReader); int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx); int32_t tsdbReadBlock(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *pMapData); -int32_t tsdbReadBlockL(SDataFReader *pReader, SArray *aBlockL); -int32_t tsdbReadBlockSma(SDataFReader *pReader, SBlock *pBlock, SArray *aColumnDataAgg); -int32_t tsdbReadDataBlock(SDataFReader *pReader, SBlock *pBlock, SBlockData *pBlockData); -int32_t tsdbReadLastBlock(SDataFReader *pReader, SBlockL *pBlockL, SBlockData *pBlockData); +int32_t tsdbReadSstBlk(SDataFReader *pReader, int32_t iSst, SArray *aSstBlk); +int32_t tsdbReadBlockSma(SDataFReader *pReader, SDataBlk *pBlock, SArray *aColumnDataAgg); +int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pBlock, SBlockData *pBlockData); +int32_t tsdbReadSstBlock(SDataFReader *pReader, int32_t iSst, SSstBlk *pSstBlk, SBlockData *pBlockData); // SDelFWriter int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb); int32_t tsdbDelFWriterClose(SDelFWriter **ppWriter, int8_t sync); @@ -278,6 +282,8 @@ int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx); // tsdbRead.c ============================================================================================== int32_t tsdbTakeReadSnap(STsdb *pTsdb, STsdbReadSnap **ppSnap); void tsdbUntakeReadSnap(STsdb *pTsdb, STsdbReadSnap *pSnap); +// tsdbMerge.c ============================================================================================== +int32_t tsdbMerge(STsdb *pTsdb); #define TSDB_CACHE_NO(c) ((c).cacheLast == 0) #define TSDB_CACHE_LAST_ROW(c) (((c).cacheLast & 1) > 0) @@ -324,6 +330,11 @@ struct TSDBKEY { TSKEY ts; }; +struct SVersionRange { + uint64_t minVer; + uint64_t maxVer; +}; + typedef struct SMemSkipListNode SMemSkipListNode; struct SMemSkipListNode { int8_t level; @@ -416,7 +427,7 @@ struct SSmaInfo { int32_t size; }; -struct SBlock { +struct SDataBlk { TSDBKEY minKey; TSDBKEY maxKey; int64_t minVer; @@ -428,7 +439,7 @@ struct SBlock { SSmaInfo smaInfo; }; -struct SBlockL { +struct SSstBlk { int64_t suid; int64_t minUid; int64_t maxUid; @@ -467,12 +478,6 @@ struct SBlockData { SArray *aColData; // SArray }; -// ================== TSDB global config -extern bool tsdbForceKeepFile; - -#define TSDB_FS_ITER_FORWARD TSDB_ORDER_ASC -#define TSDB_FS_ITER_BACKWARD TSDB_ORDER_DESC - struct TABLEID { tb_uid_t suid; tb_uid_t uid; @@ -536,7 +541,7 @@ struct SDataFile { int64_t size; }; -struct SLastFile { +struct SSstFile { volatile int32_t nRef; int64_t commitID; @@ -556,8 +561,9 @@ struct SDFileSet { int32_t fid; SHeadFile *pHeadF; SDataFile *pDataF; - SLastFile *pLastF; SSmaFile *pSmaF; + uint8_t nSstF; + SSstFile *aSstF[TSDB_MAX_LAST_FILE]; }; struct SRowIter { @@ -586,13 +592,13 @@ struct SDataFWriter { TdFilePtr pHeadFD; TdFilePtr pDataFD; - TdFilePtr pLastFD; TdFilePtr pSmaFD; + TdFilePtr pLastFD; SHeadFile fHead; SDataFile fData; - SLastFile fLast; SSmaFile fSma; + SSstFile fSst[TSDB_MAX_LAST_FILE]; uint8_t *aBuf[4]; }; @@ -603,6 +609,36 @@ struct STsdbReadSnap { STsdbFS fs; }; +struct SDataFReader { + STsdb *pTsdb; + SDFileSet *pSet; + TdFilePtr pHeadFD; + TdFilePtr pDataFD; + TdFilePtr pSmaFD; + TdFilePtr aLastFD[TSDB_MAX_LAST_FILE]; + + uint8_t *aBuf[3]; +}; + +typedef struct { + int64_t suid; + int64_t uid; + TSDBROW row; +} SRowInfo; + +typedef struct SMergeTree { + int8_t backward; + SRBTree rbt; + SArray *pIterList; + struct SLDataIter *pIter; +} SMergeTree; + +int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader* pFReader, uint64_t uid, STimeWindow* pTimeWindow, SVersionRange* pVerRange); +void tMergeTreeAddIter(SMergeTree *pMTree, struct SLDataIter *pIter); +bool tMergeTreeNext(SMergeTree *pMTree); +TSDBROW tMergeTreeGetRow(SMergeTree *pMTree); +void tMergeTreeClose(SMergeTree *pMTree); + // ========== inline functions ========== static FORCE_INLINE int32_t tsdbKeyCmprFn(const void *p1, const void *p2) { TSDBKEY *pKey1 = (TSDBKEY *)p1; diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 9b252df58b..93f9691675 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -36,6 +36,7 @@ #include "tlosertree.h" #include "tlrucache.h" #include "tmsgcb.h" +#include "trbtree.h" #include "tref.h" #include "tskiplist.h" #include "tstream.h" @@ -70,8 +71,8 @@ typedef struct SStreamTaskReader SStreamTaskReader; typedef struct SStreamTaskWriter SStreamTaskWriter; typedef struct SStreamStateReader SStreamStateReader; typedef struct SStreamStateWriter SStreamStateWriter; -typedef struct SRsmaSnapReader SRsmaSnapReader; -typedef struct SRsmaSnapWriter SRsmaSnapWriter; +typedef struct SRSmaSnapReader SRSmaSnapReader; +typedef struct SRSmaSnapWriter SRSmaSnapWriter; typedef struct SSnapDataHdr SSnapDataHdr; #define VNODE_META_DIR "meta" @@ -102,7 +103,7 @@ int metaCommit(SMeta* pMeta); int metaCreateSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq); int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq); int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList); -int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pReq, STableMetaRsp **pMetaRsp); +int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pReq, STableMetaRsp** pMetaRsp); int metaDropTable(SMeta* pMeta, int64_t version, SVDropTbReq* pReq, SArray* tbUids); int metaTtlDropTable(SMeta* pMeta, int64_t ttl, SArray* tbUids); int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq, STableMetaRsp* pMetaRsp); @@ -173,7 +174,8 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg); // tq-stream int32_t tqProcessTaskDeployReq(STQ* pTq, int64_t version, char* msg, int32_t msgLen); int32_t tqProcessTaskDropReq(STQ* pTq, int64_t version, char* msg, int32_t msgLen); -int32_t tqProcessStreamTrigger(STQ* pTq, SSubmitReq* data, int64_t ver); +int32_t tqProcessSubmitReq(STQ* pTq, SSubmitReq* data, int64_t ver); +int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver); int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg); int32_t tqProcessTaskDispatchReq(STQ* pTq, SRpcMsg* pMsg, bool exec); int32_t tqProcessTaskRecoverReq(STQ* pTq, SRpcMsg* pMsg); @@ -246,14 +248,14 @@ int32_t tqOffsetSnapWrite(STqOffsetWriter* pWriter, uint8_t* pData, uint32_t nDa // SStreamTaskReader ====================================== // SStreamStateWriter ===================================== // SStreamStateReader ===================================== -// SRsmaSnapReader ======================================== -int32_t rsmaSnapReaderOpen(SSma* pSma, int64_t sver, int64_t ever, SRsmaSnapReader** ppReader); -int32_t rsmaSnapReaderClose(SRsmaSnapReader** ppReader); -int32_t rsmaSnapRead(SRsmaSnapReader* pReader, uint8_t** ppData); -// SRsmaSnapWriter ======================================== -int32_t rsmaSnapWriterOpen(SSma* pSma, int64_t sver, int64_t ever, SRsmaSnapWriter** ppWriter); -int32_t rsmaSnapWrite(SRsmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData); -int32_t rsmaSnapWriterClose(SRsmaSnapWriter** ppWriter, int8_t rollback); +// SRSmaSnapReader ======================================== +int32_t rsmaSnapReaderOpen(SSma* pSma, int64_t sver, int64_t ever, SRSmaSnapReader** ppReader); +int32_t rsmaSnapReaderClose(SRSmaSnapReader** ppReader); +int32_t rsmaSnapRead(SRSmaSnapReader* pReader, uint8_t** ppData); +// SRSmaSnapWriter ======================================== +int32_t rsmaSnapWriterOpen(SSma* pSma, int64_t sver, int64_t ever, SRSmaSnapWriter** ppWriter); +int32_t rsmaSnapWrite(SRSmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData); +int32_t rsmaSnapWriterClose(SRSmaSnapWriter** ppWriter, int8_t rollback); typedef struct { int8_t streamType; // sma or other diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 7df355a59b..a34569b08e 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -129,10 +129,16 @@ _err: bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid) { // query uid.idx + metaRLock(pMeta); + if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), NULL, NULL) < 0) { + metaULock(pMeta); + return false; } + metaULock(pMeta); + return true; } @@ -182,9 +188,14 @@ tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name) { } int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName) { + int code = 0; SMetaReader mr = {0}; metaReaderInit(&mr, (SMeta *)meta, 0); - metaGetTableEntryByUid(&mr, uid); + code = metaGetTableEntryByUid(&mr, uid); + if (code < 0) { + metaReaderClear(&mr); + return -1; + } STR_TO_VARSTR(tbName, mr.me.name); metaReaderClear(&mr); @@ -280,6 +291,38 @@ _query: tDecoderClear(&dc); goto _exit; } + { // Traverse to find the previous qualified data + TBC *pCur; + tdbTbcOpen(pMeta->pTbDb, &pCur, NULL); + STbDbKey key = {.version = sver, .uid = INT64_MAX}; + int c = 0; + tdbTbcMoveTo(pCur, &key, sizeof(key), &c); + if(c < 0){ + tdbTbcMoveToPrev(pCur); + } + + void *pKey = NULL; + void *pVal = NULL; + int vLen = 0, kLen = 0; + while(1){ + int32_t ret = tdbTbcPrev(pCur, &pKey, &kLen, &pVal, &vLen); + if (ret < 0) break; + + STbDbKey *tmp = (STbDbKey*)pKey; + if(tmp->uid != uid){ + continue; + } + SDecoder dcNew = {0}; + SMetaEntry meNew = {0}; + tDecoderInit(&dcNew, pVal, vLen); + metaDecodeEntry(&dcNew, &meNew); + pSchema = tCloneSSchemaWrapper(&meNew.stbEntry.schemaRow); + tDecoderClear(&dcNew); + tdbTbcClose(pCur); + goto _exit; + } + tdbTbcClose(pCur); + } } else if (me.type == TSDB_CHILD_TABLE) { uid = me.ctbEntry.suid; tDecoderClear(&dc); diff --git a/source/dnode/vnode/src/sma/smaCommit.c b/source/dnode/vnode/src/sma/smaCommit.c index 3cf50a035a..6d3db47b18 100644 --- a/source/dnode/vnode/src/sma/smaCommit.c +++ b/source/dnode/vnode/src/sma/smaCommit.c @@ -15,13 +15,15 @@ #include "sma.h" +extern SSmaMgmt smaMgmt; + static int32_t tdProcessRSmaSyncPreCommitImpl(SSma *pSma); static int32_t tdProcessRSmaSyncCommitImpl(SSma *pSma); static int32_t tdProcessRSmaSyncPostCommitImpl(SSma *pSma); static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma); static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma); static int32_t tdProcessRSmaAsyncPostCommitImpl(SSma *pSma); -static int32_t tdCleanupQTaskInfoFiles(SSma *pSma, SRSmaStat *pRSmaStat); +static int32_t tdUpdateQTaskInfoFiles(SSma *pSma, SRSmaStat *pRSmaStat); /** * @brief Only applicable to Rollup SMA @@ -166,114 +168,49 @@ static int32_t tdProcessRSmaSyncCommitImpl(SSma *pSma) { return TSDB_CODE_SUCCESS; } -static int32_t tdCleanupQTaskInfoFiles(SSma *pSma, SRSmaStat *pRSmaStat) { - SVnode *pVnode = pSma->pVnode; - int64_t committed = pRSmaStat->commitAppliedVer; - TdDirPtr pDir = NULL; - TdDirEntryPtr pDirEntry = NULL; - char dir[TSDB_FILENAME_LEN]; - const char *pattern = "v[0-9]+qinf\\.v([0-9]+)?$"; - regex_t regex; - int code = 0; - - tdGetVndDirName(TD_VID(pVnode), tfsGetPrimaryPath(pVnode->pTfs), VNODE_RSMA_DIR, true, dir); - - // Resource allocation and init - if ((code = regcomp(®ex, pattern, REG_EXTENDED)) != 0) { - char errbuf[128]; - regerror(code, ®ex, errbuf, sizeof(errbuf)); - smaWarn("vgId:%d, rsma post commit, regcomp for %s failed since %s", TD_VID(pVnode), dir, errbuf); - return TSDB_CODE_FAILED; - } - - if ((pDir = taosOpenDir(dir)) == NULL) { - regfree(®ex); - terrno = TAOS_SYSTEM_ERROR(errno); - smaDebug("vgId:%d, rsma post commit, open dir %s failed since %s", TD_VID(pVnode), dir, terrstr()); - return TSDB_CODE_FAILED; - } - - int32_t dirLen = strlen(dir); - char *dirEnd = POINTER_SHIFT(dir, dirLen); - regmatch_t regMatch[2]; - while ((pDirEntry = taosReadDir(pDir)) != NULL) { - char *entryName = taosGetDirEntryName(pDirEntry); - if (!entryName) { - continue; - } - - code = regexec(®ex, entryName, 2, regMatch, 0); - - if (code == 0) { - // match - int64_t version = -1; - sscanf((const char *)POINTER_SHIFT(entryName, regMatch[1].rm_so), "%" PRIi64, &version); - if ((version < committed) && (version > -1)) { - strncpy(dirEnd, entryName, TSDB_FILENAME_LEN - dirLen); - if (taosRemoveFile(dir) != 0) { - terrno = TAOS_SYSTEM_ERROR(errno); - smaWarn("vgId:%d, committed version:%" PRIi64 ", failed to remove %s since %s", TD_VID(pVnode), committed, - dir, terrstr()); - } else { - smaDebug("vgId:%d, committed version:%" PRIi64 ", success to remove %s", TD_VID(pVnode), committed, dir); - } - } - } else if (code == REG_NOMATCH) { - // not match - smaTrace("vgId:%d, rsma post commit, not match %s", TD_VID(pVnode), entryName); - continue; - } else { - // has other error - char errbuf[128]; - regerror(code, ®ex, errbuf, sizeof(errbuf)); - smaWarn("vgId:%d, rsma post commit, regexec failed since %s", TD_VID(pVnode), errbuf); - - taosCloseDir(&pDir); - regfree(®ex); - return TSDB_CODE_FAILED; - } - } - - taosCloseDir(&pDir); - regfree(®ex); - - return TSDB_CODE_SUCCESS; -} - // SQTaskFile ====================================================== -// int32_t tCmprQTaskFile(void const *lhs, void const *rhs) { -// int64_t *lCommitted = *(int64_t *)lhs; -// SQTaskFile *rQTaskF = (SQTaskFile *)rhs; -// if (lCommitted < rQTaskF->commitID) { -// return -1; -// } else if (lCommitted > rQTaskF->commitID) { -// return 1; -// } - -// return 0; -// } - -#if 0 /** * @brief At most time, there is only one qtaskinfo file committed latest in aTaskFile. Sometimes, there would be * multiple qtaskinfo files supporting snapshot replication. * * @param pSma - * @param pRSmaStat + * @param pStat * @return int32_t */ -static int32_t tdCleanupQTaskInfoFiles(SSma *pSma, SRSmaStat *pRSmaStat) { - SVnode *pVnode = pSma->pVnode; - int64_t committed = pRSmaStat->commitAppliedVer; - SArray *aTaskFile = pRSmaStat->aTaskFile; +static int32_t tdUpdateQTaskInfoFiles(SSma *pSma, SRSmaStat *pStat) { + SVnode *pVnode = pSma->pVnode; + SRSmaFS *pFS = RSMA_FS(pStat); + int64_t committed = pStat->commitAppliedVer; + char qTaskInfoFullName[TSDB_FILENAME_LEN]; - void *qTaskFile = taosArraySearch(aTaskFile, committed, tCmprQTaskFile, TD_LE); - + taosWLockLatch(RSMA_FS_LOCK(pStat)); + for (int32_t i = 0; i < taosArrayGetSize(pFS->aQTaskInf);) { + SQTaskFile *pTaskF = taosArrayGet(pFS->aQTaskInf, i); + if (atomic_sub_fetch_32(&pTaskF->nRef, 1) <= 0) { + tdRSmaQTaskInfoGetFullName(TD_VID(pVnode), pTaskF->version, tfsGetPrimaryPath(pVnode->pTfs), qTaskInfoFullName); + if (taosRemoveFile(qTaskInfoFullName) < 0) { + smaWarn("vgId:%d, cleanup qinf, failed to remove %s since %s", TD_VID(pVnode), qTaskInfoFullName, + tstrerror(TAOS_SYSTEM_ERROR(errno))); + } else { + smaDebug("vgId:%d, cleanup qinf, success to remove %s", TD_VID(pVnode), qTaskInfoFullName); + } + taosArrayRemove(pFS->aQTaskInf, i); + continue; + } + ++i; + } + + SQTaskFile qFile = {.nRef = 1, .padding = 0, .version = committed, .size = 0}; + if (tdRSmaFSUpsertQTaskFile(pFS, &qFile) < 0) { + taosWUnLockLatch(RSMA_FS_LOCK(pStat)); + return TSDB_CODE_FAILED; + } + + taosWUnLockLatch(RSMA_FS_LOCK(pStat)); return TSDB_CODE_SUCCESS; } -#endif /** * @brief post-commit for rollup sma @@ -290,8 +227,7 @@ static int32_t tdProcessRSmaSyncPostCommitImpl(SSma *pSma) { SRSmaStat *pRSmaStat = SMA_RSMA_STAT(pSma); - // cleanup outdated qtaskinfo files - tdCleanupQTaskInfoFiles(pSma, pRSmaStat); + tdUpdateQTaskInfoFiles(pSma, pRSmaStat); return TSDB_CODE_SUCCESS; } @@ -427,8 +363,8 @@ static int32_t tdProcessRSmaAsyncPostCommitImpl(SSma *pSma) { return TSDB_CODE_SUCCESS; } - SRSmaStat *pRSmaStat = (SRSmaStat *)SMA_ENV_STAT(pEnv); - SArray *rsmaDeleted = NULL; + SRSmaStat *pRSmaStat = (SRSmaStat *)SMA_ENV_STAT(pEnv); + SRSmaInfoItem *pItem = NULL; // step 1: merge qTaskInfo and iQTaskInfo // lock @@ -441,11 +377,7 @@ static int32_t tdProcessRSmaAsyncPostCommitImpl(SSma *pSma) { if (RSMA_INFO_IS_DEL(pRSmaInfo)) { int32_t refVal = T_REF_VAL_GET(pRSmaInfo); if (refVal == 0) { - if (!rsmaDeleted) { - if ((rsmaDeleted = taosArrayInit(1, sizeof(tb_uid_t)))) { - taosArrayPush(rsmaDeleted, pSuid); - } - } + taosHashRemove(RSMA_INFO_HASH(pRSmaStat), pSuid, sizeof(*pSuid)); } else { smaDebug( "vgId:%d, rsma async post commit, not free rsma info since ref is %d although already deleted for " @@ -471,25 +403,10 @@ static int32_t tdProcessRSmaAsyncPostCommitImpl(SSma *pSma) { #endif } - for (int32_t i = 0; i < taosArrayGetSize(rsmaDeleted); ++i) { - tb_uid_t *pSuid = taosArrayGet(rsmaDeleted, i); - void *pRSmaInfo = taosHashGet(RSMA_INFO_HASH(pRSmaStat), pSuid, sizeof(tb_uid_t)); - if ((pRSmaInfo = *(SRSmaInfo **)pRSmaInfo)) { - tdFreeRSmaInfo(pSma, pRSmaInfo, true); - smaDebug( - "vgId:%d, rsma async post commit, free rsma info since already deleted and ref is 0 for " - "table:%" PRIi64, - SMA_VID(pSma), *pSuid); - } - taosHashRemove(RSMA_INFO_HASH(pRSmaStat), pSuid, sizeof(tb_uid_t)); - } - taosArrayDestroy(rsmaDeleted); - // unlock // taosWUnLockLatch(SMA_ENV_LOCK(pEnv)); - // step 2: cleanup outdated qtaskinfo files - tdCleanupQTaskInfoFiles(pSma, pRSmaStat); + tdUpdateQTaskInfoFiles(pSma, pRSmaStat); atomic_store_8(RSMA_COMMIT_STAT(pRSmaStat), 0); diff --git a/source/dnode/vnode/src/sma/smaEnv.c b/source/dnode/vnode/src/sma/smaEnv.c index 32a419022a..8bf79ca30e 100644 --- a/source/dnode/vnode/src/sma/smaEnv.c +++ b/source/dnode/vnode/src/sma/smaEnv.c @@ -28,6 +28,8 @@ static int32_t tdInitSmaEnv(SSma *pSma, int8_t smaType, SSmaEnv **ppEnv); static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pSma); static int32_t tdRsmaStartExecutor(const SSma *pSma); static int32_t tdRsmaStopExecutor(const SSma *pSma); +static int32_t tdDestroySmaState(SSmaStat *pSmaStat, int8_t smaType); +static void *tdFreeSmaState(SSmaStat *pSmaStat, int8_t smaType); static void *tdFreeTSmaStat(STSmaStat *pStat); static void tdDestroyRSmaStat(void *pRSmaStat); @@ -59,12 +61,23 @@ int32_t smaInit() { return TSDB_CODE_FAILED; } + int32_t type = (8 == POINTER_BYTES) ? TSDB_DATA_TYPE_UBIGINT : TSDB_DATA_TYPE_UINT; + smaMgmt.refHash = taosHashInit(1, taosGetDefaultHashFunction(type), true, HASH_ENTRY_LOCK); + if (!smaMgmt.refHash) { + taosCloseRef(smaMgmt.rsetId); + atomic_store_8(&smaMgmt.inited, 0); + smaError("failed to init sma tmr hanle since %s", terrstr()); + return TSDB_CODE_FAILED; + } + // init fetch timer handle smaMgmt.tmrHandle = taosTmrInit(10000, 100, 10000, "RSMA"); if (!smaMgmt.tmrHandle) { taosCloseRef(smaMgmt.rsetId); + taosHashCleanup(smaMgmt.refHash); + smaMgmt.refHash = NULL; atomic_store_8(&smaMgmt.inited, 0); - smaError("failed to init sma tmr hanle since %s", terrstr()); + smaError("failed to init sma tmr handle since %s", terrstr()); return TSDB_CODE_FAILED; } @@ -93,6 +106,7 @@ void smaCleanUp() { if (old == 1) { taosCloseRef(smaMgmt.rsetId); + taosHashCleanup(smaMgmt.refHash); taosTmrCleanUp(smaMgmt.tmrHandle); smaInfo("sma mgmt env is cleaned up, rsetId:%d, tmrHandle:%p", smaMgmt.rsetId, smaMgmt.tmrHandle); atomic_store_8(&smaMgmt.inited, 0); @@ -195,6 +209,21 @@ int32_t tdUnRefRSmaInfo(SSma *pSma, SRSmaInfo *pRSmaInfo) { return 0; } +static void tRSmaInfoHashFreeNode(void *data) { + SRSmaInfo *pRSmaInfo = NULL; + SRSmaInfoItem *pItem = NULL; + + if ((pRSmaInfo = *(SRSmaInfo **)data)) { + if ((pItem = RSMA_INFO_ITEM((SRSmaInfo *)pRSmaInfo, 0)) && pItem->level) { + taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES); + } + if ((pItem = RSMA_INFO_ITEM((SRSmaInfo *)pRSmaInfo, 1)) && pItem->level) { + taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES); + } + tdFreeRSmaInfo(NULL, pRSmaInfo, true); + } +} + static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pSma) { ASSERT(pSmaStat != NULL); @@ -240,10 +269,16 @@ static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pS if (!RSMA_INFO_HASH(pRSmaStat)) { return TSDB_CODE_FAILED; } + taosHashSetFreeFp(RSMA_INFO_HASH(pRSmaStat), tRSmaInfoHashFreeNode); if (tdRsmaStartExecutor(pSma) < 0) { return TSDB_CODE_FAILED; } + + if (!(RSMA_FS(pRSmaStat)->aQTaskInf = taosArrayInit(1, sizeof(SQTaskFile)))) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return TSDB_CODE_FAILED; + } } else if (smaType == TSDB_SMA_TYPE_TIME_RANGE) { // TODO } else { @@ -278,14 +313,6 @@ static void tdDestroyRSmaStat(void *pRSmaStat) { tsem_destroy(&(pStat->notEmpty)); // step 2: destroy the rsma info and associated fetch tasks - if (taosHashGetSize(RSMA_INFO_HASH(pStat)) > 0) { - void *infoHash = taosHashIterate(RSMA_INFO_HASH(pStat), NULL); - while (infoHash) { - SRSmaInfo *pSmaInfo = *(SRSmaInfo **)infoHash; - tdFreeRSmaInfo(pSma, pSmaInfo, true); - infoHash = taosHashIterate(RSMA_INFO_HASH(pStat), infoHash); - } - } taosHashCleanup(RSMA_INFO_HASH(pStat)); // step 3: wait for all triggered fetch tasks to finish @@ -307,12 +334,15 @@ static void tdDestroyRSmaStat(void *pRSmaStat) { // step 4: tdRsmaStopExecutor(pSma); - // step 5: free pStat + // step 5: + tdRSmaFSClose(RSMA_FS(pStat)); + + // step 6: free pStat taosMemoryFreeClear(pStat); } } -void *tdFreeSmaState(SSmaStat *pSmaStat, int8_t smaType) { +static void *tdFreeSmaState(SSmaStat *pSmaStat, int8_t smaType) { tdDestroySmaState(pSmaStat, smaType); if (smaType == TSDB_SMA_TYPE_TIME_RANGE) { taosMemoryFreeClear(pSmaStat); @@ -329,7 +359,7 @@ void *tdFreeSmaState(SSmaStat *pSmaStat, int8_t smaType) { * @return int32_t */ -int32_t tdDestroySmaState(SSmaStat *pSmaStat, int8_t smaType) { +static int32_t tdDestroySmaState(SSmaStat *pSmaStat, int8_t smaType) { if (pSmaStat) { if (smaType == TSDB_SMA_TYPE_TIME_RANGE) { tdDestroyTSmaStat(SMA_STAT_TSMA(pSmaStat)); @@ -337,7 +367,7 @@ int32_t tdDestroySmaState(SSmaStat *pSmaStat, int8_t smaType) { SRSmaStat *pRSmaStat = &pSmaStat->rsmaStat; int32_t vid = SMA_VID(pRSmaStat->pSma); int64_t refId = RSMA_REF_ID(pRSmaStat); - if (taosRemoveRef(smaMgmt.rsetId, RSMA_REF_ID(pRSmaStat)) < 0) { + if (taosRemoveRef(smaMgmt.rsetId, refId) < 0) { smaError("vgId:%d, remove refId:%" PRIi64 " from rsmaRef:%" PRIi32 " failed since %s", vid, refId, smaMgmt.rsetId, terrstr()); } else { diff --git a/source/dnode/vnode/src/sma/smaFS.c b/source/dnode/vnode/src/sma/smaFS.c new file mode 100644 index 0000000000..4387db553e --- /dev/null +++ b/source/dnode/vnode/src/sma/smaFS.c @@ -0,0 +1,252 @@ +/* + * 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" + +// ================================================================================================= + +static int32_t tdFetchQTaskInfoFiles(SSma *pSma, int64_t version, SArray **output); +static int32_t tdQTaskInfCmprFn1(const void *p1, const void *p2); +static int32_t tdQTaskInfCmprFn2(const void *p1, const void *p2); +/** + * @brief Open RSma FS from qTaskInfo files + * + * @param pSma + * @param version + * @return int32_t + */ +int32_t tdRSmaFSOpen(SSma *pSma, int64_t version) { + SVnode *pVnode = pSma->pVnode; + int64_t commitID = pVnode->state.commitID; + SSmaEnv *pEnv = SMA_RSMA_ENV(pSma); + SRSmaStat *pStat = NULL; + SArray *output = NULL; + + terrno = TSDB_CODE_SUCCESS; + + if (!pEnv) { + return TSDB_CODE_SUCCESS; + } + + if (tdFetchQTaskInfoFiles(pSma, version, &output) < 0) { + goto _end; + } + + pStat = (SRSmaStat *)SMA_ENV_STAT(pEnv); + + for (int32_t i = 0; i < taosArrayGetSize(output); ++i) { + int32_t vid = 0; + int64_t version = -1; + sscanf((const char *)taosArrayGetP(output, i), "v%dqinfo.v%" PRIi64, &vid, &version); + SQTaskFile qTaskFile = {.version = version, .nRef = 1}; + if ((terrno = tdRSmaFSUpsertQTaskFile(RSMA_FS(pStat), &qTaskFile)) < 0) { + goto _end; + } + smaInfo("vgId:%d, open fs, version:%" PRIi64 ", ref:%" PRIi64, TD_VID(pVnode), qTaskFile.version, qTaskFile.nRef); + } + +_end: + for (int32_t i = 0; i < taosArrayGetSize(output); ++i) { + void *ptr = taosArrayGetP(output, i); + taosMemoryFreeClear(ptr); + } + taosArrayDestroy(output); + + if (terrno != TSDB_CODE_SUCCESS) { + smaError("vgId:%d, open rsma fs failed since %s", TD_VID(pVnode), terrstr()); + return TSDB_CODE_FAILED; + } + return TSDB_CODE_SUCCESS; +} + +void tdRSmaFSClose(SRSmaFS *fs) { taosArrayDestroy(fs->aQTaskInf); } + +static int32_t tdQTaskInfCmprFn1(const void *p1, const void *p2) { + if (*(int64_t *)p1 < ((SQTaskFile *)p2)->version) { + return -1; + } else if (*(int64_t *)p1 > ((SQTaskFile *)p2)->version) { + return 1; + } + return 0; +} + +int32_t tdRSmaFSRef(SSma *pSma, SRSmaStat *pStat, int64_t version) { + SArray *aQTaskInf = RSMA_FS(pStat)->aQTaskInf; + SQTaskFile *pTaskF = NULL; + int32_t oldVal = 0; + + taosRLockLatch(RSMA_FS_LOCK(pStat)); + if ((pTaskF = taosArraySearch(aQTaskInf, &version, tdQTaskInfCmprFn1, TD_EQ))) { + oldVal = atomic_fetch_add_32(&pTaskF->nRef, 1); + ASSERT(oldVal > 0); + } + taosRUnLockLatch(RSMA_FS_LOCK(pStat)); + return oldVal; +} + +void tdRSmaFSUnRef(SSma *pSma, SRSmaStat *pStat, int64_t version) { + SVnode *pVnode = pSma->pVnode; + SArray *aQTaskInf = RSMA_FS(pStat)->aQTaskInf; + char qTaskFullName[TSDB_FILENAME_LEN]; + SQTaskFile *pTaskF = NULL; + int32_t idx = -1; + + taosWLockLatch(RSMA_FS_LOCK(pStat)); + if ((idx = taosArraySearchIdx(aQTaskInf, &version, tdQTaskInfCmprFn1, TD_EQ)) >= 0) { + ASSERT(idx < taosArrayGetSize(aQTaskInf)); + pTaskF = taosArrayGet(aQTaskInf, idx); + if (atomic_sub_fetch_32(&pTaskF->nRef, 1) <= 0) { + tdRSmaQTaskInfoGetFullName(TD_VID(pVnode), pTaskF->version, tfsGetPrimaryPath(pVnode->pTfs), qTaskFullName); + if (taosRemoveFile(qTaskFullName) < 0) { + smaWarn("vgId:%d, failed to remove %s since %s", TD_VID(pVnode), qTaskFullName, + tstrerror(TAOS_SYSTEM_ERROR(errno))); + } else { + smaDebug("vgId:%d, success to remove %s", TD_VID(pVnode), qTaskFullName); + } + taosArrayRemove(aQTaskInf, idx); + } + } + taosWUnLockLatch(RSMA_FS_LOCK(pStat)); +} + +/** + * @brief Fetch qtaskfiles LE than version + * + * @param pSma + * @param version + * @param output + * @return int32_t + */ +static int32_t tdFetchQTaskInfoFiles(SSma *pSma, int64_t version, SArray **output) { + SVnode *pVnode = pSma->pVnode; + TdDirPtr pDir = NULL; + TdDirEntryPtr pDirEntry = NULL; + char dir[TSDB_FILENAME_LEN]; + const char *pattern = "v[0-9]+qinf\\.v([0-9]+)?$"; + regex_t regex; + int code = 0; + + tdGetVndDirName(TD_VID(pVnode), tfsGetPrimaryPath(pVnode->pTfs), VNODE_RSMA_DIR, true, dir); + + if (!taosCheckExistFile(dir)) { + smaDebug("vgId:%d, fetch qtask files, no need as dir %s not exist", TD_VID(pVnode), dir); + return TSDB_CODE_SUCCESS; + } + + // Resource allocation and init + if ((code = regcomp(®ex, pattern, REG_EXTENDED)) != 0) { + terrno = TSDB_CODE_RSMA_REGEX_MATCH; + char errbuf[128]; + regerror(code, ®ex, errbuf, sizeof(errbuf)); + smaWarn("vgId:%d, fetch qtask files, regcomp for %s failed since %s", TD_VID(pVnode), dir, errbuf); + return TSDB_CODE_FAILED; + } + + if (!(pDir = taosOpenDir(dir))) { + regfree(®ex); + terrno = TAOS_SYSTEM_ERROR(errno); + smaError("vgId:%d, fetch qtask files, open dir %s failed since %s", TD_VID(pVnode), dir, terrstr()); + return TSDB_CODE_FAILED; + } + + int32_t dirLen = strlen(dir); + char *dirEnd = POINTER_SHIFT(dir, dirLen); + regmatch_t regMatch[2]; + while ((pDirEntry = taosReadDir(pDir))) { + char *entryName = taosGetDirEntryName(pDirEntry); + if (!entryName) { + continue; + } + + code = regexec(®ex, entryName, 2, regMatch, 0); + + if (code == 0) { + // match + smaInfo("vgId:%d, fetch qtask files, max ver:%" PRIi64 ", %s found", TD_VID(pVnode), version, entryName); + + int64_t ver = -1; + sscanf((const char *)POINTER_SHIFT(entryName, regMatch[1].rm_so), "%" PRIi64, &ver); + if ((ver <= version) && (ver > -1)) { + if (!(*output)) { + if (!(*output = taosArrayInit(1, POINTER_BYTES))) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _end; + } + } + char *entryDup = strdup(entryName); + if (!entryDup) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _end; + } + if (!taosArrayPush(*output, &entryDup)) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _end; + } + } else { + } + } else if (code == REG_NOMATCH) { + // not match + smaTrace("vgId:%d, fetch qtask files, not match %s", TD_VID(pVnode), entryName); + continue; + } else { + // has other error + char errbuf[128]; + regerror(code, ®ex, errbuf, sizeof(errbuf)); + smaWarn("vgId:%d, fetch qtask files, regexec failed since %s", TD_VID(pVnode), errbuf); + terrno = TSDB_CODE_RSMA_REGEX_MATCH; + goto _end; + } + } +_end: + taosCloseDir(&pDir); + regfree(®ex); + return terrno == 0 ? TSDB_CODE_SUCCESS : TSDB_CODE_FAILED; +} + +static int32_t tdQTaskFileCmprFn2(const void *p1, const void *p2) { + if (((SQTaskFile *)p1)->version < ((SQTaskFile *)p2)->version) { + return -1; + } else if (((SQTaskFile *)p1)->version > ((SQTaskFile *)p2)->version) { + return 1; + } + + return 0; +} + +int32_t tdRSmaFSUpsertQTaskFile(SRSmaFS *pFS, SQTaskFile *qTaskFile) { + int32_t code = 0; + int32_t idx = taosArraySearchIdx(pFS->aQTaskInf, qTaskFile, tdQTaskFileCmprFn2, TD_GE); + + if (idx < 0) { + idx = taosArrayGetSize(pFS->aQTaskInf); + } else { + SQTaskFile *pTaskF = (SQTaskFile *)taosArrayGet(pFS->aQTaskInf, idx); + int32_t c = tdQTaskFileCmprFn2(pTaskF, qTaskFile); + if (c == 0) { + pTaskF->nRef = qTaskFile->nRef; + pTaskF->version = qTaskFile->version; + pTaskF->size = qTaskFile->size; + goto _exit; + } + } + + if (taosArrayInsert(pFS->aQTaskInf, idx, qTaskFile) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + +_exit: + return code; +} \ No newline at end of file diff --git a/source/dnode/vnode/src/sma/smaOpen.c b/source/dnode/vnode/src/sma/smaOpen.c index 3c3097bb2f..d9ffda279f 100644 --- a/source/dnode/vnode/src/sma/smaOpen.c +++ b/source/dnode/vnode/src/sma/smaOpen.c @@ -150,7 +150,7 @@ int32_t smaOpen(SVnode *pVnode) { } // restore the rsma - if (tdRsmaRestore(pSma, RSMA_RESTORE_REBOOT, pVnode->state.committed) < 0) { + if (tdRSmaRestore(pSma, RSMA_RESTORE_REBOOT, pVnode->state.committed) < 0) { goto _err; } } @@ -181,8 +181,8 @@ int32_t smaClose(SSma *pSma) { * @param committedVer * @return int32_t */ -int32_t tdRsmaRestore(SSma *pSma, int8_t type, int64_t committedVer) { +int32_t tdRSmaRestore(SSma *pSma, int8_t type, int64_t committedVer) { ASSERT(VND_IS_RSMA(pSma->pVnode)); - return tdProcessRSmaRestoreImpl(pSma, type, committedVer); + return tdRSmaProcessRestoreImpl(pSma, type, committedVer); } \ No newline at end of file diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index f2063e3067..6732403846 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -20,7 +20,7 @@ #define RSMA_QTASKEXEC_SMOOTH_SIZE (100) // cnt #define RSMA_SUBMIT_BATCH_SIZE (1024) // cnt #define RSMA_FETCH_DELAY_MAX (900000) // ms -#define RSMA_FETCH_ACTIVE_MAX (1800) // ms +#define RSMA_FETCH_ACTIVE_MAX (1000) // ms #define RSMA_FETCH_INTERVAL (5000) // ms SSmaMgmt smaMgmt = { @@ -42,10 +42,12 @@ static int32_t tdExecuteRSmaImpl(SSma *pSma, const void *pMsg, int32_t msgSiz static SRSmaInfo *tdAcquireRSmaInfoBySuid(SSma *pSma, int64_t suid); static void tdReleaseRSmaInfo(SSma *pSma, SRSmaInfo *pInfo); static void tdFreeRSmaSubmitItems(SArray *pItems); -static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo, SArray *pSubmitArr); +static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo); static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSmaInfoItem *pItem, STSchema *pTSchema, int64_t suid); static void tdRSmaFetchTrigger(void *param, void *tmrId); +static int32_t tdRSmaInfoClone(SSma *pSma, SRSmaInfo *pInfo); +static void tdRSmaQTaskInfoFree(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level); static int32_t tdRSmaQTaskInfoIterInit(SRSmaQTaskInfoIter *pIter, STFile *pTFile); static int32_t tdRSmaQTaskInfoIterNextBlock(SRSmaQTaskInfoIter *pIter, bool *isFinish); static int32_t tdRSmaQTaskInfoRestore(SSma *pSma, int8_t type, SRSmaQTaskInfoIter *pIter); @@ -96,7 +98,7 @@ static FORCE_INLINE int32_t tdRSmaQTaskInfoContLen(int32_t lenWithHead) { static FORCE_INLINE void tdRSmaQTaskInfoIterDestroy(SRSmaQTaskInfoIter *pIter) { taosMemoryFreeClear(pIter->pBuf); } -void tdFreeQTaskInfo(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level) { +static void tdRSmaQTaskInfoFree(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level) { // Note: free/kill may in RC if (!taskHandle || !(*taskHandle)) return; qTaskInfo_t otaskHandle = atomic_load_ptr(taskHandle); @@ -119,27 +121,27 @@ void tdFreeQTaskInfo(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level) { */ void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo, bool isDeepFree) { if (pInfo) { + int32_t vid = pSma ? SMA_VID(pSma) : -1; for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) { SRSmaInfoItem *pItem = &pInfo->items[i]; if (isDeepFree && pItem->tmrId) { - smaDebug("vgId:%d, stop fetch timer %p for table %" PRIi64 " level %d", SMA_VID(pSma), pInfo->suid, - pItem->tmrId, i + 1); + smaDebug("vgId:%d, stop fetch timer %p for table %" PRIi64 " level %d", vid, pItem->tmrId, pInfo->suid, i + 1); taosTmrStopA(&pItem->tmrId); } if (isDeepFree && pInfo->taskInfo[i]) { - tdFreeQTaskInfo(&pInfo->taskInfo[i], SMA_VID(pSma), i + 1); + tdRSmaQTaskInfoFree(&pInfo->taskInfo[i], vid, i + 1); } else { - smaDebug("vgId:%d, table %" PRIi64 " no need to destroy rsma info level %d since empty taskInfo", SMA_VID(pSma), + smaDebug("vgId:%d, table %" PRIi64 " no need to destroy rsma info level %d since empty taskInfo", vid, pInfo->suid, i + 1); } if (pInfo->iTaskInfo[i]) { - tdFreeQTaskInfo(&pInfo->iTaskInfo[i], SMA_VID(pSma), i + 1); + tdRSmaQTaskInfoFree(&pInfo->iTaskInfo[i], vid, i + 1); } else { - smaDebug("vgId:%d, table %" PRIi64 " no need to destroy rsma info level %d since empty iTaskInfo", - SMA_VID(pSma), pInfo->suid, i + 1); + smaDebug("vgId:%d, table %" PRIi64 " no need to destroy rsma info level %d since empty iTaskInfo", vid, + pInfo->suid, i + 1); } } if (isDeepFree) { @@ -313,10 +315,17 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat } pItem->level = idx == 0 ? TSDB_RETENTION_L1 : TSDB_RETENTION_L2; + ASSERT(pItem->level > 0); + + SRSmaRef rsmaRef = {.refId = pStat->refId, .suid = pRSmaInfo->suid}; + taosHashPut(smaMgmt.refHash, &pItem, POINTER_BYTES, &rsmaRef, sizeof(rsmaRef)); + taosTmrReset(tdRSmaFetchTrigger, pItem->maxDelay, pItem, smaMgmt.tmrHandle, &pItem->tmrId); - smaInfo("vgId:%d, table:%" PRIi64 " level:%" PRIi8 " maxdelay:%" PRIi64 " watermark:%" PRIi64 + + smaInfo("vgId:%d, item:%p table:%" PRIi64 " level:%" PRIi8 " maxdelay:%" PRIi64 " watermark:%" PRIi64 ", finally maxdelay:%" PRIi32, - TD_VID(pVnode), pRSmaInfo->suid, idx + 1, param->maxdelay[idx], param->watermark[idx], pItem->maxDelay); + TD_VID(pVnode), pItem, pRSmaInfo->suid, idx + 1, param->maxdelay[idx], param->watermark[idx], + pItem->maxDelay); } return TSDB_CODE_SUCCESS; } @@ -330,7 +339,7 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat * @param tbName * @return int32_t */ -int32_t tdProcessRSmaCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, const char *tbName) { +int32_t tdRSmaProcessCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, const char *tbName) { if ((param->qmsgLen[0] == 0) && (param->qmsgLen[1] == 0)) { smaDebug("vgId:%d, no qmsg1/qmsg2 for rollup table %s %" PRIi64, SMA_VID(pSma), tbName, suid); return TSDB_CODE_SUCCESS; @@ -383,7 +392,6 @@ int32_t tdProcessRSmaCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, con goto _err; } pRSmaInfo->suid = suid; - pRSmaInfo->refId = RSMA_REF_ID(pStat); T_REF_INIT_VAL(pRSmaInfo, 1); if (tdSetRSmaInfoItemParams(pSma, param, pStat, pRSmaInfo, 0) < 0) { @@ -427,7 +435,7 @@ int32_t tdProcessRSmaCreate(SSma *pSma, SVCreateStbReq *pReq) { return TSDB_CODE_SUCCESS; } - return tdProcessRSmaCreateImpl(pSma, &pReq->rsmaParam, pReq->suid, pReq->name); + return tdRSmaProcessCreateImpl(pSma, &pReq->rsmaParam, pReq->suid, pReq->name); } /** @@ -654,15 +662,15 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSma if (taosArrayGetSize(pResList) == 0) { if (terrno == 0) { - // smaDebug("vgId:%d, no rsma %" PRIi8 " data fetched yet", SMA_VID(pSma), pItem->level); + // smaDebug("vgId:%d, no rsma level %" PRIi8 " data fetched yet", SMA_VID(pSma), pItem->level); } else { - smaDebug("vgId:%d, no rsma %" PRIi8 " data fetched since %s", SMA_VID(pSma), pItem->level, terrstr()); + smaDebug("vgId:%d, no rsma level %" PRIi8 " data fetched since %s", SMA_VID(pSma), pItem->level, terrstr()); goto _err; } break; } else { - smaDebug("vgId:%d, rsma %" PRIi8 " data fetched", SMA_VID(pSma), pItem->level); + smaDebug("vgId:%d, rsma level %" PRIi8 " data fetched", SMA_VID(pSma), pItem->level); } #if 0 char flag[10] = {0}; @@ -676,21 +684,22 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSma // TODO: the schema update should be handled later(TD-17965) if (buildSubmitReqFromDataBlock(&pReq, output, pTSchema, SMA_VID(pSma), suid) < 0) { - smaError("vgId:%d, build submit req for rsma stable %" PRIi64 " level %" PRIi8 " failed since %s", - SMA_VID(pSma), suid, pItem->level, terrstr()); + smaError("vgId:%d, build submit req for rsma table %" PRIi64 " level %" PRIi8 " failed since %s", SMA_VID(pSma), + suid, pItem->level, terrstr()); goto _err; } if (pReq && tdProcessSubmitReq(sinkTsdb, output->info.version, pReq) < 0) { taosMemoryFreeClear(pReq); - smaError("vgId:%d, process submit req for rsma stable %" PRIi64 " level %" PRIi8 " failed since %s", + smaError("vgId:%d, process submit req for rsma table %" PRIi64 " level %" PRIi8 " failed since %s", SMA_VID(pSma), suid, pItem->level, terrstr()); goto _err; } - taosMemoryFreeClear(pReq); - smaDebug("vgId:%d, process submit req for rsma table %" PRIi64 " level %" PRIi8 " version:%" PRIi64, - SMA_VID(pSma), suid, pItem->level, output->info.version); + smaDebug("vgId:%d, process submit req for rsma table %" PRIi64 " level %" PRIi8 " ver %" PRIi64 " len %" PRIu32, + SMA_VID(pSma), suid, pItem->level, output->info.version, htonl(pReq->header.contLen)); + + taosMemoryFreeClear(pReq); } } @@ -817,6 +826,95 @@ static int32_t tdExecuteRSmaImpl(SSma *pSma, const void *pMsg, int32_t msgSize, return TSDB_CODE_SUCCESS; } +static int32_t tdCloneQTaskInfo(SSma *pSma, qTaskInfo_t dstTaskInfo, qTaskInfo_t srcTaskInfo, SRSmaParam *param, + tb_uid_t suid, int8_t idx) { + SVnode *pVnode = pSma->pVnode; + char *pOutput = NULL; + int32_t len = 0; + + if ((terrno = qSerializeTaskStatus(srcTaskInfo, &pOutput, &len)) < 0) { + smaError("vgId:%d, rsma clone, table %" PRIi64 " serialize qTaskInfo failed since %s", TD_VID(pVnode), suid, + terrstr()); + goto _err; + } + + SReadHandle handle = { + .meta = pVnode->pMeta, + .vnode = pVnode, + .initTqReader = 1, + }; + ASSERT(!dstTaskInfo); + dstTaskInfo = qCreateStreamExecTaskInfo(param->qmsg[idx], &handle); + if (!dstTaskInfo) { + terrno = TSDB_CODE_RSMA_QTASKINFO_CREATE; + goto _err; + } + + if (qDeserializeTaskStatus(dstTaskInfo, pOutput, len) < 0) { + smaError("vgId:%d, rsma clone, restore rsma task for table:%" PRIi64 " failed since %s", TD_VID(pVnode), suid, + terrstr()); + goto _err; + } + + smaDebug("vgId:%d, rsma clone, restore rsma task for table:%" PRIi64 " succeed", TD_VID(pVnode), suid); + + taosMemoryFreeClear(pOutput); + return TSDB_CODE_SUCCESS; +_err: + taosMemoryFreeClear(pOutput); + tdRSmaQTaskInfoFree(dstTaskInfo, TD_VID(pVnode), idx + 1); + smaError("vgId:%d, rsma clone, restore rsma task for table:%" PRIi64 " failed since %s", TD_VID(pVnode), suid, + terrstr()); + return TSDB_CODE_FAILED; +} + +/** + * @brief Clone qTaskInfo of SRSmaInfo + * + * @param pSma + * @param pInfo + * @return int32_t + */ +static int32_t tdRSmaInfoClone(SSma *pSma, SRSmaInfo *pInfo) { + SRSmaParam *param = NULL; + if (!pInfo) { + return TSDB_CODE_SUCCESS; + } + + SMetaReader mr = {0}; + metaReaderInit(&mr, SMA_META(pSma), 0); + smaDebug("vgId:%d, rsma clone qTaskInfo for suid:%" PRIi64, SMA_VID(pSma), pInfo->suid); + if (metaGetTableEntryByUid(&mr, pInfo->suid) < 0) { + smaError("vgId:%d, rsma clone, failed to get table meta for %" PRIi64 " since %s", SMA_VID(pSma), pInfo->suid, + terrstr()); + goto _err; + } + ASSERT(mr.me.type == TSDB_SUPER_TABLE); + ASSERT(mr.me.uid == pInfo->suid); + if (TABLE_IS_ROLLUP(mr.me.flags)) { + param = &mr.me.stbEntry.rsmaParam; + for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) { + if (!pInfo->iTaskInfo[i]) { + continue; + } + if (tdCloneQTaskInfo(pSma, pInfo->taskInfo[i], pInfo->iTaskInfo[i], param, pInfo->suid, i) < 0) { + goto _err; + } + } + smaDebug("vgId:%d, rsma clone env success for %" PRIi64, SMA_VID(pSma), pInfo->suid); + } else { + terrno = TSDB_CODE_RSMA_INVALID_SCHEMA; + goto _err; + } + + metaReaderClear(&mr); + return TSDB_CODE_SUCCESS; +_err: + metaReaderClear(&mr); + smaError("vgId:%d, rsma clone env failed for %" PRIi64 " since %s", SMA_VID(pSma), pInfo->suid, terrstr()); + return TSDB_CODE_FAILED; +} + /** * @brief During async commit, the SRSmaInfo object would be COW from iRSmaInfoHash and write lock should be applied. * @@ -848,7 +946,7 @@ static SRSmaInfo *tdAcquireRSmaInfoBySuid(SSma *pSma, int64_t suid) { return NULL; } if (!pRSmaInfo->taskInfo[0]) { - if (tdCloneRSmaInfo(pSma, pRSmaInfo) < 0) { + if (tdRSmaInfoClone(pSma, pRSmaInfo) < 0) { // taosRUnLockLatch(SMA_ENV_LOCK(pEnv)); return NULL; } @@ -1006,7 +1104,7 @@ static int32_t tdRSmaRestoreQTaskInfoInit(SSma *pSma, int64_t *nTables) { " qmsgLen:%" PRIi32, TD_VID(pVnode), suid, i, param->maxdelay[i], param->watermark[i], param->qmsgLen[i]); } - if (tdProcessRSmaCreateImpl(pSma, &mr.me.stbEntry.rsmaParam, suid, mr.me.name) < 0) { + if (tdRSmaProcessCreateImpl(pSma, &mr.me.stbEntry.rsmaParam, suid, mr.me.name) < 0) { smaError("vgId:%d, rsma restore env failed for %" PRIi64 " since %s", TD_VID(pVnode), suid, terrstr()); goto _err; } @@ -1118,7 +1216,7 @@ static int32_t tdRSmaRestoreTSDataReload(SSma *pSma) { return TSDB_CODE_SUCCESS; } -int32_t tdProcessRSmaRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer) { +int32_t tdRSmaProcessRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer) { // step 1: iterate all stables to restore the rsma env int64_t nTables = 0; if (tdRSmaRestoreQTaskInfoInit(pSma, &nTables) < 0) { @@ -1139,6 +1237,12 @@ int32_t tdProcessRSmaRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer) if (tdRSmaRestoreTSDataReload(pSma) < 0) { goto _err; } + + // step 4: open SRSmaFS for qTaskFiles + if (tdRSmaFSOpen(pSma, qtaskFileVer) < 0) { + goto _err; + } + smaInfo("vgId:%d, restore rsma task %" PRIi8 " from qtaskf %" PRIi64 " succeed", SMA_VID(pSma), type, qtaskFileVer); return TSDB_CODE_SUCCESS; _err: @@ -1468,26 +1572,46 @@ _err: * @param tmrId */ static void tdRSmaFetchTrigger(void *param, void *tmrId) { - SRSmaInfoItem *pItem = param; + SRSmaRef *pRSmaRef = NULL; SSma *pSma = NULL; - SRSmaInfo *pRSmaInfo = tdGetRSmaInfoByItem(pItem); + SRSmaStat *pStat = NULL; + SRSmaInfo *pRSmaInfo = NULL; + SRSmaInfoItem *pItem = NULL; - if (RSMA_INFO_IS_DEL(pRSmaInfo)) { - smaDebug("rsma fetch task not start since rsma info already deleted, rsetId:%" PRIi64 " refId:%d)", smaMgmt.rsetId, - pRSmaInfo->refId); + if (!(pRSmaRef = taosHashGet(smaMgmt.refHash, ¶m, POINTER_BYTES))) { + smaDebug("rsma fetch task not start since rsma info item:%p not exist in refHash:%p, rsetId:%" PRIi64, param, + *(int64_t *)¶m, smaMgmt.refHash, smaMgmt.rsetId); return; } - SRSmaStat *pStat = (SRSmaStat *)tdAcquireSmaRef(smaMgmt.rsetId, pRSmaInfo->refId); - - if (!pStat) { + if (!(pStat = (SRSmaStat *)tdAcquireSmaRef(smaMgmt.rsetId, pRSmaRef->refId))) { smaDebug("rsma fetch task not start since rsma stat already destroyed, rsetId:%" PRIi64 " refId:%d)", - smaMgmt.rsetId, pRSmaInfo->refId); + smaMgmt.rsetId, pRSmaRef->refId); // pRSmaRef freed in taosHashRemove + taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); return; } pSma = pStat->pSma; + if (!(pRSmaInfo = tdAcquireRSmaInfoBySuid(pSma, pRSmaRef->suid))) { + smaDebug("rsma fetch task not start since rsma info not exist, rsetId:%" PRIi64 " refId:%d)", smaMgmt.rsetId, + pRSmaRef->refId); // pRSmaRef freed in taosHashRemove + tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); + taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); + return; + } + + if (RSMA_INFO_IS_DEL(pRSmaInfo)) { + smaDebug("rsma fetch task not start since rsma info already deleted, rsetId:%" PRIi64 " refId:%d)", smaMgmt.rsetId, + pRSmaRef->refId); // pRSmaRef freed in taosHashRemove + tdReleaseRSmaInfo(pSma, pRSmaInfo); + tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); + taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); + return; + } + + pItem = *(SRSmaInfoItem **)¶m; + // if rsma trigger stat in paused, cancelled or finished, not start fetch task int8_t rsmaTriggerStat = atomic_load_8(RSMA_TRIGGER_STAT(pStat)); switch (rsmaTriggerStat) { @@ -1495,11 +1619,12 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { case TASK_TRIGGER_STAT_CANCELLED: { smaDebug("vgId:%d, rsma fetch task not start for level %" PRIi8 " since stat is %" PRIi8 ", rsetId rsetId:%" PRIi64 " refId:%d", - SMA_VID(pSma), pItem->level, rsmaTriggerStat, smaMgmt.rsetId, pRSmaInfo->refId); + SMA_VID(pSma), pItem->level, rsmaTriggerStat, smaMgmt.rsetId, pRSmaRef->refId); if (rsmaTriggerStat == TASK_TRIGGER_STAT_PAUSED) { taosTmrReset(tdRSmaFetchTrigger, RSMA_FETCH_INTERVAL, pItem, smaMgmt.tmrHandle, &pItem->tmrId); } - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaInfo->refId); + tdReleaseRSmaInfo(pSma, pRSmaInfo); + tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); return; } default: @@ -1511,7 +1636,7 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { switch (fetchTriggerStat) { case TASK_TRIGGER_STAT_ACTIVE: { smaDebug("vgId:%d, rsma fetch task planned for level:%" PRIi8 " suid:%" PRIi64 " since stat is active", - SMA_VID(pSma), pItem->level, pRSmaInfo->suid); + SMA_VID(pSma), pItem->level, pRSmaInfo->suid); // async process pItem->fetchLevel = pItem->level; #if 0 @@ -1544,11 +1669,11 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { _end: taosTmrReset(tdRSmaFetchTrigger, pItem->maxDelay, pItem, smaMgmt.tmrHandle, &pItem->tmrId); - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaInfo->refId); + tdReleaseRSmaInfo(pSma, pRSmaInfo); + tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); } static void tdFreeRSmaSubmitItems(SArray *pItems) { - ASSERT(taosArrayGetSize(pItems) > 0); for (int32_t i = 0; i < taosArrayGetSize(pItems); ++i) { taosFreeQitem(*(void **)taosArrayGet(pItems, i)); } @@ -1560,10 +1685,9 @@ static void tdFreeRSmaSubmitItems(SArray *pItems) { * * @param pSma * @param pInfo - * @param pSubmitArr * @return int32_t */ -static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo, SArray *pSubmitArr) { +static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo) { SSDataBlock dataBlock = {.info.type = STREAM_GET_ALL}; for (int8_t i = 1; i <= TSDB_RETENTION_L2; ++i) { SRSmaInfoItem *pItem = RSMA_INFO_ITEM(pInfo, i - 1); @@ -1609,10 +1733,8 @@ static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo, SArray *pSubmi } _end: - tdReleaseRSmaInfo(pSma, pInfo); return TSDB_CODE_SUCCESS; _err: - tdReleaseRSmaInfo(pSma, pInfo); return TSDB_CODE_FAILED; } @@ -1709,7 +1831,7 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) { if (oldStat == 0 || ((oldStat == 2) && atomic_load_8(RSMA_TRIGGER_STAT(pRSmaStat)) < TASK_TRIGGER_STAT_PAUSED)) { atomic_fetch_add_32(&pRSmaStat->nFetchAll, 1); - tdRSmaFetchAllResult(pSma, pInfo, pSubmitArr); + tdRSmaFetchAllResult(pSma, pInfo); if (0 == atomic_sub_fetch_32(&pRSmaStat->nFetchAll, 1)) { atomic_store_8(RSMA_COMMIT_STAT(pRSmaStat), 0); } diff --git a/source/dnode/vnode/src/sma/smaSnapshot.c b/source/dnode/vnode/src/sma/smaSnapshot.c index 335c15a539..5a0167a75f 100644 --- a/source/dnode/vnode/src/sma/smaSnapshot.c +++ b/source/dnode/vnode/src/sma/smaSnapshot.c @@ -15,11 +15,13 @@ #include "sma.h" -static int32_t rsmaSnapReadQTaskInfo(SRsmaSnapReader* pReader, uint8_t** ppData); -static int32_t rsmaSnapWriteQTaskInfo(SRsmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData); +static int32_t rsmaSnapReadQTaskInfo(SRSmaSnapReader* pReader, uint8_t** ppData); +static int32_t rsmaSnapWriteQTaskInfo(SRSmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData); +static int32_t rsmaQTaskInfSnapReaderOpen(SRSmaSnapReader* pReader, int64_t version); +static int32_t rsmaQTaskInfSnapReaderClose(SQTaskFReader** ppReader); -// SRsmaSnapReader ======================================== -struct SRsmaSnapReader { +// SRSmaSnapReader ======================================== +struct SRSmaSnapReader { SSma* pSma; int64_t sver; int64_t ever; @@ -33,13 +35,13 @@ struct SRsmaSnapReader { SQTaskFReader* pQTaskFReader; }; -int32_t rsmaSnapReaderOpen(SSma* pSma, int64_t sver, int64_t ever, SRsmaSnapReader** ppReader) { +int32_t rsmaSnapReaderOpen(SSma* pSma, int64_t sver, int64_t ever, SRSmaSnapReader** ppReader) { int32_t code = 0; SVnode* pVnode = pSma->pVnode; - SRsmaSnapReader* pReader = NULL; + SRSmaSnapReader* pReader = NULL; // alloc - pReader = (SRsmaSnapReader*)taosMemoryCalloc(1, sizeof(*pReader)); + pReader = (SRSmaSnapReader*)taosMemoryCalloc(1, sizeof(*pReader)); if (pReader == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; @@ -48,7 +50,7 @@ int32_t rsmaSnapReaderOpen(SSma* pSma, int64_t sver, int64_t ever, SRsmaSnapRead pReader->sver = sver; pReader->ever = ever; - // rsma1/rsma2 + // open rsma1/rsma2 for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) { if (pSma->pRSmaTsdb[i]) { code = tsdbSnapReaderOpen(pSma->pRSmaTsdb[i], sver, ever, i == 0 ? SNAP_DATA_RSMA1 : SNAP_DATA_RSMA2, @@ -59,51 +61,112 @@ int32_t rsmaSnapReaderOpen(SSma* pSma, int64_t sver, int64_t ever, SRsmaSnapRead } } - // qtaskinfo - // 1. add ref to qtaskinfo.v${ever} if exists and then start to replicate - char qTaskInfoFullName[TSDB_FILENAME_LEN]; - tdRSmaQTaskInfoGetFullName(TD_VID(pVnode), ever, tfsGetPrimaryPath(pVnode->pTfs), qTaskInfoFullName); - - if (!taosCheckExistFile(qTaskInfoFullName)) { - smaInfo("vgId:%d, vnode snapshot rsma reader for qtaskinfo not need as %s not exists", TD_VID(pVnode), - qTaskInfoFullName); - } else { - pReader->pQTaskFReader = taosMemoryCalloc(1, sizeof(SQTaskFReader)); - if (!pReader->pQTaskFReader) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - - TdFilePtr qTaskF = taosOpenFile(qTaskInfoFullName, TD_FILE_READ); - if (!qTaskF) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - pReader->pQTaskFReader->pReadH = qTaskF; -#if 0 - SQTaskFile* pQTaskF = &pReader->pQTaskFReader->fTask; - pQTaskF->nRef = 1; -#endif + // open qtaskinfo + if ((code = rsmaQTaskInfSnapReaderOpen(pReader, ever)) < 0) { + goto _err; } *ppReader = pReader; - smaInfo("vgId:%d, vnode snapshot rsma reader opened %s succeed", TD_VID(pVnode), qTaskInfoFullName); + return TSDB_CODE_SUCCESS; _err: - smaError("vgId:%d, vnode snapshot rsma reader opened failed since %s", TD_VID(pVnode), tstrerror(code)); + smaError("vgId:%d, vnode snapshot rsma reader open failed since %s", TD_VID(pVnode), tstrerror(code)); return TSDB_CODE_FAILED; } -static int32_t rsmaSnapReadQTaskInfo(SRsmaSnapReader* pReader, uint8_t** ppBuf) { +static int32_t rsmaQTaskInfSnapReaderOpen(SRSmaSnapReader* pReader, int64_t version) { + int32_t code = 0; + SSma* pSma = pReader->pSma; + SVnode* pVnode = pSma->pVnode; + SSmaEnv* pEnv = NULL; + SRSmaStat* pStat = NULL; + + if (!(pEnv = SMA_RSMA_ENV(pSma))) { + smaInfo("vgId:%d, vnode snapshot rsma reader for qtaskinfo version %" PRIi64 " not need as env is NULL", + TD_VID(pVnode), version); + return TSDB_CODE_SUCCESS; + } + + pStat = (SRSmaStat*)SMA_ENV_STAT(pEnv); + + int32_t ref = tdRSmaFSRef(pReader->pSma, pStat, version); + if (ref < 1) { + smaInfo("vgId:%d, vnode snapshot rsma reader for qtaskinfo version %" PRIi64 " not need as ref is %d", + TD_VID(pVnode), version, ref); + return TSDB_CODE_SUCCESS; + } + + char qTaskInfoFullName[TSDB_FILENAME_LEN]; + tdRSmaQTaskInfoGetFullName(TD_VID(pVnode), version, tfsGetPrimaryPath(pVnode->pTfs), qTaskInfoFullName); + + if (!taosCheckExistFile(qTaskInfoFullName)) { + tdRSmaFSUnRef(pSma, pStat, version); + smaInfo("vgId:%d, vnode snapshot rsma reader for qtaskinfo version %" PRIi64 " not need as %s not exists", + TD_VID(pVnode), qTaskInfoFullName); + return TSDB_CODE_SUCCESS; + } + + pReader->pQTaskFReader = taosMemoryCalloc(1, sizeof(SQTaskFReader)); + if (!pReader->pQTaskFReader) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _end; + } + + TdFilePtr fp = taosOpenFile(qTaskInfoFullName, TD_FILE_READ); + if (!fp) { + code = TAOS_SYSTEM_ERROR(errno); + taosMemoryFreeClear(pReader->pQTaskFReader); + goto _end; + } + + pReader->pQTaskFReader->pReadH = fp; + pReader->pQTaskFReader->pSma = pSma; + pReader->pQTaskFReader->version = pReader->ever; + +_end: + if (code < 0) { + tdRSmaFSUnRef(pSma, pStat, version); + smaError("vgId:%d, vnode snapshot rsma reader open %s succeed", TD_VID(pVnode), qTaskInfoFullName); + return TSDB_CODE_FAILED; + } + + smaInfo("vgId:%d, vnode snapshot rsma reader open %s succeed", TD_VID(pVnode), qTaskInfoFullName); + return TSDB_CODE_SUCCESS; +} + +static int32_t rsmaQTaskInfSnapReaderClose(SQTaskFReader** ppReader) { + if (!(*ppReader)) { + return TSDB_CODE_SUCCESS; + } + + SSma* pSma = (*ppReader)->pSma; + SRSmaStat* pStat = SMA_RSMA_STAT(pSma); + int64_t version = (*ppReader)->version; + + taosCloseFile(&(*ppReader)->pReadH); + tdRSmaFSUnRef(pSma, pStat, version); + taosMemoryFreeClear(*ppReader); + smaInfo("vgId:%d, vnode snapshot rsma reader closed for qTaskInfo version %" PRIi64, SMA_VID(pSma), version); + + return TSDB_CODE_SUCCESS; +} + +static int32_t rsmaSnapReadQTaskInfo(SRSmaSnapReader* pReader, uint8_t** ppBuf) { int32_t code = 0; SSma* pSma = pReader->pSma; int64_t n = 0; uint8_t* pBuf = NULL; SQTaskFReader* qReader = pReader->pQTaskFReader; + if (!qReader) { + *ppBuf = NULL; + smaInfo("vgId:%d, vnode snapshot rsma reader qtaskinfo, qTaskReader is NULL", SMA_VID(pSma)); + return 0; + } + if (!qReader->pReadH) { *ppBuf = NULL; - smaInfo("vgId:%d, vnode snapshot rsma reader qtaskinfo, readh is empty", SMA_VID(pSma)); + smaInfo("vgId:%d, vnode snapshot rsma reader qtaskinfo, readh is NULL", SMA_VID(pSma)); return 0; } @@ -153,7 +216,7 @@ _err: return code; } -int32_t rsmaSnapRead(SRsmaSnapReader* pReader, uint8_t** ppData) { +int32_t rsmaSnapRead(SRSmaSnapReader* pReader, uint8_t** ppData) { int32_t code = 0; *ppData = NULL; @@ -205,9 +268,9 @@ _err: return code; } -int32_t rsmaSnapReaderClose(SRsmaSnapReader** ppReader) { +int32_t rsmaSnapReaderClose(SRSmaSnapReader** ppReader) { int32_t code = 0; - SRsmaSnapReader* pReader = *ppReader; + SRSmaSnapReader* pReader = *ppReader; for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) { if (pReader->pDataReader[i]) { @@ -215,11 +278,7 @@ int32_t rsmaSnapReaderClose(SRsmaSnapReader** ppReader) { } } - if (pReader->pQTaskFReader) { - taosCloseFile(&pReader->pQTaskFReader->pReadH); - taosMemoryFreeClear(pReader->pQTaskFReader); - smaInfo("vgId:%d, vnode snapshot rsma reader closed for qTaskInfo", SMA_VID(pReader->pSma)); - } + rsmaQTaskInfSnapReaderClose(&pReader->pQTaskFReader); smaInfo("vgId:%d, vnode snapshot rsma reader closed", SMA_VID(pReader->pSma)); @@ -227,8 +286,8 @@ int32_t rsmaSnapReaderClose(SRsmaSnapReader** ppReader) { return code; } -// SRsmaSnapWriter ======================================== -struct SRsmaSnapWriter { +// SRSmaSnapWriter ======================================== +struct SRSmaSnapWriter { SSma* pSma; int64_t sver; int64_t ever; @@ -244,13 +303,13 @@ struct SRsmaSnapWriter { SQTaskFWriter* pQTaskFWriter; }; -int32_t rsmaSnapWriterOpen(SSma* pSma, int64_t sver, int64_t ever, SRsmaSnapWriter** ppWriter) { +int32_t rsmaSnapWriterOpen(SSma* pSma, int64_t sver, int64_t ever, SRSmaSnapWriter** ppWriter) { int32_t code = 0; - SRsmaSnapWriter* pWriter = NULL; + SRSmaSnapWriter* pWriter = NULL; SVnode* pVnode = pSma->pVnode; // alloc - pWriter = (SRsmaSnapWriter*)taosMemoryCalloc(1, sizeof(*pWriter)); + pWriter = (SRSmaSnapWriter*)taosMemoryCalloc(1, sizeof(*pWriter)); if (pWriter == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; @@ -301,9 +360,9 @@ _err: return code; } -int32_t rsmaSnapWriterClose(SRsmaSnapWriter** ppWriter, int8_t rollback) { +int32_t rsmaSnapWriterClose(SRSmaSnapWriter** ppWriter, int8_t rollback) { int32_t code = 0; - SRsmaSnapWriter* pWriter = *ppWriter; + SRSmaSnapWriter* pWriter = *ppWriter; SVnode* pVnode = pWriter->pSma->pVnode; if (rollback) { @@ -332,7 +391,7 @@ int32_t rsmaSnapWriterClose(SRsmaSnapWriter** ppWriter, int8_t rollback) { pWriter->pQTaskFWriter->fname, qTaskInfoFullName); // rsma restore - if ((code = tdRsmaRestore(pWriter->pSma, RSMA_RESTORE_SYNC, pWriter->ever)) < 0) { + if ((code = tdRSmaRestore(pWriter->pSma, RSMA_RESTORE_SYNC, pWriter->ever)) < 0) { goto _err; } smaInfo("vgId:%d, vnode snapshot rsma writer restore from %s succeed", SMA_VID(pWriter->pSma), qTaskInfoFullName); @@ -349,7 +408,7 @@ _err: return code; } -int32_t rsmaSnapWrite(SRsmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData) { +int32_t rsmaSnapWrite(SRSmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData) { int32_t code = 0; SSnapDataHdr* pHdr = (SSnapDataHdr*)pData; @@ -377,7 +436,7 @@ _err: return code; } -static int32_t rsmaSnapWriteQTaskInfo(SRsmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData) { +static int32_t rsmaSnapWriteQTaskInfo(SRSmaSnapWriter* pWriter, uint8_t* pData, uint32_t nData) { int32_t code = 0; SQTaskFWriter* qWriter = pWriter->pQTaskFWriter; diff --git a/source/dnode/vnode/src/sma/smaTimeRange.c b/source/dnode/vnode/src/sma/smaTimeRange.c index 1687cd46a0..173391b769 100644 --- a/source/dnode/vnode/src/sma/smaTimeRange.c +++ b/source/dnode/vnode/src/sma/smaTimeRange.c @@ -20,6 +20,10 @@ #define SMA_STORAGE_MINUTES_DAY 1440 #define SMA_STORAGE_SPLIT_FACTOR 14400 // least records in tsma file +static int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg); +static int32_t tdProcessTSmaInsertImpl(SSma *pSma, int64_t indexUid, const char *msg); +static int32_t tdProcessTSmaGetDaysImpl(SVnodeCfg *pCfg, void *pCont, uint32_t contLen, int32_t *days); + // TODO: Who is responsible for resource allocate and release? int32_t tdProcessTSmaInsert(SSma *pSma, int64_t indexUid, const char *msg) { int32_t code = TSDB_CODE_SUCCESS; @@ -59,7 +63,7 @@ int32_t smaGetTSmaDays(SVnodeCfg *pCfg, void *pCont, uint32_t contLen, int32_t * * @param days unit is minute * @return int32_t */ -int32_t tdProcessTSmaGetDaysImpl(SVnodeCfg *pCfg, void *pCont, uint32_t contLen, int32_t *days) { +static int32_t tdProcessTSmaGetDaysImpl(SVnodeCfg *pCfg, void *pCont, uint32_t contLen, int32_t *days) { SDecoder coder = {0}; tDecoderInit(&coder, pCont, contLen); @@ -106,7 +110,7 @@ _err: * @param pMsg * @return int32_t */ -int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg) { +static int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg) { SSmaCfg *pCfg = (SSmaCfg *)pMsg; if (TD_VID(pSma->pVnode) == pCfg->dstVgId) { @@ -145,7 +149,7 @@ int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg) { * @param msg * @return int32_t */ -int32_t tdProcessTSmaInsertImpl(SSma *pSma, int64_t indexUid, const char *msg) { +static int32_t tdProcessTSmaInsertImpl(SSma *pSma, int64_t indexUid, const char *msg) { const SArray *pDataBlocks = (const SArray *)msg; // TODO: destroy SSDataBlocks(msg) if (!pDataBlocks) { diff --git a/source/dnode/vnode/src/sma/smaUtil.c b/source/dnode/vnode/src/sma/smaUtil.c index d771797963..a4ba0a61a5 100644 --- a/source/dnode/vnode/src/sma/smaUtil.c +++ b/source/dnode/vnode/src/sma/smaUtil.c @@ -305,93 +305,4 @@ int32_t tdReleaseSmaRef(int32_t rsetId, int64_t refId) { smaDebug("rsma release ref for rsetId:%" PRIi64 " refId:%d success", rsetId, refId); return TSDB_CODE_SUCCESS; -} - -static int32_t tdCloneQTaskInfo(SSma *pSma, qTaskInfo_t dstTaskInfo, qTaskInfo_t srcTaskInfo, SRSmaParam *param, - tb_uid_t suid, int8_t idx) { - SVnode *pVnode = pSma->pVnode; - char *pOutput = NULL; - int32_t len = 0; - - if ((terrno = qSerializeTaskStatus(srcTaskInfo, &pOutput, &len)) < 0) { - smaError("vgId:%d, rsma clone, table %" PRIi64 " serialize qTaskInfo failed since %s", TD_VID(pVnode), suid, - terrstr()); - goto _err; - } - - SReadHandle handle = { - .meta = pVnode->pMeta, - .vnode = pVnode, - .initTqReader = 1, - }; - ASSERT(!dstTaskInfo); - dstTaskInfo = qCreateStreamExecTaskInfo(param->qmsg[idx], &handle); - if (!dstTaskInfo) { - terrno = TSDB_CODE_RSMA_QTASKINFO_CREATE; - goto _err; - } - - if (qDeserializeTaskStatus(dstTaskInfo, pOutput, len) < 0) { - smaError("vgId:%d, rsma clone, restore rsma task for table:%" PRIi64 " failed since %s", TD_VID(pVnode), suid, - terrstr()); - goto _err; - } - - smaDebug("vgId:%d, rsma clone, restore rsma task for table:%" PRIi64 " succeed", TD_VID(pVnode), suid); - - taosMemoryFreeClear(pOutput); - return TSDB_CODE_SUCCESS; -_err: - taosMemoryFreeClear(pOutput); - tdFreeQTaskInfo(dstTaskInfo, TD_VID(pVnode), idx + 1); - smaError("vgId:%d, rsma clone, restore rsma task for table:%" PRIi64 " failed since %s", TD_VID(pVnode), suid, - terrstr()); - return TSDB_CODE_FAILED; -} - -/** - * @brief Clone qTaskInfo of SRSmaInfo - * - * @param pSma - * @param pInfo - * @return int32_t - */ -int32_t tdCloneRSmaInfo(SSma *pSma, SRSmaInfo *pInfo) { - SRSmaParam *param = NULL; - if (!pInfo) { - return TSDB_CODE_SUCCESS; - } - - SMetaReader mr = {0}; - metaReaderInit(&mr, SMA_META(pSma), 0); - smaDebug("vgId:%d, rsma clone qTaskInfo for suid:%" PRIi64, SMA_VID(pSma), pInfo->suid); - if (metaGetTableEntryByUid(&mr, pInfo->suid) < 0) { - smaError("vgId:%d, rsma clone, failed to get table meta for %" PRIi64 " since %s", SMA_VID(pSma), pInfo->suid, - terrstr()); - goto _err; - } - ASSERT(mr.me.type == TSDB_SUPER_TABLE); - ASSERT(mr.me.uid == pInfo->suid); - if (TABLE_IS_ROLLUP(mr.me.flags)) { - param = &mr.me.stbEntry.rsmaParam; - for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) { - if (!pInfo->iTaskInfo[i]) { - continue; - } - if (tdCloneQTaskInfo(pSma, pInfo->taskInfo[i], pInfo->iTaskInfo[i], param, pInfo->suid, i) < 0) { - goto _err; - } - } - smaDebug("vgId:%d, rsma clone env success for %" PRIi64, SMA_VID(pSma), pInfo->suid); - } else { - terrno = TSDB_CODE_RSMA_INVALID_SCHEMA; - goto _err; - } - - metaReaderClear(&mr); - return TSDB_CODE_SUCCESS; -_err: - metaReaderClear(&mr); - smaError("vgId:%d, rsma clone env failed for %" PRIi64 " since %s", SMA_VID(pSma), pInfo->suid, terrstr()); - return TSDB_CODE_FAILED; } \ 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 3f42d8360e..f9c2757c37 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -816,7 +816,86 @@ int32_t tqProcessTaskDeployReq(STQ* pTq, int64_t version, char* msg, int32_t msg return streamMetaAddSerializedTask(pTq->pStreamMeta, version, msg, msgLen); } -int32_t tqProcessStreamTrigger(STQ* pTq, SSubmitReq* pReq, int64_t ver) { +int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) { + bool failed = false; + SDecoder* pCoder = &(SDecoder){0}; + SDeleteRes* pRes = &(SDeleteRes){0}; + + pRes->uidList = taosArrayInit(0, sizeof(tb_uid_t)); + if (pRes->uidList == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + failed = true; + } + + tDecoderInit(pCoder, pReq, len); + tDecodeDeleteRes(pCoder, pRes); + tDecoderClear(pCoder); + + int32_t sz = taosArrayGetSize(pRes->uidList); + if (sz == 0) { + taosArrayDestroy(pRes->uidList); + return 0; + } + SSDataBlock* pDelBlock = createSpecialDataBlock(STREAM_DELETE_DATA); + blockDataEnsureCapacity(pDelBlock, sz); + pDelBlock->info.rows = sz; + pDelBlock->info.version = ver; + + for (int32_t i = 0; i < sz; i++) { + // start key column + SColumnInfoData* pStartCol = taosArrayGet(pDelBlock->pDataBlock, START_TS_COLUMN_INDEX); + colDataAppend(pStartCol, i, (const char*)&pRes->skey, false); // end key column + SColumnInfoData* pEndCol = taosArrayGet(pDelBlock->pDataBlock, END_TS_COLUMN_INDEX); + colDataAppend(pEndCol, i, (const char*)&pRes->ekey, false); + // uid column + SColumnInfoData* pUidCol = taosArrayGet(pDelBlock->pDataBlock, UID_COLUMN_INDEX); + int64_t* pUid = taosArrayGet(pRes->uidList, i); + colDataAppend(pUidCol, i, (const char*)pUid, false); + + colDataAppendNULL(taosArrayGet(pDelBlock->pDataBlock, GROUPID_COLUMN_INDEX), i); + colDataAppendNULL(taosArrayGet(pDelBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX), i); + colDataAppendNULL(taosArrayGet(pDelBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX), i); + } + + taosArrayDestroy(pRes->uidList); + + void* pIter = NULL; + while (1) { + pIter = taosHashIterate(pTq->pStreamMeta->pTasks, pIter); + if (pIter == NULL) break; + SStreamTask* pTask = *(SStreamTask**)pIter; + if (pTask->taskLevel != TASK_LEVEL__SOURCE) continue; + + qDebug("delete req enqueue stream task: %d, ver: %" PRId64, pTask->taskId, ver); + + SStreamDataBlock* pStreamBlock = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM); + pStreamBlock->type = STREAM_INPUT__DATA_BLOCK; + pStreamBlock->blocks = taosArrayInit(0, sizeof(SSDataBlock)); + SSDataBlock block = {0}; + assignOneDataBlock(&block, pDelBlock); + block.info.type = STREAM_DELETE_DATA; + taosArrayPush(pStreamBlock->blocks, &block); + + if (!failed) { + if (streamTaskInput(pTask, (SStreamQueueItem*)pStreamBlock) < 0) { + qError("stream task input del failed, task id %d", pTask->taskId); + continue; + } + + if (streamSchedExec(pTask) < 0) { + qError("stream task launch failed, task id %d", pTask->taskId); + continue; + } + } else { + streamTaskInputFail(pTask); + } + } + blockDataDestroy(pDelBlock); + + return 0; +} + +int32_t tqProcessSubmitReq(STQ* pTq, SSubmitReq* pReq, int64_t ver) { void* pIter = NULL; bool failed = false; SStreamDataSubmit* pSubmit = NULL; diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index ed7fa80c47..a57e8174fe 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -213,20 +213,25 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_ #endif int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) { - if (vnodeIsRoleLeader(pTq->pVnode) && msgType == TDMT_VND_SUBMIT) { - if (taosHashGetSize(pTq->pStreamMeta->pTasks) == 0) return 0; + if (vnodeIsRoleLeader(pTq->pVnode)) { + if (msgType == TDMT_VND_SUBMIT) { + if (taosHashGetSize(pTq->pStreamMeta->pTasks) == 0) return 0; - void* data = taosMemoryMalloc(msgLen); - if (data == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - tqError("failed to copy data for stream since out of memory"); - return -1; + void* data = taosMemoryMalloc(msgLen); + if (data == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + tqError("failed to copy data for stream since out of memory"); + return -1; + } + memcpy(data, msg, msgLen); + SSubmitReq* pReq = (SSubmitReq*)data; + pReq->version = ver; + + tqProcessSubmitReq(pTq, data, ver); + } + if (msgType == TDMT_VND_DELETE) { + tqProcessDelReq(pTq, POINTER_SHIFT(msg, sizeof(SMsgHead)), msgLen - sizeof(SMsgHead), ver); } - memcpy(data, msg, msgLen); - SSubmitReq* pReq = (SSubmitReq*)data; - pReq->version = ver; - - tqProcessStreamTrigger(pTq, data, ver); } return 0; diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 61c6877555..64caff1542 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -418,31 +418,16 @@ typedef enum { } SFSLASTNEXTROWSTATES; typedef struct { - SFSLASTNEXTROWSTATES state; // [input] - STsdb *pTsdb; // [input] - SBlockIdx *pBlockIdxExp; // [input] - STSchema *pTSchema; // [input] - tb_uid_t suid; + SFSLASTNEXTROWSTATES state; // [input] + STsdb *pTsdb; // [input] tb_uid_t uid; int32_t nFileSet; int32_t iFileSet; SArray *aDFileSet; SDataFReader *pDataFReader; - SArray *aBlockL; - SBlockL *pBlockL; - SBlockData *pBlockDataL; - SBlockData blockDataL; - int32_t nRow; - int32_t iRow; TSDBROW row; - /* - SArray *aBlockIdx; - SBlockIdx *pBlockIdx; - SMapData blockMap; - int32_t nBlock; - int32_t iBlock; - SBlock block; - */ + + SMergeTree mergeTree; } SFSLastNextRowIter; static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) { @@ -451,22 +436,16 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) { switch (state->state) { case SFSLASTNEXTROW_FS: - // state->aDFileSet = state->pTsdb->pFS->cState->aDFileSet; state->nFileSet = taosArrayGetSize(state->aDFileSet); state->iFileSet = state->nFileSet; - state->pBlockDataL = NULL; - case SFSLASTNEXTROW_FILESET: { SDFileSet *pFileSet = NULL; _next_fileset: if (--state->iFileSet >= 0) { pFileSet = (SDFileSet *)taosArrayGet(state->aDFileSet, state->iFileSet); } else { - if (state->pBlockDataL) { - tBlockDataDestroy(state->pBlockDataL, 1); - state->pBlockDataL = NULL; - } + // tMergeTreeClose(&state->mergeTree); *ppRow = NULL; return code; @@ -475,68 +454,24 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) { code = tsdbDataFReaderOpen(&state->pDataFReader, state->pTsdb, pFileSet); if (code) goto _err; - if (!state->aBlockL) { - state->aBlockL = taosArrayInit(0, sizeof(SBlockL)); - } else { - taosArrayClear(state->aBlockL); - } - - code = tsdbReadBlockL(state->pDataFReader, state->aBlockL); - if (code) goto _err; - - // SBlockL *pBlockL = (SBlockL *)taosArrayGet(state->aBlockL, state->iBlockL); - - state->pBlockL = taosArraySearch(state->aBlockL, state->pBlockIdxExp, tCmprBlockL, TD_EQ); - if (!state->pBlockL) { + tMergeTreeOpen(&state->mergeTree, 1, state->pDataFReader, state->uid, + &(STimeWindow){.skey = TSKEY_MIN, .ekey = TSKEY_MAX}, + &(SVersionRange){.minVer = 0, .maxVer = UINT64_MAX}); + bool hasVal = tMergeTreeNext(&state->mergeTree); + if (!hasVal) { + state->state = SFSLASTNEXTROW_FILESET; + // tMergeTreeClose(&state->mergeTree); goto _next_fileset; } - - int64_t suid = state->pBlockL->suid; - int64_t uid = state->pBlockL->maxUid; - - if (!state->pBlockDataL) { - state->pBlockDataL = &state->blockDataL; - - tBlockDataCreate(state->pBlockDataL); - } - code = tBlockDataInit(state->pBlockDataL, suid, suid ? 0 : uid, state->pTSchema); - if (code) goto _err; - } - case SFSLASTNEXTROW_BLOCKDATA: - code = tsdbReadLastBlock(state->pDataFReader, state->pBlockL, state->pBlockDataL); - if (code) goto _err; - - state->nRow = state->blockDataL.nRow; - state->iRow = state->nRow - 1; - - if (!state->pBlockDataL->uid) { - while (state->pBlockIdxExp->uid != state->pBlockDataL->aUid[state->iRow]) { - --state->iRow; - } - } - state->state = SFSLASTNEXTROW_BLOCKROW; + } case SFSLASTNEXTROW_BLOCKROW: - if (state->pBlockDataL->uid) { - if (state->iRow >= 0) { - state->row = tsdbRowFromBlockData(state->pBlockDataL, state->iRow); - *ppRow = &state->row; - - if (--state->iRow < 0) { - state->state = SFSLASTNEXTROW_FILESET; - } - } - } else { - if (state->iRow >= 0 && state->pBlockIdxExp->uid == state->pBlockDataL->aUid[state->iRow]) { - state->row = tsdbRowFromBlockData(state->pBlockDataL, state->iRow); - *ppRow = &state->row; - - if (--state->iRow < 0 || state->pBlockIdxExp->uid != state->pBlockDataL->aUid[state->iRow]) { - state->state = SFSLASTNEXTROW_FILESET; - } - } + state->row = tMergeTreeGetRow(&state->mergeTree); + *ppRow = &state->row; + bool hasVal = tMergeTreeNext(&state->mergeTree); + if (!hasVal) { + state->state = SFSLASTNEXTROW_FILESET; } - return code; default: ASSERT(0); @@ -548,15 +483,6 @@ _err: tsdbDataFReaderClose(&state->pDataFReader); state->pDataFReader = NULL; } - if (state->aBlockL) { - taosArrayDestroy(state->aBlockL); - state->aBlockL = NULL; - } - if (state->pBlockDataL) { - tBlockDataDestroy(state->pBlockDataL, 1); - state->pBlockDataL = NULL; - } - *ppRow = NULL; return code; @@ -574,14 +500,6 @@ int32_t clearNextRowFromFSLast(void *iter) { tsdbDataFReaderClose(&state->pDataFReader); state->pDataFReader = NULL; } - if (state->aBlockL) { - taosArrayDestroy(state->aBlockL); - state->aBlockL = NULL; - } - if (state->pBlockDataL) { - tBlockDataDestroy(state->pBlockDataL, 1); - state->pBlockDataL = NULL; - } return code; } @@ -609,7 +527,7 @@ typedef struct SFSNextRowIter { SMapData blockMap; int32_t nBlock; int32_t iBlock; - SBlock block; + SDataBlk block; SBlockData blockData; SBlockData *pBlockData; int32_t nRow; @@ -684,13 +602,13 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) { } case SFSNEXTROW_BLOCKDATA: if (state->iBlock >= 0) { - SBlock block = {0}; + SDataBlk block = {0}; - tBlockReset(&block); + tDataBlkReset(&block); // tBlockDataReset(&state->blockData); tBlockDataReset(state->pBlockData); - tMapDataGetItemByIdx(&state->blockMap, state->iBlock, &block, tGetBlock); + tMapDataGetItemByIdx(&state->blockMap, state->iBlock, &block, tGetDataBlk); /* code = tsdbReadBlockData(state->pDataFReader, &state->blockIdx, &block, &state->blockData, NULL, NULL); */ tBlockDataReset(state->pBlockData); code = tBlockDataInit(state->pBlockData, state->suid, state->uid, state->pTSchema); @@ -972,9 +890,6 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs pIter->fsLastState.state = (SFSLASTNEXTROWSTATES)SFSNEXTROW_FS; pIter->fsLastState.pTsdb = pTsdb; pIter->fsLastState.aDFileSet = pIter->pReadSnap->fs.aDFileSet; - pIter->fsLastState.pBlockIdxExp = &pIter->idx; - pIter->fsLastState.pTSchema = pTSchema; - pIter->fsLastState.suid = suid; pIter->fsLastState.uid = uid; pIter->fsState.state = SFSNEXTROW_FS; @@ -1372,25 +1287,33 @@ int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHand // getTableCacheKeyS(uid, "l", key, &keyLen); getTableCacheKey(uid, 1, key, &keyLen); LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); - if (h) { - } else { - 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 || pLastArray == NULL) { - *handle = NULL; - return 0; - } - - _taos_lru_deleter_t deleter = deleteTableCacheLast; - LRUStatus status = - taosLRUCacheInsert(pCache, key, keyLen, pLastArray, pLastArray->capacity, deleter, NULL, TAOS_LRU_PRIORITY_LOW); - if (status != TAOS_LRU_STATUS_OK) { - code = -1; - } + if (!h) { + taosThreadMutexLock(&pTsdb->lruMutex); h = taosLRUCacheLookup(pCache, key, keyLen); + if (!h) { + 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 || pLastArray == NULL) { + *handle = NULL; + return 0; + } + + _taos_lru_deleter_t deleter = deleteTableCacheLast; + LRUStatus status = taosLRUCacheInsert(pCache, key, keyLen, pLastArray, pLastArray->capacity, deleter, NULL, + TAOS_LRU_PRIORITY_LOW); + if (status != TAOS_LRU_STATUS_OK) { + code = -1; + } + + taosThreadMutexUnlock(&pTsdb->lruMutex); + + h = taosLRUCacheLookup(pCache, key, keyLen); + } else { + taosThreadMutexUnlock(&pTsdb->lruMutex); + } } *handle = h; @@ -1411,3 +1334,5 @@ void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity) { } size_t tsdbCacheGetCapacity(SVnode *pVnode) { return taosLRUCacheGetCapacity(pVnode->pTsdb->lruCache); } + +size_t tsdbCacheGetUsage(SVnode *pVnode) { return taosLRUCacheGetUsage(pVnode->pTsdb->lruCache); } diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 04a6de8472..acbdc65f12 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -20,11 +20,26 @@ typedef struct { STSchema *pTSchema; } SSkmInfo; +typedef enum { MEMORY_DATA_ITER = 0, LAST_DATA_ITER } EDataIterT; + typedef struct { - int64_t suid; - int64_t uid; - TSDBROW row; -} SRowInfo; + SRBTreeNode n; + SRowInfo r; + EDataIterT type; + union { + struct { + int32_t iTbDataP; + STbDataIter iter; + }; // memory data iter + struct { + int32_t iSst; + SArray *aSstBlk; + int32_t iSstBlk; + SBlockData bData; + int32_t iRow; + }; // sst file data iter + }; +} SDataIter; typedef struct { STsdb *pTsdb; @@ -35,8 +50,9 @@ typedef struct { int32_t minRow; int32_t maxRow; int8_t cmprAlg; - SArray *aTbDataP; - STsdbFS fs; + int8_t maxLast; + SArray *aTbDataP; // memory + STsdbFS fs; // disk // -------------- TSKEY nextKey; // reset by each table commit int32_t commitFid; @@ -45,25 +61,24 @@ typedef struct { // commit file data struct { SDataFReader *pReader; - // data - SArray *aBlockIdx; // SArray - int32_t iBlockIdx; - SBlockIdx *pBlockIdx; - SMapData mBlock; // SMapData - SBlockData bData; - // last - SArray *aBlockL; // SArray - int32_t iBlockL; - SBlockData bDatal; - int32_t iRow; - SRowInfo *pRowInfo; - SRowInfo rowInfo; + SArray *aBlockIdx; // SArray + int32_t iBlockIdx; + SBlockIdx *pBlockIdx; + SMapData mBlock; // SMapData + SBlockData bData; } dReader; + struct { + SDataIter *pIter; + SRBTree rbt; + SDataIter dataIter; + SDataIter aDataIter[TSDB_MAX_LAST_FILE]; + int8_t toLastOnly; + }; struct { SDataFWriter *pWriter; SArray *aBlockIdx; // SArray - SArray *aBlockL; // SArray - SMapData mBlock; // SMapData + SArray *aSstBlk; // SArray + SMapData mBlock; // SMapData SBlockData bData; SBlockData bDatal; } dWriter; @@ -77,11 +92,34 @@ typedef struct { SArray *aDelData; // SArray } SCommitter; +extern int32_t tsdbReadSstBlockEx(SDataFReader *pReader, int32_t iSst, SSstBlk *aSstBlk, + SBlockData *pBlockData); // todo + static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter); static int32_t tsdbCommitData(SCommitter *pCommitter); static int32_t tsdbCommitDel(SCommitter *pCommitter); static int32_t tsdbCommitCache(SCommitter *pCommitter); static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno); +static int32_t tsdbNextCommitRow(SCommitter *pCommitter); + +static int32_t tRowInfoCmprFn(const void *p1, const void *p2) { + SRowInfo *pInfo1 = (SRowInfo *)p1; + SRowInfo *pInfo2 = (SRowInfo *)p2; + + if (pInfo1->suid < pInfo2->suid) { + return -1; + } else if (pInfo1->suid > pInfo2->suid) { + return 1; + } + + if (pInfo1->uid < pInfo2->uid) { + return -1; + } else if (pInfo1->uid > pInfo2->uid) { + return 1; + } + + return tsdbRowCmprFn(&pInfo1->row, &pInfo2->row); +} int32_t tsdbBegin(STsdb *pTsdb) { int32_t code = 0; @@ -294,7 +332,10 @@ static int32_t tsdbCommitterUpdateTableSchema(SCommitter *pCommitter, int64_t su int32_t code = 0; if (suid) { - if (pCommitter->skmTable.suid == suid) goto _exit; + if (pCommitter->skmTable.suid == suid) { + pCommitter->skmTable.uid = uid; + goto _exit; + } } else { if (pCommitter->skmTable.uid == uid) goto _exit; } @@ -334,54 +375,6 @@ _exit: return code; } -static int32_t tsdbCommitterNextLastRow(SCommitter *pCommitter) { - int32_t code = 0; - - ASSERT(pCommitter->dReader.pReader); - ASSERT(pCommitter->dReader.pRowInfo); - - SBlockData *pBlockDatal = &pCommitter->dReader.bDatal; - pCommitter->dReader.iRow++; - if (pCommitter->dReader.iRow < pBlockDatal->nRow) { - if (pBlockDatal->uid) { - pCommitter->dReader.pRowInfo->uid = pBlockDatal->uid; - } else { - pCommitter->dReader.pRowInfo->uid = pBlockDatal->aUid[pCommitter->dReader.iRow]; - } - pCommitter->dReader.pRowInfo->row = tsdbRowFromBlockData(pBlockDatal, pCommitter->dReader.iRow); - } else { - pCommitter->dReader.iBlockL++; - if (pCommitter->dReader.iBlockL < taosArrayGetSize(pCommitter->dReader.aBlockL)) { - SBlockL *pBlockL = (SBlockL *)taosArrayGet(pCommitter->dReader.aBlockL, pCommitter->dReader.iBlockL); - int64_t suid = pBlockL->suid; - int64_t uid = pBlockL->maxUid; - - code = tsdbCommitterUpdateTableSchema(pCommitter, suid, uid); - if (code) goto _exit; - - code = tBlockDataInit(pBlockDatal, suid, suid ? 0 : uid, pCommitter->skmTable.pTSchema); - if (code) goto _exit; - - code = tsdbReadLastBlock(pCommitter->dReader.pReader, pBlockL, pBlockDatal); - if (code) goto _exit; - - pCommitter->dReader.iRow = 0; - pCommitter->dReader.pRowInfo->suid = pBlockDatal->suid; - if (pBlockDatal->uid) { - pCommitter->dReader.pRowInfo->uid = pBlockDatal->uid; - } else { - pCommitter->dReader.pRowInfo->uid = pBlockDatal->aUid[0]; - } - pCommitter->dReader.pRowInfo->row = tsdbRowFromBlockData(pBlockDatal, pCommitter->dReader.iRow); - } else { - pCommitter->dReader.pRowInfo = NULL; - } - } - -_exit: - return code; -} - static int32_t tsdbCommitterNextTableData(SCommitter *pCommitter) { int32_t code = 0; @@ -404,6 +397,85 @@ _exit: return code; } +static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) { + int32_t code = 0; + + pCommitter->pIter = NULL; + tRBTreeCreate(&pCommitter->rbt, tRowInfoCmprFn); + + // memory + TSDBKEY tKey = {.ts = pCommitter->minKey, .version = VERSION_MIN}; + SDataIter *pIter = &pCommitter->dataIter; + pIter->type = MEMORY_DATA_ITER; + pIter->iTbDataP = 0; + for (; pIter->iTbDataP < taosArrayGetSize(pCommitter->aTbDataP); pIter->iTbDataP++) { + STbData *pTbData = (STbData *)taosArrayGetP(pCommitter->aTbDataP, pIter->iTbDataP); + tsdbTbDataIterOpen(pTbData, &tKey, 0, &pIter->iter); + TSDBROW *pRow = tsdbTbDataIterGet(&pIter->iter); + if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { + pCommitter->nextKey = TMIN(pCommitter->nextKey, TSDBROW_TS(pRow)); + pRow = NULL; + } + + if (pRow == NULL) continue; + + pIter->r.suid = pTbData->suid; + pIter->r.uid = pTbData->uid; + pIter->r.row = *pRow; + break; + } + ASSERT(pIter->iTbDataP < taosArrayGetSize(pCommitter->aTbDataP)); + tRBTreePut(&pCommitter->rbt, (SRBTreeNode *)pIter); + + // disk + pCommitter->toLastOnly = 0; + SDataFReader *pReader = pCommitter->dReader.pReader; + if (pReader) { + if (pReader->pSet->nSstF >= pCommitter->maxLast) { + int8_t iIter = 0; + for (int32_t iSst = 0; iSst < pReader->pSet->nSstF; iSst++) { + pIter = &pCommitter->aDataIter[iIter]; + pIter->type = LAST_DATA_ITER; + pIter->iSst = iSst; + + code = tsdbReadSstBlk(pCommitter->dReader.pReader, iSst, pIter->aSstBlk); + if (code) goto _err; + + if (taosArrayGetSize(pIter->aSstBlk) == 0) continue; + + pIter->iSstBlk = 0; + SSstBlk *pSstBlk = (SSstBlk *)taosArrayGet(pIter->aSstBlk, 0); + code = tsdbReadSstBlockEx(pCommitter->dReader.pReader, iSst, pSstBlk, &pIter->bData); + if (code) goto _err; + + pIter->iRow = 0; + pIter->r.suid = pIter->bData.suid; + pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[0]; + pIter->r.row = tsdbRowFromBlockData(&pIter->bData, 0); + + tRBTreePut(&pCommitter->rbt, (SRBTreeNode *)pIter); + iIter++; + } + } else { + for (int32_t iSst = 0; iSst < pReader->pSet->nSstF; iSst++) { + SSstFile *pSstFile = pReader->pSet->aSstF[iSst]; + if (pSstFile->size > pSstFile->offset) { + pCommitter->toLastOnly = 1; + break; + } + } + } + } + + code = tsdbNextCommitRow(pCommitter); + if (code) goto _err; + + return code; + +_err: + return code; +} + static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { int32_t code = 0; STsdb *pTsdb = pCommitter->pTsdb; @@ -416,8 +488,8 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { pCommitter->nextKey = TSKEY_MAX; // Reader - pRSet = (SDFileSet *)taosArraySearch(pCommitter->fs.aDFileSet, &(SDFileSet){.fid = pCommitter->commitFid}, - tDFileSetCmprFn, TD_EQ); + SDFileSet tDFileSet = {.fid = pCommitter->commitFid}; + pRSet = (SDFileSet *)taosArraySearch(pCommitter->fs.aDFileSet, &tDFileSet, tDFileSetCmprFn, TD_EQ); if (pRSet) { code = tsdbDataFReaderOpen(&pCommitter->dReader.pReader, pTsdb, pRSet); if (code) goto _err; @@ -427,68 +499,58 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { if (code) goto _err; pCommitter->dReader.iBlockIdx = 0; - if (pCommitter->dReader.iBlockIdx < taosArrayGetSize(pCommitter->dReader.aBlockIdx)) { - pCommitter->dReader.pBlockIdx = - (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, pCommitter->dReader.iBlockIdx); - + if (taosArrayGetSize(pCommitter->dReader.aBlockIdx) > 0) { + pCommitter->dReader.pBlockIdx = (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, 0); code = tsdbReadBlock(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock); if (code) goto _err; } else { pCommitter->dReader.pBlockIdx = NULL; } tBlockDataReset(&pCommitter->dReader.bData); - - // last - code = tsdbReadBlockL(pCommitter->dReader.pReader, pCommitter->dReader.aBlockL); - if (code) goto _err; - - pCommitter->dReader.iBlockL = -1; - pCommitter->dReader.iRow = -1; - pCommitter->dReader.pRowInfo = &pCommitter->dReader.rowInfo; - tBlockDataReset(&pCommitter->dReader.bDatal); - code = tsdbCommitterNextLastRow(pCommitter); - if (code) goto _err; } else { pCommitter->dReader.pBlockIdx = NULL; - pCommitter->dReader.pRowInfo = NULL; } // Writer - SHeadFile fHead; - SDataFile fData; - SLastFile fLast; - SSmaFile fSma; - SDFileSet wSet = {.pHeadF = &fHead, .pDataF = &fData, .pLastF = &fLast, .pSmaF = &fSma}; + SHeadFile fHead = {.commitID = pCommitter->commitID}; + SDataFile fData = {.commitID = pCommitter->commitID}; + SSmaFile fSma = {.commitID = pCommitter->commitID}; + SSstFile fSst = {.commitID = pCommitter->commitID}; + SDFileSet wSet = {.fid = pCommitter->commitFid, .pHeadF = &fHead, .pDataF = &fData, .pSmaF = &fSma}; if (pRSet) { - wSet.diskId = pRSet->diskId; - wSet.fid = pCommitter->commitFid; - fHead = (SHeadFile){.commitID = pCommitter->commitID, .size = 0, .offset = 0}; + ASSERT(pRSet->nSstF <= pCommitter->maxLast); fData = *pRSet->pDataF; - fLast = (SLastFile){.commitID = pCommitter->commitID, .size = 0, .offset = 0}; fSma = *pRSet->pSmaF; + wSet.diskId = pRSet->diskId; + if (pRSet->nSstF < pCommitter->maxLast) { + for (int32_t iSst = 0; iSst < pRSet->nSstF; iSst++) { + wSet.aSstF[iSst] = pRSet->aSstF[iSst]; + } + wSet.nSstF = pRSet->nSstF + 1; + } else { + wSet.nSstF = 1; + } } else { SDiskID did = {0}; - tfsAllocDisk(pTsdb->pVnode->pTfs, 0, &did); - tfsMkdirRecurAt(pTsdb->pVnode->pTfs, pTsdb->path, did); - wSet.diskId = did; - wSet.fid = pCommitter->commitFid; - fHead = (SHeadFile){.commitID = pCommitter->commitID, .size = 0, .offset = 0}; - fData = (SDataFile){.commitID = pCommitter->commitID, .size = 0}; - fLast = (SLastFile){.commitID = pCommitter->commitID, .size = 0, .offset = 0}; - fSma = (SSmaFile){.commitID = pCommitter->commitID, .size = 0}; + wSet.nSstF = 1; } + wSet.aSstF[wSet.nSstF - 1] = &fSst; code = tsdbDataFWriterOpen(&pCommitter->dWriter.pWriter, pTsdb, &wSet); if (code) goto _err; taosArrayClear(pCommitter->dWriter.aBlockIdx); - taosArrayClear(pCommitter->dWriter.aBlockL); + taosArrayClear(pCommitter->dWriter.aSstBlk); tMapDataReset(&pCommitter->dWriter.mBlock); tBlockDataReset(&pCommitter->dWriter.bData); tBlockDataReset(&pCommitter->dWriter.bDatal); + // open iter + code = tsdbOpenCommitIter(pCommitter); + if (code) goto _err; + _exit: return code; @@ -497,18 +559,14 @@ _err: return code; } -static int32_t tsdbCommitDataBlock(SCommitter *pCommitter, SBlock *pBlock) { +static int32_t tsdbCommitDataBlock(SCommitter *pCommitter) { int32_t code = 0; SBlockData *pBlockData = &pCommitter->dWriter.bData; - SBlock block; + SDataBlk block; ASSERT(pBlockData->nRow > 0); - if (pBlock) { - block = *pBlock; // as a subblock - } else { - tBlockReset(&block); // as a new block - } + tDataBlkReset(&block); // info block.nRow += pBlockData->nRow; @@ -539,8 +597,8 @@ static int32_t tsdbCommitDataBlock(SCommitter *pCommitter, SBlock *pBlock) { ((block.nSubBlock == 1) && !block.hasDup) ? &block.smaInfo : NULL, pCommitter->cmprAlg, 0); if (code) goto _err; - // put SBlock - code = tMapDataPutItem(&pCommitter->dWriter.mBlock, &block, tPutBlock); + // put SDataBlk + code = tMapDataPutItem(&pCommitter->dWriter.mBlock, &block, tPutDataBlk); if (code) goto _err; // clear @@ -555,7 +613,7 @@ _err: static int32_t tsdbCommitLastBlock(SCommitter *pCommitter) { int32_t code = 0; - SBlockL blockL; + SSstBlk blockL; SBlockData *pBlockData = &pCommitter->dWriter.bDatal; ASSERT(pBlockData->nRow > 0); @@ -580,8 +638,8 @@ static int32_t tsdbCommitLastBlock(SCommitter *pCommitter) { code = tsdbWriteBlockData(pCommitter->dWriter.pWriter, pBlockData, &blockL.bInfo, NULL, pCommitter->cmprAlg, 1); if (code) goto _err; - // push SBlockL - if (taosArrayPush(pCommitter->dWriter.aBlockL, &blockL) == NULL) { + // push SSstBlk + if (taosArrayPush(pCommitter->dWriter.aSstBlk, &blockL) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } @@ -596,501 +654,6 @@ _err: return code; } -static int32_t tsdbMergeCommitData(SCommitter *pCommitter, STbDataIter *pIter, SBlock *pBlock) { - int32_t code = 0; - STbData *pTbData = pIter->pTbData; - SBlockData *pBlockDataR = &pCommitter->dReader.bData; - SBlockData *pBlockDataW = &pCommitter->dWriter.bData; - - code = tsdbReadDataBlock(pCommitter->dReader.pReader, pBlock, pBlockDataR); - if (code) goto _err; - - tBlockDataClear(pBlockDataW); - int32_t iRow = 0; - TSDBROW row; - TSDBROW *pRow1 = tsdbTbDataIterGet(pIter); - TSDBROW *pRow2 = &row; - *pRow2 = tsdbRowFromBlockData(pBlockDataR, iRow); - while (pRow1 && pRow2) { - int32_t c = tsdbRowCmprFn(pRow1, pRow2); - - if (c < 0) { - code = tsdbCommitterUpdateRowSchema(pCommitter, pTbData->suid, pTbData->uid, TSDBROW_SVERSION(pRow1)); - if (code) goto _err; - - code = tBlockDataAppendRow(pBlockDataW, pRow1, pCommitter->skmRow.pTSchema, pTbData->uid); - if (code) goto _err; - - // next - tsdbTbDataIterNext(pIter); - pRow1 = tsdbTbDataIterGet(pIter); - } else if (c > 0) { - code = tBlockDataAppendRow(pBlockDataW, pRow2, NULL, pTbData->uid); - if (code) goto _err; - - iRow++; - if (iRow < pBlockDataR->nRow) { - *pRow2 = tsdbRowFromBlockData(pBlockDataR, iRow); - } else { - pRow2 = NULL; - } - } else { - ASSERT(0); - } - - // check - if (pBlockDataW->nRow >= pCommitter->maxRow * 4 / 5) { - code = tsdbCommitDataBlock(pCommitter, NULL); - if (code) goto _err; - } - } - - while (pRow2) { - code = tBlockDataAppendRow(pBlockDataW, pRow2, NULL, pTbData->uid); - if (code) goto _err; - - iRow++; - if (iRow < pBlockDataR->nRow) { - *pRow2 = tsdbRowFromBlockData(pBlockDataR, iRow); - } else { - pRow2 = NULL; - } - - // check - if (pBlockDataW->nRow >= pCommitter->maxRow * 4 / 5) { - code = tsdbCommitDataBlock(pCommitter, NULL); - if (code) goto _err; - } - } - - // check - if (pBlockDataW->nRow > 0) { - code = tsdbCommitDataBlock(pCommitter, NULL); - if (code) goto _err; - } - - return code; - -_err: - tsdbError("vgId:%d, tsdb merge commit data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); - return code; -} - -static int32_t tsdbCommitTableMemData(SCommitter *pCommitter, STbDataIter *pIter, TSDBKEY toKey) { - int32_t code = 0; - STbData *pTbData = pIter->pTbData; - SBlockData *pBlockData = &pCommitter->dWriter.bData; - - tBlockDataClear(pBlockData); - TSDBROW *pRow = tsdbTbDataIterGet(pIter); - while (true) { - if (pRow == NULL) { - if (pBlockData->nRow > 0) { - goto _write_block; - } else { - break; - } - } - - // update schema - code = tsdbCommitterUpdateRowSchema(pCommitter, pTbData->suid, pTbData->uid, TSDBROW_SVERSION(pRow)); - if (code) goto _err; - - // append - code = tBlockDataAppendRow(pBlockData, pRow, pCommitter->skmRow.pTSchema, pTbData->uid); - if (code) goto _err; - - tsdbTbDataIterNext(pIter); - pRow = tsdbTbDataIterGet(pIter); - if (pRow) { - TSDBKEY rowKey = TSDBROW_KEY(pRow); - if (tsdbKeyCmprFn(&rowKey, &toKey) >= 0) { - pRow = NULL; - } - } - - if (pBlockData->nRow >= pCommitter->maxRow * 4 / 5) { - _write_block: - code = tsdbCommitDataBlock(pCommitter, NULL); - if (code) goto _err; - } - } - - return code; - -_err: - tsdbError("vgId:%d, tsdb commit table mem data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); - return code; -} - -static int32_t tsdbGetNumOfRowsLessThan(STbDataIter *pIter, TSDBKEY key) { - int32_t nRow = 0; - - STbDataIter iter = *pIter; - while (true) { - TSDBROW *pRow = tsdbTbDataIterGet(&iter); - if (pRow == NULL) break; - - int32_t c = tsdbKeyCmprFn(&TSDBROW_KEY(pRow), &key); - if (c < 0) { - nRow++; - tsdbTbDataIterNext(&iter); - } else if (c > 0) { - break; - } else { - ASSERT(0); - } - } - - return nRow; -} - -static int32_t tsdbMergeAsSubBlock(SCommitter *pCommitter, STbDataIter *pIter, SBlock *pBlock) { - int32_t code = 0; - STbData *pTbData = pIter->pTbData; - SBlockData *pBlockData = &pCommitter->dWriter.bData; - - tBlockDataClear(pBlockData); - TSDBROW *pRow = tsdbTbDataIterGet(pIter); - while (true) { - if (pRow == NULL) break; - - code = tsdbCommitterUpdateRowSchema(pCommitter, pTbData->suid, pTbData->uid, TSDBROW_SVERSION(pRow)); - if (code) goto _err; - - code = tBlockDataAppendRow(pBlockData, pRow, pCommitter->skmRow.pTSchema, pTbData->uid); - if (code) goto _err; - - tsdbTbDataIterNext(pIter); - pRow = tsdbTbDataIterGet(pIter); - if (pRow) { - TSDBKEY rowKey = TSDBROW_KEY(pRow); - if (tsdbKeyCmprFn(&rowKey, &pBlock->maxKey) > 0) { - pRow = NULL; - } - } - } - - ASSERT(pBlockData->nRow > 0 && pBlock->nRow + pBlockData->nRow <= pCommitter->maxRow); - - code = tsdbCommitDataBlock(pCommitter, pBlock); - if (code) goto _err; - - return code; - -_err: - tsdbError("vgId:%d, tsdb merge as subblock failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); - return code; -} - -static int32_t tsdbMergeCommitLast(SCommitter *pCommitter, STbDataIter *pIter) { - int32_t code = 0; - STbData *pTbData = pIter->pTbData; - int32_t nRow = tsdbGetNumOfRowsLessThan(pIter, (TSDBKEY){.ts = pCommitter->maxKey + 1, .version = VERSION_MIN}); - - if (pCommitter->dReader.pRowInfo && tTABLEIDCmprFn(pTbData, pCommitter->dReader.pRowInfo) == 0) { - if (pCommitter->dReader.pRowInfo->suid) { // super table - for (int32_t iRow = pCommitter->dReader.iRow; iRow < pCommitter->dReader.bDatal.nRow; iRow++) { - if (pTbData->uid != pCommitter->dReader.bDatal.aUid[iRow]) break; - nRow++; - } - } else { // normal table - ASSERT(pCommitter->dReader.iRow == 0); - nRow += pCommitter->dReader.bDatal.nRow; - } - } - - if (nRow == 0) goto _exit; - - TSDBROW *pRow = tsdbTbDataIterGet(pIter); - if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { - pRow = NULL; - } - - SRowInfo *pRowInfo = pCommitter->dReader.pRowInfo; - if (pRowInfo && pRowInfo->uid != pTbData->uid) { - pRowInfo = NULL; - } - - while (nRow) { - SBlockData *pBlockData; - int8_t toData; - - if (nRow < pCommitter->minRow) { // to .last - toData = 0; - pBlockData = &pCommitter->dWriter.bDatal; - - // commit and reset block data schema if need - // QUESTION: Is there a case that pBlockData->nRow == 0 but need to change schema ? - if (pBlockData->suid || pBlockData->uid) { - if (pBlockData->suid != pTbData->suid || pBlockData->suid == 0) { - if (pBlockData->nRow > 0) { - code = tsdbCommitLastBlock(pCommitter); - if (code) goto _err; - } - - tBlockDataReset(pBlockData); - } - } - - // set block data schema if need - if (pBlockData->suid == 0 && pBlockData->uid == 0) { - code = tsdbCommitterUpdateTableSchema(pCommitter, pTbData->suid, pTbData->uid); - if (code) goto _err; - - code = - tBlockDataInit(pBlockData, pTbData->suid, pTbData->suid ? 0 : pTbData->uid, pCommitter->skmTable.pTSchema); - if (code) goto _err; - } - - if (pBlockData->nRow + nRow > pCommitter->maxRow) { - code = tsdbCommitLastBlock(pCommitter); - if (code) goto _err; - } - } else { // to .data - toData = 1; - pBlockData = &pCommitter->dWriter.bData; - ASSERT(pBlockData->nRow == 0); - } - - while (pRow && pRowInfo) { - int32_t c = tsdbRowCmprFn(pRow, &pRowInfo->row); - if (c < 0) { - code = tsdbCommitterUpdateRowSchema(pCommitter, pTbData->suid, pTbData->uid, TSDBROW_SVERSION(pRow)); - if (code) goto _err; - - code = tBlockDataAppendRow(pBlockData, pRow, pCommitter->skmRow.pTSchema, pTbData->uid); - if (code) goto _err; - - tsdbTbDataIterNext(pIter); - pRow = tsdbTbDataIterGet(pIter); - if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { - pRow = NULL; - } - } else if (c > 0) { - code = tBlockDataAppendRow(pBlockData, &pRowInfo->row, NULL, pTbData->uid); - if (code) goto _err; - - code = tsdbCommitterNextLastRow(pCommitter); - if (code) goto _err; - - pRowInfo = pCommitter->dReader.pRowInfo; - if (pRowInfo && pRowInfo->uid != pTbData->uid) { - pRowInfo = NULL; - } - } else { - ASSERT(0); - } - - nRow--; - if (toData) { - if (nRow == 0 || pBlockData->nRow >= pCommitter->maxRow * 4 / 5) { - code = tsdbCommitDataBlock(pCommitter, NULL); - if (code) goto _err; - goto _outer_break; - } - } - } - - while (pRow) { - code = tsdbCommitterUpdateRowSchema(pCommitter, pTbData->suid, pTbData->uid, TSDBROW_SVERSION(pRow)); - if (code) goto _err; - - code = tBlockDataAppendRow(pBlockData, pRow, pCommitter->skmRow.pTSchema, pTbData->uid); - if (code) goto _err; - - tsdbTbDataIterNext(pIter); - pRow = tsdbTbDataIterGet(pIter); - if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { - pRow = NULL; - } - - nRow--; - if (toData) { - if (nRow == 0 || pBlockData->nRow >= pCommitter->maxRow * 4 / 5) { - code = tsdbCommitDataBlock(pCommitter, NULL); - if (code) goto _err; - goto _outer_break; - } - } - } - - while (pRowInfo) { - code = tBlockDataAppendRow(pBlockData, &pRowInfo->row, NULL, pTbData->uid); - if (code) goto _err; - - code = tsdbCommitterNextLastRow(pCommitter); - if (code) goto _err; - - pRowInfo = pCommitter->dReader.pRowInfo; - if (pRowInfo && pRowInfo->uid != pTbData->uid) { - pRowInfo = NULL; - } - - nRow--; - if (toData) { - if (nRow == 0 || pBlockData->nRow >= pCommitter->maxRow * 4 / 5) { - code = tsdbCommitDataBlock(pCommitter, NULL); - if (code) goto _err; - goto _outer_break; - } - } - } - - _outer_break: - ASSERT(nRow >= 0); - } - -_exit: - return code; - -_err: - tsdbError("vgId:%d tsdb merge commit last failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); - return code; -} - -static int32_t tsdbCommitTableData(SCommitter *pCommitter, STbData *pTbData) { - int32_t code = 0; - - ASSERT(pCommitter->dReader.pBlockIdx == NULL || tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, pTbData) >= 0); - ASSERT(pCommitter->dReader.pRowInfo == NULL || tTABLEIDCmprFn(pCommitter->dReader.pRowInfo, pTbData) >= 0); - - // merge commit table data - STbDataIter iter = {0}; - STbDataIter *pIter = &iter; - TSDBROW *pRow; - - tsdbTbDataIterOpen(pTbData, &(TSDBKEY){.ts = pCommitter->minKey, .version = VERSION_MIN}, 0, pIter); - pRow = tsdbTbDataIterGet(pIter); - if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { - pRow = NULL; - } - - if (pRow == NULL) { - if (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, pTbData) == 0) { - SBlockIdx blockIdx = {.suid = pTbData->suid, .uid = pTbData->uid}; - code = tsdbWriteBlock(pCommitter->dWriter.pWriter, &pCommitter->dReader.mBlock, &blockIdx); - if (code) goto _err; - - if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - } - - goto _exit; - } - - int32_t iBlock = 0; - SBlock block; - SBlock *pBlock = █ - if (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pTbData, pCommitter->dReader.pBlockIdx) == 0) { - tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pBlock, tGetBlock); - } else { - pBlock = NULL; - } - - code = tsdbCommitterUpdateTableSchema(pCommitter, pTbData->suid, pTbData->uid); - if (code) goto _err; - - tMapDataReset(&pCommitter->dWriter.mBlock); - code = tBlockDataInit(&pCommitter->dReader.bData, pTbData->suid, pTbData->uid, pCommitter->skmTable.pTSchema); - if (code) goto _err; - code = tBlockDataInit(&pCommitter->dWriter.bData, pTbData->suid, pTbData->uid, pCommitter->skmTable.pTSchema); - if (code) goto _err; - - // .data merge - while (pBlock && pRow) { - int32_t c = tBlockCmprFn(pBlock, &(SBlock){.minKey = TSDBROW_KEY(pRow), .maxKey = TSDBROW_KEY(pRow)}); - if (c < 0) { // disk - code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pBlock, tPutBlock); - if (code) goto _err; - - // next - iBlock++; - if (iBlock < pCommitter->dReader.mBlock.nItem) { - tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pBlock, tGetBlock); - } else { - pBlock = NULL; - } - } else if (c > 0) { // memory - code = tsdbCommitTableMemData(pCommitter, pIter, pBlock->minKey); - if (code) goto _err; - - // next - pRow = tsdbTbDataIterGet(pIter); - if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { - pRow = NULL; - } - } else { // merge - int32_t nOvlp = tsdbGetNumOfRowsLessThan(pIter, pBlock->maxKey); - - ASSERT(nOvlp > 0); - - if (pBlock->nRow + nOvlp <= pCommitter->maxRow && pBlock->nSubBlock < TSDB_MAX_SUBBLOCKS) { - code = tsdbMergeAsSubBlock(pCommitter, pIter, pBlock); - if (code) goto _err; - } else { - code = tsdbMergeCommitData(pCommitter, pIter, pBlock); - if (code) goto _err; - } - - // next - pRow = tsdbTbDataIterGet(pIter); - if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { - pRow = NULL; - } - iBlock++; - if (iBlock < pCommitter->dReader.mBlock.nItem) { - tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pBlock, tGetBlock); - } else { - pBlock = NULL; - } - } - } - - while (pBlock) { - code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pBlock, tPutBlock); - if (code) goto _err; - - // next - iBlock++; - if (iBlock < pCommitter->dReader.mBlock.nItem) { - tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pBlock, tGetBlock); - } else { - pBlock = NULL; - } - } - - // .data append and .last merge - code = tsdbMergeCommitLast(pCommitter, pIter); - if (code) goto _err; - - // end - if (pCommitter->dWriter.mBlock.nItem > 0) { - SBlockIdx blockIdx = {.suid = pTbData->suid, .uid = pTbData->uid}; - code = tsdbWriteBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.mBlock, &blockIdx); - if (code) goto _err; - - if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - } - -_exit: - pRow = tsdbTbDataIterGet(pIter); - if (pRow) { - pCommitter->nextKey = TMIN(pCommitter->nextKey, TSDBROW_TS(pRow)); - } - - return code; - -_err: - tsdbError("vgId:%d tsdb commit table data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); - return code; -} - static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) { int32_t code = 0; @@ -1098,8 +661,8 @@ static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) { code = tsdbWriteBlockIdx(pCommitter->dWriter.pWriter, pCommitter->dWriter.aBlockIdx); if (code) goto _err; - // write aBlockL - code = tsdbWriteBlockL(pCommitter->dWriter.pWriter, pCommitter->dWriter.aBlockL); + // write aSstBlk + code = tsdbWriteSstBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.aSstBlk); if (code) goto _err; // update file header @@ -1130,10 +693,7 @@ _err: static int32_t tsdbMoveCommitData(SCommitter *pCommitter, TABLEID toTable) { int32_t code = 0; - // .data - while (true) { - if (pCommitter->dReader.pBlockIdx == NULL || tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, &toTable) >= 0) break; - + while (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, &toTable) < 0) { SBlockIdx blockIdx = *pCommitter->dReader.pBlockIdx; code = tsdbWriteBlock(pCommitter->dWriter.pWriter, &pCommitter->dReader.mBlock, &blockIdx); if (code) goto _err; @@ -1147,71 +707,6 @@ static int32_t tsdbMoveCommitData(SCommitter *pCommitter, TABLEID toTable) { if (code) goto _err; } - // .last - while (true) { - if (pCommitter->dReader.pRowInfo == NULL || tTABLEIDCmprFn(pCommitter->dReader.pRowInfo, &toTable) >= 0) break; - - SBlockData *pBlockDataR = &pCommitter->dReader.bDatal; - SBlockData *pBlockDataW = &pCommitter->dWriter.bDatal; - tb_uid_t suid = pCommitter->dReader.pRowInfo->suid; - tb_uid_t uid = pCommitter->dReader.pRowInfo->uid; - - ASSERT((pBlockDataR->suid && !pBlockDataR->uid) || (!pBlockDataR->suid && pBlockDataR->uid)); - ASSERT(pBlockDataR->nRow > 0); - - // commit and reset block data schema if need - if (pBlockDataW->suid || pBlockDataW->uid) { - if (pBlockDataW->suid != suid || pBlockDataW->suid == 0) { - if (pBlockDataW->nRow > 0) { - code = tsdbCommitLastBlock(pCommitter); - if (code) goto _err; - } - tBlockDataReset(pBlockDataW); - } - } - - // set block data schema if need - if (pBlockDataW->suid == 0 && pBlockDataW->uid == 0) { - code = tsdbCommitterUpdateTableSchema(pCommitter, suid, uid); - if (code) goto _err; - - code = tBlockDataInit(pBlockDataW, suid, suid ? 0 : uid, pCommitter->skmTable.pTSchema); - if (code) goto _err; - } - - // check if it can make sure that one table data in one block - int32_t nRow = 0; - if (pBlockDataR->suid) { - int32_t iRow = pCommitter->dReader.iRow; - while ((iRow < pBlockDataR->nRow) && (pBlockDataR->aUid[iRow] == uid)) { - nRow++; - iRow++; - } - } else { - ASSERT(pCommitter->dReader.iRow == 0); - nRow = pBlockDataR->nRow; - } - - ASSERT(nRow > 0 && nRow < pCommitter->minRow); - - if (pBlockDataW->nRow + nRow > pCommitter->maxRow) { - ASSERT(pBlockDataW->nRow > 0); - - code = tsdbCommitLastBlock(pCommitter); - if (code) goto _err; - } - - while (nRow > 0) { - code = tBlockDataAppendRow(pBlockDataW, &pCommitter->dReader.pRowInfo->row, NULL, uid); - if (code) goto _err; - - code = tsdbCommitterNextLastRow(pCommitter); - if (code) goto _err; - - nRow--; - } - } - return code; _err: @@ -1219,6 +714,7 @@ _err: return code; } +static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter); static int32_t tsdbCommitFileData(SCommitter *pCommitter) { int32_t code = 0; STsdb *pTsdb = pCommitter->pTsdb; @@ -1228,33 +724,10 @@ static int32_t tsdbCommitFileData(SCommitter *pCommitter) { code = tsdbCommitFileDataStart(pCommitter); if (code) goto _err; - // commit file data impl - for (int32_t iTbData = 0; iTbData < taosArrayGetSize(pCommitter->aTbDataP); iTbData++) { - STbData *pTbData = (STbData *)taosArrayGetP(pCommitter->aTbDataP, iTbData); - - // move commit until current (suid, uid) - code = tsdbMoveCommitData(pCommitter, *(TABLEID *)pTbData); - if (code) goto _err; - - // commit current table data - code = tsdbCommitTableData(pCommitter, pTbData); - if (code) goto _err; - - // move next reader table data if need - if (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pTbData, pCommitter->dReader.pBlockIdx) == 0) { - code = tsdbCommitterNextTableData(pCommitter); - if (code) goto _err; - } - } - - code = tsdbMoveCommitData(pCommitter, (TABLEID){.suid = INT64_MAX, .uid = INT64_MAX}); + // impl + code = tsdbCommitFileDataImpl(pCommitter); if (code) goto _err; - if (pCommitter->dWriter.bDatal.nRow > 0) { - code = tsdbCommitLastBlock(pCommitter); - if (code) goto _err; - } - // commit file data end code = tsdbCommitFileDataEnd(pCommitter); if (code) goto _err; @@ -1287,12 +760,12 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) { pCommitter->minRow = pTsdb->pVnode->config.tsdbCfg.minRows; pCommitter->maxRow = pTsdb->pVnode->config.tsdbCfg.maxRows; pCommitter->cmprAlg = pTsdb->pVnode->config.tsdbCfg.compression; + pCommitter->maxLast = TSDB_DEFAULT_LAST_FILE; // TODO: make it as a config pCommitter->aTbDataP = tsdbMemTableGetTbDataArray(pTsdb->imem); if (pCommitter->aTbDataP == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } - code = tsdbFSCopy(pTsdb, &pCommitter->fs); if (code) goto _err; @@ -1306,7 +779,7 @@ _err: static int32_t tsdbCommitDataStart(SCommitter *pCommitter) { int32_t code = 0; - // Reader + // reader pCommitter->dReader.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx)); if (pCommitter->dReader.aBlockIdx == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; @@ -1316,24 +789,28 @@ static int32_t tsdbCommitDataStart(SCommitter *pCommitter) { code = tBlockDataCreate(&pCommitter->dReader.bData); if (code) goto _exit; - pCommitter->dReader.aBlockL = taosArrayInit(0, sizeof(SBlockL)); - if (pCommitter->dReader.aBlockL == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; + // merger + for (int32_t iSst = 0; iSst < TSDB_MAX_LAST_FILE; iSst++) { + SDataIter *pIter = &pCommitter->aDataIter[iSst]; + pIter->aSstBlk = taosArrayInit(0, sizeof(SSstBlk)); + if (pIter->aSstBlk == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + code = tBlockDataCreate(&pIter->bData); + if (code) goto _exit; } - code = tBlockDataCreate(&pCommitter->dReader.bDatal); - if (code) goto _exit; - - // Writer + // writer pCommitter->dWriter.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx)); if (pCommitter->dWriter.aBlockIdx == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; } - pCommitter->dWriter.aBlockL = taosArrayInit(0, sizeof(SBlockL)); - if (pCommitter->dWriter.aBlockL == NULL) { + pCommitter->dWriter.aSstBlk = taosArrayInit(0, sizeof(SSstBlk)); + if (pCommitter->dWriter.aSstBlk == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; } @@ -1349,16 +826,21 @@ _exit: } static void tsdbCommitDataEnd(SCommitter *pCommitter) { - // Reader + // reader taosArrayDestroy(pCommitter->dReader.aBlockIdx); tMapDataClear(&pCommitter->dReader.mBlock); tBlockDataDestroy(&pCommitter->dReader.bData, 1); - taosArrayDestroy(pCommitter->dReader.aBlockL); - tBlockDataDestroy(&pCommitter->dReader.bDatal, 1); - // Writer + // merger + for (int32_t iSst = 0; iSst < TSDB_MAX_LAST_FILE; iSst++) { + SDataIter *pIter = &pCommitter->aDataIter[iSst]; + taosArrayDestroy(pIter->aSstBlk); + tBlockDataDestroy(&pIter->bData, 1); + } + + // writer taosArrayDestroy(pCommitter->dWriter.aBlockIdx); - taosArrayDestroy(pCommitter->dWriter.aBlockL); + taosArrayDestroy(pCommitter->dWriter.aSstBlk); tMapDataClear(&pCommitter->dWriter.mBlock); tBlockDataDestroy(&pCommitter->dWriter.bData, 1); tBlockDataDestroy(&pCommitter->dWriter.bDatal, 1); @@ -1389,7 +871,7 @@ static int32_t tsdbCommitData(SCommitter *pCommitter) { tsdbCommitDataEnd(pCommitter); _exit: - tsdbDebug("vgId:%d, commit data done, nRow:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nRow); + tsdbInfo("vgId:%d, commit data done, nRow:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nRow); return code; _err: @@ -1515,6 +997,11 @@ static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) { tsdbFSDestroy(&pCommitter->fs); taosArrayDestroy(pCommitter->aTbDataP); + // if (pCommitter->toMerge) { + // code = tsdbMerge(pTsdb); + // if (code) goto _err; + // } + tsdbInfo("vgId:%d, tsdb end commit", TD_VID(pTsdb->pVnode)); return code; @@ -1522,3 +1009,478 @@ _err: tsdbError("vgId:%d, tsdb end commit failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); return code; } + +// ================================================================================ + +static FORCE_INLINE SRowInfo *tsdbGetCommitRow(SCommitter *pCommitter) { + return (pCommitter->pIter) ? &pCommitter->pIter->r : NULL; +} + +static int32_t tsdbNextCommitRow(SCommitter *pCommitter) { + int32_t code = 0; + + if (pCommitter->pIter) { + SDataIter *pIter = pCommitter->pIter; + if (pCommitter->pIter->type == MEMORY_DATA_ITER) { // memory + tsdbTbDataIterNext(&pIter->iter); + TSDBROW *pRow = tsdbTbDataIterGet(&pIter->iter); + while (true) { + if (pRow && TSDBROW_TS(pRow) > pCommitter->maxKey) { + pCommitter->nextKey = TMIN(pCommitter->nextKey, TSDBROW_TS(pRow)); + pRow = NULL; + } + + if (pRow) { + pIter->r.suid = pIter->iter.pTbData->suid; + pIter->r.uid = pIter->iter.pTbData->uid; + pIter->r.row = *pRow; + break; + } + + pIter->iTbDataP++; + if (pIter->iTbDataP < taosArrayGetSize(pCommitter->aTbDataP)) { + STbData *pTbData = (STbData *)taosArrayGetP(pCommitter->aTbDataP, pIter->iTbDataP); + TSDBKEY keyFrom = {.ts = pCommitter->minKey, .version = VERSION_MIN}; + tsdbTbDataIterOpen(pTbData, &keyFrom, 0, &pIter->iter); + pRow = tsdbTbDataIterGet(&pIter->iter); + continue; + } else { + pCommitter->pIter = NULL; + break; + } + } + } else if (pCommitter->pIter->type == LAST_DATA_ITER) { // last file + pIter->iRow++; + if (pIter->iRow < pIter->bData.nRow) { + pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[pIter->iRow]; + pIter->r.row = tsdbRowFromBlockData(&pIter->bData, pIter->iRow); + } else { + pIter->iSstBlk++; + if (pIter->iSstBlk < taosArrayGetSize(pIter->aSstBlk)) { + SSstBlk *pSstBlk = (SSstBlk *)taosArrayGet(pIter->aSstBlk, pIter->iSstBlk); + + code = tsdbReadSstBlockEx(pCommitter->dReader.pReader, pIter->iSst, pSstBlk, &pIter->bData); + if (code) goto _exit; + + pIter->iRow = 0; + pIter->r.suid = pIter->bData.suid; + pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[0]; + pIter->r.row = tsdbRowFromBlockData(&pIter->bData, 0); + } else { + pCommitter->pIter = NULL; + } + } + } else { + ASSERT(0); + } + + // compare with min in RB Tree + pIter = (SDataIter *)tRBTreeMin(&pCommitter->rbt); + if (pCommitter->pIter && pIter) { + int32_t c = tRowInfoCmprFn(&pCommitter->pIter->r, &pIter->r); + if (c > 0) { + tRBTreePut(&pCommitter->rbt, (SRBTreeNode *)pCommitter->pIter); + pCommitter->pIter = NULL; + } else { + ASSERT(c); + } + } + } + + if (pCommitter->pIter == NULL) { + pCommitter->pIter = (SDataIter *)tRBTreeMin(&pCommitter->rbt); + if (pCommitter->pIter) { + tRBTreeDrop(&pCommitter->rbt, (SRBTreeNode *)pCommitter->pIter); + } + } + +_exit: + return code; +} + +static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) { + int32_t code = 0; + SBlockData *pBlockData = &pCommitter->dWriter.bData; + SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter); + TABLEID id = {.suid = pRowInfo->suid, .uid = pRowInfo->uid}; + + tBlockDataClear(pBlockData); + while (pRowInfo) { + ASSERT(pRowInfo->row.type == 0); + code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); + if (code) goto _err; + + code = tBlockDataAppendRow(pBlockData, &pRowInfo->row, pCommitter->skmRow.pTSchema, id.uid); + if (code) goto _err; + + code = tsdbNextCommitRow(pCommitter); + if (code) goto _err; + + pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo) { + if (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid) { + pRowInfo = NULL; + } else { + TSDBKEY tKey = TSDBROW_KEY(&pRowInfo->row); + if (tsdbKeyCmprFn(&tKey, &pDataBlk->minKey) >= 0) pRowInfo = NULL; + } + } + + if (pBlockData->nRow >= pCommitter->maxRow) { + code = tsdbCommitDataBlock(pCommitter); + if (code) goto _err; + } + } + + if (pBlockData->nRow) { + code = tsdbCommitDataBlock(pCommitter); + if (code) goto _err; + } + + return code; + +_err: + tsdbError("vgId:%d, tsdb commit ahead block failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + return code; +} + +static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) { + int32_t code = 0; + SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter); + TABLEID id = {.suid = pRowInfo->suid, .uid = pRowInfo->uid}; + SBlockData *pBDataR = &pCommitter->dReader.bData; + SBlockData *pBDataW = &pCommitter->dWriter.bData; + + code = tsdbReadDataBlock(pCommitter->dReader.pReader, pDataBlk, pBDataR); + if (code) goto _err; + + tBlockDataClear(pBDataW); + int32_t iRow = 0; + TSDBROW row = tsdbRowFromBlockData(pBDataR, 0); + TSDBROW *pRow = &row; + + while (pRow && pRowInfo) { + int32_t c = tsdbRowCmprFn(pRow, &pRowInfo->row); + if (c < 0) { + code = tBlockDataAppendRow(pBDataW, pRow, NULL, id.uid); + if (code) goto _err; + + iRow++; + if (iRow < pBDataR->nRow) { + row = tsdbRowFromBlockData(pBDataR, iRow); + } else { + pRow = NULL; + } + } else if (c > 0) { + ASSERT(pRowInfo->row.type == 0); + code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); + if (code) goto _err; + + code = tBlockDataAppendRow(pBDataW, &pRowInfo->row, pCommitter->skmRow.pTSchema, id.uid); + if (code) goto _err; + + code = tsdbNextCommitRow(pCommitter); + if (code) goto _err; + + pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo) { + if (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid) { + pRowInfo = NULL; + } else { + TSDBKEY tKey = TSDBROW_KEY(&pRowInfo->row); + if (tsdbKeyCmprFn(&tKey, &pDataBlk->maxKey) > 0) pRowInfo = NULL; + } + } + } else { + ASSERT(0); + } + + if (pBDataW->nRow >= pCommitter->maxRow) { + code = tsdbCommitDataBlock(pCommitter); + if (code) goto _err; + } + } + + while (pRow) { + code = tBlockDataAppendRow(pBDataW, pRow, NULL, id.uid); + if (code) goto _err; + + iRow++; + if (iRow < pBDataR->nRow) { + row = tsdbRowFromBlockData(pBDataR, iRow); + } else { + pRow = NULL; + } + + if (pBDataW->nRow >= pCommitter->maxRow) { + code = tsdbCommitDataBlock(pCommitter); + if (code) goto _err; + } + } + + if (pBDataW->nRow) { + code = tsdbCommitDataBlock(pCommitter); + if (code) goto _err; + } + + return code; + +_err: + tsdbError("vgId:%d, tsdb commit merge block failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + return code; +} + +static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { + int32_t code = 0; + SBlockIdx *pBlockIdx = pCommitter->dReader.pBlockIdx; + + ASSERT(pBlockIdx == NULL || tTABLEIDCmprFn(pBlockIdx, &id) >= 0); + if (pBlockIdx && pBlockIdx->suid == id.suid && pBlockIdx->uid == id.uid) { + int32_t iBlock = 0; + SDataBlk block; + SDataBlk *pDataBlk = █ + SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter); + + ASSERT(pRowInfo->suid == id.suid && pRowInfo->uid == id.uid); + + tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk); + while (pDataBlk && pRowInfo) { + SDataBlk tBlock = {.minKey = TSDBROW_KEY(&pRowInfo->row), .maxKey = TSDBROW_KEY(&pRowInfo->row)}; + int32_t c = tDataBlkCmprFn(pDataBlk, &tBlock); + + if (c < 0) { + code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pDataBlk, tPutDataBlk); + if (code) goto _err; + + iBlock++; + if (iBlock < pCommitter->dReader.mBlock.nItem) { + tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk); + } else { + pDataBlk = NULL; + } + } else if (c > 0) { + code = tsdbCommitAheadBlock(pCommitter, pDataBlk); + if (code) goto _err; + + pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) pRowInfo = NULL; + } else { + code = tsdbCommitMergeBlock(pCommitter, pDataBlk); + if (code) goto _err; + + iBlock++; + if (iBlock < pCommitter->dReader.mBlock.nItem) { + tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk); + } else { + pDataBlk = NULL; + } + pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) pRowInfo = NULL; + } + } + + while (pDataBlk) { + code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pDataBlk, tPutDataBlk); + if (code) goto _err; + + iBlock++; + if (iBlock < pCommitter->dReader.mBlock.nItem) { + tMapDataGetItemByIdx(&pCommitter->dReader.mBlock, iBlock, pDataBlk, tGetDataBlk); + } else { + pDataBlk = NULL; + } + } + + code = tsdbCommitterNextTableData(pCommitter); + if (code) goto _err; + } + +_exit: + return code; + +_err: + tsdbError("vgId:%d tsdb merge table data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + return code; +} + +static int32_t tsdbInitLastBlockIfNeed(SCommitter *pCommitter, TABLEID id) { + int32_t code = 0; + + SBlockData *pBDatal = &pCommitter->dWriter.bDatal; + if (pBDatal->suid || pBDatal->uid) { + if ((pBDatal->suid != id.suid) || (id.suid == 0)) { + if (pBDatal->nRow) { + code = tsdbCommitLastBlock(pCommitter); + if (code) goto _exit; + } + tBlockDataReset(pBDatal); + } + } + + if (!pBDatal->suid && !pBDatal->uid) { + ASSERT(pCommitter->skmTable.suid == id.suid); + ASSERT(pCommitter->skmTable.uid == id.uid); + code = tBlockDataInit(pBDatal, id.suid, id.suid ? 0 : id.uid, pCommitter->skmTable.pTSchema); + if (code) goto _exit; + } + +_exit: + return code; +} + +static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { + int32_t code = 0; + + SBlockData *pBData = &pCommitter->dWriter.bData; + SBlockData *pBDatal = &pCommitter->dWriter.bDatal; + + TABLEID id = {.suid = pBData->suid, .uid = pBData->uid}; + code = tsdbInitLastBlockIfNeed(pCommitter, id); + if (code) goto _err; + + for (int32_t iRow = 0; iRow < pBData->nRow; iRow++) { + TSDBROW row = tsdbRowFromBlockData(pBData, iRow); + code = tBlockDataAppendRow(pBDatal, &row, NULL, pBData->uid); + if (code) goto _err; + + if (pBDatal->nRow >= pCommitter->maxRow) { + code = tsdbCommitLastBlock(pCommitter); + if (code) goto _err; + } + } + + return code; + +_err: + return code; +} + +static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { + int32_t code = 0; + + SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) { + pRowInfo = NULL; + } + + if (pRowInfo == NULL) goto _exit; + + SBlockData *pBData; + if (pCommitter->toLastOnly) { + pBData = &pCommitter->dWriter.bDatal; + code = tsdbInitLastBlockIfNeed(pCommitter, id); + if (code) goto _err; + } else { + pBData = &pCommitter->dWriter.bData; + ASSERT(pBData->nRow == 0); + } + + while (pRowInfo) { + STSchema *pTSchema = NULL; + if (pRowInfo->row.type == 0) { + code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); + if (code) goto _err; + pTSchema = pCommitter->skmRow.pTSchema; + } + + code = tBlockDataAppendRow(pBData, &pRowInfo->row, pTSchema, id.uid); + if (code) goto _err; + + code = tsdbNextCommitRow(pCommitter); + if (code) goto _err; + + pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) { + pRowInfo = NULL; + } + + if (pBData->nRow >= pCommitter->maxRow) { + if (pCommitter->toLastOnly) { + code = tsdbCommitLastBlock(pCommitter); + if (code) goto _err; + } else { + code = tsdbCommitDataBlock(pCommitter); + if (code) goto _err; + } + } + } + + if (!pCommitter->toLastOnly && pBData->nRow) { + if (pBData->nRow > pCommitter->minRow) { + code = tsdbCommitDataBlock(pCommitter); + if (code) goto _err; + } else { + code = tsdbAppendLastBlock(pCommitter); + if (code) goto _err; + } + } + +_exit: + return code; + +_err: + tsdbError("vgId:%d tsdb commit table data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + return code; +} + +static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { + int32_t code = 0; + + SRowInfo *pRowInfo; + TABLEID id = {0}; + while ((pRowInfo = tsdbGetCommitRow(pCommitter)) != NULL) { + ASSERT(pRowInfo->suid != id.suid || pRowInfo->uid != id.uid); + id.suid = pRowInfo->suid; + id.uid = pRowInfo->uid; + + code = tsdbMoveCommitData(pCommitter, id); + if (code) goto _err; + + // start + tMapDataReset(&pCommitter->dWriter.mBlock); + + // impl + code = tsdbCommitterUpdateTableSchema(pCommitter, id.suid, id.uid); + if (code) goto _err; + code = tBlockDataInit(&pCommitter->dReader.bData, id.suid, id.uid, pCommitter->skmTable.pTSchema); + if (code) goto _err; + code = tBlockDataInit(&pCommitter->dWriter.bData, id.suid, id.uid, pCommitter->skmTable.pTSchema); + if (code) goto _err; + + /* merge with data in .data file */ + code = tsdbMergeTableData(pCommitter, id); + if (code) goto _err; + + /* handle remain table data */ + code = tsdbCommitTableData(pCommitter, id); + if (code) goto _err; + + // end + if (pCommitter->dWriter.mBlock.nItem > 0) { + SBlockIdx blockIdx = {.suid = id.suid, .uid = id.uid}; + code = tsdbWriteBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.mBlock, &blockIdx); + if (code) goto _err; + + if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + } + } + + id.suid = INT64_MAX; + id.uid = INT64_MAX; + code = tsdbMoveCommitData(pCommitter, id); + if (code) goto _err; + + if (pCommitter->dWriter.bDatal.nRow > 0) { + code = tsdbCommitLastBlock(pCommitter); + if (code) goto _err; + } + + return code; + +_err: + tsdbError("vgId:%d tsdb commit file data impl failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + return code; +} diff --git a/source/dnode/vnode/src/tsdb/tsdbCompact.c b/source/dnode/vnode/src/tsdb/tsdbCompact.c new file mode 100644 index 0000000000..fb3917be64 --- /dev/null +++ b/source/dnode/vnode/src/tsdb/tsdbCompact.c @@ -0,0 +1,27 @@ +/* + * 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" + +typedef struct { + STsdb *pTsdb; + STsdbFS fs; +} STsdbCompactor; + +int32_t tsdbCompact(STsdb *pTsdb) { + int32_t code = 0; + // TODO + return code; +} diff --git a/source/dnode/vnode/src/tsdb/tsdbCompress.c b/source/dnode/vnode/src/tsdb/tsdbCompress.c new file mode 100644 index 0000000000..76be7c1070 --- /dev/null +++ b/source/dnode/vnode/src/tsdb/tsdbCompress.c @@ -0,0 +1,64 @@ +/* + * 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" + +// Integer ===================================================== +typedef struct { + int8_t rawCopy; + int64_t prevVal; + int32_t nVal; + int32_t nBuf; + uint8_t *pBuf; +} SIntCompressor; + +#define I64_SAFE_ADD(a, b) (((a) >= 0 && (b) <= INT64_MAX - (b)) || ((a) < 0 && (b) >= INT64_MIN - (a))) +#define SIMPLE8B_MAX ((uint64_t)1152921504606846974LL) + +static int32_t tsdbCmprI64(SIntCompressor *pCompressor, int64_t val) { + int32_t code = 0; + + // raw copy + if (pCompressor->rawCopy) { + memcpy(pCompressor->pBuf + pCompressor->nBuf, &val, sizeof(val)); + pCompressor->nBuf += sizeof(val); + pCompressor->nVal++; + goto _exit; + } + + if (!I64_SAFE_ADD(val, pCompressor->prevVal)) { + pCompressor->rawCopy = 1; + // TODO: decompress and copy + pCompressor->nVal++; + goto _exit; + } + + int64_t diff = val - pCompressor->prevVal; + uint8_t zigzag = ZIGZAGE(int64_t, diff); + + if (zigzag >= SIMPLE8B_MAX) { + pCompressor->rawCopy = 1; + // TODO: decompress and copy + pCompressor->nVal++; + goto _exit; + } + +_exit: + return code; +} + +// Timestamp ===================================================== + +// Float ===================================================== \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c new file mode 100644 index 0000000000..3bd71f0ea6 --- /dev/null +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -0,0 +1,84 @@ +/* + * 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" + +typedef struct SDiskColBuilder SDiskColBuilder; +struct SDiskColBuilder { + uint8_t flags; + uint8_t *pBitMap; + int32_t *aOffset; + int32_t nData; + uint8_t *pData; +}; + +int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + // TODO + return code; +} + +// ================================================================ +typedef struct SDiskDataBuilder SDiskDataBuilder; +struct SDiskDataBuilder { + SDiskDataHdr hdr; + SArray *aBlockCol; // SArray +}; + +int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder) { + int32_t code = 0; + // TODO + return code; +} + +void tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { + // TODO +} + +void tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, int64_t suid, int64_t uid, STSchema *pTSchema, int8_t cmprAlg) { + pBuilder->hdr = (SDiskDataHdr){.delimiter = TSDB_FILE_DLMT, // + .fmtVer = 0, + .suid = suid, + .uid = uid, + .cmprAlg = cmprAlg}; +} + +void tDiskDataBuilderReset(SDiskDataBuilder *pBuilder) { + // TODO +} + +int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, int64_t uid) { + int32_t code = 0; + + // uid (todo) + + // version (todo) + + // TSKEY (todo) + + SRowIter iter = {0}; + tRowIterInit(&iter, pRow, pTSchema); + + for (int32_t iDiskCol = 0; iDiskCol < 0; iDiskCol++) { + } + + return code; +} + +int32_t tDiskDataBuilderGet(SDiskDataBuilder *pBuilder, uint8_t **ppData) { + int32_t code = 0; + // TODO + return code; +} \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c index 247de99338..e6bc9d9936 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS.c @@ -110,7 +110,7 @@ _err: // taosRemoveFile(fname); // } -// // last +// // sst // if (isSameDisk && pFrom->pLastF->commitID == pTo->pLastF->commitID) { // if (pFrom->pLastF->size > pTo->pLastF->size) { // code = tsdbDFileRollback(pFS->pTsdb, pTo, TSDB_LAST_FILE); @@ -140,7 +140,7 @@ _err: // tsdbDataFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pDataF, fname); // taosRemoveFile(fname); -// // last +// // sst // tsdbLastFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pLastF, fname); // taosRemoveFile(fname); @@ -254,8 +254,10 @@ void tsdbFSDestroy(STsdbFS *pFS) { SDFileSet *pSet = (SDFileSet *)taosArrayGet(pFS->aDFileSet, iSet); taosMemoryFree(pSet->pHeadF); taosMemoryFree(pSet->pDataF); - taosMemoryFree(pSet->pLastF); taosMemoryFree(pSet->pSmaF); + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + taosMemoryFree(pSet->aSstF[iSst]); + } } taosArrayDestroy(pFS->aDFileSet); @@ -309,17 +311,6 @@ static int32_t tsdbScanAndTryFixFS(STsdb *pTsdb) { if (code) goto _err; } - // last =========== - tsdbLastFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pLastF, fname); - if (taosStatFile(fname, &size, NULL)) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - if (size != pSet->pLastF->size) { - code = TSDB_CODE_FILE_CORRUPTED; - goto _err; - } - // sma ============= tsdbSmaFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pSmaF, fname); if (taosStatFile(fname, &size, NULL)) { @@ -333,6 +324,19 @@ static int32_t tsdbScanAndTryFixFS(STsdb *pTsdb) { code = tsdbDFileRollback(pTsdb, pSet, TSDB_SMA_FILE); if (code) goto _err; } + + // sst =========== + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + tsdbSstFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSstF[iSst], fname); + if (taosStatFile(fname, &size, NULL)) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + if (size != pSet->aSstF[iSst]->size) { + code = TSDB_CODE_FILE_CORRUPTED; + goto _err; + } + } } { @@ -382,41 +386,15 @@ static int32_t tsdbRecoverFS(STsdb *pTsdb, uint8_t *pData, int64_t nData) { taosArrayClear(pTsdb->fs.aDFileSet); n += tGetU32v(pData + n, &nSet); for (uint32_t iSet = 0; iSet < nSet; iSet++) { - SDFileSet fSet; + SDFileSet fSet = {0}; - // head - fSet.pHeadF = (SHeadFile *)taosMemoryCalloc(1, sizeof(SHeadFile)); - if (fSet.pHeadF == NULL) { + int32_t nt = tGetDFileSet(pData + n, &fSet); + if (nt < 0) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } - fSet.pHeadF->nRef = 1; - // data - fSet.pDataF = (SDataFile *)taosMemoryCalloc(1, sizeof(SDataFile)); - if (fSet.pDataF == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - fSet.pDataF->nRef = 1; - - // last - fSet.pLastF = (SLastFile *)taosMemoryCalloc(1, sizeof(SLastFile)); - if (fSet.pLastF == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - fSet.pLastF->nRef = 1; - - // sma - fSet.pSmaF = (SSmaFile *)taosMemoryCalloc(1, sizeof(SSmaFile)); - if (fSet.pSmaF == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - fSet.pSmaF->nRef = 1; - - n += tGetDFileSet(pData + n, &fSet); + n += nt; if (taosArrayPush(pTsdb->fs.aDFileSet, &fSet) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; @@ -532,13 +510,15 @@ int32_t tsdbFSClose(STsdb *pTsdb) { ASSERT(pSet->pDataF->nRef == 1); taosMemoryFree(pSet->pDataF); - // last - ASSERT(pSet->pLastF->nRef == 1); - taosMemoryFree(pSet->pLastF); - // sma ASSERT(pSet->pSmaF->nRef == 1); taosMemoryFree(pSet->pSmaF); + + // sst + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + ASSERT(pSet->aSstF[iSst]->nRef == 1); + taosMemoryFree(pSet->aSstF[iSst]); + } } taosArrayDestroy(pTsdb->fs.aDFileSet); @@ -586,15 +566,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) { } *fSet.pDataF = *pSet->pDataF; - // data - fSet.pLastF = (SLastFile *)taosMemoryMalloc(sizeof(SLastFile)); - if (fSet.pLastF == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; - } - *fSet.pLastF = *pSet->pLastF; - - // last + // sma fSet.pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile)); if (fSet.pSmaF == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; @@ -602,6 +574,16 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) { } *fSet.pSmaF = *pSet->pSmaF; + // sst + for (fSet.nSstF = 0; fSet.nSstF < pSet->nSstF; fSet.nSstF++) { + fSet.aSstF[fSet.nSstF] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (fSet.aSstF[fSet.nSstF] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + *fSet.aSstF[fSet.nSstF] = *pSet->aSstF[fSet.nSstF]; + } + if (taosArrayPush(pFS->aDFileSet, &fSet) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; @@ -651,14 +633,38 @@ int32_t tsdbFSUpsertFSet(STsdbFS *pFS, SDFileSet *pSet) { if (c == 0) { *pDFileSet->pHeadF = *pSet->pHeadF; *pDFileSet->pDataF = *pSet->pDataF; - *pDFileSet->pLastF = *pSet->pLastF; *pDFileSet->pSmaF = *pSet->pSmaF; + // sst + if (pSet->nSstF > pDFileSet->nSstF) { + ASSERT(pSet->nSstF == pDFileSet->nSstF + 1); + + pDFileSet->aSstF[pDFileSet->nSstF] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (pDFileSet->aSstF[pDFileSet->nSstF] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + *pDFileSet->aSstF[pDFileSet->nSstF] = *pSet->aSstF[pSet->nSstF - 1]; + pDFileSet->nSstF++; + } else if (pSet->nSstF < pDFileSet->nSstF) { + ASSERT(pSet->nSstF == 1); + for (int32_t iSst = 1; iSst < pDFileSet->nSstF; iSst++) { + taosMemoryFree(pDFileSet->aSstF[iSst]); + } + + *pDFileSet->aSstF[0] = *pSet->aSstF[0]; + pDFileSet->nSstF = 1; + } else { + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + *pDFileSet->aSstF[iSst] = *pSet->aSstF[iSst]; + } + } goto _exit; } } - SDFileSet fSet = {.diskId = pSet->diskId, .fid = pSet->fid}; + ASSERT(pSet->nSstF == 1); + SDFileSet fSet = {.diskId = pSet->diskId, .fid = pSet->fid, .nSstF = 1}; // head fSet.pHeadF = (SHeadFile *)taosMemoryMalloc(sizeof(SHeadFile)); @@ -676,15 +682,7 @@ int32_t tsdbFSUpsertFSet(STsdbFS *pFS, SDFileSet *pSet) { } *fSet.pDataF = *pSet->pDataF; - // data - fSet.pLastF = (SLastFile *)taosMemoryMalloc(sizeof(SLastFile)); - if (fSet.pLastF == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; - } - *fSet.pLastF = *pSet->pLastF; - - // last + // sma fSet.pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile)); if (fSet.pSmaF == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; @@ -692,6 +690,14 @@ int32_t tsdbFSUpsertFSet(STsdbFS *pFS, SDFileSet *pSet) { } *fSet.pSmaF = *pSet->pSmaF; + // sst + fSet.aSstF[0] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (fSet.aSstF[0] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + *fSet.aSstF[0] = *pSet->aSstF[0]; + if (taosArrayInsert(pFS->aDFileSet, idx, &fSet) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; @@ -836,27 +842,6 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) { pSetOld->pDataF->size = pSetNew->pDataF->size; } - // last - fSet.pLastF = pSetOld->pLastF; - if ((!sameDisk) || (pSetOld->pLastF->commitID != pSetNew->pLastF->commitID)) { - pSetOld->pLastF = (SLastFile *)taosMemoryMalloc(sizeof(SLastFile)); - if (pSetOld->pLastF == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - *pSetOld->pLastF = *pSetNew->pLastF; - pSetOld->pLastF->nRef = 1; - - nRef = atomic_sub_fetch_32(&fSet.pLastF->nRef, 1); - if (nRef == 0) { - tsdbLastFileName(pTsdb, pSetOld->diskId, pSetOld->fid, fSet.pLastF, fname); - taosRemoveFile(fname); - taosMemoryFree(fSet.pLastF); - } - } else { - ASSERT(pSetOld->pLastF->size == pSetNew->pLastF->size); - } - // sma fSet.pSmaF = pSetOld->pSmaF; if ((!sameDisk) || (pSetOld->pSmaF->commitID != pSetNew->pSmaF->commitID)) { @@ -879,6 +864,84 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) { pSetOld->pSmaF->size = pSetNew->pSmaF->size; } + // sst + if (sameDisk) { + if (pSetNew->nSstF > pSetOld->nSstF) { + ASSERT(pSetNew->nSstF = pSetOld->nSstF + 1); + pSetOld->aSstF[pSetOld->nSstF] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (pSetOld->aSstF[pSetOld->nSstF] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + *pSetOld->aSstF[pSetOld->nSstF] = *pSetNew->aSstF[pSetOld->nSstF]; + pSetOld->aSstF[pSetOld->nSstF]->nRef = 1; + pSetOld->nSstF++; + } else if (pSetNew->nSstF < pSetOld->nSstF) { + ASSERT(pSetNew->nSstF == 1); + for (int32_t iSst = 0; iSst < pSetOld->nSstF; iSst++) { + SSstFile *pSstFile = pSetOld->aSstF[iSst]; + nRef = atomic_sub_fetch_32(&pSstFile->nRef, 1); + if (nRef == 0) { + tsdbSstFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSstFile, fname); + taosRemoveFile(fname); + taosMemoryFree(pSstFile); + } + pSetOld->aSstF[iSst] = NULL; + } + + pSetOld->nSstF = 1; + pSetOld->aSstF[0] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (pSetOld->aSstF[0] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + *pSetOld->aSstF[0] = *pSetNew->aSstF[0]; + pSetOld->aSstF[0]->nRef = 1; + } else { + for (int32_t iSst = 0; iSst < pSetOld->nSstF; iSst++) { + if (pSetOld->aSstF[iSst]->commitID != pSetNew->aSstF[iSst]->commitID) { + SSstFile *pSstFile = pSetOld->aSstF[iSst]; + nRef = atomic_sub_fetch_32(&pSstFile->nRef, 1); + if (nRef == 0) { + tsdbSstFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSstFile, fname); + taosRemoveFile(fname); + taosMemoryFree(pSstFile); + } + + pSetOld->aSstF[iSst] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (pSetOld->aSstF[iSst] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + *pSetOld->aSstF[iSst] = *pSetNew->aSstF[iSst]; + pSetOld->aSstF[iSst]->nRef = 1; + } else { + ASSERT(pSetOld->aSstF[iSst]->size == pSetOld->aSstF[iSst]->size); + ASSERT(pSetOld->aSstF[iSst]->offset == pSetOld->aSstF[iSst]->offset); + } + } + } + } else { + ASSERT(pSetOld->nSstF == pSetNew->nSstF); + for (int32_t iSst = 0; iSst < pSetOld->nSstF; iSst++) { + SSstFile *pSstFile = pSetOld->aSstF[iSst]; + nRef = atomic_sub_fetch_32(&pSstFile->nRef, 1); + if (nRef == 0) { + tsdbSstFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSstFile, fname); + taosRemoveFile(fname); + taosMemoryFree(pSstFile); + } + + pSetOld->aSstF[iSst] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (pSetOld->aSstF[iSst] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + *pSetOld->aSstF[iSst] = *pSetNew->aSstF[iSst]; + pSetOld->aSstF[iSst]->nRef = 1; + } + } + if (!sameDisk) { pSetOld->diskId = pSetNew->diskId; } @@ -902,13 +965,6 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) { taosMemoryFree(pSetOld->pDataF); } - nRef = atomic_sub_fetch_32(&pSetOld->pLastF->nRef, 1); - if (nRef == 0) { - tsdbLastFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->pLastF, fname); - taosRemoveFile(fname); - taosMemoryFree(pSetOld->pLastF); - } - nRef = atomic_sub_fetch_32(&pSetOld->pSmaF->nRef, 1); if (nRef == 0) { tsdbSmaFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->pSmaF, fname); @@ -916,12 +972,20 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) { taosMemoryFree(pSetOld->pSmaF); } + for (int8_t iSst = 0; iSst < pSetOld->nSstF; iSst++) { + nRef = atomic_sub_fetch_32(&pSetOld->aSstF[iSst]->nRef, 1); + if (nRef == 0) { + tsdbSstFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->aSstF[iSst], fname); + taosRemoveFile(fname); + taosMemoryFree(pSetOld->aSstF[iSst]); + } + } + taosArrayRemove(pTsdb->fs.aDFileSet, iOld); continue; _add_new: - fSet.diskId = pSetNew->diskId; - fSet.fid = pSetNew->fid; + fSet = (SDFileSet){.diskId = pSetNew->diskId, .fid = pSetNew->fid, .nSstF = 1}; // head fSet.pHeadF = (SHeadFile *)taosMemoryMalloc(sizeof(SHeadFile)); @@ -941,15 +1005,6 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) { *fSet.pDataF = *pSetNew->pDataF; fSet.pDataF->nRef = 1; - // last - fSet.pLastF = (SLastFile *)taosMemoryMalloc(sizeof(SLastFile)); - if (fSet.pLastF == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - *fSet.pLastF = *pSetNew->pLastF; - fSet.pLastF->nRef = 1; - // sma fSet.pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile)); if (fSet.pSmaF == NULL) { @@ -959,6 +1014,16 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) { *fSet.pSmaF = *pSetNew->pSmaF; fSet.pSmaF->nRef = 1; + // sst + ASSERT(pSetNew->nSstF == 1); + fSet.aSstF[0] = (SSstFile *)taosMemoryMalloc(sizeof(SSstFile)); + if (fSet.aSstF[0] == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + *fSet.aSstF[0] = *pSetNew->aSstF[0]; + fSet.aSstF[0]->nRef = 1; + if (taosArrayInsert(pTsdb->fs.aDFileSet, iOld, &fSet) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; @@ -1002,12 +1067,14 @@ int32_t tsdbFSRef(STsdb *pTsdb, STsdbFS *pFS) { nRef = atomic_fetch_add_32(&pSet->pDataF->nRef, 1); ASSERT(nRef > 0); - nRef = atomic_fetch_add_32(&pSet->pLastF->nRef, 1); - ASSERT(nRef > 0); - nRef = atomic_fetch_add_32(&pSet->pSmaF->nRef, 1); ASSERT(nRef > 0); + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + nRef = atomic_fetch_add_32(&pSet->aSstF[iSst]->nRef, 1); + ASSERT(nRef > 0); + } + if (taosArrayPush(pFS->aDFileSet, &fSet) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; @@ -1053,15 +1120,6 @@ void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS) { taosMemoryFree(pSet->pDataF); } - // last - nRef = atomic_sub_fetch_32(&pSet->pLastF->nRef, 1); - ASSERT(nRef >= 0); - if (nRef == 0) { - tsdbLastFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pLastF, fname); - taosRemoveFile(fname); - taosMemoryFree(pSet->pLastF); - } - // sma nRef = atomic_sub_fetch_32(&pSet->pSmaF->nRef, 1); ASSERT(nRef >= 0); @@ -1070,6 +1128,18 @@ void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS) { taosRemoveFile(fname); taosMemoryFree(pSet->pSmaF); } + + // sst + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + nRef = atomic_sub_fetch_32(&pSet->aSstF[iSst]->nRef, 1); + ASSERT(nRef >= 0); + if (nRef == 0) { + tsdbSstFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSstF[iSst], fname); + taosRemoveFile(fname); + taosMemoryFree(pSet->aSstF[iSst]); + /* code */ + } + } } taosArrayDestroy(pFS->aDFileSet); diff --git a/source/dnode/vnode/src/tsdb/tsdbFile.c b/source/dnode/vnode/src/tsdb/tsdbFile.c index 00d2ac848f..632a2c827b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFile.c +++ b/source/dnode/vnode/src/tsdb/tsdbFile.c @@ -53,22 +53,22 @@ static int32_t tGetDataFile(uint8_t *p, SDataFile *pDataFile) { return n; } -int32_t tPutLastFile(uint8_t *p, SLastFile *pLastFile) { +int32_t tPutSstFile(uint8_t *p, SSstFile *pSstFile) { int32_t n = 0; - n += tPutI64v(p ? p + n : p, pLastFile->commitID); - n += tPutI64v(p ? p + n : p, pLastFile->size); - n += tPutI64v(p ? p + n : p, pLastFile->offset); + n += tPutI64v(p ? p + n : p, pSstFile->commitID); + n += tPutI64v(p ? p + n : p, pSstFile->size); + n += tPutI64v(p ? p + n : p, pSstFile->offset); return n; } -static int32_t tGetLastFile(uint8_t *p, SLastFile *pLastFile) { +static int32_t tGetSstFile(uint8_t *p, SSstFile *pSstFile) { int32_t n = 0; - n += tGetI64v(p + n, &pLastFile->commitID); - n += tGetI64v(p + n, &pLastFile->size); - n += tGetI64v(p + n, &pLastFile->offset); + n += tGetI64v(p + n, &pSstFile->commitID); + n += tGetI64v(p + n, &pSstFile->size); + n += tGetI64v(p + n, &pSstFile->offset); return n; } @@ -102,9 +102,9 @@ void tsdbDataFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SDataFile *pDataF, TD_DIRSEP, pTsdb->path, TD_DIRSEP, TD_VID(pTsdb->pVnode), fid, pDataF->commitID, ".data"); } -void tsdbLastFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SLastFile *pLastF, char fname[]) { +void tsdbSstFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSstFile *pSstF, char fname[]) { snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sv%df%dver%" PRId64 "%s", tfsGetDiskPath(pTsdb->pVnode->pTfs, did), - TD_DIRSEP, pTsdb->path, TD_DIRSEP, TD_VID(pTsdb->pVnode), fid, pLastF->commitID, ".last"); + TD_DIRSEP, pTsdb->path, TD_DIRSEP, TD_VID(pTsdb->pVnode), fid, pSstF->commitID, ".sst"); } void tsdbSmaFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSmaFile *pSmaF, char fname[]) { @@ -194,9 +194,11 @@ int32_t tPutDFileSet(uint8_t *p, SDFileSet *pSet) { n += tPutDataFile(p ? p + n : p, pSet->pDataF); n += tPutSmaFile(p ? p + n : p, pSet->pSmaF); - // last - n += tPutU8(p ? p + n : p, 1); // for future compatibility - n += tPutLastFile(p ? p + n : p, pSet->pLastF); + // sst + n += tPutU8(p ? p + n : p, pSet->nSstF); + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + n += tPutSstFile(p ? p + n : p, pSet->aSstF[iSst]); + } return n; } @@ -208,15 +210,40 @@ int32_t tGetDFileSet(uint8_t *p, SDFileSet *pSet) { n += tGetI32v(p + n, &pSet->diskId.id); n += tGetI32v(p + n, &pSet->fid); - // data + // head + pSet->pHeadF = (SHeadFile *)taosMemoryCalloc(1, sizeof(SHeadFile)); + if (pSet->pHeadF == NULL) { + return -1; + } + pSet->pHeadF->nRef = 1; n += tGetHeadFile(p + n, pSet->pHeadF); + + // data + pSet->pDataF = (SDataFile *)taosMemoryCalloc(1, sizeof(SDataFile)); + if (pSet->pDataF == NULL) { + return -1; + } + pSet->pDataF->nRef = 1; n += tGetDataFile(p + n, pSet->pDataF); + + // sma + pSet->pSmaF = (SSmaFile *)taosMemoryCalloc(1, sizeof(SSmaFile)); + if (pSet->pSmaF == NULL) { + return -1; + } + pSet->pSmaF->nRef = 1; n += tGetSmaFile(p + n, pSet->pSmaF); - // last - uint8_t nLast; - n += tGetU8(p + n, &nLast); - n += tGetLastFile(p + n, pSet->pLastF); + // sst + n += tGetU8(p + n, &pSet->nSstF); + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + pSet->aSstF[iSst] = (SSstFile *)taosMemoryCalloc(1, sizeof(SSstFile)); + if (pSet->aSstF[iSst] == NULL) { + return -1; + } + pSet->aSstF[iSst]->nRef = 1; + n += tGetSstFile(p + n, pSet->aSstF[iSst]); + } return n; } diff --git a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c new file mode 100644 index 0000000000..e85b136c2a --- /dev/null +++ b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c @@ -0,0 +1,378 @@ +/* + * 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" + +// SLDataIter ================================================= +typedef struct SLDataIter { + SRBTreeNode node; + SSstBlk *pSstBlk; + SDataFReader *pReader; + int32_t iSst; + int8_t backward; + SArray *aSstBlk; + int32_t iSstBlk; + SBlockData bData[2]; + int32_t loadIndex; + int32_t iRow; + SRowInfo rInfo; + uint64_t uid; + STimeWindow timeWindow; + SVersionRange verRange; +} SLDataIter; + +static SBlockData* getCurrentBlock(SLDataIter* pIter) { + return &pIter->bData[pIter->loadIndex]; +} + +static SBlockData* getNextBlock(SLDataIter* pIter) { + pIter->loadIndex ^= 1; + return getCurrentBlock(pIter); +} + +int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t iSst, int8_t backward, uint64_t uid, + STimeWindow *pTimeWindow, SVersionRange *pRange) { + int32_t code = 0; + *pIter = taosMemoryCalloc(1, sizeof(SLDataIter)); + if (*pIter == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + (*pIter)->uid = uid; + (*pIter)->timeWindow = *pTimeWindow; + (*pIter)->verRange = *pRange; + (*pIter)->pReader = pReader; + (*pIter)->iSst = iSst; + (*pIter)->backward = backward; + (*pIter)->aSstBlk = taosArrayInit(0, sizeof(SSstBlk)); + if ((*pIter)->aSstBlk == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + code = tBlockDataCreate(&(*pIter)->bData[0]); + if (code) { + goto _exit; + } + + code = tBlockDataCreate(&(*pIter)->bData[1]); + if (code) { + goto _exit; + } + + code = tsdbReadSstBlk(pReader, iSst, (*pIter)->aSstBlk); + if (code) { + goto _exit; + } + + size_t size = taosArrayGetSize((*pIter)->aSstBlk); + + // find the start block + int32_t index = -1; + if (!backward) { // asc + for (int32_t i = 0; i < size; ++i) { + SSstBlk *p = taosArrayGet((*pIter)->aSstBlk, i); + if (p->minUid <= uid && p->maxUid >= uid) { + index = i; + break; + } + } + } else { // desc + for (int32_t i = size - 1; i >= 0; --i) { + SSstBlk *p = taosArrayGet((*pIter)->aSstBlk, i); + if (p->minUid <= uid && p->maxUid >= uid) { + index = i; + break; + } + } + } + + (*pIter)->iSstBlk = index; + if (index != -1) { + (*pIter)->pSstBlk = taosArrayGet((*pIter)->aSstBlk, (*pIter)->iSstBlk); + } + +_exit: + return code; +} + +void tLDataIterClose(SLDataIter *pIter) { + tBlockDataDestroy(&pIter->bData[0], 1); + tBlockDataDestroy(&pIter->bData[1], 1); + taosArrayDestroy(pIter->aSstBlk); + taosMemoryFree(pIter); +} + +extern int32_t tsdbReadSstBlockEx(SDataFReader *pReader, int32_t iSst, SSstBlk *pSstBlk, SBlockData *pBlockData); + +void tLDataIterNextBlock(SLDataIter *pIter) { + int32_t step = pIter->backward ? -1 : 1; + pIter->iSstBlk += step; + + int32_t index = -1; + size_t size = taosArrayGetSize(pIter->aSstBlk); + for (int32_t i = pIter->iSstBlk; i < size && i >= 0; i += step) { + SSstBlk *p = taosArrayGet(pIter->aSstBlk, i); + if ((!pIter->backward) && p->minUid > pIter->uid) { + break; + } + + if (pIter->backward && p->maxUid < pIter->uid) { + break; + } + + if (p->minUid <= pIter->uid && p->maxUid >= pIter->uid) { + index = i; + break; + } + } + + if (index == -1) { + pIter->pSstBlk = NULL; + } else { + pIter->pSstBlk = (SSstBlk *)taosArrayGet(pIter->aSstBlk, pIter->iSstBlk); + } +} + +static void findNextValidRow(SLDataIter *pIter) { + int32_t step = pIter->backward ? -1 : 1; + + bool hasVal = false; + int32_t i = pIter->iRow; + SBlockData* pBlockData = getCurrentBlock(pIter); + + for (; i < pBlockData->nRow && i >= 0; i += step) { + if (pBlockData->aUid != NULL) { + if (!pIter->backward) { + if (pBlockData->aUid[i] < pIter->uid) { + continue; + } else if (pBlockData->aUid[i] > pIter->uid) { + break; + } + } else { + if (pBlockData->aUid[i] > pIter->uid) { + continue; + } else if (pBlockData->aUid[i] < pIter->uid) { + break; + } + } + } + + int64_t ts = pBlockData->aTSKEY[i]; + if (!pIter->backward) { // asc + if (ts > pIter->timeWindow.ekey) { // no more data + break; + } else if (ts < pIter->timeWindow.skey) { + continue; + } + } else { + if (ts < pIter->timeWindow.skey) { + break; + } else if (ts > pIter->timeWindow.ekey) { + continue; + } + } + + int64_t ver = pBlockData->aVersion[i]; + if (ver < pIter->verRange.minVer) { + continue; + } + + // todo opt handle desc case + if (ver > pIter->verRange.maxVer) { + continue; + } + + // todo handle delete soon +#if 0 + TSDBKEY k = {.ts = ts, .version = ver}; + if (hasBeenDropped(pBlockScanInfo->delSkyline, &pBlockScanInfo->lastBlockDelIndex, &k, pLastBlockReader->order)) { + continue; + } +#endif + + hasVal = true; + break; + } + + pIter->iRow = (hasVal) ? i : -1; +} + +bool tLDataIterNextRow(SLDataIter *pIter) { + int32_t code = 0; + int32_t step = pIter->backward ? -1 : 1; + + // no qualified last file block in current file, no need to fetch row + if (pIter->pSstBlk == NULL) { + return false; + } + + int32_t iBlockL = pIter->iSstBlk; + SBlockData* pBlockData = getCurrentBlock(pIter); + + if (pBlockData->nRow == 0 && pIter->pSstBlk != NULL) { // current block not loaded yet + pBlockData = getNextBlock(pIter); + code = tsdbReadSstBlockEx(pIter->pReader, pIter->iSst, pIter->pSstBlk, pBlockData); + if (code != TSDB_CODE_SUCCESS) { + goto _exit; + } + + pIter->iRow = (pIter->backward) ? pBlockData->nRow : -1; + } + + pIter->iRow += step; + + while (1) { + findNextValidRow(pIter); + + if (pIter->iRow >= pBlockData->nRow || pIter->iRow < 0) { + tLDataIterNextBlock(pIter); + if (pIter->pSstBlk == NULL) { // no more data + goto _exit; + } + } else { + break; + } + + if (iBlockL != pIter->iSstBlk) { + pBlockData = getNextBlock(pIter); + code = tsdbReadSstBlockEx(pIter->pReader, pIter->iSst, pIter->pSstBlk, pBlockData); + if (code) { + goto _exit; + } + pIter->iRow = pIter->backward ? (pBlockData->nRow - 1) : 0; + } + } + + pIter->rInfo.suid = pBlockData->suid; + pIter->rInfo.uid = pBlockData->uid; + pIter->rInfo.row = tsdbRowFromBlockData(pBlockData, pIter->iRow); + +_exit: + if (code != TSDB_CODE_SUCCESS) { + terrno = code; + } + + return (code == TSDB_CODE_SUCCESS) && (pIter->pSstBlk != NULL); +} + +SRowInfo *tLDataIterGet(SLDataIter *pIter) { return &pIter->rInfo; } + +// SMergeTree ================================================= +static FORCE_INLINE int32_t tLDataIterCmprFn(const void *p1, const void *p2) { + SLDataIter *pIter1 = (SLDataIter *)(((uint8_t *)p1) - sizeof(SRBTreeNode)); + SLDataIter *pIter2 = (SLDataIter *)(((uint8_t *)p2) - sizeof(SRBTreeNode)); + + TSDBKEY key1 = TSDBROW_KEY(&pIter1->rInfo.row); + TSDBKEY key2 = TSDBROW_KEY(&pIter2->rInfo.row); + + if (key1.ts < key2.ts) { + return -1; + } else if (key1.ts > key2.ts) { + return 1; + } else { + if (key1.version < key2.version) { + return -1; + } else if (key1.version > key2.version) { + return 1; + } else { + return 0; + } + } +} + +int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t uid, + STimeWindow *pTimeWindow, SVersionRange *pVerRange) { + pMTree->backward = backward; + pMTree->pIter = NULL; + pMTree->pIterList = taosArrayInit(4, POINTER_BYTES); + if (pMTree->pIterList == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + tRBTreeCreate(&pMTree->rbt, tLDataIterCmprFn); + int32_t code = TSDB_CODE_OUT_OF_MEMORY; + + struct SLDataIter *pIterList[TSDB_DEFAULT_LAST_FILE] = {0}; + for (int32_t i = 0; i < pFReader->pSet->nSstF; ++i) { // open all last file + code = tLDataIterOpen(&pIterList[i], pFReader, i, pMTree->backward, uid, pTimeWindow, pVerRange); + if (code != TSDB_CODE_SUCCESS) { + goto _end; + } + + bool hasVal = tLDataIterNextRow(pIterList[i]); + if (hasVal) { + taosArrayPush(pMTree->pIterList, &pIterList[i]); + tMergeTreeAddIter(pMTree, pIterList[i]); + } else { + tLDataIterClose(pIterList[i]); + } + } + + return code; + +_end: + tMergeTreeClose(pMTree); + return code; +} + +void tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter) { tRBTreePut(&pMTree->rbt, (SRBTreeNode *)pIter); } + +bool tMergeTreeNext(SMergeTree *pMTree) { + int32_t code = TSDB_CODE_SUCCESS; + if (pMTree->pIter) { + SLDataIter *pIter = pMTree->pIter; + + bool hasVal = tLDataIterNextRow(pIter); + if (!hasVal) { + pMTree->pIter = NULL; + } + + // compare with min in RB Tree + pIter = (SLDataIter *)tRBTreeMin(&pMTree->rbt); + if (pMTree->pIter && pIter) { + int32_t c = pMTree->rbt.cmprFn(RBTREE_NODE_PAYLOAD(&pMTree->pIter->node), RBTREE_NODE_PAYLOAD(&pIter->node)); + if (c > 0) { + tRBTreePut(&pMTree->rbt, (SRBTreeNode *)pMTree->pIter); + pMTree->pIter = NULL; + } else { + ASSERT(c); + } + } + } + + if (pMTree->pIter == NULL) { + pMTree->pIter = (SLDataIter *)tRBTreeMin(&pMTree->rbt); + if (pMTree->pIter) { + tRBTreeDrop(&pMTree->rbt, (SRBTreeNode *)pMTree->pIter); + } + } + + return pMTree->pIter != NULL; +} + +TSDBROW tMergeTreeGetRow(SMergeTree *pMTree) { return pMTree->pIter->rInfo.row; } + +void tMergeTreeClose(SMergeTree *pMTree) { + size_t size = taosArrayGetSize(pMTree->pIterList); + for (int32_t i = 0; i < size; ++i) { + SLDataIter *pIter = taosArrayGetP(pMTree->pIterList, i); + tLDataIterClose(pIter); + } + + pMTree->pIterList = taosArrayDestroy(pMTree->pIterList); + pMTree->pIter = NULL; +} diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 17f30b5194..1828f1e40e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -34,21 +34,20 @@ typedef struct { typedef struct { int32_t numOfBlocks; - int32_t numOfLastBlocks; + int32_t numOfLastFiles; } SBlockNumber; typedef struct STableBlockScanInfo { uint64_t uid; TSKEY lastKey; - SMapData mapData; // block info (compressed) - SArray* pBlockList; // block data index list - SIterInfo iter; // mem buffer skip list iterator - SIterInfo iiter; // imem buffer skip list iterator - SArray* delSkyline; // delete info for this table - int32_t fileDelIndex; // file block delete index - int32_t lastBlockDelIndex;// delete index for last block - bool iterInit; // whether to initialize the in-memory skip list iterator or not - int16_t indexInBlockL;// row position in last block + SMapData mapData; // block info (compressed) + SArray* pBlockList; // block data index list + SIterInfo iter; // mem buffer skip list iterator + SIterInfo iiter; // imem buffer skip list iterator + SArray* delSkyline; // delete info for this table + int32_t fileDelIndex; // file block delete index + int32_t lastBlockDelIndex; // delete index for last block + bool iterInit; // whether to initialize the in-memory skip list iterator or not } STableBlockScanInfo; typedef struct SBlockOrderWrapper { @@ -83,28 +82,20 @@ typedef struct SBlockLoadSuppInfo { char** buildBuf; // build string tmp buffer, todo remove it later after all string format being updated. } SBlockLoadSuppInfo; -typedef struct SVersionRange { - uint64_t minVer; - uint64_t maxVer; -} SVersionRange; - typedef struct SLastBlockReader { - SArray* pBlockL; - int32_t currentBlockIndex; - SBlockData lastBlockData; STimeWindow window; SVersionRange verRange; int32_t order; uint64_t uid; - int16_t* rowIndex; // row index ptr, usually from the STableBlockScanInfo->indexInBlockL + SMergeTree mergeTree; } SLastBlockReader; 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 numOfFiles; // number of total files + int32_t index; // current accessed index in the list + SArray* pFileList; // data file list int32_t order; - SLastBlockReader* pLastBlockReader; // last file block reader + SLastBlockReader* pLastBlockReader; // last file block reader } SFilesetIter; typedef struct SFileDataBlockInfo { @@ -116,9 +107,9 @@ typedef struct SFileDataBlockInfo { typedef struct SDataBlockIter { int32_t numOfBlocks; int32_t index; - SArray* blockList; // SArray + SArray* blockList; // SArray int32_t order; - SBlock block; // current SBlock data + SDataBlk block; // current SDataBlk data SHashObj* pTableMap; } SDataBlockIter; @@ -130,8 +121,8 @@ typedef struct SFileBlockDumpInfo { } SFileBlockDumpInfo; typedef struct SUidOrderCheckInfo { - uint64_t* tableUidList; // access table uid list in uid ascending order list - int32_t currentIndex; // index in table uid list + uint64_t* tableUidList; // access table uid list in uid ascending order list + int32_t currentIndex; // index in table uid list } SUidOrderCheckInfo; typedef struct SReaderStatus { @@ -139,9 +130,9 @@ typedef struct SReaderStatus { bool composedDataBlock; // the returned data block is a composed block or not SHashObj* pTableMap; // SHash STableBlockScanInfo* pTableIter; // table iterator used in building in-memory buffer data blocks. - SUidOrderCheckInfo uidCheckInfo; // check all table in uid order + SUidOrderCheckInfo uidCheckInfo; // check all table in uid order SFileBlockDumpInfo fBlockDumpInfo; - SDFileSet* pCurrentFileset; // current opened file set + SDFileSet* pCurrentFileset; // current opened file set SBlockData fileBlockData; SFilesetIter fileIter; SDataBlockIter blockIter; @@ -175,29 +166,31 @@ static int buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, i static TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pReader); static int32_t doMergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pScanInfo, STsdbReader* pReader, SRowMerger* pMerger); -static int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pScanInfo, int64_t ts, SRowMerger* pMerger); +static int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pScanInfo, int64_t ts, + SRowMerger* pMerger); static int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, int64_t ts, SArray* pDelList, SRowMerger* pMerger, STsdbReader* pReader); static int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow, uint64_t uid); static int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, SBlockData* pBlockData, - int32_t rowIndex); + int32_t rowIndex); static void setComposedBlockFlag(STsdbReader* pReader, bool composed); static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order); -static int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow, - STsdbReader* pReader, bool* freeTSRow); -static int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, - STSRow** pTSRow); -static int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, STsdbReader* pReader); +static int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, + STSRow** pTSRow, STsdbReader* pReader, bool* freeTSRow); +static int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, + STsdbReader* pReader, STSRow** pTSRow); +static int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, + STsdbReader* pReader); static int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, STbData* pMemTbData, STbData* piMemTbData); static STsdb* getTsdbByRetentions(SVnode* pVnode, TSKEY winSKey, SRetention* retentions, const char* idstr, int8_t* pLevel); static SVersionRange getQueryVerRange(SVnode* pVnode, SQueryTableDataCond* pCond, int8_t level); -static int64_t getCurrentKeyInLastBlock(SLastBlockReader* pLastBlockReader); -static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader); -static int32_t doBuildDataBlock(STsdbReader* pReader); +static int64_t getCurrentKeyInLastBlock(SLastBlockReader* pLastBlockReader); +static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader); +static int32_t doBuildDataBlock(STsdbReader* pReader); static int32_t setColumnIdSlotList(STsdbReader* pReader, SSDataBlock* pBlock) { SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo; @@ -234,7 +227,7 @@ static SHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, const STableK } for (int32_t j = 0; j < numOfTables; ++j) { - STableBlockScanInfo info = {.lastKey = 0, .uid = idList[j].uid, .indexInBlockL = INITIAL_ROW_INDEX_VAL}; + STableBlockScanInfo info = {.lastKey = 0, .uid = idList[j].uid}; if (ASCENDING_TRAVERSE(pTsdbReader->order)) { if (info.lastKey == INT64_MIN || info.lastKey < pTsdbReader->window.skey) { info.lastKey = pTsdbReader->window.skey; @@ -266,9 +259,7 @@ static void resetDataBlockScanInfo(SHashObj* pTableMap) { p->iter.iter = tsdbTbDataIterDestroy(p->iter.iter); } - p->fileDelIndex = -1; - p->delSkyline = taosArrayDestroy(p->delSkyline); - p->lastBlockDelIndex = INITIAL_ROW_INDEX_VAL; + p->delSkyline = taosArrayDestroy(p->delSkyline); } } @@ -330,7 +321,8 @@ static void limitOutputBufferSize(const SQueryTableDataCond* pCond, int32_t* cap } // init file iterator -static int32_t initFilesetIterator(SFilesetIter* pIter, SArray* aDFileSet, STsdbReader* pReader/*int32_t order, const char* idstr*/) { +static int32_t initFilesetIterator(SFilesetIter* pIter, SArray* aDFileSet, + STsdbReader* pReader /*int32_t order, const char* idstr*/) { size_t numOfFileset = taosArrayGetSize(aDFileSet); pIter->index = ASCENDING_TRAVERSE(pReader->order) ? -1 : numOfFileset; @@ -345,20 +337,16 @@ static int32_t initFilesetIterator(SFilesetIter* pIter, SArray* aDFileSet, STsdb tsdbError("failed to prepare the last block iterator, code:%d %s", tstrerror(code), pReader->idStr); return code; } - - SLastBlockReader* pLReader = pIter->pLastBlockReader; - pLReader->pBlockL = taosArrayInit(4, sizeof(SBlockL)); - pLReader->order = pReader->order; - pLReader->window = pReader->window; - pLReader->verRange = pReader->verRange; - pLReader->currentBlockIndex = -1; - - int32_t code = tBlockDataCreate(&pLReader->lastBlockData); - if (code != TSDB_CODE_SUCCESS) { - return code; - } } + SLastBlockReader* pLReader = pIter->pLastBlockReader; + pLReader->order = pReader->order; + pLReader->window = pReader->window; + pLReader->verRange = pReader->verRange; + + pLReader->uid = 0; + tMergeTreeClose(&pLReader->mergeTree); + tsdbDebug("init fileset iterator, total files:%d %s", pIter->numOfFiles, pReader->idStr); return TSDB_CODE_SUCCESS; } @@ -372,6 +360,9 @@ static bool filesetIteratorNext(SFilesetIter* pIter, STsdbReader* pReader) { return false; } + pIter->pLastBlockReader->uid = 0; + tMergeTreeClose(&pIter->pLastBlockReader->mergeTree); + // check file the time range of coverage STimeWindow win = {0}; @@ -580,14 +571,12 @@ static void cleanupTableScanInfo(SHashObj* pTableMap) { } // reset the index in last block when handing a new file - px->indexInBlockL = INITIAL_ROW_INDEX_VAL; tMapDataClear(&px->mapData); taosArrayClear(px->pBlockList); } } -static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SArray* pLastBlockIndex, - SBlockNumber * pBlockNum, SArray* pQualifiedLastBlock) { +static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SBlockNumber* pBlockNum) { int32_t numOfQTable = 0; size_t sizeInDisk = 0; size_t numOfTables = taosArrayGetSize(pIndexList); @@ -605,8 +594,8 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SArray* sizeInDisk += pScanInfo->mapData.nData; for (int32_t j = 0; j < pScanInfo->mapData.nItem; ++j) { - SBlock block = {0}; - tMapDataGetItemByIdx(&pScanInfo->mapData, j, &block, tGetBlock); + SDataBlk block = {0}; + tMapDataGetItemByIdx(&pScanInfo->mapData, j, &block, tGetDataBlk); // 1. time range check if (block.minKey.ts > pReader->window.ekey || block.maxKey.ts < pReader->window.skey) { @@ -632,36 +621,14 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SArray* } } - size_t numOfLast = taosArrayGetSize(pLastBlockIndex); - for(int32_t i = 0; i < numOfLast; ++i) { - SBlockL* pLastBlock = taosArrayGet(pLastBlockIndex, i); - if (pLastBlock->suid != pReader->suid) { - continue; - } - - { - // 1. time range check - if (pLastBlock->minKey > pReader->window.ekey || pLastBlock->maxKey < pReader->window.skey) { - continue; - } - - // 2. version range check - if (pLastBlock->minVer > pReader->verRange.maxVer || pLastBlock->maxVer < pReader->verRange.minVer) { - continue; - } - - pBlockNum->numOfLastBlocks += 1; - taosArrayPush(pQualifiedLastBlock, pLastBlock); - } - } - - int32_t total = pBlockNum->numOfLastBlocks + pBlockNum->numOfBlocks; + pBlockNum->numOfLastFiles = pReader->pFileReader->pSet->nSstF; + int32_t total = pBlockNum->numOfLastFiles + pBlockNum->numOfBlocks; double el = (taosGetTimestampUs() - st) / 1000.0; tsdbDebug( - "load block of %d tables completed, blocks:%d in %d tables, lastBlock:%d, block-info-size:%.2f Kb, elapsed " + "load block of %d tables completed, blocks:%d in %d tables, last-files:%d, block-info-size:%.2f Kb, elapsed " "time:%.2f ms %s", - numOfTables, pBlockNum->numOfBlocks, numOfQTable, pBlockNum->numOfLastBlocks, sizeInDisk / 1000.0, el, + numOfTables, pBlockNum->numOfBlocks, numOfQTable, pBlockNum->numOfLastFiles, sizeInDisk / 1000.0, el, pReader->idStr); pReader->cost.numOfBlocks += total; @@ -702,7 +669,7 @@ static SFileDataBlockInfo* getCurrentBlockInfo(SDataBlockIter* pBlockIter) { return pBlockInfo; } -static SBlock* getCurrentBlock(SDataBlockIter* pBlockIter) { return &pBlockIter->block; } +static SDataBlk* getCurrentBlock(SDataBlockIter* pBlockIter) { return &pBlockIter->block; } static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo) { SReaderStatus* pStatus = &pReader->status; @@ -710,7 +677,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn SBlockData* pBlockData = &pStatus->fileBlockData; SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(pBlockIter); - SBlock* pBlock = getCurrentBlock(pBlockIter); + SDataBlk* pBlock = getCurrentBlock(pBlockIter); SSDataBlock* pResBlock = pReader->pResBlock; int32_t numOfOutputCols = blockDataGetNumOfCols(pResBlock); @@ -795,8 +762,8 @@ static int32_t doLoadFileBlockData(STsdbReader* pReader, SDataBlockIter* pBlockI SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; ASSERT(pBlockInfo != NULL); - SBlock* pBlock = getCurrentBlock(pBlockIter); - int32_t code = tsdbReadDataBlock(pReader->pFileReader, pBlock, pBlockData); + SDataBlk* pBlock = getCurrentBlock(pBlockIter); + int32_t code = tsdbReadDataBlock(pReader->pFileReader, pBlock, pBlockData); if (code != TSDB_CODE_SUCCESS) { tsdbError("%p error occurs in loading file block, global index:%d, table index:%d, brange:%" PRId64 "-%" PRId64 ", rows:%d, code:%s %s", @@ -872,8 +839,8 @@ static int32_t doSetCurrentBlock(SDataBlockIter* pBlockIter) { SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(pBlockIter); if (pBlockInfo != NULL) { STableBlockScanInfo* pScanInfo = taosHashGet(pBlockIter->pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid)); - int32_t* mapDataIndex = taosArrayGet(pScanInfo->pBlockList, pBlockInfo->tbBlockIdx); - tMapDataGetItemByIdx(&pScanInfo->mapData, *mapDataIndex, &pBlockIter->block, tGetBlock); + int32_t* mapDataIndex = taosArrayGet(pScanInfo->pBlockList, pBlockInfo->tbBlockIdx); + tMapDataGetItemByIdx(&pScanInfo->mapData, *mapDataIndex, &pBlockIter->block, tGetDataBlk); } #if 0 @@ -924,12 +891,12 @@ static int32_t initBlockIterator(STsdbReader* pReader, SDataBlockIter* pBlockIte } sup.pDataBlockInfo[sup.numOfTables] = (SBlockOrderWrapper*)buf; - SBlock block = {0}; + SDataBlk block = {0}; for (int32_t k = 0; k < num; ++k) { SBlockOrderWrapper wrapper = {0}; int32_t* mapDataIndex = taosArrayGet(pTableScanInfo->pBlockList, k); - tMapDataGetItemByIdx(&pTableScanInfo->mapData, *mapDataIndex, &block, tGetBlock); + tMapDataGetItemByIdx(&pTableScanInfo->mapData, *mapDataIndex, &block, tGetDataBlk); wrapper.uid = pTableScanInfo->uid; wrapper.offset = block.aSubBlock[0].offset; @@ -990,8 +957,8 @@ static int32_t initBlockIterator(STsdbReader* pReader, SDataBlockIter* pBlockIte } int64_t et = taosGetTimestampUs(); - tsdbDebug("%p %d data blocks access order completed, elapsed time:%.2f ms %s", pReader, numOfBlocks, (et - st) / 1000.0, - pReader->idStr); + tsdbDebug("%p %d data blocks access order completed, elapsed time:%.2f ms %s", pReader, numOfBlocks, + (et - st) / 1000.0, pReader->idStr); cleanupBlockOrderSupporter(&sup); taosMemoryFree(pTree); @@ -1018,15 +985,15 @@ static bool blockIteratorNext(SDataBlockIter* pBlockIter) { /** * This is an two rectangles overlap cases. */ -static int32_t dataBlockPartiallyRequired(STimeWindow* pWindow, SVersionRange* pVerRange, SBlock* pBlock) { +static int32_t dataBlockPartiallyRequired(STimeWindow* pWindow, SVersionRange* pVerRange, SDataBlk* pBlock) { return (pWindow->ekey < pBlock->maxKey.ts && pWindow->ekey >= pBlock->minKey.ts) || (pWindow->skey > pBlock->minKey.ts && pWindow->skey <= pBlock->maxKey.ts) || (pVerRange->minVer > pBlock->minVer && pVerRange->minVer <= pBlock->maxVer) || (pVerRange->maxVer < pBlock->maxVer && pVerRange->maxVer >= pBlock->minVer); } -static SBlock* getNeighborBlockOfSameTable(SFileDataBlockInfo* pFBlockInfo, STableBlockScanInfo* pTableBlockScanInfo, - int32_t* nextIndex, int32_t order) { +static SDataBlk* getNeighborBlockOfSameTable(SFileDataBlockInfo* pFBlockInfo, STableBlockScanInfo* pTableBlockScanInfo, + int32_t* nextIndex, int32_t order) { bool asc = ASCENDING_TRAVERSE(order); if (asc && pFBlockInfo->tbBlockIdx >= taosArrayGetSize(pTableBlockScanInfo->pBlockList) - 1) { return NULL; @@ -1039,10 +1006,10 @@ static SBlock* getNeighborBlockOfSameTable(SFileDataBlockInfo* pFBlockInfo, STab int32_t step = asc ? 1 : -1; *nextIndex = pFBlockInfo->tbBlockIdx + step; - SBlock* pBlock = taosMemoryCalloc(1, sizeof(SBlock)); - int32_t* indexInMapdata = taosArrayGet(pTableBlockScanInfo->pBlockList, *nextIndex); + SDataBlk* pBlock = taosMemoryCalloc(1, sizeof(SDataBlk)); + int32_t* indexInMapdata = taosArrayGet(pTableBlockScanInfo->pBlockList, *nextIndex); - tMapDataGetItemByIdx(&pTableBlockScanInfo->mapData, *indexInMapdata, pBlock, tGetBlock); + tMapDataGetItemByIdx(&pTableBlockScanInfo->mapData, *indexInMapdata, pBlock, tGetDataBlk); return pBlock; } @@ -1085,7 +1052,7 @@ static int32_t setFileBlockActiveInBlockIter(SDataBlockIter* pBlockIter, int32_t return TSDB_CODE_SUCCESS; } -static bool overlapWithNeighborBlock(SBlock* pBlock, SBlock* pNeighbor, int32_t order) { +static bool overlapWithNeighborBlock(SDataBlk* pBlock, SDataBlk* pNeighbor, int32_t order) { // it is the last block in current file, no chance to overlap with neighbor blocks. if (ASCENDING_TRAVERSE(order)) { return pBlock->maxKey.ts == pNeighbor->minKey.ts; @@ -1094,19 +1061,19 @@ static bool overlapWithNeighborBlock(SBlock* pBlock, SBlock* pNeighbor, int32_t } } -static bool bufferDataInFileBlockGap(int32_t order, TSDBKEY key, SBlock* pBlock) { +static bool bufferDataInFileBlockGap(int32_t order, TSDBKEY key, SDataBlk* pBlock) { bool ascScan = ASCENDING_TRAVERSE(order); return (ascScan && (key.ts != TSKEY_INITIAL_VAL && key.ts <= pBlock->minKey.ts)) || (!ascScan && (key.ts != TSKEY_INITIAL_VAL && key.ts >= pBlock->maxKey.ts)); } -static bool keyOverlapFileBlock(TSDBKEY key, SBlock* pBlock, SVersionRange* pVerRange) { +static bool keyOverlapFileBlock(TSDBKEY key, SDataBlk* pBlock, SVersionRange* pVerRange) { return (key.ts >= pBlock->minKey.ts && key.ts <= pBlock->maxKey.ts) && (pBlock->maxVer >= pVerRange->minVer) && (pBlock->minVer <= pVerRange->maxVer); } -static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, const SBlock* pBlock) { +static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, const SDataBlk* pBlock) { size_t num = taosArrayGetSize(pBlockScanInfo->delSkyline); for (int32_t i = pBlockScanInfo->fileDelIndex; i < num; i += 1) { @@ -1140,7 +1107,7 @@ static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, cons return false; } -static bool overlapWithDelSkyline(STableBlockScanInfo* pBlockScanInfo, const SBlock* pBlock, int32_t order) { +static bool overlapWithDelSkyline(STableBlockScanInfo* pBlockScanInfo, const SDataBlk* pBlock, int32_t order) { if (pBlockScanInfo->delSkyline == NULL) { return false; } @@ -1175,10 +1142,10 @@ static bool overlapWithDelSkyline(STableBlockScanInfo* pBlockScanInfo, const SBl // 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, +static bool fileBlockShouldLoad(STsdbReader* pReader, SFileDataBlockInfo* pFBlock, SDataBlk* pBlock, STableBlockScanInfo* pScanInfo, TSDBKEY key, SLastBlockReader* pLastBlockReader) { - int32_t neighborIndex = 0; - SBlock* pNeighbor = getNeighborBlockOfSameTable(pFBlock, pScanInfo, &neighborIndex, pReader->order); + int32_t neighborIndex = 0; + SDataBlk* pNeighbor = getNeighborBlockOfSameTable(pFBlock, pScanInfo, &neighborIndex, pReader->order); // overlap with neighbor bool overlapWithNeighbor = false; @@ -1192,11 +1159,14 @@ static bool fileBlockShouldLoad(STsdbReader* pReader, SFileDataBlockInfo* pFBloc bool overlapWithDel = overlapWithDelSkyline(pScanInfo, pBlock, pReader->order); // todo here we need to each key in the last files to identify if it is really overlapped with last block + // todo bool overlapWithlastBlock = false; - if (taosArrayGetSize(pLastBlockReader->pBlockL) > 0 && (pLastBlockReader->currentBlockIndex != -1)) { - SBlockL *pBlockL = taosArrayGet(pLastBlockReader->pBlockL, pLastBlockReader->currentBlockIndex); - overlapWithlastBlock = !(pBlock->maxKey.ts < pBlockL->minKey || pBlock->minKey.ts > pBlockL->maxKey); +#if 0 + if (taosArrayGetSize(pLastBlockReader->pSstBlk) > 0 && (pLastBlockReader->currentBlockIndex != -1)) { + SSstBlk* pSstBlk = taosArrayGet(pLastBlockReader->pSstBlk, pLastBlockReader->currentBlockIndex); + overlapWithlastBlock = !(pBlock->maxKey.ts < pSstBlk->minKey || pBlock->minKey.ts > pSstBlk->maxKey); } +#endif bool moreThanOutputCapacity = pBlock->nRow > pReader->capacity; bool partiallyRequired = dataBlockPartiallyRequired(&pReader->window, &pReader->verRange, pBlock); @@ -1295,18 +1265,16 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; int64_t tsLast = INT64_MIN; - if ((pLastBlockReader->lastBlockData.nRow > 0) && hasDataInLastBlock(pLastBlockReader)) { + if (hasDataInLastBlock(pLastBlockReader)) { tsLast = getCurrentKeyInLastBlock(pLastBlockReader); } - TSDBKEY k = TSDBROW_KEY(pRow); - TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); - - SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; + TSDBKEY k = TSDBROW_KEY(pRow); + TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); int64_t minKey = 0; if (pReader->order == TSDB_ORDER_ASC) { - minKey = INT64_MAX; // chosen the minimum value + minKey = INT64_MAX; // chosen the minimum value if (minKey > tsLast && hasDataInLastBlock(pLastBlockReader)) { minKey = tsLast; } @@ -1336,7 +1304,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* bool init = false; // ASC: file block ---> last block -----> imem -----> mem - //DESC: mem -----> imem -----> last block -----> file block + // DESC: mem -----> imem -----> last block -----> file block if (pReader->order == TSDB_ORDER_ASC) { if (minKey == key) { init = true; @@ -1345,7 +1313,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* } if (minKey == tsLast) { - TSDBROW fRow1 = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); + TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree); if (init) { tRowMerge(&merge, &fRow1); } else { @@ -1374,7 +1342,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* } if (minKey == tsLast) { - TSDBROW fRow1 = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); + TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree); if (init) { tRowMerge(&merge, &fRow1); } else { @@ -1410,19 +1378,19 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader, STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, SBlockData* pBlockData, bool mergeBlockData) { - SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; + SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; + // SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; int64_t tsLastBlock = getCurrentKeyInLastBlock(pLastBlockReader); STSRow* pTSRow = NULL; SRowMerger merge = {0}; - TSDBROW fRow = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); - + TSDBROW fRow = tMergeTreeGetRow(&pLastBlockReader->mergeTree); tRowMergerInit(&merge, &fRow, pReader->pSchema); doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, tsLastBlock, &merge); // merge with block data if ts == key - if (mergeBlockData) { + if (mergeBlockData && (tsLastBlock == pBlockData->aTSKEY[pDumpInfo->rowIndex])) { doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); } @@ -1444,7 +1412,7 @@ static int32_t mergeFileBlockAndLastBlock(STsdbReader* pReader, SLastBlockReader if (pBlockData->nRow > 0) { // no last block available, only data block exists - if (pLastBlockReader->lastBlockData.nRow == 0 || (!hasDataInLastBlock(pLastBlockReader))) { + if (!hasDataInLastBlock(pLastBlockReader)) { return mergeRowsInFileBlocks(pBlockData, pBlockScanInfo, key, pReader); } @@ -1454,7 +1422,7 @@ static int32_t mergeFileBlockAndLastBlock(STsdbReader* pReader, SLastBlockReader ASSERT(ts >= key); if (ASCENDING_TRAVERSE(pReader->order)) { - if (key < ts) { // imem, mem are all empty, file blocks (data blocks and last block) exist + if (key < ts) { // imem, mem are all empty, file blocks (data blocks and last block) exist return mergeRowsInFileBlocks(pBlockData, pBlockScanInfo, key, pReader); } else if (key == ts) { STSRow* pTSRow = NULL; @@ -1498,7 +1466,6 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo* TSDBROW* piRow = getValidMemRow(&pBlockScanInfo->iiter, pDelList, pReader); ASSERT(pRow != NULL && piRow != NULL); - SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; int64_t tsLast = INT64_MIN; if (hasDataInLastBlock(pLastBlockReader)) { tsLast = getCurrentKeyInLastBlock(pLastBlockReader); @@ -1528,7 +1495,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo* minKey = tsLast; } } else { - minKey = INT64_MIN; // let find the maximum ts value + minKey = INT64_MIN; // let find the maximum ts value if (minKey < k.ts) { minKey = k.ts; } @@ -1559,7 +1526,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo* } if (minKey == tsLast) { - TSDBROW fRow1 = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); + TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree); if (init) { tRowMerge(&merge, &fRow1); } else { @@ -1609,7 +1576,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo* } if (minKey == tsLast) { - TSDBROW fRow1 = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); + TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree); if (init) { tRowMerge(&merge, &fRow1); } else { @@ -1787,6 +1754,70 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* } #endif +static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader) { + if (pBlockScanInfo->iterInit) { + return TSDB_CODE_SUCCESS; + } + + int32_t code = TSDB_CODE_SUCCESS; + + TSDBKEY startKey = {0}; + if (ASCENDING_TRAVERSE(pReader->order)) { + startKey = (TSDBKEY){.ts = pReader->window.skey, .version = pReader->verRange.minVer}; + } else { + startKey = (TSDBKEY){.ts = pReader->window.ekey, .version = pReader->verRange.maxVer}; + } + + int32_t backward = (!ASCENDING_TRAVERSE(pReader->order)); + + STbData* d = NULL; + if (pReader->pReadSnap->pMem != NULL) { + d = tsdbGetTbDataFromMemTable(pReader->pReadSnap->pMem, pReader->suid, pBlockScanInfo->uid); + if (d != NULL) { + code = tsdbTbDataIterCreate(d, &startKey, backward, &pBlockScanInfo->iter.iter); + if (code == TSDB_CODE_SUCCESS) { + pBlockScanInfo->iter.hasVal = (tsdbTbDataIterGet(pBlockScanInfo->iter.iter) != NULL); + + tsdbDebug("%p uid:%" PRId64 ", check data in mem from skey:%" PRId64 ", order:%d, ts range in buf:%" PRId64 + "-%" PRId64 " %s", + pReader, pBlockScanInfo->uid, startKey.ts, pReader->order, d->minKey, d->maxKey, pReader->idStr); + } else { + tsdbError("%p uid:%" PRId64 ", failed to create iterator for imem, code:%s, %s", pReader, pBlockScanInfo->uid, + tstrerror(code), pReader->idStr); + return code; + } + } + } else { + tsdbDebug("%p uid:%" PRId64 ", no data in mem, %s", pReader, pBlockScanInfo->uid, pReader->idStr); + } + + STbData* di = NULL; + if (pReader->pReadSnap->pIMem != NULL) { + di = tsdbGetTbDataFromMemTable(pReader->pReadSnap->pIMem, pReader->suid, pBlockScanInfo->uid); + if (di != NULL) { + code = tsdbTbDataIterCreate(di, &startKey, backward, &pBlockScanInfo->iiter.iter); + if (code == TSDB_CODE_SUCCESS) { + pBlockScanInfo->iiter.hasVal = (tsdbTbDataIterGet(pBlockScanInfo->iiter.iter) != NULL); + + tsdbDebug("%p uid:%" PRId64 ", check data in imem from skey:%" PRId64 ", order:%d, ts range in buf:%" PRId64 + "-%" PRId64 " %s", + pReader, pBlockScanInfo->uid, startKey.ts, pReader->order, di->minKey, di->maxKey, pReader->idStr); + } else { + tsdbError("%p uid:%" PRId64 ", failed to create iterator for mem, code:%s, %s", pReader, pBlockScanInfo->uid, + tstrerror(code), pReader->idStr); + return code; + } + } + } else { + tsdbDebug("%p uid:%" PRId64 ", no data in imem, %s", pReader, pBlockScanInfo->uid, pReader->idStr); + } + + initDelSkylineIterator(pBlockScanInfo, pReader, d, di); + + pBlockScanInfo->iterInit = true; + return TSDB_CODE_SUCCESS; +} + static bool isValidFileBlockRow(SBlockData* pBlockData, SFileBlockDumpInfo* pDumpInfo, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader) { // it is an multi-table data block @@ -1818,34 +1849,25 @@ static bool isValidFileBlockRow(SBlockData* pBlockData, SFileBlockDumpInfo* pDum static bool outOfTimeWindow(int64_t ts, STimeWindow* pWindow) { return (ts > pWindow->ekey) || (ts < pWindow->skey); } -static void initLastBlockReader(SLastBlockReader* pLastBlockReader, uint64_t uid, int16_t* startPos) { - pLastBlockReader->uid = uid; - pLastBlockReader->rowIndex = startPos; +static bool nextRowFromLastBlocks(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pBlockScanInfo) { + while(1) { + bool hasVal = tMergeTreeNext(&pLastBlockReader->mergeTree); + if (!hasVal) { + return false; + } - if (*startPos == -1) { - if (ASCENDING_TRAVERSE(pLastBlockReader->order)) { - // do nothing - } else { - *startPos = pLastBlockReader->lastBlockData.nRow; + TSDBROW row = tMergeTreeGetRow(&pLastBlockReader->mergeTree); + TSDBKEY k = TSDBROW_KEY(&row); + if (!hasBeenDropped(pBlockScanInfo->delSkyline, &pBlockScanInfo->lastBlockDelIndex, &k, pLastBlockReader->order)) { + return true; } } -} - -static void setAllRowsChecked(SLastBlockReader *pLastBlockReader) { - *pLastBlockReader->rowIndex = ALL_ROWS_CHECKED_INDEX; -} - -static bool nextRowInLastBlock(SLastBlockReader *pLastBlockReader, STableBlockScanInfo* pBlockScanInfo) { - bool asc = ASCENDING_TRAVERSE(pLastBlockReader->order); - int32_t step = (asc) ? 1 : -1; - if (*pLastBlockReader->rowIndex == ALL_ROWS_CHECKED_INDEX) { - return false; - } +#if 0 *(pLastBlockReader->rowIndex) += step; SBlockData* pBlockData = &pLastBlockReader->lastBlockData; - for(int32_t i = *(pLastBlockReader->rowIndex); i < pBlockData->nRow && i >= 0; i += step) { + for (int32_t i = *(pLastBlockReader->rowIndex); i < pBlockData->nRow && i >= 0; i += step) { if (pBlockData->aUid != NULL) { if (asc) { if (pBlockData->aUid[i] < pLastBlockReader->uid) { @@ -1894,23 +1916,42 @@ static bool nextRowInLastBlock(SLastBlockReader *pLastBlockReader, STableBlockSc // set all data is consumed in last block setAllRowsChecked(pLastBlockReader); return false; +#endif } -static int64_t getCurrentKeyInLastBlock(SLastBlockReader* pLastBlockReader) { - SBlockData* pBlockData = &pLastBlockReader->lastBlockData; - return pBlockData->aTSKEY[*pLastBlockReader->rowIndex]; -} +static bool initLastBlockReader(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pBlockScanInfo, + STsdbReader* pReader) { + // the last block reader has been initialized for this table. + if (pLastBlockReader->uid == pBlockScanInfo->uid) { + return true; + } -static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { - if (*pLastBlockReader->rowIndex == ALL_ROWS_CHECKED_INDEX) { + if (pLastBlockReader->uid != 0) { + tMergeTreeClose(&pLastBlockReader->mergeTree); + } + + initMemDataIterator(pBlockScanInfo, pReader); + pLastBlockReader->uid = pBlockScanInfo->uid; + int32_t code = + tMergeTreeOpen(&pLastBlockReader->mergeTree, (pLastBlockReader->order == TSDB_ORDER_DESC), pReader->pFileReader, + pBlockScanInfo->uid, &pLastBlockReader->window, &pLastBlockReader->verRange); + if (code != TSDB_CODE_SUCCESS) { return false; } - ASSERT(pLastBlockReader->lastBlockData.nRow > 0); - return true; + return nextRowFromLastBlocks(pLastBlockReader, pBlockScanInfo); } -int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, STsdbReader* pReader) { +static int64_t getCurrentKeyInLastBlock(SLastBlockReader* pLastBlockReader) { + TSDBROW row = tMergeTreeGetRow(&pLastBlockReader->mergeTree); + TSDBKEY key = TSDBROW_KEY(&row); + return key.ts; +} + +static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { return pLastBlockReader->mergeTree.pIter != NULL; } + +int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, + STsdbReader* pReader) { SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); @@ -1942,7 +1983,7 @@ static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanI SBlockData* pBlockData, SLastBlockReader* pLastBlockReader) { SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; - int64_t key = (pBlockData->nRow > 0)? pBlockData->aTSKEY[pDumpInfo->rowIndex]:INT64_MIN; + int64_t key = (pBlockData->nRow > 0) ? pBlockData->aTSKEY[pDumpInfo->rowIndex] : INT64_MIN; TSDBROW* pRow = getValidMemRow(&pBlockScanInfo->iter, pBlockScanInfo->delSkyline, pReader); TSDBROW* piRow = getValidMemRow(&pBlockScanInfo->iiter, pBlockScanInfo->delSkyline, pReader); @@ -1967,7 +2008,7 @@ static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanI static int32_t buildComposedDataBlock(STsdbReader* pReader) { SSDataBlock* pResBlock = pReader->pResBlock; - SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pReader->status.blockIter); + SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pReader->status.blockIter); STableBlockScanInfo* pBlockScanInfo = NULL; if (pBlockInfo != NULL) { @@ -1995,7 +2036,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) { pDumpInfo->rowIndex += step; - SBlock* pBlock = getCurrentBlock(&pReader->status.blockIter); + SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter); if (pDumpInfo->rowIndex >= pBlock->nRow || pDumpInfo->rowIndex < 0) { setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order); break; @@ -2014,7 +2055,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) { // currently loaded file data block is consumed if ((pBlockData->nRow > 0) && (pDumpInfo->rowIndex >= pBlockData->nRow || pDumpInfo->rowIndex < 0)) { - SBlock* pBlock = getCurrentBlock(&pReader->status.blockIter); + SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter); setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order); break; } @@ -2042,70 +2083,6 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) { void setComposedBlockFlag(STsdbReader* pReader, bool composed) { pReader->status.composedDataBlock = composed; } -static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader) { - if (pBlockScanInfo->iterInit) { - return TSDB_CODE_SUCCESS; - } - - int32_t code = TSDB_CODE_SUCCESS; - - TSDBKEY startKey = {0}; - if (ASCENDING_TRAVERSE(pReader->order)) { - startKey = (TSDBKEY){.ts = pReader->window.skey, .version = pReader->verRange.minVer}; - } else { - startKey = (TSDBKEY){.ts = pReader->window.ekey, .version = pReader->verRange.maxVer}; - } - - int32_t backward = (!ASCENDING_TRAVERSE(pReader->order)); - - STbData* d = NULL; - if (pReader->pReadSnap->pMem != NULL) { - d = tsdbGetTbDataFromMemTable(pReader->pReadSnap->pMem, pReader->suid, pBlockScanInfo->uid); - if (d != NULL) { - code = tsdbTbDataIterCreate(d, &startKey, backward, &pBlockScanInfo->iter.iter); - if (code == TSDB_CODE_SUCCESS) { - pBlockScanInfo->iter.hasVal = (tsdbTbDataIterGet(pBlockScanInfo->iter.iter) != NULL); - - tsdbDebug("%p uid:%" PRId64 ", check data in mem from skey:%" PRId64 ", order:%d, ts range in buf:%" PRId64 - "-%" PRId64 " %s", - pReader, pBlockScanInfo->uid, startKey.ts, pReader->order, d->minKey, d->maxKey, pReader->idStr); - } else { - tsdbError("%p uid:%" PRId64 ", failed to create iterator for imem, code:%s, %s", pReader, pBlockScanInfo->uid, - tstrerror(code), pReader->idStr); - return code; - } - } - } else { - tsdbDebug("%p uid:%" PRId64 ", no data in mem, %s", pReader, pBlockScanInfo->uid, pReader->idStr); - } - - STbData* di = NULL; - if (pReader->pReadSnap->pIMem != NULL) { - di = tsdbGetTbDataFromMemTable(pReader->pReadSnap->pIMem, pReader->suid, pBlockScanInfo->uid); - if (di != NULL) { - code = tsdbTbDataIterCreate(di, &startKey, backward, &pBlockScanInfo->iiter.iter); - if (code == TSDB_CODE_SUCCESS) { - pBlockScanInfo->iiter.hasVal = (tsdbTbDataIterGet(pBlockScanInfo->iiter.iter) != NULL); - - tsdbDebug("%p uid:%" PRId64 ", check data in imem from skey:%" PRId64 ", order:%d, ts range in buf:%" PRId64 - "-%" PRId64 " %s", - pReader, pBlockScanInfo->uid, startKey.ts, pReader->order, di->minKey, di->maxKey, pReader->idStr); - } else { - tsdbError("%p uid:%" PRId64 ", failed to create iterator for mem, code:%s, %s", pReader, pBlockScanInfo->uid, - tstrerror(code), pReader->idStr); - return code; - } - } - } else { - tsdbDebug("%p uid:%" PRId64 ", no data in imem, %s", pReader, pBlockScanInfo->uid, pReader->idStr); - } - - initDelSkylineIterator(pBlockScanInfo, pReader, d, di); - - pBlockScanInfo->iterInit = true; - return TSDB_CODE_SUCCESS; -} - int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, STbData* pMemTbData, STbData* piMemTbData) { if (pBlockScanInfo->delSkyline != NULL) { @@ -2190,8 +2167,6 @@ _err: static TSDBKEY getCurrentKeyInBuf(STableBlockScanInfo* pScanInfo, STsdbReader* pReader) { TSDBKEY key = {.ts = TSKEY_INITIAL_VAL}; - - initMemDataIterator(pScanInfo, pReader); TSDBROW* pRow = getValidMemRow(&pScanInfo->iter, pScanInfo->delSkyline, pReader); if (pRow != NULL) { key = TSDBROW_KEY(pRow); @@ -2211,12 +2186,10 @@ static TSDBKEY getCurrentKeyInBuf(STableBlockScanInfo* pScanInfo, STsdbReader* p static int32_t moveToNextFile(STsdbReader* pReader, SBlockNumber* pBlockNum) { SReaderStatus* pStatus = &pReader->status; pBlockNum->numOfBlocks = 0; - pBlockNum->numOfLastBlocks = 0; + pBlockNum->numOfLastFiles = 0; size_t numOfTables = taosHashGetSize(pReader->status.pTableMap); SArray* pIndexList = taosArrayInit(numOfTables, sizeof(SBlockIdx)); - SArray* pLastBlocks = pStatus->fileIter.pLastBlockReader->pBlockL; - taosArrayClear(pLastBlocks); while (1) { bool hasNext = filesetIteratorNext(&pStatus->fileIter, pReader); @@ -2231,32 +2204,16 @@ static int32_t moveToNextFile(STsdbReader* pReader, SBlockNumber* pBlockNum) { return code; } - code = tsdbReadBlockL(pReader->pFileReader, pLastBlocks); - if (code != TSDB_CODE_SUCCESS) { - taosArrayDestroy(pIndexList); - return code; - } - - if (taosArrayGetSize(pIndexList) > 0 || taosArrayGetSize(pLastBlocks) > 0) { - SArray* pQLastBlock = taosArrayInit(4, sizeof(SBlockL)); - - code = doLoadFileBlock(pReader, pIndexList, pLastBlocks, pBlockNum, pQLastBlock); + if (taosArrayGetSize(pIndexList) > 0 || pReader->pFileReader->pSet->nSstF > 0) { + code = doLoadFileBlock(pReader, pIndexList, pBlockNum); if (code != TSDB_CODE_SUCCESS) { taosArrayDestroy(pIndexList); - taosArrayDestroy(pQLastBlock); return code; } - if (pBlockNum->numOfBlocks + pBlockNum->numOfLastBlocks > 0) { - ASSERT(taosArrayGetSize(pQLastBlock) == pBlockNum->numOfLastBlocks); - taosArrayClear(pLastBlocks); - taosArrayAddAll(pLastBlocks, pQLastBlock); - - taosArrayDestroy(pQLastBlock); + if (pBlockNum->numOfBlocks + pBlockNum->numOfLastFiles > 0) { break; } - - taosArrayDestroy(pQLastBlock); } // no blocks in current file, try next files @@ -2266,81 +2223,22 @@ static int32_t moveToNextFile(STsdbReader* pReader, SBlockNumber* pBlockNum) { return TSDB_CODE_SUCCESS; } -static int32_t doLoadRelatedLastBlock(SLastBlockReader* pLastBlockReader, STableBlockScanInfo *pBlockScanInfo, STsdbReader* pReader) { - SArray* pBlocks = pLastBlockReader->pBlockL; - SBlockL* pBlock = NULL; - - uint64_t uid = pBlockScanInfo->uid; - int32_t totalLastBlocks = (int32_t)taosArrayGetSize(pBlocks); - - initMemDataIterator(pBlockScanInfo, pReader); - - // find the correct SBlockL. todo binary search - int32_t index = -1; - for (int32_t i = 0; i < totalLastBlocks; ++i) { - SBlockL* p = taosArrayGet(pBlocks, i); - if (p->minUid <= uid && p->maxUid >= uid) { - index = i; - pBlock = p; - break; - } - } - - if (index == -1) { - pLastBlockReader->currentBlockIndex = index; - tBlockDataReset(&pLastBlockReader->lastBlockData); - return TSDB_CODE_SUCCESS; - } - - // the required last datablock has already loaded - if (index == pLastBlockReader->currentBlockIndex) { - return TSDB_CODE_SUCCESS; - } - - int64_t st = taosGetTimestampUs(); - int32_t code = tBlockDataInit(&pLastBlockReader->lastBlockData, pReader->suid, pReader->suid ? 0 : uid, pReader->pSchema); - if (code != TSDB_CODE_SUCCESS) { - tsdbError("%p init block data failed, code:%s %s", pReader, tstrerror(code), pReader->idStr); - return code; - } - - code = tsdbReadLastBlock(pReader->pFileReader, pBlock, &pLastBlockReader->lastBlockData); - - double el = (taosGetTimestampUs() - st) / 1000.0; - if (code != TSDB_CODE_SUCCESS) { - tsdbError("%p error occurs in loading last block into buffer, last block index:%d, total:%d code:%s %s", pReader, - pLastBlockReader->currentBlockIndex, totalLastBlocks, tstrerror(code), pReader->idStr); - } else { - tsdbDebug("%p load last block completed, uid:%" PRIu64 - " last block index:%d, total:%d rows:%d, minVer:%d, maxVer:%d, brange:%" PRId64 "-%" PRId64 - " elapsed time:%.2f ms, %s", - pReader, uid, index, totalLastBlocks, pBlock->nRow, pBlock->minVer, pBlock->maxVer, pBlock->minKey, - pBlock->maxKey, el, pReader->idStr); - } - - pLastBlockReader->currentBlockIndex = index; - pReader->cost.lastBlockLoad += 1; - pReader->cost.lastBlockLoadTime += el; - - return TSDB_CODE_SUCCESS; -} - static int32_t uidComparFunc(const void* p1, const void* p2) { - uint64_t pu1 = *(uint64_t*) p1; - uint64_t pu2 = *(uint64_t*) p2; + uint64_t pu1 = *(uint64_t*)p1; + uint64_t pu2 = *(uint64_t*)p2; if (pu1 == pu2) { return 0; } else { - return (pu1 < pu2)? -1:1; + return (pu1 < pu2) ? -1 : 1; } } -static void extractOrderedTableUidList(SUidOrderCheckInfo *pOrderCheckInfo, SReaderStatus* pStatus) { +static void extractOrderedTableUidList(SUidOrderCheckInfo* pOrderCheckInfo, SReaderStatus* pStatus) { int32_t index = 0; int32_t total = taosHashGetSize(pStatus->pTableMap); void* p = taosHashIterate(pStatus->pTableMap, NULL); - while(p != NULL) { + while (p != NULL) { STableBlockScanInfo* pScanInfo = p; pOrderCheckInfo->tableUidList[index++] = pScanInfo->uid; p = taosHashIterate(pStatus->pTableMap, p); @@ -2350,9 +2248,12 @@ static void extractOrderedTableUidList(SUidOrderCheckInfo *pOrderCheckInfo, SRea } static int32_t initOrderCheckInfo(SUidOrderCheckInfo* pOrderCheckInfo, SReaderStatus* pStatus) { - if (pOrderCheckInfo->tableUidList == NULL) { - int32_t total = taosHashGetSize(pStatus->pTableMap); + int32_t total = taosHashGetSize(pStatus->pTableMap); + if (total == 0) { + return TSDB_CODE_SUCCESS; + } + if (pOrderCheckInfo->tableUidList == NULL) { pOrderCheckInfo->currentIndex = 0; pOrderCheckInfo->tableUidList = taosMemoryMalloc(total * sizeof(uint64_t)); if (pOrderCheckInfo->tableUidList == NULL) { @@ -2360,20 +2261,17 @@ static int32_t initOrderCheckInfo(SUidOrderCheckInfo* pOrderCheckInfo, SReaderSt } extractOrderedTableUidList(pOrderCheckInfo, pStatus); - uint64_t uid = pOrderCheckInfo->tableUidList[0]; pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); } else { if (pStatus->pTableIter == NULL) { // it is the last block of a new file -// ASSERT(pOrderCheckInfo->currentIndex == taosHashGetSize(pStatus->pTableMap)); - pOrderCheckInfo->currentIndex = 0; uint64_t uid = pOrderCheckInfo->tableUidList[pOrderCheckInfo->currentIndex]; pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); // the tableMap has already updated if (pStatus->pTableIter == NULL) { - void* p = taosMemoryRealloc(pOrderCheckInfo->tableUidList, taosHashGetSize(pStatus->pTableMap)*sizeof(uint64_t)); + void* p = taosMemoryRealloc(pOrderCheckInfo->tableUidList, total * sizeof(uint64_t)); if (p == NULL) { return TSDB_CODE_OUT_OF_MEMORY; } @@ -2390,7 +2288,7 @@ static int32_t initOrderCheckInfo(SUidOrderCheckInfo* pOrderCheckInfo, SReaderSt return TSDB_CODE_SUCCESS; } -static bool moveToNextTable(SUidOrderCheckInfo *pOrderedCheckInfo, SReaderStatus* pStatus) { +static bool moveToNextTable(SUidOrderCheckInfo* pOrderedCheckInfo, SReaderStatus* pStatus) { pOrderedCheckInfo->currentIndex += 1; if (pOrderedCheckInfo->currentIndex >= taosHashGetSize(pStatus->pTableMap)) { pStatus->pTableIter = NULL; @@ -2404,38 +2302,20 @@ static bool moveToNextTable(SUidOrderCheckInfo *pOrderedCheckInfo, SReaderStatus } static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) { - SReaderStatus* pStatus = &pReader->status; + SReaderStatus* pStatus = &pReader->status; SLastBlockReader* pLastBlockReader = pStatus->fileIter.pLastBlockReader; - SUidOrderCheckInfo *pOrderedCheckInfo = &pStatus->uidCheckInfo; - int32_t code = initOrderCheckInfo(pOrderedCheckInfo, pStatus); + SUidOrderCheckInfo* pOrderedCheckInfo = &pStatus->uidCheckInfo; + int32_t code = initOrderCheckInfo(pOrderedCheckInfo, pStatus); if (code != TSDB_CODE_SUCCESS || (taosHashGetSize(pStatus->pTableMap) == 0)) { return code; } - while(1) { + while (1) { // load the last data block of current table STableBlockScanInfo* pScanInfo = pStatus->pTableIter; - code = doLoadRelatedLastBlock(pLastBlockReader, pScanInfo, pReader); - if (code != TSDB_CODE_SUCCESS) { - return code; - } - - if (pLastBlockReader->currentBlockIndex != -1) { - initLastBlockReader(pLastBlockReader, pScanInfo->uid, &pScanInfo->indexInBlockL); - int32_t index = pScanInfo->indexInBlockL; - - if (index == INITIAL_ROW_INDEX_VAL || index == pLastBlockReader->lastBlockData.nRow) { - bool hasData = nextRowInLastBlock(pLastBlockReader, pScanInfo); - if (!hasData) { // current table does not have rows in last block, try next table - bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus); - if (!hasNexTable) { - return TSDB_CODE_SUCCESS; - } - continue; - } - } - } else { // no data in last block, try next table + bool hasVal = initLastBlockReader(pLastBlockReader, pScanInfo, pReader); + if (!hasVal) { bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus); if (!hasNexTable) { return TSDB_CODE_SUCCESS; @@ -2461,9 +2341,8 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) { } static int32_t doBuildDataBlock(STsdbReader* pReader) { - TSDBKEY key = {0}; - int32_t code = TSDB_CODE_SUCCESS; - SBlock* pBlock = NULL; + int32_t code = TSDB_CODE_SUCCESS; + SDataBlk* pBlock = NULL; SReaderStatus* pStatus = &pReader->status; SDataBlockIter* pBlockIter = &pStatus->blockIter; @@ -2481,21 +2360,8 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) { pBlock = getCurrentBlock(pBlockIter); } - { - key = getCurrentKeyInBuf(pScanInfo, pReader); - - // load the last data block of current table - code = doLoadRelatedLastBlock(pLastBlockReader, pScanInfo, pReader); - if (code != TSDB_CODE_SUCCESS) { - return code; - } - - // note: the lastblock may be null here - initLastBlockReader(pLastBlockReader, pScanInfo->uid, &pScanInfo->indexInBlockL); - if (pScanInfo->indexInBlockL == INITIAL_ROW_INDEX_VAL || pScanInfo->indexInBlockL == pLastBlockReader->lastBlockData.nRow) { - bool hasData = nextRowInLastBlock(pLastBlockReader, pScanInfo); - } - } + initLastBlockReader(pLastBlockReader, pScanInfo, pReader); + TSDBKEY key = getCurrentKeyInBuf(pScanInfo, pReader); if (pBlockInfo == NULL) { // build data block from last data file ASSERT(pBlockIter->numOfBlocks == 0); @@ -2523,11 +2389,11 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) { if (hasDataInLastBlock(pLastBlockReader) && !ASCENDING_TRAVERSE(pReader->order)) { // only return the rows in last block int64_t tsLast = getCurrentKeyInLastBlock(pLastBlockReader); - ASSERT (tsLast >= pBlock->maxKey.ts); + ASSERT(tsLast >= pBlock->maxKey.ts); tBlockDataReset(&pReader->status.fileBlockData); code = buildComposedDataBlock(pReader); - } else { // whole block is required, return it directly + } else { // whole block is required, return it directly SDataBlockInfo* pInfo = &pReader->pResBlock->info; pInfo->rows = pBlock->nRow; pInfo->uid = pScanInfo->uid; @@ -2574,7 +2440,7 @@ static int32_t buildBlockFromBufferSequentially(STsdbReader* pReader) { // set the correct start position in case of the first/last file block, according to the query time window static void initBlockDumpInfo(STsdbReader* pReader, SDataBlockIter* pBlockIter) { - SBlock* pBlock = getCurrentBlock(pBlockIter); + SDataBlk* pBlock = getCurrentBlock(pBlockIter); SReaderStatus* pStatus = &pReader->status; @@ -2594,7 +2460,7 @@ static int32_t initForFirstBlockInFile(STsdbReader* pReader, SDataBlockIter* pBl } // all data files are consumed, try data in buffer - if (num.numOfBlocks + num.numOfLastBlocks == 0) { + if (num.numOfBlocks + num.numOfLastFiles == 0) { pReader->status.loadFromFile = false; return code; } @@ -2602,14 +2468,11 @@ static int32_t initForFirstBlockInFile(STsdbReader* pReader, SDataBlockIter* pBl // initialize the block iterator for a new fileset if (num.numOfBlocks > 0) { code = initBlockIterator(pReader, pBlockIter, num.numOfBlocks); - } else { // no block data, only last block exists + } else { // no block data, only last block exists tBlockDataReset(&pReader->status.fileBlockData); resetDataBlockIterator(pBlockIter, pReader->order); } - SLastBlockReader* pLReader = pReader->status.fileIter.pLastBlockReader; - pLReader->currentBlockIndex = -1; - // set the correct start position according to the query time window initBlockDumpInfo(pReader, pBlockIter); return code; @@ -2627,7 +2490,7 @@ static int32_t buildBlockFromFiles(STsdbReader* pReader) { SDataBlockIter* pBlockIter = &pReader->status.blockIter; if (pBlockIter->numOfBlocks == 0) { - _begin: + _begin: code = doLoadLastBlockSequentially(pReader); if (code != TSDB_CODE_SUCCESS) { return code; @@ -2674,7 +2537,8 @@ static int32_t buildBlockFromFiles(STsdbReader* pReader) { bool hasNext = blockIteratorNext(&pReader->status.blockIter); if (hasNext) { // check for the next block in the block accessed order list initBlockDumpInfo(pReader, pBlockIter); - } else if (taosArrayGetSize(pReader->status.fileIter.pLastBlockReader->pBlockL) > 0) { // data blocks in current file are exhausted, let's try the next file now + } else if (hasDataInLastBlock(pReader->status.fileIter.pLastBlockReader)) { + // data blocks in current file are exhausted, let's try the next file now tBlockDataReset(&pReader->status.fileBlockData); resetDataBlockIterator(pBlockIter, pReader->order); goto _begin; @@ -2947,7 +2811,7 @@ typedef enum { CHECK_FILEBLOCK_QUIT = 0x2, } CHECK_FILEBLOCK_STATE; -static int32_t checkForNeighborFileBlock(STsdbReader* pReader, STableBlockScanInfo* pScanInfo, SBlock* pBlock, +static int32_t checkForNeighborFileBlock(STsdbReader* pReader, STableBlockScanInfo* pScanInfo, SDataBlk* pBlock, SFileDataBlockInfo* pFBlock, SRowMerger* pMerger, int64_t key, CHECK_FILEBLOCK_STATE* state) { SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; @@ -2956,8 +2820,8 @@ static int32_t checkForNeighborFileBlock(STsdbReader* pReader, STableBlockScanIn *state = CHECK_FILEBLOCK_QUIT; int32_t step = ASCENDING_TRAVERSE(pReader->order) ? 1 : -1; - int32_t nextIndex = -1; - SBlock* pNeighborBlock = getNeighborBlockOfSameTable(pFBlock, pScanInfo, &nextIndex, pReader->order); + int32_t nextIndex = -1; + SDataBlk* pNeighborBlock = getNeighborBlockOfSameTable(pFBlock, pScanInfo, &nextIndex, pReader->order); if (pNeighborBlock == NULL) { // do nothing return 0; } @@ -3021,7 +2885,7 @@ int32_t doMergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pSc CHECK_FILEBLOCK_STATE st; SFileDataBlockInfo* pFileBlockInfo = getCurrentBlockInfo(&pReader->status.blockIter); - SBlock* pCurrentBlock = getCurrentBlock(&pReader->status.blockIter); + SDataBlk* pCurrentBlock = getCurrentBlock(&pReader->status.blockIter); checkForNeighborFileBlock(pReader, pScanInfo, pCurrentBlock, pFileBlockInfo, pMerger, key, &st); if (st == CHECK_FILEBLOCK_QUIT) { break; @@ -3032,11 +2896,12 @@ int32_t doMergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pSc return TSDB_CODE_SUCCESS; } -int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pScanInfo, int64_t ts, SRowMerger* pMerger) { - while(nextRowInLastBlock(pLastBlockReader, pScanInfo)) { +int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pScanInfo, int64_t ts, + SRowMerger* pMerger) { + while (nextRowFromLastBlocks(pLastBlockReader, pScanInfo)) { int64_t next1 = getCurrentKeyInLastBlock(pLastBlockReader); if (next1 == ts) { - TSDBROW fRow1 = tsdbRowFromBlockData(&pLastBlockReader->lastBlockData, *pLastBlockReader->rowIndex); + TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree); tRowMerge(pMerger, &fRow1); } else { break; @@ -3100,7 +2965,7 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, } int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, - STSRow** pTSRow) { + STSRow** pTSRow) { SRowMerger merge = {0}; TSDBKEY k = TSDBROW_KEY(pRow); @@ -3174,7 +3039,8 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR } if (pBlockScanInfo->iter.hasVal && pRow != NULL) { - return doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow); + return doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, + freeTSRow); } if (pBlockScanInfo->iiter.hasVal && piRow != NULL) { @@ -3228,7 +3094,8 @@ int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* return TSDB_CODE_SUCCESS; } -int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, SBlockData* pBlockData, int32_t rowIndex) { +int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, SBlockData* pBlockData, + int32_t rowIndex) { int32_t i = 0, j = 0; int32_t outputRowIndex = pResBlock->info.rows; @@ -3305,7 +3172,7 @@ int32_t tsdbSetTableId(STsdbReader* pReader, int64_t uid) { ASSERT(pReader != NULL); taosHashClear(pReader->status.pTableMap); - STableBlockScanInfo info = {.lastKey = 0, .uid = uid, .indexInBlockL = INITIAL_ROW_INDEX_VAL}; + STableBlockScanInfo info = {.lastKey = 0, .uid = uid}; taosHashPut(pReader->status.pTableMap, &info.uid, sizeof(uint64_t), &info, sizeof(info)); return TDB_CODE_SUCCESS; } @@ -3326,7 +3193,6 @@ void* tsdbGetIvtIdx(SMeta* pMeta) { uint64_t getReaderMaxVersion(STsdbReader* pReader) { return pReader->verRange.maxVer; } - // ====================================== EXPOSED APIs ====================================== int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTableList, STsdbReader** ppReader, const char* idstr) { @@ -3376,10 +3242,10 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl } if (pCond->suid != 0) { - pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, pCond->schemaVersion); + pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, pCond->endVersion); } else if (taosArrayGetSize(pTableList) > 0) { STableKeyInfo* pKey = taosArrayGet(pTableList, 0); - pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, pCond->schemaVersion); + pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, pCond->endVersion); } int32_t numOfTables = taosArrayGetSize(pTableList); @@ -3449,7 +3315,6 @@ void tsdbReaderClose(STsdbReader* pReader) { } SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo; - tsdbUntakeReadSnap(pReader->pTsdb, pReader->pReadSnap); taosMemoryFreeClear(pSupInfo->plist); taosMemoryFree(pSupInfo->colIds); @@ -3460,6 +3325,7 @@ void tsdbReaderClose(STsdbReader* pReader) { taosMemoryFreeClear(pSupInfo->buildBuf[i]); } } + taosMemoryFree(pSupInfo->buildBuf); tBlockDataDestroy(&pReader->status.fileBlockData, true); @@ -3473,12 +3339,13 @@ void tsdbReaderClose(STsdbReader* pReader) { tsdbDataFReaderClose(&pReader->pFileReader); } + tsdbUntakeReadSnap(pReader->pTsdb, pReader->pReadSnap); + taosMemoryFree(pReader->status.uidCheckInfo.tableUidList); SFilesetIter* pFilesetIter = &pReader->status.fileIter; if (pFilesetIter->pLastBlockReader != NULL) { - tBlockDataDestroy(&pFilesetIter->pLastBlockReader->lastBlockData, true); - taosArrayDestroy(pFilesetIter->pLastBlockReader->pBlockL); + tMergeTreeClose(&pFilesetIter->pLastBlockReader->mergeTree); taosMemoryFree(pFilesetIter->pLastBlockReader); } @@ -3602,12 +3469,12 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(&pReader->status.blockIter); - SBlock* pBlock = getCurrentBlock(&pReader->status.blockIter); - int64_t stime = taosGetTimestampUs(); + SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter); + int64_t stime = taosGetTimestampUs(); SBlockLoadSuppInfo* pSup = &pReader->suppInfo; - if (tBlockHasSma(pBlock)) { + if (tDataBlkHasSma(pBlock)) { code = tsdbReadBlockSma(pReader->pFileReader, pBlock, pSup->pColAgg); if (code != TSDB_CODE_SUCCESS) { tsdbDebug("vgId:%d, failed to load block SMA for uid %" PRIu64 ", code:%s, %s", 0, pFBlock->uid, tstrerror(code), @@ -3784,7 +3651,7 @@ int32_t tsdbGetFileBlocksDistInfo(STsdbReader* pReader, STableBlockDistInfo* pTa while (true) { if (hasNext) { - SBlock* pBlock = getCurrentBlock(pBlockIter); + SDataBlk* pBlock = getCurrentBlock(pBlockIter); int32_t numOfRows = pBlock->nRow; pTableBlockInfo->totalRows += numOfRows; @@ -3952,4 +3819,4 @@ void tsdbUntakeReadSnap(STsdb* pTsdb, STsdbReadSnap* pSnap) { } tsdbTrace("vgId:%d, untake read snapshot", TD_VID(pTsdb->pVnode)); -} +} \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index c8f3862071..dbaf9b234c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -394,17 +394,6 @@ _err: } // SDataFReader ==================================================== -struct SDataFReader { - STsdb *pTsdb; - SDFileSet *pSet; - TdFilePtr pHeadFD; - TdFilePtr pDataFD; - TdFilePtr pLastFD; - TdFilePtr pSmaFD; - - uint8_t *aBuf[3]; -}; - int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet) { int32_t code = 0; SDataFReader *pReader; @@ -436,14 +425,6 @@ int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pS goto _err; } - // last - tsdbLastFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pLastF, fname); - pReader->pLastFD = taosOpenFile(fname, TD_FILE_READ); - if (pReader->pLastFD == NULL) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - // sma tsdbSmaFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pSmaF, fname); pReader->pSmaFD = taosOpenFile(fname, TD_FILE_READ); @@ -452,6 +433,16 @@ int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pS goto _err; } + // sst + for (int32_t iSst = 0; iSst < pSet->nSstF; iSst++) { + tsdbSstFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSstF[iSst], fname); + pReader->aLastFD[iSst] = taosOpenFile(fname, TD_FILE_READ); + if (pReader->aLastFD[iSst] == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + } + *ppReader = pReader; return code; @@ -465,30 +456,35 @@ int32_t tsdbDataFReaderClose(SDataFReader **ppReader) { int32_t code = 0; if (*ppReader == NULL) goto _exit; + // head if (taosCloseFile(&(*ppReader)->pHeadFD) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } + // data if (taosCloseFile(&(*ppReader)->pDataFD) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } - if (taosCloseFile(&(*ppReader)->pLastFD) < 0) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - + // sma if (taosCloseFile(&(*ppReader)->pSmaFD) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } + // sst + for (int32_t iSst = 0; iSst < (*ppReader)->pSet->nSstF; iSst++) { + if (taosCloseFile(&(*ppReader)->aLastFD[iSst]) < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + } + for (int32_t iBuf = 0; iBuf < sizeof((*ppReader)->aBuf) / sizeof(uint8_t *); iBuf++) { tFree((*ppReader)->aBuf[iBuf]); } - taosMemoryFree(*ppReader); _exit: @@ -563,14 +559,14 @@ _err: return code; } -int32_t tsdbReadBlockL(SDataFReader *pReader, SArray *aBlockL) { +int32_t tsdbReadSstBlk(SDataFReader *pReader, int32_t iSst, SArray *aSstBlk) { int32_t code = 0; - int64_t offset = pReader->pSet->pLastF->offset; - int64_t size = pReader->pSet->pLastF->size - offset; + int64_t offset = pReader->pSet->aSstF[iSst]->offset; + int64_t size = pReader->pSet->aSstF[iSst]->size - offset; int64_t n; uint32_t delimiter; - taosArrayClear(aBlockL); + taosArrayClear(aSstBlk); if (size == 0) { goto _exit; } @@ -580,13 +576,13 @@ int32_t tsdbReadBlockL(SDataFReader *pReader, SArray *aBlockL) { if (code) goto _err; // seek - if (taosLSeekFile(pReader->pLastFD, offset, SEEK_SET) < 0) { + if (taosLSeekFile(pReader->aLastFD[iSst], offset, SEEK_SET) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } // read - n = taosReadFile(pReader->pLastFD, pReader->aBuf[0], size); + n = taosReadFile(pReader->aLastFD[iSst], pReader->aBuf[0], size); if (n < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; @@ -607,10 +603,10 @@ int32_t tsdbReadBlockL(SDataFReader *pReader, SArray *aBlockL) { ASSERT(delimiter == TSDB_FILE_DLMT); while (n < size - sizeof(TSCKSUM)) { - SBlockL blockl; - n += tGetBlockL(pReader->aBuf[0] + n, &blockl); + SSstBlk blockl; + n += tGetSstBlk(pReader->aBuf[0] + n, &blockl); - if (taosArrayPush(aBlockL, &blockl) == NULL) { + if (taosArrayPush(aSstBlk, &blockl) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } @@ -681,9 +677,9 @@ _err: return code; } -int32_t tsdbReadBlockSma(SDataFReader *pReader, SBlock *pBlock, SArray *aColumnDataAgg) { +int32_t tsdbReadBlockSma(SDataFReader *pReader, SDataBlk *pDataBlk, SArray *aColumnDataAgg) { int32_t code = 0; - SSmaInfo *pSmaInfo = &pBlock->smaInfo; + SSmaInfo *pSmaInfo = &pDataBlk->smaInfo; ASSERT(pSmaInfo->size > 0); @@ -745,7 +741,7 @@ static int32_t tsdbReadBlockDataImpl(SDataFReader *pReader, SBlockInfo *pBlkInfo tBlockDataClear(pBlockData); - TdFilePtr pFD = fromLast ? pReader->pLastFD : pReader->pDataFD; + TdFilePtr pFD = fromLast ? pReader->aLastFD[0] : pReader->pDataFD; // (todo) // uid + version + tskey code = tsdbReadAndCheck(pFD, pBlkInfo->offset, &pReader->aBuf[0], pBlkInfo->szKey, 1); @@ -847,13 +843,13 @@ _err: return code; } -int32_t tsdbReadDataBlock(SDataFReader *pReader, SBlock *pBlock, SBlockData *pBlockData) { +int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pDataBlk, SBlockData *pBlockData) { int32_t code = 0; - code = tsdbReadBlockDataImpl(pReader, &pBlock->aSubBlock[0], 0, pBlockData); + code = tsdbReadBlockDataImpl(pReader, &pDataBlk->aSubBlock[0], 0, pBlockData); if (code) goto _err; - if (pBlock->nSubBlock > 1) { + if (pDataBlk->nSubBlock > 1) { SBlockData bData1; SBlockData bData2; @@ -867,8 +863,8 @@ int32_t tsdbReadDataBlock(SDataFReader *pReader, SBlock *pBlock, SBlockData *pBl tBlockDataInitEx(&bData1, pBlockData); tBlockDataInitEx(&bData2, pBlockData); - for (int32_t iSubBlock = 1; iSubBlock < pBlock->nSubBlock; iSubBlock++) { - code = tsdbReadBlockDataImpl(pReader, &pBlock->aSubBlock[iSubBlock], 0, &bData1); + for (int32_t iSubBlock = 1; iSubBlock < pDataBlk->nSubBlock; iSubBlock++) { + code = tsdbReadBlockDataImpl(pReader, &pDataBlk->aSubBlock[iSubBlock], 0, &bData1); if (code) { tBlockDataDestroy(&bData1, 1); tBlockDataDestroy(&bData2, 1); @@ -901,10 +897,10 @@ _err: return code; } -int32_t tsdbReadLastBlock(SDataFReader *pReader, SBlockL *pBlockL, SBlockData *pBlockData) { +int32_t tsdbReadSstBlock(SDataFReader *pReader, int32_t iSst, SSstBlk *pSstBlk, SBlockData *pBlockData) { int32_t code = 0; - code = tsdbReadBlockDataImpl(pReader, &pBlockL->bInfo, 1, pBlockData); + code = tsdbReadBlockDataImpl(pReader, &pSstBlk->bInfo, 1, pBlockData); if (code) goto _err; return code; @@ -914,6 +910,21 @@ _err: return code; } +int32_t tsdbReadSstBlockEx(SDataFReader *pReader, int32_t iSst, SSstBlk *pSstBlk, SBlockData *pBlockData) { + int32_t code = 0; + + // read + code = tsdbReadAndCheck(pReader->aLastFD[iSst], pSstBlk->bInfo.offset, &pReader->aBuf[0], pSstBlk->bInfo.szBlock, 0); + if (code) goto _exit; + + // decmpr + code = tDecmprBlockData(pReader->aBuf[0], pSstBlk->bInfo.szBlock, pBlockData, &pReader->aBuf[1]); + if (code) goto _exit; + +_exit: + return code; +} + // SDataFWriter ==================================================== int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pSet) { int32_t code = 0; @@ -929,18 +940,22 @@ int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pS code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } - if (code) goto _err; pWriter->pTsdb = pTsdb; - pWriter->wSet = (SDFileSet){.diskId = pSet->diskId, - .fid = pSet->fid, - .pHeadF = &pWriter->fHead, - .pDataF = &pWriter->fData, - .pLastF = &pWriter->fLast, - .pSmaF = &pWriter->fSma}; + pWriter->wSet = (SDFileSet){ + .diskId = pSet->diskId, + .fid = pSet->fid, + .pHeadF = &pWriter->fHead, + .pDataF = &pWriter->fData, + .pSmaF = &pWriter->fSma, + .nSstF = pSet->nSstF // + }; pWriter->fHead = *pSet->pHeadF; pWriter->fData = *pSet->pDataF; - pWriter->fLast = *pSet->pLastF; pWriter->fSma = *pSet->pSmaF; + for (int8_t iSst = 0; iSst < pSet->nSstF; iSst++) { + pWriter->wSet.aSstF[iSst] = &pWriter->fSst[iSst]; + pWriter->fSst[iSst] = *pSet->aSstF[iSst]; + } // head flag = TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC; @@ -991,36 +1006,6 @@ int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pS ASSERT(n == pWriter->fData.size); } - // last - if (pWriter->fLast.size == 0) { - flag = TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC; - } else { - flag = TD_FILE_WRITE; - } - tsdbLastFileName(pTsdb, pWriter->wSet.diskId, pWriter->wSet.fid, &pWriter->fLast, fname); - pWriter->pLastFD = taosOpenFile(fname, flag); - if (pWriter->pLastFD == NULL) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - if (pWriter->fLast.size == 0) { - n = taosWriteFile(pWriter->pLastFD, hdr, TSDB_FHDR_SIZE); - if (n < 0) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - - pWriter->fLast.size += TSDB_FHDR_SIZE; - } else { - n = taosLSeekFile(pWriter->pLastFD, 0, SEEK_END); - if (n < 0) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - - ASSERT(n == pWriter->fLast.size); - } - // sma if (pWriter->fSma.size == 0) { flag = TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC; @@ -1051,6 +1036,22 @@ int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pS ASSERT(n == pWriter->fSma.size); } + // sst + ASSERT(pWriter->fSst[pSet->nSstF - 1].size == 0); + flag = TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC; + tsdbSstFileName(pTsdb, pWriter->wSet.diskId, pWriter->wSet.fid, &pWriter->fSst[pSet->nSstF - 1], fname); + pWriter->pLastFD = taosOpenFile(fname, flag); + if (pWriter->pLastFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + n = taosWriteFile(pWriter->pLastFD, hdr, TSDB_FHDR_SIZE); + if (n < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + pWriter->fSst[pWriter->wSet.nSstF - 1].size += TSDB_FHDR_SIZE; + *ppWriter = pWriter; return code; @@ -1078,12 +1079,12 @@ int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync) { goto _err; } - if (taosFsyncFile((*ppWriter)->pLastFD) < 0) { + if (taosFsyncFile((*ppWriter)->pSmaFD) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } - if (taosFsyncFile((*ppWriter)->pSmaFD) < 0) { + if (taosFsyncFile((*ppWriter)->pLastFD) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } @@ -1099,12 +1100,12 @@ int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync) { goto _err; } - if (taosCloseFile(&(*ppWriter)->pLastFD) < 0) { + if (taosCloseFile(&(*ppWriter)->pSmaFD) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } - if (taosCloseFile(&(*ppWriter)->pSmaFD) < 0) { + if (taosCloseFile(&(*ppWriter)->pLastFD) < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; } @@ -1161,23 +1162,6 @@ int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter) { goto _err; } - // last ============== - memset(hdr, 0, TSDB_FHDR_SIZE); - tPutLastFile(hdr, &pWriter->fLast); - taosCalcChecksumAppend(0, hdr, TSDB_FHDR_SIZE); - - n = taosLSeekFile(pWriter->pLastFD, 0, SEEK_SET); - if (n < 0) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - - n = taosWriteFile(pWriter->pLastFD, hdr, TSDB_FHDR_SIZE); - if (n < 0) { - code = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - // sma ============== memset(hdr, 0, TSDB_FHDR_SIZE); tPutSmaFile(hdr, &pWriter->fSma); @@ -1195,6 +1179,23 @@ int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter) { goto _err; } + // sst ============== + memset(hdr, 0, TSDB_FHDR_SIZE); + tPutSstFile(hdr, &pWriter->fSst[pWriter->wSet.nSstF - 1]); + taosCalcChecksumAppend(0, hdr, TSDB_FHDR_SIZE); + + n = taosLSeekFile(pWriter->pLastFD, 0, SEEK_SET); + if (n < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + n = taosWriteFile(pWriter->pLastFD, hdr, TSDB_FHDR_SIZE); + if (n < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + return code; _err: @@ -1300,22 +1301,22 @@ _err: return code; } -int32_t tsdbWriteBlockL(SDataFWriter *pWriter, SArray *aBlockL) { - int32_t code = 0; - SLastFile *pLastFile = &pWriter->fLast; - int64_t size; - int64_t n; +int32_t tsdbWriteSstBlk(SDataFWriter *pWriter, SArray *aSstBlk) { + int32_t code = 0; + SSstFile *pSstFile = &pWriter->fSst[pWriter->wSet.nSstF - 1]; + int64_t size; + int64_t n; // check - if (taosArrayGetSize(aBlockL) == 0) { - pLastFile->offset = pLastFile->size; + if (taosArrayGetSize(aSstBlk) == 0) { + pSstFile->offset = pSstFile->size; goto _exit; } // size size = sizeof(uint32_t); // TSDB_FILE_DLMT - for (int32_t iBlockL = 0; iBlockL < taosArrayGetSize(aBlockL); iBlockL++) { - size += tPutBlockL(NULL, taosArrayGet(aBlockL, iBlockL)); + for (int32_t iBlockL = 0; iBlockL < taosArrayGetSize(aSstBlk); iBlockL++) { + size += tPutSstBlk(NULL, taosArrayGet(aSstBlk, iBlockL)); } size += sizeof(TSCKSUM); @@ -1326,8 +1327,8 @@ int32_t tsdbWriteBlockL(SDataFWriter *pWriter, SArray *aBlockL) { // encode n = 0; n += tPutU32(pWriter->aBuf[0] + n, TSDB_FILE_DLMT); - for (int32_t iBlockL = 0; iBlockL < taosArrayGetSize(aBlockL); iBlockL++) { - n += tPutBlockL(pWriter->aBuf[0] + n, taosArrayGet(aBlockL, iBlockL)); + for (int32_t iBlockL = 0; iBlockL < taosArrayGetSize(aSstBlk); iBlockL++) { + n += tPutSstBlk(pWriter->aBuf[0] + n, taosArrayGet(aSstBlk, iBlockL)); } taosCalcChecksumAppend(0, pWriter->aBuf[0], size); @@ -1341,12 +1342,12 @@ int32_t tsdbWriteBlockL(SDataFWriter *pWriter, SArray *aBlockL) { } // update - pLastFile->offset = pLastFile->size; - pLastFile->size += size; + pSstFile->offset = pSstFile->size; + pSstFile->size += size; _exit: tsdbTrace("vgId:%d tsdb write blockl, loffset:%" PRId64 " size:%" PRId64, TD_VID(pWriter->pTsdb->pVnode), - pLastFile->offset, size); + pSstFile->offset, size); return code; _err: @@ -1354,28 +1355,28 @@ _err: return code; } -static void tsdbUpdateBlockInfo(SBlockData *pBlockData, SBlock *pBlock) { +static void tsdbUpdateBlockInfo(SBlockData *pBlockData, SDataBlk *pDataBlk) { for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) { TSDBKEY key = {.ts = pBlockData->aTSKEY[iRow], .version = pBlockData->aVersion[iRow]}; if (iRow == 0) { - if (tsdbKeyCmprFn(&pBlock->minKey, &key) > 0) { - pBlock->minKey = key; + if (tsdbKeyCmprFn(&pDataBlk->minKey, &key) > 0) { + pDataBlk->minKey = key; } } else { if (pBlockData->aTSKEY[iRow] == pBlockData->aTSKEY[iRow - 1]) { - pBlock->hasDup = 1; + pDataBlk->hasDup = 1; } } - if (iRow == pBlockData->nRow - 1 && tsdbKeyCmprFn(&pBlock->maxKey, &key) < 0) { - pBlock->maxKey = key; + if (iRow == pBlockData->nRow - 1 && tsdbKeyCmprFn(&pDataBlk->maxKey, &key) < 0) { + pDataBlk->maxKey = key; } - pBlock->minVer = TMIN(pBlock->minVer, key.version); - pBlock->maxVer = TMAX(pBlock->maxVer, key.version); + pDataBlk->minVer = TMIN(pDataBlk->minVer, key.version); + pDataBlk->maxVer = TMAX(pDataBlk->maxVer, key.version); } - pBlock->nRow += pBlockData->nRow; + pDataBlk->nRow += pBlockData->nRow; } static int32_t tsdbWriteBlockSma(SDataFWriter *pWriter, SBlockData *pBlockData, SSmaInfo *pSmaInfo) { @@ -1430,7 +1431,7 @@ int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlock ASSERT(pBlockData->nRow > 0); - pBlkInfo->offset = toLast ? pWriter->fLast.size : pWriter->fData.size; + pBlkInfo->offset = toLast ? pWriter->fSst[pWriter->wSet.nSstF - 1].size : pWriter->fData.size; pBlkInfo->szBlock = 0; pBlkInfo->szKey = 0; @@ -1474,7 +1475,7 @@ int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlock // update info if (toLast) { - pWriter->fLast.size += pBlkInfo->szBlock; + pWriter->fSst[pWriter->wSet.nSstF - 1].size += pBlkInfo->szBlock; } else { pWriter->fData.size += pBlkInfo->szBlock; } @@ -1553,9 +1554,9 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) { taosCloseFile(&pOutFD); taosCloseFile(&PInFD); - // last - tsdbLastFileName(pTsdb, pSetFrom->diskId, pSetFrom->fid, pSetFrom->pLastF, fNameFrom); - tsdbLastFileName(pTsdb, pSetTo->diskId, pSetTo->fid, pSetTo->pLastF, fNameTo); + // sst + tsdbSstFileName(pTsdb, pSetFrom->diskId, pSetFrom->fid, pSetFrom->aSstF[0], fNameFrom); + tsdbSstFileName(pTsdb, pSetTo->diskId, pSetTo->fid, pSetTo->aSstF[0], fNameTo); pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC); if (pOutFD == NULL) { @@ -1569,7 +1570,7 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) { goto _err; } - n = taosFSendFile(pOutFD, PInFD, 0, pSetFrom->pLastF->size); + n = taosFSendFile(pOutFD, PInFD, 0, pSetFrom->aSstF[0]->size); if (n < 0) { code = TAOS_SYSTEM_ERROR(errno); goto _err; diff --git a/source/dnode/vnode/src/tsdb/tsdbRetention.c b/source/dnode/vnode/src/tsdb/tsdbRetention.c index a30b9154ab..ee29538a81 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRetention.c +++ b/source/dnode/vnode/src/tsdb/tsdbRetention.c @@ -60,7 +60,7 @@ int32_t tsdbDoRetention(STsdb *pTsdb, int64_t now) { if (expLevel < 0) { taosMemoryFree(pSet->pHeadF); taosMemoryFree(pSet->pDataF); - taosMemoryFree(pSet->pLastF); + taosMemoryFree(pSet->aSstF[0]); taosMemoryFree(pSet->pSmaF); taosArrayRemove(fs.aDFileSet, iSet); iSet--; diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index ab2b2b617a..8d19a2ffb8 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -27,13 +27,13 @@ struct STsdbSnapReader { int32_t fid; SDataFReader* pDataFReader; SArray* aBlockIdx; // SArray - SArray* aBlockL; // SArray + SArray* aSstBlk; // SArray SBlockIdx* pBlockIdx; - SBlockL* pBlockL; + SSstBlk* pSstBlk; int32_t iBlockIdx; int32_t iBlockL; - SMapData mBlock; // SMapData + SMapData mBlock; // SMapData int32_t iBlock; SBlockData oBlockData; SBlockData nBlockData; @@ -64,7 +64,7 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) { code = tsdbReadBlockIdx(pReader->pDataFReader, pReader->aBlockIdx); if (code) goto _err; - code = tsdbReadBlockL(pReader->pDataFReader, pReader->aBlockL); + code = tsdbReadSstBlk(pReader->pDataFReader, 0, pReader->aSstBlk); if (code) goto _err; // init @@ -82,13 +82,13 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) { pReader->iBlockL = 0; while (true) { - if (pReader->iBlockL >= taosArrayGetSize(pReader->aBlockL)) { - pReader->pBlockL = NULL; + if (pReader->iBlockL >= taosArrayGetSize(pReader->aSstBlk)) { + pReader->pSstBlk = NULL; break; } - pReader->pBlockL = (SBlockL*)taosArrayGet(pReader->aBlockL, pReader->iBlockL); - if (pReader->pBlockL->minVer <= pReader->ever && pReader->pBlockL->maxVer >= pReader->sver) { + pReader->pSstBlk = (SSstBlk*)taosArrayGet(pReader->aSstBlk, pReader->iBlockL); + if (pReader->pSstBlk->minVer <= pReader->ever && pReader->pSstBlk->maxVer >= pReader->sver) { // TODO break; } @@ -101,8 +101,8 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) { } while (true) { - if (pReader->pBlockIdx && pReader->pBlockL) { - TABLEID id = {.suid = pReader->pBlockL->suid, .uid = pReader->pBlockL->minUid}; + if (pReader->pBlockIdx && pReader->pSstBlk) { + TABLEID id = {.suid = pReader->pSstBlk->suid, .uid = pReader->pSstBlk->minUid}; ASSERT(0); @@ -115,8 +115,8 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) { // } } else if (pReader->pBlockIdx) { while (pReader->iBlock < pReader->mBlock.nItem) { - SBlock block; - tMapDataGetItemByIdx(&pReader->mBlock, pReader->iBlock, &block, tGetBlock); + SDataBlk block; + tMapDataGetItemByIdx(&pReader->mBlock, pReader->iBlock, &block, tGetDataBlk); if (block.minVer <= pReader->ever && block.maxVer >= pReader->sver) { // load data (todo) @@ -142,18 +142,18 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) { } if (*ppData) goto _exit; - } else if (pReader->pBlockL) { - while (pReader->pBlockL) { - if (pReader->pBlockL->minVer <= pReader->ever && pReader->pBlockL->maxVer >= pReader->sver) { + } else if (pReader->pSstBlk) { + while (pReader->pSstBlk) { + if (pReader->pSstBlk->minVer <= pReader->ever && pReader->pSstBlk->maxVer >= pReader->sver) { // load data (todo) } // next pReader->iBlockL++; - if (pReader->iBlockL < taosArrayGetSize(pReader->aBlockL)) { - pReader->pBlockL = (SBlockL*)taosArrayGetSize(pReader->aBlockL); + if (pReader->iBlockL < taosArrayGetSize(pReader->aSstBlk)) { + pReader->pSstBlk = (SSstBlk*)taosArrayGetSize(pReader->aSstBlk); } else { - pReader->pBlockL = NULL; + pReader->pSstBlk = NULL; } if (*ppData) goto _exit; @@ -298,8 +298,8 @@ int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, int8_t type code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } - pReader->aBlockL = taosArrayInit(0, sizeof(SBlockL)); - if (pReader->aBlockL == NULL) { + pReader->aSstBlk = taosArrayInit(0, sizeof(SSstBlk)); + if (pReader->aSstBlk == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } @@ -338,7 +338,7 @@ int32_t tsdbSnapReaderClose(STsdbSnapReader** ppReader) { if (pReader->pDataFReader) { tsdbDataFReaderClose(&pReader->pDataFReader); } - taosArrayDestroy(pReader->aBlockL); + taosArrayDestroy(pReader->aSstBlk); taosArrayDestroy(pReader->aBlockIdx); tMapDataClear(&pReader->mBlock); tBlockDataDestroy(&pReader->oBlockData, 1); @@ -426,24 +426,24 @@ struct STsdbSnapWriter { SArray* aBlockIdx; // SArray int32_t iBlockIdx; SBlockIdx* pBlockIdx; - SMapData mBlock; // SMapData + SMapData mBlock; // SMapData int32_t iBlock; SBlockData* pBlockData; int32_t iRow; SBlockData bDataR; - SArray* aBlockL; // SArray + SArray* aSstBlk; // SArray int32_t iBlockL; SBlockData lDataR; SDataFWriter* pDataFWriter; SBlockIdx* pBlockIdxW; // NULL when no committing table - SBlock blockW; + SDataBlk blockW; SBlockData bDataW; SBlockIdx blockIdxW; - SMapData mBlockW; // SMapData + SMapData mBlockW; // SMapData SArray* aBlockIdxW; // SArray - SArray* aBlockLW; // SArray + SArray* aBlockLW; // SArray // for del file SDelFReader* pDelFReader; @@ -475,10 +475,10 @@ static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) { // &pWriter->blockW, pWriter->cmprAlg); if (code) goto _err; - code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock); + code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutDataBlk); if (code) goto _err; - tBlockReset(&pWriter->blockW); + tDataBlkReset(&pWriter->blockW); tBlockDataClear(&pWriter->bDataW); } @@ -499,15 +499,15 @@ static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) { // &pWriter->blockW, pWriter->cmprAlg); // if (code) goto _err; - code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock); + code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutDataBlk); if (code) goto _err; } while (true) { if (pWriter->iBlock >= pWriter->mBlock.nItem) break; - SBlock block; - tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock); + SDataBlk block; + tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetDataBlk); // if (block.last) { // code = tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, &pWriter->bDataR, NULL, NULL); @@ -520,13 +520,13 @@ static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWriter) { // if (code) goto _err; // } - code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock); + code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutDataBlk); if (code) goto _err; pWriter->iBlock++; } - // SBlock + // SDataBlk // code = tsdbWriteBlock(pWriter->pDataFWriter, &pWriter->mBlockW, NULL, pWriter->pBlockIdxW); // if (code) goto _err; @@ -553,10 +553,10 @@ static int32_t tsdbSnapMoveWriteTableData(STsdbSnapWriter* pWriter, SBlockIdx* p if (code) goto _err; // SBlockData - SBlock block; + SDataBlk block; tMapDataReset(&pWriter->mBlockW); for (int32_t iBlock = 0; iBlock < pWriter->mBlock.nItem; iBlock++) { - tMapDataGetItemByIdx(&pWriter->mBlock, iBlock, &block, tGetBlock); + tMapDataGetItemByIdx(&pWriter->mBlock, iBlock, &block, tGetDataBlk); // if (block.last) { // code = tsdbReadBlockData(pWriter->pDataFReader, pBlockIdx, &block, &pWriter->bDataR, NULL, NULL); @@ -570,11 +570,11 @@ static int32_t tsdbSnapMoveWriteTableData(STsdbSnapWriter* pWriter, SBlockIdx* p // if (code) goto _err; // } - code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock); + code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutDataBlk); if (code) goto _err; } - // SBlock + // SDataBlk SBlockIdx blockIdx = {.suid = pBlockIdx->suid, .uid = pBlockIdx->uid}; code = tsdbWriteBlock(pWriter->pDataFWriter, &pWriter->mBlockW, &blockIdx); if (code) goto _err; @@ -642,10 +642,10 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) { while (true) { if (pWriter->iBlock >= pWriter->mBlock.nItem) break; - SBlock block; - int32_t c; + SDataBlk block; + int32_t c; - tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock); + tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetDataBlk); // if (block.last) { // pWriter->pBlockData = &pWriter->bDataR; @@ -668,14 +668,14 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) { // &pWriter->blockW, pWriter->cmprAlg); // if (code) goto _err; - code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock); + code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutDataBlk); if (code) goto _err; - tBlockReset(&pWriter->blockW); + tDataBlkReset(&pWriter->blockW); tBlockDataClear(&pWriter->bDataW); } - code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock); + code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutDataBlk); if (code) goto _err; pWriter->iBlock++; @@ -719,10 +719,10 @@ static int32_t tsdbSnapWriteTableDataImpl(STsdbSnapWriter* pWriter) { // &pWriter->blockW, pWriter->cmprAlg); // if (code) goto _err; - code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock); + code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutDataBlk); if (code) goto _err; - tBlockReset(&pWriter->blockW); + tDataBlkReset(&pWriter->blockW); tBlockDataClear(&pWriter->bDataW); } @@ -803,7 +803,7 @@ static int32_t tsdbSnapWriteTableData(STsdbSnapWriter* pWriter, TABLEID id) { pWriter->pBlockIdxW->suid = id.suid; pWriter->pBlockIdxW->uid = id.uid; - tBlockReset(&pWriter->blockW); + tDataBlkReset(&pWriter->blockW); tBlockDataReset(&pWriter->bDataW); tMapDataReset(&pWriter->mBlockW); } @@ -845,7 +845,7 @@ static int32_t tsdbSnapWriteDataEnd(STsdbSnapWriter* pWriter) { // write remain stuff if (taosArrayGetSize(pWriter->aBlockLW) > 0) { - code = tsdbWriteBlockL(pWriter->pDataFWriter, pWriter->aBlockIdxW); + code = tsdbWriteSstBlk(pWriter->pDataFWriter, pWriter->aBlockIdxW); if (code) goto _err; } @@ -911,12 +911,12 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3 code = tsdbReadBlockIdx(pWriter->pDataFReader, pWriter->aBlockIdx); if (code) goto _err; - code = tsdbReadBlockL(pWriter->pDataFReader, pWriter->aBlockL); + code = tsdbReadSstBlk(pWriter->pDataFReader, 0, pWriter->aSstBlk); if (code) goto _err; } else { ASSERT(pWriter->pDataFReader == NULL); taosArrayClear(pWriter->aBlockIdx); - taosArrayClear(pWriter->aBlockL); + taosArrayClear(pWriter->aSstBlk); } pWriter->iBlockIdx = 0; pWriter->pBlockIdx = NULL; @@ -931,23 +931,25 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3 // write SHeadFile fHead; SDataFile fData; - SLastFile fLast; + SSstFile fLast; SSmaFile fSma; - SDFileSet wSet = {.pHeadF = &fHead, .pDataF = &fData, .pLastF = &fLast, .pSmaF = &fSma}; + SDFileSet wSet = {.pHeadF = &fHead, .pDataF = &fData, .aSstF[0] = &fLast, .pSmaF = &fSma}; if (pSet) { wSet.diskId = pSet->diskId; wSet.fid = fid; + wSet.nSstF = 1; fHead = (SHeadFile){.commitID = pWriter->commitID, .offset = 0, .size = 0}; fData = *pSet->pDataF; - fLast = (SLastFile){.commitID = pWriter->commitID, .size = 0}; + fLast = (SSstFile){.commitID = pWriter->commitID, .size = 0}; fSma = *pSet->pSmaF; } else { wSet.diskId = (SDiskID){.level = 0, .id = 0}; wSet.fid = fid; + wSet.nSstF = 1; fHead = (SHeadFile){.commitID = pWriter->commitID, .offset = 0, .size = 0}; fData = (SDataFile){.commitID = pWriter->commitID, .size = 0}; - fLast = (SLastFile){.commitID = pWriter->commitID, .size = 0, .offset = 0}; + fLast = (SSstFile){.commitID = pWriter->commitID, .size = 0, .offset = 0}; fSma = (SSmaFile){.commitID = pWriter->commitID, .size = 0}; } @@ -1145,8 +1147,8 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr code = tBlockDataCreate(&pWriter->bDataR); if (code) goto _err; - pWriter->aBlockL = taosArrayInit(0, sizeof(SBlockL)); - if (pWriter->aBlockL == NULL) { + pWriter->aSstBlk = taosArrayInit(0, sizeof(SSstBlk)); + if (pWriter->aSstBlk == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; } @@ -1159,7 +1161,7 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr code = tBlockDataCreate(&pWriter->bDataW); if (code) goto _err; - pWriter->aBlockLW = taosArrayInit(0, sizeof(SBlockL)); + pWriter->aBlockLW = taosArrayInit(0, sizeof(SSstBlk)); if (pWriter->aBlockLW == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index cfb04881e6..6937a27fe4 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -51,6 +51,22 @@ _exit: return code; } +int32_t tMapDataCopy(SMapData *pFrom, SMapData *pTo) { + int32_t code = 0; + + pTo->nItem = pFrom->nItem; + pTo->nData = pFrom->nData; + code = tRealloc((uint8_t **)&pTo->aOffset, sizeof(int32_t) * pFrom->nItem); + if (code) goto _exit; + code = tRealloc(&pTo->pData, pFrom->nData); + if (code) goto _exit; + memcpy(pTo->aOffset, pFrom->aOffset, sizeof(int32_t) * pFrom->nItem); + memcpy(pTo->pData, pFrom->pData, pFrom->nData); + +_exit: + return code; +} + int32_t tMapDataSearch(SMapData *pMapData, void *pSearchItem, int32_t (*tGetItemFn)(uint8_t *, void *), int32_t (*tItemCmprFn)(const void *, const void *), void *pItem) { int32_t code = 0; @@ -198,7 +214,7 @@ int32_t tCmprBlockIdx(void const *lhs, void const *rhs) { int32_t tCmprBlockL(void const *lhs, void const *rhs) { SBlockIdx *lBlockIdx = (SBlockIdx *)lhs; - SBlockL *rBlockL = (SBlockL *)rhs; + SSstBlk *rBlockL = (SSstBlk *)rhs; if (lBlockIdx->suid < rBlockL->suid) { return -1; @@ -215,69 +231,69 @@ int32_t tCmprBlockL(void const *lhs, void const *rhs) { return 0; } -// SBlock ====================================================== -void tBlockReset(SBlock *pBlock) { - *pBlock = (SBlock){.minKey = TSDBKEY_MAX, .maxKey = TSDBKEY_MIN, .minVer = VERSION_MAX, .maxVer = VERSION_MIN}; +// SDataBlk ====================================================== +void tDataBlkReset(SDataBlk *pDataBlk) { + *pDataBlk = (SDataBlk){.minKey = TSDBKEY_MAX, .maxKey = TSDBKEY_MIN, .minVer = VERSION_MAX, .maxVer = VERSION_MIN}; } -int32_t tPutBlock(uint8_t *p, void *ph) { - int32_t n = 0; - SBlock *pBlock = (SBlock *)ph; +int32_t tPutDataBlk(uint8_t *p, void *ph) { + int32_t n = 0; + SDataBlk *pDataBlk = (SDataBlk *)ph; - n += tPutI64v(p ? p + n : p, pBlock->minKey.version); - n += tPutI64v(p ? p + n : p, pBlock->minKey.ts); - n += tPutI64v(p ? p + n : p, pBlock->maxKey.version); - n += tPutI64v(p ? p + n : p, pBlock->maxKey.ts); - n += tPutI64v(p ? p + n : p, pBlock->minVer); - n += tPutI64v(p ? p + n : p, pBlock->maxVer); - n += tPutI32v(p ? p + n : p, pBlock->nRow); - n += tPutI8(p ? p + n : p, pBlock->hasDup); - n += tPutI8(p ? p + n : p, pBlock->nSubBlock); - for (int8_t iSubBlock = 0; iSubBlock < pBlock->nSubBlock; iSubBlock++) { - n += tPutI64v(p ? p + n : p, pBlock->aSubBlock[iSubBlock].offset); - n += tPutI32v(p ? p + n : p, pBlock->aSubBlock[iSubBlock].szBlock); - n += tPutI32v(p ? p + n : p, pBlock->aSubBlock[iSubBlock].szKey); + n += tPutI64v(p ? p + n : p, pDataBlk->minKey.version); + n += tPutI64v(p ? p + n : p, pDataBlk->minKey.ts); + n += tPutI64v(p ? p + n : p, pDataBlk->maxKey.version); + n += tPutI64v(p ? p + n : p, pDataBlk->maxKey.ts); + n += tPutI64v(p ? p + n : p, pDataBlk->minVer); + n += tPutI64v(p ? p + n : p, pDataBlk->maxVer); + n += tPutI32v(p ? p + n : p, pDataBlk->nRow); + n += tPutI8(p ? p + n : p, pDataBlk->hasDup); + n += tPutI8(p ? p + n : p, pDataBlk->nSubBlock); + for (int8_t iSubBlock = 0; iSubBlock < pDataBlk->nSubBlock; iSubBlock++) { + n += tPutI64v(p ? p + n : p, pDataBlk->aSubBlock[iSubBlock].offset); + n += tPutI32v(p ? p + n : p, pDataBlk->aSubBlock[iSubBlock].szBlock); + n += tPutI32v(p ? p + n : p, pDataBlk->aSubBlock[iSubBlock].szKey); } - if (pBlock->nSubBlock == 1 && !pBlock->hasDup) { - n += tPutI64v(p ? p + n : p, pBlock->smaInfo.offset); - n += tPutI32v(p ? p + n : p, pBlock->smaInfo.size); + if (pDataBlk->nSubBlock == 1 && !pDataBlk->hasDup) { + n += tPutI64v(p ? p + n : p, pDataBlk->smaInfo.offset); + n += tPutI32v(p ? p + n : p, pDataBlk->smaInfo.size); } return n; } -int32_t tGetBlock(uint8_t *p, void *ph) { - int32_t n = 0; - SBlock *pBlock = (SBlock *)ph; +int32_t tGetDataBlk(uint8_t *p, void *ph) { + int32_t n = 0; + SDataBlk *pDataBlk = (SDataBlk *)ph; - n += tGetI64v(p + n, &pBlock->minKey.version); - n += tGetI64v(p + n, &pBlock->minKey.ts); - n += tGetI64v(p + n, &pBlock->maxKey.version); - n += tGetI64v(p + n, &pBlock->maxKey.ts); - n += tGetI64v(p + n, &pBlock->minVer); - n += tGetI64v(p + n, &pBlock->maxVer); - n += tGetI32v(p + n, &pBlock->nRow); - n += tGetI8(p + n, &pBlock->hasDup); - n += tGetI8(p + n, &pBlock->nSubBlock); - for (int8_t iSubBlock = 0; iSubBlock < pBlock->nSubBlock; iSubBlock++) { - n += tGetI64v(p + n, &pBlock->aSubBlock[iSubBlock].offset); - n += tGetI32v(p + n, &pBlock->aSubBlock[iSubBlock].szBlock); - n += tGetI32v(p + n, &pBlock->aSubBlock[iSubBlock].szKey); + n += tGetI64v(p + n, &pDataBlk->minKey.version); + n += tGetI64v(p + n, &pDataBlk->minKey.ts); + n += tGetI64v(p + n, &pDataBlk->maxKey.version); + n += tGetI64v(p + n, &pDataBlk->maxKey.ts); + n += tGetI64v(p + n, &pDataBlk->minVer); + n += tGetI64v(p + n, &pDataBlk->maxVer); + n += tGetI32v(p + n, &pDataBlk->nRow); + n += tGetI8(p + n, &pDataBlk->hasDup); + n += tGetI8(p + n, &pDataBlk->nSubBlock); + for (int8_t iSubBlock = 0; iSubBlock < pDataBlk->nSubBlock; iSubBlock++) { + n += tGetI64v(p + n, &pDataBlk->aSubBlock[iSubBlock].offset); + n += tGetI32v(p + n, &pDataBlk->aSubBlock[iSubBlock].szBlock); + n += tGetI32v(p + n, &pDataBlk->aSubBlock[iSubBlock].szKey); } - if (pBlock->nSubBlock == 1 && !pBlock->hasDup) { - n += tGetI64v(p + n, &pBlock->smaInfo.offset); - n += tGetI32v(p + n, &pBlock->smaInfo.size); + if (pDataBlk->nSubBlock == 1 && !pDataBlk->hasDup) { + n += tGetI64v(p + n, &pDataBlk->smaInfo.offset); + n += tGetI32v(p + n, &pDataBlk->smaInfo.size); } else { - pBlock->smaInfo.offset = 0; - pBlock->smaInfo.size = 0; + pDataBlk->smaInfo.offset = 0; + pDataBlk->smaInfo.size = 0; } return n; } -int32_t tBlockCmprFn(const void *p1, const void *p2) { - SBlock *pBlock1 = (SBlock *)p1; - SBlock *pBlock2 = (SBlock *)p2; +int32_t tDataBlkCmprFn(const void *p1, const void *p2) { + SDataBlk *pBlock1 = (SDataBlk *)p1; + SDataBlk *pBlock2 = (SDataBlk *)p2; if (tsdbKeyCmprFn(&pBlock1->maxKey, &pBlock2->minKey) < 0) { return -1; @@ -288,48 +304,48 @@ int32_t tBlockCmprFn(const void *p1, const void *p2) { return 0; } -bool tBlockHasSma(SBlock *pBlock) { - if (pBlock->nSubBlock > 1) return false; - if (pBlock->hasDup) return false; +bool tDataBlkHasSma(SDataBlk *pDataBlk) { + if (pDataBlk->nSubBlock > 1) return false; + if (pDataBlk->hasDup) return false; - return pBlock->smaInfo.size > 0; + return pDataBlk->smaInfo.size > 0; } -// SBlockL ====================================================== -int32_t tPutBlockL(uint8_t *p, void *ph) { +// SSstBlk ====================================================== +int32_t tPutSstBlk(uint8_t *p, void *ph) { int32_t n = 0; - SBlockL *pBlockL = (SBlockL *)ph; + SSstBlk *pSstBlk = (SSstBlk *)ph; - n += tPutI64(p ? p + n : p, pBlockL->suid); - n += tPutI64(p ? p + n : p, pBlockL->minUid); - n += tPutI64(p ? p + n : p, pBlockL->maxUid); - n += tPutI64v(p ? p + n : p, pBlockL->minKey); - n += tPutI64v(p ? p + n : p, pBlockL->maxKey); - n += tPutI64v(p ? p + n : p, pBlockL->minVer); - n += tPutI64v(p ? p + n : p, pBlockL->maxVer); - n += tPutI32v(p ? p + n : p, pBlockL->nRow); - n += tPutI64v(p ? p + n : p, pBlockL->bInfo.offset); - n += tPutI32v(p ? p + n : p, pBlockL->bInfo.szBlock); - n += tPutI32v(p ? p + n : p, pBlockL->bInfo.szKey); + n += tPutI64(p ? p + n : p, pSstBlk->suid); + n += tPutI64(p ? p + n : p, pSstBlk->minUid); + n += tPutI64(p ? p + n : p, pSstBlk->maxUid); + n += tPutI64v(p ? p + n : p, pSstBlk->minKey); + n += tPutI64v(p ? p + n : p, pSstBlk->maxKey); + n += tPutI64v(p ? p + n : p, pSstBlk->minVer); + n += tPutI64v(p ? p + n : p, pSstBlk->maxVer); + n += tPutI32v(p ? p + n : p, pSstBlk->nRow); + n += tPutI64v(p ? p + n : p, pSstBlk->bInfo.offset); + n += tPutI32v(p ? p + n : p, pSstBlk->bInfo.szBlock); + n += tPutI32v(p ? p + n : p, pSstBlk->bInfo.szKey); return n; } -int32_t tGetBlockL(uint8_t *p, void *ph) { +int32_t tGetSstBlk(uint8_t *p, void *ph) { int32_t n = 0; - SBlockL *pBlockL = (SBlockL *)ph; + SSstBlk *pSstBlk = (SSstBlk *)ph; - n += tGetI64(p + n, &pBlockL->suid); - n += tGetI64(p + n, &pBlockL->minUid); - n += tGetI64(p + n, &pBlockL->maxUid); - n += tGetI64v(p + n, &pBlockL->minKey); - n += tGetI64v(p + n, &pBlockL->maxKey); - n += tGetI64v(p + n, &pBlockL->minVer); - n += tGetI64v(p + n, &pBlockL->maxVer); - n += tGetI32v(p + n, &pBlockL->nRow); - n += tGetI64v(p + n, &pBlockL->bInfo.offset); - n += tGetI32v(p + n, &pBlockL->bInfo.szBlock); - n += tGetI32v(p + n, &pBlockL->bInfo.szKey); + n += tGetI64(p + n, &pSstBlk->suid); + n += tGetI64(p + n, &pSstBlk->minUid); + n += tGetI64(p + n, &pSstBlk->maxUid); + n += tGetI64v(p + n, &pSstBlk->minKey); + n += tGetI64v(p + n, &pSstBlk->maxKey); + n += tGetI64v(p + n, &pSstBlk->minVer); + n += tGetI64v(p + n, &pSstBlk->maxVer); + n += tGetI32v(p + n, &pSstBlk->nRow); + n += tGetI64v(p + n, &pSstBlk->bInfo.offset); + n += tGetI32v(p + n, &pSstBlk->bInfo.szBlock); + n += tGetI32v(p + n, &pSstBlk->bInfo.szKey); return n; } @@ -1603,7 +1619,7 @@ _exit: int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]) { int32_t code = 0; - tBlockDataClear(pBlockData); + tBlockDataReset(pBlockData); int32_t n = 0; SDiskDataHdr hdr = {0}; diff --git a/source/dnode/vnode/src/vnd/vnodeCfg.c b/source/dnode/vnode/src/vnd/vnodeCfg.c index 580ab8bc93..f379d9f71a 100644 --- a/source/dnode/vnode/src/vnd/vnodeCfg.c +++ b/source/dnode/vnode/src/vnd/vnodeCfg.c @@ -14,6 +14,7 @@ */ #include "vnd.h" +#include "tutil.h" const SVnodeCfg vnodeCfgDefault = {.vgId = -1, .dbname = "", @@ -106,9 +107,12 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) { if (tjsonAddIntegerToObject(pJson, "wal.retentionSize", pCfg->walCfg.retentionSize) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "wal.segSize", pCfg->walCfg.segSize) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "wal.level", pCfg->walCfg.level) < 0) return -1; + if (tjsonAddIntegerToObject(pJson, "sstTrigger", pCfg->sstTrigger) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "hashBegin", pCfg->hashBegin) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "hashEnd", pCfg->hashEnd) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "hashMethod", pCfg->hashMethod) < 0) return -1; + if (tjsonAddIntegerToObject(pJson, "hashPrefix", pCfg->hashPrefix) < 0) return -1; + if (tjsonAddIntegerToObject(pJson, "hashSuffix", pCfg->hashSuffix) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "syncCfg.replicaNum", pCfg->syncCfg.replicaNum) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "syncCfg.myIndex", pCfg->syncCfg.myIndex) < 0) return -1; @@ -205,12 +209,18 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) { if (code < 0) return -1; tjsonGetNumberValue(pJson, "wal.level", pCfg->walCfg.level, code); if (code < 0) return -1; + tjsonGetNumberValue(pJson, "sstTrigger", pCfg->sstTrigger, code); + if (code < 0) return -1; tjsonGetNumberValue(pJson, "hashBegin", pCfg->hashBegin, code); if (code < 0) return -1; tjsonGetNumberValue(pJson, "hashEnd", pCfg->hashEnd, code); if (code < 0) return -1; tjsonGetNumberValue(pJson, "hashMethod", pCfg->hashMethod, code); if (code < 0) return -1; + tjsonGetNumberValue(pJson, "hashPrefix", pCfg->hashPrefix, code); + if (code < 0) return -1; + tjsonGetNumberValue(pJson, "hashSuffix", pCfg->hashSuffix, code); + if (code < 0) return -1; tjsonGetNumberValue(pJson, "syncCfg.replicaNum", pCfg->syncCfg.replicaNum, code); if (code < 0) return -1; @@ -247,7 +257,8 @@ int vnodeValidateTableHash(SVnode *pVnode, char *tableFName) { switch (pVnode->config.hashMethod) { default: - hashValue = MurmurHash3_32(tableFName, strlen(tableFName)); + hashValue = taosGetTbHashVal(tableFName, strlen(tableFName), pVnode->config.hashMethod, pVnode->config.hashPrefix, + pVnode->config.hashSuffix); break; } diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c index 8d799e919d..8cfe1d8adf 100644 --- a/source/dnode/vnode/src/vnd/vnodeQuery.c +++ b/source/dnode/vnode/src/vnd/vnodeQuery.c @@ -368,6 +368,7 @@ _exit: int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) { pLoad->vgId = TD_VID(pVnode); pLoad->syncState = syncGetMyRole(pVnode->sync); + pLoad->cacheUsage = tsdbCacheGetUsage(pVnode); pLoad->numOfTables = metaGetTbNum(pVnode->pMeta); pLoad->numOfTimeSeries = metaGetTimeSeriesNum(pVnode->pMeta); pLoad->totalStorage = (int64_t)3 * 1073741824; @@ -424,8 +425,8 @@ int32_t vnodeGetCtbIdList(SVnode *pVnode, int64_t suid, SArray *list) { return TSDB_CODE_SUCCESS; } -int32_t vnodeGetStbIdList(SVnode* pVnode, int64_t suid, SArray* list) { - SMStbCursor* pCur = metaOpenStbCursor(pVnode->pMeta, suid); +int32_t vnodeGetStbIdList(SVnode *pVnode, int64_t suid, SArray *list) { + SMStbCursor *pCur = metaOpenStbCursor(pVnode->pMeta, suid); if (!pCur) { return TSDB_CODE_FAILED; } @@ -467,9 +468,13 @@ static int32_t vnodeGetStbColumnNum(SVnode *pVnode, tb_uid_t suid, int *num) { STSchema *pTSchema = metaGetTbTSchema(pVnode->pMeta, suid, -1); // metaGetTbTSchemaEx(pVnode->pMeta, suid, suid, -1, &pTSchema); - *num = pTSchema->numOfCols; + if (pTSchema) { + *num = pTSchema->numOfCols; - taosMemoryFree(pTSchema); + taosMemoryFree(pTSchema); + } else { + *num = 2; + } return TSDB_CODE_SUCCESS; } diff --git a/source/dnode/vnode/src/vnd/vnodeSnapshot.c b/source/dnode/vnode/src/vnd/vnodeSnapshot.c index 5a81f91919..03ab5e8285 100644 --- a/source/dnode/vnode/src/vnd/vnodeSnapshot.c +++ b/source/dnode/vnode/src/vnd/vnodeSnapshot.c @@ -39,7 +39,7 @@ struct SVSnapReader { SStreamStateReader *pStreamStateReader; // rsma int8_t rsmaDone; - SRsmaSnapReader *pRsmaReader; + SRSmaSnapReader *pRsmaReader; }; int32_t vnodeSnapReaderOpen(SVnode *pVnode, int64_t sver, int64_t ever, SVSnapReader **ppReader) { @@ -241,7 +241,7 @@ struct SVSnapWriter { SStreamTaskWriter *pStreamTaskWriter; SStreamStateWriter *pStreamStateWriter; // rsma - SRsmaSnapWriter *pRsmaSnapWriter; + SRSmaSnapWriter *pRsmaSnapWriter; }; int32_t vnodeSnapWriterOpen(SVnode *pVnode, int64_t sver, int64_t ever, SVSnapWriter **ppWriter) { diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index cd0c7ba1f3..2724d4cbfd 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -371,7 +371,7 @@ void vnodeUpdateMetaRsp(SVnode *pVnode, STableMetaRsp *pMetaRsp) { if (NULL == pMetaRsp) { return; } - + strcpy(pMetaRsp->dbFName, pVnode->config.dbname); pMetaRsp->dbId = pVnode->config.dbId; pMetaRsp->vgId = TD_VID(pVnode); @@ -527,7 +527,7 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t version, void *pR cRsp.code = TSDB_CODE_SUCCESS; tdFetchTbUidList(pVnode->pSma, &pStore, pCreateReq->ctb.suid, pCreateReq->uid); taosArrayPush(tbUids, &pCreateReq->uid); - vnodeUpdateMetaRsp(pVnode, cRsp.pMeta); + vnodeUpdateMetaRsp(pVnode, cRsp.pMeta); } taosArrayPush(rsp.pArray, &cRsp); @@ -1107,6 +1107,7 @@ static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t version, void *pReq tDecoderInit(pCoder, pReq, len); tDecodeDeleteRes(pCoder, pRes); + ASSERT(taosArrayGetSize(pRes->uidList) == 0 || (pRes->skey != 0 && pRes->ekey != 0)); for (int32_t iUid = 0; iUid < taosArrayGetSize(pRes->uidList); iUid++) { code = tsdbDeleteTableData(pVnode->pTsdb, version, pRes->suid, *(uint64_t *)taosArrayGet(pRes->uidList, iUid), diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h index 9e7fcc2227..0722c2b306 100644 --- a/source/libs/executor/inc/executil.h +++ b/source/libs/executor/inc/executil.h @@ -87,9 +87,7 @@ struct SqlFunctionCtx; size_t getResultRowSize(struct SqlFunctionCtx* pCtx, int32_t numOfOutput); void initResultRowInfo(SResultRowInfo* pResultRowInfo); - -void initResultRow(SResultRow* pResultRow); -void closeResultRow(SResultRow* pResultRow); +void closeResultRow(SResultRow* pResultRow); struct SResultRowEntryInfo* getResultEntryInfo(const SResultRow* pRow, int32_t index, const int32_t* offset); diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 3bed81f657..c248015604 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -38,11 +38,11 @@ extern "C" { #include "tlockfree.h" #include "tmsg.h" #include "tpagedbuf.h" -#include "tstreamUpdate.h" #include "tstream.h" +#include "tstreamUpdate.h" -#include "vnode.h" #include "executorInt.h" +#include "vnode.h" typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order); @@ -139,23 +139,23 @@ enum { }; typedef struct { - //TODO remove prepareStatus - STqOffsetVal prepareStatus; // for tmq - STqOffsetVal lastStatus; // for tmq - SMqMetaRsp metaRsp; // for tmq fetching meta - int8_t returned; - int64_t snapshotVer; + // TODO remove prepareStatus + STqOffsetVal prepareStatus; // for tmq + STqOffsetVal lastStatus; // for tmq + SMqMetaRsp metaRsp; // for tmq fetching meta + int8_t returned; + int64_t snapshotVer; - SSchemaWrapper *schema; - char tbName[TSDB_TABLE_NAME_LEN]; - SSDataBlock* pullOverBlk; // for streaming - SWalFilterCond cond; - int64_t lastScanUid; - int8_t recoverStep; + SSchemaWrapper* schema; + char tbName[TSDB_TABLE_NAME_LEN]; + SSDataBlock* pullOverBlk; // for streaming + SWalFilterCond cond; + int64_t lastScanUid; + int8_t recoverStep; SQueryTableDataCond tableCond; - int64_t recoverStartVer; - int64_t recoverEndVer; - SStreamState* pState; + int64_t recoverStartVer; + int64_t recoverEndVer; + SStreamState* pState; } SStreamTaskInfo; typedef struct { @@ -167,29 +167,29 @@ typedef struct { } SSchemaInfo; typedef struct SExecTaskInfo { - STaskIdInfo id; - uint32_t status; - STimeWindow window; - STaskCostInfo cost; - int64_t owner; // if it is in execution - int32_t code; + STaskIdInfo id; + uint32_t status; + STimeWindow window; + STaskCostInfo cost; + int64_t owner; // if it is in execution + int32_t code; - int64_t version; // used for stream to record wal version - SStreamTaskInfo streamInfo; - SSchemaInfo schemaInfo; - STableListInfo tableqinfoList; // this is a table list - const char* sql; // query sql string - jmp_buf env; // jump to this position when error happens. - EOPTR_EXEC_MODEL execModel; // operator execution model [batch model|stream model] - SSubplan* pSubplan; + int64_t version; // used for stream to record wal version + SStreamTaskInfo streamInfo; + SSchemaInfo schemaInfo; + STableListInfo tableqinfoList; // this is a table list + const char* sql; // query sql string + jmp_buf env; // jump to this position when error happens. + EOPTR_EXEC_MODEL execModel; // operator execution model [batch model|stream model] + SSubplan* pSubplan; struct SOperatorInfo* pRoot; } SExecTaskInfo; enum { - OP_NOT_OPENED = 0x0, - OP_OPENED = 0x1, + OP_NOT_OPENED = 0x0, + OP_OPENED = 0x1, OP_RES_TO_RETURN = 0x5, - OP_EXEC_DONE = 0x9, + OP_EXEC_DONE = 0x9, }; typedef struct SOperatorFpSet { @@ -228,7 +228,7 @@ typedef struct SOperatorInfo { typedef enum { EX_SOURCE_DATA_NOT_READY = 0x1, - EX_SOURCE_DATA_READY = 0x2, + EX_SOURCE_DATA_READY = 0x2, EX_SOURCE_DATA_EXHAUSTED = 0x3, } EX_SOURCE_STATUS; @@ -251,26 +251,26 @@ typedef struct SLoadRemoteDataInfo { } SLoadRemoteDataInfo; typedef struct SLimitInfo { - SLimit limit; - SLimit slimit; - uint64_t currentGroupId; - int64_t remainGroupOffset; - int64_t numOfOutputGroups; - int64_t remainOffset; - int64_t numOfOutputRows; + SLimit limit; + SLimit slimit; + uint64_t currentGroupId; + int64_t remainGroupOffset; + int64_t numOfOutputGroups; + int64_t remainOffset; + int64_t numOfOutputRows; } SLimitInfo; typedef struct SExchangeInfo { - SArray* pSources; - SArray* pSourceDataInfo; - tsem_t ready; - void* pTransporter; + SArray* pSources; + SArray* pSourceDataInfo; + tsem_t ready; + void* pTransporter; // SArray, result block list, used to keep the multi-block that // passed by downstream operator SArray* pResultBlockList; - int32_t rspBlockIndex; // indicate the return block index in pResultBlockList - SSDataBlock* pDummyBlock; // dummy block, not keep data - bool seqLoadData; // sequential load data or not, false by default + int32_t rspBlockIndex; // indicate the return block index in pResultBlockList + SSDataBlock* pDummyBlock; // dummy block, not keep data + bool seqLoadData; // sequential load data or not, false by default int32_t current; SLoadRemoteDataInfo loadInfo; uint64_t self; @@ -278,22 +278,22 @@ typedef struct SExchangeInfo { } SExchangeInfo; typedef struct SColMatchInfo { - int32_t srcSlotId; // source slot id + int32_t srcSlotId; // source slot id int32_t colId; int32_t targetSlotId; - bool output; // todo remove this? + bool output; // todo remove this? bool reserved; - int32_t matchType; // determinate the source according to col id or slot id + int32_t matchType; // determinate the source according to col id or slot id } SColMatchInfo; typedef struct SScanInfo { - int32_t numOfAsc; - int32_t numOfDesc; + int32_t numOfAsc; + int32_t numOfDesc; } SScanInfo; typedef struct SSampleExecInfo { - double sampleRatio; // data block sample ratio, 1 by default - uint32_t seed; // random seed value + double sampleRatio; // data block sample ratio, 1 by default + uint32_t seed; // random seed value } SSampleExecInfo; enum { @@ -305,39 +305,40 @@ typedef struct SAggSupporter { SSHashObj* pResultRowHashTable; // quick locate the window object for each result char* keyBuf; // window key buffer SDiskbasedBuf* pResultBuf; // query result buffer based on blocked-wised disk file - int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row - int32_t currentPageId; // current write page id + int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row + int32_t currentPageId; // current write page id } SAggSupporter; typedef struct { - // if the upstream is an interval operator, the interval info is also kept here to get the time window to check if current data block needs to be loaded. - SInterval interval; - SAggSupporter *pAggSup; - SExprSupp *pExprSup; // expr supporter of aggregate operator + // if the upstream is an interval operator, the interval info is also kept here to get the time window to check if + // current data block needs to be loaded. + SInterval interval; + SAggSupporter* pAggSup; + SExprSupp* pExprSup; // expr supporter of aggregate operator } SAggOptrPushDownInfo; typedef struct STableScanInfo { - STsdbReader* dataReader; - SReadHandle readHandle; + STsdbReader* dataReader; + SReadHandle readHandle; SFileBlockLoadRecorder readRecorder; - SScanInfo scanInfo; - int32_t scanTimes; - SNode* pFilterNode; // filter info, which is push down by optimizer + SScanInfo scanInfo; + int32_t scanTimes; + SNode* pFilterNode; // filter info, which is push down by optimizer - SSDataBlock* pResBlock; - SArray* pColMatchInfo; - SExprSupp pseudoSup; - SQueryTableDataCond cond; - int32_t scanFlag; // table scan flag to denote if it is a repeat/reverse/main scan - int32_t dataBlockLoadFlag; - SSampleExecInfo sample; // sample execution info - int32_t currentGroupId; - int32_t currentTable; - int8_t scanMode; - int8_t noTable; + SSDataBlock* pResBlock; + SArray* pColMatchInfo; + SExprSupp pseudoSup; + SQueryTableDataCond cond; + int32_t scanFlag; // table scan flag to denote if it is a repeat/reverse/main scan + int32_t dataBlockLoadFlag; + SSampleExecInfo sample; // sample execution info + int32_t currentGroupId; + int32_t currentTable; + int8_t scanMode; + int8_t noTable; SAggOptrPushDownInfo pdInfo; - int8_t assignBlockUid; + int8_t assignBlockUid; } STableScanInfo; typedef struct STableMergeScanInfo { @@ -370,7 +371,7 @@ typedef struct STableMergeScanInfo { SArray* pColMatchInfo; int32_t numOfOutput; - SExprSupp pseudoSup; + SExprSupp pseudoSup; SQueryTableDataCond cond; int32_t scanFlag; // table scan flag to denote if it is a repeat/reverse/main scan @@ -384,26 +385,26 @@ typedef struct STableMergeScanInfo { } STableMergeScanInfo; typedef struct STagScanInfo { - SColumnInfo *pCols; - SSDataBlock *pRes; - SArray *pColMatchInfo; - int32_t curPos; - SReadHandle readHandle; - STableListInfo *pTableList; + SColumnInfo* pCols; + SSDataBlock* pRes; + SArray* pColMatchInfo; + int32_t curPos; + SReadHandle readHandle; + STableListInfo* pTableList; } STagScanInfo; typedef struct SLastrowScanInfo { - SSDataBlock *pRes; - SReadHandle readHandle; - void *pLastrowReader; - SArray *pColMatchInfo; - int32_t *pSlotIds; - SExprSupp pseudoExprSup; - int32_t retrieveType; - int32_t currentGroupIndex; - SSDataBlock *pBufferredRes; - SArray *pUidList; - int32_t indexOfBufferedRes; + SSDataBlock* pRes; + SReadHandle readHandle; + void* pLastrowReader; + SArray* pColMatchInfo; + int32_t* pSlotIds; + SExprSupp pseudoExprSup; + int32_t retrieveType; + int32_t currentGroupIndex; + SSDataBlock* pBufferredRes; + SArray* pUidList; + int32_t indexOfBufferedRes; } SLastrowScanInfo; typedef enum EStreamScanMode { @@ -432,10 +433,10 @@ typedef struct SStreamAggSupporter { SArray* pCurWins; int32_t valueSize; int32_t keySize; - char* pKeyBuf; // window key buffer - SDiskbasedBuf* pResultBuf; // query result buffer based on blocked-wised disk file - int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row - int32_t currentPageId; // buffer page that is active + char* pKeyBuf; // window key buffer + SDiskbasedBuf* pResultBuf; // query result buffer based on blocked-wised disk file + int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row + int32_t currentPageId; // buffer page that is active SSDataBlock* pScanBlock; } SStreamAggSupporter; @@ -447,22 +448,22 @@ typedef struct SWindowSupporter { } SWindowSupporter; typedef struct SPartitionBySupporter { - SArray* pGroupCols; // group by columns, SArray - SArray* pGroupColVals; // current group column values, SArray - char* keyBuf; // group by keys for hash - bool needCalc; // partition by column + SArray* pGroupCols; // group by columns, SArray + SArray* pGroupColVals; // current group column values, SArray + char* keyBuf; // group by keys for hash + bool needCalc; // partition by column } SPartitionBySupporter; typedef struct SPartitionDataInfo { - uint64_t groupId; - SArray* rowIds; + uint64_t groupId; + SArray* rowIds; } SPartitionDataInfo; typedef struct STimeWindowSupp { - int8_t calTrigger; - int64_t waterMark; - TSKEY maxTs; - SColumnInfoData timeWindowData; // query time window info for scalar function execution. + int8_t calTrigger; + int64_t waterMark; + TSKEY maxTs; + SColumnInfoData timeWindowData; // query time window info for scalar function execution. } STimeWindowAggSupp; typedef struct SStreamScanInfo { @@ -487,22 +488,22 @@ typedef struct SStreamScanInfo { uint64_t groupId; SUpdateInfo* pUpdateInfo; - EStreamScanMode scanMode; - SOperatorInfo* pStreamScanOp; - SOperatorInfo* pTableScanOp; - SArray* childIds; - SWindowSupporter windowSup; - SPartitionBySupporter partitionSup; - SExprSupp* pPartScalarSup; - bool assignBlockUid; // assign block uid to groupId, temporarily used for generating rollup SMA. - int32_t scanWinIndex; // for state operator - int32_t pullDataResIndex; - SSDataBlock* pPullDataRes; // pull data SSDataBlock - SSDataBlock* pDeleteDataRes; // delete data SSDataBlock - int32_t deleteDataIndex; - STimeWindow updateWin; - STimeWindowAggSupp twAggSup; - SSDataBlock* pUpdateDataRes; + EStreamScanMode scanMode; + SOperatorInfo* pStreamScanOp; + SOperatorInfo* pTableScanOp; + SArray* childIds; + SWindowSupporter windowSup; + SPartitionBySupporter partitionSup; + SExprSupp* pPartScalarSup; + bool assignBlockUid; // assign block uid to groupId, temporarily used for generating rollup SMA. + int32_t scanWinIndex; // for state operator + int32_t pullDataResIndex; + SSDataBlock* pPullDataRes; // pull data SSDataBlock + SSDataBlock* pDeleteDataRes; // delete data SSDataBlock + int32_t deleteDataIndex; + STimeWindow updateWin; + STimeWindowAggSupp twAggSup; + SSDataBlock* pUpdateDataRes; // status for tmq SNodeList* pGroupTags; SNode* pTagCond; @@ -571,17 +572,17 @@ typedef struct SIntervalAggOperatorInfo { EOPTR_EXEC_MODEL execModel; // operator execution model [batch model|stream model] STimeWindowAggSupp twAggSup; bool invertible; - SArray* pPrevValues; // SArray used to keep the previous not null value for interpolation. + SArray* pPrevValues; // SArray used to keep the previous not null value for interpolation. bool ignoreExpiredData; SArray* pRecycledPages; - SArray* pDelWins; // SWinRes + SArray* pDelWins; // SWinRes int32_t delIndex; SSDataBlock* pDelRes; SNode* pCondition; } SIntervalAggOperatorInfo; typedef struct SMergeAlignedIntervalAggOperatorInfo { - SIntervalAggOperatorInfo *intervalAggOperatorInfo; + SIntervalAggOperatorInfo* intervalAggOperatorInfo; bool hasGroupId; uint64_t groupId; // current groupId @@ -592,63 +593,63 @@ typedef struct SMergeAlignedIntervalAggOperatorInfo { typedef struct SStreamFinalIntervalOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; // basic info - SAggSupporter aggSup; // aggregate supporter - SExprSupp scalarSupp; // supporter for perform scalar function - SGroupResInfo groupResInfo; // multiple results build supporter - SInterval interval; // interval info - int32_t primaryTsIndex; // primary time stamp slot id from result of downstream operator. - int32_t order; // current SSDataBlock scan order + SOptrBasicInfo binfo; // basic info + SAggSupporter aggSup; // aggregate supporter + SExprSupp scalarSupp; // supporter for perform scalar function + SGroupResInfo groupResInfo; // multiple results build supporter + SInterval interval; // interval info + int32_t primaryTsIndex; // primary time stamp slot id from result of downstream operator. + int32_t order; // current SSDataBlock scan order STimeWindowAggSupp twAggSup; SArray* pChildren; SSDataBlock* pUpdateRes; bool returnUpdate; - SPhysiNode* pPhyNode; // create new child + SPhysiNode* pPhyNode; // create new child bool isFinal; SHashObj* pPullDataMap; - SArray* pPullWins; // SPullWindowInfo + SArray* pPullWins; // SPullWindowInfo int32_t pullIndex; SSDataBlock* pPullDataRes; bool ignoreExpiredData; SArray* pRecycledPages; - SArray* pDelWins; // SWinRes + SArray* pDelWins; // SWinRes int32_t delIndex; SSDataBlock* pDelRes; } SStreamFinalIntervalOperatorInfo; typedef struct SAggOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; - SAggSupporter aggSup; + SOptrBasicInfo binfo; + SAggSupporter aggSup; - STableQueryInfo *current; - uint64_t groupId; - SGroupResInfo groupResInfo; - SExprSupp scalarExprSup; - SNode *pCondition; + STableQueryInfo* current; + uint64_t groupId; + SGroupResInfo groupResInfo; + SExprSupp scalarExprSup; + SNode* pCondition; } SAggOperatorInfo; typedef struct SProjectOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; - SAggSupporter aggSup; - SNode* pFilterNode; // filter info, which is push down by optimizer - SArray* pPseudoColInfo; - SLimitInfo limitInfo; - bool mergeDataBlocks; - SSDataBlock* pFinalRes; - SNode* pCondition; + SOptrBasicInfo binfo; + SAggSupporter aggSup; + SNode* pFilterNode; // filter info, which is push down by optimizer + SArray* pPseudoColInfo; + SLimitInfo limitInfo; + bool mergeDataBlocks; + SSDataBlock* pFinalRes; + SNode* pCondition; } SProjectOperatorInfo; typedef struct SIndefOperatorInfo { - SOptrBasicInfo binfo; - SAggSupporter aggSup; - SArray* pPseudoColInfo; - SExprSupp scalarSup; - SNode* pCondition; - uint64_t groupId; + SOptrBasicInfo binfo; + SAggSupporter aggSup; + SArray* pPseudoColInfo; + SExprSupp scalarSup; + SNode* pCondition; + uint64_t groupId; - SSDataBlock* pNextGroupRes; + SSDataBlock* pNextGroupRes; } SIndefOperatorInfo; typedef struct SFillOperatorInfo { @@ -663,7 +664,7 @@ typedef struct SFillOperatorInfo { SArray* pColMatchColInfo; int32_t primaryTsCol; int32_t primarySrcSlotId; - uint64_t curGroupId; // current handled group id + uint64_t curGroupId; // current handled group id SExprInfo* pExprInfo; int32_t numOfExpr; SExprInfo* pNotFillExprInfo; @@ -672,23 +673,23 @@ typedef struct SFillOperatorInfo { typedef struct SGroupbyOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; - SAggSupporter aggSup; + SOptrBasicInfo binfo; + SAggSupporter aggSup; - SArray* pGroupCols; // group by columns, SArray - SArray* pGroupColVals; // current group column values, SArray - SNode* pCondition; - bool isInit; // denote if current val is initialized or not - char* keyBuf; // group by keys for hash - int32_t groupKeyLen; // total group by column width - SGroupResInfo groupResInfo; - SExprSupp scalarSup; + SArray* pGroupCols; // group by columns, SArray + SArray* pGroupColVals; // current group column values, SArray + SNode* pCondition; + bool isInit; // denote if current val is initialized or not + char* keyBuf; // group by keys for hash + int32_t groupKeyLen; // total group by column width + SGroupResInfo groupResInfo; + SExprSupp scalarSup; } SGroupbyOperatorInfo; typedef struct SDataGroupInfo { - uint64_t groupId; - int64_t numOfRows; - SArray* pPageList; + uint64_t groupId; + int64_t numOfRows; + SArray* pPageList; } SDataGroupInfo; // The sort in partition may be needed later. @@ -700,12 +701,12 @@ typedef struct SPartitionOperatorInfo { int32_t groupKeyLen; // total group by column width SHashObj* pGroupSet; // quick locate the window object for each result - SDiskbasedBuf* pBuf; // query result buffer based on blocked-wised disk file - int32_t rowCapacity; // maximum number of rows for each buffer page - int32_t* columnOffset; // start position for each column data - SArray* sortedGroupArray; // SDataGroupInfo sorted by group id - int32_t groupIndex; // group index - int32_t pageIndex; // page index of current group + SDiskbasedBuf* pBuf; // query result buffer based on blocked-wised disk file + int32_t rowCapacity; // maximum number of rows for each buffer page + int32_t* columnOffset; // start position for each column data + SArray* sortedGroupArray; // SDataGroupInfo sorted by group id + int32_t groupIndex; // group index + int32_t pageIndex; // page index of current group SExprSupp scalarSup; } SPartitionOperatorInfo; @@ -719,52 +720,52 @@ typedef struct SWindowRowsSup { typedef struct SSessionAggOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; - SAggSupporter aggSup; + SOptrBasicInfo binfo; + SAggSupporter aggSup; SGroupResInfo groupResInfo; SWindowRowsSup winSup; - bool reptScan; // next round scan - int64_t gap; // session window gap - int32_t tsSlotId; // primary timestamp slot id + bool reptScan; // next round scan + int64_t gap; // session window gap + int32_t tsSlotId; // primary timestamp slot id STimeWindowAggSupp twAggSup; - const SNode* pCondition; + const SNode* pCondition; } SSessionAggOperatorInfo; typedef struct SResultWindowInfo { SResultRowPosition pos; - STimeWindow win; - uint64_t groupId; - bool isOutput; - bool isClosed; + STimeWindow win; + uint64_t groupId; + bool isOutput; + bool isClosed; } SResultWindowInfo; typedef struct SStateWindowInfo { SResultWindowInfo winInfo; - SStateKeys stateKey; + SStateKeys stateKey; } SStateWindowInfo; typedef struct SStreamSessionAggOperatorInfo { - SOptrBasicInfo binfo; - SStreamAggSupporter streamAggSup; - SExprSupp scalarSupp; // supporter for perform scalar function - SGroupResInfo groupResInfo; - int64_t gap; // session window gap - int32_t primaryTsIndex; // primary timestamp slot id - int32_t endTsIndex; // window end timestamp slot id - int32_t order; // current SSDataBlock scan order - STimeWindowAggSupp twAggSup; - SSDataBlock* pWinBlock; // window result - SqlFunctionCtx* pDummyCtx; // for combine - SSDataBlock* pDelRes; // delete result - SSDataBlock* pUpdateRes; // update window - bool returnUpdate; - SHashObj* pStDeleted; - void* pDelIterator; - SArray* pChildren; // cache for children's result; final stream operator - SPhysiNode* pPhyNode; // create new child - bool isFinal; - bool ignoreExpiredData; + SOptrBasicInfo binfo; + SStreamAggSupporter streamAggSup; + SExprSupp scalarSupp; // supporter for perform scalar function + SGroupResInfo groupResInfo; + int64_t gap; // session window gap + int32_t primaryTsIndex; // primary timestamp slot id + int32_t endTsIndex; // window end timestamp slot id + int32_t order; // current SSDataBlock scan order + STimeWindowAggSupp twAggSup; + SSDataBlock* pWinBlock; // window result + SqlFunctionCtx* pDummyCtx; // for combine + SSDataBlock* pDelRes; // delete result + SSDataBlock* pUpdateRes; // update window + bool returnUpdate; + SHashObj* pStDeleted; + void* pDelIterator; + SArray* pChildren; // cache for children's result; final stream operator + SPhysiNode* pPhyNode; // create new child + bool isFinal; + bool ignoreExpiredData; } SStreamSessionAggOperatorInfo; typedef struct SStreamPartitionOperatorInfo { @@ -778,26 +779,26 @@ typedef struct SStreamPartitionOperatorInfo { } SStreamPartitionOperatorInfo; typedef struct STimeSliceOperatorInfo { - SSDataBlock* pRes; - STimeWindow win; - SInterval interval; - int64_t current; - SArray* pPrevRow; // SArray - SArray* pNextRow; // SArray - SArray* pLinearInfo; // SArray - bool fillLastPoint; - bool isPrevRowSet; - bool isNextRowSet; - int32_t fillType; // fill type - SColumn tsCol; // primary timestamp column - SExprSupp scalarSup; // scalar calculation - struct SFillColInfo* pFillColInfo; // fill column info + SSDataBlock* pRes; + STimeWindow win; + SInterval interval; + int64_t current; + SArray* pPrevRow; // SArray + SArray* pNextRow; // SArray + SArray* pLinearInfo; // SArray + bool fillLastPoint; + bool isPrevRowSet; + bool isNextRowSet; + int32_t fillType; // fill type + SColumn tsCol; // primary timestamp column + SExprSupp scalarSup; // scalar calculation + struct SFillColInfo* pFillColInfo; // fill column info } STimeSliceOperatorInfo; typedef struct SStateWindowOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; - SAggSupporter aggSup; + SOptrBasicInfo binfo; + SAggSupporter aggSup; SGroupResInfo groupResInfo; SWindowRowsSup winSup; @@ -811,52 +812,52 @@ typedef struct SStateWindowOperatorInfo { } SStateWindowOperatorInfo; typedef struct SStreamStateAggOperatorInfo { - SOptrBasicInfo binfo; - SStreamAggSupporter streamAggSup; - SExprSupp scalarSupp; // supporter for perform scalar function - SGroupResInfo groupResInfo; - int32_t primaryTsIndex; // primary timestamp slot id - int32_t order; // current SSDataBlock scan order - STimeWindowAggSupp twAggSup; - SColumn stateCol; - SqlFunctionCtx* pDummyCtx; // for combine - SSDataBlock* pDelRes; - SHashObj* pSeDeleted; - void* pDelIterator; - SArray* pChildren; // cache for children's result; - bool ignoreExpiredData; + SOptrBasicInfo binfo; + SStreamAggSupporter streamAggSup; + SExprSupp scalarSupp; // supporter for perform scalar function + SGroupResInfo groupResInfo; + int32_t primaryTsIndex; // primary timestamp slot id + int32_t order; // current SSDataBlock scan order + STimeWindowAggSupp twAggSup; + SColumn stateCol; + SqlFunctionCtx* pDummyCtx; // for combine + SSDataBlock* pDelRes; + SHashObj* pSeDeleted; + void* pDelIterator; + SArray* pChildren; // cache for children's result; + bool ignoreExpiredData; } SStreamStateAggOperatorInfo; typedef struct SSortedMergeOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; - SAggSupporter aggSup; + SOptrBasicInfo binfo; + SAggSupporter aggSup; - SArray* pSortInfo; - int32_t numOfSources; - SSortHandle *pSortHandle; - int32_t bufPageSize; - uint32_t sortBufSize; // max buffer size for in-memory sort - int32_t resultRowFactor; - bool hasGroupVal; - SDiskbasedBuf *pTupleStore; // keep the final results - int32_t numOfResPerPage; - char** groupVal; - SArray *groupInfo; + SArray* pSortInfo; + int32_t numOfSources; + SSortHandle* pSortHandle; + int32_t bufPageSize; + uint32_t sortBufSize; // max buffer size for in-memory sort + int32_t resultRowFactor; + bool hasGroupVal; + SDiskbasedBuf* pTupleStore; // keep the final results + int32_t numOfResPerPage; + char** groupVal; + SArray* groupInfo; } SSortedMergeOperatorInfo; typedef struct SSortOperatorInfo { SOptrBasicInfo binfo; - uint32_t sortBufSize; // max buffer size for in-memory sort - SArray* pSortInfo; - SSortHandle* pSortHandle; - SArray* pColMatchInfo; // for index map from table scan output - int32_t bufPageSize; + uint32_t sortBufSize; // max buffer size for in-memory sort + SArray* pSortInfo; + SSortHandle* pSortHandle; + SArray* pColMatchInfo; // for index map from table scan output + int32_t bufPageSize; - int64_t startTs; // sort start time - uint64_t sortElapsed; // sort elapsed time, time to flush to disk not included. - SLimitInfo limitInfo; - SNode* pCondition; + int64_t startTs; // sort start time + uint64_t sortElapsed; // sort elapsed time, time to flush to disk not included. + SLimitInfo limitInfo; + SNode* pCondition; } SSortOperatorInfo; typedef struct STagFilterOperatorInfo { @@ -864,18 +865,18 @@ typedef struct STagFilterOperatorInfo { } STagFilterOperatorInfo; typedef struct SJoinOperatorInfo { - SSDataBlock *pRes; - int32_t joinType; - int32_t inputOrder; + SSDataBlock* pRes; + int32_t joinType; + int32_t inputOrder; - SSDataBlock *pLeft; - int32_t leftPos; - SColumnInfo leftCol; + SSDataBlock* pLeft; + int32_t leftPos; + SColumnInfo leftCol; - SSDataBlock *pRight; - int32_t rightPos; - SColumnInfo rightCol; - SNode *pCondAfterMerge; + SSDataBlock* pRight; + int32_t rightPos; + SColumnInfo rightCol; + SNode* pCondAfterMerge; } SJoinOperatorInfo; #define OPTR_IS_OPENED(_optr) (((_optr)->status & OP_OPENED) == OP_OPENED) @@ -884,8 +885,8 @@ typedef struct SJoinOperatorInfo { void doDestroyExchangeOperatorInfo(void* param); SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t streamFn, - __optr_fn_t cleanup, __optr_close_fn_t closeFn, __optr_encode_fn_t encode, - __optr_decode_fn_t decode, __optr_explain_fn_t explain); + __optr_fn_t cleanup, __optr_close_fn_t closeFn, __optr_encode_fn_t encode, + __optr_decode_fn_t decode, __optr_explain_fn_t explain); int32_t operatorDummyOpenFn(SOperatorInfo* pOperator); void operatorDummyCloseFn(void* param, int32_t numOfCols); @@ -896,24 +897,26 @@ void cleanupBasicInfo(SOptrBasicInfo* pInfo); int32_t initExprSupp(SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfExpr); void cleanupExprSupp(SExprSupp* pSup); void destroyExprInfo(SExprInfo* pExpr, int32_t numOfExprs); -int32_t initAggInfo(SExprSupp *pSup, SAggSupporter* pAggSup, SExprInfo* pExprInfo, int32_t numOfCols, size_t keyBufSize, +int32_t initAggInfo(SExprSupp* pSup, SAggSupporter* pAggSup, SExprInfo* pExprInfo, int32_t numOfCols, size_t keyBufSize, const char* pkey); -void initResultSizeInfo(SResultInfo * pResultInfo, int32_t numOfRows); -void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo, SDiskbasedBuf* pBuf); -int32_t handleLimitOffset(SOperatorInfo *pOperator, SLimitInfo* pLimitInfo, SSDataBlock* pBlock, bool holdDataInBuf); +void initResultSizeInfo(SResultInfo* pResultInfo, int32_t numOfRows); +void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo, + SDiskbasedBuf* pBuf); +int32_t handleLimitOffset(SOperatorInfo* pOperator, SLimitInfo* pLimitInfo, SSDataBlock* pBlock, bool holdDataInBuf); bool hasLimitOffsetInfo(SLimitInfo* pLimitInfo); void initLimitInfo(const SNode* pLimit, const SNode* pSLimit, SLimitInfo* pLimitInfo); -void doApplyFunctions(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfoData* pTimeWindowData, int32_t offset, - int32_t forwardStep, int32_t numOfTotal, int32_t numOfOutput); +void doApplyFunctions(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfoData* pTimeWindowData, int32_t offset, + int32_t forwardStep, int32_t numOfTotal, int32_t numOfOutput); -int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, int32_t numOfOutput, SArray* pColList, char** pNextStart); -void updateLoadRemoteInfo(SLoadRemoteDataInfo *pInfo, int32_t numOfRows, int32_t dataLen, int64_t startTs, - SOperatorInfo* pOperator); +int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, int32_t numOfOutput, SArray* pColList, + char** pNextStart); +void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int32_t numOfRows, int32_t dataLen, int64_t startTs, + SOperatorInfo* pOperator); STimeWindow getFirstQualifiedTimeWindow(int64_t ts, STimeWindow* pWindow, SInterval* pInterval, int32_t order); -int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t *order, int32_t* scanFlag); +int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scanFlag); int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz); void doSetOperatorCompleted(SOperatorInfo* pOperator); @@ -921,10 +924,10 @@ void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, const SArray* pC int32_t addTagPseudoColumnData(SReadHandle* pHandle, SExprInfo* pPseudoExpr, int32_t numOfPseudoExpr, SSDataBlock* pBlock, const char* idStr); -void cleanupAggSup(SAggSupporter* pAggSup); -void destroyBasicOperatorInfo(void* param, int32_t numOfOutput); -void appendOneRowToDataBlock(SSDataBlock* pBlock, STupleHandle* pTupleHandle); -void setTbNameColData(void* pMeta, const SSDataBlock* pBlock, SColumnInfoData* pColInfoData, int32_t functionId); +void cleanupAggSup(SAggSupporter* pAggSup); +void destroyBasicOperatorInfo(void* param, int32_t numOfOutput); +void appendOneRowToDataBlock(SSDataBlock* pBlock, STupleHandle* pTupleHandle); +void setTbNameColData(void* pMeta, const SSDataBlock* pBlock, SColumnInfoData* pColInfoData, int32_t functionId); int32_t doPrepareScan(SOperatorInfo* pOperator, uint64_t uid, int64_t ts); int32_t doGetScanStatus(SOperatorInfo* pOperator, uint64_t* uid, int64_t* ts); @@ -933,29 +936,37 @@ SSDataBlock* loadNextDataBlock(void* param); void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowEntryInfoOffset); -SResultRow* doSetResultOutBufByKey(SDiskbasedBuf* pResultBuf, SResultRowInfo* pResultRowInfo, - char* pData, int16_t bytes, bool masterscan, uint64_t groupId, - SExecTaskInfo* pTaskInfo, bool isIntervalQuery, SAggSupporter* pSup); +SResultRow* doSetResultOutBufByKey(SDiskbasedBuf* pResultBuf, SResultRowInfo* pResultRowInfo, char* pData, + int16_t bytes, bool masterscan, uint64_t groupId, SExecTaskInfo* pTaskInfo, + bool isIntervalQuery, SAggSupporter* pSup); SOperatorInfo* createExchangeOperatorInfo(void* pTransporter, SExchangePhysiNode* pExNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle, + SExecTaskInfo* pTaskInfo); SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysiNode* pPhyNode, STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode *pScanPhyNode, const char* pUser, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode, + const char* pUser, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock, SNode* pCondition, SExprInfo* pScalarExprInfo, +SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, + SSDataBlock* pResultBlock, SNode* pCondition, SExprInfo* pScalarExprInfo, int32_t numOfScalarExpr, bool mergeResult, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhysiNode *pNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhysiNode* pProjPhyNode, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pNode, + SExecTaskInfo* pTaskInfo); +SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhysiNode* pProjPhyNode, + SExecTaskInfo* pTaskInfo); SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode* pSortNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** dowStreams, size_t numStreams, SMergePhysiNode* pMergePhysiNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pTableScanNode, SReadHandle* readHandle, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** dowStreams, size_t numStreams, + SMergePhysiNode* pMergePhysiNode, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pTableScanNode, SReadHandle* readHandle, + SExecTaskInfo* pTaskInfo); SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId, - STimeWindowAggSupp* pTwAggSupp, SIntervalPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, bool isStream); + STimeWindowAggSupp* pTwAggSupp, SIntervalPhysiNode* pPhyNode, + SExecTaskInfo* pTaskInfo, bool isStream); SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMergeIntervalPhysiNode* pIntervalPhyNode, SExecTaskInfo* pTaskInfo); SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SMergeAlignedIntervalPhysiNode* pNode, @@ -975,33 +986,39 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo); - -SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo); - -SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream, SSortMergeJoinPhysiNode* pJoinNode, +SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, + SExecTaskInfo* pTaskInfo); +SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode, + SExecTaskInfo* pTaskInfo); +SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, - SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream, - SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild); +SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, + SExecTaskInfo* pTaskInfo); -SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pNode, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream, + SSortMergeJoinPhysiNode* pJoinNode, SExecTaskInfo* pTaskInfo); + +SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, + SExecTaskInfo* pTaskInfo); +SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, + SExecTaskInfo* pTaskInfo, int32_t numOfChild); + +SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, + SExecTaskInfo* pTaskInfo); int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBlock* pSrcBlock, SqlFunctionCtx* pCtx, - int32_t numOfOutput, SArray* pPseudoList); + int32_t numOfOutput, SArray* pPseudoList); -void setInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order, int32_t scanFlag, bool createDummyCol); +void setInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order, + int32_t scanFlag, bool createDummyCol); bool isTaskKilled(SExecTaskInfo* pTaskInfo); int32_t checkForQueryBuf(size_t numOfTables); -void setTaskKilled(SExecTaskInfo* pTaskInfo); -void queryCostStatis(SExecTaskInfo* pTaskInfo); +void setTaskKilled(SExecTaskInfo* pTaskInfo); +void queryCostStatis(SExecTaskInfo* pTaskInfo); void doDestroyTask(SExecTaskInfo* pTaskInfo); int32_t getMaximumIdleDurationSec(); @@ -1013,7 +1030,7 @@ int32_t getMaximumIdleDurationSec(); * nOptrWithVal: *nOptrWithVal save the number of optr with value * return: result code, 0 means success */ -int32_t encodeOperator(SOperatorInfo* ops, char** data, int32_t *length, int32_t *nOptrWithVal); +int32_t encodeOperator(SOperatorInfo* ops, char** data, int32_t* length, int32_t* nOptrWithVal); /* * ops: root operator, created by caller @@ -1026,7 +1043,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, char* sql, EOPTR_EXEC_MODEL model); -int32_t createDataSinkParam(SDataSinkNode *pNode, void **pParam, qTaskInfo_t* pTaskInfo, SReadHandle* readHandle); +int32_t createDataSinkParam(SDataSinkNode* pNode, void** pParam, qTaskInfo_t* pTaskInfo, SReadHandle* readHandle); int32_t getOperatorExplainExecInfo(SOperatorInfo* operatorInfo, SArray* pExecInfoList); int32_t aggDecodeResultRow(SOperatorInfo* pOperator, char* result); @@ -1035,42 +1052,43 @@ int32_t aggEncodeResultRow(SOperatorInfo* pOperator, char** result, int32_t* len STimeWindow getActiveTimeWindow(SDiskbasedBuf* pBuf, SResultRowInfo* pResultRowInfo, int64_t ts, SInterval* pInterval, int32_t order); int32_t getNumOfRowsInTimeWindow(SDataBlockInfo* pDataBlockInfo, TSKEY* pPrimaryColumn, int32_t startPos, TSKEY ekey, - __block_search_fn_t searchFn, STableQueryInfo* item, int32_t order); + __block_search_fn_t searchFn, STableQueryInfo* item, int32_t order); int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order); int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlFunctionCtx* pCtx, int32_t numOfOutput, - int32_t size); -SResultRow* getNewResultRow(SDiskbasedBuf* pResultBuf, int32_t* currentPageId, int32_t interBufSize); -SResultWindowInfo* getSessionTimeWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, - TSKEY endTs, uint64_t groupId, int64_t gap, int32_t* pIndex); -SResultWindowInfo* getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, - TSKEY endTs, uint64_t groupId, int64_t gap, int32_t* pIndex); -bool isInTimeWindow(STimeWindow* pWin, TSKEY ts, int64_t gap); -bool functionNeedToExecute(SqlFunctionCtx* pCtx); -bool isOverdue(TSKEY ts, STimeWindowAggSupp* pSup); -bool isCloseWindow(STimeWindow* pWin, STimeWindowAggSupp* pSup); -bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup); -void appendOneRow(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, uint64_t* pGp); -void printDataBlock(SSDataBlock* pBlock, const char* flag); + int32_t size); +SResultRow* getNewResultRow(SDiskbasedBuf* pResultBuf, int32_t* currentPageId, int32_t interBufSize); +SResultWindowInfo* getSessionTimeWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId, + int64_t gap, int32_t* pIndex); +SResultWindowInfo* getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId, + int64_t gap, int32_t* pIndex); +bool isInTimeWindow(STimeWindow* pWin, TSKEY ts, int64_t gap); +bool functionNeedToExecute(SqlFunctionCtx* pCtx); +bool isOverdue(TSKEY ts, STimeWindowAggSupp* pSup); +bool isCloseWindow(STimeWindow* pWin, STimeWindowAggSupp* pSup); +bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup); +void appendOneRow(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, uint64_t* pGp); +void printDataBlock(SSDataBlock* pBlock, const char* flag); uint64_t calGroupIdByData(SPartitionBySupporter* pParSup, SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t rowId); int32_t finalizeResultRowIntoResultDataBlock(SDiskbasedBuf* pBuf, SResultRowPosition* resultRowPosition, - SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, int32_t numOfExprs, const int32_t* rowCellOffset, - SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo); + SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, int32_t numOfExprs, + const int32_t* rowCellOffset, SSDataBlock* pBlock, + SExecTaskInfo* pTaskInfo); -int32_t createScanTableListInfo(SScanPhysiNode *pScanNode, SNodeList* pGroupTags, bool groupSort, SReadHandle* pHandle, - STableListInfo* pTableListInfo, SNode* pTagCond, SNode* pTagIndexCond, const char* idstr); +int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags, bool groupSort, SReadHandle* pHandle, + STableListInfo* pTableListInfo, SNode* pTagCond, SNode* pTagIndexCond, + const char* idstr); SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSortPhysiNode* pSortPhyNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, STableListInfo *pTableListInfo, +SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, STableListInfo* pTableListInfo, SReadHandle* readHandle, SExecTaskInfo* pTaskInfo); void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsColIndex); -bool groupbyTbname(SNodeList* pGroupList); +bool groupbyTbname(SNodeList* pGroupList); int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* groupKey); -SSDataBlock* createSpecialDataBlock(EStreamType type); -void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput); +void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput); #ifdef __cplusplus } diff --git a/source/libs/executor/src/dataDeleter.c b/source/libs/executor/src/dataDeleter.c index 06b7c13fa2..40198615ea 100644 --- a/source/libs/executor/src/dataDeleter.c +++ b/source/libs/executor/src/dataDeleter.c @@ -168,7 +168,9 @@ static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, bool* pQueryE taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf); memcpy(&pDeleter->nextOutput, pBuf, sizeof(SDataDeleterBuf)); taosFreeQitem(pBuf); - *pLen = ((SDataCacheEntry*)(pDeleter->nextOutput.pData))->dataLen; + + SDataCacheEntry* pEntry = (SDataCacheEntry*)pDeleter->nextOutput.pData; + *pLen = pEntry->dataLen; *pQueryEnd = pDeleter->queryEnd; qDebug("got data len %" PRId64 ", row num %d in sink", *pLen, ((SDataCacheEntry*)(pDeleter->nextOutput.pData))->numOfRows); } diff --git a/source/libs/executor/src/dataDispatcher.c b/source/libs/executor/src/dataDispatcher.c index 20396046ba..1697ed63fb 100644 --- a/source/libs/executor/src/dataDispatcher.c +++ b/source/libs/executor/src/dataDispatcher.c @@ -93,6 +93,8 @@ static void toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pIn pBuf->useSize = sizeof(SDataCacheEntry); blockEncode(pInput->pData, pEntry->data, &pEntry->dataLen, numOfCols, pEntry->compressed); + ASSERT(pEntry->numOfRows == *(int32_t*)(pEntry->data+8)); + ASSERT(pEntry->numOfCols == *(int32_t*)(pEntry->data+8+4)); pBuf->useSize += pEntry->dataLen; @@ -170,7 +172,13 @@ static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, bool* pQueryE taosReadQitem(pDispatcher->pDataBlocks, (void**)&pBuf); memcpy(&pDispatcher->nextOutput, pBuf, sizeof(SDataDispatchBuf)); taosFreeQitem(pBuf); - *pLen = ((SDataCacheEntry*)(pDispatcher->nextOutput.pData))->dataLen; + + SDataCacheEntry* pEntry = (SDataCacheEntry*)pDispatcher->nextOutput.pData; + *pLen = pEntry->dataLen; + + ASSERT(pEntry->numOfRows == *(int32_t*)(pEntry->data+8)); + ASSERT(pEntry->numOfCols == *(int32_t*)(pEntry->data+8+4)); + *pQueryEnd = pDispatcher->queryEnd; qDebug("got data len %" PRId64 ", row num %d in sink", *pLen, ((SDataCacheEntry*)(pDispatcher->nextOutput.pData))->numOfRows); } @@ -191,6 +199,9 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) { pOutput->numOfCols = pEntry->numOfCols; pOutput->compressed = pEntry->compressed; + ASSERT(pEntry->numOfRows == *(int32_t*)(pEntry->data+8)); + ASSERT(pEntry->numOfCols == *(int32_t*)(pEntry->data+8+4)); + atomic_sub_fetch_64(&pDispatcher->cachedSize, pEntry->dataLen); atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 715eb4780c..3965b7e5b2 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1302,7 +1302,6 @@ int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysi pCond->type = TIMEWINDOW_RANGE_CONTAINED; pCond->startVersion = -1; pCond->endVersion = -1; - pCond->schemaVersion = -1; // pCond->type = pTableScanNode->scanFlag; int32_t j = 0; diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index a3e0b2b733..5da0f5c51a 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -52,7 +52,11 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu // TODO: if a block was set but not consumed, // prevent setting a different type of block pInfo->validBlockIndex = 0; - taosArrayClear(pInfo->pBlockLists); + if (pInfo->blockType == STREAM_INPUT__DATA_BLOCK) { + taosArrayClearP(pInfo->pBlockLists, taosMemoryFree); + } else { + taosArrayClear(pInfo->pBlockLists); + } if (type == STREAM_INPUT__MERGED_SUBMIT) { // ASSERT(numOfBlocks > 1); @@ -729,7 +733,6 @@ int32_t initQueryTableDataCondForTmq(SQueryTableDataCond* pCond, SSnapContext* s pCond->type = TIMEWINDOW_RANGE_CONTAINED; pCond->startVersion = -1; pCond->endVersion = sContext->snapVersion; - pCond->schemaVersion = sContext->snapVersion; for (int32_t i = 0; i < pCond->numOfCols; ++i) { pCond->colList[i].type = mtInfo.schema->pSchema[i].type; diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index e17b994f0e..3cb4ea8702 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -3731,7 +3731,6 @@ static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pC pCond->type = TIMEWINDOW_RANGE_CONTAINED; pCond->startVersion = -1; pCond->endVersion = -1; - pCond->schemaVersion = -1; return TSDB_CODE_SUCCESS; } diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index b740ec21d3..d04483e951 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -695,6 +695,7 @@ static void destroyTableScanOperatorInfo(void* param) { cleanupQueryTableDataCond(&pTableScanInfo->cond); tsdbReaderClose(pTableScanInfo->dataReader); + pTableScanInfo->dataReader = NULL; if (pTableScanInfo->pColMatchInfo != NULL) { taosArrayDestroy(pTableScanInfo->pColMatchInfo); @@ -955,9 +956,7 @@ void resetTableScanInfo(STableScanInfo* pTableScanInfo, STimeWindow* pWin) { pTableScanInfo->currentGroupId = -1; } -static void freeArray(void* array) { - taosArrayDestroy(array); -} +static void freeArray(void* array) { taosArrayDestroy(array); } static void resetTableScanOperator(SOperatorInfo* pTableScanOp) { STableScanInfo* pTableScanInfo = pTableScanOp->info; @@ -971,15 +970,16 @@ static void resetTableScanOperator(SOperatorInfo* pTableScanOp) { resetTableScanInfo(pTableScanOp->info, &win); } -static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbUid, TSKEY startTs, TSKEY endTs, int64_t maxVersion) { +static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbUid, TSKEY startTs, TSKEY endTs, + int64_t maxVersion) { SArray* gpTbls = pTableScanOp->pTaskInfo->tableqinfoList.pGroupList; taosArrayClear(gpTbls); STableKeyInfo tblInfo = {.uid = tbUid, .groupId = 0}; - SArray* tbls = taosArrayInit(1, sizeof(STableKeyInfo)); + SArray* tbls = taosArrayInit(1, sizeof(STableKeyInfo)); taosArrayPush(tbls, &tblInfo); taosArrayPush(gpTbls, &tbls); - STimeWindow win = {.skey = startTs, .ekey = endTs}; + STimeWindow win = {.skey = startTs, .ekey = endTs}; STableScanInfo* pTableScanInfo = pTableScanOp->info; pTableScanInfo->cond.startVersion = -1; pTableScanInfo->cond.endVersion = maxVersion; @@ -1068,8 +1068,8 @@ static STimeWindow getSlidingWindow(TSKEY* tsCol, SInterval* pInterval, SDataBlo if (hasGroup) { (*pRowIndex) += 1; } else { - (*pRowIndex) += getNumOfRowsInTimeWindow(pDataBlockInfo, tsCol, *pRowIndex, endWin.ekey, - binarySearchForKey, NULL, TSDB_ORDER_ASC); + (*pRowIndex) += getNumOfRowsInTimeWindow(pDataBlockInfo, tsCol, *pRowIndex, endWin.ekey, binarySearchForKey, NULL, + TSDB_ORDER_ASC); } do { preWin = endWin; @@ -1110,8 +1110,8 @@ static SSDataBlock* doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32 for (int32_t j = 0; j < pInfo->pTableScanOp->exprSupp.numOfExprs; j++) { SColumnInfoData* pSrcCol = taosArrayGet(tmpBlock->pDataBlock, j); SColumnInfoData* pDestCol = taosArrayGet(pResult->pDataBlock, j); - bool isNull = colDataIsNull(pSrcCol, tmpBlock->info.rows, i, NULL); - char* pSrcData = colDataGetData(pSrcCol, i); + bool isNull = colDataIsNull(pSrcCol, tmpBlock->info.rows, i, NULL); + char* pSrcData = colDataGetData(pSrcCol, i); colDataAppend(pDestCol, pResult->info.rows, pSrcData, isNull); } pResult->info.rows++; @@ -1152,7 +1152,7 @@ static int32_t generateSessionScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSr SColumnInfoData* pDestCalStartTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX); SColumnInfoData* pDestCalEndTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX); int32_t dummy = 0; - int64_t version = pSrcBlock->info.version - 1; + int64_t version = pSrcBlock->info.version - 1; for (int32_t i = 0; i < pSrcBlock->info.rows; i++) { uint64_t groupId = getGroupIdByData(pInfo, uidCol[i], startData[i], version); // gap must be 0. @@ -1201,15 +1201,15 @@ static int32_t generateIntervalScanRange(SStreamScanInfo* pInfo, SSDataBlock* pS SColumnInfoData* pGpCol = taosArrayGet(pDestBlock->pDataBlock, GROUPID_COLUMN_INDEX); SColumnInfoData* pCalStartTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX); SColumnInfoData* pCalEndTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX); - int64_t version = pSrcBlock->info.version - 1; + int64_t version = pSrcBlock->info.version - 1; for (int32_t i = 0; i < rows;) { uint64_t srcUid = srcUidData[i]; uint64_t groupId = getGroupIdByData(pInfo, srcUid, tsCol[i], version); uint64_t srcGpId = srcGp[i]; - TSKEY calStartTs = tsCol[i]; + TSKEY calStartTs = tsCol[i]; colDataAppend(pCalStartTsCol, pDestBlock->info.rows, (const char*)(&calStartTs), false); STimeWindow win = getSlidingWindow(tsCol, &pInfo->interval, &pSrcBlock->info, &i, pInfo->partitionSup.needCalc); - TSKEY calEndTs = tsCol[i - 1]; + TSKEY calEndTs = tsCol[i - 1]; colDataAppend(pCalEndTsCol, pDestBlock->info.rows, (const char*)(&calEndTs), false); colDataAppend(pDeUidCol, pDestBlock->info.rows, (const char*)(&srcUid), false); colDataAppend(pStartTsCol, pDestBlock->info.rows, (const char*)(&win.skey), false); @@ -1277,10 +1277,10 @@ static void checkUpdateData(SStreamScanInfo* pInfo, bool invertible, SSDataBlock bool closedWin = isClosed && isSignleIntervalWindow(pInfo) && isDeletedWindow(&win, pBlock->info.groupId, pInfo->windowSup.pIntervalAggSup); if ((update || closedWin) && out) { - uint64_t gpId = closedWin&&pInfo->partitionSup.needCalc ? - calGroupIdByData(&pInfo->partitionSup, pInfo->pPartScalarSup, pBlock, rowId) : 0; - appendOneRow(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, - &gpId); + uint64_t gpId = closedWin && pInfo->partitionSup.needCalc + ? calGroupIdByData(&pInfo->partitionSup, pInfo->pPartScalarSup, pBlock, rowId) + : 0; + appendOneRow(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, &gpId); } } if (out && pInfo->pUpdateDataRes->info.rows > 0) { @@ -1515,6 +1515,7 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { generateScanRange(pInfo, pBlock, pInfo->pUpdateRes); prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex); copyDataBlock(pInfo->pDeleteDataRes, pInfo->pUpdateRes); + pInfo->pDeleteDataRes->info.type = STREAM_DELETE_DATA; pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE; return pInfo->pDeleteDataRes; } break; @@ -1915,7 +1916,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys ASSERT(pHandle->tqReader); pInfo->tqReader = pHandle->tqReader; } - + pInfo->pUpdateInfo = NULL; pInfo->pTableScanOp = pTableScanOp; pInfo->interval = pTSInfo->pdInfo.interval; @@ -1947,8 +1948,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys pInfo->pUpdateRes = createSpecialDataBlock(STREAM_CLEAR); pInfo->pCondition = pScanPhyNode->node.pConditions; pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE; - pInfo->windowSup = - (SWindowSupporter){.pStreamAggSup = NULL, .gap = -1, .parentType = QUERY_NODE_PHYSICAL_PLAN}; + pInfo->windowSup = (SWindowSupporter){.pStreamAggSup = NULL, .gap = -1, .parentType = QUERY_NODE_PHYSICAL_PLAN}; pInfo->groupId = 0; pInfo->pPullDataRes = createSpecialDataBlock(STREAM_RETRIEVE); pInfo->pStreamScanOp = pOperator; diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 26667cd64f..b7a0673d88 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -35,14 +35,15 @@ typedef struct SPullWindowInfo { typedef struct SOpenWindowInfo { SResultRowPosition pos; - uint64_t groupId; + uint64_t groupId; } SOpenWindowInfo; static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator); static int64_t* extractTsCol(SSDataBlock* pBlock, const SIntervalAggOperatorInfo* pInfo); -static SResultRowPosition addToOpenWindowList(SResultRowInfo* pResultRowInfo, const SResultRow* pResult, uint64_t groupId); +static SResultRowPosition addToOpenWindowList(SResultRowInfo* pResultRowInfo, const SResultRow* pResult, + uint64_t groupId); static void doCloseWindow(SResultRowInfo* pResultRowInfo, const SIntervalAggOperatorInfo* pInfo, SResultRow* pResult); ///* @@ -601,15 +602,15 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num SIntervalAggOperatorInfo* pInfo = (SIntervalAggOperatorInfo*)pOperatorInfo->info; SExprSupp* pSup = &pOperatorInfo->exprSupp; - int32_t startPos = 0; - int32_t numOfOutput = pSup->numOfExprs; + int32_t startPos = 0; + int32_t numOfOutput = pSup->numOfExprs; SResultRow* pResult = NULL; while (1) { - SListNode* pn = tdListGetHead(pResultRowInfo->openWindow); - SOpenWindowInfo* pOpenWin = (SOpenWindowInfo *)pn->data; - uint64_t groupId = pOpenWin->groupId; + SListNode* pn = tdListGetHead(pResultRowInfo->openWindow); + SOpenWindowInfo* pOpenWin = (SOpenWindowInfo*)pn->data; + uint64_t groupId = pOpenWin->groupId; SResultRowPosition* p1 = &pOpenWin->pos; if (p->pageId == p1->pageId && p->offset == p1->offset) { break; @@ -621,7 +622,8 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num if (pr->closed) { ASSERT(isResultRowInterpolated(pr, RESULT_ROW_START_INTERP) && isResultRowInterpolated(pr, RESULT_ROW_END_INTERP)); - tdListPopHead(pResultRowInfo->openWindow); + SListNode* pNode = tdListPopHead(pResultRowInfo->openWindow); + taosMemoryFree(pNode); continue; } @@ -650,7 +652,8 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num if (isResultRowInterpolated(pResult, RESULT_ROW_END_INTERP)) { closeResultRow(pr); - tdListPopHead(pResultRowInfo->openWindow); + SListNode* pNode = tdListPopHead(pResultRowInfo->openWindow); + taosMemoryFree(pNode); } else { // the remains are can not be closed yet. break; } @@ -1028,7 +1031,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul getNumOfRowsInTimeWindow(&pBlock->info, tsCols, startPos, ekey, binarySearchForKey, NULL, pInfo->inputOrder); // window start(end) key interpolation doWindowBorderInterpolation(pInfo, pBlock, pResult, &nextWin, startPos, forwardRows, pSup); - //TODO: add to open window? how to close the open windows after input blocks exhausted? + // TODO: add to open window? how to close the open windows after input blocks exhausted? #if 0 if ((ascScan && ekey <= pBlock->info.window.ekey) || (!ascScan && ekey >= pBlock->info.window.skey)) { @@ -1062,13 +1065,13 @@ SResultRowPosition addToOpenWindowList(SResultRowInfo* pResultRowInfo, const SRe openWin.pos.pageId = pResult->pageId; openWin.pos.offset = pResult->offset; openWin.groupId = groupId; - SListNode* pn = tdListGetTail(pResultRowInfo->openWindow); + SListNode* pn = tdListGetTail(pResultRowInfo->openWindow); if (pn == NULL) { tdListAppend(pResultRowInfo->openWindow, &openWin); return openWin.pos; } - SOpenWindowInfo * px = (SOpenWindowInfo *)pn->data; + SOpenWindowInfo* px = (SOpenWindowInfo*)pn->data; if (px->pos.pageId != openWin.pos.pageId || px->pos.offset != openWin.pos.offset || px->groupId != openWin.groupId) { tdListAppend(pResultRowInfo->openWindow, &openWin); } @@ -1424,7 +1427,8 @@ bool doDeleteIntervalWindow(SAggSupporter* pAggSup, TSKEY ts, uint64_t groupId) return true; } -void doDeleteSpecifyIntervalWindow(SAggSupporter* pAggSup, SSDataBlock* pBlock, SArray* pDelWins, SInterval* pInterval, SHashObj* pUpdatedMap) { +void doDeleteSpecifyIntervalWindow(SAggSupporter* pAggSup, SSDataBlock* pBlock, SArray* pDelWins, SInterval* pInterval, + SHashObj* pUpdatedMap) { SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); TSKEY* tsStarts = (TSKEY*)pStartCol->pData; SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); @@ -1469,7 +1473,6 @@ static void doClearWindows(SAggSupporter* pAggSup, SExprSupp* pSup1, SInterval* } static int32_t getAllIntervalWindow(SSHashObj* pHashMap, SHashObj* resWins) { - void* pIte = NULL; size_t keyLen = 0; int32_t iter = 0; @@ -1730,6 +1733,10 @@ void destroyIntervalOperatorInfo(void* param) { SIntervalAggOperatorInfo* pInfo = (SIntervalAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); cleanupAggSup(&pInfo->aggSup); + cleanupExprSupp(&pInfo->scalarSupp); + + tdListFree(pInfo->binfo.resultRowInfo.openWindow); + pInfo->pRecycledPages = taosArrayDestroy(pInfo->pRecycledPages); pInfo->pInterpCols = taosArrayDestroy(pInfo->pInterpCols); taosArrayDestroyEx(pInfo->pPrevValues, freeItem); @@ -1826,7 +1833,8 @@ static bool timeWindowinterpNeeded(SqlFunctionCtx* pCtx, int32_t numOfCols, SInt return needed; } -void initIntervalDownStream(SOperatorInfo* downstream, uint16_t type, SAggSupporter* pSup, SInterval* pInterval, int64_t waterMark) { +void initIntervalDownStream(SOperatorInfo* downstream, uint16_t type, SAggSupporter* pSup, SInterval* pInterval, + int64_t waterMark) { if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) { initIntervalDownStream(downstream->pDownstream[0], type, pSup, pInterval, waterMark); return; @@ -1921,7 +1929,8 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* destroyIntervalOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL); if (nodeType(pPhyNode) == QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL) { - initIntervalDownStream(downstream, QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL, &pInfo->aggSup, &pInfo->interval, pInfo->twAggSup.waterMark); + initIntervalDownStream(downstream, QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL, &pInfo->aggSup, &pInfo->interval, + pInfo->twAggSup.waterMark); } code = appendDownstream(pOperator, &downstream, 1); @@ -2248,7 +2257,6 @@ static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp if (hasInterp) { pResBlock->info.rows += 1; } - } static int32_t initPrevRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) { @@ -2721,7 +2729,7 @@ SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWi goto _error; } - int32_t num = 0; + int32_t num = 0; SExprInfo* pExprInfo = createExprInfo(pStateNode->window.pFuncs, NULL, &num); SSDataBlock* pResBlock = createResDataBlock(pStateNode->window.node.pOutputDataBlockDesc); int32_t tsSlotId = ((SColumnNode*)pStateNode->window.pTspk)->slotId; @@ -2748,7 +2756,9 @@ SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWi initBasicInfo(&pInfo->binfo, pResBlock); initResultRowInfo(&pInfo->binfo.resultRowInfo); - pInfo->twAggSup = (STimeWindowAggSupp){.waterMark = pStateNode->window.watermark, .calTrigger = pStateNode->window.triggerType};; + pInfo->twAggSup = + (STimeWindowAggSupp){.waterMark = pStateNode->window.watermark, .calTrigger = pStateNode->window.triggerType}; + ; initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window); pInfo->tsSlotId = tsSlotId; @@ -2857,8 +2867,8 @@ void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, int3 } SResultRowEntryInfo* pEntryInfo = GET_RES_INFO(&pDestCtx[k]); - char* p = GET_ROWCELL_INTERBUF(pEntryInfo); - SColumnInfoData idata = {0}; + char* p = GET_ROWCELL_INTERBUF(pEntryInfo); + SColumnInfoData idata = {0}; idata.info.type = TSDB_DATA_TYPE_BIGINT; idata.info.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes; idata.pData = p; @@ -2867,7 +2877,7 @@ void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, int3 SScalarParam tw = {.numOfRows = 5, .columnData = pTimeWindowData}; pDestCtx[k].sfp.process(&tw, 1, &out); pEntryInfo->numOfRes = 1; - }else if (functionNeedToExecute(&pDestCtx[k]) && pDestCtx[k].fpSet.combine != NULL) { + } else if (functionNeedToExecute(&pDestCtx[k]) && pDestCtx[k].fpSet.combine != NULL) { int32_t code = pDestCtx[k].fpSet.combine(&pDestCtx[k], &pSourceCtx[k]); if (code != TSDB_CODE_SUCCESS) { qError("%s apply functions error, code: %s", GET_TASKID(pTaskInfo), tstrerror(code)); @@ -2893,7 +2903,8 @@ STimeWindow getFinalTimeWindow(int64_t ts, SInterval* pInterval) { } static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray, - int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo, SHashObj* pUpdatedMap) { + int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo, + SHashObj* pUpdatedMap) { int32_t size = taosArrayGetSize(pWinArray); if (!pInfo->pChildren) { return; @@ -2934,7 +2945,7 @@ static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExpr bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup) { SET_RES_WINDOW_KEY(pSup->keyBuf, &pWin->skey, sizeof(int64_t), groupId); SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet(pSup->pResultRowHashTable, pSup->keyBuf, - GET_RES_WINDOW_KEY_LEN(sizeof(int64_t))); + GET_RES_WINDOW_KEY_LEN(sizeof(int64_t))); return p1 == NULL; } @@ -3059,7 +3070,7 @@ static void clearStreamIntervalOperator(SStreamFinalIntervalOperatorInfo* pInfo) tSimpleHashClear(pInfo->aggSup.pResultRowHashTable); clearDiskbasedBuf(pInfo->aggSup.pResultBuf); initResultRowInfo(&pInfo->binfo.resultRowInfo); - pInfo->aggSup.currentPageId = -1; + pInfo->aggSup.currentPageId = -1; } static void clearSpecialDataBlock(SSDataBlock* pBlock) { @@ -3145,7 +3156,7 @@ void processPullOver(SSDataBlock* pBlock, SHashObj* pMap) { static void addRetriveWindow(SArray* wins, SStreamFinalIntervalOperatorInfo* pInfo) { int32_t size = taosArrayGetSize(wins); for (int32_t i = 0; i < size; i++) { - SWinKey* winKey = taosArrayGet(wins, i); + SWinKey* winKey = taosArrayGet(wins, i); STimeWindow nextWin = getFinalTimeWindow(winKey->ts, &pInfo->interval); if (isCloseWindow(&nextWin, &pInfo->twAggSup) && !pInfo->ignoreExpiredData) { void* chIds = taosHashGet(pInfo->pPullDataMap, winKey, sizeof(SWinKey)); @@ -3161,6 +3172,12 @@ static void addRetriveWindow(SArray* wins, SStreamFinalIntervalOperatorInfo* pIn } } +static void clearFunctionContext(SExprSupp* pSup) { + for (int32_t i = 0; i < pSup->numOfExprs; i++) { + pSup->pCtx[i].saveHandle.currentPage = -1; + } +} + static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { SStreamFinalIntervalOperatorInfo* pInfo = pOperator->info; @@ -3196,6 +3213,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { if (pInfo->binfo.pRes->info.rows == 0) { pOperator->status = OP_EXEC_DONE; if (!IS_FINAL_OP(pInfo)) { + clearFunctionContext(&pOperator->exprSupp); // semi interval operator clear disk buffer clearStreamIntervalOperator(pInfo); qDebug("===stream===clear semi operator"); @@ -3274,8 +3292,8 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { SStreamFinalIntervalOperatorInfo* pChildInfo = pChildOp->info; SExprSupp* pChildSup = &pChildOp->exprSupp; doDeleteSpecifyIntervalWindow(&pChildInfo->aggSup, pBlock, NULL, &pChildInfo->interval, NULL); - rebuildIntervalWindow(pInfo, pSup, delWins, pInfo->binfo.pRes->info.groupId, - pOperator->exprSupp.numOfExprs, pOperator->pTaskInfo, pUpdatedMap); + rebuildIntervalWindow(pInfo, pSup, delWins, pInfo->binfo.pRes->info.groupId, pOperator->exprSupp.numOfExprs, + pOperator->pTaskInfo, pUpdatedMap); addRetriveWindow(delWins, pInfo); taosArrayAddAll(pInfo->pDelWins, delWins); taosArrayDestroy(delWins); @@ -3381,40 +3399,6 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return NULL; } -SSDataBlock* createSpecialDataBlock(EStreamType type) { - SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock)); - pBlock->info.hasVarCol = false; - pBlock->info.groupId = 0; - pBlock->info.rows = 0; - pBlock->info.type = type; - pBlock->info.rowSize = - sizeof(TSKEY) + sizeof(TSKEY) + sizeof(uint64_t) + sizeof(uint64_t) + sizeof(TSKEY) + sizeof(TSKEY); - pBlock->info.watermark = INT64_MIN; - - pBlock->pDataBlock = taosArrayInit(6, sizeof(SColumnInfoData)); - SColumnInfoData infoData = {0}; - infoData.info.type = TSDB_DATA_TYPE_TIMESTAMP; - infoData.info.bytes = sizeof(TSKEY); - // window start ts - taosArrayPush(pBlock->pDataBlock, &infoData); - // window end ts - taosArrayPush(pBlock->pDataBlock, &infoData); - - infoData.info.type = TSDB_DATA_TYPE_UBIGINT; - infoData.info.bytes = sizeof(uint64_t); - // uid - taosArrayPush(pBlock->pDataBlock, &infoData); - // group id - taosArrayPush(pBlock->pDataBlock, &infoData); - - // calculate start ts - taosArrayPush(pBlock->pDataBlock, &infoData); - // calculate end ts - taosArrayPush(pBlock->pDataBlock, &infoData); - - return pBlock; -} - SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild) { SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode; @@ -3709,7 +3693,8 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh createOperatorFpSet(operatorDummyOpenFn, doStreamSessionAgg, NULL, NULL, destroyStreamSessionAggOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL); if (downstream) { - initDownStream(downstream, &pInfo->streamAggSup, pInfo->gap, pInfo->twAggSup.waterMark, pOperator->operatorType, pInfo->primaryTsIndex); + initDownStream(downstream, &pInfo->streamAggSup, pInfo->gap, pInfo->twAggSup.waterMark, pOperator->operatorType, + pInfo->primaryTsIndex); code = appendDownstream(pOperator, &downstream, 1); } return pOperator; @@ -3740,12 +3725,14 @@ bool isInTimeWindow(STimeWindow* pWin, TSKEY ts, int64_t gap) { bool isInWindow(SResultWindowInfo* pWinInfo, TSKEY ts, int64_t gap) { return isInTimeWindow(&pWinInfo->win, ts, gap); } static SResultWindowInfo* insertNewSessionWindow(SArray* pWinInfos, TSKEY startTs, TSKEY endTs, int32_t index) { - SResultWindowInfo win = {.pos.offset = -1, .pos.pageId = -1, .win.skey = startTs, .win.ekey = endTs, .isOutput = false}; + SResultWindowInfo win = { + .pos.offset = -1, .pos.pageId = -1, .win.skey = startTs, .win.ekey = endTs, .isOutput = false}; return taosArrayInsert(pWinInfos, index, &win); } static SResultWindowInfo* addNewSessionWindow(SArray* pWinInfos, TSKEY startTs, TSKEY endTs) { - SResultWindowInfo win = {.pos.offset = -1, .pos.pageId = -1, .win.skey = startTs, .win.ekey = endTs, .isOutput = false}; + SResultWindowInfo win = { + .pos.offset = -1, .pos.pageId = -1, .win.skey = startTs, .win.ekey = endTs, .isOutput = false}; return taosArrayPush(pWinInfos, &win); } @@ -4147,8 +4134,8 @@ void doBuildDeleteDataBlock(SHashObj* pStDeleted, SSDataBlock* pBlock, void** It } } -static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWinArray, - int32_t numOfOutput, SOperatorInfo* pOperator, SHashObj* pStUpdated, bool needCreate) { +static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWinArray, int32_t numOfOutput, + SOperatorInfo* pOperator, SHashObj* pStUpdated, bool needCreate) { SExprSupp* pSup = &pOperator->exprSupp; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -4161,7 +4148,8 @@ static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWin uint64_t groupId = pParentWin->groupId; int32_t winIndex = 0; if (needCreate) { - pParentWin = getSessionTimeWindow(&pInfo->streamAggSup, pParentWin->win.skey, pParentWin->win.ekey, groupId, 0, &winIndex); + pParentWin = + getSessionTimeWindow(&pInfo->streamAggSup, pParentWin->win.skey, pParentWin->win.ekey, groupId, 0, &winIndex); } setWindowOutputBuf(pParentWin, &pCurResult, pSup->pCtx, groupId, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->streamAggSup, pTaskInfo); @@ -4292,9 +4280,9 @@ static void removeSessionResults(SHashObj* pHashMap, SArray* pWins) { } int32_t compareWinKey(void* pKey, void* data, int32_t index) { - SArray* res = (SArray*)data; + SArray* res = (SArray*)data; SResKeyPos* pos = taosArrayGetP(res, index); - SWinKey* pData = (SWinKey*)pKey; + SWinKey* pData = (SWinKey*)pKey; if (pData->ts == *(int64_t*)pos->key) { if (pData->groupId > pos->groupId) { return 1; @@ -4317,7 +4305,7 @@ static void removeSessionDeleteResults(SArray* update, SHashObj* pStDeleted) { int32_t num = taosArrayGetSize(update); for (int32_t i = 0; i < num; i++) { SResKeyPos* pos = taosArrayGetP(update, i); - SWinKey winKey = {.ts = *(int64_t*)pos->key, .groupId = pos->groupId}; + SWinKey winKey = {.ts = *(int64_t*)pos->key, .groupId = pos->groupId}; taosHashRemove(pStDeleted, &winKey, sizeof(SWinKey)); } } @@ -4346,7 +4334,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY); SHashObj* pStUpdated = taosHashInit(64, hashFn, true, HASH_NO_LOCK); SOperatorInfo* downstream = pOperator->pDownstream[0]; - SArray* pUpdated = taosArrayInit(16, POINTER_BYTES); // SResKeyPos + SArray* pUpdated = taosArrayInit(16, POINTER_BYTES); // SResKeyPos while (1) { SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); if (pBlock == NULL) { @@ -4362,8 +4350,8 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { int32_t childIndex = getChildIndex(pBlock); SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); SStreamSessionAggOperatorInfo* pChildInfo = pChildOp->info; - doClearSessionWindows(&pChildInfo->streamAggSup, &pChildOp->exprSupp, pBlock, START_TS_COLUMN_INDEX, pChildOp->exprSupp.numOfExprs, - 0, NULL); + doClearSessionWindows(&pChildInfo->streamAggSup, &pChildOp->exprSupp, pBlock, START_TS_COLUMN_INDEX, + pChildOp->exprSupp.numOfExprs, 0, NULL); rebuildTimeWindow(pInfo, pWins, pOperator->exprSupp.numOfExprs, pOperator, NULL, false); } taosArrayDestroy(pWins); @@ -4464,7 +4452,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { if (pOperator->status == OP_EXEC_DONE) { return NULL; } - + { doBuildResultDatablock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); if (pBInfo->pRes->info.rows > 0) { @@ -4486,6 +4474,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { } if (pOperator->status == OP_RES_TO_RETURN) { + clearFunctionContext(&pOperator->exprSupp); // semi interval operator clear disk buffer clearStreamSessionOperator(pInfo); pOperator->status = OP_EXEC_DONE; @@ -4856,8 +4845,7 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl i, &allEqual, pStDeleted); if (!allEqual) { uint64_t uid = 0; - appendOneRow(pAggSup->pScanBlock, &pCurWin->winInfo.win.skey, &pCurWin->winInfo.win.ekey, - &uid, &groupId); + appendOneRow(pAggSup->pScanBlock, &pCurWin->winInfo.win.skey, &pCurWin->winInfo.win.ekey, &uid, &groupId); taosHashRemove(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition)); deleteWindow(pAggSup->pCurWins, winIndex, destroyStateWinInfo); continue; @@ -4886,7 +4874,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { SExprSupp* pSup = &pOperator->exprSupp; SStreamStateAggOperatorInfo* pInfo = pOperator->info; SOptrBasicInfo* pBInfo = &pInfo->binfo; - int64_t maxTs = INT64_MIN; + int64_t maxTs = INT64_MIN; if (pOperator->status == OP_RES_TO_RETURN) { doBuildDeleteDataBlock(pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator); if (pInfo->pDelRes->info.rows > 0) { @@ -5035,7 +5023,8 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys pOperator->info = pInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamStateAgg, NULL, NULL, destroyStreamStateOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL); - initDownStream(downstream, &pInfo->streamAggSup, 0, pInfo->twAggSup.waterMark, pOperator->operatorType, pInfo->primaryTsIndex); + initDownStream(downstream, &pInfo->streamAggSup, 0, pInfo->twAggSup.waterMark, pOperator->operatorType, + pInfo->primaryTsIndex); code = appendDownstream(pOperator, &downstream, 1); if (code != TSDB_CODE_SUCCESS) { goto _error; @@ -5064,8 +5053,8 @@ static int32_t outputMergeAlignedIntervalResult(SOperatorInfo* pOperatorInfo, ui SExprSupp* pSup = &pOperatorInfo->exprSupp; SET_RES_WINDOW_KEY(iaInfo->aggSup.keyBuf, &wstartTs, TSDB_KEYSIZE, tableGroupId); - SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet(iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf, - GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE)); + SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet( + iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf, GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE)); ASSERT(p1 != NULL); finalizeResultRowIntoResultDataBlock(iaInfo->aggSup.pResultBuf, p1, pSup->pCtx, pSup->pExprInfo, pSup->numOfExprs, @@ -5274,11 +5263,11 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SExprSupp* pSup = &pOperator->exprSupp; miaInfo->pCondition = pNode->window.node.pConditions; - miaInfo->curTs = INT64_MIN; - iaInfo->win = pTaskInfo->window; - iaInfo->inputOrder = TSDB_ORDER_ASC; - iaInfo->interval = interval; - iaInfo->execModel = pTaskInfo->execModel; + miaInfo->curTs = INT64_MIN; + iaInfo->win = pTaskInfo->window; + iaInfo->inputOrder = TSDB_ORDER_ASC; + iaInfo->interval = interval; + iaInfo->execModel = pTaskInfo->execModel; iaInfo->primaryTsIndex = ((SColumnNode*)pNode->window.pTspk)->slotId; iaInfo->binfo.mergeResultBlock = pNode->window.mergeDataBlock; @@ -5301,12 +5290,12 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, initResultRowInfo(&iaInfo->binfo.resultRowInfo); blockDataEnsureCapacity(iaInfo->binfo.pRes, pOperator->resultInfo.capacity); - pOperator->name = "TimeMergeAlignedIntervalAggOperator"; + pOperator->name = "TimeMergeAlignedIntervalAggOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL; - pOperator->blocking = false; - pOperator->status = OP_NOT_OPENED; - pOperator->pTaskInfo = pTaskInfo; - pOperator->info = miaInfo; + pOperator->blocking = false; + pOperator->status = OP_NOT_OPENED; + pOperator->pTaskInfo = pTaskInfo; + pOperator->info = miaInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, mergeAlignedIntervalAgg, NULL, NULL, destroyMergeAlignedIntervalOperatorInfo, NULL, NULL, NULL); @@ -5359,8 +5348,8 @@ static int32_t finalizeWindowResult(SOperatorInfo* pOperatorInfo, uint64_t table SExprSupp* pExprSup = &pOperatorInfo->exprSupp; SET_RES_WINDOW_KEY(iaInfo->aggSup.keyBuf, &win->skey, TSDB_KEYSIZE, tableGroupId); - SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet(iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf, - GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE)); + SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet( + iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf, GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE)); ASSERT(p1 != NULL); finalizeResultRowIntoResultDataBlock(iaInfo->aggSup.pResultBuf, p1, pExprSup->pCtx, pExprSup->pExprInfo, pExprSup->numOfExprs, pExprSup->rowEntryInfoOffset, pResultBlock, pTaskInfo); @@ -5585,10 +5574,10 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge pMergeIntervalInfo->groupIntervals = tdListNew(sizeof(SGroupTimeWindow)); SIntervalAggOperatorInfo* pIntervalInfo = &pMergeIntervalInfo->intervalAggOperatorInfo; - pIntervalInfo->win = pTaskInfo->window; + pIntervalInfo->win = pTaskInfo->window; pIntervalInfo->inputOrder = TSDB_ORDER_ASC; - pIntervalInfo->interval = interval; - pIntervalInfo->execModel = pTaskInfo->execModel; + pIntervalInfo->interval = interval; + pIntervalInfo->execModel = pTaskInfo->execModel; pIntervalInfo->binfo.mergeResultBlock = pIntervalPhyNode->window.mergeDataBlock; pIntervalInfo->primaryTsIndex = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId; @@ -5605,7 +5594,6 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge initBasicInfo(&pIntervalInfo->binfo, pResBlock); initExecTimeWindowInfo(&pIntervalInfo->twAggSup.timeWindowData, &pIntervalInfo->win); - pIntervalInfo->timeWindowInterpo = timeWindowinterpNeeded(pExprSupp->pCtx, num, pIntervalInfo); if (pIntervalInfo->timeWindowInterpo) { pIntervalInfo->binfo.resultRowInfo.openWindow = tdListNew(sizeof(SOpenWindowInfo)); @@ -5616,12 +5604,12 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge initResultRowInfo(&pIntervalInfo->binfo.resultRowInfo); - pOperator->name = "TimeMergeIntervalAggOperator"; + pOperator->name = "TimeMergeIntervalAggOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL; - pOperator->blocking = false; - pOperator->status = OP_NOT_OPENED; - pOperator->pTaskInfo = pTaskInfo; - pOperator->info = pMergeIntervalInfo; + pOperator->blocking = false; + pOperator->status = OP_NOT_OPENED; + pOperator->pTaskInfo = pTaskInfo; + pOperator->info = pMergeIntervalInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doMergeIntervalAgg, NULL, NULL, destroyMergeIntervalOperatorInfo, NULL, NULL, NULL); diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index 168cd21c44..63fc9d9e1c 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -227,9 +227,9 @@ static int32_t sortComparInit(SMsortComparParam* cmpParam, SArray* pSources, int continue; } - SPageInfo* pPgInfo = *(SPageInfo**)taosArrayGet(pSource->pageIdList, pSource->pageIndex); + int32_t* pPgId = taosArrayGet(pSource->pageIdList, pSource->pageIndex); - void* pPage = getBufPage(pHandle->pBuf, getPageId(pPgInfo)); + void* pPage = getBufPage(pHandle->pBuf, *pPgId); code = blockDataFromBuf(pSource->src.pBlock, pPage); if (code != TSDB_CODE_SUCCESS) { return code; @@ -302,9 +302,9 @@ static int32_t adjustMergeTreeForNextTuple(SSortSource *pSource, SMultiwayMergeT pSource->pageIndex = -1; pSource->src.pBlock = blockDataDestroy(pSource->src.pBlock); } else { - SPageInfo* pPgInfo = *(SPageInfo**)taosArrayGet(pSource->pageIdList, pSource->pageIndex); + int32_t* pPgId = taosArrayGet(pSource->pageIdList, pSource->pageIndex); - void* pPage = getBufPage(pHandle->pBuf, getPageId(pPgInfo)); + void* pPage = getBufPage(pHandle->pBuf, *pPgId); int32_t code = blockDataFromBuf(pSource->src.pBlock, pPage); if (code != TSDB_CODE_SUCCESS) { return code; diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index 7160541c13..dcf58759b0 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -76,11 +76,11 @@ typedef struct STopBotResItem { } STopBotResItem; typedef struct STopBotRes { - int32_t maxSize; - int16_t type; + int32_t maxSize; + int16_t type; - STuplePos nullTuplePos; - bool nullTupleSaved; + STuplePos nullTuplePos; + bool nullTupleSaved; STopBotResItem* pItems; } STopBotRes; @@ -223,14 +223,14 @@ typedef struct SMavgInfo { } SMavgInfo; typedef struct SSampleInfo { - int32_t samples; - int32_t totalPoints; - int32_t numSampled; - uint8_t colType; - int16_t colBytes; + int32_t samples; + int32_t totalPoints; + int32_t numSampled; + uint8_t colType; + int16_t colBytes; - STuplePos nullTuplePos; - bool nullTupleSaved; + STuplePos nullTuplePos; + bool nullTupleSaved; char* data; STuplePos* tuplePos; @@ -1147,7 +1147,7 @@ bool getMinmaxFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) { } static STuplePos saveTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock); -static int32_t updateTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos); +static int32_t updateTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos); static const char* loadTupleData(SqlFunctionCtx* pCtx, const STuplePos* pPos); static int32_t findRowIndex(int32_t start, int32_t num, SColumnInfoData* pCol, const char* tval) { @@ -1357,8 +1357,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { numOfElems += 1; } - } else if (type == TSDB_DATA_TYPE_BIGINT || - type == TSDB_DATA_TYPE_TIMESTAMP) { + } else if (type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_TIMESTAMP) { int64_t* pData = (int64_t*)pCol->pData; int64_t* val = (int64_t*)&pBuf->v; @@ -1581,7 +1580,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) { } _min_max_over: - if (numOfElems == 0 && pCtx->subsidiaries.num > 0 && !pBuf->nullTupleSaved ) { + if (numOfElems == 0 && pCtx->subsidiaries.num > 0 && !pBuf->nullTupleSaved) { pBuf->nullTuplePos = saveTupleData(pCtx, pInput->startRowIndex, pCtx->pSrcBlock); pBuf->nullTupleSaved = true; } @@ -1601,7 +1600,8 @@ int32_t maxFunction(SqlFunctionCtx* pCtx) { } static void setNullSelectivityValue(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t rowIndex); -static void setSelectivityValue(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, const STuplePos* pTuplePos, int32_t rowIndex); +static void setSelectivityValue(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, const STuplePos* pTuplePos, + int32_t rowIndex); int32_t minmaxFunctionFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { SResultRowEntryInfo* pEntryInfo = GET_RES_INFO(pCtx); @@ -1651,7 +1651,7 @@ void setSelectivityValue(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, const STuple if (pCtx->saveHandle.pBuf != NULL) { if (pTuplePos->pageId != -1) { - int32_t numOfCols = pCtx->subsidiaries.num; + int32_t numOfCols = pCtx->subsidiaries.num; const char* p = loadTupleData(pCtx, pTuplePos); bool* nullList = (bool*)p; @@ -1660,7 +1660,7 @@ void setSelectivityValue(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, const STuple // todo set the offset value to optimize the performance. for (int32_t j = 0; j < numOfCols; ++j) { SqlFunctionCtx* pc = pCtx->subsidiaries.pCtx[j]; - int32_t dstSlotId = pc->pExpr->base.resSchema.slotId; + int32_t dstSlotId = pc->pExpr->base.resSchema.slotId; SColumnInfoData* pDstCol = taosArrayGet(pBlock->pDataBlock, dstSlotId); ASSERT(pc->pExpr->base.resSchema.bytes == pDstCol->info.bytes); @@ -1701,7 +1701,7 @@ void appendSelectivityValue(SqlFunctionCtx* pCtx, int32_t rowIndex, int32_t pos) char* pData = colDataGetData(pSrcCol, rowIndex); // append to dest col - int32_t dstSlotId = pc->pExpr->base.resSchema.slotId; + int32_t dstSlotId = pc->pExpr->base.resSchema.slotId; SColumnInfoData* pDstCol = taosArrayGet(pCtx->pDstBlock->pDataBlock, dstSlotId); ASSERT(pc->pExpr->base.resSchema.bytes == pDstCol->info.bytes); @@ -1712,7 +1712,6 @@ void appendSelectivityValue(SqlFunctionCtx* pCtx, int32_t rowIndex, int32_t pos) colDataAppend(pDstCol, pos, pData, false); } } - } void replaceTupleData(STuplePos* pDestPos, STuplePos* pSourcePos) { @@ -2590,8 +2589,8 @@ static void apercentileTransferInfo(SAPercentileInfo* pInput, SAPercentileInfo* memcpy(pHisto, pInput->pHisto, sizeof(SHistogramInfo) + sizeof(SHistBin) * (MAX_HISTOGRAM_BIN + 1)); pHisto->elems = (SHistBin*)((char*)pHisto + sizeof(SHistogramInfo)); - qDebug("%s merge histo, total:%" PRId64 ", entry:%d, %p", __FUNCTION__, pHisto->numOfElems, - pHisto->numOfEntries, pHisto); + qDebug("%s merge histo, total:%" PRId64 ", entry:%d, %p", __FUNCTION__, pHisto->numOfElems, pHisto->numOfEntries, + pHisto); } else { pHisto->elems = (SHistBin*)((char*)pHisto + sizeof(SHistogramInfo)); qDebug("%s input histogram, elem:%" PRId64 ", entry:%d, %p", __FUNCTION__, pHisto->numOfElems, @@ -2601,8 +2600,8 @@ static void apercentileTransferInfo(SAPercentileInfo* pInput, SAPercentileInfo* memcpy(pHisto, pRes, sizeof(SHistogramInfo) + sizeof(SHistBin) * MAX_HISTOGRAM_BIN); pHisto->elems = (SHistBin*)((char*)pHisto + sizeof(SHistogramInfo)); - qDebug("%s merge histo, total:%" PRId64 ", entry:%d, %p", __FUNCTION__, pHisto->numOfElems, - pHisto->numOfEntries, pHisto); + qDebug("%s merge histo, total:%" PRId64 ", entry:%d, %p", __FUNCTION__, pHisto->numOfElems, pHisto->numOfEntries, + pHisto); tHistogramDestroy(&pRes); } } @@ -2629,8 +2628,8 @@ int32_t apercentileFunctionMerge(SqlFunctionCtx* pCtx) { } if (pInfo->algo != APERCT_ALGO_TDIGEST) { - qDebug("%s after merge, total:%d, numOfEntry:%d, %p", __FUNCTION__, pInfo->pHisto->numOfElems, pInfo->pHisto->numOfEntries, - pInfo->pHisto); + qDebug("%s after merge, total:%d, numOfEntry:%d, %p", __FUNCTION__, pInfo->pHisto->numOfElems, + pInfo->pHisto->numOfEntries, pInfo->pHisto); } SET_VAL(pResInfo, 1, 1); @@ -2709,7 +2708,7 @@ int32_t apercentileCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) } EFuncDataRequired lastDynDataReq(void* pRes, STimeWindow* pTimeWindow) { - SResultRowEntryInfo* pEntry = (SResultRowEntryInfo*) pRes; + SResultRowEntryInfo* pEntry = (SResultRowEntryInfo*)pRes; // not initialized yet, data is required if (pEntry == NULL) { @@ -2752,7 +2751,8 @@ static FORCE_INLINE TSKEY getRowPTs(SColumnInfoData* pTsColInfo, int32_t rowInde return *(TSKEY*)colDataGetData(pTsColInfo, rowIndex); } -static void firstlastSaveTupleData(const SSDataBlock* pSrcBlock, int32_t rowIndex, SqlFunctionCtx* pCtx, SFirstLastRes* pInfo) { +static void firstlastSaveTupleData(const SSDataBlock* pSrcBlock, int32_t rowIndex, SqlFunctionCtx* pCtx, + SFirstLastRes* pInfo) { if (pCtx->subsidiaries.num <= 0) { return; } @@ -3176,7 +3176,7 @@ bool diffFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) { static void doSetPrevVal(SDiffInfo* pDiffInfo, int32_t type, const char* pv) { switch (type) { case TSDB_DATA_TYPE_BOOL: - pDiffInfo->prev.i64 = *(bool*)pv? 1:0; + pDiffInfo->prev.i64 = *(bool*)pv ? 1 : 0; break; case TSDB_DATA_TYPE_TINYINT: pDiffInfo->prev.i64 = *(int8_t*)pv; @@ -3537,7 +3537,8 @@ void doAddIntoResult(SqlFunctionCtx* pCtx, void* pData, int32_t rowIndex, SSData * |(n columns, one bit for each column)| src column #1| src column #2| * +------------------------------------+--------------+--------------+ */ -void* serializeTupleData(const SSDataBlock* pSrcBlock, int32_t rowIndex, SSubsidiaryResInfo* pSubsidiaryies, char* buf) { +void* serializeTupleData(const SSDataBlock* pSrcBlock, int32_t rowIndex, SSubsidiaryResInfo* pSubsidiaryies, + char* buf) { char* nullList = buf; char* pStart = (char*)(nullList + sizeof(bool) * pSubsidiaryies->num); @@ -3585,7 +3586,7 @@ static STuplePos doSaveTupleData(SSerializeDataHandle* pHandle, const void* pBuf } } - p = (STuplePos) {.pageId = pHandle->currentPage, .offset = pPage->num}; + p = (STuplePos){.pageId = pHandle->currentPage, .offset = pPage->num}; memcpy(pPage->data + pPage->num, pBuf, length); pPage->num += length; @@ -3621,7 +3622,6 @@ static int32_t doUpdateTupleData(SSerializeDataHandle* pHandle, const void* pBuf setBufPageDirty(pPage, true); releaseBufPage(pHandle->pBuf, pPage); } else { - } return TSDB_CODE_SUCCESS; @@ -3636,7 +3636,7 @@ static int32_t updateTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSD static char* doLoadTupleData(SSerializeDataHandle* pHandle, const STuplePos* pPos) { if (pHandle->pBuf != NULL) { SFilePage* pPage = getBufPage(pHandle->pBuf, pPos->pageId); - char* p = pPage->data + pPos->offset; + char* p = pPage->data + pPos->offset; releaseBufPage(pHandle->pBuf, pPage); return p; } else { @@ -3980,8 +3980,8 @@ int32_t elapsedFunction(SqlFunctionCtx* pCtx) { } if (pCtx->end.key == INT64_MIN) { - pInfo->min = (pInfo->min > ptsList[start + pInput->numOfRows - 1]) ? - ptsList[start + pInput->numOfRows - 1] : pInfo->min; + pInfo->min = + (pInfo->min > ptsList[start + pInput->numOfRows - 1]) ? ptsList[start + pInput->numOfRows - 1] : pInfo->min; } else { pInfo->min = pCtx->end.key; } @@ -3993,8 +3993,8 @@ int32_t elapsedFunction(SqlFunctionCtx* pCtx) { } if (pCtx->end.key == INT64_MIN) { - pInfo->max = (pInfo->max < ptsList[start + pInput->numOfRows - 1]) ? - ptsList[start + pInput->numOfRows - 1] : pInfo->max; + pInfo->max = + (pInfo->max < ptsList[start + pInput->numOfRows - 1]) ? ptsList[start + pInput->numOfRows - 1] : pInfo->max; } else { pInfo->max = pCtx->end.key + 1; } diff --git a/source/libs/monitor/src/monMsg.c b/source/libs/monitor/src/monMsg.c index 8fa7e88605..bbee8b1166 100644 --- a/source/libs/monitor/src/monMsg.c +++ b/source/libs/monitor/src/monMsg.c @@ -510,6 +510,7 @@ int32_t tSerializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo) SVnodeLoad *pLoad = taosArrayGet(pInfo->pVloads, i); if (tEncodeI32(&encoder, pLoad->vgId) < 0) return -1; if (tEncodeI32(&encoder, pLoad->syncState) < 0) return -1; + if (tEncodeI64(&encoder, pLoad->cacheUsage) < 0) return -1; if (tEncodeI64(&encoder, pLoad->numOfTables) < 0) return -1; if (tEncodeI64(&encoder, pLoad->numOfTimeSeries) < 0) return -1; if (tEncodeI64(&encoder, pLoad->totalStorage) < 0) return -1; @@ -544,6 +545,7 @@ int32_t tDeserializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInf SVnodeLoad load = {0}; if (tDecodeI32(&decoder, &load.vgId) < 0) return -1; if (tDecodeI32(&decoder, &load.syncState) < 0) return -1; + if (tDecodeI64(&decoder, &load.cacheUsage) < 0) return -1; if (tDecodeI64(&decoder, &load.numOfTables) < 0) return -1; if (tDecodeI64(&decoder, &load.numOfTimeSeries) < 0) return -1; if (tDecodeI64(&decoder, &load.totalStorage) < 0) return -1; @@ -594,7 +596,6 @@ int32_t tDeserializeSMonMloadInfo(void *buf, int32_t bufLen, SMonMloadInfo *pInf return 0; } - int32_t tSerializeSQnodeLoad(void *buf, int32_t bufLen, SQnodeLoad *pInfo) { SEncoder encoder = {0}; tEncoderInit(&encoder, buf, bufLen); @@ -639,5 +640,3 @@ int32_t tDeserializeSQnodeLoad(void *buf, int32_t bufLen, SQnodeLoad *pInfo) { tDecoderClear(&decoder); return 0; } - - diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index eab2d40164..0507fe0c66 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -60,7 +60,9 @@ typedef enum EDatabaseOptionType { DB_OPTION_WAL_RETENTION_SIZE, DB_OPTION_WAL_ROLL_PERIOD, DB_OPTION_WAL_SEGMENT_SIZE, - DB_OPTION_SST_TRIGGER + DB_OPTION_SST_TRIGGER, + DB_OPTION_TABLE_PREFIX, + DB_OPTION_TABLE_SUFFIX } EDatabaseOptionType; typedef enum ETableOptionType { diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index cfa3379e28..fdd0ec548b 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -208,6 +208,8 @@ db_options(A) ::= db_options(B) WAL_RETENTION_SIZE NK_MINUS(D) NK_INTEGER(C). db_options(A) ::= db_options(B) WAL_ROLL_PERIOD NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_ROLL_PERIOD, &C); } db_options(A) ::= db_options(B) WAL_SEGMENT_SIZE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_SEGMENT_SIZE, &C); } db_options(A) ::= db_options(B) SST_TRIGGER NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SST_TRIGGER, &C); } +db_options(A) ::= db_options(B) TABLE_PREFIX NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_TABLE_PREFIX, &C); } +db_options(A) ::= db_options(B) TABLE_SUFFIX NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_TABLE_SUFFIX, &C); } alter_db_options(A) ::= alter_db_option(B). { A = createAlterDatabaseOptions(pCxt); A = setAlterDatabaseOption(pCxt, A, &B); } alter_db_options(A) ::= alter_db_options(B) alter_db_option(C). { A = setAlterDatabaseOption(pCxt, B, &C); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 92c6058f07..901abf17ee 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -836,6 +836,8 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) { updateWalOptionsDefault(pOptions); pOptions->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE; pOptions->sstTrigger = TSDB_DEFAULT_SST_TRIGGER; + pOptions->tablePrefix = TSDB_DEFAULT_HASH_PREFIX; + pOptions->tableSuffix = TSDB_DEFAULT_HASH_SUFFIX; return (SNode*)pOptions; } @@ -868,6 +870,8 @@ SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) { pOptions->walRollPeriod = -1; pOptions->walSegmentSize = -1; pOptions->sstTrigger = -1; + pOptions->tablePrefix = -1; + pOptions->tableSuffix = -1; return (SNode*)pOptions; } @@ -954,6 +958,12 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti case DB_OPTION_SST_TRIGGER: pDbOptions->sstTrigger = taosStr2Int32(((SToken*)pVal)->z, NULL, 10); break; + case DB_OPTION_TABLE_PREFIX: + pDbOptions->tablePrefix = taosStr2Int32(((SToken*)pVal)->z, NULL, 10); + break; + case DB_OPTION_TABLE_SUFFIX: + pDbOptions->tableSuffix = taosStr2Int32(((SToken*)pVal)->z, NULL, 10); + break; default: break; } diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index 750263215a..e0f54530dd 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -200,6 +200,8 @@ static SKeyword keywordTable[] = { {"SYSINFO", TK_SYSINFO}, {"TABLE", TK_TABLE}, {"TABLES", TK_TABLES}, + {"TABLE_PREFIX", TK_TABLE_PREFIX}, + {"TABLE_SUFFIX", TK_TABLE_SUFFIX}, {"TAG", TK_TAG}, {"TAGS", TK_TAGS}, {"TBNAME", TK_TBNAME}, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index c3db67668a..240aa0d6c0 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -3483,6 +3483,8 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS pReq->walRollPeriod = pStmt->pOptions->walRollPeriod; pReq->walSegmentSize = pStmt->pOptions->walSegmentSize; pReq->sstTrigger = pStmt->pOptions->sstTrigger; + pReq->hashPrefix = pStmt->pOptions->tablePrefix; + pReq->hashSuffix = pStmt->pOptions->tableSuffix; pReq->ignoreExist = pStmt->ignoreExists; return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq); } @@ -3770,6 +3772,12 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName if (TSDB_CODE_SUCCESS == code) { code = checkDbRangeOption(pCxt, "sstTrigger", pOptions->sstTrigger, TSDB_MIN_SST_TRIGGER, TSDB_MAX_SST_TRIGGER); } + if (TSDB_CODE_SUCCESS == code) { + code = checkDbRangeOption(pCxt, "tablePrefix", pOptions->tablePrefix, TSDB_MIN_HASH_PREFIX, TSDB_MAX_HASH_PREFIX); + } + if (TSDB_CODE_SUCCESS == code) { + code = checkDbRangeOption(pCxt, "tableSuffix", pOptions->tableSuffix, TSDB_MIN_HASH_SUFFIX, TSDB_MAX_HASH_SUFFIX); + } if (TSDB_CODE_SUCCESS == code) { code = checkOptionsDependency(pCxt, pDbName, pOptions); } @@ -5856,7 +5864,7 @@ static int32_t rewriteShowVnodes(STranslateContext* pCxt, SQuery* pQuery) { if (NULL != pShow->pDnodeId) { code = createOperatorNode(OP_TYPE_EQUAL, "dnode_id", pShow->pDnodeId, &pStmt->pWhere); } else { - code = createOperatorNode(OP_TYPE_EQUAL, "dnode_endpoint", pShow->pDnodeEndpoint, &pStmt->pWhere); + code = createOperatorNode(OP_TYPE_EQUAL, "dnode_ep", pShow->pDnodeEndpoint, &pStmt->pWhere); } } if (TSDB_CODE_SUCCESS == code) { diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index d54261f0cb..0442d262f1 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 427 +#define YYNOCODE 429 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - SAlterOption yy95; - EOperatorType yy198; - EOrder yy204; - int8_t yy215; - ENullOrder yy277; - bool yy313; - int64_t yy473; - SNodeList* yy544; - SToken yy617; - EJoinType yy708; - SDataType yy784; - EFillMode yy816; - SNode* yy840; - int32_t yy844; + int32_t yy46; + SNode* yy80; + int64_t yy129; + SDataType yy136; + EOperatorType yy194; + SToken yy239; + SAlterOption yy299; + EOrder yy422; + EFillMode yy426; + int8_t yy509; + SNodeList* yy574; + EJoinType yy750; + ENullOrder yy763; + bool yy845; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -139,17 +139,17 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 672 -#define YYNRULE 493 -#define YYNTOKEN 306 -#define YY_MAX_SHIFT 671 -#define YY_MIN_SHIFTREDUCE 979 -#define YY_MAX_SHIFTREDUCE 1471 -#define YY_ERROR_ACTION 1472 -#define YY_ACCEPT_ACTION 1473 -#define YY_NO_ACTION 1474 -#define YY_MIN_REDUCE 1475 -#define YY_MAX_REDUCE 1967 +#define YYNSTATE 674 +#define YYNRULE 495 +#define YYNTOKEN 308 +#define YY_MAX_SHIFT 673 +#define YY_MIN_SHIFTREDUCE 983 +#define YY_MAX_SHIFTREDUCE 1477 +#define YY_ERROR_ACTION 1478 +#define YY_ACCEPT_ACTION 1479 +#define YY_NO_ACTION 1480 +#define YY_MIN_REDUCE 1481 +#define YY_MAX_REDUCE 1975 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -216,692 +216,680 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2522) +#define YY_ACTTAB_COUNT (2464) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 517, 1801, 436, 530, 437, 1510, 379, 326, 1720, 64, - /* 10 */ 1717, 553, 39, 37, 117, 1606, 444, 553, 437, 1510, - /* 20 */ 340, 474, 1272, 1475, 40, 38, 36, 35, 34, 1819, - /* 30 */ 530, 1617, 530, 1348, 1029, 1270, 1028, 582, 553, 127, - /* 40 */ 556, 55, 1771, 169, 581, 127, 1945, 116, 115, 114, - /* 50 */ 113, 112, 111, 110, 109, 108, 1343, 558, 1617, 164, - /* 60 */ 1617, 14, 327, 1942, 1030, 558, 127, 1833, 1278, 1537, - /* 70 */ 146, 94, 1802, 584, 1804, 1805, 580, 125, 575, 1619, - /* 80 */ 148, 1879, 1487, 125, 1498, 306, 1875, 1298, 1012, 1281, - /* 90 */ 1, 555, 160, 1887, 1888, 63, 1892, 1945, 250, 1887, - /* 100 */ 552, 1669, 551, 345, 125, 1945, 1662, 1664, 328, 150, - /* 110 */ 166, 1595, 668, 1576, 1942, 453, 1819, 1667, 166, 161, - /* 120 */ 1887, 1888, 1942, 1892, 546, 1771, 1350, 1351, 1016, 1017, - /* 130 */ 30, 260, 645, 644, 643, 642, 350, 1476, 641, 640, - /* 140 */ 128, 635, 634, 633, 632, 631, 630, 629, 139, 625, - /* 150 */ 624, 623, 349, 348, 620, 619, 618, 628, 107, 1589, - /* 160 */ 545, 106, 105, 104, 103, 102, 101, 100, 99, 98, - /* 170 */ 556, 453, 1273, 1894, 1271, 1127, 606, 605, 604, 1131, - /* 180 */ 603, 1133, 1134, 602, 1136, 599, 542, 1142, 596, 1144, - /* 190 */ 1145, 593, 590, 1169, 1170, 1276, 1277, 1891, 1325, 1326, - /* 200 */ 1328, 1329, 1330, 1331, 1332, 1333, 577, 573, 1341, 1342, - /* 210 */ 1344, 1345, 1346, 1347, 1349, 1352, 39, 37, 1411, 1945, - /* 220 */ 1789, 302, 158, 1295, 340, 1801, 1272, 222, 1284, 167, - /* 230 */ 415, 1785, 1944, 427, 167, 1656, 1942, 1348, 107, 1270, - /* 240 */ 43, 106, 105, 104, 103, 102, 101, 100, 99, 98, - /* 250 */ 400, 556, 428, 1819, 402, 1781, 1787, 329, 74, 1297, - /* 260 */ 1343, 582, 1298, 548, 543, 14, 1771, 575, 581, 33, - /* 270 */ 32, 122, 1278, 40, 38, 36, 35, 34, 33, 32, - /* 280 */ 1612, 217, 40, 38, 36, 35, 34, 1252, 1253, 1297, - /* 290 */ 1945, 1833, 393, 91, 2, 95, 1802, 584, 1804, 1805, - /* 300 */ 580, 63, 575, 165, 389, 1879, 124, 1942, 547, 331, - /* 310 */ 1875, 1958, 1663, 1664, 1609, 63, 668, 78, 33, 32, - /* 320 */ 1913, 42, 40, 38, 36, 35, 34, 441, 1432, 63, - /* 330 */ 1350, 1351, 426, 1295, 63, 421, 420, 419, 418, 417, - /* 340 */ 414, 413, 412, 411, 410, 406, 405, 404, 403, 397, - /* 350 */ 396, 395, 394, 22, 391, 390, 314, 483, 482, 33, - /* 360 */ 32, 1442, 61, 40, 38, 36, 35, 34, 1029, 530, - /* 370 */ 1028, 539, 1430, 1431, 1433, 1434, 1273, 1710, 1271, 26, - /* 380 */ 117, 1296, 378, 472, 377, 33, 32, 479, 172, 40, - /* 390 */ 38, 36, 35, 34, 223, 224, 553, 1617, 1030, 1276, - /* 400 */ 1277, 173, 1325, 1326, 1328, 1329, 1330, 1331, 1332, 1333, - /* 410 */ 577, 573, 1341, 1342, 1344, 1345, 1346, 1347, 1349, 1352, - /* 420 */ 39, 37, 1801, 491, 127, 1468, 615, 609, 340, 1593, - /* 430 */ 1272, 36, 35, 34, 71, 1894, 435, 70, 501, 439, - /* 440 */ 167, 1348, 1422, 1270, 1801, 137, 136, 612, 611, 610, - /* 450 */ 1819, 422, 209, 305, 167, 1415, 520, 49, 582, 1890, - /* 460 */ 167, 1297, 125, 1771, 1343, 581, 494, 1669, 167, 14, - /* 470 */ 488, 500, 1819, 167, 344, 208, 1278, 162, 1887, 1888, - /* 480 */ 582, 1892, 1473, 1667, 498, 1771, 496, 581, 1833, 617, - /* 490 */ 1789, 1758, 96, 1802, 584, 1804, 1805, 580, 2, 575, - /* 500 */ 558, 1785, 1879, 617, 177, 176, 1878, 1875, 58, 1089, - /* 510 */ 1833, 57, 1467, 374, 94, 1802, 584, 1804, 1805, 580, - /* 520 */ 668, 575, 343, 1602, 1879, 1781, 1787, 335, 306, 1875, - /* 530 */ 146, 1497, 376, 372, 1350, 1351, 385, 575, 362, 1619, - /* 540 */ 1945, 355, 1091, 1278, 33, 32, 1945, 74, 40, 38, - /* 550 */ 36, 35, 34, 164, 28, 443, 1358, 1942, 439, 1943, - /* 560 */ 33, 32, 1297, 1942, 40, 38, 36, 35, 34, 1613, - /* 570 */ 33, 32, 1771, 303, 40, 38, 36, 35, 34, 1299, - /* 580 */ 1273, 1945, 1271, 33, 32, 11, 10, 40, 38, 36, - /* 590 */ 35, 34, 317, 627, 164, 1496, 167, 307, 1942, 516, - /* 600 */ 1495, 562, 210, 1276, 1277, 560, 1325, 1326, 1328, 1329, - /* 610 */ 1330, 1331, 1332, 1333, 577, 573, 1341, 1342, 1344, 1345, - /* 620 */ 1346, 1347, 1349, 1352, 39, 37, 1801, 1310, 1604, 346, - /* 630 */ 1272, 353, 340, 1372, 1272, 1370, 1771, 146, 1710, 1945, - /* 640 */ 1327, 1771, 1801, 1270, 1594, 1348, 1619, 1270, 318, 175, - /* 650 */ 316, 315, 164, 476, 1819, 255, 1942, 478, 1669, 76, - /* 660 */ 305, 530, 582, 520, 639, 637, 1310, 1771, 1343, 581, - /* 670 */ 1819, 1945, 383, 84, 1668, 1384, 1278, 1592, 557, 477, - /* 680 */ 1278, 517, 1494, 1771, 164, 581, 1016, 1017, 1942, 1617, - /* 690 */ 1371, 1718, 1833, 1600, 1610, 27, 96, 1802, 584, 1804, - /* 700 */ 1805, 580, 8, 575, 1493, 1377, 1879, 1540, 1833, 1492, - /* 710 */ 569, 1875, 95, 1802, 584, 1804, 1805, 580, 252, 575, - /* 720 */ 668, 145, 1879, 1771, 668, 1300, 331, 1875, 159, 33, - /* 730 */ 32, 7, 1491, 40, 38, 36, 35, 34, 1350, 1351, - /* 740 */ 163, 1327, 146, 1408, 1490, 1771, 615, 1716, 1905, 300, - /* 750 */ 1771, 1620, 29, 338, 1365, 1366, 1367, 1368, 1369, 1373, - /* 760 */ 1374, 1375, 1376, 530, 1489, 137, 136, 612, 611, 610, - /* 770 */ 1297, 486, 485, 1771, 384, 1715, 1669, 300, 123, 615, - /* 780 */ 1273, 509, 1271, 312, 1273, 1771, 1271, 90, 481, 484, - /* 790 */ 1486, 1617, 1667, 1485, 480, 1899, 1404, 87, 137, 136, - /* 800 */ 612, 611, 610, 1276, 1277, 1771, 563, 1276, 1277, 1484, - /* 810 */ 1325, 1326, 1328, 1329, 1330, 1331, 1332, 1333, 577, 573, - /* 820 */ 1341, 1342, 1344, 1345, 1346, 1347, 1349, 1352, 39, 37, - /* 830 */ 1353, 1771, 1483, 213, 1771, 1894, 340, 530, 1272, 1801, - /* 840 */ 565, 167, 1608, 530, 1945, 486, 485, 352, 392, 1348, - /* 850 */ 1771, 1270, 123, 1785, 407, 1790, 1482, 165, 530, 1889, - /* 860 */ 1801, 1942, 481, 484, 232, 1617, 1785, 1819, 480, 408, - /* 870 */ 530, 1617, 1343, 1771, 1481, 557, 1480, 1781, 1787, 1488, - /* 880 */ 1771, 451, 581, 1577, 1278, 540, 1617, 1945, 1819, 575, - /* 890 */ 1781, 1787, 613, 44, 4, 1660, 579, 1771, 1617, 1479, - /* 900 */ 164, 1771, 575, 581, 1942, 1833, 9, 1478, 576, 95, - /* 910 */ 1802, 584, 1804, 1805, 580, 1771, 575, 1771, 614, 1879, - /* 920 */ 1404, 1660, 471, 331, 1875, 159, 1833, 1801, 668, 478, - /* 930 */ 293, 1802, 584, 1804, 1805, 580, 578, 575, 572, 1851, - /* 940 */ 1771, 272, 1350, 1351, 1647, 1906, 244, 135, 1771, 1327, - /* 950 */ 530, 477, 33, 32, 386, 1819, 40, 38, 36, 35, - /* 960 */ 34, 452, 201, 582, 608, 199, 530, 387, 1771, 1407, - /* 970 */ 581, 203, 1820, 205, 202, 530, 204, 1614, 1617, 207, - /* 980 */ 351, 530, 206, 53, 513, 530, 503, 571, 1273, 1280, - /* 990 */ 1271, 1511, 510, 1833, 1617, 54, 514, 289, 1802, 584, - /* 1000 */ 1804, 1805, 580, 1617, 575, 307, 11, 10, 1801, 1617, - /* 1010 */ 502, 1276, 1277, 1617, 1325, 1326, 1328, 1329, 1330, 1331, - /* 1020 */ 1332, 1333, 577, 573, 1341, 1342, 1344, 1345, 1346, 1347, - /* 1030 */ 1349, 1352, 39, 37, 1801, 549, 1819, 530, 1527, 1522, - /* 1040 */ 340, 1516, 1272, 1370, 582, 530, 1520, 566, 227, 1771, - /* 1050 */ 1945, 581, 1792, 1348, 216, 1270, 526, 1657, 530, 1056, - /* 1060 */ 487, 489, 1819, 164, 1909, 1617, 554, 1942, 492, 528, - /* 1070 */ 582, 1470, 1471, 1617, 1833, 1771, 1343, 581, 149, 1802, - /* 1080 */ 584, 1804, 1805, 580, 530, 575, 1617, 41, 1278, 663, - /* 1090 */ 77, 249, 1057, 221, 131, 529, 1794, 134, 1371, 254, - /* 1100 */ 1833, 257, 530, 671, 95, 1802, 584, 1804, 1805, 580, - /* 1110 */ 9, 575, 1617, 261, 1879, 259, 530, 267, 331, 1875, - /* 1120 */ 1958, 1362, 559, 1959, 135, 3, 51, 347, 1283, 1936, - /* 1130 */ 1617, 156, 668, 621, 236, 1223, 661, 657, 653, 649, - /* 1140 */ 265, 225, 523, 5, 1617, 229, 1350, 1351, 51, 41, - /* 1150 */ 41, 588, 134, 135, 119, 1075, 134, 356, 622, 313, - /* 1160 */ 29, 338, 1365, 1366, 1367, 1368, 1369, 1373, 1374, 1375, - /* 1170 */ 1376, 361, 1120, 92, 1429, 268, 230, 1239, 174, 388, - /* 1180 */ 1073, 1295, 239, 409, 1712, 416, 423, 424, 425, 429, - /* 1190 */ 431, 433, 1273, 1301, 1271, 434, 1378, 1334, 271, 1148, - /* 1200 */ 1152, 1159, 1157, 442, 138, 1303, 445, 183, 446, 527, - /* 1210 */ 185, 1801, 1302, 447, 1304, 1276, 1277, 188, 1325, 1326, - /* 1220 */ 1328, 1329, 1330, 1331, 1332, 1333, 577, 573, 1341, 1342, - /* 1230 */ 1344, 1345, 1346, 1347, 1349, 1352, 39, 37, 190, 1819, - /* 1240 */ 450, 448, 219, 72, 340, 73, 1272, 582, 454, 194, - /* 1250 */ 473, 475, 1771, 1607, 581, 198, 1603, 1348, 200, 1270, - /* 1260 */ 1246, 304, 212, 118, 140, 1751, 141, 1605, 269, 504, - /* 1270 */ 1601, 142, 143, 505, 211, 508, 214, 1833, 511, 515, - /* 1280 */ 1343, 96, 1802, 584, 1804, 1805, 580, 218, 575, 323, - /* 1290 */ 518, 1879, 1278, 538, 524, 81, 1876, 132, 1750, 147, - /* 1300 */ 525, 1722, 521, 133, 278, 337, 336, 270, 325, 83, - /* 1310 */ 1618, 1300, 541, 534, 2, 1286, 1910, 1920, 276, 60, - /* 1320 */ 234, 536, 59, 537, 1919, 330, 1348, 238, 1279, 544, - /* 1330 */ 6, 550, 532, 535, 1901, 1299, 668, 533, 180, 432, - /* 1340 */ 430, 1801, 248, 1404, 126, 567, 564, 153, 48, 1343, - /* 1350 */ 1350, 1351, 85, 332, 243, 1895, 586, 245, 246, 1661, - /* 1360 */ 273, 1278, 1590, 664, 247, 665, 264, 667, 52, 1819, - /* 1370 */ 277, 63, 1860, 253, 324, 299, 286, 582, 275, 296, - /* 1380 */ 1941, 1765, 1771, 295, 581, 1764, 65, 561, 1763, 1762, - /* 1390 */ 1961, 568, 256, 66, 1759, 358, 1273, 258, 1271, 359, - /* 1400 */ 1264, 1265, 170, 363, 1757, 570, 365, 1833, 366, 93, - /* 1410 */ 367, 294, 1802, 584, 1804, 1805, 580, 1756, 575, 1276, - /* 1420 */ 1277, 1801, 1325, 1326, 1328, 1329, 1330, 1331, 1332, 1333, - /* 1430 */ 577, 573, 1341, 1342, 1344, 1345, 1346, 1347, 1349, 1352, - /* 1440 */ 369, 1755, 1801, 371, 1754, 68, 67, 382, 373, 1819, - /* 1450 */ 171, 1753, 1242, 375, 531, 1241, 1733, 582, 380, 381, - /* 1460 */ 1731, 1730, 1771, 1732, 581, 1287, 301, 1282, 1211, 370, - /* 1470 */ 1819, 368, 364, 360, 357, 354, 129, 1702, 582, 1705, - /* 1480 */ 1704, 1703, 1701, 1771, 1700, 581, 69, 1833, 1290, 1292, - /* 1490 */ 1699, 294, 1802, 584, 1804, 1805, 580, 1698, 575, 1697, - /* 1500 */ 573, 1341, 1342, 1344, 1345, 1346, 1347, 1696, 1833, 1695, - /* 1510 */ 167, 1694, 95, 1802, 584, 1804, 1805, 580, 399, 575, - /* 1520 */ 398, 401, 1879, 1693, 1692, 1801, 331, 1875, 1958, 1691, - /* 1530 */ 1690, 1689, 1688, 1687, 1686, 1685, 1684, 1898, 1683, 1682, - /* 1540 */ 1681, 1801, 1680, 130, 1679, 1678, 1677, 1676, 1675, 1674, - /* 1550 */ 1213, 1673, 1672, 1819, 1671, 1670, 1542, 1541, 178, 179, - /* 1560 */ 1539, 582, 1507, 181, 120, 157, 1771, 1019, 581, 1819, - /* 1570 */ 1506, 1746, 1018, 438, 1740, 1729, 189, 582, 1049, 1538, - /* 1580 */ 121, 558, 1771, 440, 581, 1728, 1714, 1596, 1536, 1534, - /* 1590 */ 182, 1833, 1532, 1530, 455, 285, 1802, 584, 1804, 1805, - /* 1600 */ 580, 459, 575, 187, 457, 1519, 461, 1833, 456, 1801, - /* 1610 */ 460, 149, 1802, 584, 1804, 1805, 580, 463, 575, 464, - /* 1620 */ 465, 1945, 469, 468, 1518, 1801, 467, 1503, 1598, 1163, - /* 1630 */ 1162, 1597, 1088, 1087, 166, 1082, 1084, 1819, 1942, 636, - /* 1640 */ 1528, 1083, 50, 638, 319, 582, 1523, 320, 490, 1521, - /* 1650 */ 1771, 321, 581, 1819, 493, 1502, 1960, 1501, 495, 1500, - /* 1660 */ 1745, 579, 97, 499, 56, 558, 1771, 497, 581, 1248, - /* 1670 */ 197, 1739, 506, 144, 507, 1833, 215, 1727, 1725, 285, - /* 1680 */ 1802, 584, 1804, 1805, 580, 1726, 575, 1801, 1256, 1721, - /* 1690 */ 519, 1833, 1724, 1723, 15, 293, 1802, 584, 1804, 1805, - /* 1700 */ 580, 220, 575, 1713, 1852, 1945, 1801, 226, 79, 80, - /* 1710 */ 82, 87, 231, 242, 1792, 1819, 41, 47, 164, 16, - /* 1720 */ 339, 1444, 1942, 582, 235, 23, 522, 322, 1771, 233, - /* 1730 */ 581, 45, 251, 237, 1819, 228, 1426, 151, 512, 341, - /* 1740 */ 241, 240, 582, 1428, 24, 25, 86, 1771, 1456, 581, - /* 1750 */ 17, 46, 1421, 1833, 1401, 1400, 1791, 294, 1802, 584, - /* 1760 */ 1804, 1805, 580, 154, 575, 18, 1461, 1801, 196, 1455, - /* 1770 */ 1450, 333, 1833, 1460, 1459, 334, 294, 1802, 584, 1804, - /* 1780 */ 1805, 580, 152, 575, 553, 1801, 1288, 470, 466, 462, - /* 1790 */ 458, 195, 10, 19, 1836, 1819, 574, 1363, 1338, 155, - /* 1800 */ 1336, 31, 12, 582, 168, 1335, 20, 1318, 1771, 583, - /* 1810 */ 581, 21, 127, 1819, 1149, 587, 585, 13, 342, 589, - /* 1820 */ 592, 582, 1146, 591, 75, 1126, 1771, 193, 581, 594, - /* 1830 */ 597, 595, 558, 1833, 1143, 1801, 1137, 279, 1802, 584, - /* 1840 */ 1804, 1805, 580, 1135, 575, 598, 600, 601, 607, 1158, - /* 1850 */ 125, 1833, 88, 89, 1154, 280, 1802, 584, 1804, 1805, - /* 1860 */ 580, 1141, 575, 1819, 62, 250, 1887, 552, 1140, 551, - /* 1870 */ 1139, 582, 1945, 1138, 262, 1047, 1771, 616, 581, 1079, - /* 1880 */ 1078, 1077, 1076, 1074, 1072, 164, 1071, 1801, 1070, 1942, - /* 1890 */ 192, 186, 1095, 191, 626, 1068, 1067, 449, 263, 1066, - /* 1900 */ 1065, 1833, 1064, 1063, 1062, 281, 1802, 584, 1804, 1805, - /* 1910 */ 580, 1092, 575, 184, 1090, 1819, 1059, 1058, 1055, 1054, - /* 1920 */ 1053, 1052, 1535, 582, 646, 647, 648, 1533, 1771, 650, - /* 1930 */ 581, 1531, 651, 1529, 652, 1801, 654, 655, 656, 658, - /* 1940 */ 659, 660, 1517, 662, 1009, 1499, 266, 1801, 1274, 666, - /* 1950 */ 670, 274, 1474, 1833, 1474, 669, 1474, 288, 1802, 584, - /* 1960 */ 1804, 1805, 580, 1819, 575, 1474, 1474, 1474, 1474, 1474, - /* 1970 */ 1474, 582, 1474, 1474, 1474, 1819, 1771, 1474, 581, 1474, - /* 1980 */ 1474, 1474, 1474, 582, 1474, 1474, 1474, 1474, 1771, 1474, - /* 1990 */ 581, 1474, 1474, 1474, 1474, 1474, 1474, 1801, 1474, 1474, - /* 2000 */ 1474, 1833, 1474, 1474, 1474, 290, 1802, 584, 1804, 1805, - /* 2010 */ 580, 1474, 575, 1833, 1801, 1474, 1474, 282, 1802, 584, - /* 2020 */ 1804, 1805, 580, 1474, 575, 1819, 1474, 1474, 1474, 1474, - /* 2030 */ 1474, 1474, 1474, 582, 1474, 1474, 1474, 1474, 1771, 1474, - /* 2040 */ 581, 1474, 1819, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2050 */ 582, 1474, 1474, 1474, 1474, 1771, 1474, 581, 1474, 1474, - /* 2060 */ 1474, 1474, 1474, 1833, 1474, 1474, 1474, 291, 1802, 584, - /* 2070 */ 1804, 1805, 580, 1474, 575, 1474, 1474, 1801, 1474, 1474, - /* 2080 */ 1833, 1474, 1474, 1474, 283, 1802, 584, 1804, 1805, 580, - /* 2090 */ 1474, 575, 1474, 1801, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2100 */ 1474, 1474, 1474, 1474, 1474, 1819, 1474, 1474, 1474, 1474, - /* 2110 */ 1474, 1474, 1474, 582, 1474, 1474, 1474, 1474, 1771, 1474, - /* 2120 */ 581, 1819, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 582, - /* 2130 */ 1474, 1474, 1474, 1474, 1771, 1474, 581, 1474, 1474, 1474, - /* 2140 */ 1474, 1474, 1474, 1833, 1474, 1801, 1474, 292, 1802, 584, - /* 2150 */ 1804, 1805, 580, 1474, 575, 1474, 1474, 1474, 1474, 1833, - /* 2160 */ 1474, 1801, 1474, 284, 1802, 584, 1804, 1805, 580, 1474, - /* 2170 */ 575, 1474, 1474, 1819, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2180 */ 1474, 582, 1474, 1474, 1474, 1474, 1771, 1474, 581, 1819, - /* 2190 */ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 582, 1474, 1474, - /* 2200 */ 1474, 1801, 1771, 1474, 581, 1474, 1474, 1474, 1474, 1474, - /* 2210 */ 1474, 1833, 1474, 1474, 1474, 297, 1802, 584, 1804, 1805, - /* 2220 */ 580, 1474, 575, 1801, 1474, 1474, 1474, 1833, 1474, 1819, - /* 2230 */ 1474, 298, 1802, 584, 1804, 1805, 580, 582, 575, 1474, - /* 2240 */ 1474, 1474, 1771, 1474, 581, 1474, 1474, 1474, 1474, 1474, - /* 2250 */ 1474, 1819, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 582, - /* 2260 */ 1474, 1474, 1474, 1801, 1771, 1474, 581, 1833, 1474, 1474, - /* 2270 */ 1474, 1813, 1802, 584, 1804, 1805, 580, 1474, 575, 1474, - /* 2280 */ 1474, 1801, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1833, - /* 2290 */ 1474, 1819, 1474, 1812, 1802, 584, 1804, 1805, 580, 582, - /* 2300 */ 575, 1474, 1474, 1474, 1771, 1474, 581, 1474, 1474, 1819, - /* 2310 */ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 582, 1474, 1474, - /* 2320 */ 1474, 1474, 1771, 1474, 581, 1474, 1474, 1474, 1474, 1833, - /* 2330 */ 1474, 1801, 1474, 1811, 1802, 584, 1804, 1805, 580, 1474, - /* 2340 */ 575, 1474, 1474, 1801, 1474, 1474, 1474, 1833, 1474, 1474, - /* 2350 */ 1474, 310, 1802, 584, 1804, 1805, 580, 1474, 575, 1819, - /* 2360 */ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 582, 1474, 1474, - /* 2370 */ 1474, 1819, 1771, 1474, 581, 1474, 1474, 1474, 1474, 582, - /* 2380 */ 1474, 1474, 1474, 1474, 1771, 1474, 581, 1474, 1474, 1474, - /* 2390 */ 1474, 1474, 1474, 1474, 1801, 1474, 1474, 1833, 1474, 1474, - /* 2400 */ 1474, 309, 1802, 584, 1804, 1805, 580, 1474, 575, 1833, - /* 2410 */ 1474, 1474, 1474, 311, 1802, 584, 1804, 1805, 580, 1474, - /* 2420 */ 575, 1474, 1819, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2430 */ 582, 1474, 1474, 1474, 1474, 1771, 1474, 581, 1474, 1474, - /* 2440 */ 1474, 1474, 1474, 1474, 1801, 1474, 1474, 1474, 1474, 1474, - /* 2450 */ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2460 */ 1833, 1474, 1474, 1474, 308, 1802, 584, 1804, 1805, 580, - /* 2470 */ 1474, 575, 1819, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2480 */ 582, 1474, 1474, 1474, 1474, 1771, 1474, 581, 1474, 1474, - /* 2490 */ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2500 */ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - /* 2510 */ 1833, 1474, 1474, 1474, 287, 1802, 584, 1804, 1805, 580, - /* 2520 */ 1474, 575, + /* 0 */ 436, 379, 437, 1516, 1809, 91, 516, 444, 1616, 437, + /* 10 */ 1516, 1614, 39, 37, 553, 64, 30, 260, 124, 1793, + /* 20 */ 340, 1953, 1278, 33, 32, 1016, 1617, 40, 38, 36, + /* 30 */ 35, 34, 1827, 1354, 1952, 1276, 385, 148, 1950, 1493, + /* 40 */ 582, 1953, 127, 1789, 1795, 1779, 1953, 581, 40, 38, + /* 50 */ 36, 35, 34, 556, 164, 575, 1349, 517, 1950, 164, + /* 60 */ 558, 14, 558, 1950, 326, 1020, 1021, 1725, 1284, 1543, + /* 70 */ 1841, 1304, 74, 303, 94, 1810, 584, 1812, 1813, 580, + /* 80 */ 125, 575, 1504, 173, 1887, 122, 217, 345, 306, 1883, + /* 90 */ 1670, 1672, 1, 556, 1620, 250, 1895, 552, 63, 551, + /* 100 */ 1953, 107, 1953, 63, 106, 105, 104, 103, 102, 101, + /* 110 */ 100, 99, 98, 166, 670, 166, 453, 1950, 71, 1950, + /* 120 */ 1421, 70, 63, 1779, 78, 42, 1303, 1303, 1356, 1357, + /* 130 */ 11, 10, 647, 646, 645, 644, 350, 1503, 643, 642, + /* 140 */ 128, 637, 636, 635, 634, 633, 632, 631, 139, 627, + /* 150 */ 626, 625, 349, 348, 622, 621, 620, 619, 618, 530, + /* 160 */ 500, 33, 32, 196, 1481, 40, 38, 36, 35, 34, + /* 170 */ 55, 223, 224, 498, 1279, 496, 1277, 152, 1779, 1175, + /* 180 */ 1176, 1474, 470, 466, 462, 458, 195, 1625, 116, 115, + /* 190 */ 114, 113, 112, 111, 110, 109, 108, 1282, 1283, 63, + /* 200 */ 1331, 1332, 1334, 1335, 1336, 1337, 1338, 1339, 577, 573, + /* 210 */ 1347, 1348, 1350, 1351, 1352, 1353, 1355, 1358, 39, 37, + /* 220 */ 1417, 75, 1390, 302, 193, 1301, 340, 84, 1278, 1809, + /* 230 */ 305, 167, 415, 520, 1953, 427, 353, 167, 530, 1354, + /* 240 */ 542, 1276, 167, 1677, 1798, 553, 1448, 165, 1618, 169, + /* 250 */ 328, 1950, 400, 1677, 428, 1793, 402, 1827, 1953, 1675, + /* 260 */ 344, 167, 1349, 1304, 167, 582, 1625, 14, 1473, 1675, + /* 270 */ 1779, 1951, 581, 127, 1284, 1950, 1953, 33, 32, 1789, + /* 280 */ 1795, 40, 38, 36, 35, 34, 1797, 192, 186, 164, + /* 290 */ 191, 575, 49, 1950, 449, 1841, 393, 1793, 2, 95, + /* 300 */ 1810, 584, 1812, 1813, 580, 1303, 575, 1333, 389, 1887, + /* 310 */ 184, 125, 22, 331, 1883, 1966, 556, 548, 543, 158, + /* 320 */ 670, 1789, 1795, 329, 1921, 555, 160, 1895, 1896, 1724, + /* 330 */ 1900, 300, 1664, 575, 1356, 1357, 426, 1479, 167, 421, + /* 340 */ 420, 419, 418, 417, 414, 413, 412, 411, 410, 406, + /* 350 */ 405, 404, 403, 397, 396, 395, 394, 1522, 391, 390, + /* 360 */ 314, 1902, 1133, 606, 605, 604, 1137, 603, 1139, 1140, + /* 370 */ 602, 1142, 599, 530, 1148, 596, 1150, 1151, 593, 590, + /* 380 */ 1279, 327, 1277, 317, 383, 1899, 33, 32, 43, 146, + /* 390 */ 40, 38, 36, 35, 34, 150, 355, 547, 1627, 1584, + /* 400 */ 1033, 1625, 1032, 1282, 1283, 665, 1331, 1332, 1334, 1335, + /* 410 */ 1336, 1337, 1338, 1339, 577, 573, 1347, 1348, 1350, 1351, + /* 420 */ 1352, 1353, 1355, 1358, 39, 37, 1809, 491, 1671, 1672, + /* 430 */ 1034, 167, 340, 1723, 1278, 300, 1953, 1302, 36, 35, + /* 440 */ 34, 318, 501, 316, 315, 1354, 476, 1276, 1677, 164, + /* 450 */ 478, 1305, 222, 1950, 1827, 312, 209, 1602, 486, 485, + /* 460 */ 1364, 1603, 582, 617, 1675, 123, 1303, 1779, 1349, 581, + /* 470 */ 494, 1428, 477, 14, 488, 481, 484, 26, 343, 208, + /* 480 */ 1284, 480, 558, 33, 32, 346, 146, 40, 38, 36, + /* 490 */ 35, 34, 1841, 146, 7, 1627, 94, 1810, 584, 1812, + /* 500 */ 1813, 580, 1627, 575, 2, 609, 1887, 1378, 553, 530, + /* 510 */ 306, 1883, 1258, 1259, 58, 435, 1953, 57, 439, 1502, + /* 520 */ 117, 453, 1953, 147, 1827, 63, 670, 474, 278, 165, + /* 530 */ 1809, 1501, 546, 1950, 374, 164, 127, 1625, 28, 1950, + /* 540 */ 1356, 1357, 276, 60, 33, 32, 59, 1284, 40, 38, + /* 550 */ 36, 35, 34, 376, 372, 337, 336, 1500, 1827, 530, + /* 560 */ 1779, 615, 180, 432, 430, 1292, 582, 1728, 545, 27, + /* 570 */ 117, 1779, 1779, 581, 125, 517, 1354, 479, 1285, 1383, + /* 580 */ 137, 136, 612, 611, 610, 1726, 1279, 1625, 1277, 161, + /* 590 */ 1895, 1896, 252, 1900, 629, 1499, 1841, 63, 1779, 1349, + /* 600 */ 149, 1810, 584, 1812, 1813, 580, 378, 575, 377, 1282, + /* 610 */ 1283, 1284, 1331, 1332, 1334, 1335, 1336, 1337, 1338, 1339, + /* 620 */ 577, 573, 1347, 1348, 1350, 1351, 1352, 1353, 1355, 1358, + /* 630 */ 39, 37, 1902, 1278, 1498, 93, 1779, 1497, 340, 630, + /* 640 */ 1278, 1597, 441, 1601, 559, 1967, 1276, 1333, 1301, 1610, + /* 650 */ 1033, 1354, 1032, 1276, 33, 32, 1898, 570, 40, 38, + /* 660 */ 36, 35, 34, 1546, 167, 472, 443, 352, 1612, 439, + /* 670 */ 1496, 68, 67, 382, 1349, 1779, 171, 1608, 1779, 1284, + /* 680 */ 1034, 210, 1495, 33, 32, 1410, 1284, 40, 38, 36, + /* 690 */ 35, 34, 301, 530, 1809, 370, 74, 368, 364, 360, + /* 700 */ 357, 354, 1492, 617, 384, 1020, 1021, 1953, 33, 32, + /* 710 */ 8, 1779, 40, 38, 36, 35, 34, 1293, 1621, 1288, + /* 720 */ 164, 1625, 1827, 1779, 1950, 670, 213, 486, 485, 1491, + /* 730 */ 557, 1490, 670, 502, 123, 1779, 167, 581, 76, 305, + /* 740 */ 1296, 1298, 520, 1779, 481, 484, 1356, 1357, 1489, 1095, + /* 750 */ 480, 1902, 573, 1347, 1348, 1350, 1351, 1352, 1353, 1438, + /* 760 */ 1841, 307, 1907, 1410, 95, 1810, 584, 1812, 1813, 580, + /* 770 */ 1779, 575, 1779, 1953, 1887, 1897, 615, 1718, 331, 1883, + /* 780 */ 159, 1414, 1097, 483, 482, 1279, 164, 1277, 172, 1779, + /* 790 */ 1950, 478, 1279, 1316, 1277, 137, 136, 612, 611, 610, + /* 800 */ 1914, 1376, 539, 1436, 1437, 1439, 1440, 145, 1282, 1283, + /* 810 */ 1488, 1809, 1487, 477, 1486, 1282, 1283, 1306, 1331, 1332, + /* 820 */ 1334, 1335, 1336, 1337, 1338, 1339, 577, 573, 1347, 1348, + /* 830 */ 1350, 1351, 1352, 1353, 1355, 1358, 39, 37, 1359, 1827, + /* 840 */ 1482, 146, 422, 509, 340, 1060, 1278, 582, 1485, 167, + /* 850 */ 1628, 1779, 1779, 1779, 581, 1779, 1377, 1354, 1484, 1276, + /* 860 */ 1677, 107, 1718, 61, 106, 105, 104, 103, 102, 101, + /* 870 */ 100, 99, 98, 175, 641, 639, 1676, 1841, 1061, 1303, + /* 880 */ 1349, 96, 1810, 584, 1812, 1813, 580, 613, 575, 1779, + /* 890 */ 1668, 1887, 1284, 44, 4, 1886, 1883, 177, 176, 1779, + /* 900 */ 614, 33, 32, 1668, 1797, 40, 38, 36, 35, 34, + /* 910 */ 272, 135, 576, 1655, 1809, 1793, 9, 1766, 29, 338, + /* 920 */ 1371, 1372, 1373, 1374, 1375, 1379, 1380, 1381, 1382, 33, + /* 930 */ 32, 1809, 530, 40, 38, 36, 35, 34, 670, 1789, + /* 940 */ 1795, 335, 1827, 392, 562, 530, 608, 324, 1533, 386, + /* 950 */ 582, 575, 1356, 1357, 307, 1779, 407, 581, 232, 1827, + /* 960 */ 1625, 54, 387, 201, 362, 203, 199, 582, 202, 1494, + /* 970 */ 487, 530, 1779, 1625, 581, 53, 513, 11, 10, 530, + /* 980 */ 1841, 216, 408, 565, 294, 1810, 584, 1812, 1813, 580, + /* 990 */ 451, 575, 553, 205, 1376, 1528, 204, 1841, 1279, 1625, + /* 1000 */ 1277, 96, 1810, 584, 1812, 1813, 580, 1625, 575, 1413, + /* 1010 */ 207, 1887, 41, 206, 1316, 569, 1883, 489, 255, 77, + /* 1020 */ 127, 1282, 1283, 1526, 1331, 1332, 1334, 1335, 1336, 1337, + /* 1030 */ 1338, 1339, 577, 573, 1347, 1348, 1350, 1351, 1352, 1353, + /* 1040 */ 1355, 1358, 39, 37, 530, 492, 221, 1585, 530, 1377, + /* 1050 */ 340, 131, 1278, 134, 673, 452, 530, 1287, 125, 1622, + /* 1060 */ 1333, 471, 1229, 1354, 1809, 1276, 1286, 503, 267, 1476, + /* 1070 */ 1477, 540, 1625, 162, 1895, 1896, 1625, 1900, 571, 1800, + /* 1080 */ 623, 135, 156, 51, 1625, 90, 1349, 663, 659, 655, + /* 1090 */ 651, 265, 1827, 1600, 244, 87, 225, 531, 1284, 530, + /* 1100 */ 582, 523, 1079, 229, 1809, 1779, 236, 581, 560, 1828, + /* 1110 */ 510, 29, 338, 1371, 1372, 1373, 1374, 1375, 1379, 1380, + /* 1120 */ 1381, 1382, 9, 41, 624, 1802, 92, 1625, 351, 230, + /* 1130 */ 1841, 1126, 1827, 1435, 294, 1810, 584, 1812, 1813, 580, + /* 1140 */ 557, 575, 1665, 51, 670, 1779, 1077, 581, 1517, 41, + /* 1150 */ 588, 563, 530, 1917, 530, 530, 239, 530, 1356, 1357, + /* 1160 */ 554, 134, 527, 514, 249, 227, 526, 254, 528, 257, + /* 1170 */ 1841, 135, 259, 271, 95, 1810, 584, 1812, 1813, 580, + /* 1180 */ 1625, 575, 1625, 1625, 1887, 1625, 3, 5, 331, 1883, + /* 1190 */ 159, 356, 566, 1384, 361, 219, 313, 615, 1290, 1340, + /* 1200 */ 1154, 530, 163, 119, 1279, 134, 1277, 1289, 1245, 174, + /* 1210 */ 1913, 1158, 529, 1252, 1368, 212, 137, 136, 612, 611, + /* 1220 */ 610, 1165, 268, 388, 1301, 409, 1720, 1282, 1283, 1625, + /* 1230 */ 1331, 1332, 1334, 1335, 1336, 1337, 1338, 1339, 577, 573, + /* 1240 */ 1347, 1348, 1350, 1351, 1352, 1353, 1355, 1358, 39, 37, + /* 1250 */ 1809, 530, 530, 1163, 416, 138, 340, 424, 1278, 423, + /* 1260 */ 425, 429, 261, 347, 431, 433, 1307, 1309, 434, 1354, + /* 1270 */ 442, 1276, 445, 183, 446, 185, 1308, 447, 1827, 1625, + /* 1280 */ 1625, 1310, 188, 448, 450, 190, 582, 72, 73, 454, + /* 1290 */ 194, 1779, 1349, 581, 473, 475, 118, 1615, 304, 198, + /* 1300 */ 1611, 1759, 200, 269, 1284, 140, 504, 141, 211, 505, + /* 1310 */ 1809, 1613, 1609, 142, 143, 214, 1841, 511, 218, 515, + /* 1320 */ 95, 1810, 584, 1812, 1813, 580, 553, 575, 2, 538, + /* 1330 */ 1887, 524, 508, 81, 331, 1883, 1966, 323, 1827, 83, + /* 1340 */ 518, 132, 1758, 1730, 521, 1944, 582, 1306, 133, 525, + /* 1350 */ 670, 1779, 1626, 581, 127, 270, 325, 1928, 534, 541, + /* 1360 */ 1918, 536, 6, 234, 1356, 1357, 537, 330, 544, 1909, + /* 1370 */ 550, 535, 533, 238, 558, 532, 1841, 1305, 1410, 126, + /* 1380 */ 95, 1810, 584, 1812, 1813, 580, 567, 575, 564, 48, + /* 1390 */ 1887, 332, 125, 246, 331, 1883, 1966, 1927, 243, 248, + /* 1400 */ 1903, 85, 586, 1669, 1598, 1906, 247, 250, 1895, 552, + /* 1410 */ 1279, 551, 1277, 1868, 1953, 153, 273, 264, 666, 667, + /* 1420 */ 52, 669, 299, 286, 275, 245, 1809, 164, 296, 1773, + /* 1430 */ 277, 1950, 295, 1282, 1283, 65, 1331, 1332, 1334, 1335, + /* 1440 */ 1336, 1337, 1338, 1339, 577, 573, 1347, 1348, 1350, 1351, + /* 1450 */ 1352, 1353, 1355, 1358, 1827, 1969, 1772, 1949, 1771, 253, + /* 1460 */ 1770, 256, 582, 66, 561, 568, 258, 1779, 1767, 581, + /* 1470 */ 359, 358, 1270, 1271, 170, 363, 1765, 365, 366, 367, + /* 1480 */ 1764, 369, 558, 1763, 371, 1762, 373, 1809, 1761, 375, + /* 1490 */ 1248, 1741, 1841, 1247, 1740, 380, 285, 1810, 584, 1812, + /* 1500 */ 1813, 580, 381, 575, 1739, 1738, 1713, 1217, 1712, 1711, + /* 1510 */ 1710, 129, 1709, 1708, 69, 1827, 1707, 1706, 1705, 1704, + /* 1520 */ 1703, 398, 1953, 582, 399, 1702, 401, 1701, 1779, 1700, + /* 1530 */ 581, 1699, 1698, 1697, 1696, 166, 1695, 1694, 1693, 1950, + /* 1540 */ 1692, 1691, 1690, 558, 1809, 1689, 1688, 1687, 1686, 130, + /* 1550 */ 1685, 1684, 1683, 1841, 178, 1547, 179, 285, 1810, 584, + /* 1560 */ 1812, 1813, 580, 1682, 575, 1219, 1681, 1680, 1679, 1678, + /* 1570 */ 1809, 1548, 1827, 1545, 1513, 1023, 438, 181, 120, 1022, + /* 1580 */ 579, 1512, 1754, 1953, 1748, 1779, 1737, 581, 189, 1736, + /* 1590 */ 1722, 1604, 157, 1544, 1542, 121, 164, 182, 1827, 440, + /* 1600 */ 1950, 187, 1540, 1538, 1536, 455, 582, 456, 1525, 1524, + /* 1610 */ 1841, 1779, 459, 581, 293, 1810, 584, 1812, 1813, 580, + /* 1620 */ 578, 575, 572, 1859, 457, 460, 1053, 461, 1809, 1509, + /* 1630 */ 463, 465, 467, 1606, 464, 469, 1841, 1168, 1605, 97, + /* 1640 */ 96, 1810, 584, 1812, 1813, 580, 1809, 575, 468, 1169, + /* 1650 */ 1887, 1094, 1093, 638, 640, 1884, 1827, 1090, 197, 50, + /* 1660 */ 1089, 1088, 1534, 319, 582, 1529, 320, 490, 1527, 1779, + /* 1670 */ 321, 581, 493, 1508, 1827, 1507, 1506, 495, 497, 499, + /* 1680 */ 1753, 1254, 582, 56, 1747, 506, 215, 1779, 144, 581, + /* 1690 */ 1735, 1733, 1734, 1732, 1841, 1731, 1809, 15, 289, 1810, + /* 1700 */ 584, 1812, 1813, 580, 1262, 575, 220, 519, 1729, 1721, + /* 1710 */ 80, 45, 1841, 226, 87, 41, 149, 1810, 584, 1812, + /* 1720 */ 1813, 580, 1809, 575, 1827, 231, 79, 82, 23, 47, + /* 1730 */ 16, 241, 579, 507, 17, 522, 549, 1779, 512, 581, + /* 1740 */ 322, 1462, 1450, 233, 242, 235, 1809, 1432, 237, 1800, + /* 1750 */ 1827, 1434, 151, 240, 25, 339, 228, 1427, 582, 24, + /* 1760 */ 251, 1968, 1841, 1779, 46, 581, 293, 1810, 584, 1812, + /* 1770 */ 1813, 580, 1799, 575, 1827, 1860, 1407, 86, 154, 341, + /* 1780 */ 1406, 18, 582, 1461, 333, 1466, 1465, 1779, 1841, 581, + /* 1790 */ 1467, 334, 294, 1810, 584, 1812, 1813, 580, 1456, 575, + /* 1800 */ 10, 1294, 19, 1369, 1809, 1844, 155, 168, 1344, 574, + /* 1810 */ 1324, 1342, 1841, 1341, 31, 13, 294, 1810, 584, 1812, + /* 1820 */ 1813, 580, 12, 575, 1155, 20, 583, 21, 585, 587, + /* 1830 */ 342, 589, 1827, 1152, 591, 592, 594, 1149, 595, 597, + /* 1840 */ 582, 600, 1132, 1147, 598, 1779, 1143, 581, 1141, 601, + /* 1850 */ 1146, 1164, 1145, 1144, 88, 1809, 89, 62, 607, 1160, + /* 1860 */ 262, 1085, 1051, 616, 1084, 1809, 1083, 1082, 1081, 1080, + /* 1870 */ 1841, 1078, 628, 1076, 279, 1810, 584, 1812, 1813, 580, + /* 1880 */ 1075, 575, 1074, 1827, 1072, 263, 1101, 1071, 1070, 1069, + /* 1890 */ 1068, 582, 1067, 1827, 1066, 1098, 1779, 1096, 581, 1063, + /* 1900 */ 1062, 582, 1059, 1057, 1058, 1056, 1779, 1541, 581, 648, + /* 1910 */ 649, 650, 1539, 652, 654, 1537, 658, 656, 1809, 1535, + /* 1920 */ 653, 1841, 660, 657, 662, 280, 1810, 584, 1812, 1813, + /* 1930 */ 580, 1841, 575, 661, 1809, 281, 1810, 584, 1812, 1813, + /* 1940 */ 580, 1523, 575, 664, 1013, 1505, 1827, 266, 668, 1480, + /* 1950 */ 1280, 274, 671, 672, 582, 1480, 1480, 1480, 1809, 1779, + /* 1960 */ 1480, 581, 1827, 1480, 1480, 1480, 1480, 1480, 1480, 1480, + /* 1970 */ 582, 1480, 1480, 1480, 1480, 1779, 1480, 581, 1480, 1480, + /* 1980 */ 1480, 1480, 1480, 1480, 1841, 1480, 1827, 1480, 288, 1810, + /* 1990 */ 584, 1812, 1813, 580, 582, 575, 1480, 1480, 1480, 1779, + /* 2000 */ 1841, 581, 1480, 1480, 290, 1810, 584, 1812, 1813, 580, + /* 2010 */ 1809, 575, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, + /* 2020 */ 1480, 1480, 1480, 1480, 1841, 1480, 1480, 1480, 282, 1810, + /* 2030 */ 584, 1812, 1813, 580, 1809, 575, 1480, 1480, 1827, 1480, + /* 2040 */ 1480, 1480, 1480, 1480, 1480, 1480, 582, 1480, 1480, 1480, + /* 2050 */ 1480, 1779, 1480, 581, 1480, 1480, 1480, 1480, 1809, 1480, + /* 2060 */ 1480, 1480, 1827, 1480, 1480, 1480, 1480, 1480, 1480, 1480, + /* 2070 */ 582, 1480, 1480, 1480, 1809, 1779, 1841, 581, 1480, 1480, + /* 2080 */ 291, 1810, 584, 1812, 1813, 580, 1827, 575, 1480, 1480, + /* 2090 */ 1480, 1480, 1480, 1480, 582, 1480, 1480, 1480, 1480, 1779, + /* 2100 */ 1841, 581, 1827, 1480, 283, 1810, 584, 1812, 1813, 580, + /* 2110 */ 582, 575, 1480, 1480, 1480, 1779, 1480, 581, 1480, 1480, + /* 2120 */ 1480, 1480, 1480, 1480, 1841, 1480, 1480, 1480, 292, 1810, + /* 2130 */ 584, 1812, 1813, 580, 1480, 575, 1480, 1480, 1480, 1480, + /* 2140 */ 1841, 1480, 1480, 1480, 284, 1810, 584, 1812, 1813, 580, + /* 2150 */ 1480, 575, 1809, 1480, 1480, 1480, 1480, 1480, 1480, 1480, + /* 2160 */ 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, + /* 2170 */ 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, + /* 2180 */ 1827, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 582, 1480, + /* 2190 */ 1480, 1480, 1480, 1779, 1480, 581, 1480, 1480, 1480, 1480, + /* 2200 */ 1480, 1480, 1480, 1809, 1480, 1480, 1480, 1480, 1480, 1480, + /* 2210 */ 1480, 1480, 1480, 1809, 1480, 1480, 1480, 1480, 1841, 1480, + /* 2220 */ 1480, 1480, 297, 1810, 584, 1812, 1813, 580, 1480, 575, + /* 2230 */ 1480, 1827, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 582, + /* 2240 */ 1480, 1827, 1480, 1480, 1779, 1480, 581, 1480, 1480, 582, + /* 2250 */ 1480, 1480, 1480, 1480, 1779, 1480, 581, 1480, 1480, 1480, + /* 2260 */ 1480, 1480, 1480, 1480, 1480, 1480, 1809, 1480, 1480, 1841, + /* 2270 */ 1480, 1480, 1480, 298, 1810, 584, 1812, 1813, 580, 1841, + /* 2280 */ 575, 1480, 1809, 1821, 1810, 584, 1812, 1813, 580, 1480, + /* 2290 */ 575, 1480, 1480, 1480, 1827, 1480, 1480, 1480, 1480, 1480, + /* 2300 */ 1480, 1480, 582, 1480, 1480, 1480, 1809, 1779, 1480, 581, + /* 2310 */ 1827, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 582, 1480, + /* 2320 */ 1480, 1480, 1809, 1779, 1480, 581, 1480, 1480, 1480, 1480, + /* 2330 */ 1480, 1480, 1841, 1480, 1827, 1480, 1820, 1810, 584, 1812, + /* 2340 */ 1813, 580, 582, 575, 1480, 1480, 1809, 1779, 1841, 581, + /* 2350 */ 1827, 1480, 1819, 1810, 584, 1812, 1813, 580, 582, 575, + /* 2360 */ 1480, 1480, 1480, 1779, 1480, 581, 1480, 1480, 1480, 1480, + /* 2370 */ 1809, 1480, 1841, 1480, 1827, 1480, 310, 1810, 584, 1812, + /* 2380 */ 1813, 580, 582, 575, 1480, 1480, 1809, 1779, 1841, 581, + /* 2390 */ 1480, 1480, 309, 1810, 584, 1812, 1813, 580, 1827, 575, + /* 2400 */ 1480, 1480, 1480, 1480, 1480, 1480, 582, 1480, 1480, 1480, + /* 2410 */ 1480, 1779, 1841, 581, 1827, 1480, 311, 1810, 584, 1812, + /* 2420 */ 1813, 580, 582, 575, 1480, 1480, 1480, 1779, 1480, 581, + /* 2430 */ 1480, 1480, 1480, 1480, 1480, 1480, 1841, 1480, 1480, 1480, + /* 2440 */ 308, 1810, 584, 1812, 1813, 580, 1480, 575, 1480, 1480, + /* 2450 */ 1480, 1480, 1841, 1480, 1480, 1480, 287, 1810, 584, 1812, + /* 2460 */ 1813, 580, 1480, 575, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 352, 309, 313, 317, 315, 316, 365, 359, 0, 4, - /* 10 */ 362, 317, 12, 13, 328, 338, 313, 317, 315, 316, - /* 20 */ 20, 335, 22, 0, 12, 13, 14, 15, 16, 337, - /* 30 */ 317, 345, 317, 33, 20, 35, 22, 345, 317, 345, - /* 40 */ 20, 328, 350, 328, 352, 345, 405, 24, 25, 26, - /* 50 */ 27, 28, 29, 30, 31, 32, 56, 365, 345, 418, - /* 60 */ 345, 61, 329, 422, 50, 365, 345, 375, 68, 0, - /* 70 */ 337, 379, 380, 381, 382, 383, 384, 383, 386, 346, - /* 80 */ 308, 389, 310, 383, 309, 393, 394, 20, 4, 35, - /* 90 */ 90, 397, 398, 399, 400, 90, 402, 405, 398, 399, - /* 100 */ 400, 337, 402, 348, 383, 405, 351, 352, 344, 322, - /* 110 */ 418, 0, 112, 326, 422, 60, 337, 353, 418, 398, - /* 120 */ 399, 400, 422, 402, 345, 350, 126, 127, 44, 45, - /* 130 */ 390, 391, 63, 64, 65, 66, 67, 0, 69, 70, + /* 0 */ 315, 367, 317, 318, 311, 321, 367, 315, 341, 317, + /* 10 */ 318, 340, 12, 13, 319, 4, 392, 393, 334, 352, + /* 20 */ 20, 407, 22, 8, 9, 4, 342, 12, 13, 14, + /* 30 */ 15, 16, 339, 33, 420, 35, 319, 310, 424, 312, + /* 40 */ 347, 407, 347, 376, 377, 352, 407, 354, 12, 13, + /* 50 */ 14, 15, 16, 20, 420, 388, 56, 354, 424, 420, + /* 60 */ 367, 61, 367, 424, 361, 44, 45, 364, 68, 0, + /* 70 */ 377, 20, 323, 356, 381, 382, 383, 384, 385, 386, + /* 80 */ 385, 388, 311, 56, 391, 336, 56, 350, 395, 396, + /* 90 */ 353, 354, 92, 20, 345, 400, 401, 402, 92, 404, + /* 100 */ 407, 21, 407, 92, 24, 25, 26, 27, 28, 29, + /* 110 */ 30, 31, 32, 420, 114, 420, 60, 424, 91, 424, + /* 120 */ 14, 94, 92, 352, 94, 92, 20, 20, 128, 129, + /* 130 */ 1, 2, 63, 64, 65, 66, 67, 311, 69, 70, /* 140 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - /* 150 */ 81, 82, 83, 84, 85, 86, 87, 325, 21, 327, - /* 160 */ 381, 24, 25, 26, 27, 28, 29, 30, 31, 32, - /* 170 */ 20, 60, 172, 377, 174, 103, 104, 105, 106, 107, - /* 180 */ 108, 109, 110, 111, 112, 113, 157, 115, 116, 117, - /* 190 */ 118, 119, 120, 126, 127, 195, 196, 401, 198, 199, + /* 150 */ 81, 82, 83, 84, 85, 86, 87, 88, 89, 319, + /* 160 */ 21, 8, 9, 33, 0, 12, 13, 14, 15, 16, + /* 170 */ 330, 123, 124, 34, 174, 36, 176, 47, 352, 128, + /* 180 */ 129, 166, 52, 53, 54, 55, 56, 347, 24, 25, + /* 190 */ 26, 27, 28, 29, 30, 31, 32, 197, 198, 92, /* 200 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - /* 210 */ 210, 211, 212, 213, 214, 215, 12, 13, 14, 405, - /* 220 */ 339, 18, 336, 20, 20, 309, 22, 121, 174, 229, - /* 230 */ 27, 350, 418, 30, 229, 349, 422, 33, 21, 35, - /* 240 */ 90, 24, 25, 26, 27, 28, 29, 30, 31, 32, - /* 250 */ 47, 20, 49, 337, 51, 374, 375, 376, 321, 20, - /* 260 */ 56, 345, 20, 234, 235, 61, 350, 386, 352, 8, - /* 270 */ 9, 334, 68, 12, 13, 14, 15, 16, 8, 9, - /* 280 */ 343, 56, 12, 13, 14, 15, 16, 181, 182, 20, - /* 290 */ 405, 375, 89, 319, 90, 379, 380, 381, 382, 383, - /* 300 */ 384, 90, 386, 418, 101, 389, 332, 422, 20, 393, - /* 310 */ 394, 395, 351, 352, 340, 90, 112, 92, 8, 9, - /* 320 */ 404, 90, 12, 13, 14, 15, 16, 14, 195, 90, - /* 330 */ 126, 127, 129, 20, 90, 132, 133, 134, 135, 136, - /* 340 */ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - /* 350 */ 147, 148, 149, 43, 151, 152, 153, 323, 324, 8, - /* 360 */ 9, 91, 3, 12, 13, 14, 15, 16, 20, 317, - /* 370 */ 22, 238, 239, 240, 241, 242, 172, 345, 174, 2, - /* 380 */ 328, 20, 171, 35, 173, 8, 9, 335, 356, 12, - /* 390 */ 13, 14, 15, 16, 121, 122, 317, 345, 50, 195, - /* 400 */ 196, 56, 198, 199, 200, 201, 202, 203, 204, 205, - /* 410 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - /* 420 */ 12, 13, 309, 4, 345, 164, 102, 101, 20, 0, - /* 430 */ 22, 14, 15, 16, 89, 377, 314, 92, 19, 317, - /* 440 */ 229, 33, 91, 35, 309, 121, 122, 123, 124, 125, - /* 450 */ 337, 77, 33, 180, 229, 14, 183, 90, 345, 401, - /* 460 */ 229, 20, 383, 350, 56, 352, 47, 337, 229, 61, - /* 470 */ 51, 21, 337, 229, 344, 56, 68, 398, 399, 400, - /* 480 */ 345, 402, 306, 353, 34, 350, 36, 352, 375, 60, - /* 490 */ 339, 0, 379, 380, 381, 382, 383, 384, 90, 386, - /* 500 */ 365, 350, 389, 60, 130, 131, 393, 394, 89, 35, - /* 510 */ 375, 92, 251, 167, 379, 380, 381, 382, 383, 384, - /* 520 */ 112, 386, 329, 338, 389, 374, 375, 376, 393, 394, - /* 530 */ 337, 309, 186, 187, 126, 127, 317, 386, 47, 346, - /* 540 */ 405, 365, 68, 68, 8, 9, 405, 321, 12, 13, - /* 550 */ 14, 15, 16, 418, 2, 314, 14, 422, 317, 418, - /* 560 */ 8, 9, 20, 422, 12, 13, 14, 15, 16, 343, - /* 570 */ 8, 9, 350, 354, 12, 13, 14, 15, 16, 20, - /* 580 */ 172, 405, 174, 8, 9, 1, 2, 12, 13, 14, - /* 590 */ 15, 16, 37, 68, 418, 309, 229, 61, 422, 365, - /* 600 */ 309, 43, 122, 195, 196, 246, 198, 199, 200, 201, - /* 610 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - /* 620 */ 212, 213, 214, 215, 12, 13, 309, 91, 338, 329, - /* 630 */ 22, 365, 20, 154, 22, 99, 350, 337, 345, 405, - /* 640 */ 199, 350, 309, 35, 0, 33, 346, 35, 93, 356, - /* 650 */ 95, 96, 418, 98, 337, 425, 422, 102, 337, 179, - /* 660 */ 180, 317, 345, 183, 323, 324, 91, 350, 56, 352, - /* 670 */ 337, 405, 328, 319, 353, 91, 68, 0, 345, 124, - /* 680 */ 68, 352, 309, 350, 418, 352, 44, 45, 422, 345, - /* 690 */ 154, 362, 375, 338, 340, 216, 379, 380, 381, 382, - /* 700 */ 383, 384, 90, 386, 309, 226, 389, 0, 375, 309, - /* 710 */ 393, 394, 379, 380, 381, 382, 383, 384, 159, 386, - /* 720 */ 112, 159, 389, 350, 112, 20, 393, 394, 395, 8, - /* 730 */ 9, 39, 309, 12, 13, 14, 15, 16, 126, 127, - /* 740 */ 407, 199, 337, 4, 309, 350, 102, 361, 415, 363, - /* 750 */ 350, 346, 216, 217, 218, 219, 220, 221, 222, 223, - /* 760 */ 224, 225, 226, 317, 309, 121, 122, 123, 124, 125, - /* 770 */ 20, 64, 65, 350, 328, 361, 337, 363, 71, 102, - /* 780 */ 172, 369, 174, 344, 172, 350, 174, 90, 81, 82, - /* 790 */ 309, 345, 353, 309, 87, 227, 228, 100, 121, 122, - /* 800 */ 123, 124, 125, 195, 196, 350, 248, 195, 196, 309, - /* 810 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - /* 820 */ 208, 209, 210, 211, 212, 213, 214, 215, 12, 13, - /* 830 */ 14, 350, 309, 338, 350, 377, 20, 317, 22, 309, - /* 840 */ 43, 229, 339, 317, 405, 64, 65, 365, 328, 33, - /* 850 */ 350, 35, 71, 350, 328, 339, 309, 418, 317, 401, - /* 860 */ 309, 422, 81, 82, 159, 345, 350, 337, 87, 328, - /* 870 */ 317, 345, 56, 350, 309, 345, 309, 374, 375, 310, - /* 880 */ 350, 328, 352, 326, 68, 416, 345, 405, 337, 386, - /* 890 */ 374, 375, 347, 42, 43, 350, 345, 350, 345, 309, - /* 900 */ 418, 350, 386, 352, 422, 375, 90, 309, 338, 379, - /* 910 */ 380, 381, 382, 383, 384, 350, 386, 350, 347, 389, - /* 920 */ 228, 350, 318, 393, 394, 395, 375, 309, 112, 102, - /* 930 */ 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, - /* 940 */ 350, 330, 126, 127, 333, 415, 412, 43, 350, 199, - /* 950 */ 317, 124, 8, 9, 22, 337, 12, 13, 14, 15, - /* 960 */ 16, 328, 94, 345, 338, 97, 317, 35, 350, 230, - /* 970 */ 352, 94, 337, 94, 97, 317, 97, 328, 345, 94, - /* 980 */ 318, 317, 97, 159, 160, 317, 328, 61, 172, 35, - /* 990 */ 174, 316, 328, 375, 345, 91, 328, 379, 380, 381, - /* 1000 */ 382, 383, 384, 345, 386, 61, 1, 2, 309, 345, - /* 1010 */ 365, 195, 196, 345, 198, 199, 200, 201, 202, 203, - /* 1020 */ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - /* 1030 */ 214, 215, 12, 13, 309, 417, 337, 317, 0, 0, - /* 1040 */ 20, 0, 22, 99, 345, 317, 0, 250, 328, 350, - /* 1050 */ 405, 352, 46, 33, 56, 35, 328, 349, 317, 35, - /* 1060 */ 22, 22, 337, 418, 378, 345, 403, 422, 22, 328, - /* 1070 */ 345, 126, 127, 345, 375, 350, 56, 352, 379, 380, - /* 1080 */ 381, 382, 383, 384, 317, 386, 345, 43, 68, 48, - /* 1090 */ 92, 396, 68, 43, 43, 328, 90, 43, 154, 419, - /* 1100 */ 375, 419, 317, 19, 379, 380, 381, 382, 383, 384, - /* 1110 */ 90, 386, 345, 328, 389, 419, 317, 33, 393, 394, - /* 1120 */ 395, 195, 423, 424, 43, 406, 43, 328, 174, 404, - /* 1130 */ 345, 47, 112, 13, 43, 91, 52, 53, 54, 55, - /* 1140 */ 56, 91, 91, 231, 345, 91, 126, 127, 43, 43, - /* 1150 */ 43, 43, 43, 43, 43, 35, 43, 373, 13, 372, - /* 1160 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - /* 1170 */ 226, 47, 91, 89, 91, 367, 92, 170, 42, 357, - /* 1180 */ 35, 20, 91, 317, 317, 357, 355, 154, 355, 317, - /* 1190 */ 317, 317, 172, 20, 174, 311, 91, 91, 91, 91, - /* 1200 */ 91, 91, 91, 311, 91, 20, 371, 321, 352, 125, - /* 1210 */ 321, 309, 20, 364, 20, 195, 196, 321, 198, 199, - /* 1220 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - /* 1230 */ 210, 211, 212, 213, 214, 215, 12, 13, 321, 337, - /* 1240 */ 364, 366, 158, 321, 20, 321, 22, 345, 317, 321, - /* 1250 */ 311, 337, 350, 337, 352, 337, 337, 33, 337, 35, - /* 1260 */ 176, 311, 178, 317, 337, 350, 337, 337, 371, 177, - /* 1270 */ 337, 337, 337, 370, 319, 352, 319, 375, 317, 317, - /* 1280 */ 56, 379, 380, 381, 382, 383, 384, 319, 386, 364, - /* 1290 */ 350, 389, 68, 236, 156, 319, 394, 360, 350, 18, - /* 1300 */ 358, 350, 350, 360, 23, 12, 13, 333, 350, 319, - /* 1310 */ 345, 20, 237, 350, 90, 22, 378, 411, 37, 38, - /* 1320 */ 360, 350, 41, 350, 411, 350, 33, 360, 35, 350, - /* 1330 */ 243, 163, 232, 245, 414, 20, 112, 244, 57, 58, - /* 1340 */ 59, 309, 373, 228, 345, 249, 247, 411, 90, 56, - /* 1350 */ 126, 127, 90, 252, 413, 377, 341, 410, 409, 350, - /* 1360 */ 317, 68, 327, 36, 408, 312, 319, 311, 368, 337, - /* 1370 */ 307, 90, 392, 420, 342, 363, 331, 345, 320, 331, - /* 1380 */ 421, 0, 350, 331, 352, 0, 179, 421, 0, 0, - /* 1390 */ 426, 421, 420, 42, 0, 35, 172, 420, 174, 189, - /* 1400 */ 35, 35, 35, 189, 0, 112, 35, 375, 35, 128, - /* 1410 */ 189, 379, 380, 381, 382, 383, 384, 0, 386, 195, - /* 1420 */ 196, 309, 198, 199, 200, 201, 202, 203, 204, 205, - /* 1430 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - /* 1440 */ 189, 0, 309, 35, 0, 164, 165, 166, 22, 337, - /* 1450 */ 169, 0, 174, 35, 342, 172, 0, 345, 168, 167, - /* 1460 */ 0, 0, 350, 0, 352, 172, 185, 174, 46, 188, - /* 1470 */ 337, 190, 191, 192, 193, 194, 42, 0, 345, 0, - /* 1480 */ 0, 0, 0, 350, 0, 352, 150, 375, 195, 196, - /* 1490 */ 0, 379, 380, 381, 382, 383, 384, 0, 386, 0, - /* 1500 */ 207, 208, 209, 210, 211, 212, 213, 0, 375, 0, - /* 1510 */ 229, 0, 379, 380, 381, 382, 383, 384, 35, 386, - /* 1520 */ 145, 145, 389, 0, 0, 309, 393, 394, 395, 0, - /* 1530 */ 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, - /* 1540 */ 0, 309, 0, 42, 0, 0, 0, 0, 0, 0, - /* 1550 */ 22, 0, 0, 337, 0, 0, 0, 0, 56, 56, - /* 1560 */ 0, 345, 0, 42, 39, 43, 350, 14, 352, 337, - /* 1570 */ 0, 0, 14, 46, 0, 0, 163, 345, 62, 0, - /* 1580 */ 39, 365, 350, 46, 352, 0, 0, 0, 0, 0, - /* 1590 */ 40, 375, 0, 0, 35, 379, 380, 381, 382, 383, - /* 1600 */ 384, 35, 386, 39, 39, 0, 39, 375, 47, 309, - /* 1610 */ 47, 379, 380, 381, 382, 383, 384, 35, 386, 47, - /* 1620 */ 39, 405, 39, 47, 0, 309, 35, 0, 0, 35, - /* 1630 */ 22, 0, 35, 35, 418, 22, 35, 337, 422, 43, - /* 1640 */ 0, 35, 99, 43, 22, 345, 0, 22, 49, 0, - /* 1650 */ 350, 22, 352, 337, 35, 0, 424, 0, 35, 0, - /* 1660 */ 0, 345, 20, 22, 159, 365, 350, 35, 352, 35, - /* 1670 */ 97, 0, 22, 175, 159, 375, 156, 0, 0, 379, - /* 1680 */ 380, 381, 382, 383, 384, 0, 386, 309, 35, 0, - /* 1690 */ 184, 375, 0, 0, 90, 379, 380, 381, 382, 383, - /* 1700 */ 384, 91, 386, 0, 388, 405, 309, 90, 90, 39, - /* 1710 */ 90, 100, 46, 46, 46, 337, 43, 43, 418, 233, - /* 1720 */ 342, 91, 422, 345, 91, 90, 157, 159, 350, 90, - /* 1730 */ 352, 227, 46, 90, 337, 155, 91, 90, 161, 342, - /* 1740 */ 43, 90, 345, 91, 90, 43, 90, 350, 35, 352, - /* 1750 */ 233, 43, 91, 375, 91, 91, 46, 379, 380, 381, - /* 1760 */ 382, 383, 384, 46, 386, 43, 91, 309, 33, 35, - /* 1770 */ 91, 35, 375, 35, 35, 35, 379, 380, 381, 382, - /* 1780 */ 383, 384, 47, 386, 317, 309, 22, 52, 53, 54, - /* 1790 */ 55, 56, 2, 43, 90, 337, 90, 195, 91, 46, - /* 1800 */ 91, 90, 90, 345, 46, 91, 90, 22, 350, 197, - /* 1810 */ 352, 90, 345, 337, 91, 35, 101, 233, 35, 90, - /* 1820 */ 90, 345, 91, 35, 89, 22, 350, 92, 352, 35, - /* 1830 */ 35, 90, 365, 375, 91, 309, 91, 379, 380, 381, - /* 1840 */ 382, 383, 384, 91, 386, 90, 35, 90, 102, 35, - /* 1850 */ 383, 375, 90, 90, 22, 379, 380, 381, 382, 383, - /* 1860 */ 384, 114, 386, 337, 90, 398, 399, 400, 114, 402, - /* 1870 */ 114, 345, 405, 114, 43, 62, 350, 61, 352, 35, - /* 1880 */ 35, 35, 35, 35, 35, 418, 35, 309, 35, 422, - /* 1890 */ 155, 156, 68, 158, 88, 35, 35, 162, 43, 22, - /* 1900 */ 35, 375, 22, 35, 35, 379, 380, 381, 382, 383, - /* 1910 */ 384, 68, 386, 178, 35, 337, 35, 35, 35, 35, - /* 1920 */ 22, 35, 0, 345, 35, 47, 39, 0, 350, 35, - /* 1930 */ 352, 0, 47, 0, 39, 309, 35, 47, 39, 35, - /* 1940 */ 47, 39, 0, 35, 35, 0, 22, 309, 22, 21, - /* 1950 */ 20, 22, 427, 375, 427, 21, 427, 379, 380, 381, - /* 1960 */ 382, 383, 384, 337, 386, 427, 427, 427, 427, 427, - /* 1970 */ 427, 345, 427, 427, 427, 337, 350, 427, 352, 427, - /* 1980 */ 427, 427, 427, 345, 427, 427, 427, 427, 350, 427, - /* 1990 */ 352, 427, 427, 427, 427, 427, 427, 309, 427, 427, - /* 2000 */ 427, 375, 427, 427, 427, 379, 380, 381, 382, 383, - /* 2010 */ 384, 427, 386, 375, 309, 427, 427, 379, 380, 381, - /* 2020 */ 382, 383, 384, 427, 386, 337, 427, 427, 427, 427, - /* 2030 */ 427, 427, 427, 345, 427, 427, 427, 427, 350, 427, - /* 2040 */ 352, 427, 337, 427, 427, 427, 427, 427, 427, 427, - /* 2050 */ 345, 427, 427, 427, 427, 350, 427, 352, 427, 427, - /* 2060 */ 427, 427, 427, 375, 427, 427, 427, 379, 380, 381, - /* 2070 */ 382, 383, 384, 427, 386, 427, 427, 309, 427, 427, - /* 2080 */ 375, 427, 427, 427, 379, 380, 381, 382, 383, 384, - /* 2090 */ 427, 386, 427, 309, 427, 427, 427, 427, 427, 427, - /* 2100 */ 427, 427, 427, 427, 427, 337, 427, 427, 427, 427, - /* 2110 */ 427, 427, 427, 345, 427, 427, 427, 427, 350, 427, - /* 2120 */ 352, 337, 427, 427, 427, 427, 427, 427, 427, 345, - /* 2130 */ 427, 427, 427, 427, 350, 427, 352, 427, 427, 427, - /* 2140 */ 427, 427, 427, 375, 427, 309, 427, 379, 380, 381, - /* 2150 */ 382, 383, 384, 427, 386, 427, 427, 427, 427, 375, - /* 2160 */ 427, 309, 427, 379, 380, 381, 382, 383, 384, 427, - /* 2170 */ 386, 427, 427, 337, 427, 427, 427, 427, 427, 427, - /* 2180 */ 427, 345, 427, 427, 427, 427, 350, 427, 352, 337, - /* 2190 */ 427, 427, 427, 427, 427, 427, 427, 345, 427, 427, - /* 2200 */ 427, 309, 350, 427, 352, 427, 427, 427, 427, 427, - /* 2210 */ 427, 375, 427, 427, 427, 379, 380, 381, 382, 383, - /* 2220 */ 384, 427, 386, 309, 427, 427, 427, 375, 427, 337, - /* 2230 */ 427, 379, 380, 381, 382, 383, 384, 345, 386, 427, - /* 2240 */ 427, 427, 350, 427, 352, 427, 427, 427, 427, 427, - /* 2250 */ 427, 337, 427, 427, 427, 427, 427, 427, 427, 345, - /* 2260 */ 427, 427, 427, 309, 350, 427, 352, 375, 427, 427, - /* 2270 */ 427, 379, 380, 381, 382, 383, 384, 427, 386, 427, - /* 2280 */ 427, 309, 427, 427, 427, 427, 427, 427, 427, 375, - /* 2290 */ 427, 337, 427, 379, 380, 381, 382, 383, 384, 345, - /* 2300 */ 386, 427, 427, 427, 350, 427, 352, 427, 427, 337, - /* 2310 */ 427, 427, 427, 427, 427, 427, 427, 345, 427, 427, - /* 2320 */ 427, 427, 350, 427, 352, 427, 427, 427, 427, 375, - /* 2330 */ 427, 309, 427, 379, 380, 381, 382, 383, 384, 427, - /* 2340 */ 386, 427, 427, 309, 427, 427, 427, 375, 427, 427, - /* 2350 */ 427, 379, 380, 381, 382, 383, 384, 427, 386, 337, - /* 2360 */ 427, 427, 427, 427, 427, 427, 427, 345, 427, 427, - /* 2370 */ 427, 337, 350, 427, 352, 427, 427, 427, 427, 345, - /* 2380 */ 427, 427, 427, 427, 350, 427, 352, 427, 427, 427, - /* 2390 */ 427, 427, 427, 427, 309, 427, 427, 375, 427, 427, - /* 2400 */ 427, 379, 380, 381, 382, 383, 384, 427, 386, 375, - /* 2410 */ 427, 427, 427, 379, 380, 381, 382, 383, 384, 427, - /* 2420 */ 386, 427, 337, 427, 427, 427, 427, 427, 427, 427, - /* 2430 */ 345, 427, 427, 427, 427, 350, 427, 352, 427, 427, - /* 2440 */ 427, 427, 427, 427, 309, 427, 427, 427, 427, 427, - /* 2450 */ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, - /* 2460 */ 375, 427, 427, 427, 379, 380, 381, 382, 383, 384, - /* 2470 */ 427, 386, 337, 427, 427, 427, 427, 427, 427, 427, - /* 2480 */ 345, 427, 427, 427, 427, 350, 427, 352, 427, 427, - /* 2490 */ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, - /* 2500 */ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, - /* 2510 */ 375, 427, 427, 427, 379, 380, 381, 382, 383, 384, - /* 2520 */ 427, 386, + /* 210 */ 210, 211, 212, 213, 214, 215, 216, 217, 12, 13, + /* 220 */ 14, 91, 93, 18, 94, 20, 20, 321, 22, 311, + /* 230 */ 182, 231, 27, 185, 407, 30, 367, 231, 319, 33, + /* 240 */ 159, 35, 231, 339, 341, 319, 93, 420, 342, 330, + /* 250 */ 346, 424, 47, 339, 49, 352, 51, 339, 407, 355, + /* 260 */ 346, 231, 56, 20, 231, 347, 347, 61, 253, 355, + /* 270 */ 352, 420, 354, 347, 68, 424, 407, 8, 9, 376, + /* 280 */ 377, 12, 13, 14, 15, 16, 341, 157, 158, 420, + /* 290 */ 160, 388, 92, 424, 164, 377, 91, 352, 92, 381, + /* 300 */ 382, 383, 384, 385, 386, 20, 388, 201, 103, 391, + /* 310 */ 180, 385, 43, 395, 396, 397, 20, 236, 237, 338, + /* 320 */ 114, 376, 377, 378, 406, 399, 400, 401, 402, 363, + /* 330 */ 404, 365, 351, 388, 128, 129, 131, 308, 231, 134, + /* 340 */ 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + /* 350 */ 145, 146, 147, 148, 149, 150, 151, 0, 153, 154, + /* 360 */ 155, 379, 105, 106, 107, 108, 109, 110, 111, 112, + /* 370 */ 113, 114, 115, 319, 117, 118, 119, 120, 121, 122, + /* 380 */ 174, 331, 176, 37, 330, 403, 8, 9, 92, 339, + /* 390 */ 12, 13, 14, 15, 16, 324, 367, 20, 348, 328, + /* 400 */ 20, 347, 22, 197, 198, 48, 200, 201, 202, 203, + /* 410 */ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + /* 420 */ 214, 215, 216, 217, 12, 13, 311, 4, 353, 354, + /* 430 */ 50, 231, 20, 363, 22, 365, 407, 20, 14, 15, + /* 440 */ 16, 95, 19, 97, 98, 33, 100, 35, 339, 420, + /* 450 */ 104, 20, 123, 424, 339, 346, 33, 0, 64, 65, + /* 460 */ 14, 0, 347, 60, 355, 71, 20, 352, 56, 354, + /* 470 */ 47, 93, 126, 61, 51, 81, 82, 2, 331, 56, + /* 480 */ 68, 87, 367, 8, 9, 331, 339, 12, 13, 14, + /* 490 */ 15, 16, 377, 339, 39, 348, 381, 382, 383, 384, + /* 500 */ 385, 386, 348, 388, 92, 103, 391, 156, 319, 319, + /* 510 */ 395, 396, 183, 184, 91, 316, 407, 94, 319, 311, + /* 520 */ 330, 60, 407, 18, 339, 92, 114, 337, 23, 420, + /* 530 */ 311, 311, 347, 424, 169, 420, 347, 347, 2, 424, + /* 540 */ 128, 129, 37, 38, 8, 9, 41, 68, 12, 13, + /* 550 */ 14, 15, 16, 188, 189, 12, 13, 311, 339, 319, + /* 560 */ 352, 104, 57, 58, 59, 22, 347, 0, 383, 218, + /* 570 */ 330, 352, 352, 354, 385, 354, 33, 337, 35, 228, + /* 580 */ 123, 124, 125, 126, 127, 364, 174, 347, 176, 400, + /* 590 */ 401, 402, 161, 404, 68, 311, 377, 92, 352, 56, + /* 600 */ 381, 382, 383, 384, 385, 386, 173, 388, 175, 197, + /* 610 */ 198, 68, 200, 201, 202, 203, 204, 205, 206, 207, + /* 620 */ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + /* 630 */ 12, 13, 379, 22, 311, 130, 352, 311, 20, 327, + /* 640 */ 22, 329, 14, 0, 425, 426, 35, 201, 20, 340, + /* 650 */ 20, 33, 22, 35, 8, 9, 403, 114, 12, 13, + /* 660 */ 14, 15, 16, 0, 231, 35, 316, 367, 340, 319, + /* 670 */ 311, 166, 167, 168, 56, 352, 171, 340, 352, 68, + /* 680 */ 50, 124, 311, 8, 9, 230, 68, 12, 13, 14, + /* 690 */ 15, 16, 187, 319, 311, 190, 323, 192, 193, 194, + /* 700 */ 195, 196, 311, 60, 330, 44, 45, 407, 8, 9, + /* 710 */ 92, 352, 12, 13, 14, 15, 16, 174, 345, 176, + /* 720 */ 420, 347, 339, 352, 424, 114, 340, 64, 65, 311, + /* 730 */ 347, 311, 114, 367, 71, 352, 231, 354, 181, 182, + /* 740 */ 197, 198, 185, 352, 81, 82, 128, 129, 311, 35, + /* 750 */ 87, 379, 209, 210, 211, 212, 213, 214, 215, 197, + /* 760 */ 377, 61, 229, 230, 381, 382, 383, 384, 385, 386, + /* 770 */ 352, 388, 352, 407, 391, 403, 104, 347, 395, 396, + /* 780 */ 397, 4, 68, 325, 326, 174, 420, 176, 358, 352, + /* 790 */ 424, 104, 174, 93, 176, 123, 124, 125, 126, 127, + /* 800 */ 417, 101, 240, 241, 242, 243, 244, 161, 197, 198, + /* 810 */ 311, 311, 311, 126, 311, 197, 198, 20, 200, 201, + /* 820 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + /* 830 */ 212, 213, 214, 215, 216, 217, 12, 13, 14, 339, + /* 840 */ 0, 339, 77, 371, 20, 35, 22, 347, 311, 231, + /* 850 */ 348, 352, 352, 352, 354, 352, 156, 33, 311, 35, + /* 860 */ 339, 21, 347, 3, 24, 25, 26, 27, 28, 29, + /* 870 */ 30, 31, 32, 358, 325, 326, 355, 377, 68, 20, + /* 880 */ 56, 381, 382, 383, 384, 385, 386, 349, 388, 352, + /* 890 */ 352, 391, 68, 42, 43, 395, 396, 132, 133, 352, + /* 900 */ 349, 8, 9, 352, 341, 12, 13, 14, 15, 16, + /* 910 */ 332, 43, 340, 335, 311, 352, 92, 0, 218, 219, + /* 920 */ 220, 221, 222, 223, 224, 225, 226, 227, 228, 8, + /* 930 */ 9, 311, 319, 12, 13, 14, 15, 16, 114, 376, + /* 940 */ 377, 378, 339, 330, 43, 319, 340, 344, 0, 22, + /* 950 */ 347, 388, 128, 129, 61, 352, 330, 354, 161, 339, + /* 960 */ 347, 93, 35, 96, 47, 96, 99, 347, 99, 312, + /* 970 */ 22, 319, 352, 347, 354, 161, 162, 1, 2, 319, + /* 980 */ 377, 56, 330, 43, 381, 382, 383, 384, 385, 386, + /* 990 */ 330, 388, 319, 96, 101, 0, 99, 377, 174, 347, + /* 1000 */ 176, 381, 382, 383, 384, 385, 386, 347, 388, 232, + /* 1010 */ 96, 391, 43, 99, 93, 395, 396, 22, 427, 94, + /* 1020 */ 347, 197, 198, 0, 200, 201, 202, 203, 204, 205, + /* 1030 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + /* 1040 */ 216, 217, 12, 13, 319, 22, 43, 328, 319, 156, + /* 1050 */ 20, 43, 22, 43, 19, 330, 319, 35, 385, 330, + /* 1060 */ 201, 320, 93, 33, 311, 35, 35, 330, 33, 128, + /* 1070 */ 129, 418, 347, 400, 401, 402, 347, 404, 61, 46, + /* 1080 */ 13, 43, 47, 43, 347, 92, 56, 52, 53, 54, + /* 1090 */ 55, 56, 339, 0, 414, 102, 93, 344, 68, 319, + /* 1100 */ 347, 93, 35, 93, 311, 352, 43, 354, 248, 339, + /* 1110 */ 330, 218, 219, 220, 221, 222, 223, 224, 225, 226, + /* 1120 */ 227, 228, 92, 43, 13, 92, 91, 347, 320, 94, + /* 1130 */ 377, 93, 339, 93, 381, 382, 383, 384, 385, 386, + /* 1140 */ 347, 388, 351, 43, 114, 352, 35, 354, 318, 43, + /* 1150 */ 43, 250, 319, 380, 319, 319, 93, 319, 128, 129, + /* 1160 */ 405, 43, 127, 330, 398, 330, 330, 421, 330, 421, + /* 1170 */ 377, 43, 421, 93, 381, 382, 383, 384, 385, 386, + /* 1180 */ 347, 388, 347, 347, 391, 347, 408, 233, 395, 396, + /* 1190 */ 397, 375, 252, 93, 47, 160, 374, 104, 176, 93, + /* 1200 */ 93, 319, 409, 43, 174, 43, 176, 176, 172, 42, + /* 1210 */ 417, 93, 330, 178, 197, 180, 123, 124, 125, 126, + /* 1220 */ 127, 93, 369, 359, 20, 319, 319, 197, 198, 347, + /* 1230 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + /* 1240 */ 210, 211, 212, 213, 214, 215, 216, 217, 12, 13, + /* 1250 */ 311, 319, 319, 93, 359, 93, 20, 156, 22, 357, + /* 1260 */ 357, 319, 330, 330, 319, 319, 20, 20, 313, 33, + /* 1270 */ 313, 35, 373, 323, 354, 323, 20, 366, 339, 347, + /* 1280 */ 347, 20, 323, 368, 366, 323, 347, 323, 323, 319, + /* 1290 */ 323, 352, 56, 354, 313, 339, 319, 339, 313, 339, + /* 1300 */ 339, 352, 339, 373, 68, 339, 179, 339, 321, 372, + /* 1310 */ 311, 339, 339, 339, 339, 321, 377, 319, 321, 319, + /* 1320 */ 381, 382, 383, 384, 385, 386, 319, 388, 92, 238, + /* 1330 */ 391, 158, 354, 321, 395, 396, 397, 366, 339, 321, + /* 1340 */ 352, 362, 352, 352, 352, 406, 347, 20, 362, 360, + /* 1350 */ 114, 352, 347, 354, 347, 335, 352, 413, 352, 239, + /* 1360 */ 380, 352, 245, 362, 128, 129, 352, 352, 352, 416, + /* 1370 */ 165, 247, 246, 362, 367, 234, 377, 20, 230, 347, + /* 1380 */ 381, 382, 383, 384, 385, 386, 251, 388, 249, 92, + /* 1390 */ 391, 254, 385, 411, 395, 396, 397, 413, 415, 375, + /* 1400 */ 379, 92, 343, 352, 329, 406, 410, 400, 401, 402, + /* 1410 */ 174, 404, 176, 394, 407, 413, 319, 321, 36, 314, + /* 1420 */ 370, 313, 365, 333, 322, 412, 311, 420, 333, 0, + /* 1430 */ 309, 424, 333, 197, 198, 181, 200, 201, 202, 203, + /* 1440 */ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + /* 1450 */ 214, 215, 216, 217, 339, 428, 0, 423, 0, 422, + /* 1460 */ 0, 422, 347, 42, 423, 423, 422, 352, 0, 354, + /* 1470 */ 191, 35, 35, 35, 35, 191, 0, 35, 35, 191, + /* 1480 */ 0, 191, 367, 0, 35, 0, 22, 311, 0, 35, + /* 1490 */ 176, 0, 377, 174, 0, 170, 381, 382, 383, 384, + /* 1500 */ 385, 386, 169, 388, 0, 0, 0, 46, 0, 0, + /* 1510 */ 0, 42, 0, 0, 152, 339, 0, 0, 0, 0, + /* 1520 */ 0, 147, 407, 347, 35, 0, 147, 0, 352, 0, + /* 1530 */ 354, 0, 0, 0, 0, 420, 0, 0, 0, 424, + /* 1540 */ 0, 0, 0, 367, 311, 0, 0, 0, 0, 42, + /* 1550 */ 0, 0, 0, 377, 56, 0, 56, 381, 382, 383, + /* 1560 */ 384, 385, 386, 0, 388, 22, 0, 0, 0, 0, + /* 1570 */ 311, 0, 339, 0, 0, 14, 46, 42, 39, 14, + /* 1580 */ 347, 0, 0, 407, 0, 352, 0, 354, 165, 0, + /* 1590 */ 0, 0, 43, 0, 0, 39, 420, 40, 339, 46, + /* 1600 */ 424, 39, 0, 0, 0, 35, 347, 47, 0, 0, + /* 1610 */ 377, 352, 35, 354, 381, 382, 383, 384, 385, 386, + /* 1620 */ 387, 388, 389, 390, 39, 47, 62, 39, 311, 0, + /* 1630 */ 35, 39, 35, 0, 47, 39, 377, 22, 0, 20, + /* 1640 */ 381, 382, 383, 384, 385, 386, 311, 388, 47, 35, + /* 1650 */ 391, 35, 35, 43, 43, 396, 339, 35, 99, 101, + /* 1660 */ 35, 22, 0, 22, 347, 0, 22, 49, 0, 352, + /* 1670 */ 22, 354, 35, 0, 339, 0, 0, 35, 35, 22, + /* 1680 */ 0, 35, 347, 161, 0, 22, 158, 352, 177, 354, + /* 1690 */ 0, 0, 0, 0, 377, 0, 311, 92, 381, 382, + /* 1700 */ 383, 384, 385, 386, 35, 388, 93, 186, 0, 0, + /* 1710 */ 39, 229, 377, 92, 102, 43, 381, 382, 383, 384, + /* 1720 */ 385, 386, 311, 388, 339, 46, 92, 92, 92, 43, + /* 1730 */ 235, 43, 347, 161, 235, 159, 419, 352, 163, 354, + /* 1740 */ 161, 35, 93, 92, 46, 93, 311, 93, 92, 46, + /* 1750 */ 339, 93, 92, 92, 43, 344, 157, 93, 347, 92, + /* 1760 */ 46, 426, 377, 352, 43, 354, 381, 382, 383, 384, + /* 1770 */ 385, 386, 46, 388, 339, 390, 93, 92, 46, 344, + /* 1780 */ 93, 43, 347, 35, 35, 35, 35, 352, 377, 354, + /* 1790 */ 93, 35, 381, 382, 383, 384, 385, 386, 93, 388, + /* 1800 */ 2, 22, 43, 197, 311, 92, 46, 46, 93, 92, + /* 1810 */ 22, 93, 377, 93, 92, 235, 381, 382, 383, 384, + /* 1820 */ 385, 386, 92, 388, 93, 92, 199, 92, 103, 35, + /* 1830 */ 35, 92, 339, 93, 35, 92, 35, 93, 92, 35, + /* 1840 */ 347, 35, 22, 116, 92, 352, 93, 354, 93, 92, + /* 1850 */ 116, 35, 116, 116, 92, 311, 92, 92, 104, 22, + /* 1860 */ 43, 35, 62, 61, 35, 311, 35, 35, 35, 35, + /* 1870 */ 377, 35, 90, 35, 381, 382, 383, 384, 385, 386, + /* 1880 */ 35, 388, 35, 339, 35, 43, 68, 35, 22, 35, + /* 1890 */ 22, 347, 35, 339, 35, 68, 352, 35, 354, 35, + /* 1900 */ 35, 347, 35, 22, 35, 35, 352, 0, 354, 35, + /* 1910 */ 47, 39, 0, 35, 39, 0, 39, 35, 311, 0, + /* 1920 */ 47, 377, 35, 47, 39, 381, 382, 383, 384, 385, + /* 1930 */ 386, 377, 388, 47, 311, 381, 382, 383, 384, 385, + /* 1940 */ 386, 0, 388, 35, 35, 0, 339, 22, 21, 429, + /* 1950 */ 22, 22, 21, 20, 347, 429, 429, 429, 311, 352, + /* 1960 */ 429, 354, 339, 429, 429, 429, 429, 429, 429, 429, + /* 1970 */ 347, 429, 429, 429, 429, 352, 429, 354, 429, 429, + /* 1980 */ 429, 429, 429, 429, 377, 429, 339, 429, 381, 382, + /* 1990 */ 383, 384, 385, 386, 347, 388, 429, 429, 429, 352, + /* 2000 */ 377, 354, 429, 429, 381, 382, 383, 384, 385, 386, + /* 2010 */ 311, 388, 429, 429, 429, 429, 429, 429, 429, 429, + /* 2020 */ 429, 429, 429, 429, 377, 429, 429, 429, 381, 382, + /* 2030 */ 383, 384, 385, 386, 311, 388, 429, 429, 339, 429, + /* 2040 */ 429, 429, 429, 429, 429, 429, 347, 429, 429, 429, + /* 2050 */ 429, 352, 429, 354, 429, 429, 429, 429, 311, 429, + /* 2060 */ 429, 429, 339, 429, 429, 429, 429, 429, 429, 429, + /* 2070 */ 347, 429, 429, 429, 311, 352, 377, 354, 429, 429, + /* 2080 */ 381, 382, 383, 384, 385, 386, 339, 388, 429, 429, + /* 2090 */ 429, 429, 429, 429, 347, 429, 429, 429, 429, 352, + /* 2100 */ 377, 354, 339, 429, 381, 382, 383, 384, 385, 386, + /* 2110 */ 347, 388, 429, 429, 429, 352, 429, 354, 429, 429, + /* 2120 */ 429, 429, 429, 429, 377, 429, 429, 429, 381, 382, + /* 2130 */ 383, 384, 385, 386, 429, 388, 429, 429, 429, 429, + /* 2140 */ 377, 429, 429, 429, 381, 382, 383, 384, 385, 386, + /* 2150 */ 429, 388, 311, 429, 429, 429, 429, 429, 429, 429, + /* 2160 */ 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, + /* 2170 */ 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, + /* 2180 */ 339, 429, 429, 429, 429, 429, 429, 429, 347, 429, + /* 2190 */ 429, 429, 429, 352, 429, 354, 429, 429, 429, 429, + /* 2200 */ 429, 429, 429, 311, 429, 429, 429, 429, 429, 429, + /* 2210 */ 429, 429, 429, 311, 429, 429, 429, 429, 377, 429, + /* 2220 */ 429, 429, 381, 382, 383, 384, 385, 386, 429, 388, + /* 2230 */ 429, 339, 429, 429, 429, 429, 429, 429, 429, 347, + /* 2240 */ 429, 339, 429, 429, 352, 429, 354, 429, 429, 347, + /* 2250 */ 429, 429, 429, 429, 352, 429, 354, 429, 429, 429, + /* 2260 */ 429, 429, 429, 429, 429, 429, 311, 429, 429, 377, + /* 2270 */ 429, 429, 429, 381, 382, 383, 384, 385, 386, 377, + /* 2280 */ 388, 429, 311, 381, 382, 383, 384, 385, 386, 429, + /* 2290 */ 388, 429, 429, 429, 339, 429, 429, 429, 429, 429, + /* 2300 */ 429, 429, 347, 429, 429, 429, 311, 352, 429, 354, + /* 2310 */ 339, 429, 429, 429, 429, 429, 429, 429, 347, 429, + /* 2320 */ 429, 429, 311, 352, 429, 354, 429, 429, 429, 429, + /* 2330 */ 429, 429, 377, 429, 339, 429, 381, 382, 383, 384, + /* 2340 */ 385, 386, 347, 388, 429, 429, 311, 352, 377, 354, + /* 2350 */ 339, 429, 381, 382, 383, 384, 385, 386, 347, 388, + /* 2360 */ 429, 429, 429, 352, 429, 354, 429, 429, 429, 429, + /* 2370 */ 311, 429, 377, 429, 339, 429, 381, 382, 383, 384, + /* 2380 */ 385, 386, 347, 388, 429, 429, 311, 352, 377, 354, + /* 2390 */ 429, 429, 381, 382, 383, 384, 385, 386, 339, 388, + /* 2400 */ 429, 429, 429, 429, 429, 429, 347, 429, 429, 429, + /* 2410 */ 429, 352, 377, 354, 339, 429, 381, 382, 383, 384, + /* 2420 */ 385, 386, 347, 388, 429, 429, 429, 352, 429, 354, + /* 2430 */ 429, 429, 429, 429, 429, 429, 377, 429, 429, 429, + /* 2440 */ 381, 382, 383, 384, 385, 386, 429, 388, 429, 429, + /* 2450 */ 429, 429, 377, 429, 429, 429, 381, 382, 383, 384, + /* 2460 */ 385, 386, 429, 388, }; -#define YY_SHIFT_COUNT (671) +#define YY_SHIFT_COUNT (673) #define YY_SHIFT_MIN (0) #define YY_SHIFT_MAX (1945) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1281, 0, 0, 204, 204, 408, 408, 408, 612, 612, - /* 10 */ 408, 408, 816, 1020, 1224, 1020, 1020, 1020, 1020, 1020, - /* 20 */ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, - /* 30 */ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, - /* 40 */ 1020, 1020, 231, 231, 150, 150, 150, 1293, 1293, 239, - /* 50 */ 1293, 1293, 211, 225, 244, 367, 244, 20, 20, 84, - /* 60 */ 84, 5, 67, 244, 244, 20, 20, 20, 20, 20, - /* 70 */ 20, 20, 20, 20, 20, 55, 20, 20, 20, 242, - /* 80 */ 20, 20, 269, 20, 20, 269, 288, 20, 269, 269, - /* 90 */ 269, 20, 443, 203, 536, 944, 944, 217, 608, 608, - /* 100 */ 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, - /* 110 */ 608, 608, 608, 608, 608, 608, 608, 555, 781, 67, - /* 120 */ 313, 313, 111, 474, 429, 559, 559, 559, 474, 361, - /* 130 */ 361, 242, 8, 8, 269, 269, 475, 475, 326, 525, - /* 140 */ 72, 72, 72, 72, 72, 72, 72, 1084, 137, 261, - /* 150 */ 707, 133, 348, 29, 441, 542, 14, 642, 827, 705, - /* 160 */ 568, 692, 568, 851, 359, 359, 359, 739, 750, 912, - /* 170 */ 1124, 1007, 1136, 1161, 1161, 1136, 1033, 1033, 1161, 1161, - /* 180 */ 1161, 1173, 1173, 1185, 55, 242, 55, 1192, 1194, 55, - /* 190 */ 1192, 55, 55, 55, 1161, 55, 1173, 269, 269, 269, - /* 200 */ 269, 269, 269, 269, 269, 269, 269, 269, 1161, 1173, - /* 210 */ 475, 1185, 443, 1092, 242, 443, 1161, 1161, 1192, 443, - /* 220 */ 1057, 475, 475, 475, 475, 1057, 475, 1138, 443, 326, - /* 230 */ 443, 361, 1291, 475, 1075, 1057, 475, 475, 1075, 1057, - /* 240 */ 475, 475, 269, 1087, 1168, 1075, 1088, 1093, 1100, 912, - /* 250 */ 1115, 361, 1315, 1096, 1099, 1101, 1096, 1099, 1096, 1099, - /* 260 */ 1258, 1262, 475, 525, 1161, 443, 1327, 1173, 2522, 2522, - /* 270 */ 2522, 2522, 2522, 2522, 2522, 69, 1735, 23, 419, 270, - /* 280 */ 310, 351, 377, 552, 562, 575, 644, 721, 721, 721, - /* 290 */ 721, 721, 721, 721, 721, 677, 324, 12, 12, 480, - /* 300 */ 273, 346, 345, 374, 450, 106, 584, 479, 417, 417, - /* 310 */ 417, 417, 904, 491, 932, 868, 877, 879, 885, 1038, - /* 320 */ 1039, 1046, 998, 824, 1044, 1050, 1051, 1054, 1081, 1083, - /* 330 */ 1091, 1005, 945, 558, 797, 1105, 54, 954, 926, 1106, - /* 340 */ 1006, 1107, 1108, 1109, 1110, 1111, 1113, 697, 1120, 1145, - /* 350 */ 1024, 1041, 1381, 1385, 1207, 1388, 1389, 1351, 1394, 1360, - /* 360 */ 1210, 1365, 1366, 1367, 1214, 1404, 1371, 1373, 1221, 1417, - /* 370 */ 1251, 1441, 1408, 1444, 1426, 1451, 1418, 1278, 1283, 1456, - /* 380 */ 1463, 1290, 1292, 1460, 1461, 1422, 1479, 1480, 1481, 1434, - /* 390 */ 1477, 1482, 1484, 1336, 1490, 1497, 1499, 1507, 1509, 1375, - /* 400 */ 1483, 1511, 1376, 1523, 1524, 1529, 1530, 1531, 1532, 1533, - /* 410 */ 1534, 1535, 1536, 1538, 1539, 1540, 1542, 1501, 1544, 1545, - /* 420 */ 1546, 1547, 1548, 1549, 1528, 1551, 1552, 1554, 1555, 1556, - /* 430 */ 1502, 1557, 1503, 1560, 1562, 1521, 1525, 1522, 1553, 1527, - /* 440 */ 1558, 1537, 1570, 1550, 1541, 1571, 1574, 1575, 1564, 1413, - /* 450 */ 1585, 1586, 1587, 1516, 1579, 1588, 1559, 1561, 1565, 1589, - /* 460 */ 1566, 1563, 1567, 1592, 1582, 1572, 1581, 1593, 1591, 1576, - /* 470 */ 1583, 1605, 1624, 1627, 1628, 1543, 1573, 1594, 1608, 1631, - /* 480 */ 1597, 1598, 1596, 1600, 1601, 1606, 1613, 1640, 1622, 1646, - /* 490 */ 1625, 1599, 1649, 1629, 1619, 1655, 1623, 1657, 1632, 1659, - /* 500 */ 1641, 1642, 1660, 1505, 1634, 1671, 1498, 1650, 1515, 1520, - /* 510 */ 1677, 1678, 1568, 1577, 1685, 1692, 1693, 1604, 1610, 1653, - /* 520 */ 1506, 1689, 1617, 1569, 1618, 1703, 1670, 1580, 1620, 1611, - /* 530 */ 1666, 1673, 1486, 1635, 1630, 1639, 1633, 1645, 1643, 1674, - /* 540 */ 1652, 1647, 1651, 1654, 1661, 1697, 1667, 1668, 1656, 1702, - /* 550 */ 1517, 1663, 1664, 1686, 1504, 1708, 1710, 1717, 1675, 1722, - /* 560 */ 1584, 1679, 1713, 1734, 1736, 1738, 1739, 1740, 1679, 1790, - /* 570 */ 1764, 1602, 1750, 1704, 1707, 1706, 1709, 1711, 1714, 1753, - /* 580 */ 1712, 1716, 1758, 1785, 1612, 1721, 1715, 1723, 1780, 1783, - /* 590 */ 1729, 1731, 1788, 1730, 1743, 1794, 1741, 1745, 1795, 1755, - /* 600 */ 1752, 1811, 1757, 1747, 1754, 1756, 1759, 1803, 1746, 1762, - /* 610 */ 1763, 1814, 1774, 1831, 1831, 1832, 1813, 1816, 1844, 1845, - /* 620 */ 1846, 1847, 1848, 1849, 1851, 1853, 1824, 1806, 1855, 1860, - /* 630 */ 1861, 1877, 1865, 1880, 1868, 1869, 1843, 1596, 1879, 1600, - /* 640 */ 1881, 1882, 1883, 1884, 1898, 1886, 1922, 1889, 1878, 1887, - /* 650 */ 1927, 1894, 1885, 1895, 1931, 1901, 1890, 1899, 1933, 1904, - /* 660 */ 1893, 1902, 1942, 1908, 1909, 1945, 1924, 1928, 1926, 1929, - /* 670 */ 1934, 1930, + /* 0 */ 505, 0, 0, 206, 206, 412, 412, 412, 618, 618, + /* 10 */ 412, 412, 824, 1030, 1236, 1030, 1030, 1030, 1030, 1030, + /* 20 */ 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, + /* 30 */ 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, + /* 40 */ 1030, 1030, 33, 33, 296, 296, 296, 543, 543, 107, + /* 50 */ 543, 543, 433, 30, 6, 200, 6, 73, 73, 21, + /* 60 */ 21, 11, 51, 6, 6, 73, 73, 73, 73, 73, + /* 70 */ 73, 73, 73, 73, 73, 56, 73, 73, 73, 243, + /* 80 */ 73, 73, 285, 73, 73, 285, 377, 73, 285, 285, + /* 90 */ 285, 73, 403, 205, 700, 893, 893, 80, 611, 611, + /* 100 */ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, + /* 110 */ 611, 611, 611, 611, 611, 611, 611, 346, 394, 51, + /* 120 */ 628, 628, 461, 714, 643, 431, 431, 431, 714, 417, + /* 130 */ 417, 243, 567, 567, 285, 285, 479, 479, 402, 526, + /* 140 */ 257, 257, 257, 257, 257, 257, 257, 1035, 840, 15, + /* 150 */ 663, 562, 630, 81, 106, 446, 380, 661, 687, 797, + /* 160 */ 533, 455, 533, 851, 860, 860, 860, 777, 859, 954, + /* 170 */ 1147, 1036, 1167, 1204, 1204, 1167, 1101, 1101, 1204, 1204, + /* 180 */ 1204, 1246, 1246, 1247, 56, 243, 56, 1256, 1261, 56, + /* 190 */ 1256, 56, 56, 56, 1204, 56, 1246, 285, 285, 285, + /* 200 */ 285, 285, 285, 285, 285, 285, 285, 285, 1204, 1246, + /* 210 */ 479, 1247, 403, 1127, 243, 403, 1204, 1204, 1256, 403, + /* 220 */ 1091, 479, 479, 479, 479, 1091, 479, 1173, 403, 402, + /* 230 */ 403, 417, 1327, 479, 1120, 1091, 479, 479, 1120, 1091, + /* 240 */ 479, 479, 285, 1117, 1205, 1120, 1124, 1126, 1141, 954, + /* 250 */ 1148, 417, 1357, 1135, 1139, 1137, 1135, 1139, 1135, 1139, + /* 260 */ 1297, 1309, 479, 526, 1204, 403, 1382, 1246, 2464, 2464, + /* 270 */ 2464, 2464, 2464, 2464, 2464, 69, 130, 164, 423, 153, + /* 280 */ 269, 378, 475, 536, 646, 921, 457, 675, 675, 675, + /* 290 */ 675, 675, 675, 675, 675, 1093, 672, 36, 36, 557, + /* 300 */ 48, 365, 27, 765, 139, 329, 129, 351, 424, 424, + /* 310 */ 424, 424, 868, 917, 927, 867, 869, 897, 914, 948, + /* 320 */ 995, 1023, 925, 814, 969, 1003, 1008, 1010, 1038, 1040, + /* 330 */ 1063, 976, 941, 901, 940, 1100, 1022, 1031, 1017, 1106, + /* 340 */ 1033, 1080, 1107, 1118, 1128, 1160, 1162, 993, 1067, 1111, + /* 350 */ 810, 357, 1429, 1456, 1254, 1458, 1460, 1421, 1468, 1436, + /* 360 */ 1279, 1437, 1438, 1439, 1284, 1476, 1442, 1443, 1288, 1480, + /* 370 */ 1290, 1483, 1449, 1485, 1464, 1488, 1454, 1314, 1319, 1491, + /* 380 */ 1494, 1325, 1333, 1504, 1505, 1461, 1506, 1508, 1509, 1469, + /* 390 */ 1510, 1512, 1513, 1362, 1516, 1517, 1518, 1519, 1520, 1374, + /* 400 */ 1489, 1525, 1379, 1527, 1529, 1531, 1532, 1533, 1534, 1536, + /* 410 */ 1537, 1538, 1540, 1541, 1542, 1545, 1546, 1507, 1547, 1548, + /* 420 */ 1550, 1551, 1552, 1563, 1543, 1566, 1567, 1568, 1569, 1571, + /* 430 */ 1498, 1555, 1500, 1573, 1574, 1535, 1539, 1549, 1561, 1530, + /* 440 */ 1565, 1553, 1581, 1557, 1556, 1582, 1584, 1586, 1562, 1423, + /* 450 */ 1589, 1590, 1591, 1564, 1593, 1594, 1570, 1560, 1585, 1602, + /* 460 */ 1577, 1578, 1588, 1603, 1595, 1587, 1592, 1604, 1597, 1601, + /* 470 */ 1596, 1608, 1609, 1629, 1633, 1558, 1559, 1614, 1615, 1638, + /* 480 */ 1616, 1617, 1610, 1611, 1622, 1625, 1639, 1662, 1641, 1665, + /* 490 */ 1644, 1618, 1668, 1648, 1637, 1673, 1642, 1675, 1643, 1676, + /* 500 */ 1657, 1619, 1680, 1522, 1646, 1684, 1511, 1663, 1572, 1528, + /* 510 */ 1690, 1691, 1579, 1575, 1692, 1693, 1695, 1605, 1613, 1669, + /* 520 */ 1521, 1708, 1621, 1576, 1634, 1709, 1671, 1599, 1635, 1612, + /* 530 */ 1679, 1672, 1495, 1636, 1649, 1651, 1652, 1654, 1656, 1686, + /* 540 */ 1658, 1660, 1661, 1667, 1664, 1688, 1698, 1703, 1685, 1711, + /* 550 */ 1499, 1683, 1687, 1714, 1482, 1721, 1726, 1732, 1697, 1738, + /* 560 */ 1580, 1705, 1706, 1748, 1749, 1750, 1751, 1756, 1705, 1798, + /* 570 */ 1779, 1606, 1759, 1713, 1715, 1717, 1718, 1722, 1720, 1760, + /* 580 */ 1730, 1733, 1761, 1788, 1627, 1735, 1725, 1731, 1794, 1795, + /* 590 */ 1739, 1740, 1799, 1743, 1744, 1801, 1746, 1753, 1804, 1752, + /* 600 */ 1755, 1806, 1757, 1727, 1734, 1736, 1737, 1820, 1754, 1762, + /* 610 */ 1764, 1816, 1765, 1817, 1817, 1837, 1800, 1802, 1826, 1829, + /* 620 */ 1831, 1832, 1833, 1834, 1836, 1838, 1845, 1847, 1818, 1782, + /* 630 */ 1842, 1849, 1852, 1866, 1854, 1868, 1857, 1859, 1827, 1610, + /* 640 */ 1862, 1611, 1864, 1865, 1867, 1869, 1881, 1870, 1907, 1874, + /* 650 */ 1863, 1872, 1912, 1878, 1873, 1875, 1915, 1882, 1876, 1877, + /* 660 */ 1919, 1887, 1886, 1885, 1941, 1908, 1909, 1945, 1925, 1927, + /* 670 */ 1928, 1929, 1931, 1933, }; #define YY_REDUCE_COUNT (274) -#define YY_REDUCE_MIN (-359) -#define YY_REDUCE_MAX (2135) +#define YY_REDUCE_MIN (-386) +#define YY_REDUCE_MAX (2075) static const short yy_reduce_ofst[] = { - /* 0 */ 176, -308, 135, 333, 530, -84, 725, 1133, 1216, 1300, - /* 10 */ 113, 317, 551, 699, 902, 1032, 1112, 618, 1232, 1316, - /* 20 */ 1378, 1397, 1458, 1476, 1526, 1578, 1626, 1638, 1688, 1705, - /* 30 */ 1768, 1784, 1836, 1852, 1892, 1914, 1954, 1972, 2022, 2034, - /* 40 */ 2085, 2135, -300, 1467, -306, -279, 79, -119, 151, 439, - /* 50 */ 503, 516, -359, 234, 266, 482, 645, -314, 52, -311, - /* 60 */ -297, -186, -245, -115, 141, -287, -285, 344, 446, 520, - /* 70 */ 526, 541, 553, 633, 649, -63, 658, 664, 668, -352, - /* 80 */ 720, 728, -267, 741, 767, -236, -221, 785, 193, 130, - /* 90 */ 300, 799, -26, 219, -260, -260, -260, -228, -225, 222, - /* 100 */ 286, 291, 373, 395, 400, 423, 435, 455, 481, 484, - /* 110 */ 500, 523, 547, 565, 567, 590, 598, -114, -213, -39, - /* 120 */ 122, 241, 226, 34, 354, -204, 58, 458, 341, 32, - /* 130 */ 293, 329, 386, 414, 405, 321, 545, 571, 611, -168, - /* 140 */ -323, 185, 290, 355, 495, 570, 626, 412, 569, 230, - /* 150 */ 557, 469, 604, 534, 635, 635, 662, 675, 708, 686, - /* 160 */ 663, 663, 663, 695, 680, 682, 696, 719, 635, 784, - /* 170 */ 787, 808, 822, 866, 867, 828, 831, 833, 872, 873, - /* 180 */ 874, 884, 892, 835, 886, 856, 889, 849, 875, 896, - /* 190 */ 876, 917, 922, 924, 931, 928, 939, 914, 916, 918, - /* 200 */ 919, 921, 927, 929, 930, 933, 934, 935, 946, 950, - /* 210 */ 915, 897, 955, 903, 923, 957, 961, 962, 925, 968, - /* 220 */ 937, 940, 948, 951, 952, 943, 958, 942, 976, 974, - /* 230 */ 990, 965, 938, 963, 906, 960, 971, 973, 913, 967, - /* 240 */ 975, 979, 635, 920, 941, 936, 947, 949, 956, 969, - /* 250 */ 663, 999, 978, 959, 953, 964, 966, 972, 970, 977, - /* 260 */ 980, 1015, 1009, 1035, 1043, 1047, 1053, 1056, 1000, 1012, - /* 270 */ 1045, 1048, 1052, 1058, 1063, + /* 0 */ 29, -307, 115, 793, 383, -82, 939, 999, 1115, 1176, + /* 10 */ 500, 620, 1233, 219, 1259, 603, 753, 1317, 1335, 1385, + /* 20 */ 1411, 1435, 1493, 1544, 1554, 1607, 1623, 1647, 1699, 1723, + /* 30 */ 1747, 1763, 1841, 1892, 1902, 1955, 1971, 1995, 2011, 2035, + /* 40 */ 2059, 2075, -305, 1007, -74, 189, 673, -55, 563, 109, + /* 50 */ -333, -97, -366, -361, -131, 300, 366, 190, 240, -315, + /* 60 */ -308, -386, -263, -173, -149, -160, -81, 54, 374, 613, + /* 70 */ 626, 652, 660, 725, 729, -251, 737, 780, 833, -297, + /* 80 */ 835, 836, 50, 838, 882, -96, 185, 932, 147, -86, + /* 90 */ 154, 933, -316, -283, -376, -376, -376, -273, -229, -174, + /* 100 */ 208, 220, 246, 284, 323, 326, 359, 371, 391, 418, + /* 110 */ 420, 437, 499, 501, 503, 537, 547, -19, 71, 75, + /* 120 */ 199, 350, 373, 458, -94, -18, 253, 372, 549, 430, + /* 130 */ 515, 221, -34, 70, 502, 521, 538, 551, 578, 312, + /* 140 */ -329, 309, 328, 337, 386, 572, 606, 472, 657, 591, + /* 150 */ 719, 653, 741, 680, 770, 770, 808, 830, 791, 773, + /* 160 */ 755, 755, 755, 766, 746, 748, 751, 778, 770, 816, + /* 170 */ 822, 853, 864, 906, 907, 895, 902, 903, 942, 945, + /* 180 */ 946, 955, 957, 899, 950, 920, 952, 911, 915, 959, + /* 190 */ 918, 962, 964, 965, 970, 967, 981, 956, 958, 960, + /* 200 */ 961, 963, 966, 968, 972, 973, 974, 975, 977, 985, + /* 210 */ 949, 930, 987, 937, 978, 994, 998, 1000, 971, 997, + /* 220 */ 979, 988, 990, 991, 992, 986, 1004, 989, 1012, 1020, + /* 230 */ 1018, 1005, 980, 1006, 944, 1001, 1009, 1014, 984, 1011, + /* 240 */ 1015, 1016, 770, 953, 983, 1002, 1013, 982, 996, 1024, + /* 250 */ 755, 1032, 1021, 1034, 1037, 1027, 1041, 1039, 1042, 1044, + /* 260 */ 1019, 1059, 1051, 1075, 1097, 1096, 1105, 1108, 1050, 1057, + /* 270 */ 1090, 1095, 1099, 1102, 1121, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 10 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 20 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 30 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 40 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 50 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 60 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 70 */ 1472, 1472, 1472, 1472, 1472, 1546, 1472, 1472, 1472, 1472, - /* 80 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 90 */ 1472, 1472, 1544, 1706, 1472, 1881, 1472, 1472, 1472, 1472, - /* 100 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 110 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 120 */ 1472, 1472, 1546, 1472, 1544, 1893, 1893, 1893, 1472, 1472, - /* 130 */ 1472, 1472, 1747, 1747, 1472, 1472, 1472, 1472, 1646, 1472, - /* 140 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1741, 1472, 1962, - /* 150 */ 1472, 1472, 1472, 1916, 1472, 1472, 1472, 1472, 1599, 1908, - /* 160 */ 1885, 1899, 1886, 1883, 1947, 1947, 1947, 1902, 1472, 1912, - /* 170 */ 1472, 1734, 1711, 1472, 1472, 1711, 1708, 1708, 1472, 1472, - /* 180 */ 1472, 1472, 1472, 1472, 1546, 1472, 1546, 1472, 1472, 1546, - /* 190 */ 1472, 1546, 1546, 1546, 1472, 1546, 1472, 1472, 1472, 1472, - /* 200 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 210 */ 1472, 1472, 1544, 1743, 1472, 1544, 1472, 1472, 1472, 1544, - /* 220 */ 1921, 1472, 1472, 1472, 1472, 1921, 1472, 1472, 1544, 1472, - /* 230 */ 1544, 1472, 1472, 1472, 1923, 1921, 1472, 1472, 1923, 1921, - /* 240 */ 1472, 1472, 1472, 1935, 1931, 1923, 1939, 1937, 1914, 1912, - /* 250 */ 1899, 1472, 1472, 1953, 1949, 1965, 1953, 1949, 1953, 1949, - /* 260 */ 1472, 1615, 1472, 1472, 1472, 1544, 1504, 1472, 1736, 1747, - /* 270 */ 1649, 1649, 1649, 1547, 1477, 1472, 1472, 1472, 1472, 1472, - /* 280 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1818, 1934, 1933, - /* 290 */ 1857, 1856, 1855, 1853, 1817, 1472, 1611, 1816, 1815, 1472, - /* 300 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1809, 1810, - /* 310 */ 1808, 1807, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 320 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 330 */ 1472, 1882, 1472, 1950, 1954, 1472, 1472, 1472, 1472, 1472, - /* 340 */ 1793, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 350 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 360 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 370 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 380 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 390 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 400 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 410 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 420 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 430 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1509, 1472, 1472, - /* 440 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 450 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 460 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 470 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 480 */ 1472, 1472, 1582, 1581, 1472, 1472, 1472, 1472, 1472, 1472, - /* 490 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 500 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 510 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 520 */ 1472, 1751, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 530 */ 1472, 1915, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 540 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1793, 1472, 1932, - /* 550 */ 1472, 1892, 1888, 1472, 1472, 1884, 1792, 1472, 1472, 1948, - /* 560 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1877, - /* 570 */ 1472, 1472, 1850, 1835, 1472, 1472, 1472, 1472, 1472, 1472, - /* 580 */ 1472, 1472, 1472, 1472, 1803, 1472, 1472, 1472, 1472, 1472, - /* 590 */ 1643, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 600 */ 1472, 1472, 1472, 1628, 1626, 1625, 1624, 1472, 1621, 1472, - /* 610 */ 1472, 1472, 1472, 1652, 1651, 1472, 1472, 1472, 1472, 1472, - /* 620 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1565, 1472, - /* 630 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1557, 1472, 1556, - /* 640 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 650 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 660 */ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, - /* 670 */ 1472, 1472, + /* 0 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 10 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 20 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 30 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 40 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 50 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 60 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 70 */ 1478, 1478, 1478, 1478, 1478, 1552, 1478, 1478, 1478, 1478, + /* 80 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 90 */ 1478, 1478, 1550, 1714, 1478, 1889, 1478, 1478, 1478, 1478, + /* 100 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 110 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 120 */ 1478, 1478, 1552, 1478, 1550, 1901, 1901, 1901, 1478, 1478, + /* 130 */ 1478, 1478, 1755, 1755, 1478, 1478, 1478, 1478, 1654, 1478, + /* 140 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1749, 1478, 1970, + /* 150 */ 1478, 1478, 1478, 1924, 1478, 1478, 1478, 1478, 1607, 1916, + /* 160 */ 1893, 1907, 1894, 1891, 1955, 1955, 1955, 1910, 1478, 1920, + /* 170 */ 1478, 1742, 1719, 1478, 1478, 1719, 1716, 1716, 1478, 1478, + /* 180 */ 1478, 1478, 1478, 1478, 1552, 1478, 1552, 1478, 1478, 1552, + /* 190 */ 1478, 1552, 1552, 1552, 1478, 1552, 1478, 1478, 1478, 1478, + /* 200 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 210 */ 1478, 1478, 1550, 1751, 1478, 1550, 1478, 1478, 1478, 1550, + /* 220 */ 1929, 1478, 1478, 1478, 1478, 1929, 1478, 1478, 1550, 1478, + /* 230 */ 1550, 1478, 1478, 1478, 1931, 1929, 1478, 1478, 1931, 1929, + /* 240 */ 1478, 1478, 1478, 1943, 1939, 1931, 1947, 1945, 1922, 1920, + /* 250 */ 1907, 1478, 1478, 1961, 1957, 1973, 1961, 1957, 1961, 1957, + /* 260 */ 1478, 1623, 1478, 1478, 1478, 1550, 1510, 1478, 1744, 1755, + /* 270 */ 1657, 1657, 1657, 1553, 1483, 1478, 1478, 1478, 1478, 1478, + /* 280 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1826, 1942, 1941, + /* 290 */ 1865, 1864, 1863, 1861, 1825, 1478, 1619, 1824, 1823, 1478, + /* 300 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1817, 1818, + /* 310 */ 1816, 1815, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 320 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 330 */ 1478, 1890, 1478, 1958, 1962, 1478, 1478, 1478, 1478, 1478, + /* 340 */ 1801, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 350 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 360 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 370 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 380 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 390 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 400 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 410 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 420 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 430 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1515, 1478, 1478, + /* 440 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 450 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 460 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 470 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 480 */ 1478, 1478, 1590, 1589, 1478, 1478, 1478, 1478, 1478, 1478, + /* 490 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 500 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 510 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 520 */ 1478, 1759, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 530 */ 1478, 1923, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 540 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1801, 1478, 1940, + /* 550 */ 1478, 1900, 1896, 1478, 1478, 1892, 1800, 1478, 1478, 1956, + /* 560 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1885, + /* 570 */ 1478, 1478, 1858, 1843, 1478, 1478, 1478, 1478, 1478, 1478, + /* 580 */ 1478, 1478, 1478, 1478, 1811, 1478, 1478, 1478, 1478, 1478, + /* 590 */ 1651, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 600 */ 1478, 1478, 1478, 1636, 1634, 1633, 1632, 1478, 1629, 1478, + /* 610 */ 1478, 1478, 1478, 1660, 1659, 1478, 1478, 1478, 1478, 1478, + /* 620 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 630 */ 1571, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1563, + /* 640 */ 1478, 1562, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 650 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 660 */ 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, + /* 670 */ 1478, 1478, 1478, 1478, }; /********** End of lemon-generated parsing tables *****************************/ @@ -1009,6 +997,8 @@ static const YYCODETYPE yyFallback[] = { 0, /* WAL_ROLL_PERIOD => nothing */ 0, /* WAL_SEGMENT_SIZE => nothing */ 0, /* SST_TRIGGER => nothing */ + 0, /* TABLE_PREFIX => nothing */ + 0, /* TABLE_SUFFIX => nothing */ 0, /* NK_COLON => nothing */ 0, /* TABLE => nothing */ 0, /* NK_LP => nothing */ @@ -1175,58 +1165,58 @@ static const YYCODETYPE yyFallback[] = { 0, /* ASC => nothing */ 0, /* NULLS => nothing */ 0, /* ABORT => nothing */ - 253, /* AFTER => ABORT */ - 253, /* ATTACH => ABORT */ - 253, /* BEFORE => ABORT */ - 253, /* BEGIN => ABORT */ - 253, /* BITAND => ABORT */ - 253, /* BITNOT => ABORT */ - 253, /* BITOR => ABORT */ - 253, /* BLOCKS => ABORT */ - 253, /* CHANGE => ABORT */ - 253, /* COMMA => ABORT */ - 253, /* COMPACT => ABORT */ - 253, /* CONCAT => ABORT */ - 253, /* CONFLICT => ABORT */ - 253, /* COPY => ABORT */ - 253, /* DEFERRED => ABORT */ - 253, /* DELIMITERS => ABORT */ - 253, /* DETACH => ABORT */ - 253, /* DIVIDE => ABORT */ - 253, /* DOT => ABORT */ - 253, /* EACH => ABORT */ - 253, /* END => ABORT */ - 253, /* FAIL => ABORT */ - 253, /* FILE => ABORT */ - 253, /* FOR => ABORT */ - 253, /* GLOB => ABORT */ - 253, /* ID => ABORT */ - 253, /* IMMEDIATE => ABORT */ - 253, /* IMPORT => ABORT */ - 253, /* INITIALLY => ABORT */ - 253, /* INSTEAD => ABORT */ - 253, /* ISNULL => ABORT */ - 253, /* KEY => ABORT */ - 253, /* NK_BITNOT => ABORT */ - 253, /* NK_SEMI => ABORT */ - 253, /* NOTNULL => ABORT */ - 253, /* OF => ABORT */ - 253, /* PLUS => ABORT */ - 253, /* PRIVILEGE => ABORT */ - 253, /* RAISE => ABORT */ - 253, /* REPLACE => ABORT */ - 253, /* RESTRICT => ABORT */ - 253, /* ROW => ABORT */ - 253, /* SEMI => ABORT */ - 253, /* STAR => ABORT */ - 253, /* STATEMENT => ABORT */ - 253, /* STRING => ABORT */ - 253, /* TIMES => ABORT */ - 253, /* UPDATE => ABORT */ - 253, /* VALUES => ABORT */ - 253, /* VARIABLE => ABORT */ - 253, /* VIEW => ABORT */ - 253, /* WAL => ABORT */ + 255, /* AFTER => ABORT */ + 255, /* ATTACH => ABORT */ + 255, /* BEFORE => ABORT */ + 255, /* BEGIN => ABORT */ + 255, /* BITAND => ABORT */ + 255, /* BITNOT => ABORT */ + 255, /* BITOR => ABORT */ + 255, /* BLOCKS => ABORT */ + 255, /* CHANGE => ABORT */ + 255, /* COMMA => ABORT */ + 255, /* COMPACT => ABORT */ + 255, /* CONCAT => ABORT */ + 255, /* CONFLICT => ABORT */ + 255, /* COPY => ABORT */ + 255, /* DEFERRED => ABORT */ + 255, /* DELIMITERS => ABORT */ + 255, /* DETACH => ABORT */ + 255, /* DIVIDE => ABORT */ + 255, /* DOT => ABORT */ + 255, /* EACH => ABORT */ + 255, /* END => ABORT */ + 255, /* FAIL => ABORT */ + 255, /* FILE => ABORT */ + 255, /* FOR => ABORT */ + 255, /* GLOB => ABORT */ + 255, /* ID => ABORT */ + 255, /* IMMEDIATE => ABORT */ + 255, /* IMPORT => ABORT */ + 255, /* INITIALLY => ABORT */ + 255, /* INSTEAD => ABORT */ + 255, /* ISNULL => ABORT */ + 255, /* KEY => ABORT */ + 255, /* NK_BITNOT => ABORT */ + 255, /* NK_SEMI => ABORT */ + 255, /* NOTNULL => ABORT */ + 255, /* OF => ABORT */ + 255, /* PLUS => ABORT */ + 255, /* PRIVILEGE => ABORT */ + 255, /* RAISE => ABORT */ + 255, /* REPLACE => ABORT */ + 255, /* RESTRICT => ABORT */ + 255, /* ROW => ABORT */ + 255, /* SEMI => ABORT */ + 255, /* STAR => ABORT */ + 255, /* STATEMENT => ABORT */ + 255, /* STRING => ABORT */ + 255, /* TIMES => ABORT */ + 255, /* UPDATE => ABORT */ + 255, /* VALUES => ABORT */ + 255, /* VARIABLE => ABORT */ + 255, /* VIEW => ABORT */ + 255, /* WAL => ABORT */ }; #endif /* YYFALLBACK */ @@ -1402,345 +1392,347 @@ static const char *const yyTokenName[] = { /* 85 */ "WAL_ROLL_PERIOD", /* 86 */ "WAL_SEGMENT_SIZE", /* 87 */ "SST_TRIGGER", - /* 88 */ "NK_COLON", - /* 89 */ "TABLE", - /* 90 */ "NK_LP", - /* 91 */ "NK_RP", - /* 92 */ "STABLE", - /* 93 */ "ADD", - /* 94 */ "COLUMN", - /* 95 */ "MODIFY", - /* 96 */ "RENAME", - /* 97 */ "TAG", - /* 98 */ "SET", - /* 99 */ "NK_EQ", - /* 100 */ "USING", - /* 101 */ "TAGS", - /* 102 */ "COMMENT", - /* 103 */ "BOOL", - /* 104 */ "TINYINT", - /* 105 */ "SMALLINT", - /* 106 */ "INT", - /* 107 */ "INTEGER", - /* 108 */ "BIGINT", - /* 109 */ "FLOAT", - /* 110 */ "DOUBLE", - /* 111 */ "BINARY", - /* 112 */ "TIMESTAMP", - /* 113 */ "NCHAR", - /* 114 */ "UNSIGNED", - /* 115 */ "JSON", - /* 116 */ "VARCHAR", - /* 117 */ "MEDIUMBLOB", - /* 118 */ "BLOB", - /* 119 */ "VARBINARY", - /* 120 */ "DECIMAL", - /* 121 */ "MAX_DELAY", - /* 122 */ "WATERMARK", - /* 123 */ "ROLLUP", - /* 124 */ "TTL", - /* 125 */ "SMA", - /* 126 */ "FIRST", - /* 127 */ "LAST", - /* 128 */ "SHOW", - /* 129 */ "DATABASES", - /* 130 */ "TABLES", - /* 131 */ "STABLES", - /* 132 */ "MNODES", - /* 133 */ "MODULES", - /* 134 */ "QNODES", - /* 135 */ "FUNCTIONS", - /* 136 */ "INDEXES", - /* 137 */ "ACCOUNTS", - /* 138 */ "APPS", - /* 139 */ "CONNECTIONS", - /* 140 */ "LICENCES", - /* 141 */ "GRANTS", - /* 142 */ "QUERIES", - /* 143 */ "SCORES", - /* 144 */ "TOPICS", - /* 145 */ "VARIABLES", - /* 146 */ "BNODES", - /* 147 */ "SNODES", - /* 148 */ "CLUSTER", - /* 149 */ "TRANSACTIONS", - /* 150 */ "DISTRIBUTED", - /* 151 */ "CONSUMERS", - /* 152 */ "SUBSCRIPTIONS", - /* 153 */ "VNODES", - /* 154 */ "LIKE", - /* 155 */ "INDEX", - /* 156 */ "FUNCTION", - /* 157 */ "INTERVAL", - /* 158 */ "TOPIC", - /* 159 */ "AS", - /* 160 */ "WITH", - /* 161 */ "META", - /* 162 */ "CONSUMER", - /* 163 */ "GROUP", - /* 164 */ "DESC", - /* 165 */ "DESCRIBE", - /* 166 */ "RESET", - /* 167 */ "QUERY", - /* 168 */ "CACHE", - /* 169 */ "EXPLAIN", - /* 170 */ "ANALYZE", - /* 171 */ "VERBOSE", - /* 172 */ "NK_BOOL", - /* 173 */ "RATIO", - /* 174 */ "NK_FLOAT", - /* 175 */ "OUTPUTTYPE", - /* 176 */ "AGGREGATE", - /* 177 */ "BUFSIZE", - /* 178 */ "STREAM", - /* 179 */ "INTO", - /* 180 */ "TRIGGER", - /* 181 */ "AT_ONCE", - /* 182 */ "WINDOW_CLOSE", - /* 183 */ "IGNORE", - /* 184 */ "EXPIRED", - /* 185 */ "KILL", - /* 186 */ "CONNECTION", - /* 187 */ "TRANSACTION", - /* 188 */ "BALANCE", - /* 189 */ "VGROUP", - /* 190 */ "MERGE", - /* 191 */ "REDISTRIBUTE", - /* 192 */ "SPLIT", - /* 193 */ "DELETE", - /* 194 */ "INSERT", - /* 195 */ "NULL", - /* 196 */ "NK_QUESTION", - /* 197 */ "NK_ARROW", - /* 198 */ "ROWTS", - /* 199 */ "TBNAME", - /* 200 */ "QSTART", - /* 201 */ "QEND", - /* 202 */ "QDURATION", - /* 203 */ "WSTART", - /* 204 */ "WEND", - /* 205 */ "WDURATION", - /* 206 */ "CAST", - /* 207 */ "NOW", - /* 208 */ "TODAY", - /* 209 */ "TIMEZONE", - /* 210 */ "CLIENT_VERSION", - /* 211 */ "SERVER_VERSION", - /* 212 */ "SERVER_STATUS", - /* 213 */ "CURRENT_USER", - /* 214 */ "COUNT", - /* 215 */ "LAST_ROW", - /* 216 */ "BETWEEN", - /* 217 */ "IS", - /* 218 */ "NK_LT", - /* 219 */ "NK_GT", - /* 220 */ "NK_LE", - /* 221 */ "NK_GE", - /* 222 */ "NK_NE", - /* 223 */ "MATCH", - /* 224 */ "NMATCH", - /* 225 */ "CONTAINS", - /* 226 */ "IN", - /* 227 */ "JOIN", - /* 228 */ "INNER", - /* 229 */ "SELECT", - /* 230 */ "DISTINCT", - /* 231 */ "WHERE", - /* 232 */ "PARTITION", - /* 233 */ "BY", - /* 234 */ "SESSION", - /* 235 */ "STATE_WINDOW", - /* 236 */ "SLIDING", - /* 237 */ "FILL", - /* 238 */ "VALUE", - /* 239 */ "NONE", - /* 240 */ "PREV", - /* 241 */ "LINEAR", - /* 242 */ "NEXT", - /* 243 */ "HAVING", - /* 244 */ "RANGE", - /* 245 */ "EVERY", - /* 246 */ "ORDER", - /* 247 */ "SLIMIT", - /* 248 */ "SOFFSET", - /* 249 */ "LIMIT", - /* 250 */ "OFFSET", - /* 251 */ "ASC", - /* 252 */ "NULLS", - /* 253 */ "ABORT", - /* 254 */ "AFTER", - /* 255 */ "ATTACH", - /* 256 */ "BEFORE", - /* 257 */ "BEGIN", - /* 258 */ "BITAND", - /* 259 */ "BITNOT", - /* 260 */ "BITOR", - /* 261 */ "BLOCKS", - /* 262 */ "CHANGE", - /* 263 */ "COMMA", - /* 264 */ "COMPACT", - /* 265 */ "CONCAT", - /* 266 */ "CONFLICT", - /* 267 */ "COPY", - /* 268 */ "DEFERRED", - /* 269 */ "DELIMITERS", - /* 270 */ "DETACH", - /* 271 */ "DIVIDE", - /* 272 */ "DOT", - /* 273 */ "EACH", - /* 274 */ "END", - /* 275 */ "FAIL", - /* 276 */ "FILE", - /* 277 */ "FOR", - /* 278 */ "GLOB", - /* 279 */ "ID", - /* 280 */ "IMMEDIATE", - /* 281 */ "IMPORT", - /* 282 */ "INITIALLY", - /* 283 */ "INSTEAD", - /* 284 */ "ISNULL", - /* 285 */ "KEY", - /* 286 */ "NK_BITNOT", - /* 287 */ "NK_SEMI", - /* 288 */ "NOTNULL", - /* 289 */ "OF", - /* 290 */ "PLUS", - /* 291 */ "PRIVILEGE", - /* 292 */ "RAISE", - /* 293 */ "REPLACE", - /* 294 */ "RESTRICT", - /* 295 */ "ROW", - /* 296 */ "SEMI", - /* 297 */ "STAR", - /* 298 */ "STATEMENT", - /* 299 */ "STRING", - /* 300 */ "TIMES", - /* 301 */ "UPDATE", - /* 302 */ "VALUES", - /* 303 */ "VARIABLE", - /* 304 */ "VIEW", - /* 305 */ "WAL", - /* 306 */ "cmd", - /* 307 */ "account_options", - /* 308 */ "alter_account_options", - /* 309 */ "literal", - /* 310 */ "alter_account_option", - /* 311 */ "user_name", - /* 312 */ "sysinfo_opt", - /* 313 */ "privileges", - /* 314 */ "priv_level", - /* 315 */ "priv_type_list", - /* 316 */ "priv_type", - /* 317 */ "db_name", - /* 318 */ "dnode_endpoint", - /* 319 */ "not_exists_opt", - /* 320 */ "db_options", - /* 321 */ "exists_opt", - /* 322 */ "alter_db_options", - /* 323 */ "integer_list", - /* 324 */ "variable_list", - /* 325 */ "retention_list", - /* 326 */ "alter_db_option", - /* 327 */ "retention", - /* 328 */ "full_table_name", - /* 329 */ "column_def_list", - /* 330 */ "tags_def_opt", - /* 331 */ "table_options", - /* 332 */ "multi_create_clause", - /* 333 */ "tags_def", - /* 334 */ "multi_drop_clause", - /* 335 */ "alter_table_clause", - /* 336 */ "alter_table_options", - /* 337 */ "column_name", - /* 338 */ "type_name", - /* 339 */ "signed_literal", - /* 340 */ "create_subtable_clause", - /* 341 */ "specific_cols_opt", - /* 342 */ "expression_list", - /* 343 */ "drop_table_clause", - /* 344 */ "col_name_list", - /* 345 */ "table_name", - /* 346 */ "column_def", - /* 347 */ "duration_list", - /* 348 */ "rollup_func_list", - /* 349 */ "alter_table_option", - /* 350 */ "duration_literal", - /* 351 */ "rollup_func_name", - /* 352 */ "function_name", - /* 353 */ "col_name", - /* 354 */ "db_name_cond_opt", - /* 355 */ "like_pattern_opt", - /* 356 */ "table_name_cond", - /* 357 */ "from_db_opt", - /* 358 */ "index_options", - /* 359 */ "func_list", - /* 360 */ "sliding_opt", - /* 361 */ "sma_stream_opt", - /* 362 */ "func", - /* 363 */ "stream_options", - /* 364 */ "topic_name", - /* 365 */ "query_expression", - /* 366 */ "cgroup_name", - /* 367 */ "analyze_opt", - /* 368 */ "explain_options", - /* 369 */ "agg_func_opt", - /* 370 */ "bufsize_opt", - /* 371 */ "stream_name", - /* 372 */ "dnode_list", - /* 373 */ "where_clause_opt", - /* 374 */ "signed", - /* 375 */ "literal_func", - /* 376 */ "literal_list", - /* 377 */ "table_alias", - /* 378 */ "column_alias", - /* 379 */ "expression", - /* 380 */ "pseudo_column", - /* 381 */ "column_reference", - /* 382 */ "function_expression", - /* 383 */ "subquery", - /* 384 */ "star_func", - /* 385 */ "star_func_para_list", - /* 386 */ "noarg_func", - /* 387 */ "other_para_list", - /* 388 */ "star_func_para", - /* 389 */ "predicate", - /* 390 */ "compare_op", - /* 391 */ "in_op", - /* 392 */ "in_predicate_value", - /* 393 */ "boolean_value_expression", - /* 394 */ "boolean_primary", - /* 395 */ "common_expression", - /* 396 */ "from_clause_opt", - /* 397 */ "table_reference_list", - /* 398 */ "table_reference", - /* 399 */ "table_primary", - /* 400 */ "joined_table", - /* 401 */ "alias_opt", - /* 402 */ "parenthesized_joined_table", - /* 403 */ "join_type", - /* 404 */ "search_condition", - /* 405 */ "query_specification", - /* 406 */ "set_quantifier_opt", - /* 407 */ "select_list", - /* 408 */ "partition_by_clause_opt", - /* 409 */ "range_opt", - /* 410 */ "every_opt", - /* 411 */ "fill_opt", - /* 412 */ "twindow_clause_opt", - /* 413 */ "group_by_clause_opt", - /* 414 */ "having_clause_opt", - /* 415 */ "select_item", - /* 416 */ "fill_mode", - /* 417 */ "group_by_list", - /* 418 */ "query_expression_body", - /* 419 */ "order_by_clause_opt", - /* 420 */ "slimit_clause_opt", - /* 421 */ "limit_clause_opt", - /* 422 */ "query_primary", - /* 423 */ "sort_specification_list", - /* 424 */ "sort_specification", - /* 425 */ "ordering_specification_opt", - /* 426 */ "null_ordering_opt", + /* 88 */ "TABLE_PREFIX", + /* 89 */ "TABLE_SUFFIX", + /* 90 */ "NK_COLON", + /* 91 */ "TABLE", + /* 92 */ "NK_LP", + /* 93 */ "NK_RP", + /* 94 */ "STABLE", + /* 95 */ "ADD", + /* 96 */ "COLUMN", + /* 97 */ "MODIFY", + /* 98 */ "RENAME", + /* 99 */ "TAG", + /* 100 */ "SET", + /* 101 */ "NK_EQ", + /* 102 */ "USING", + /* 103 */ "TAGS", + /* 104 */ "COMMENT", + /* 105 */ "BOOL", + /* 106 */ "TINYINT", + /* 107 */ "SMALLINT", + /* 108 */ "INT", + /* 109 */ "INTEGER", + /* 110 */ "BIGINT", + /* 111 */ "FLOAT", + /* 112 */ "DOUBLE", + /* 113 */ "BINARY", + /* 114 */ "TIMESTAMP", + /* 115 */ "NCHAR", + /* 116 */ "UNSIGNED", + /* 117 */ "JSON", + /* 118 */ "VARCHAR", + /* 119 */ "MEDIUMBLOB", + /* 120 */ "BLOB", + /* 121 */ "VARBINARY", + /* 122 */ "DECIMAL", + /* 123 */ "MAX_DELAY", + /* 124 */ "WATERMARK", + /* 125 */ "ROLLUP", + /* 126 */ "TTL", + /* 127 */ "SMA", + /* 128 */ "FIRST", + /* 129 */ "LAST", + /* 130 */ "SHOW", + /* 131 */ "DATABASES", + /* 132 */ "TABLES", + /* 133 */ "STABLES", + /* 134 */ "MNODES", + /* 135 */ "MODULES", + /* 136 */ "QNODES", + /* 137 */ "FUNCTIONS", + /* 138 */ "INDEXES", + /* 139 */ "ACCOUNTS", + /* 140 */ "APPS", + /* 141 */ "CONNECTIONS", + /* 142 */ "LICENCES", + /* 143 */ "GRANTS", + /* 144 */ "QUERIES", + /* 145 */ "SCORES", + /* 146 */ "TOPICS", + /* 147 */ "VARIABLES", + /* 148 */ "BNODES", + /* 149 */ "SNODES", + /* 150 */ "CLUSTER", + /* 151 */ "TRANSACTIONS", + /* 152 */ "DISTRIBUTED", + /* 153 */ "CONSUMERS", + /* 154 */ "SUBSCRIPTIONS", + /* 155 */ "VNODES", + /* 156 */ "LIKE", + /* 157 */ "INDEX", + /* 158 */ "FUNCTION", + /* 159 */ "INTERVAL", + /* 160 */ "TOPIC", + /* 161 */ "AS", + /* 162 */ "WITH", + /* 163 */ "META", + /* 164 */ "CONSUMER", + /* 165 */ "GROUP", + /* 166 */ "DESC", + /* 167 */ "DESCRIBE", + /* 168 */ "RESET", + /* 169 */ "QUERY", + /* 170 */ "CACHE", + /* 171 */ "EXPLAIN", + /* 172 */ "ANALYZE", + /* 173 */ "VERBOSE", + /* 174 */ "NK_BOOL", + /* 175 */ "RATIO", + /* 176 */ "NK_FLOAT", + /* 177 */ "OUTPUTTYPE", + /* 178 */ "AGGREGATE", + /* 179 */ "BUFSIZE", + /* 180 */ "STREAM", + /* 181 */ "INTO", + /* 182 */ "TRIGGER", + /* 183 */ "AT_ONCE", + /* 184 */ "WINDOW_CLOSE", + /* 185 */ "IGNORE", + /* 186 */ "EXPIRED", + /* 187 */ "KILL", + /* 188 */ "CONNECTION", + /* 189 */ "TRANSACTION", + /* 190 */ "BALANCE", + /* 191 */ "VGROUP", + /* 192 */ "MERGE", + /* 193 */ "REDISTRIBUTE", + /* 194 */ "SPLIT", + /* 195 */ "DELETE", + /* 196 */ "INSERT", + /* 197 */ "NULL", + /* 198 */ "NK_QUESTION", + /* 199 */ "NK_ARROW", + /* 200 */ "ROWTS", + /* 201 */ "TBNAME", + /* 202 */ "QSTART", + /* 203 */ "QEND", + /* 204 */ "QDURATION", + /* 205 */ "WSTART", + /* 206 */ "WEND", + /* 207 */ "WDURATION", + /* 208 */ "CAST", + /* 209 */ "NOW", + /* 210 */ "TODAY", + /* 211 */ "TIMEZONE", + /* 212 */ "CLIENT_VERSION", + /* 213 */ "SERVER_VERSION", + /* 214 */ "SERVER_STATUS", + /* 215 */ "CURRENT_USER", + /* 216 */ "COUNT", + /* 217 */ "LAST_ROW", + /* 218 */ "BETWEEN", + /* 219 */ "IS", + /* 220 */ "NK_LT", + /* 221 */ "NK_GT", + /* 222 */ "NK_LE", + /* 223 */ "NK_GE", + /* 224 */ "NK_NE", + /* 225 */ "MATCH", + /* 226 */ "NMATCH", + /* 227 */ "CONTAINS", + /* 228 */ "IN", + /* 229 */ "JOIN", + /* 230 */ "INNER", + /* 231 */ "SELECT", + /* 232 */ "DISTINCT", + /* 233 */ "WHERE", + /* 234 */ "PARTITION", + /* 235 */ "BY", + /* 236 */ "SESSION", + /* 237 */ "STATE_WINDOW", + /* 238 */ "SLIDING", + /* 239 */ "FILL", + /* 240 */ "VALUE", + /* 241 */ "NONE", + /* 242 */ "PREV", + /* 243 */ "LINEAR", + /* 244 */ "NEXT", + /* 245 */ "HAVING", + /* 246 */ "RANGE", + /* 247 */ "EVERY", + /* 248 */ "ORDER", + /* 249 */ "SLIMIT", + /* 250 */ "SOFFSET", + /* 251 */ "LIMIT", + /* 252 */ "OFFSET", + /* 253 */ "ASC", + /* 254 */ "NULLS", + /* 255 */ "ABORT", + /* 256 */ "AFTER", + /* 257 */ "ATTACH", + /* 258 */ "BEFORE", + /* 259 */ "BEGIN", + /* 260 */ "BITAND", + /* 261 */ "BITNOT", + /* 262 */ "BITOR", + /* 263 */ "BLOCKS", + /* 264 */ "CHANGE", + /* 265 */ "COMMA", + /* 266 */ "COMPACT", + /* 267 */ "CONCAT", + /* 268 */ "CONFLICT", + /* 269 */ "COPY", + /* 270 */ "DEFERRED", + /* 271 */ "DELIMITERS", + /* 272 */ "DETACH", + /* 273 */ "DIVIDE", + /* 274 */ "DOT", + /* 275 */ "EACH", + /* 276 */ "END", + /* 277 */ "FAIL", + /* 278 */ "FILE", + /* 279 */ "FOR", + /* 280 */ "GLOB", + /* 281 */ "ID", + /* 282 */ "IMMEDIATE", + /* 283 */ "IMPORT", + /* 284 */ "INITIALLY", + /* 285 */ "INSTEAD", + /* 286 */ "ISNULL", + /* 287 */ "KEY", + /* 288 */ "NK_BITNOT", + /* 289 */ "NK_SEMI", + /* 290 */ "NOTNULL", + /* 291 */ "OF", + /* 292 */ "PLUS", + /* 293 */ "PRIVILEGE", + /* 294 */ "RAISE", + /* 295 */ "REPLACE", + /* 296 */ "RESTRICT", + /* 297 */ "ROW", + /* 298 */ "SEMI", + /* 299 */ "STAR", + /* 300 */ "STATEMENT", + /* 301 */ "STRING", + /* 302 */ "TIMES", + /* 303 */ "UPDATE", + /* 304 */ "VALUES", + /* 305 */ "VARIABLE", + /* 306 */ "VIEW", + /* 307 */ "WAL", + /* 308 */ "cmd", + /* 309 */ "account_options", + /* 310 */ "alter_account_options", + /* 311 */ "literal", + /* 312 */ "alter_account_option", + /* 313 */ "user_name", + /* 314 */ "sysinfo_opt", + /* 315 */ "privileges", + /* 316 */ "priv_level", + /* 317 */ "priv_type_list", + /* 318 */ "priv_type", + /* 319 */ "db_name", + /* 320 */ "dnode_endpoint", + /* 321 */ "not_exists_opt", + /* 322 */ "db_options", + /* 323 */ "exists_opt", + /* 324 */ "alter_db_options", + /* 325 */ "integer_list", + /* 326 */ "variable_list", + /* 327 */ "retention_list", + /* 328 */ "alter_db_option", + /* 329 */ "retention", + /* 330 */ "full_table_name", + /* 331 */ "column_def_list", + /* 332 */ "tags_def_opt", + /* 333 */ "table_options", + /* 334 */ "multi_create_clause", + /* 335 */ "tags_def", + /* 336 */ "multi_drop_clause", + /* 337 */ "alter_table_clause", + /* 338 */ "alter_table_options", + /* 339 */ "column_name", + /* 340 */ "type_name", + /* 341 */ "signed_literal", + /* 342 */ "create_subtable_clause", + /* 343 */ "specific_cols_opt", + /* 344 */ "expression_list", + /* 345 */ "drop_table_clause", + /* 346 */ "col_name_list", + /* 347 */ "table_name", + /* 348 */ "column_def", + /* 349 */ "duration_list", + /* 350 */ "rollup_func_list", + /* 351 */ "alter_table_option", + /* 352 */ "duration_literal", + /* 353 */ "rollup_func_name", + /* 354 */ "function_name", + /* 355 */ "col_name", + /* 356 */ "db_name_cond_opt", + /* 357 */ "like_pattern_opt", + /* 358 */ "table_name_cond", + /* 359 */ "from_db_opt", + /* 360 */ "index_options", + /* 361 */ "func_list", + /* 362 */ "sliding_opt", + /* 363 */ "sma_stream_opt", + /* 364 */ "func", + /* 365 */ "stream_options", + /* 366 */ "topic_name", + /* 367 */ "query_expression", + /* 368 */ "cgroup_name", + /* 369 */ "analyze_opt", + /* 370 */ "explain_options", + /* 371 */ "agg_func_opt", + /* 372 */ "bufsize_opt", + /* 373 */ "stream_name", + /* 374 */ "dnode_list", + /* 375 */ "where_clause_opt", + /* 376 */ "signed", + /* 377 */ "literal_func", + /* 378 */ "literal_list", + /* 379 */ "table_alias", + /* 380 */ "column_alias", + /* 381 */ "expression", + /* 382 */ "pseudo_column", + /* 383 */ "column_reference", + /* 384 */ "function_expression", + /* 385 */ "subquery", + /* 386 */ "star_func", + /* 387 */ "star_func_para_list", + /* 388 */ "noarg_func", + /* 389 */ "other_para_list", + /* 390 */ "star_func_para", + /* 391 */ "predicate", + /* 392 */ "compare_op", + /* 393 */ "in_op", + /* 394 */ "in_predicate_value", + /* 395 */ "boolean_value_expression", + /* 396 */ "boolean_primary", + /* 397 */ "common_expression", + /* 398 */ "from_clause_opt", + /* 399 */ "table_reference_list", + /* 400 */ "table_reference", + /* 401 */ "table_primary", + /* 402 */ "joined_table", + /* 403 */ "alias_opt", + /* 404 */ "parenthesized_joined_table", + /* 405 */ "join_type", + /* 406 */ "search_condition", + /* 407 */ "query_specification", + /* 408 */ "set_quantifier_opt", + /* 409 */ "select_list", + /* 410 */ "partition_by_clause_opt", + /* 411 */ "range_opt", + /* 412 */ "every_opt", + /* 413 */ "fill_opt", + /* 414 */ "twindow_clause_opt", + /* 415 */ "group_by_clause_opt", + /* 416 */ "having_clause_opt", + /* 417 */ "select_item", + /* 418 */ "fill_mode", + /* 419 */ "group_by_list", + /* 420 */ "query_expression_body", + /* 421 */ "order_by_clause_opt", + /* 422 */ "slimit_clause_opt", + /* 423 */ "limit_clause_opt", + /* 424 */ "query_primary", + /* 425 */ "sort_specification_list", + /* 426 */ "sort_specification", + /* 427 */ "ordering_specification_opt", + /* 428 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -1849,398 +1841,400 @@ static const char *const yyRuleName[] = { /* 98 */ "db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER", /* 99 */ "db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER", /* 100 */ "db_options ::= db_options SST_TRIGGER NK_INTEGER", - /* 101 */ "alter_db_options ::= alter_db_option", - /* 102 */ "alter_db_options ::= alter_db_options alter_db_option", - /* 103 */ "alter_db_option ::= CACHEMODEL NK_STRING", - /* 104 */ "alter_db_option ::= CACHESIZE NK_INTEGER", - /* 105 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER", - /* 106 */ "alter_db_option ::= KEEP integer_list", - /* 107 */ "alter_db_option ::= KEEP variable_list", - /* 108 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER", - /* 109 */ "alter_db_option ::= SST_TRIGGER NK_INTEGER", - /* 110 */ "integer_list ::= NK_INTEGER", - /* 111 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", - /* 112 */ "variable_list ::= NK_VARIABLE", - /* 113 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", - /* 114 */ "retention_list ::= retention", - /* 115 */ "retention_list ::= retention_list NK_COMMA retention", - /* 116 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", - /* 117 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", - /* 118 */ "cmd ::= CREATE TABLE multi_create_clause", - /* 119 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", - /* 120 */ "cmd ::= DROP TABLE multi_drop_clause", - /* 121 */ "cmd ::= DROP STABLE exists_opt full_table_name", - /* 122 */ "cmd ::= ALTER TABLE alter_table_clause", - /* 123 */ "cmd ::= ALTER STABLE alter_table_clause", - /* 124 */ "alter_table_clause ::= full_table_name alter_table_options", - /* 125 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", - /* 126 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", - /* 127 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", - /* 128 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", - /* 129 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", - /* 130 */ "alter_table_clause ::= full_table_name DROP TAG column_name", - /* 131 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", - /* 132 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", - /* 133 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", - /* 134 */ "multi_create_clause ::= create_subtable_clause", - /* 135 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", - /* 136 */ "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", - /* 137 */ "multi_drop_clause ::= drop_table_clause", - /* 138 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", - /* 139 */ "drop_table_clause ::= exists_opt full_table_name", - /* 140 */ "specific_cols_opt ::=", - /* 141 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", - /* 142 */ "full_table_name ::= table_name", - /* 143 */ "full_table_name ::= db_name NK_DOT table_name", - /* 144 */ "column_def_list ::= column_def", - /* 145 */ "column_def_list ::= column_def_list NK_COMMA column_def", - /* 146 */ "column_def ::= column_name type_name", - /* 147 */ "column_def ::= column_name type_name COMMENT NK_STRING", - /* 148 */ "type_name ::= BOOL", - /* 149 */ "type_name ::= TINYINT", - /* 150 */ "type_name ::= SMALLINT", - /* 151 */ "type_name ::= INT", - /* 152 */ "type_name ::= INTEGER", - /* 153 */ "type_name ::= BIGINT", - /* 154 */ "type_name ::= FLOAT", - /* 155 */ "type_name ::= DOUBLE", - /* 156 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", - /* 157 */ "type_name ::= TIMESTAMP", - /* 158 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", - /* 159 */ "type_name ::= TINYINT UNSIGNED", - /* 160 */ "type_name ::= SMALLINT UNSIGNED", - /* 161 */ "type_name ::= INT UNSIGNED", - /* 162 */ "type_name ::= BIGINT UNSIGNED", - /* 163 */ "type_name ::= JSON", - /* 164 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", - /* 165 */ "type_name ::= MEDIUMBLOB", - /* 166 */ "type_name ::= BLOB", - /* 167 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", - /* 168 */ "type_name ::= DECIMAL", - /* 169 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", - /* 170 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", - /* 171 */ "tags_def_opt ::=", - /* 172 */ "tags_def_opt ::= tags_def", - /* 173 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", - /* 174 */ "table_options ::=", - /* 175 */ "table_options ::= table_options COMMENT NK_STRING", - /* 176 */ "table_options ::= table_options MAX_DELAY duration_list", - /* 177 */ "table_options ::= table_options WATERMARK duration_list", - /* 178 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", - /* 179 */ "table_options ::= table_options TTL NK_INTEGER", - /* 180 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", - /* 181 */ "alter_table_options ::= alter_table_option", - /* 182 */ "alter_table_options ::= alter_table_options alter_table_option", - /* 183 */ "alter_table_option ::= COMMENT NK_STRING", - /* 184 */ "alter_table_option ::= TTL NK_INTEGER", - /* 185 */ "duration_list ::= duration_literal", - /* 186 */ "duration_list ::= duration_list NK_COMMA duration_literal", - /* 187 */ "rollup_func_list ::= rollup_func_name", - /* 188 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", - /* 189 */ "rollup_func_name ::= function_name", - /* 190 */ "rollup_func_name ::= FIRST", - /* 191 */ "rollup_func_name ::= LAST", - /* 192 */ "col_name_list ::= col_name", - /* 193 */ "col_name_list ::= col_name_list NK_COMMA col_name", - /* 194 */ "col_name ::= column_name", - /* 195 */ "cmd ::= SHOW DNODES", - /* 196 */ "cmd ::= SHOW USERS", - /* 197 */ "cmd ::= SHOW DATABASES", - /* 198 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", - /* 199 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", - /* 200 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", - /* 201 */ "cmd ::= SHOW MNODES", - /* 202 */ "cmd ::= SHOW MODULES", - /* 203 */ "cmd ::= SHOW QNODES", - /* 204 */ "cmd ::= SHOW FUNCTIONS", - /* 205 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", - /* 206 */ "cmd ::= SHOW STREAMS", - /* 207 */ "cmd ::= SHOW ACCOUNTS", - /* 208 */ "cmd ::= SHOW APPS", - /* 209 */ "cmd ::= SHOW CONNECTIONS", - /* 210 */ "cmd ::= SHOW LICENCES", - /* 211 */ "cmd ::= SHOW GRANTS", - /* 212 */ "cmd ::= SHOW CREATE DATABASE db_name", - /* 213 */ "cmd ::= SHOW CREATE TABLE full_table_name", - /* 214 */ "cmd ::= SHOW CREATE STABLE full_table_name", - /* 215 */ "cmd ::= SHOW QUERIES", - /* 216 */ "cmd ::= SHOW SCORES", - /* 217 */ "cmd ::= SHOW TOPICS", - /* 218 */ "cmd ::= SHOW VARIABLES", - /* 219 */ "cmd ::= SHOW LOCAL VARIABLES", - /* 220 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", - /* 221 */ "cmd ::= SHOW BNODES", - /* 222 */ "cmd ::= SHOW SNODES", - /* 223 */ "cmd ::= SHOW CLUSTER", - /* 224 */ "cmd ::= SHOW TRANSACTIONS", - /* 225 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", - /* 226 */ "cmd ::= SHOW CONSUMERS", - /* 227 */ "cmd ::= SHOW SUBSCRIPTIONS", - /* 228 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", - /* 229 */ "cmd ::= SHOW VNODES NK_INTEGER", - /* 230 */ "cmd ::= SHOW VNODES NK_STRING", - /* 231 */ "db_name_cond_opt ::=", - /* 232 */ "db_name_cond_opt ::= db_name NK_DOT", - /* 233 */ "like_pattern_opt ::=", - /* 234 */ "like_pattern_opt ::= LIKE NK_STRING", - /* 235 */ "table_name_cond ::= table_name", - /* 236 */ "from_db_opt ::=", - /* 237 */ "from_db_opt ::= FROM db_name", - /* 238 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", - /* 239 */ "cmd ::= DROP INDEX exists_opt full_table_name", - /* 240 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", - /* 241 */ "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", - /* 242 */ "func_list ::= func", - /* 243 */ "func_list ::= func_list NK_COMMA func", - /* 244 */ "func ::= function_name NK_LP expression_list NK_RP", - /* 245 */ "sma_stream_opt ::=", - /* 246 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", - /* 247 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", - /* 248 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", - /* 249 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", - /* 250 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", - /* 251 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", - /* 252 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", - /* 253 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 254 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", - /* 255 */ "cmd ::= DESC full_table_name", - /* 256 */ "cmd ::= DESCRIBE full_table_name", - /* 257 */ "cmd ::= RESET QUERY CACHE", - /* 258 */ "cmd ::= EXPLAIN analyze_opt explain_options query_expression", - /* 259 */ "analyze_opt ::=", - /* 260 */ "analyze_opt ::= ANALYZE", - /* 261 */ "explain_options ::=", - /* 262 */ "explain_options ::= explain_options VERBOSE NK_BOOL", - /* 263 */ "explain_options ::= explain_options RATIO NK_FLOAT", - /* 264 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", - /* 265 */ "cmd ::= DROP FUNCTION exists_opt function_name", - /* 266 */ "agg_func_opt ::=", - /* 267 */ "agg_func_opt ::= AGGREGATE", - /* 268 */ "bufsize_opt ::=", - /* 269 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 270 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression", - /* 271 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 272 */ "stream_options ::=", - /* 273 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 274 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 275 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 276 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 277 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", - /* 278 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 279 */ "cmd ::= KILL QUERY NK_STRING", - /* 280 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 281 */ "cmd ::= BALANCE VGROUP", - /* 282 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 283 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 284 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 285 */ "dnode_list ::= DNODE NK_INTEGER", - /* 286 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 287 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 288 */ "cmd ::= query_expression", - /* 289 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression", - /* 290 */ "cmd ::= INSERT INTO full_table_name query_expression", - /* 291 */ "literal ::= NK_INTEGER", - /* 292 */ "literal ::= NK_FLOAT", - /* 293 */ "literal ::= NK_STRING", - /* 294 */ "literal ::= NK_BOOL", - /* 295 */ "literal ::= TIMESTAMP NK_STRING", - /* 296 */ "literal ::= duration_literal", - /* 297 */ "literal ::= NULL", - /* 298 */ "literal ::= NK_QUESTION", - /* 299 */ "duration_literal ::= NK_VARIABLE", - /* 300 */ "signed ::= NK_INTEGER", - /* 301 */ "signed ::= NK_PLUS NK_INTEGER", - /* 302 */ "signed ::= NK_MINUS NK_INTEGER", - /* 303 */ "signed ::= NK_FLOAT", - /* 304 */ "signed ::= NK_PLUS NK_FLOAT", - /* 305 */ "signed ::= NK_MINUS NK_FLOAT", - /* 306 */ "signed_literal ::= signed", - /* 307 */ "signed_literal ::= NK_STRING", - /* 308 */ "signed_literal ::= NK_BOOL", - /* 309 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 310 */ "signed_literal ::= duration_literal", - /* 311 */ "signed_literal ::= NULL", - /* 312 */ "signed_literal ::= literal_func", - /* 313 */ "signed_literal ::= NK_QUESTION", - /* 314 */ "literal_list ::= signed_literal", - /* 315 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 316 */ "db_name ::= NK_ID", - /* 317 */ "table_name ::= NK_ID", - /* 318 */ "column_name ::= NK_ID", - /* 319 */ "function_name ::= NK_ID", - /* 320 */ "table_alias ::= NK_ID", - /* 321 */ "column_alias ::= NK_ID", - /* 322 */ "user_name ::= NK_ID", - /* 323 */ "topic_name ::= NK_ID", - /* 324 */ "stream_name ::= NK_ID", - /* 325 */ "cgroup_name ::= NK_ID", - /* 326 */ "expression ::= literal", - /* 327 */ "expression ::= pseudo_column", - /* 328 */ "expression ::= column_reference", - /* 329 */ "expression ::= function_expression", - /* 330 */ "expression ::= subquery", - /* 331 */ "expression ::= NK_LP expression NK_RP", - /* 332 */ "expression ::= NK_PLUS expression", - /* 333 */ "expression ::= NK_MINUS expression", - /* 334 */ "expression ::= expression NK_PLUS expression", - /* 335 */ "expression ::= expression NK_MINUS expression", - /* 336 */ "expression ::= expression NK_STAR expression", - /* 337 */ "expression ::= expression NK_SLASH expression", - /* 338 */ "expression ::= expression NK_REM expression", - /* 339 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 340 */ "expression ::= expression NK_BITAND expression", - /* 341 */ "expression ::= expression NK_BITOR expression", - /* 342 */ "expression_list ::= expression", - /* 343 */ "expression_list ::= expression_list NK_COMMA expression", - /* 344 */ "column_reference ::= column_name", - /* 345 */ "column_reference ::= table_name NK_DOT column_name", - /* 346 */ "pseudo_column ::= ROWTS", - /* 347 */ "pseudo_column ::= TBNAME", - /* 348 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 349 */ "pseudo_column ::= QSTART", - /* 350 */ "pseudo_column ::= QEND", - /* 351 */ "pseudo_column ::= QDURATION", - /* 352 */ "pseudo_column ::= WSTART", - /* 353 */ "pseudo_column ::= WEND", - /* 354 */ "pseudo_column ::= WDURATION", - /* 355 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 356 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 357 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", - /* 358 */ "function_expression ::= literal_func", - /* 359 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 360 */ "literal_func ::= NOW", - /* 361 */ "noarg_func ::= NOW", - /* 362 */ "noarg_func ::= TODAY", - /* 363 */ "noarg_func ::= TIMEZONE", - /* 364 */ "noarg_func ::= DATABASE", - /* 365 */ "noarg_func ::= CLIENT_VERSION", - /* 366 */ "noarg_func ::= SERVER_VERSION", - /* 367 */ "noarg_func ::= SERVER_STATUS", - /* 368 */ "noarg_func ::= CURRENT_USER", - /* 369 */ "noarg_func ::= USER", - /* 370 */ "star_func ::= COUNT", - /* 371 */ "star_func ::= FIRST", - /* 372 */ "star_func ::= LAST", - /* 373 */ "star_func ::= LAST_ROW", - /* 374 */ "star_func_para_list ::= NK_STAR", - /* 375 */ "star_func_para_list ::= other_para_list", - /* 376 */ "other_para_list ::= star_func_para", - /* 377 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 378 */ "star_func_para ::= expression", - /* 379 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 380 */ "predicate ::= expression compare_op expression", - /* 381 */ "predicate ::= expression BETWEEN expression AND expression", - /* 382 */ "predicate ::= expression NOT BETWEEN expression AND expression", - /* 383 */ "predicate ::= expression IS NULL", - /* 384 */ "predicate ::= expression IS NOT NULL", - /* 385 */ "predicate ::= expression in_op in_predicate_value", - /* 386 */ "compare_op ::= NK_LT", - /* 387 */ "compare_op ::= NK_GT", - /* 388 */ "compare_op ::= NK_LE", - /* 389 */ "compare_op ::= NK_GE", - /* 390 */ "compare_op ::= NK_NE", - /* 391 */ "compare_op ::= NK_EQ", - /* 392 */ "compare_op ::= LIKE", - /* 393 */ "compare_op ::= NOT LIKE", - /* 394 */ "compare_op ::= MATCH", - /* 395 */ "compare_op ::= NMATCH", - /* 396 */ "compare_op ::= CONTAINS", - /* 397 */ "in_op ::= IN", - /* 398 */ "in_op ::= NOT IN", - /* 399 */ "in_predicate_value ::= NK_LP literal_list NK_RP", - /* 400 */ "boolean_value_expression ::= boolean_primary", - /* 401 */ "boolean_value_expression ::= NOT boolean_primary", - /* 402 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 403 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 404 */ "boolean_primary ::= predicate", - /* 405 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 406 */ "common_expression ::= expression", - /* 407 */ "common_expression ::= boolean_value_expression", - /* 408 */ "from_clause_opt ::=", - /* 409 */ "from_clause_opt ::= FROM table_reference_list", - /* 410 */ "table_reference_list ::= table_reference", - /* 411 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 412 */ "table_reference ::= table_primary", - /* 413 */ "table_reference ::= joined_table", - /* 414 */ "table_primary ::= table_name alias_opt", - /* 415 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 416 */ "table_primary ::= subquery alias_opt", - /* 417 */ "table_primary ::= parenthesized_joined_table", - /* 418 */ "alias_opt ::=", - /* 419 */ "alias_opt ::= table_alias", - /* 420 */ "alias_opt ::= AS table_alias", - /* 421 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 422 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 423 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 424 */ "join_type ::=", - /* 425 */ "join_type ::= INNER", - /* 426 */ "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", - /* 427 */ "set_quantifier_opt ::=", - /* 428 */ "set_quantifier_opt ::= DISTINCT", - /* 429 */ "set_quantifier_opt ::= ALL", - /* 430 */ "select_list ::= select_item", - /* 431 */ "select_list ::= select_list NK_COMMA select_item", - /* 432 */ "select_item ::= NK_STAR", - /* 433 */ "select_item ::= common_expression", - /* 434 */ "select_item ::= common_expression column_alias", - /* 435 */ "select_item ::= common_expression AS column_alias", - /* 436 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 437 */ "where_clause_opt ::=", - /* 438 */ "where_clause_opt ::= WHERE search_condition", - /* 439 */ "partition_by_clause_opt ::=", - /* 440 */ "partition_by_clause_opt ::= PARTITION BY expression_list", - /* 441 */ "twindow_clause_opt ::=", - /* 442 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", - /* 443 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", - /* 444 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 445 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 446 */ "sliding_opt ::=", - /* 447 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 448 */ "fill_opt ::=", - /* 449 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 450 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 451 */ "fill_mode ::= NONE", - /* 452 */ "fill_mode ::= PREV", - /* 453 */ "fill_mode ::= NULL", - /* 454 */ "fill_mode ::= LINEAR", - /* 455 */ "fill_mode ::= NEXT", - /* 456 */ "group_by_clause_opt ::=", - /* 457 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 458 */ "group_by_list ::= expression", - /* 459 */ "group_by_list ::= group_by_list NK_COMMA expression", - /* 460 */ "having_clause_opt ::=", - /* 461 */ "having_clause_opt ::= HAVING search_condition", - /* 462 */ "range_opt ::=", - /* 463 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", - /* 464 */ "every_opt ::=", - /* 465 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 466 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 467 */ "query_expression_body ::= query_primary", - /* 468 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 469 */ "query_expression_body ::= query_expression_body UNION query_expression_body", - /* 470 */ "query_primary ::= query_specification", - /* 471 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", - /* 472 */ "order_by_clause_opt ::=", - /* 473 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 474 */ "slimit_clause_opt ::=", - /* 475 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 476 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 477 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 478 */ "limit_clause_opt ::=", - /* 479 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 480 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 481 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 482 */ "subquery ::= NK_LP query_expression NK_RP", - /* 483 */ "search_condition ::= common_expression", - /* 484 */ "sort_specification_list ::= sort_specification", - /* 485 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 486 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", - /* 487 */ "ordering_specification_opt ::=", - /* 488 */ "ordering_specification_opt ::= ASC", - /* 489 */ "ordering_specification_opt ::= DESC", - /* 490 */ "null_ordering_opt ::=", - /* 491 */ "null_ordering_opt ::= NULLS FIRST", - /* 492 */ "null_ordering_opt ::= NULLS LAST", + /* 101 */ "db_options ::= db_options TABLE_PREFIX NK_INTEGER", + /* 102 */ "db_options ::= db_options TABLE_SUFFIX NK_INTEGER", + /* 103 */ "alter_db_options ::= alter_db_option", + /* 104 */ "alter_db_options ::= alter_db_options alter_db_option", + /* 105 */ "alter_db_option ::= CACHEMODEL NK_STRING", + /* 106 */ "alter_db_option ::= CACHESIZE NK_INTEGER", + /* 107 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER", + /* 108 */ "alter_db_option ::= KEEP integer_list", + /* 109 */ "alter_db_option ::= KEEP variable_list", + /* 110 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER", + /* 111 */ "alter_db_option ::= SST_TRIGGER NK_INTEGER", + /* 112 */ "integer_list ::= NK_INTEGER", + /* 113 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", + /* 114 */ "variable_list ::= NK_VARIABLE", + /* 115 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", + /* 116 */ "retention_list ::= retention", + /* 117 */ "retention_list ::= retention_list NK_COMMA retention", + /* 118 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", + /* 119 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", + /* 120 */ "cmd ::= CREATE TABLE multi_create_clause", + /* 121 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", + /* 122 */ "cmd ::= DROP TABLE multi_drop_clause", + /* 123 */ "cmd ::= DROP STABLE exists_opt full_table_name", + /* 124 */ "cmd ::= ALTER TABLE alter_table_clause", + /* 125 */ "cmd ::= ALTER STABLE alter_table_clause", + /* 126 */ "alter_table_clause ::= full_table_name alter_table_options", + /* 127 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", + /* 128 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", + /* 129 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", + /* 130 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", + /* 131 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", + /* 132 */ "alter_table_clause ::= full_table_name DROP TAG column_name", + /* 133 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", + /* 134 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", + /* 135 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", + /* 136 */ "multi_create_clause ::= create_subtable_clause", + /* 137 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", + /* 138 */ "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", + /* 139 */ "multi_drop_clause ::= drop_table_clause", + /* 140 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", + /* 141 */ "drop_table_clause ::= exists_opt full_table_name", + /* 142 */ "specific_cols_opt ::=", + /* 143 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", + /* 144 */ "full_table_name ::= table_name", + /* 145 */ "full_table_name ::= db_name NK_DOT table_name", + /* 146 */ "column_def_list ::= column_def", + /* 147 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 148 */ "column_def ::= column_name type_name", + /* 149 */ "column_def ::= column_name type_name COMMENT NK_STRING", + /* 150 */ "type_name ::= BOOL", + /* 151 */ "type_name ::= TINYINT", + /* 152 */ "type_name ::= SMALLINT", + /* 153 */ "type_name ::= INT", + /* 154 */ "type_name ::= INTEGER", + /* 155 */ "type_name ::= BIGINT", + /* 156 */ "type_name ::= FLOAT", + /* 157 */ "type_name ::= DOUBLE", + /* 158 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 159 */ "type_name ::= TIMESTAMP", + /* 160 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 161 */ "type_name ::= TINYINT UNSIGNED", + /* 162 */ "type_name ::= SMALLINT UNSIGNED", + /* 163 */ "type_name ::= INT UNSIGNED", + /* 164 */ "type_name ::= BIGINT UNSIGNED", + /* 165 */ "type_name ::= JSON", + /* 166 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 167 */ "type_name ::= MEDIUMBLOB", + /* 168 */ "type_name ::= BLOB", + /* 169 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 170 */ "type_name ::= DECIMAL", + /* 171 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 172 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 173 */ "tags_def_opt ::=", + /* 174 */ "tags_def_opt ::= tags_def", + /* 175 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", + /* 176 */ "table_options ::=", + /* 177 */ "table_options ::= table_options COMMENT NK_STRING", + /* 178 */ "table_options ::= table_options MAX_DELAY duration_list", + /* 179 */ "table_options ::= table_options WATERMARK duration_list", + /* 180 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", + /* 181 */ "table_options ::= table_options TTL NK_INTEGER", + /* 182 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", + /* 183 */ "alter_table_options ::= alter_table_option", + /* 184 */ "alter_table_options ::= alter_table_options alter_table_option", + /* 185 */ "alter_table_option ::= COMMENT NK_STRING", + /* 186 */ "alter_table_option ::= TTL NK_INTEGER", + /* 187 */ "duration_list ::= duration_literal", + /* 188 */ "duration_list ::= duration_list NK_COMMA duration_literal", + /* 189 */ "rollup_func_list ::= rollup_func_name", + /* 190 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", + /* 191 */ "rollup_func_name ::= function_name", + /* 192 */ "rollup_func_name ::= FIRST", + /* 193 */ "rollup_func_name ::= LAST", + /* 194 */ "col_name_list ::= col_name", + /* 195 */ "col_name_list ::= col_name_list NK_COMMA col_name", + /* 196 */ "col_name ::= column_name", + /* 197 */ "cmd ::= SHOW DNODES", + /* 198 */ "cmd ::= SHOW USERS", + /* 199 */ "cmd ::= SHOW DATABASES", + /* 200 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", + /* 201 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", + /* 202 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", + /* 203 */ "cmd ::= SHOW MNODES", + /* 204 */ "cmd ::= SHOW MODULES", + /* 205 */ "cmd ::= SHOW QNODES", + /* 206 */ "cmd ::= SHOW FUNCTIONS", + /* 207 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", + /* 208 */ "cmd ::= SHOW STREAMS", + /* 209 */ "cmd ::= SHOW ACCOUNTS", + /* 210 */ "cmd ::= SHOW APPS", + /* 211 */ "cmd ::= SHOW CONNECTIONS", + /* 212 */ "cmd ::= SHOW LICENCES", + /* 213 */ "cmd ::= SHOW GRANTS", + /* 214 */ "cmd ::= SHOW CREATE DATABASE db_name", + /* 215 */ "cmd ::= SHOW CREATE TABLE full_table_name", + /* 216 */ "cmd ::= SHOW CREATE STABLE full_table_name", + /* 217 */ "cmd ::= SHOW QUERIES", + /* 218 */ "cmd ::= SHOW SCORES", + /* 219 */ "cmd ::= SHOW TOPICS", + /* 220 */ "cmd ::= SHOW VARIABLES", + /* 221 */ "cmd ::= SHOW LOCAL VARIABLES", + /* 222 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", + /* 223 */ "cmd ::= SHOW BNODES", + /* 224 */ "cmd ::= SHOW SNODES", + /* 225 */ "cmd ::= SHOW CLUSTER", + /* 226 */ "cmd ::= SHOW TRANSACTIONS", + /* 227 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", + /* 228 */ "cmd ::= SHOW CONSUMERS", + /* 229 */ "cmd ::= SHOW SUBSCRIPTIONS", + /* 230 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", + /* 231 */ "cmd ::= SHOW VNODES NK_INTEGER", + /* 232 */ "cmd ::= SHOW VNODES NK_STRING", + /* 233 */ "db_name_cond_opt ::=", + /* 234 */ "db_name_cond_opt ::= db_name NK_DOT", + /* 235 */ "like_pattern_opt ::=", + /* 236 */ "like_pattern_opt ::= LIKE NK_STRING", + /* 237 */ "table_name_cond ::= table_name", + /* 238 */ "from_db_opt ::=", + /* 239 */ "from_db_opt ::= FROM db_name", + /* 240 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", + /* 241 */ "cmd ::= DROP INDEX exists_opt full_table_name", + /* 242 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", + /* 243 */ "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", + /* 244 */ "func_list ::= func", + /* 245 */ "func_list ::= func_list NK_COMMA func", + /* 246 */ "func ::= function_name NK_LP expression_list NK_RP", + /* 247 */ "sma_stream_opt ::=", + /* 248 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", + /* 249 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", + /* 250 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", + /* 251 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", + /* 252 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", + /* 253 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", + /* 254 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", + /* 255 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 256 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", + /* 257 */ "cmd ::= DESC full_table_name", + /* 258 */ "cmd ::= DESCRIBE full_table_name", + /* 259 */ "cmd ::= RESET QUERY CACHE", + /* 260 */ "cmd ::= EXPLAIN analyze_opt explain_options query_expression", + /* 261 */ "analyze_opt ::=", + /* 262 */ "analyze_opt ::= ANALYZE", + /* 263 */ "explain_options ::=", + /* 264 */ "explain_options ::= explain_options VERBOSE NK_BOOL", + /* 265 */ "explain_options ::= explain_options RATIO NK_FLOAT", + /* 266 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", + /* 267 */ "cmd ::= DROP FUNCTION exists_opt function_name", + /* 268 */ "agg_func_opt ::=", + /* 269 */ "agg_func_opt ::= AGGREGATE", + /* 270 */ "bufsize_opt ::=", + /* 271 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", + /* 272 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression", + /* 273 */ "cmd ::= DROP STREAM exists_opt stream_name", + /* 274 */ "stream_options ::=", + /* 275 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 276 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 277 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 278 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 279 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", + /* 280 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 281 */ "cmd ::= KILL QUERY NK_STRING", + /* 282 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 283 */ "cmd ::= BALANCE VGROUP", + /* 284 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 285 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 286 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 287 */ "dnode_list ::= DNODE NK_INTEGER", + /* 288 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 289 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 290 */ "cmd ::= query_expression", + /* 291 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression", + /* 292 */ "cmd ::= INSERT INTO full_table_name query_expression", + /* 293 */ "literal ::= NK_INTEGER", + /* 294 */ "literal ::= NK_FLOAT", + /* 295 */ "literal ::= NK_STRING", + /* 296 */ "literal ::= NK_BOOL", + /* 297 */ "literal ::= TIMESTAMP NK_STRING", + /* 298 */ "literal ::= duration_literal", + /* 299 */ "literal ::= NULL", + /* 300 */ "literal ::= NK_QUESTION", + /* 301 */ "duration_literal ::= NK_VARIABLE", + /* 302 */ "signed ::= NK_INTEGER", + /* 303 */ "signed ::= NK_PLUS NK_INTEGER", + /* 304 */ "signed ::= NK_MINUS NK_INTEGER", + /* 305 */ "signed ::= NK_FLOAT", + /* 306 */ "signed ::= NK_PLUS NK_FLOAT", + /* 307 */ "signed ::= NK_MINUS NK_FLOAT", + /* 308 */ "signed_literal ::= signed", + /* 309 */ "signed_literal ::= NK_STRING", + /* 310 */ "signed_literal ::= NK_BOOL", + /* 311 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 312 */ "signed_literal ::= duration_literal", + /* 313 */ "signed_literal ::= NULL", + /* 314 */ "signed_literal ::= literal_func", + /* 315 */ "signed_literal ::= NK_QUESTION", + /* 316 */ "literal_list ::= signed_literal", + /* 317 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 318 */ "db_name ::= NK_ID", + /* 319 */ "table_name ::= NK_ID", + /* 320 */ "column_name ::= NK_ID", + /* 321 */ "function_name ::= NK_ID", + /* 322 */ "table_alias ::= NK_ID", + /* 323 */ "column_alias ::= NK_ID", + /* 324 */ "user_name ::= NK_ID", + /* 325 */ "topic_name ::= NK_ID", + /* 326 */ "stream_name ::= NK_ID", + /* 327 */ "cgroup_name ::= NK_ID", + /* 328 */ "expression ::= literal", + /* 329 */ "expression ::= pseudo_column", + /* 330 */ "expression ::= column_reference", + /* 331 */ "expression ::= function_expression", + /* 332 */ "expression ::= subquery", + /* 333 */ "expression ::= NK_LP expression NK_RP", + /* 334 */ "expression ::= NK_PLUS expression", + /* 335 */ "expression ::= NK_MINUS expression", + /* 336 */ "expression ::= expression NK_PLUS expression", + /* 337 */ "expression ::= expression NK_MINUS expression", + /* 338 */ "expression ::= expression NK_STAR expression", + /* 339 */ "expression ::= expression NK_SLASH expression", + /* 340 */ "expression ::= expression NK_REM expression", + /* 341 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 342 */ "expression ::= expression NK_BITAND expression", + /* 343 */ "expression ::= expression NK_BITOR expression", + /* 344 */ "expression_list ::= expression", + /* 345 */ "expression_list ::= expression_list NK_COMMA expression", + /* 346 */ "column_reference ::= column_name", + /* 347 */ "column_reference ::= table_name NK_DOT column_name", + /* 348 */ "pseudo_column ::= ROWTS", + /* 349 */ "pseudo_column ::= TBNAME", + /* 350 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 351 */ "pseudo_column ::= QSTART", + /* 352 */ "pseudo_column ::= QEND", + /* 353 */ "pseudo_column ::= QDURATION", + /* 354 */ "pseudo_column ::= WSTART", + /* 355 */ "pseudo_column ::= WEND", + /* 356 */ "pseudo_column ::= WDURATION", + /* 357 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 358 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 359 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", + /* 360 */ "function_expression ::= literal_func", + /* 361 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 362 */ "literal_func ::= NOW", + /* 363 */ "noarg_func ::= NOW", + /* 364 */ "noarg_func ::= TODAY", + /* 365 */ "noarg_func ::= TIMEZONE", + /* 366 */ "noarg_func ::= DATABASE", + /* 367 */ "noarg_func ::= CLIENT_VERSION", + /* 368 */ "noarg_func ::= SERVER_VERSION", + /* 369 */ "noarg_func ::= SERVER_STATUS", + /* 370 */ "noarg_func ::= CURRENT_USER", + /* 371 */ "noarg_func ::= USER", + /* 372 */ "star_func ::= COUNT", + /* 373 */ "star_func ::= FIRST", + /* 374 */ "star_func ::= LAST", + /* 375 */ "star_func ::= LAST_ROW", + /* 376 */ "star_func_para_list ::= NK_STAR", + /* 377 */ "star_func_para_list ::= other_para_list", + /* 378 */ "other_para_list ::= star_func_para", + /* 379 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 380 */ "star_func_para ::= expression", + /* 381 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 382 */ "predicate ::= expression compare_op expression", + /* 383 */ "predicate ::= expression BETWEEN expression AND expression", + /* 384 */ "predicate ::= expression NOT BETWEEN expression AND expression", + /* 385 */ "predicate ::= expression IS NULL", + /* 386 */ "predicate ::= expression IS NOT NULL", + /* 387 */ "predicate ::= expression in_op in_predicate_value", + /* 388 */ "compare_op ::= NK_LT", + /* 389 */ "compare_op ::= NK_GT", + /* 390 */ "compare_op ::= NK_LE", + /* 391 */ "compare_op ::= NK_GE", + /* 392 */ "compare_op ::= NK_NE", + /* 393 */ "compare_op ::= NK_EQ", + /* 394 */ "compare_op ::= LIKE", + /* 395 */ "compare_op ::= NOT LIKE", + /* 396 */ "compare_op ::= MATCH", + /* 397 */ "compare_op ::= NMATCH", + /* 398 */ "compare_op ::= CONTAINS", + /* 399 */ "in_op ::= IN", + /* 400 */ "in_op ::= NOT IN", + /* 401 */ "in_predicate_value ::= NK_LP literal_list NK_RP", + /* 402 */ "boolean_value_expression ::= boolean_primary", + /* 403 */ "boolean_value_expression ::= NOT boolean_primary", + /* 404 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 405 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 406 */ "boolean_primary ::= predicate", + /* 407 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 408 */ "common_expression ::= expression", + /* 409 */ "common_expression ::= boolean_value_expression", + /* 410 */ "from_clause_opt ::=", + /* 411 */ "from_clause_opt ::= FROM table_reference_list", + /* 412 */ "table_reference_list ::= table_reference", + /* 413 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 414 */ "table_reference ::= table_primary", + /* 415 */ "table_reference ::= joined_table", + /* 416 */ "table_primary ::= table_name alias_opt", + /* 417 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 418 */ "table_primary ::= subquery alias_opt", + /* 419 */ "table_primary ::= parenthesized_joined_table", + /* 420 */ "alias_opt ::=", + /* 421 */ "alias_opt ::= table_alias", + /* 422 */ "alias_opt ::= AS table_alias", + /* 423 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 424 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 425 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 426 */ "join_type ::=", + /* 427 */ "join_type ::= INNER", + /* 428 */ "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", + /* 429 */ "set_quantifier_opt ::=", + /* 430 */ "set_quantifier_opt ::= DISTINCT", + /* 431 */ "set_quantifier_opt ::= ALL", + /* 432 */ "select_list ::= select_item", + /* 433 */ "select_list ::= select_list NK_COMMA select_item", + /* 434 */ "select_item ::= NK_STAR", + /* 435 */ "select_item ::= common_expression", + /* 436 */ "select_item ::= common_expression column_alias", + /* 437 */ "select_item ::= common_expression AS column_alias", + /* 438 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 439 */ "where_clause_opt ::=", + /* 440 */ "where_clause_opt ::= WHERE search_condition", + /* 441 */ "partition_by_clause_opt ::=", + /* 442 */ "partition_by_clause_opt ::= PARTITION BY expression_list", + /* 443 */ "twindow_clause_opt ::=", + /* 444 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", + /* 445 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", + /* 446 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 447 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 448 */ "sliding_opt ::=", + /* 449 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 450 */ "fill_opt ::=", + /* 451 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 452 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 453 */ "fill_mode ::= NONE", + /* 454 */ "fill_mode ::= PREV", + /* 455 */ "fill_mode ::= NULL", + /* 456 */ "fill_mode ::= LINEAR", + /* 457 */ "fill_mode ::= NEXT", + /* 458 */ "group_by_clause_opt ::=", + /* 459 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 460 */ "group_by_list ::= expression", + /* 461 */ "group_by_list ::= group_by_list NK_COMMA expression", + /* 462 */ "having_clause_opt ::=", + /* 463 */ "having_clause_opt ::= HAVING search_condition", + /* 464 */ "range_opt ::=", + /* 465 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", + /* 466 */ "every_opt ::=", + /* 467 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 468 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 469 */ "query_expression_body ::= query_primary", + /* 470 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 471 */ "query_expression_body ::= query_expression_body UNION query_expression_body", + /* 472 */ "query_primary ::= query_specification", + /* 473 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", + /* 474 */ "order_by_clause_opt ::=", + /* 475 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 476 */ "slimit_clause_opt ::=", + /* 477 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 478 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 479 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 480 */ "limit_clause_opt ::=", + /* 481 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 482 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 483 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 484 */ "subquery ::= NK_LP query_expression NK_RP", + /* 485 */ "search_condition ::= common_expression", + /* 486 */ "sort_specification_list ::= sort_specification", + /* 487 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 488 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", + /* 489 */ "ordering_specification_opt ::=", + /* 490 */ "ordering_specification_opt ::= ASC", + /* 491 */ "ordering_specification_opt ::= DESC", + /* 492 */ "null_ordering_opt ::=", + /* 493 */ "null_ordering_opt ::= NULLS FIRST", + /* 494 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -2367,179 +2361,179 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 306: /* cmd */ - case 309: /* literal */ - case 320: /* db_options */ - case 322: /* alter_db_options */ - case 327: /* retention */ - case 328: /* full_table_name */ - case 331: /* table_options */ - case 335: /* alter_table_clause */ - case 336: /* alter_table_options */ - case 339: /* signed_literal */ - case 340: /* create_subtable_clause */ - case 343: /* drop_table_clause */ - case 346: /* column_def */ - case 350: /* duration_literal */ - case 351: /* rollup_func_name */ - case 353: /* col_name */ - case 354: /* db_name_cond_opt */ - case 355: /* like_pattern_opt */ - case 356: /* table_name_cond */ - case 357: /* from_db_opt */ - case 358: /* index_options */ - case 360: /* sliding_opt */ - case 361: /* sma_stream_opt */ - case 362: /* func */ - case 363: /* stream_options */ - case 365: /* query_expression */ - case 368: /* explain_options */ - case 373: /* where_clause_opt */ - case 374: /* signed */ - case 375: /* literal_func */ - case 379: /* expression */ - case 380: /* pseudo_column */ - case 381: /* column_reference */ - case 382: /* function_expression */ - case 383: /* subquery */ - case 388: /* star_func_para */ - case 389: /* predicate */ - case 392: /* in_predicate_value */ - case 393: /* boolean_value_expression */ - case 394: /* boolean_primary */ - case 395: /* common_expression */ - case 396: /* from_clause_opt */ - case 397: /* table_reference_list */ - case 398: /* table_reference */ - case 399: /* table_primary */ - case 400: /* joined_table */ - case 402: /* parenthesized_joined_table */ - case 404: /* search_condition */ - case 405: /* query_specification */ - case 409: /* range_opt */ - case 410: /* every_opt */ - case 411: /* fill_opt */ - case 412: /* twindow_clause_opt */ - case 414: /* having_clause_opt */ - case 415: /* select_item */ - case 418: /* query_expression_body */ - case 420: /* slimit_clause_opt */ - case 421: /* limit_clause_opt */ - case 422: /* query_primary */ - case 424: /* sort_specification */ + case 308: /* cmd */ + case 311: /* literal */ + case 322: /* db_options */ + case 324: /* alter_db_options */ + case 329: /* retention */ + case 330: /* full_table_name */ + case 333: /* table_options */ + case 337: /* alter_table_clause */ + case 338: /* alter_table_options */ + case 341: /* signed_literal */ + case 342: /* create_subtable_clause */ + case 345: /* drop_table_clause */ + case 348: /* column_def */ + case 352: /* duration_literal */ + case 353: /* rollup_func_name */ + case 355: /* col_name */ + case 356: /* db_name_cond_opt */ + case 357: /* like_pattern_opt */ + case 358: /* table_name_cond */ + case 359: /* from_db_opt */ + case 360: /* index_options */ + case 362: /* sliding_opt */ + case 363: /* sma_stream_opt */ + case 364: /* func */ + case 365: /* stream_options */ + case 367: /* query_expression */ + case 370: /* explain_options */ + case 375: /* where_clause_opt */ + case 376: /* signed */ + case 377: /* literal_func */ + case 381: /* expression */ + case 382: /* pseudo_column */ + case 383: /* column_reference */ + case 384: /* function_expression */ + case 385: /* subquery */ + case 390: /* star_func_para */ + case 391: /* predicate */ + case 394: /* in_predicate_value */ + case 395: /* boolean_value_expression */ + case 396: /* boolean_primary */ + case 397: /* common_expression */ + case 398: /* from_clause_opt */ + case 399: /* table_reference_list */ + case 400: /* table_reference */ + case 401: /* table_primary */ + case 402: /* joined_table */ + case 404: /* parenthesized_joined_table */ + case 406: /* search_condition */ + case 407: /* query_specification */ + case 411: /* range_opt */ + case 412: /* every_opt */ + case 413: /* fill_opt */ + case 414: /* twindow_clause_opt */ + case 416: /* having_clause_opt */ + case 417: /* select_item */ + case 420: /* query_expression_body */ + case 422: /* slimit_clause_opt */ + case 423: /* limit_clause_opt */ + case 424: /* query_primary */ + case 426: /* sort_specification */ { - nodesDestroyNode((yypminor->yy840)); + nodesDestroyNode((yypminor->yy80)); } break; - case 307: /* account_options */ - case 308: /* alter_account_options */ - case 310: /* alter_account_option */ - case 370: /* bufsize_opt */ + case 309: /* account_options */ + case 310: /* alter_account_options */ + case 312: /* alter_account_option */ + case 372: /* bufsize_opt */ { } break; - case 311: /* user_name */ - case 314: /* priv_level */ - case 317: /* db_name */ - case 318: /* dnode_endpoint */ - case 337: /* column_name */ - case 345: /* table_name */ - case 352: /* function_name */ - case 364: /* topic_name */ - case 366: /* cgroup_name */ - case 371: /* stream_name */ - case 377: /* table_alias */ - case 378: /* column_alias */ - case 384: /* star_func */ - case 386: /* noarg_func */ - case 401: /* alias_opt */ + case 313: /* user_name */ + case 316: /* priv_level */ + case 319: /* db_name */ + case 320: /* dnode_endpoint */ + case 339: /* column_name */ + case 347: /* table_name */ + case 354: /* function_name */ + case 366: /* topic_name */ + case 368: /* cgroup_name */ + case 373: /* stream_name */ + case 379: /* table_alias */ + case 380: /* column_alias */ + case 386: /* star_func */ + case 388: /* noarg_func */ + case 403: /* alias_opt */ { } break; - case 312: /* sysinfo_opt */ + case 314: /* sysinfo_opt */ { } break; - case 313: /* privileges */ - case 315: /* priv_type_list */ - case 316: /* priv_type */ + case 315: /* privileges */ + case 317: /* priv_type_list */ + case 318: /* priv_type */ { } break; - case 319: /* not_exists_opt */ - case 321: /* exists_opt */ - case 367: /* analyze_opt */ - case 369: /* agg_func_opt */ - case 406: /* set_quantifier_opt */ + case 321: /* not_exists_opt */ + case 323: /* exists_opt */ + case 369: /* analyze_opt */ + case 371: /* agg_func_opt */ + case 408: /* set_quantifier_opt */ { } break; - case 323: /* integer_list */ - case 324: /* variable_list */ - case 325: /* retention_list */ - case 329: /* column_def_list */ - case 330: /* tags_def_opt */ - case 332: /* multi_create_clause */ - case 333: /* tags_def */ - case 334: /* multi_drop_clause */ - case 341: /* specific_cols_opt */ - case 342: /* expression_list */ - case 344: /* col_name_list */ - case 347: /* duration_list */ - case 348: /* rollup_func_list */ - case 359: /* func_list */ - case 372: /* dnode_list */ - case 376: /* literal_list */ - case 385: /* star_func_para_list */ - case 387: /* other_para_list */ - case 407: /* select_list */ - case 408: /* partition_by_clause_opt */ - case 413: /* group_by_clause_opt */ - case 417: /* group_by_list */ - case 419: /* order_by_clause_opt */ - case 423: /* sort_specification_list */ + case 325: /* integer_list */ + case 326: /* variable_list */ + case 327: /* retention_list */ + case 331: /* column_def_list */ + case 332: /* tags_def_opt */ + case 334: /* multi_create_clause */ + case 335: /* tags_def */ + case 336: /* multi_drop_clause */ + case 343: /* specific_cols_opt */ + case 344: /* expression_list */ + case 346: /* col_name_list */ + case 349: /* duration_list */ + case 350: /* rollup_func_list */ + case 361: /* func_list */ + case 374: /* dnode_list */ + case 378: /* literal_list */ + case 387: /* star_func_para_list */ + case 389: /* other_para_list */ + case 409: /* select_list */ + case 410: /* partition_by_clause_opt */ + case 415: /* group_by_clause_opt */ + case 419: /* group_by_list */ + case 421: /* order_by_clause_opt */ + case 425: /* sort_specification_list */ { - nodesDestroyList((yypminor->yy544)); + nodesDestroyList((yypminor->yy574)); } break; - case 326: /* alter_db_option */ - case 349: /* alter_table_option */ + case 328: /* alter_db_option */ + case 351: /* alter_table_option */ { } break; - case 338: /* type_name */ + case 340: /* type_name */ { } break; - case 390: /* compare_op */ - case 391: /* in_op */ + case 392: /* compare_op */ + case 393: /* in_op */ { } break; - case 403: /* join_type */ + case 405: /* join_type */ { } break; - case 416: /* fill_mode */ + case 418: /* fill_mode */ { } break; - case 425: /* ordering_specification_opt */ + case 427: /* ordering_specification_opt */ { } break; - case 426: /* null_ordering_opt */ + case 428: /* null_ordering_opt */ { } @@ -2838,499 +2832,501 @@ 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[] = { - { 306, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ - { 306, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ - { 307, 0 }, /* (2) account_options ::= */ - { 307, -3 }, /* (3) account_options ::= account_options PPS literal */ - { 307, -3 }, /* (4) account_options ::= account_options TSERIES literal */ - { 307, -3 }, /* (5) account_options ::= account_options STORAGE literal */ - { 307, -3 }, /* (6) account_options ::= account_options STREAMS literal */ - { 307, -3 }, /* (7) account_options ::= account_options QTIME literal */ - { 307, -3 }, /* (8) account_options ::= account_options DBS literal */ - { 307, -3 }, /* (9) account_options ::= account_options USERS literal */ - { 307, -3 }, /* (10) account_options ::= account_options CONNS literal */ - { 307, -3 }, /* (11) account_options ::= account_options STATE literal */ - { 308, -1 }, /* (12) alter_account_options ::= alter_account_option */ - { 308, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ - { 310, -2 }, /* (14) alter_account_option ::= PASS literal */ - { 310, -2 }, /* (15) alter_account_option ::= PPS literal */ - { 310, -2 }, /* (16) alter_account_option ::= TSERIES literal */ - { 310, -2 }, /* (17) alter_account_option ::= STORAGE literal */ - { 310, -2 }, /* (18) alter_account_option ::= STREAMS literal */ - { 310, -2 }, /* (19) alter_account_option ::= QTIME literal */ - { 310, -2 }, /* (20) alter_account_option ::= DBS literal */ - { 310, -2 }, /* (21) alter_account_option ::= USERS literal */ - { 310, -2 }, /* (22) alter_account_option ::= CONNS literal */ - { 310, -2 }, /* (23) alter_account_option ::= STATE literal */ - { 306, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ - { 306, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ - { 306, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ - { 306, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ - { 306, -3 }, /* (28) cmd ::= DROP USER user_name */ - { 312, 0 }, /* (29) sysinfo_opt ::= */ - { 312, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ - { 306, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ - { 306, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ - { 313, -1 }, /* (33) privileges ::= ALL */ - { 313, -1 }, /* (34) privileges ::= priv_type_list */ - { 315, -1 }, /* (35) priv_type_list ::= priv_type */ - { 315, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ - { 316, -1 }, /* (37) priv_type ::= READ */ - { 316, -1 }, /* (38) priv_type ::= WRITE */ - { 314, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ - { 314, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ - { 306, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ - { 306, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ - { 306, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ - { 306, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ - { 306, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ - { 306, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ - { 306, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ - { 306, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ - { 318, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ - { 318, -1 }, /* (50) dnode_endpoint ::= NK_ID */ - { 318, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ - { 306, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ - { 306, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ - { 306, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ - { 306, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ - { 306, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ - { 306, -2 }, /* (64) cmd ::= USE db_name */ - { 306, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ - { 306, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ - { 306, -3 }, /* (67) cmd ::= TRIM DATABASE db_name */ - { 319, -3 }, /* (68) not_exists_opt ::= IF NOT EXISTS */ - { 319, 0 }, /* (69) not_exists_opt ::= */ - { 321, -2 }, /* (70) exists_opt ::= IF EXISTS */ - { 321, 0 }, /* (71) exists_opt ::= */ - { 320, 0 }, /* (72) db_options ::= */ - { 320, -3 }, /* (73) db_options ::= db_options BUFFER NK_INTEGER */ - { 320, -3 }, /* (74) db_options ::= db_options CACHEMODEL NK_STRING */ - { 320, -3 }, /* (75) db_options ::= db_options CACHESIZE NK_INTEGER */ - { 320, -3 }, /* (76) db_options ::= db_options COMP NK_INTEGER */ - { 320, -3 }, /* (77) db_options ::= db_options DURATION NK_INTEGER */ - { 320, -3 }, /* (78) db_options ::= db_options DURATION NK_VARIABLE */ - { 320, -3 }, /* (79) db_options ::= db_options MAXROWS NK_INTEGER */ - { 320, -3 }, /* (80) db_options ::= db_options MINROWS NK_INTEGER */ - { 320, -3 }, /* (81) db_options ::= db_options KEEP integer_list */ - { 320, -3 }, /* (82) db_options ::= db_options KEEP variable_list */ - { 320, -3 }, /* (83) db_options ::= db_options PAGES NK_INTEGER */ - { 320, -3 }, /* (84) db_options ::= db_options PAGESIZE NK_INTEGER */ - { 320, -3 }, /* (85) db_options ::= db_options PRECISION NK_STRING */ - { 320, -3 }, /* (86) db_options ::= db_options REPLICA NK_INTEGER */ - { 320, -3 }, /* (87) db_options ::= db_options STRICT NK_STRING */ - { 320, -3 }, /* (88) db_options ::= db_options VGROUPS NK_INTEGER */ - { 320, -3 }, /* (89) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ - { 320, -3 }, /* (90) db_options ::= db_options RETENTIONS retention_list */ - { 320, -3 }, /* (91) db_options ::= db_options SCHEMALESS NK_INTEGER */ - { 320, -3 }, /* (92) db_options ::= db_options WAL_LEVEL NK_INTEGER */ - { 320, -3 }, /* (93) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ - { 320, -3 }, /* (94) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ - { 320, -4 }, /* (95) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ - { 320, -3 }, /* (96) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ - { 320, -4 }, /* (97) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ - { 320, -3 }, /* (98) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ - { 320, -3 }, /* (99) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ - { 320, -3 }, /* (100) db_options ::= db_options SST_TRIGGER NK_INTEGER */ - { 322, -1 }, /* (101) alter_db_options ::= alter_db_option */ - { 322, -2 }, /* (102) alter_db_options ::= alter_db_options alter_db_option */ - { 326, -2 }, /* (103) alter_db_option ::= CACHEMODEL NK_STRING */ - { 326, -2 }, /* (104) alter_db_option ::= CACHESIZE NK_INTEGER */ - { 326, -2 }, /* (105) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ - { 326, -2 }, /* (106) alter_db_option ::= KEEP integer_list */ - { 326, -2 }, /* (107) alter_db_option ::= KEEP variable_list */ - { 326, -2 }, /* (108) alter_db_option ::= WAL_LEVEL NK_INTEGER */ - { 326, -2 }, /* (109) alter_db_option ::= SST_TRIGGER NK_INTEGER */ - { 323, -1 }, /* (110) integer_list ::= NK_INTEGER */ - { 323, -3 }, /* (111) integer_list ::= integer_list NK_COMMA NK_INTEGER */ - { 324, -1 }, /* (112) variable_list ::= NK_VARIABLE */ - { 324, -3 }, /* (113) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ - { 325, -1 }, /* (114) retention_list ::= retention */ - { 325, -3 }, /* (115) retention_list ::= retention_list NK_COMMA retention */ - { 327, -3 }, /* (116) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ - { 306, -9 }, /* (117) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - { 306, -3 }, /* (118) cmd ::= CREATE TABLE multi_create_clause */ - { 306, -9 }, /* (119) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ - { 306, -3 }, /* (120) cmd ::= DROP TABLE multi_drop_clause */ - { 306, -4 }, /* (121) cmd ::= DROP STABLE exists_opt full_table_name */ - { 306, -3 }, /* (122) cmd ::= ALTER TABLE alter_table_clause */ - { 306, -3 }, /* (123) cmd ::= ALTER STABLE alter_table_clause */ - { 335, -2 }, /* (124) alter_table_clause ::= full_table_name alter_table_options */ - { 335, -5 }, /* (125) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ - { 335, -4 }, /* (126) alter_table_clause ::= full_table_name DROP COLUMN column_name */ - { 335, -5 }, /* (127) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ - { 335, -5 }, /* (128) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ - { 335, -5 }, /* (129) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ - { 335, -4 }, /* (130) alter_table_clause ::= full_table_name DROP TAG column_name */ - { 335, -5 }, /* (131) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ - { 335, -5 }, /* (132) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ - { 335, -6 }, /* (133) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ - { 332, -1 }, /* (134) multi_create_clause ::= create_subtable_clause */ - { 332, -2 }, /* (135) multi_create_clause ::= multi_create_clause create_subtable_clause */ - { 340, -10 }, /* (136) 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 */ - { 334, -1 }, /* (137) multi_drop_clause ::= drop_table_clause */ - { 334, -2 }, /* (138) multi_drop_clause ::= multi_drop_clause drop_table_clause */ - { 343, -2 }, /* (139) drop_table_clause ::= exists_opt full_table_name */ - { 341, 0 }, /* (140) specific_cols_opt ::= */ - { 341, -3 }, /* (141) specific_cols_opt ::= NK_LP col_name_list NK_RP */ - { 328, -1 }, /* (142) full_table_name ::= table_name */ - { 328, -3 }, /* (143) full_table_name ::= db_name NK_DOT table_name */ - { 329, -1 }, /* (144) column_def_list ::= column_def */ - { 329, -3 }, /* (145) column_def_list ::= column_def_list NK_COMMA column_def */ - { 346, -2 }, /* (146) column_def ::= column_name type_name */ - { 346, -4 }, /* (147) column_def ::= column_name type_name COMMENT NK_STRING */ - { 338, -1 }, /* (148) type_name ::= BOOL */ - { 338, -1 }, /* (149) type_name ::= TINYINT */ - { 338, -1 }, /* (150) type_name ::= SMALLINT */ - { 338, -1 }, /* (151) type_name ::= INT */ - { 338, -1 }, /* (152) type_name ::= INTEGER */ - { 338, -1 }, /* (153) type_name ::= BIGINT */ - { 338, -1 }, /* (154) type_name ::= FLOAT */ - { 338, -1 }, /* (155) type_name ::= DOUBLE */ - { 338, -4 }, /* (156) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 338, -1 }, /* (157) type_name ::= TIMESTAMP */ - { 338, -4 }, /* (158) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 338, -2 }, /* (159) type_name ::= TINYINT UNSIGNED */ - { 338, -2 }, /* (160) type_name ::= SMALLINT UNSIGNED */ - { 338, -2 }, /* (161) type_name ::= INT UNSIGNED */ - { 338, -2 }, /* (162) type_name ::= BIGINT UNSIGNED */ - { 338, -1 }, /* (163) type_name ::= JSON */ - { 338, -4 }, /* (164) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 338, -1 }, /* (165) type_name ::= MEDIUMBLOB */ - { 338, -1 }, /* (166) type_name ::= BLOB */ - { 338, -4 }, /* (167) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 338, -1 }, /* (168) type_name ::= DECIMAL */ - { 338, -4 }, /* (169) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 338, -6 }, /* (170) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 330, 0 }, /* (171) tags_def_opt ::= */ - { 330, -1 }, /* (172) tags_def_opt ::= tags_def */ - { 333, -4 }, /* (173) tags_def ::= TAGS NK_LP column_def_list NK_RP */ - { 331, 0 }, /* (174) table_options ::= */ - { 331, -3 }, /* (175) table_options ::= table_options COMMENT NK_STRING */ - { 331, -3 }, /* (176) table_options ::= table_options MAX_DELAY duration_list */ - { 331, -3 }, /* (177) table_options ::= table_options WATERMARK duration_list */ - { 331, -5 }, /* (178) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ - { 331, -3 }, /* (179) table_options ::= table_options TTL NK_INTEGER */ - { 331, -5 }, /* (180) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ - { 336, -1 }, /* (181) alter_table_options ::= alter_table_option */ - { 336, -2 }, /* (182) alter_table_options ::= alter_table_options alter_table_option */ - { 349, -2 }, /* (183) alter_table_option ::= COMMENT NK_STRING */ - { 349, -2 }, /* (184) alter_table_option ::= TTL NK_INTEGER */ - { 347, -1 }, /* (185) duration_list ::= duration_literal */ - { 347, -3 }, /* (186) duration_list ::= duration_list NK_COMMA duration_literal */ - { 348, -1 }, /* (187) rollup_func_list ::= rollup_func_name */ - { 348, -3 }, /* (188) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ - { 351, -1 }, /* (189) rollup_func_name ::= function_name */ - { 351, -1 }, /* (190) rollup_func_name ::= FIRST */ - { 351, -1 }, /* (191) rollup_func_name ::= LAST */ - { 344, -1 }, /* (192) col_name_list ::= col_name */ - { 344, -3 }, /* (193) col_name_list ::= col_name_list NK_COMMA col_name */ - { 353, -1 }, /* (194) col_name ::= column_name */ - { 306, -2 }, /* (195) cmd ::= SHOW DNODES */ - { 306, -2 }, /* (196) cmd ::= SHOW USERS */ - { 306, -2 }, /* (197) cmd ::= SHOW DATABASES */ - { 306, -4 }, /* (198) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ - { 306, -4 }, /* (199) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ - { 306, -3 }, /* (200) cmd ::= SHOW db_name_cond_opt VGROUPS */ - { 306, -2 }, /* (201) cmd ::= SHOW MNODES */ - { 306, -2 }, /* (202) cmd ::= SHOW MODULES */ - { 306, -2 }, /* (203) cmd ::= SHOW QNODES */ - { 306, -2 }, /* (204) cmd ::= SHOW FUNCTIONS */ - { 306, -5 }, /* (205) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ - { 306, -2 }, /* (206) cmd ::= SHOW STREAMS */ - { 306, -2 }, /* (207) cmd ::= SHOW ACCOUNTS */ - { 306, -2 }, /* (208) cmd ::= SHOW APPS */ - { 306, -2 }, /* (209) cmd ::= SHOW CONNECTIONS */ - { 306, -2 }, /* (210) cmd ::= SHOW LICENCES */ - { 306, -2 }, /* (211) cmd ::= SHOW GRANTS */ - { 306, -4 }, /* (212) cmd ::= SHOW CREATE DATABASE db_name */ - { 306, -4 }, /* (213) cmd ::= SHOW CREATE TABLE full_table_name */ - { 306, -4 }, /* (214) cmd ::= SHOW CREATE STABLE full_table_name */ - { 306, -2 }, /* (215) cmd ::= SHOW QUERIES */ - { 306, -2 }, /* (216) cmd ::= SHOW SCORES */ - { 306, -2 }, /* (217) cmd ::= SHOW TOPICS */ - { 306, -2 }, /* (218) cmd ::= SHOW VARIABLES */ - { 306, -3 }, /* (219) cmd ::= SHOW LOCAL VARIABLES */ - { 306, -4 }, /* (220) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ - { 306, -2 }, /* (221) cmd ::= SHOW BNODES */ - { 306, -2 }, /* (222) cmd ::= SHOW SNODES */ - { 306, -2 }, /* (223) cmd ::= SHOW CLUSTER */ - { 306, -2 }, /* (224) cmd ::= SHOW TRANSACTIONS */ - { 306, -4 }, /* (225) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ - { 306, -2 }, /* (226) cmd ::= SHOW CONSUMERS */ - { 306, -2 }, /* (227) cmd ::= SHOW SUBSCRIPTIONS */ - { 306, -5 }, /* (228) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ - { 306, -3 }, /* (229) cmd ::= SHOW VNODES NK_INTEGER */ - { 306, -3 }, /* (230) cmd ::= SHOW VNODES NK_STRING */ - { 354, 0 }, /* (231) db_name_cond_opt ::= */ - { 354, -2 }, /* (232) db_name_cond_opt ::= db_name NK_DOT */ - { 355, 0 }, /* (233) like_pattern_opt ::= */ - { 355, -2 }, /* (234) like_pattern_opt ::= LIKE NK_STRING */ - { 356, -1 }, /* (235) table_name_cond ::= table_name */ - { 357, 0 }, /* (236) from_db_opt ::= */ - { 357, -2 }, /* (237) from_db_opt ::= FROM db_name */ - { 306, -8 }, /* (238) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ - { 306, -4 }, /* (239) cmd ::= DROP INDEX exists_opt full_table_name */ - { 358, -10 }, /* (240) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ - { 358, -12 }, /* (241) 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 */ - { 359, -1 }, /* (242) func_list ::= func */ - { 359, -3 }, /* (243) func_list ::= func_list NK_COMMA func */ - { 362, -4 }, /* (244) func ::= function_name NK_LP expression_list NK_RP */ - { 361, 0 }, /* (245) sma_stream_opt ::= */ - { 361, -3 }, /* (246) sma_stream_opt ::= stream_options WATERMARK duration_literal */ - { 361, -3 }, /* (247) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ - { 306, -6 }, /* (248) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ - { 306, -7 }, /* (249) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ - { 306, -9 }, /* (250) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - { 306, -7 }, /* (251) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - { 306, -9 }, /* (252) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ - { 306, -4 }, /* (253) cmd ::= DROP TOPIC exists_opt topic_name */ - { 306, -7 }, /* (254) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ - { 306, -2 }, /* (255) cmd ::= DESC full_table_name */ - { 306, -2 }, /* (256) cmd ::= DESCRIBE full_table_name */ - { 306, -3 }, /* (257) cmd ::= RESET QUERY CACHE */ - { 306, -4 }, /* (258) cmd ::= EXPLAIN analyze_opt explain_options query_expression */ - { 367, 0 }, /* (259) analyze_opt ::= */ - { 367, -1 }, /* (260) analyze_opt ::= ANALYZE */ - { 368, 0 }, /* (261) explain_options ::= */ - { 368, -3 }, /* (262) explain_options ::= explain_options VERBOSE NK_BOOL */ - { 368, -3 }, /* (263) explain_options ::= explain_options RATIO NK_FLOAT */ - { 306, -10 }, /* (264) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ - { 306, -4 }, /* (265) cmd ::= DROP FUNCTION exists_opt function_name */ - { 369, 0 }, /* (266) agg_func_opt ::= */ - { 369, -1 }, /* (267) agg_func_opt ::= AGGREGATE */ - { 370, 0 }, /* (268) bufsize_opt ::= */ - { 370, -2 }, /* (269) bufsize_opt ::= BUFSIZE NK_INTEGER */ - { 306, -9 }, /* (270) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression */ - { 306, -4 }, /* (271) cmd ::= DROP STREAM exists_opt stream_name */ - { 363, 0 }, /* (272) stream_options ::= */ - { 363, -3 }, /* (273) stream_options ::= stream_options TRIGGER AT_ONCE */ - { 363, -3 }, /* (274) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - { 363, -4 }, /* (275) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - { 363, -3 }, /* (276) stream_options ::= stream_options WATERMARK duration_literal */ - { 363, -4 }, /* (277) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ - { 306, -3 }, /* (278) cmd ::= KILL CONNECTION NK_INTEGER */ - { 306, -3 }, /* (279) cmd ::= KILL QUERY NK_STRING */ - { 306, -3 }, /* (280) cmd ::= KILL TRANSACTION NK_INTEGER */ - { 306, -2 }, /* (281) cmd ::= BALANCE VGROUP */ - { 306, -4 }, /* (282) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ - { 306, -4 }, /* (283) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ - { 306, -3 }, /* (284) cmd ::= SPLIT VGROUP NK_INTEGER */ - { 372, -2 }, /* (285) dnode_list ::= DNODE NK_INTEGER */ - { 372, -3 }, /* (286) dnode_list ::= dnode_list DNODE NK_INTEGER */ - { 306, -4 }, /* (287) cmd ::= DELETE FROM full_table_name where_clause_opt */ - { 306, -1 }, /* (288) cmd ::= query_expression */ - { 306, -7 }, /* (289) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ - { 306, -4 }, /* (290) cmd ::= INSERT INTO full_table_name query_expression */ - { 309, -1 }, /* (291) literal ::= NK_INTEGER */ - { 309, -1 }, /* (292) literal ::= NK_FLOAT */ - { 309, -1 }, /* (293) literal ::= NK_STRING */ - { 309, -1 }, /* (294) literal ::= NK_BOOL */ - { 309, -2 }, /* (295) literal ::= TIMESTAMP NK_STRING */ - { 309, -1 }, /* (296) literal ::= duration_literal */ - { 309, -1 }, /* (297) literal ::= NULL */ - { 309, -1 }, /* (298) literal ::= NK_QUESTION */ - { 350, -1 }, /* (299) duration_literal ::= NK_VARIABLE */ - { 374, -1 }, /* (300) signed ::= NK_INTEGER */ - { 374, -2 }, /* (301) signed ::= NK_PLUS NK_INTEGER */ - { 374, -2 }, /* (302) signed ::= NK_MINUS NK_INTEGER */ - { 374, -1 }, /* (303) signed ::= NK_FLOAT */ - { 374, -2 }, /* (304) signed ::= NK_PLUS NK_FLOAT */ - { 374, -2 }, /* (305) signed ::= NK_MINUS NK_FLOAT */ - { 339, -1 }, /* (306) signed_literal ::= signed */ - { 339, -1 }, /* (307) signed_literal ::= NK_STRING */ - { 339, -1 }, /* (308) signed_literal ::= NK_BOOL */ - { 339, -2 }, /* (309) signed_literal ::= TIMESTAMP NK_STRING */ - { 339, -1 }, /* (310) signed_literal ::= duration_literal */ - { 339, -1 }, /* (311) signed_literal ::= NULL */ - { 339, -1 }, /* (312) signed_literal ::= literal_func */ - { 339, -1 }, /* (313) signed_literal ::= NK_QUESTION */ - { 376, -1 }, /* (314) literal_list ::= signed_literal */ - { 376, -3 }, /* (315) literal_list ::= literal_list NK_COMMA signed_literal */ - { 317, -1 }, /* (316) db_name ::= NK_ID */ - { 345, -1 }, /* (317) table_name ::= NK_ID */ - { 337, -1 }, /* (318) column_name ::= NK_ID */ - { 352, -1 }, /* (319) function_name ::= NK_ID */ - { 377, -1 }, /* (320) table_alias ::= NK_ID */ - { 378, -1 }, /* (321) column_alias ::= NK_ID */ - { 311, -1 }, /* (322) user_name ::= NK_ID */ - { 364, -1 }, /* (323) topic_name ::= NK_ID */ - { 371, -1 }, /* (324) stream_name ::= NK_ID */ - { 366, -1 }, /* (325) cgroup_name ::= NK_ID */ - { 379, -1 }, /* (326) expression ::= literal */ - { 379, -1 }, /* (327) expression ::= pseudo_column */ - { 379, -1 }, /* (328) expression ::= column_reference */ - { 379, -1 }, /* (329) expression ::= function_expression */ - { 379, -1 }, /* (330) expression ::= subquery */ - { 379, -3 }, /* (331) expression ::= NK_LP expression NK_RP */ - { 379, -2 }, /* (332) expression ::= NK_PLUS expression */ - { 379, -2 }, /* (333) expression ::= NK_MINUS expression */ - { 379, -3 }, /* (334) expression ::= expression NK_PLUS expression */ - { 379, -3 }, /* (335) expression ::= expression NK_MINUS expression */ - { 379, -3 }, /* (336) expression ::= expression NK_STAR expression */ - { 379, -3 }, /* (337) expression ::= expression NK_SLASH expression */ - { 379, -3 }, /* (338) expression ::= expression NK_REM expression */ - { 379, -3 }, /* (339) expression ::= column_reference NK_ARROW NK_STRING */ - { 379, -3 }, /* (340) expression ::= expression NK_BITAND expression */ - { 379, -3 }, /* (341) expression ::= expression NK_BITOR expression */ - { 342, -1 }, /* (342) expression_list ::= expression */ - { 342, -3 }, /* (343) expression_list ::= expression_list NK_COMMA expression */ - { 381, -1 }, /* (344) column_reference ::= column_name */ - { 381, -3 }, /* (345) column_reference ::= table_name NK_DOT column_name */ - { 380, -1 }, /* (346) pseudo_column ::= ROWTS */ - { 380, -1 }, /* (347) pseudo_column ::= TBNAME */ - { 380, -3 }, /* (348) pseudo_column ::= table_name NK_DOT TBNAME */ - { 380, -1 }, /* (349) pseudo_column ::= QSTART */ - { 380, -1 }, /* (350) pseudo_column ::= QEND */ - { 380, -1 }, /* (351) pseudo_column ::= QDURATION */ - { 380, -1 }, /* (352) pseudo_column ::= WSTART */ - { 380, -1 }, /* (353) pseudo_column ::= WEND */ - { 380, -1 }, /* (354) pseudo_column ::= WDURATION */ - { 382, -4 }, /* (355) function_expression ::= function_name NK_LP expression_list NK_RP */ - { 382, -4 }, /* (356) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ - { 382, -6 }, /* (357) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ - { 382, -1 }, /* (358) function_expression ::= literal_func */ - { 375, -3 }, /* (359) literal_func ::= noarg_func NK_LP NK_RP */ - { 375, -1 }, /* (360) literal_func ::= NOW */ - { 386, -1 }, /* (361) noarg_func ::= NOW */ - { 386, -1 }, /* (362) noarg_func ::= TODAY */ - { 386, -1 }, /* (363) noarg_func ::= TIMEZONE */ - { 386, -1 }, /* (364) noarg_func ::= DATABASE */ - { 386, -1 }, /* (365) noarg_func ::= CLIENT_VERSION */ - { 386, -1 }, /* (366) noarg_func ::= SERVER_VERSION */ - { 386, -1 }, /* (367) noarg_func ::= SERVER_STATUS */ - { 386, -1 }, /* (368) noarg_func ::= CURRENT_USER */ - { 386, -1 }, /* (369) noarg_func ::= USER */ - { 384, -1 }, /* (370) star_func ::= COUNT */ - { 384, -1 }, /* (371) star_func ::= FIRST */ - { 384, -1 }, /* (372) star_func ::= LAST */ - { 384, -1 }, /* (373) star_func ::= LAST_ROW */ - { 385, -1 }, /* (374) star_func_para_list ::= NK_STAR */ - { 385, -1 }, /* (375) star_func_para_list ::= other_para_list */ - { 387, -1 }, /* (376) other_para_list ::= star_func_para */ - { 387, -3 }, /* (377) other_para_list ::= other_para_list NK_COMMA star_func_para */ - { 388, -1 }, /* (378) star_func_para ::= expression */ - { 388, -3 }, /* (379) star_func_para ::= table_name NK_DOT NK_STAR */ - { 389, -3 }, /* (380) predicate ::= expression compare_op expression */ - { 389, -5 }, /* (381) predicate ::= expression BETWEEN expression AND expression */ - { 389, -6 }, /* (382) predicate ::= expression NOT BETWEEN expression AND expression */ - { 389, -3 }, /* (383) predicate ::= expression IS NULL */ - { 389, -4 }, /* (384) predicate ::= expression IS NOT NULL */ - { 389, -3 }, /* (385) predicate ::= expression in_op in_predicate_value */ - { 390, -1 }, /* (386) compare_op ::= NK_LT */ - { 390, -1 }, /* (387) compare_op ::= NK_GT */ - { 390, -1 }, /* (388) compare_op ::= NK_LE */ - { 390, -1 }, /* (389) compare_op ::= NK_GE */ - { 390, -1 }, /* (390) compare_op ::= NK_NE */ - { 390, -1 }, /* (391) compare_op ::= NK_EQ */ - { 390, -1 }, /* (392) compare_op ::= LIKE */ - { 390, -2 }, /* (393) compare_op ::= NOT LIKE */ - { 390, -1 }, /* (394) compare_op ::= MATCH */ - { 390, -1 }, /* (395) compare_op ::= NMATCH */ - { 390, -1 }, /* (396) compare_op ::= CONTAINS */ - { 391, -1 }, /* (397) in_op ::= IN */ - { 391, -2 }, /* (398) in_op ::= NOT IN */ - { 392, -3 }, /* (399) in_predicate_value ::= NK_LP literal_list NK_RP */ - { 393, -1 }, /* (400) boolean_value_expression ::= boolean_primary */ - { 393, -2 }, /* (401) boolean_value_expression ::= NOT boolean_primary */ - { 393, -3 }, /* (402) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 393, -3 }, /* (403) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 394, -1 }, /* (404) boolean_primary ::= predicate */ - { 394, -3 }, /* (405) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 395, -1 }, /* (406) common_expression ::= expression */ - { 395, -1 }, /* (407) common_expression ::= boolean_value_expression */ - { 396, 0 }, /* (408) from_clause_opt ::= */ - { 396, -2 }, /* (409) from_clause_opt ::= FROM table_reference_list */ - { 397, -1 }, /* (410) table_reference_list ::= table_reference */ - { 397, -3 }, /* (411) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 398, -1 }, /* (412) table_reference ::= table_primary */ - { 398, -1 }, /* (413) table_reference ::= joined_table */ - { 399, -2 }, /* (414) table_primary ::= table_name alias_opt */ - { 399, -4 }, /* (415) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 399, -2 }, /* (416) table_primary ::= subquery alias_opt */ - { 399, -1 }, /* (417) table_primary ::= parenthesized_joined_table */ - { 401, 0 }, /* (418) alias_opt ::= */ - { 401, -1 }, /* (419) alias_opt ::= table_alias */ - { 401, -2 }, /* (420) alias_opt ::= AS table_alias */ - { 402, -3 }, /* (421) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 402, -3 }, /* (422) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 400, -6 }, /* (423) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 403, 0 }, /* (424) join_type ::= */ - { 403, -1 }, /* (425) join_type ::= INNER */ - { 405, -12 }, /* (426) 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 */ - { 406, 0 }, /* (427) set_quantifier_opt ::= */ - { 406, -1 }, /* (428) set_quantifier_opt ::= DISTINCT */ - { 406, -1 }, /* (429) set_quantifier_opt ::= ALL */ - { 407, -1 }, /* (430) select_list ::= select_item */ - { 407, -3 }, /* (431) select_list ::= select_list NK_COMMA select_item */ - { 415, -1 }, /* (432) select_item ::= NK_STAR */ - { 415, -1 }, /* (433) select_item ::= common_expression */ - { 415, -2 }, /* (434) select_item ::= common_expression column_alias */ - { 415, -3 }, /* (435) select_item ::= common_expression AS column_alias */ - { 415, -3 }, /* (436) select_item ::= table_name NK_DOT NK_STAR */ - { 373, 0 }, /* (437) where_clause_opt ::= */ - { 373, -2 }, /* (438) where_clause_opt ::= WHERE search_condition */ - { 408, 0 }, /* (439) partition_by_clause_opt ::= */ - { 408, -3 }, /* (440) partition_by_clause_opt ::= PARTITION BY expression_list */ - { 412, 0 }, /* (441) twindow_clause_opt ::= */ - { 412, -6 }, /* (442) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ - { 412, -4 }, /* (443) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ - { 412, -6 }, /* (444) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 412, -8 }, /* (445) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 360, 0 }, /* (446) sliding_opt ::= */ - { 360, -4 }, /* (447) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 411, 0 }, /* (448) fill_opt ::= */ - { 411, -4 }, /* (449) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 411, -6 }, /* (450) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 416, -1 }, /* (451) fill_mode ::= NONE */ - { 416, -1 }, /* (452) fill_mode ::= PREV */ - { 416, -1 }, /* (453) fill_mode ::= NULL */ - { 416, -1 }, /* (454) fill_mode ::= LINEAR */ - { 416, -1 }, /* (455) fill_mode ::= NEXT */ - { 413, 0 }, /* (456) group_by_clause_opt ::= */ - { 413, -3 }, /* (457) group_by_clause_opt ::= GROUP BY group_by_list */ - { 417, -1 }, /* (458) group_by_list ::= expression */ - { 417, -3 }, /* (459) group_by_list ::= group_by_list NK_COMMA expression */ - { 414, 0 }, /* (460) having_clause_opt ::= */ - { 414, -2 }, /* (461) having_clause_opt ::= HAVING search_condition */ - { 409, 0 }, /* (462) range_opt ::= */ - { 409, -6 }, /* (463) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ - { 410, 0 }, /* (464) every_opt ::= */ - { 410, -4 }, /* (465) every_opt ::= EVERY NK_LP duration_literal NK_RP */ - { 365, -4 }, /* (466) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 418, -1 }, /* (467) query_expression_body ::= query_primary */ - { 418, -4 }, /* (468) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 418, -3 }, /* (469) query_expression_body ::= query_expression_body UNION query_expression_body */ - { 422, -1 }, /* (470) query_primary ::= query_specification */ - { 422, -6 }, /* (471) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ - { 419, 0 }, /* (472) order_by_clause_opt ::= */ - { 419, -3 }, /* (473) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 420, 0 }, /* (474) slimit_clause_opt ::= */ - { 420, -2 }, /* (475) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 420, -4 }, /* (476) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 420, -4 }, /* (477) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 421, 0 }, /* (478) limit_clause_opt ::= */ - { 421, -2 }, /* (479) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 421, -4 }, /* (480) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 421, -4 }, /* (481) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 383, -3 }, /* (482) subquery ::= NK_LP query_expression NK_RP */ - { 404, -1 }, /* (483) search_condition ::= common_expression */ - { 423, -1 }, /* (484) sort_specification_list ::= sort_specification */ - { 423, -3 }, /* (485) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 424, -3 }, /* (486) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ - { 425, 0 }, /* (487) ordering_specification_opt ::= */ - { 425, -1 }, /* (488) ordering_specification_opt ::= ASC */ - { 425, -1 }, /* (489) ordering_specification_opt ::= DESC */ - { 426, 0 }, /* (490) null_ordering_opt ::= */ - { 426, -2 }, /* (491) null_ordering_opt ::= NULLS FIRST */ - { 426, -2 }, /* (492) null_ordering_opt ::= NULLS LAST */ + { 308, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ + { 308, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ + { 309, 0 }, /* (2) account_options ::= */ + { 309, -3 }, /* (3) account_options ::= account_options PPS literal */ + { 309, -3 }, /* (4) account_options ::= account_options TSERIES literal */ + { 309, -3 }, /* (5) account_options ::= account_options STORAGE literal */ + { 309, -3 }, /* (6) account_options ::= account_options STREAMS literal */ + { 309, -3 }, /* (7) account_options ::= account_options QTIME literal */ + { 309, -3 }, /* (8) account_options ::= account_options DBS literal */ + { 309, -3 }, /* (9) account_options ::= account_options USERS literal */ + { 309, -3 }, /* (10) account_options ::= account_options CONNS literal */ + { 309, -3 }, /* (11) account_options ::= account_options STATE literal */ + { 310, -1 }, /* (12) alter_account_options ::= alter_account_option */ + { 310, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ + { 312, -2 }, /* (14) alter_account_option ::= PASS literal */ + { 312, -2 }, /* (15) alter_account_option ::= PPS literal */ + { 312, -2 }, /* (16) alter_account_option ::= TSERIES literal */ + { 312, -2 }, /* (17) alter_account_option ::= STORAGE literal */ + { 312, -2 }, /* (18) alter_account_option ::= STREAMS literal */ + { 312, -2 }, /* (19) alter_account_option ::= QTIME literal */ + { 312, -2 }, /* (20) alter_account_option ::= DBS literal */ + { 312, -2 }, /* (21) alter_account_option ::= USERS literal */ + { 312, -2 }, /* (22) alter_account_option ::= CONNS literal */ + { 312, -2 }, /* (23) alter_account_option ::= STATE literal */ + { 308, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ + { 308, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ + { 308, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ + { 308, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ + { 308, -3 }, /* (28) cmd ::= DROP USER user_name */ + { 314, 0 }, /* (29) sysinfo_opt ::= */ + { 314, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ + { 308, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ + { 308, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ + { 315, -1 }, /* (33) privileges ::= ALL */ + { 315, -1 }, /* (34) privileges ::= priv_type_list */ + { 317, -1 }, /* (35) priv_type_list ::= priv_type */ + { 317, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ + { 318, -1 }, /* (37) priv_type ::= READ */ + { 318, -1 }, /* (38) priv_type ::= WRITE */ + { 316, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ + { 316, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ + { 308, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ + { 308, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ + { 308, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ + { 308, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ + { 308, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ + { 308, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ + { 308, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ + { 308, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ + { 320, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ + { 320, -1 }, /* (50) dnode_endpoint ::= NK_ID */ + { 320, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ + { 308, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ + { 308, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ + { 308, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ + { 308, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ + { 308, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ + { 308, -2 }, /* (64) cmd ::= USE db_name */ + { 308, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ + { 308, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ + { 308, -3 }, /* (67) cmd ::= TRIM DATABASE db_name */ + { 321, -3 }, /* (68) not_exists_opt ::= IF NOT EXISTS */ + { 321, 0 }, /* (69) not_exists_opt ::= */ + { 323, -2 }, /* (70) exists_opt ::= IF EXISTS */ + { 323, 0 }, /* (71) exists_opt ::= */ + { 322, 0 }, /* (72) db_options ::= */ + { 322, -3 }, /* (73) db_options ::= db_options BUFFER NK_INTEGER */ + { 322, -3 }, /* (74) db_options ::= db_options CACHEMODEL NK_STRING */ + { 322, -3 }, /* (75) db_options ::= db_options CACHESIZE NK_INTEGER */ + { 322, -3 }, /* (76) db_options ::= db_options COMP NK_INTEGER */ + { 322, -3 }, /* (77) db_options ::= db_options DURATION NK_INTEGER */ + { 322, -3 }, /* (78) db_options ::= db_options DURATION NK_VARIABLE */ + { 322, -3 }, /* (79) db_options ::= db_options MAXROWS NK_INTEGER */ + { 322, -3 }, /* (80) db_options ::= db_options MINROWS NK_INTEGER */ + { 322, -3 }, /* (81) db_options ::= db_options KEEP integer_list */ + { 322, -3 }, /* (82) db_options ::= db_options KEEP variable_list */ + { 322, -3 }, /* (83) db_options ::= db_options PAGES NK_INTEGER */ + { 322, -3 }, /* (84) db_options ::= db_options PAGESIZE NK_INTEGER */ + { 322, -3 }, /* (85) db_options ::= db_options PRECISION NK_STRING */ + { 322, -3 }, /* (86) db_options ::= db_options REPLICA NK_INTEGER */ + { 322, -3 }, /* (87) db_options ::= db_options STRICT NK_STRING */ + { 322, -3 }, /* (88) db_options ::= db_options VGROUPS NK_INTEGER */ + { 322, -3 }, /* (89) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ + { 322, -3 }, /* (90) db_options ::= db_options RETENTIONS retention_list */ + { 322, -3 }, /* (91) db_options ::= db_options SCHEMALESS NK_INTEGER */ + { 322, -3 }, /* (92) db_options ::= db_options WAL_LEVEL NK_INTEGER */ + { 322, -3 }, /* (93) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ + { 322, -3 }, /* (94) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ + { 322, -4 }, /* (95) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ + { 322, -3 }, /* (96) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ + { 322, -4 }, /* (97) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ + { 322, -3 }, /* (98) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ + { 322, -3 }, /* (99) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ + { 322, -3 }, /* (100) db_options ::= db_options SST_TRIGGER NK_INTEGER */ + { 322, -3 }, /* (101) db_options ::= db_options TABLE_PREFIX NK_INTEGER */ + { 322, -3 }, /* (102) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ + { 324, -1 }, /* (103) alter_db_options ::= alter_db_option */ + { 324, -2 }, /* (104) alter_db_options ::= alter_db_options alter_db_option */ + { 328, -2 }, /* (105) alter_db_option ::= CACHEMODEL NK_STRING */ + { 328, -2 }, /* (106) alter_db_option ::= CACHESIZE NK_INTEGER */ + { 328, -2 }, /* (107) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ + { 328, -2 }, /* (108) alter_db_option ::= KEEP integer_list */ + { 328, -2 }, /* (109) alter_db_option ::= KEEP variable_list */ + { 328, -2 }, /* (110) alter_db_option ::= WAL_LEVEL NK_INTEGER */ + { 328, -2 }, /* (111) alter_db_option ::= SST_TRIGGER NK_INTEGER */ + { 325, -1 }, /* (112) integer_list ::= NK_INTEGER */ + { 325, -3 }, /* (113) integer_list ::= integer_list NK_COMMA NK_INTEGER */ + { 326, -1 }, /* (114) variable_list ::= NK_VARIABLE */ + { 326, -3 }, /* (115) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ + { 327, -1 }, /* (116) retention_list ::= retention */ + { 327, -3 }, /* (117) retention_list ::= retention_list NK_COMMA retention */ + { 329, -3 }, /* (118) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ + { 308, -9 }, /* (119) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + { 308, -3 }, /* (120) cmd ::= CREATE TABLE multi_create_clause */ + { 308, -9 }, /* (121) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ + { 308, -3 }, /* (122) cmd ::= DROP TABLE multi_drop_clause */ + { 308, -4 }, /* (123) cmd ::= DROP STABLE exists_opt full_table_name */ + { 308, -3 }, /* (124) cmd ::= ALTER TABLE alter_table_clause */ + { 308, -3 }, /* (125) cmd ::= ALTER STABLE alter_table_clause */ + { 337, -2 }, /* (126) alter_table_clause ::= full_table_name alter_table_options */ + { 337, -5 }, /* (127) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + { 337, -4 }, /* (128) alter_table_clause ::= full_table_name DROP COLUMN column_name */ + { 337, -5 }, /* (129) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + { 337, -5 }, /* (130) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + { 337, -5 }, /* (131) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + { 337, -4 }, /* (132) alter_table_clause ::= full_table_name DROP TAG column_name */ + { 337, -5 }, /* (133) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + { 337, -5 }, /* (134) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + { 337, -6 }, /* (135) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ + { 334, -1 }, /* (136) multi_create_clause ::= create_subtable_clause */ + { 334, -2 }, /* (137) multi_create_clause ::= multi_create_clause create_subtable_clause */ + { 342, -10 }, /* (138) 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 */ + { 336, -1 }, /* (139) multi_drop_clause ::= drop_table_clause */ + { 336, -2 }, /* (140) multi_drop_clause ::= multi_drop_clause drop_table_clause */ + { 345, -2 }, /* (141) drop_table_clause ::= exists_opt full_table_name */ + { 343, 0 }, /* (142) specific_cols_opt ::= */ + { 343, -3 }, /* (143) specific_cols_opt ::= NK_LP col_name_list NK_RP */ + { 330, -1 }, /* (144) full_table_name ::= table_name */ + { 330, -3 }, /* (145) full_table_name ::= db_name NK_DOT table_name */ + { 331, -1 }, /* (146) column_def_list ::= column_def */ + { 331, -3 }, /* (147) column_def_list ::= column_def_list NK_COMMA column_def */ + { 348, -2 }, /* (148) column_def ::= column_name type_name */ + { 348, -4 }, /* (149) column_def ::= column_name type_name COMMENT NK_STRING */ + { 340, -1 }, /* (150) type_name ::= BOOL */ + { 340, -1 }, /* (151) type_name ::= TINYINT */ + { 340, -1 }, /* (152) type_name ::= SMALLINT */ + { 340, -1 }, /* (153) type_name ::= INT */ + { 340, -1 }, /* (154) type_name ::= INTEGER */ + { 340, -1 }, /* (155) type_name ::= BIGINT */ + { 340, -1 }, /* (156) type_name ::= FLOAT */ + { 340, -1 }, /* (157) type_name ::= DOUBLE */ + { 340, -4 }, /* (158) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 340, -1 }, /* (159) type_name ::= TIMESTAMP */ + { 340, -4 }, /* (160) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 340, -2 }, /* (161) type_name ::= TINYINT UNSIGNED */ + { 340, -2 }, /* (162) type_name ::= SMALLINT UNSIGNED */ + { 340, -2 }, /* (163) type_name ::= INT UNSIGNED */ + { 340, -2 }, /* (164) type_name ::= BIGINT UNSIGNED */ + { 340, -1 }, /* (165) type_name ::= JSON */ + { 340, -4 }, /* (166) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 340, -1 }, /* (167) type_name ::= MEDIUMBLOB */ + { 340, -1 }, /* (168) type_name ::= BLOB */ + { 340, -4 }, /* (169) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 340, -1 }, /* (170) type_name ::= DECIMAL */ + { 340, -4 }, /* (171) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 340, -6 }, /* (172) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 332, 0 }, /* (173) tags_def_opt ::= */ + { 332, -1 }, /* (174) tags_def_opt ::= tags_def */ + { 335, -4 }, /* (175) tags_def ::= TAGS NK_LP column_def_list NK_RP */ + { 333, 0 }, /* (176) table_options ::= */ + { 333, -3 }, /* (177) table_options ::= table_options COMMENT NK_STRING */ + { 333, -3 }, /* (178) table_options ::= table_options MAX_DELAY duration_list */ + { 333, -3 }, /* (179) table_options ::= table_options WATERMARK duration_list */ + { 333, -5 }, /* (180) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ + { 333, -3 }, /* (181) table_options ::= table_options TTL NK_INTEGER */ + { 333, -5 }, /* (182) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + { 338, -1 }, /* (183) alter_table_options ::= alter_table_option */ + { 338, -2 }, /* (184) alter_table_options ::= alter_table_options alter_table_option */ + { 351, -2 }, /* (185) alter_table_option ::= COMMENT NK_STRING */ + { 351, -2 }, /* (186) alter_table_option ::= TTL NK_INTEGER */ + { 349, -1 }, /* (187) duration_list ::= duration_literal */ + { 349, -3 }, /* (188) duration_list ::= duration_list NK_COMMA duration_literal */ + { 350, -1 }, /* (189) rollup_func_list ::= rollup_func_name */ + { 350, -3 }, /* (190) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ + { 353, -1 }, /* (191) rollup_func_name ::= function_name */ + { 353, -1 }, /* (192) rollup_func_name ::= FIRST */ + { 353, -1 }, /* (193) rollup_func_name ::= LAST */ + { 346, -1 }, /* (194) col_name_list ::= col_name */ + { 346, -3 }, /* (195) col_name_list ::= col_name_list NK_COMMA col_name */ + { 355, -1 }, /* (196) col_name ::= column_name */ + { 308, -2 }, /* (197) cmd ::= SHOW DNODES */ + { 308, -2 }, /* (198) cmd ::= SHOW USERS */ + { 308, -2 }, /* (199) cmd ::= SHOW DATABASES */ + { 308, -4 }, /* (200) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ + { 308, -4 }, /* (201) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ + { 308, -3 }, /* (202) cmd ::= SHOW db_name_cond_opt VGROUPS */ + { 308, -2 }, /* (203) cmd ::= SHOW MNODES */ + { 308, -2 }, /* (204) cmd ::= SHOW MODULES */ + { 308, -2 }, /* (205) cmd ::= SHOW QNODES */ + { 308, -2 }, /* (206) cmd ::= SHOW FUNCTIONS */ + { 308, -5 }, /* (207) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ + { 308, -2 }, /* (208) cmd ::= SHOW STREAMS */ + { 308, -2 }, /* (209) cmd ::= SHOW ACCOUNTS */ + { 308, -2 }, /* (210) cmd ::= SHOW APPS */ + { 308, -2 }, /* (211) cmd ::= SHOW CONNECTIONS */ + { 308, -2 }, /* (212) cmd ::= SHOW LICENCES */ + { 308, -2 }, /* (213) cmd ::= SHOW GRANTS */ + { 308, -4 }, /* (214) cmd ::= SHOW CREATE DATABASE db_name */ + { 308, -4 }, /* (215) cmd ::= SHOW CREATE TABLE full_table_name */ + { 308, -4 }, /* (216) cmd ::= SHOW CREATE STABLE full_table_name */ + { 308, -2 }, /* (217) cmd ::= SHOW QUERIES */ + { 308, -2 }, /* (218) cmd ::= SHOW SCORES */ + { 308, -2 }, /* (219) cmd ::= SHOW TOPICS */ + { 308, -2 }, /* (220) cmd ::= SHOW VARIABLES */ + { 308, -3 }, /* (221) cmd ::= SHOW LOCAL VARIABLES */ + { 308, -4 }, /* (222) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + { 308, -2 }, /* (223) cmd ::= SHOW BNODES */ + { 308, -2 }, /* (224) cmd ::= SHOW SNODES */ + { 308, -2 }, /* (225) cmd ::= SHOW CLUSTER */ + { 308, -2 }, /* (226) cmd ::= SHOW TRANSACTIONS */ + { 308, -4 }, /* (227) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ + { 308, -2 }, /* (228) cmd ::= SHOW CONSUMERS */ + { 308, -2 }, /* (229) cmd ::= SHOW SUBSCRIPTIONS */ + { 308, -5 }, /* (230) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ + { 308, -3 }, /* (231) cmd ::= SHOW VNODES NK_INTEGER */ + { 308, -3 }, /* (232) cmd ::= SHOW VNODES NK_STRING */ + { 356, 0 }, /* (233) db_name_cond_opt ::= */ + { 356, -2 }, /* (234) db_name_cond_opt ::= db_name NK_DOT */ + { 357, 0 }, /* (235) like_pattern_opt ::= */ + { 357, -2 }, /* (236) like_pattern_opt ::= LIKE NK_STRING */ + { 358, -1 }, /* (237) table_name_cond ::= table_name */ + { 359, 0 }, /* (238) from_db_opt ::= */ + { 359, -2 }, /* (239) from_db_opt ::= FROM db_name */ + { 308, -8 }, /* (240) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ + { 308, -4 }, /* (241) cmd ::= DROP INDEX exists_opt full_table_name */ + { 360, -10 }, /* (242) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ + { 360, -12 }, /* (243) 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 */ + { 361, -1 }, /* (244) func_list ::= func */ + { 361, -3 }, /* (245) func_list ::= func_list NK_COMMA func */ + { 364, -4 }, /* (246) func ::= function_name NK_LP expression_list NK_RP */ + { 363, 0 }, /* (247) sma_stream_opt ::= */ + { 363, -3 }, /* (248) sma_stream_opt ::= stream_options WATERMARK duration_literal */ + { 363, -3 }, /* (249) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ + { 308, -6 }, /* (250) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ + { 308, -7 }, /* (251) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ + { 308, -9 }, /* (252) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ + { 308, -7 }, /* (253) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ + { 308, -9 }, /* (254) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + { 308, -4 }, /* (255) cmd ::= DROP TOPIC exists_opt topic_name */ + { 308, -7 }, /* (256) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ + { 308, -2 }, /* (257) cmd ::= DESC full_table_name */ + { 308, -2 }, /* (258) cmd ::= DESCRIBE full_table_name */ + { 308, -3 }, /* (259) cmd ::= RESET QUERY CACHE */ + { 308, -4 }, /* (260) cmd ::= EXPLAIN analyze_opt explain_options query_expression */ + { 369, 0 }, /* (261) analyze_opt ::= */ + { 369, -1 }, /* (262) analyze_opt ::= ANALYZE */ + { 370, 0 }, /* (263) explain_options ::= */ + { 370, -3 }, /* (264) explain_options ::= explain_options VERBOSE NK_BOOL */ + { 370, -3 }, /* (265) explain_options ::= explain_options RATIO NK_FLOAT */ + { 308, -10 }, /* (266) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ + { 308, -4 }, /* (267) cmd ::= DROP FUNCTION exists_opt function_name */ + { 371, 0 }, /* (268) agg_func_opt ::= */ + { 371, -1 }, /* (269) agg_func_opt ::= AGGREGATE */ + { 372, 0 }, /* (270) bufsize_opt ::= */ + { 372, -2 }, /* (271) bufsize_opt ::= BUFSIZE NK_INTEGER */ + { 308, -9 }, /* (272) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression */ + { 308, -4 }, /* (273) cmd ::= DROP STREAM exists_opt stream_name */ + { 365, 0 }, /* (274) stream_options ::= */ + { 365, -3 }, /* (275) stream_options ::= stream_options TRIGGER AT_ONCE */ + { 365, -3 }, /* (276) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + { 365, -4 }, /* (277) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + { 365, -3 }, /* (278) stream_options ::= stream_options WATERMARK duration_literal */ + { 365, -4 }, /* (279) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ + { 308, -3 }, /* (280) cmd ::= KILL CONNECTION NK_INTEGER */ + { 308, -3 }, /* (281) cmd ::= KILL QUERY NK_STRING */ + { 308, -3 }, /* (282) cmd ::= KILL TRANSACTION NK_INTEGER */ + { 308, -2 }, /* (283) cmd ::= BALANCE VGROUP */ + { 308, -4 }, /* (284) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + { 308, -4 }, /* (285) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + { 308, -3 }, /* (286) cmd ::= SPLIT VGROUP NK_INTEGER */ + { 374, -2 }, /* (287) dnode_list ::= DNODE NK_INTEGER */ + { 374, -3 }, /* (288) dnode_list ::= dnode_list DNODE NK_INTEGER */ + { 308, -4 }, /* (289) cmd ::= DELETE FROM full_table_name where_clause_opt */ + { 308, -1 }, /* (290) cmd ::= query_expression */ + { 308, -7 }, /* (291) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ + { 308, -4 }, /* (292) cmd ::= INSERT INTO full_table_name query_expression */ + { 311, -1 }, /* (293) literal ::= NK_INTEGER */ + { 311, -1 }, /* (294) literal ::= NK_FLOAT */ + { 311, -1 }, /* (295) literal ::= NK_STRING */ + { 311, -1 }, /* (296) literal ::= NK_BOOL */ + { 311, -2 }, /* (297) literal ::= TIMESTAMP NK_STRING */ + { 311, -1 }, /* (298) literal ::= duration_literal */ + { 311, -1 }, /* (299) literal ::= NULL */ + { 311, -1 }, /* (300) literal ::= NK_QUESTION */ + { 352, -1 }, /* (301) duration_literal ::= NK_VARIABLE */ + { 376, -1 }, /* (302) signed ::= NK_INTEGER */ + { 376, -2 }, /* (303) signed ::= NK_PLUS NK_INTEGER */ + { 376, -2 }, /* (304) signed ::= NK_MINUS NK_INTEGER */ + { 376, -1 }, /* (305) signed ::= NK_FLOAT */ + { 376, -2 }, /* (306) signed ::= NK_PLUS NK_FLOAT */ + { 376, -2 }, /* (307) signed ::= NK_MINUS NK_FLOAT */ + { 341, -1 }, /* (308) signed_literal ::= signed */ + { 341, -1 }, /* (309) signed_literal ::= NK_STRING */ + { 341, -1 }, /* (310) signed_literal ::= NK_BOOL */ + { 341, -2 }, /* (311) signed_literal ::= TIMESTAMP NK_STRING */ + { 341, -1 }, /* (312) signed_literal ::= duration_literal */ + { 341, -1 }, /* (313) signed_literal ::= NULL */ + { 341, -1 }, /* (314) signed_literal ::= literal_func */ + { 341, -1 }, /* (315) signed_literal ::= NK_QUESTION */ + { 378, -1 }, /* (316) literal_list ::= signed_literal */ + { 378, -3 }, /* (317) literal_list ::= literal_list NK_COMMA signed_literal */ + { 319, -1 }, /* (318) db_name ::= NK_ID */ + { 347, -1 }, /* (319) table_name ::= NK_ID */ + { 339, -1 }, /* (320) column_name ::= NK_ID */ + { 354, -1 }, /* (321) function_name ::= NK_ID */ + { 379, -1 }, /* (322) table_alias ::= NK_ID */ + { 380, -1 }, /* (323) column_alias ::= NK_ID */ + { 313, -1 }, /* (324) user_name ::= NK_ID */ + { 366, -1 }, /* (325) topic_name ::= NK_ID */ + { 373, -1 }, /* (326) stream_name ::= NK_ID */ + { 368, -1 }, /* (327) cgroup_name ::= NK_ID */ + { 381, -1 }, /* (328) expression ::= literal */ + { 381, -1 }, /* (329) expression ::= pseudo_column */ + { 381, -1 }, /* (330) expression ::= column_reference */ + { 381, -1 }, /* (331) expression ::= function_expression */ + { 381, -1 }, /* (332) expression ::= subquery */ + { 381, -3 }, /* (333) expression ::= NK_LP expression NK_RP */ + { 381, -2 }, /* (334) expression ::= NK_PLUS expression */ + { 381, -2 }, /* (335) expression ::= NK_MINUS expression */ + { 381, -3 }, /* (336) expression ::= expression NK_PLUS expression */ + { 381, -3 }, /* (337) expression ::= expression NK_MINUS expression */ + { 381, -3 }, /* (338) expression ::= expression NK_STAR expression */ + { 381, -3 }, /* (339) expression ::= expression NK_SLASH expression */ + { 381, -3 }, /* (340) expression ::= expression NK_REM expression */ + { 381, -3 }, /* (341) expression ::= column_reference NK_ARROW NK_STRING */ + { 381, -3 }, /* (342) expression ::= expression NK_BITAND expression */ + { 381, -3 }, /* (343) expression ::= expression NK_BITOR expression */ + { 344, -1 }, /* (344) expression_list ::= expression */ + { 344, -3 }, /* (345) expression_list ::= expression_list NK_COMMA expression */ + { 383, -1 }, /* (346) column_reference ::= column_name */ + { 383, -3 }, /* (347) column_reference ::= table_name NK_DOT column_name */ + { 382, -1 }, /* (348) pseudo_column ::= ROWTS */ + { 382, -1 }, /* (349) pseudo_column ::= TBNAME */ + { 382, -3 }, /* (350) pseudo_column ::= table_name NK_DOT TBNAME */ + { 382, -1 }, /* (351) pseudo_column ::= QSTART */ + { 382, -1 }, /* (352) pseudo_column ::= QEND */ + { 382, -1 }, /* (353) pseudo_column ::= QDURATION */ + { 382, -1 }, /* (354) pseudo_column ::= WSTART */ + { 382, -1 }, /* (355) pseudo_column ::= WEND */ + { 382, -1 }, /* (356) pseudo_column ::= WDURATION */ + { 384, -4 }, /* (357) function_expression ::= function_name NK_LP expression_list NK_RP */ + { 384, -4 }, /* (358) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ + { 384, -6 }, /* (359) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ + { 384, -1 }, /* (360) function_expression ::= literal_func */ + { 377, -3 }, /* (361) literal_func ::= noarg_func NK_LP NK_RP */ + { 377, -1 }, /* (362) literal_func ::= NOW */ + { 388, -1 }, /* (363) noarg_func ::= NOW */ + { 388, -1 }, /* (364) noarg_func ::= TODAY */ + { 388, -1 }, /* (365) noarg_func ::= TIMEZONE */ + { 388, -1 }, /* (366) noarg_func ::= DATABASE */ + { 388, -1 }, /* (367) noarg_func ::= CLIENT_VERSION */ + { 388, -1 }, /* (368) noarg_func ::= SERVER_VERSION */ + { 388, -1 }, /* (369) noarg_func ::= SERVER_STATUS */ + { 388, -1 }, /* (370) noarg_func ::= CURRENT_USER */ + { 388, -1 }, /* (371) noarg_func ::= USER */ + { 386, -1 }, /* (372) star_func ::= COUNT */ + { 386, -1 }, /* (373) star_func ::= FIRST */ + { 386, -1 }, /* (374) star_func ::= LAST */ + { 386, -1 }, /* (375) star_func ::= LAST_ROW */ + { 387, -1 }, /* (376) star_func_para_list ::= NK_STAR */ + { 387, -1 }, /* (377) star_func_para_list ::= other_para_list */ + { 389, -1 }, /* (378) other_para_list ::= star_func_para */ + { 389, -3 }, /* (379) other_para_list ::= other_para_list NK_COMMA star_func_para */ + { 390, -1 }, /* (380) star_func_para ::= expression */ + { 390, -3 }, /* (381) star_func_para ::= table_name NK_DOT NK_STAR */ + { 391, -3 }, /* (382) predicate ::= expression compare_op expression */ + { 391, -5 }, /* (383) predicate ::= expression BETWEEN expression AND expression */ + { 391, -6 }, /* (384) predicate ::= expression NOT BETWEEN expression AND expression */ + { 391, -3 }, /* (385) predicate ::= expression IS NULL */ + { 391, -4 }, /* (386) predicate ::= expression IS NOT NULL */ + { 391, -3 }, /* (387) predicate ::= expression in_op in_predicate_value */ + { 392, -1 }, /* (388) compare_op ::= NK_LT */ + { 392, -1 }, /* (389) compare_op ::= NK_GT */ + { 392, -1 }, /* (390) compare_op ::= NK_LE */ + { 392, -1 }, /* (391) compare_op ::= NK_GE */ + { 392, -1 }, /* (392) compare_op ::= NK_NE */ + { 392, -1 }, /* (393) compare_op ::= NK_EQ */ + { 392, -1 }, /* (394) compare_op ::= LIKE */ + { 392, -2 }, /* (395) compare_op ::= NOT LIKE */ + { 392, -1 }, /* (396) compare_op ::= MATCH */ + { 392, -1 }, /* (397) compare_op ::= NMATCH */ + { 392, -1 }, /* (398) compare_op ::= CONTAINS */ + { 393, -1 }, /* (399) in_op ::= IN */ + { 393, -2 }, /* (400) in_op ::= NOT IN */ + { 394, -3 }, /* (401) in_predicate_value ::= NK_LP literal_list NK_RP */ + { 395, -1 }, /* (402) boolean_value_expression ::= boolean_primary */ + { 395, -2 }, /* (403) boolean_value_expression ::= NOT boolean_primary */ + { 395, -3 }, /* (404) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 395, -3 }, /* (405) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 396, -1 }, /* (406) boolean_primary ::= predicate */ + { 396, -3 }, /* (407) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 397, -1 }, /* (408) common_expression ::= expression */ + { 397, -1 }, /* (409) common_expression ::= boolean_value_expression */ + { 398, 0 }, /* (410) from_clause_opt ::= */ + { 398, -2 }, /* (411) from_clause_opt ::= FROM table_reference_list */ + { 399, -1 }, /* (412) table_reference_list ::= table_reference */ + { 399, -3 }, /* (413) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 400, -1 }, /* (414) table_reference ::= table_primary */ + { 400, -1 }, /* (415) table_reference ::= joined_table */ + { 401, -2 }, /* (416) table_primary ::= table_name alias_opt */ + { 401, -4 }, /* (417) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 401, -2 }, /* (418) table_primary ::= subquery alias_opt */ + { 401, -1 }, /* (419) table_primary ::= parenthesized_joined_table */ + { 403, 0 }, /* (420) alias_opt ::= */ + { 403, -1 }, /* (421) alias_opt ::= table_alias */ + { 403, -2 }, /* (422) alias_opt ::= AS table_alias */ + { 404, -3 }, /* (423) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 404, -3 }, /* (424) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 402, -6 }, /* (425) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 405, 0 }, /* (426) join_type ::= */ + { 405, -1 }, /* (427) join_type ::= INNER */ + { 407, -12 }, /* (428) 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 */ + { 408, 0 }, /* (429) set_quantifier_opt ::= */ + { 408, -1 }, /* (430) set_quantifier_opt ::= DISTINCT */ + { 408, -1 }, /* (431) set_quantifier_opt ::= ALL */ + { 409, -1 }, /* (432) select_list ::= select_item */ + { 409, -3 }, /* (433) select_list ::= select_list NK_COMMA select_item */ + { 417, -1 }, /* (434) select_item ::= NK_STAR */ + { 417, -1 }, /* (435) select_item ::= common_expression */ + { 417, -2 }, /* (436) select_item ::= common_expression column_alias */ + { 417, -3 }, /* (437) select_item ::= common_expression AS column_alias */ + { 417, -3 }, /* (438) select_item ::= table_name NK_DOT NK_STAR */ + { 375, 0 }, /* (439) where_clause_opt ::= */ + { 375, -2 }, /* (440) where_clause_opt ::= WHERE search_condition */ + { 410, 0 }, /* (441) partition_by_clause_opt ::= */ + { 410, -3 }, /* (442) partition_by_clause_opt ::= PARTITION BY expression_list */ + { 414, 0 }, /* (443) twindow_clause_opt ::= */ + { 414, -6 }, /* (444) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + { 414, -4 }, /* (445) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ + { 414, -6 }, /* (446) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 414, -8 }, /* (447) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 362, 0 }, /* (448) sliding_opt ::= */ + { 362, -4 }, /* (449) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 413, 0 }, /* (450) fill_opt ::= */ + { 413, -4 }, /* (451) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 413, -6 }, /* (452) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 418, -1 }, /* (453) fill_mode ::= NONE */ + { 418, -1 }, /* (454) fill_mode ::= PREV */ + { 418, -1 }, /* (455) fill_mode ::= NULL */ + { 418, -1 }, /* (456) fill_mode ::= LINEAR */ + { 418, -1 }, /* (457) fill_mode ::= NEXT */ + { 415, 0 }, /* (458) group_by_clause_opt ::= */ + { 415, -3 }, /* (459) group_by_clause_opt ::= GROUP BY group_by_list */ + { 419, -1 }, /* (460) group_by_list ::= expression */ + { 419, -3 }, /* (461) group_by_list ::= group_by_list NK_COMMA expression */ + { 416, 0 }, /* (462) having_clause_opt ::= */ + { 416, -2 }, /* (463) having_clause_opt ::= HAVING search_condition */ + { 411, 0 }, /* (464) range_opt ::= */ + { 411, -6 }, /* (465) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ + { 412, 0 }, /* (466) every_opt ::= */ + { 412, -4 }, /* (467) every_opt ::= EVERY NK_LP duration_literal NK_RP */ + { 367, -4 }, /* (468) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 420, -1 }, /* (469) query_expression_body ::= query_primary */ + { 420, -4 }, /* (470) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 420, -3 }, /* (471) query_expression_body ::= query_expression_body UNION query_expression_body */ + { 424, -1 }, /* (472) query_primary ::= query_specification */ + { 424, -6 }, /* (473) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ + { 421, 0 }, /* (474) order_by_clause_opt ::= */ + { 421, -3 }, /* (475) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 422, 0 }, /* (476) slimit_clause_opt ::= */ + { 422, -2 }, /* (477) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 422, -4 }, /* (478) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 422, -4 }, /* (479) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 423, 0 }, /* (480) limit_clause_opt ::= */ + { 423, -2 }, /* (481) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 423, -4 }, /* (482) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 423, -4 }, /* (483) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 385, -3 }, /* (484) subquery ::= NK_LP query_expression NK_RP */ + { 406, -1 }, /* (485) search_condition ::= common_expression */ + { 425, -1 }, /* (486) sort_specification_list ::= sort_specification */ + { 425, -3 }, /* (487) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 426, -3 }, /* (488) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ + { 427, 0 }, /* (489) ordering_specification_opt ::= */ + { 427, -1 }, /* (490) ordering_specification_opt ::= ASC */ + { 427, -1 }, /* (491) ordering_specification_opt ::= DESC */ + { 428, 0 }, /* (492) null_ordering_opt ::= */ + { 428, -2 }, /* (493) null_ordering_opt ::= NULLS FIRST */ + { 428, -2 }, /* (494) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -3419,11 +3415,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,307,&yymsp[0].minor); + yy_destructor(yypParser,309,&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,308,&yymsp[0].minor); + yy_destructor(yypParser,310,&yymsp[0].minor); break; case 2: /* account_options ::= */ { } @@ -3437,20 +3433,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,307,&yymsp[-2].minor); +{ yy_destructor(yypParser,309,&yymsp[-2].minor); { } - yy_destructor(yypParser,309,&yymsp[0].minor); + yy_destructor(yypParser,311,&yymsp[0].minor); } break; case 12: /* alter_account_options ::= alter_account_option */ -{ yy_destructor(yypParser,310,&yymsp[0].minor); +{ yy_destructor(yypParser,312,&yymsp[0].minor); { } } break; case 13: /* alter_account_options ::= alter_account_options alter_account_option */ -{ yy_destructor(yypParser,308,&yymsp[-1].minor); +{ yy_destructor(yypParser,310,&yymsp[-1].minor); { } - yy_destructor(yypParser,310,&yymsp[0].minor); + yy_destructor(yypParser,312,&yymsp[0].minor); } break; case 14: /* alter_account_option ::= PASS literal */ @@ -3464,72 +3460,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,309,&yymsp[0].minor); + yy_destructor(yypParser,311,&yymsp[0].minor); break; case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ -{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy617, &yymsp[-1].minor.yy0, yymsp[0].minor.yy215); } +{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy239, &yymsp[-1].minor.yy0, yymsp[0].minor.yy509); } break; case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy617, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy239, 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.yy617, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy239, 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.yy617, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy239, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } break; case 28: /* cmd ::= DROP USER user_name */ -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy239); } break; case 29: /* sysinfo_opt ::= */ -{ yymsp[1].minor.yy215 = 1; } +{ yymsp[1].minor.yy509 = 1; } break; case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */ -{ yymsp[-1].minor.yy215 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } +{ yymsp[-1].minor.yy509 = 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.yy473, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy129, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy239); } break; case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */ -{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy473, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy129, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy239); } break; case 33: /* privileges ::= ALL */ -{ yymsp[0].minor.yy473 = PRIVILEGE_TYPE_ALL; } +{ yymsp[0].minor.yy129 = PRIVILEGE_TYPE_ALL; } break; case 34: /* privileges ::= priv_type_list */ case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35); -{ yylhsminor.yy473 = yymsp[0].minor.yy473; } - yymsp[0].minor.yy473 = yylhsminor.yy473; +{ yylhsminor.yy129 = yymsp[0].minor.yy129; } + yymsp[0].minor.yy129 = yylhsminor.yy129; break; case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ -{ yylhsminor.yy473 = yymsp[-2].minor.yy473 | yymsp[0].minor.yy473; } - yymsp[-2].minor.yy473 = yylhsminor.yy473; +{ yylhsminor.yy129 = yymsp[-2].minor.yy129 | yymsp[0].minor.yy129; } + yymsp[-2].minor.yy129 = yylhsminor.yy129; break; case 37: /* priv_type ::= READ */ -{ yymsp[0].minor.yy473 = PRIVILEGE_TYPE_READ; } +{ yymsp[0].minor.yy129 = PRIVILEGE_TYPE_READ; } break; case 38: /* priv_type ::= WRITE */ -{ yymsp[0].minor.yy473 = PRIVILEGE_TYPE_WRITE; } +{ yymsp[0].minor.yy129 = PRIVILEGE_TYPE_WRITE; } break; case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ -{ yylhsminor.yy617 = yymsp[-2].minor.yy0; } - yymsp[-2].minor.yy617 = yylhsminor.yy617; +{ yylhsminor.yy239 = yymsp[-2].minor.yy0; } + yymsp[-2].minor.yy239 = yylhsminor.yy239; break; case 40: /* priv_level ::= db_name NK_DOT NK_STAR */ -{ yylhsminor.yy617 = yymsp[-2].minor.yy617; } - yymsp[-2].minor.yy617 = yylhsminor.yy617; +{ yylhsminor.yy239 = yymsp[-2].minor.yy239; } + yymsp[-2].minor.yy239 = yylhsminor.yy239; break; case 41: /* cmd ::= CREATE DNODE dnode_endpoint */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy617, NULL); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy239, NULL); } break; case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy239, &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.yy617); } +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy239); } break; case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } @@ -3546,31 +3542,31 @@ 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 316: /* db_name ::= NK_ID */ yytestcase(yyruleno==316); - case 317: /* table_name ::= NK_ID */ yytestcase(yyruleno==317); - case 318: /* column_name ::= NK_ID */ yytestcase(yyruleno==318); - case 319: /* function_name ::= NK_ID */ yytestcase(yyruleno==319); - case 320: /* table_alias ::= NK_ID */ yytestcase(yyruleno==320); - case 321: /* column_alias ::= NK_ID */ yytestcase(yyruleno==321); - case 322: /* user_name ::= NK_ID */ yytestcase(yyruleno==322); - case 323: /* topic_name ::= NK_ID */ yytestcase(yyruleno==323); - case 324: /* stream_name ::= NK_ID */ yytestcase(yyruleno==324); - case 325: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==325); - case 361: /* noarg_func ::= NOW */ yytestcase(yyruleno==361); - case 362: /* noarg_func ::= TODAY */ yytestcase(yyruleno==362); - case 363: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==363); - case 364: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==364); - case 365: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==365); - case 366: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==366); - case 367: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==367); - case 368: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==368); - case 369: /* noarg_func ::= USER */ yytestcase(yyruleno==369); - case 370: /* star_func ::= COUNT */ yytestcase(yyruleno==370); - case 371: /* star_func ::= FIRST */ yytestcase(yyruleno==371); - case 372: /* star_func ::= LAST */ yytestcase(yyruleno==372); - case 373: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==373); -{ yylhsminor.yy617 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy617 = yylhsminor.yy617; + case 318: /* db_name ::= NK_ID */ yytestcase(yyruleno==318); + case 319: /* table_name ::= NK_ID */ yytestcase(yyruleno==319); + case 320: /* column_name ::= NK_ID */ yytestcase(yyruleno==320); + case 321: /* function_name ::= NK_ID */ yytestcase(yyruleno==321); + case 322: /* table_alias ::= NK_ID */ yytestcase(yyruleno==322); + case 323: /* column_alias ::= NK_ID */ yytestcase(yyruleno==323); + case 324: /* user_name ::= NK_ID */ yytestcase(yyruleno==324); + case 325: /* topic_name ::= NK_ID */ yytestcase(yyruleno==325); + case 326: /* stream_name ::= NK_ID */ yytestcase(yyruleno==326); + case 327: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==327); + case 363: /* noarg_func ::= NOW */ yytestcase(yyruleno==363); + case 364: /* noarg_func ::= TODAY */ yytestcase(yyruleno==364); + case 365: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==365); + case 366: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==366); + case 367: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==367); + case 368: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==368); + case 369: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==369); + case 370: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==370); + case 371: /* noarg_func ::= USER */ yytestcase(yyruleno==371); + case 372: /* star_func ::= COUNT */ yytestcase(yyruleno==372); + case 373: /* star_func ::= FIRST */ yytestcase(yyruleno==373); + case 374: /* star_func ::= LAST */ yytestcase(yyruleno==374); + case 375: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==375); +{ yylhsminor.yy239 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy239 = yylhsminor.yy239; break; case 52: /* cmd ::= ALTER LOCAL NK_STRING */ { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } @@ -3603,1274 +3599,1282 @@ 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.yy313, &yymsp[-1].minor.yy617, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy845, &yymsp[-1].minor.yy239, yymsp[0].minor.yy80); } break; case 63: /* cmd ::= DROP DATABASE exists_opt db_name */ -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy845, &yymsp[0].minor.yy239); } break; case 64: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy239); } break; case 65: /* cmd ::= ALTER DATABASE db_name alter_db_options */ -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy617, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy239, yymsp[0].minor.yy80); } break; case 66: /* cmd ::= FLUSH DATABASE db_name */ -{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy239); } break; case 67: /* cmd ::= TRIM DATABASE db_name */ -{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[0].minor.yy239); } break; case 68: /* not_exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy313 = true; } +{ yymsp[-2].minor.yy845 = true; } break; case 69: /* not_exists_opt ::= */ case 71: /* exists_opt ::= */ yytestcase(yyruleno==71); - case 259: /* analyze_opt ::= */ yytestcase(yyruleno==259); - case 266: /* agg_func_opt ::= */ yytestcase(yyruleno==266); - case 427: /* set_quantifier_opt ::= */ yytestcase(yyruleno==427); -{ yymsp[1].minor.yy313 = false; } + case 261: /* analyze_opt ::= */ yytestcase(yyruleno==261); + case 268: /* agg_func_opt ::= */ yytestcase(yyruleno==268); + case 429: /* set_quantifier_opt ::= */ yytestcase(yyruleno==429); +{ yymsp[1].minor.yy845 = false; } break; case 70: /* exists_opt ::= IF EXISTS */ -{ yymsp[-1].minor.yy313 = true; } +{ yymsp[-1].minor.yy845 = true; } break; case 72: /* db_options ::= */ -{ yymsp[1].minor.yy840 = createDefaultDatabaseOptions(pCxt); } +{ yymsp[1].minor.yy80 = createDefaultDatabaseOptions(pCxt); } break; case 73: /* db_options ::= db_options BUFFER NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 74: /* db_options ::= db_options CACHEMODEL NK_STRING */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 75: /* db_options ::= db_options CACHESIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 76: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 77: /* db_options ::= db_options DURATION NK_INTEGER */ case 78: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==78); -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 79: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 80: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 81: /* db_options ::= db_options KEEP integer_list */ case 82: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==82); -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_KEEP, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_KEEP, yymsp[0].minor.yy574); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 83: /* db_options ::= db_options PAGES NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 84: /* db_options ::= db_options PAGESIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 85: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 86: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 87: /* db_options ::= db_options STRICT NK_STRING */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 88: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 89: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 90: /* db_options ::= db_options RETENTIONS retention_list */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_RETENTIONS, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_RETENTIONS, yymsp[0].minor.yy574); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 91: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 92: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 93: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 94: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 95: /* db_options ::= db_options WAL_RETENTION_PERIOD 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.yy840 = setDatabaseOption(pCxt, yymsp[-3].minor.yy840, DB_OPTION_WAL_RETENTION_PERIOD, &t); + yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-3].minor.yy80, DB_OPTION_WAL_RETENTION_PERIOD, &t); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; case 96: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 97: /* db_options ::= db_options WAL_RETENTION_SIZE 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.yy840 = setDatabaseOption(pCxt, yymsp[-3].minor.yy840, DB_OPTION_WAL_RETENTION_SIZE, &t); + yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-3].minor.yy80, DB_OPTION_WAL_RETENTION_SIZE, &t); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; case 98: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 99: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; case 100: /* db_options ::= db_options SST_TRIGGER NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_SST_TRIGGER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; - break; - case 101: /* alter_db_options ::= alter_db_option */ -{ yylhsminor.yy840 = createAlterDatabaseOptions(pCxt); yylhsminor.yy840 = setAlterDatabaseOption(pCxt, yylhsminor.yy840, &yymsp[0].minor.yy95); } - yymsp[0].minor.yy840 = yylhsminor.yy840; - break; - case 102: /* alter_db_options ::= alter_db_options alter_db_option */ -{ yylhsminor.yy840 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy840, &yymsp[0].minor.yy95); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; - break; - case 103: /* alter_db_option ::= CACHEMODEL NK_STRING */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } - break; - case 104: /* alter_db_option ::= CACHESIZE NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } - break; - case 105: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } - break; - case 106: /* alter_db_option ::= KEEP integer_list */ - case 107: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==107); -{ yymsp[-1].minor.yy95.type = DB_OPTION_KEEP; yymsp[-1].minor.yy95.pList = yymsp[0].minor.yy544; } - break; - case 108: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_WAL; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } - break; - case 109: /* alter_db_option ::= SST_TRIGGER NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_SST_TRIGGER; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } - break; - case 110: /* integer_list ::= NK_INTEGER */ -{ yylhsminor.yy544 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; - break; - case 111: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 286: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==286); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; - break; - case 112: /* variable_list ::= NK_VARIABLE */ -{ yylhsminor.yy544 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; - break; - case 113: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; - break; - case 114: /* retention_list ::= retention */ - case 134: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==134); - case 137: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==137); - case 144: /* column_def_list ::= column_def */ yytestcase(yyruleno==144); - case 187: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==187); - case 192: /* col_name_list ::= col_name */ yytestcase(yyruleno==192); - case 242: /* func_list ::= func */ yytestcase(yyruleno==242); - case 314: /* literal_list ::= signed_literal */ yytestcase(yyruleno==314); - case 376: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==376); - case 430: /* select_list ::= select_item */ yytestcase(yyruleno==430); - case 484: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==484); -{ yylhsminor.yy544 = createNodeList(pCxt, yymsp[0].minor.yy840); } - yymsp[0].minor.yy544 = yylhsminor.yy544; - break; - case 115: /* retention_list ::= retention_list NK_COMMA retention */ - case 145: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==145); - case 188: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==188); - case 193: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==193); - case 243: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==243); - case 315: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==315); - case 377: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==377); - case 431: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==431); - case 485: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==485); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, yymsp[0].minor.yy840); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; - break; - case 116: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ -{ yylhsminor.yy840 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; - break; - case 117: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - case 119: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==119); -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy313, yymsp[-5].minor.yy840, yymsp[-3].minor.yy544, yymsp[-1].minor.yy544, yymsp[0].minor.yy840); } - break; - case 118: /* cmd ::= CREATE TABLE multi_create_clause */ -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy544); } - break; - case 120: /* cmd ::= DROP TABLE multi_drop_clause */ -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy544); } - break; - case 121: /* cmd ::= DROP STABLE exists_opt full_table_name */ -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy313, yymsp[0].minor.yy840); } - break; - case 122: /* cmd ::= ALTER TABLE alter_table_clause */ - case 288: /* cmd ::= query_expression */ yytestcase(yyruleno==288); -{ pCxt->pRootNode = yymsp[0].minor.yy840; } - break; - case 123: /* cmd ::= ALTER STABLE alter_table_clause */ -{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy840); } - break; - case 124: /* alter_table_clause ::= full_table_name alter_table_options */ -{ yylhsminor.yy840 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; - break; - case 125: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; - break; - case 126: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ -{ yylhsminor.yy840 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy840, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy617); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; - break; - case 127: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_SST_TRIGGER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; + break; + case 101: /* db_options ::= db_options TABLE_PREFIX NK_INTEGER */ +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; + break; + case 102: /* db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ +{ yylhsminor.yy80 = setDatabaseOption(pCxt, yymsp[-2].minor.yy80, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; + break; + case 103: /* alter_db_options ::= alter_db_option */ +{ yylhsminor.yy80 = createAlterDatabaseOptions(pCxt); yylhsminor.yy80 = setAlterDatabaseOption(pCxt, yylhsminor.yy80, &yymsp[0].minor.yy299); } + yymsp[0].minor.yy80 = yylhsminor.yy80; + break; + case 104: /* alter_db_options ::= alter_db_options alter_db_option */ +{ yylhsminor.yy80 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy80, &yymsp[0].minor.yy299); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; + break; + case 105: /* alter_db_option ::= CACHEMODEL NK_STRING */ +{ yymsp[-1].minor.yy299.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy299.val = yymsp[0].minor.yy0; } + break; + case 106: /* alter_db_option ::= CACHESIZE NK_INTEGER */ +{ yymsp[-1].minor.yy299.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy299.val = yymsp[0].minor.yy0; } + break; + case 107: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ +{ yymsp[-1].minor.yy299.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy299.val = yymsp[0].minor.yy0; } + break; + case 108: /* alter_db_option ::= KEEP integer_list */ + case 109: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==109); +{ yymsp[-1].minor.yy299.type = DB_OPTION_KEEP; yymsp[-1].minor.yy299.pList = yymsp[0].minor.yy574; } + break; + case 110: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ +{ yymsp[-1].minor.yy299.type = DB_OPTION_WAL; yymsp[-1].minor.yy299.val = yymsp[0].minor.yy0; } + break; + case 111: /* alter_db_option ::= SST_TRIGGER NK_INTEGER */ +{ yymsp[-1].minor.yy299.type = DB_OPTION_SST_TRIGGER; yymsp[-1].minor.yy299.val = yymsp[0].minor.yy0; } + break; + case 112: /* integer_list ::= NK_INTEGER */ +{ yylhsminor.yy574 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy574 = yylhsminor.yy574; + break; + case 113: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ + case 288: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==288); +{ yylhsminor.yy574 = addNodeToList(pCxt, yymsp[-2].minor.yy574, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy574 = yylhsminor.yy574; + break; + case 114: /* variable_list ::= NK_VARIABLE */ +{ yylhsminor.yy574 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy574 = yylhsminor.yy574; + break; + case 115: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ +{ yylhsminor.yy574 = addNodeToList(pCxt, yymsp[-2].minor.yy574, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy574 = yylhsminor.yy574; + break; + case 116: /* retention_list ::= retention */ + case 136: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==136); + case 139: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==139); + case 146: /* column_def_list ::= column_def */ yytestcase(yyruleno==146); + case 189: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==189); + case 194: /* col_name_list ::= col_name */ yytestcase(yyruleno==194); + case 244: /* func_list ::= func */ yytestcase(yyruleno==244); + case 316: /* literal_list ::= signed_literal */ yytestcase(yyruleno==316); + case 378: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==378); + case 432: /* select_list ::= select_item */ yytestcase(yyruleno==432); + case 486: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==486); +{ yylhsminor.yy574 = createNodeList(pCxt, yymsp[0].minor.yy80); } + yymsp[0].minor.yy574 = yylhsminor.yy574; + break; + case 117: /* retention_list ::= retention_list NK_COMMA retention */ + case 147: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==147); + case 190: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==190); + case 195: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==195); + case 245: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==245); + case 317: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==317); + case 379: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==379); + case 433: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==433); + case 487: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==487); +{ yylhsminor.yy574 = addNodeToList(pCxt, yymsp[-2].minor.yy574, yymsp[0].minor.yy80); } + yymsp[-2].minor.yy574 = yylhsminor.yy574; + break; + case 118: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ +{ yylhsminor.yy80 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; + break; + case 119: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + case 121: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==121); +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy845, yymsp[-5].minor.yy80, yymsp[-3].minor.yy574, yymsp[-1].minor.yy574, yymsp[0].minor.yy80); } + break; + case 120: /* cmd ::= CREATE TABLE multi_create_clause */ +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy574); } + break; + case 122: /* cmd ::= DROP TABLE multi_drop_clause */ +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy574); } + break; + case 123: /* cmd ::= DROP STABLE exists_opt full_table_name */ +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy845, yymsp[0].minor.yy80); } + break; + case 124: /* cmd ::= ALTER TABLE alter_table_clause */ + case 290: /* cmd ::= query_expression */ yytestcase(yyruleno==290); +{ pCxt->pRootNode = yymsp[0].minor.yy80; } + break; + case 125: /* cmd ::= ALTER STABLE alter_table_clause */ +{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy80); } + break; + case 126: /* alter_table_clause ::= full_table_name alter_table_options */ +{ yylhsminor.yy80 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy80, yymsp[0].minor.yy80); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; + break; + case 127: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ +{ yylhsminor.yy80 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy80, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy239, yymsp[0].minor.yy136); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; + break; + case 128: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ +{ yylhsminor.yy80 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy80, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy239); } + yymsp[-3].minor.yy80 = yylhsminor.yy80; + break; + case 129: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ +{ yylhsminor.yy80 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy80, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy239, yymsp[0].minor.yy136); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; break; - case 128: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ -{ yylhsminor.yy840 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; + case 130: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ +{ yylhsminor.yy80 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy80, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy239, &yymsp[0].minor.yy239); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; break; - case 129: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; - break; - case 130: /* alter_table_clause ::= full_table_name DROP TAG column_name */ -{ yylhsminor.yy840 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy840, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy617); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 131: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ +{ yylhsminor.yy80 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy80, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy239, yymsp[0].minor.yy136); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; + break; + case 132: /* alter_table_clause ::= full_table_name DROP TAG column_name */ +{ yylhsminor.yy80 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy80, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy239); } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 131: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; + case 133: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ +{ yylhsminor.yy80 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy80, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy239, yymsp[0].minor.yy136); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; break; - case 132: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ -{ yylhsminor.yy840 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; + case 134: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ +{ yylhsminor.yy80 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy80, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy239, &yymsp[0].minor.yy239); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; break; - case 133: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ -{ yylhsminor.yy840 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy840, &yymsp[-2].minor.yy617, yymsp[0].minor.yy840); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; + case 135: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ +{ yylhsminor.yy80 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy80, &yymsp[-2].minor.yy239, yymsp[0].minor.yy80); } + yymsp[-5].minor.yy80 = yylhsminor.yy80; break; - case 135: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ - case 138: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==138); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-1].minor.yy544, yymsp[0].minor.yy840); } - yymsp[-1].minor.yy544 = yylhsminor.yy544; + case 137: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ + case 140: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==140); +{ yylhsminor.yy574 = addNodeToList(pCxt, yymsp[-1].minor.yy574, yymsp[0].minor.yy80); } + yymsp[-1].minor.yy574 = yylhsminor.yy574; break; - case 136: /* 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.yy840 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy313, yymsp[-8].minor.yy840, yymsp[-6].minor.yy840, yymsp[-5].minor.yy544, yymsp[-2].minor.yy544, yymsp[0].minor.yy840); } - yymsp[-9].minor.yy840 = yylhsminor.yy840; + case 138: /* 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.yy80 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy845, yymsp[-8].minor.yy80, yymsp[-6].minor.yy80, yymsp[-5].minor.yy574, yymsp[-2].minor.yy574, yymsp[0].minor.yy80); } + yymsp[-9].minor.yy80 = yylhsminor.yy80; break; - case 139: /* drop_table_clause ::= exists_opt full_table_name */ -{ yylhsminor.yy840 = createDropTableClause(pCxt, yymsp[-1].minor.yy313, yymsp[0].minor.yy840); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 141: /* drop_table_clause ::= exists_opt full_table_name */ +{ yylhsminor.yy80 = createDropTableClause(pCxt, yymsp[-1].minor.yy845, yymsp[0].minor.yy80); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 140: /* specific_cols_opt ::= */ - case 171: /* tags_def_opt ::= */ yytestcase(yyruleno==171); - case 439: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==439); - case 456: /* group_by_clause_opt ::= */ yytestcase(yyruleno==456); - case 472: /* order_by_clause_opt ::= */ yytestcase(yyruleno==472); -{ yymsp[1].minor.yy544 = NULL; } + case 142: /* specific_cols_opt ::= */ + case 173: /* tags_def_opt ::= */ yytestcase(yyruleno==173); + case 441: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==441); + case 458: /* group_by_clause_opt ::= */ yytestcase(yyruleno==458); + case 474: /* order_by_clause_opt ::= */ yytestcase(yyruleno==474); +{ yymsp[1].minor.yy574 = NULL; } break; - case 141: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ -{ yymsp[-2].minor.yy544 = yymsp[-1].minor.yy544; } + case 143: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ +{ yymsp[-2].minor.yy574 = yymsp[-1].minor.yy574; } break; - case 142: /* full_table_name ::= table_name */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy617, NULL); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 144: /* full_table_name ::= table_name */ +{ yylhsminor.yy80 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy239, NULL); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 143: /* full_table_name ::= db_name NK_DOT table_name */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617, NULL); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 145: /* full_table_name ::= db_name NK_DOT table_name */ +{ yylhsminor.yy80 = createRealTableNode(pCxt, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy239, NULL); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 146: /* column_def ::= column_name type_name */ -{ yylhsminor.yy840 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784, NULL); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 148: /* column_def ::= column_name type_name */ +{ yylhsminor.yy80 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy239, yymsp[0].minor.yy136, NULL); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 147: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy840 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy617, yymsp[-2].minor.yy784, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 149: /* column_def ::= column_name type_name COMMENT NK_STRING */ +{ yylhsminor.yy80 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy239, yymsp[-2].minor.yy136, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 148: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BOOL); } + case 150: /* type_name ::= BOOL */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_BOOL); } break; - case 149: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_TINYINT); } + case 151: /* type_name ::= TINYINT */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; - case 150: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_SMALLINT); } + case 152: /* type_name ::= SMALLINT */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; - case 151: /* type_name ::= INT */ - case 152: /* type_name ::= INTEGER */ yytestcase(yyruleno==152); -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_INT); } + case 153: /* type_name ::= INT */ + case 154: /* type_name ::= INTEGER */ yytestcase(yyruleno==154); +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_INT); } break; - case 153: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BIGINT); } + case 155: /* type_name ::= BIGINT */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; - case 154: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_FLOAT); } + case 156: /* type_name ::= FLOAT */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; - case 155: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_DOUBLE); } + case 157: /* type_name ::= DOUBLE */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; - case 156: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } + case 158: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy136 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; - case 157: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } + case 159: /* type_name ::= TIMESTAMP */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; - case 158: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } + case 160: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy136 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; - case 159: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UTINYINT); } + case 161: /* type_name ::= TINYINT UNSIGNED */ +{ yymsp[-1].minor.yy136 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; - case 160: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_USMALLINT); } + case 162: /* type_name ::= SMALLINT UNSIGNED */ +{ yymsp[-1].minor.yy136 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; - case 161: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UINT); } + case 163: /* type_name ::= INT UNSIGNED */ +{ yymsp[-1].minor.yy136 = createDataType(TSDB_DATA_TYPE_UINT); } break; - case 162: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UBIGINT); } + case 164: /* type_name ::= BIGINT UNSIGNED */ +{ yymsp[-1].minor.yy136 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; - case 163: /* type_name ::= JSON */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_JSON); } + case 165: /* type_name ::= JSON */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_JSON); } break; - case 164: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } + case 166: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy136 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; - case 165: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } + case 167: /* type_name ::= MEDIUMBLOB */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; - case 166: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BLOB); } + case 168: /* type_name ::= BLOB */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_BLOB); } break; - case 167: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } + case 169: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy136 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; - case 168: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 170: /* type_name ::= DECIMAL */ +{ yymsp[0].minor.yy136 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 169: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 171: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy136 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 170: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 172: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy136 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 172: /* tags_def_opt ::= tags_def */ - case 375: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==375); -{ yylhsminor.yy544 = yymsp[0].minor.yy544; } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 174: /* tags_def_opt ::= tags_def */ + case 377: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==377); +{ yylhsminor.yy574 = yymsp[0].minor.yy574; } + yymsp[0].minor.yy574 = yylhsminor.yy574; break; - case 173: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ -{ yymsp[-3].minor.yy544 = yymsp[-1].minor.yy544; } + case 175: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ +{ yymsp[-3].minor.yy574 = yymsp[-1].minor.yy574; } break; - case 174: /* table_options ::= */ -{ yymsp[1].minor.yy840 = createDefaultTableOptions(pCxt); } + case 176: /* table_options ::= */ +{ yymsp[1].minor.yy80 = createDefaultTableOptions(pCxt); } break; - case 175: /* table_options ::= table_options COMMENT NK_STRING */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 177: /* table_options ::= table_options COMMENT NK_STRING */ +{ yylhsminor.yy80 = setTableOption(pCxt, yymsp[-2].minor.yy80, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 176: /* table_options ::= table_options MAX_DELAY duration_list */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 178: /* table_options ::= table_options MAX_DELAY duration_list */ +{ yylhsminor.yy80 = setTableOption(pCxt, yymsp[-2].minor.yy80, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy574); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 177: /* table_options ::= table_options WATERMARK duration_list */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 179: /* table_options ::= table_options WATERMARK duration_list */ +{ yylhsminor.yy80 = setTableOption(pCxt, yymsp[-2].minor.yy80, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy574); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 178: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-4].minor.yy840, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy544); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; + case 180: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ +{ yylhsminor.yy80 = setTableOption(pCxt, yymsp[-4].minor.yy80, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy574); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; break; - case 179: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 181: /* table_options ::= table_options TTL NK_INTEGER */ +{ yylhsminor.yy80 = setTableOption(pCxt, yymsp[-2].minor.yy80, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 180: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-4].minor.yy840, TABLE_OPTION_SMA, yymsp[-1].minor.yy544); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; + case 182: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ +{ yylhsminor.yy80 = setTableOption(pCxt, yymsp[-4].minor.yy80, TABLE_OPTION_SMA, yymsp[-1].minor.yy574); } + yymsp[-4].minor.yy80 = yylhsminor.yy80; break; - case 181: /* alter_table_options ::= alter_table_option */ -{ yylhsminor.yy840 = createAlterTableOptions(pCxt); yylhsminor.yy840 = setTableOption(pCxt, yylhsminor.yy840, yymsp[0].minor.yy95.type, &yymsp[0].minor.yy95.val); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 183: /* alter_table_options ::= alter_table_option */ +{ yylhsminor.yy80 = createAlterTableOptions(pCxt); yylhsminor.yy80 = setTableOption(pCxt, yylhsminor.yy80, yymsp[0].minor.yy299.type, &yymsp[0].minor.yy299.val); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 182: /* alter_table_options ::= alter_table_options alter_table_option */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-1].minor.yy840, yymsp[0].minor.yy95.type, &yymsp[0].minor.yy95.val); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 184: /* alter_table_options ::= alter_table_options alter_table_option */ +{ yylhsminor.yy80 = setTableOption(pCxt, yymsp[-1].minor.yy80, yymsp[0].minor.yy299.type, &yymsp[0].minor.yy299.val); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 183: /* alter_table_option ::= COMMENT NK_STRING */ -{ yymsp[-1].minor.yy95.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } + case 185: /* alter_table_option ::= COMMENT NK_STRING */ +{ yymsp[-1].minor.yy299.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy299.val = yymsp[0].minor.yy0; } break; - case 184: /* alter_table_option ::= TTL NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } + case 186: /* alter_table_option ::= TTL NK_INTEGER */ +{ yymsp[-1].minor.yy299.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy299.val = yymsp[0].minor.yy0; } break; - case 185: /* duration_list ::= duration_literal */ - case 342: /* expression_list ::= expression */ yytestcase(yyruleno==342); -{ yylhsminor.yy544 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy840)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 187: /* duration_list ::= duration_literal */ + case 344: /* expression_list ::= expression */ yytestcase(yyruleno==344); +{ yylhsminor.yy574 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy80)); } + yymsp[0].minor.yy574 = yylhsminor.yy574; break; - case 186: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 343: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==343); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, releaseRawExprNode(pCxt, yymsp[0].minor.yy840)); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; + case 188: /* duration_list ::= duration_list NK_COMMA duration_literal */ + case 345: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==345); +{ yylhsminor.yy574 = addNodeToList(pCxt, yymsp[-2].minor.yy574, releaseRawExprNode(pCxt, yymsp[0].minor.yy80)); } + yymsp[-2].minor.yy574 = yylhsminor.yy574; break; - case 189: /* rollup_func_name ::= function_name */ -{ yylhsminor.yy840 = createFunctionNode(pCxt, &yymsp[0].minor.yy617, NULL); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 191: /* rollup_func_name ::= function_name */ +{ yylhsminor.yy80 = createFunctionNode(pCxt, &yymsp[0].minor.yy239, NULL); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 190: /* rollup_func_name ::= FIRST */ - case 191: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==191); -{ yylhsminor.yy840 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 192: /* rollup_func_name ::= FIRST */ + case 193: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==193); +{ yylhsminor.yy80 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 194: /* col_name ::= column_name */ -{ yylhsminor.yy840 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy617); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 196: /* col_name ::= column_name */ +{ yylhsminor.yy80 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy239); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 195: /* cmd ::= SHOW DNODES */ + case 197: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } break; - case 196: /* cmd ::= SHOW USERS */ + case 198: /* cmd ::= SHOW USERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); } break; - case 197: /* cmd ::= SHOW DATABASES */ + case 199: /* cmd ::= SHOW DATABASES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; - case 198: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy840, yymsp[0].minor.yy840, OP_TYPE_LIKE); } + case 200: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy80, yymsp[0].minor.yy80, OP_TYPE_LIKE); } break; - case 199: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy840, yymsp[0].minor.yy840, OP_TYPE_LIKE); } + case 201: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy80, yymsp[0].minor.yy80, OP_TYPE_LIKE); } break; - case 200: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy840, NULL, OP_TYPE_LIKE); } + case 202: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy80, NULL, OP_TYPE_LIKE); } break; - case 201: /* cmd ::= SHOW MNODES */ + case 203: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } break; - case 202: /* cmd ::= SHOW MODULES */ + case 204: /* cmd ::= SHOW MODULES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MODULES_STMT); } break; - case 203: /* cmd ::= SHOW QNODES */ + case 205: /* cmd ::= SHOW QNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); } break; - case 204: /* cmd ::= SHOW FUNCTIONS */ + case 206: /* cmd ::= SHOW FUNCTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } break; - case 205: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy840, yymsp[-1].minor.yy840, OP_TYPE_EQUAL); } + case 207: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy80, yymsp[-1].minor.yy80, OP_TYPE_EQUAL); } break; - case 206: /* cmd ::= SHOW STREAMS */ + case 208: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } break; - case 207: /* cmd ::= SHOW ACCOUNTS */ + case 209: /* cmd ::= SHOW ACCOUNTS */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } break; - case 208: /* cmd ::= SHOW APPS */ + case 210: /* cmd ::= SHOW APPS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT); } break; - case 209: /* cmd ::= SHOW CONNECTIONS */ + case 211: /* cmd ::= SHOW CONNECTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT); } break; - case 210: /* cmd ::= SHOW LICENCES */ - case 211: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==211); + case 212: /* cmd ::= SHOW LICENCES */ + case 213: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==213); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); } break; - case 212: /* cmd ::= SHOW CREATE DATABASE db_name */ -{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } + case 214: /* cmd ::= SHOW CREATE DATABASE db_name */ +{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy239); } break; - case 213: /* cmd ::= SHOW CREATE TABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy840); } + case 215: /* cmd ::= SHOW CREATE TABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy80); } break; - case 214: /* cmd ::= SHOW CREATE STABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy840); } + case 216: /* cmd ::= SHOW CREATE STABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy80); } break; - case 215: /* cmd ::= SHOW QUERIES */ + case 217: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } break; - case 216: /* cmd ::= SHOW SCORES */ + case 218: /* cmd ::= SHOW SCORES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); } break; - case 217: /* cmd ::= SHOW TOPICS */ + case 219: /* cmd ::= SHOW TOPICS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); } break; - case 218: /* cmd ::= SHOW VARIABLES */ + case 220: /* cmd ::= SHOW VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } break; - case 219: /* cmd ::= SHOW LOCAL VARIABLES */ + case 221: /* cmd ::= SHOW LOCAL VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); } break; - case 220: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + case 222: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ { pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-1].minor.yy0)); } break; - case 221: /* cmd ::= SHOW BNODES */ + case 223: /* cmd ::= SHOW BNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); } break; - case 222: /* cmd ::= SHOW SNODES */ + case 224: /* cmd ::= SHOW SNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } break; - case 223: /* cmd ::= SHOW CLUSTER */ + case 225: /* cmd ::= SHOW CLUSTER */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } break; - case 224: /* cmd ::= SHOW TRANSACTIONS */ + case 226: /* cmd ::= SHOW TRANSACTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } break; - case 225: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ -{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy840); } + case 227: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ +{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy80); } break; - case 226: /* cmd ::= SHOW CONSUMERS */ + case 228: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } break; - case 227: /* cmd ::= SHOW SUBSCRIPTIONS */ + case 229: /* cmd ::= SHOW SUBSCRIPTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } break; - case 228: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy840, yymsp[-1].minor.yy840, OP_TYPE_EQUAL); } + case 230: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy80, yymsp[-1].minor.yy80, OP_TYPE_EQUAL); } break; - case 229: /* cmd ::= SHOW VNODES NK_INTEGER */ + case 231: /* cmd ::= SHOW VNODES NK_INTEGER */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0), NULL); } break; - case 230: /* cmd ::= SHOW VNODES NK_STRING */ + case 232: /* cmd ::= SHOW VNODES NK_STRING */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &yymsp[0].minor.yy0)); } break; - case 231: /* db_name_cond_opt ::= */ - case 236: /* from_db_opt ::= */ yytestcase(yyruleno==236); -{ yymsp[1].minor.yy840 = createDefaultDatabaseCondValue(pCxt); } + case 233: /* db_name_cond_opt ::= */ + case 238: /* from_db_opt ::= */ yytestcase(yyruleno==238); +{ yymsp[1].minor.yy80 = createDefaultDatabaseCondValue(pCxt); } break; - case 232: /* db_name_cond_opt ::= db_name NK_DOT */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 234: /* db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy239); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 233: /* like_pattern_opt ::= */ - case 408: /* from_clause_opt ::= */ yytestcase(yyruleno==408); - case 437: /* where_clause_opt ::= */ yytestcase(yyruleno==437); - case 441: /* twindow_clause_opt ::= */ yytestcase(yyruleno==441); - case 446: /* sliding_opt ::= */ yytestcase(yyruleno==446); - case 448: /* fill_opt ::= */ yytestcase(yyruleno==448); - case 460: /* having_clause_opt ::= */ yytestcase(yyruleno==460); - case 462: /* range_opt ::= */ yytestcase(yyruleno==462); - case 464: /* every_opt ::= */ yytestcase(yyruleno==464); - case 474: /* slimit_clause_opt ::= */ yytestcase(yyruleno==474); - case 478: /* limit_clause_opt ::= */ yytestcase(yyruleno==478); -{ yymsp[1].minor.yy840 = NULL; } + case 235: /* like_pattern_opt ::= */ + case 410: /* from_clause_opt ::= */ yytestcase(yyruleno==410); + case 439: /* where_clause_opt ::= */ yytestcase(yyruleno==439); + case 443: /* twindow_clause_opt ::= */ yytestcase(yyruleno==443); + case 448: /* sliding_opt ::= */ yytestcase(yyruleno==448); + case 450: /* fill_opt ::= */ yytestcase(yyruleno==450); + case 462: /* having_clause_opt ::= */ yytestcase(yyruleno==462); + case 464: /* range_opt ::= */ yytestcase(yyruleno==464); + case 466: /* every_opt ::= */ yytestcase(yyruleno==466); + case 476: /* slimit_clause_opt ::= */ yytestcase(yyruleno==476); + case 480: /* limit_clause_opt ::= */ yytestcase(yyruleno==480); +{ yymsp[1].minor.yy80 = NULL; } break; - case 234: /* like_pattern_opt ::= LIKE NK_STRING */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + case 236: /* like_pattern_opt ::= LIKE NK_STRING */ +{ yymsp[-1].minor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; - case 235: /* table_name_cond ::= table_name */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy617); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 237: /* table_name_cond ::= table_name */ +{ yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy239); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 237: /* from_db_opt ::= FROM db_name */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy617); } + case 239: /* from_db_opt ::= FROM db_name */ +{ yymsp[-1].minor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy239); } break; - case 238: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy313, yymsp[-3].minor.yy840, yymsp[-1].minor.yy840, NULL, yymsp[0].minor.yy840); } + case 240: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy845, yymsp[-3].minor.yy80, yymsp[-1].minor.yy80, NULL, yymsp[0].minor.yy80); } break; - case 239: /* cmd ::= DROP INDEX exists_opt full_table_name */ -{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy313, yymsp[0].minor.yy840); } + case 241: /* cmd ::= DROP INDEX exists_opt full_table_name */ +{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy845, yymsp[0].minor.yy80); } break; - case 240: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-9].minor.yy840 = createIndexOption(pCxt, yymsp[-7].minor.yy544, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), NULL, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 242: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-9].minor.yy80 = createIndexOption(pCxt, yymsp[-7].minor.yy574, releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), NULL, yymsp[-1].minor.yy80, yymsp[0].minor.yy80); } break; - case 241: /* 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.yy840 = createIndexOption(pCxt, yymsp[-9].minor.yy544, releaseRawExprNode(pCxt, yymsp[-5].minor.yy840), releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 243: /* 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.yy80 = createIndexOption(pCxt, yymsp[-9].minor.yy574, releaseRawExprNode(pCxt, yymsp[-5].minor.yy80), releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), yymsp[-1].minor.yy80, yymsp[0].minor.yy80); } break; - case 244: /* func ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy840 = createFunctionNode(pCxt, &yymsp[-3].minor.yy617, yymsp[-1].minor.yy544); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 246: /* func ::= function_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy80 = createFunctionNode(pCxt, &yymsp[-3].minor.yy239, yymsp[-1].minor.yy574); } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 245: /* sma_stream_opt ::= */ - case 272: /* stream_options ::= */ yytestcase(yyruleno==272); -{ yymsp[1].minor.yy840 = createStreamOptions(pCxt); } + case 247: /* sma_stream_opt ::= */ + case 274: /* stream_options ::= */ yytestcase(yyruleno==274); +{ yymsp[1].minor.yy80 = createStreamOptions(pCxt); } break; - case 246: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ - case 276: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==276); -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 248: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ + case 278: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==278); +{ ((SStreamOptions*)yymsp[-2].minor.yy80)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy80); yylhsminor.yy80 = yymsp[-2].minor.yy80; } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 247: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 249: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy80)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy80); yylhsminor.yy80 = yymsp[-2].minor.yy80; } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 248: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ -{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy313, &yymsp[-2].minor.yy617, yymsp[0].minor.yy840); } + case 250: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ +{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy845, &yymsp[-2].minor.yy239, yymsp[0].minor.yy80); } break; - case 249: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy313, &yymsp[-3].minor.yy617, &yymsp[0].minor.yy617, false); } + case 251: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy845, &yymsp[-3].minor.yy239, &yymsp[0].minor.yy239, false); } break; - case 250: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy313, &yymsp[-5].minor.yy617, &yymsp[0].minor.yy617, true); } + case 252: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy845, &yymsp[-5].minor.yy239, &yymsp[0].minor.yy239, true); } break; - case 251: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy313, &yymsp[-3].minor.yy617, yymsp[0].minor.yy840, false); } + case 253: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy845, &yymsp[-3].minor.yy239, yymsp[0].minor.yy80, false); } break; - case 252: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy313, &yymsp[-5].minor.yy617, yymsp[0].minor.yy840, true); } + case 254: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy845, &yymsp[-5].minor.yy239, yymsp[0].minor.yy80, true); } break; - case 253: /* cmd ::= DROP TOPIC exists_opt topic_name */ -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } + case 255: /* cmd ::= DROP TOPIC exists_opt topic_name */ +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy845, &yymsp[0].minor.yy239); } break; - case 254: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy313, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617); } + case 256: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ +{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy845, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy239); } break; - case 255: /* cmd ::= DESC full_table_name */ - case 256: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==256); -{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy840); } + case 257: /* cmd ::= DESC full_table_name */ + case 258: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==258); +{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy80); } break; - case 257: /* cmd ::= RESET QUERY CACHE */ + case 259: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } break; - case 258: /* cmd ::= EXPLAIN analyze_opt explain_options query_expression */ -{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy313, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 260: /* cmd ::= EXPLAIN analyze_opt explain_options query_expression */ +{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy845, yymsp[-1].minor.yy80, yymsp[0].minor.yy80); } break; - case 260: /* analyze_opt ::= ANALYZE */ - case 267: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==267); - case 428: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==428); -{ yymsp[0].minor.yy313 = true; } + case 262: /* analyze_opt ::= ANALYZE */ + case 269: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==269); + case 430: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==430); +{ yymsp[0].minor.yy845 = true; } break; - case 261: /* explain_options ::= */ -{ yymsp[1].minor.yy840 = createDefaultExplainOptions(pCxt); } + case 263: /* explain_options ::= */ +{ yymsp[1].minor.yy80 = createDefaultExplainOptions(pCxt); } break; - case 262: /* explain_options ::= explain_options VERBOSE NK_BOOL */ -{ yylhsminor.yy840 = setExplainVerbose(pCxt, yymsp[-2].minor.yy840, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 264: /* explain_options ::= explain_options VERBOSE NK_BOOL */ +{ yylhsminor.yy80 = setExplainVerbose(pCxt, yymsp[-2].minor.yy80, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 263: /* explain_options ::= explain_options RATIO NK_FLOAT */ -{ yylhsminor.yy840 = setExplainRatio(pCxt, yymsp[-2].minor.yy840, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 265: /* explain_options ::= explain_options RATIO NK_FLOAT */ +{ yylhsminor.yy80 = setExplainRatio(pCxt, yymsp[-2].minor.yy80, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 264: /* 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.yy313, yymsp[-8].minor.yy313, &yymsp[-5].minor.yy617, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy784, yymsp[0].minor.yy844); } + case 266: /* 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.yy845, yymsp[-8].minor.yy845, &yymsp[-5].minor.yy239, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy136, yymsp[0].minor.yy46); } break; - case 265: /* cmd ::= DROP FUNCTION exists_opt function_name */ -{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } + case 267: /* cmd ::= DROP FUNCTION exists_opt function_name */ +{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy845, &yymsp[0].minor.yy239); } break; - case 268: /* bufsize_opt ::= */ -{ yymsp[1].minor.yy844 = 0; } + case 270: /* bufsize_opt ::= */ +{ yymsp[1].minor.yy46 = 0; } break; - case 269: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ -{ yymsp[-1].minor.yy844 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } + case 271: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ +{ yymsp[-1].minor.yy46 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } break; - case 270: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression */ -{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-6].minor.yy313, &yymsp[-5].minor.yy617, yymsp[-2].minor.yy840, yymsp[-4].minor.yy840, yymsp[0].minor.yy840); } + case 272: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression */ +{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-6].minor.yy845, &yymsp[-5].minor.yy239, yymsp[-2].minor.yy80, yymsp[-4].minor.yy80, yymsp[0].minor.yy80); } break; - case 271: /* cmd ::= DROP STREAM exists_opt stream_name */ -{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } + case 273: /* cmd ::= DROP STREAM exists_opt stream_name */ +{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy845, &yymsp[0].minor.yy239); } break; - case 273: /* stream_options ::= stream_options TRIGGER AT_ONCE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 275: /* stream_options ::= stream_options TRIGGER AT_ONCE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy80)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy80 = yymsp[-2].minor.yy80; } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 274: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 276: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy80)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy80 = yymsp[-2].minor.yy80; } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 275: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-3].minor.yy840)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy840)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); yylhsminor.yy840 = yymsp[-3].minor.yy840; } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 277: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-3].minor.yy80)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy80)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy80); yylhsminor.yy80 = yymsp[-3].minor.yy80; } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 277: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ -{ ((SStreamOptions*)yymsp[-3].minor.yy840)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy840 = yymsp[-3].minor.yy840; } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 279: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ +{ ((SStreamOptions*)yymsp[-3].minor.yy80)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy80 = yymsp[-3].minor.yy80; } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 278: /* cmd ::= KILL CONNECTION NK_INTEGER */ + case 280: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } break; - case 279: /* cmd ::= KILL QUERY NK_STRING */ + case 281: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 280: /* cmd ::= KILL TRANSACTION NK_INTEGER */ + case 282: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } break; - case 281: /* cmd ::= BALANCE VGROUP */ + case 283: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } break; - case 282: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + case 284: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 283: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ -{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy544); } + case 285: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ +{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy574); } break; - case 284: /* cmd ::= SPLIT VGROUP NK_INTEGER */ + case 286: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 285: /* dnode_list ::= DNODE NK_INTEGER */ -{ yymsp[-1].minor.yy544 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + case 287: /* dnode_list ::= DNODE NK_INTEGER */ +{ yymsp[-1].minor.yy574 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } break; - case 287: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ -{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 289: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ +{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy80, yymsp[0].minor.yy80); } break; - case 289: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy840, yymsp[-2].minor.yy544, yymsp[0].minor.yy840); } + case 291: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy80, yymsp[-2].minor.yy574, yymsp[0].minor.yy80); } break; - case 290: /* cmd ::= INSERT INTO full_table_name query_expression */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy840, NULL, yymsp[0].minor.yy840); } + case 292: /* cmd ::= INSERT INTO full_table_name query_expression */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy80, NULL, yymsp[0].minor.yy80); } break; - case 291: /* literal ::= NK_INTEGER */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 293: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 292: /* literal ::= NK_FLOAT */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 294: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 293: /* literal ::= NK_STRING */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 295: /* literal ::= NK_STRING */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 294: /* literal ::= NK_BOOL */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 296: /* literal ::= NK_BOOL */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 295: /* literal ::= TIMESTAMP NK_STRING */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 297: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 296: /* literal ::= duration_literal */ - case 306: /* signed_literal ::= signed */ yytestcase(yyruleno==306); - case 326: /* expression ::= literal */ yytestcase(yyruleno==326); - case 327: /* expression ::= pseudo_column */ yytestcase(yyruleno==327); - case 328: /* expression ::= column_reference */ yytestcase(yyruleno==328); - case 329: /* expression ::= function_expression */ yytestcase(yyruleno==329); - case 330: /* expression ::= subquery */ yytestcase(yyruleno==330); - case 358: /* function_expression ::= literal_func */ yytestcase(yyruleno==358); - case 400: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==400); - case 404: /* boolean_primary ::= predicate */ yytestcase(yyruleno==404); - case 406: /* common_expression ::= expression */ yytestcase(yyruleno==406); - case 407: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==407); - case 410: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==410); - case 412: /* table_reference ::= table_primary */ yytestcase(yyruleno==412); - case 413: /* table_reference ::= joined_table */ yytestcase(yyruleno==413); - case 417: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==417); - case 467: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==467); - case 470: /* query_primary ::= query_specification */ yytestcase(yyruleno==470); -{ yylhsminor.yy840 = yymsp[0].minor.yy840; } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 298: /* literal ::= duration_literal */ + case 308: /* signed_literal ::= signed */ yytestcase(yyruleno==308); + case 328: /* expression ::= literal */ yytestcase(yyruleno==328); + case 329: /* expression ::= pseudo_column */ yytestcase(yyruleno==329); + case 330: /* expression ::= column_reference */ yytestcase(yyruleno==330); + case 331: /* expression ::= function_expression */ yytestcase(yyruleno==331); + case 332: /* expression ::= subquery */ yytestcase(yyruleno==332); + case 360: /* function_expression ::= literal_func */ yytestcase(yyruleno==360); + case 402: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==402); + case 406: /* boolean_primary ::= predicate */ yytestcase(yyruleno==406); + case 408: /* common_expression ::= expression */ yytestcase(yyruleno==408); + case 409: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==409); + case 412: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==412); + case 414: /* table_reference ::= table_primary */ yytestcase(yyruleno==414); + case 415: /* table_reference ::= joined_table */ yytestcase(yyruleno==415); + case 419: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==419); + case 469: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==469); + case 472: /* query_primary ::= query_specification */ yytestcase(yyruleno==472); +{ yylhsminor.yy80 = yymsp[0].minor.yy80; } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 297: /* literal ::= NULL */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 299: /* literal ::= NULL */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 298: /* literal ::= NK_QUESTION */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 300: /* literal ::= NK_QUESTION */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 299: /* duration_literal ::= NK_VARIABLE */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 301: /* duration_literal ::= NK_VARIABLE */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 300: /* signed ::= NK_INTEGER */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 302: /* signed ::= NK_INTEGER */ +{ yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 301: /* signed ::= NK_PLUS NK_INTEGER */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + case 303: /* signed ::= NK_PLUS NK_INTEGER */ +{ yymsp[-1].minor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } break; - case 302: /* signed ::= NK_MINUS NK_INTEGER */ + case 304: /* 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.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); + yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 303: /* signed ::= NK_FLOAT */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 305: /* signed ::= NK_FLOAT */ +{ yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 304: /* signed ::= NK_PLUS NK_FLOAT */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + case 306: /* signed ::= NK_PLUS NK_FLOAT */ +{ yymsp[-1].minor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 305: /* signed ::= NK_MINUS NK_FLOAT */ + case 307: /* 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.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); + yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 307: /* signed_literal ::= NK_STRING */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 309: /* signed_literal ::= NK_STRING */ +{ yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 308: /* signed_literal ::= NK_BOOL */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 310: /* signed_literal ::= NK_BOOL */ +{ yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 309: /* signed_literal ::= TIMESTAMP NK_STRING */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + case 311: /* signed_literal ::= TIMESTAMP NK_STRING */ +{ yymsp[-1].minor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 310: /* signed_literal ::= duration_literal */ - case 312: /* signed_literal ::= literal_func */ yytestcase(yyruleno==312); - case 378: /* star_func_para ::= expression */ yytestcase(yyruleno==378); - case 433: /* select_item ::= common_expression */ yytestcase(yyruleno==433); - case 483: /* search_condition ::= common_expression */ yytestcase(yyruleno==483); -{ yylhsminor.yy840 = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 312: /* signed_literal ::= duration_literal */ + case 314: /* signed_literal ::= literal_func */ yytestcase(yyruleno==314); + case 380: /* star_func_para ::= expression */ yytestcase(yyruleno==380); + case 435: /* select_item ::= common_expression */ yytestcase(yyruleno==435); + case 485: /* search_condition ::= common_expression */ yytestcase(yyruleno==485); +{ yylhsminor.yy80 = releaseRawExprNode(pCxt, yymsp[0].minor.yy80); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 311: /* signed_literal ::= NULL */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 313: /* signed_literal ::= NULL */ +{ yylhsminor.yy80 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 313: /* signed_literal ::= NK_QUESTION */ -{ yylhsminor.yy840 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 315: /* signed_literal ::= NK_QUESTION */ +{ yylhsminor.yy80 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 331: /* expression ::= NK_LP expression NK_RP */ - case 405: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==405); -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 333: /* expression ::= NK_LP expression NK_RP */ + case 407: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==407); +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy80)); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 332: /* expression ::= NK_PLUS expression */ + case 334: /* expression ::= NK_PLUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy840)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy80)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 333: /* expression ::= NK_MINUS expression */ + case 335: /* expression ::= NK_MINUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy840), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy80), NULL)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 334: /* expression ::= expression NK_PLUS expression */ + case 336: /* expression ::= expression NK_PLUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 335: /* expression ::= expression NK_MINUS expression */ + case 337: /* expression ::= expression NK_MINUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 336: /* expression ::= expression NK_STAR expression */ + case 338: /* expression ::= expression NK_STAR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 337: /* expression ::= expression NK_SLASH expression */ + case 339: /* expression ::= expression NK_SLASH expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 338: /* expression ::= expression NK_REM expression */ + case 340: /* expression ::= expression NK_REM expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 339: /* expression ::= column_reference NK_ARROW NK_STRING */ + case 341: /* expression ::= column_reference NK_ARROW NK_STRING */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 340: /* expression ::= expression NK_BITAND expression */ + case 342: /* expression ::= expression NK_BITAND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 341: /* expression ::= expression NK_BITOR expression */ + case 343: /* expression ::= expression NK_BITOR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 344: /* column_reference ::= column_name */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy617, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy617)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 346: /* column_reference ::= column_name */ +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy239, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy239)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 345: /* column_reference ::= table_name NK_DOT column_name */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617, createColumnNode(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 347: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy239, createColumnNode(pCxt, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy239)); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 346: /* pseudo_column ::= ROWTS */ - case 347: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==347); - case 349: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==349); - case 350: /* pseudo_column ::= QEND */ yytestcase(yyruleno==350); - case 351: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==351); - case 352: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==352); - case 353: /* pseudo_column ::= WEND */ yytestcase(yyruleno==353); - case 354: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==354); - case 360: /* literal_func ::= NOW */ yytestcase(yyruleno==360); -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 348: /* pseudo_column ::= ROWTS */ + case 349: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==349); + case 351: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==351); + case 352: /* pseudo_column ::= QEND */ yytestcase(yyruleno==352); + case 353: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==353); + case 354: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==354); + case 355: /* pseudo_column ::= WEND */ yytestcase(yyruleno==355); + case 356: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==356); + case 362: /* literal_func ::= NOW */ yytestcase(yyruleno==362); +{ yylhsminor.yy80 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 348: /* pseudo_column ::= table_name NK_DOT TBNAME */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy617)))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 350: /* pseudo_column ::= table_name NK_DOT TBNAME */ +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy239)))); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 355: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 356: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==356); -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy617, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy617, yymsp[-1].minor.yy544)); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 357: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 358: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==358); +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy239, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy239, yymsp[-1].minor.yy574)); } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 357: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), yymsp[-1].minor.yy784)); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; + case 359: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), yymsp[-1].minor.yy136)); } + yymsp[-5].minor.yy80 = yylhsminor.yy80; break; - case 359: /* literal_func ::= noarg_func NK_LP NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy617, NULL)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 361: /* literal_func ::= noarg_func NK_LP NK_RP */ +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy239, NULL)); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 374: /* star_func_para_list ::= NK_STAR */ -{ yylhsminor.yy544 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 376: /* star_func_para_list ::= NK_STAR */ +{ yylhsminor.yy574 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy574 = yylhsminor.yy574; break; - case 379: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 436: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==436); -{ yylhsminor.yy840 = createColumnNode(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 381: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 438: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==438); +{ yylhsminor.yy80 = createColumnNode(pCxt, &yymsp[-2].minor.yy239, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 380: /* predicate ::= expression compare_op expression */ - case 385: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==385); + case 382: /* predicate ::= expression compare_op expression */ + case 387: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==387); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy198, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy194, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 381: /* predicate ::= expression BETWEEN expression AND expression */ + case 383: /* predicate ::= expression BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy840), releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy80), releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; + yymsp[-4].minor.yy80 = yylhsminor.yy80; break; - case 382: /* predicate ::= expression NOT BETWEEN expression AND expression */ + case 384: /* predicate ::= expression NOT BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy840), releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy80), releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; + yymsp[-5].minor.yy80 = yylhsminor.yy80; break; - case 383: /* predicate ::= expression IS NULL */ + case 385: /* predicate ::= expression IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), NULL)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 384: /* predicate ::= expression IS NOT NULL */ + case 386: /* predicate ::= expression IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), NULL)); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 386: /* compare_op ::= NK_LT */ -{ yymsp[0].minor.yy198 = OP_TYPE_LOWER_THAN; } + case 388: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy194 = OP_TYPE_LOWER_THAN; } break; - case 387: /* compare_op ::= NK_GT */ -{ yymsp[0].minor.yy198 = OP_TYPE_GREATER_THAN; } + case 389: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy194 = OP_TYPE_GREATER_THAN; } break; - case 388: /* compare_op ::= NK_LE */ -{ yymsp[0].minor.yy198 = OP_TYPE_LOWER_EQUAL; } + case 390: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy194 = OP_TYPE_LOWER_EQUAL; } break; - case 389: /* compare_op ::= NK_GE */ -{ yymsp[0].minor.yy198 = OP_TYPE_GREATER_EQUAL; } + case 391: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy194 = OP_TYPE_GREATER_EQUAL; } break; - case 390: /* compare_op ::= NK_NE */ -{ yymsp[0].minor.yy198 = OP_TYPE_NOT_EQUAL; } + case 392: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy194 = OP_TYPE_NOT_EQUAL; } break; - case 391: /* compare_op ::= NK_EQ */ -{ yymsp[0].minor.yy198 = OP_TYPE_EQUAL; } + case 393: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy194 = OP_TYPE_EQUAL; } break; - case 392: /* compare_op ::= LIKE */ -{ yymsp[0].minor.yy198 = OP_TYPE_LIKE; } + case 394: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy194 = OP_TYPE_LIKE; } break; - case 393: /* compare_op ::= NOT LIKE */ -{ yymsp[-1].minor.yy198 = OP_TYPE_NOT_LIKE; } + case 395: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy194 = OP_TYPE_NOT_LIKE; } break; - case 394: /* compare_op ::= MATCH */ -{ yymsp[0].minor.yy198 = OP_TYPE_MATCH; } + case 396: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy194 = OP_TYPE_MATCH; } break; - case 395: /* compare_op ::= NMATCH */ -{ yymsp[0].minor.yy198 = OP_TYPE_NMATCH; } + case 397: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy194 = OP_TYPE_NMATCH; } break; - case 396: /* compare_op ::= CONTAINS */ -{ yymsp[0].minor.yy198 = OP_TYPE_JSON_CONTAINS; } + case 398: /* compare_op ::= CONTAINS */ +{ yymsp[0].minor.yy194 = OP_TYPE_JSON_CONTAINS; } break; - case 397: /* in_op ::= IN */ -{ yymsp[0].minor.yy198 = OP_TYPE_IN; } + case 399: /* in_op ::= IN */ +{ yymsp[0].minor.yy194 = OP_TYPE_IN; } break; - case 398: /* in_op ::= NOT IN */ -{ yymsp[-1].minor.yy198 = OP_TYPE_NOT_IN; } + case 400: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy194 = OP_TYPE_NOT_IN; } break; - case 399: /* in_predicate_value ::= NK_LP literal_list NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy544)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 401: /* in_predicate_value ::= NK_LP literal_list NK_RP */ +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy574)); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 401: /* boolean_value_expression ::= NOT boolean_primary */ + case 403: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy840), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy80), NULL)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 402: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 404: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 403: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 405: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy80); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy80); + yylhsminor.yy80 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 409: /* from_clause_opt ::= FROM table_reference_list */ - case 438: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==438); - case 461: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==461); -{ yymsp[-1].minor.yy840 = yymsp[0].minor.yy840; } + case 411: /* from_clause_opt ::= FROM table_reference_list */ + case 440: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==440); + case 463: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==463); +{ yymsp[-1].minor.yy80 = yymsp[0].minor.yy80; } break; - case 411: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yylhsminor.yy840 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy840, yymsp[0].minor.yy840, NULL); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 413: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy80 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy80, yymsp[0].minor.yy80, NULL); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 414: /* table_primary ::= table_name alias_opt */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 416: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy80 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy239, &yymsp[0].minor.yy239); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 415: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, &yymsp[-3].minor.yy617, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 417: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy80 = createRealTableNode(pCxt, &yymsp[-3].minor.yy239, &yymsp[-1].minor.yy239, &yymsp[0].minor.yy239); } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 416: /* table_primary ::= subquery alias_opt */ -{ yylhsminor.yy840 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840), &yymsp[0].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 418: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy80 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy80), &yymsp[0].minor.yy239); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 418: /* alias_opt ::= */ -{ yymsp[1].minor.yy617 = nil_token; } + case 420: /* alias_opt ::= */ +{ yymsp[1].minor.yy239 = nil_token; } break; - case 419: /* alias_opt ::= table_alias */ -{ yylhsminor.yy617 = yymsp[0].minor.yy617; } - yymsp[0].minor.yy617 = yylhsminor.yy617; + case 421: /* alias_opt ::= table_alias */ +{ yylhsminor.yy239 = yymsp[0].minor.yy239; } + yymsp[0].minor.yy239 = yylhsminor.yy239; break; - case 420: /* alias_opt ::= AS table_alias */ -{ yymsp[-1].minor.yy617 = yymsp[0].minor.yy617; } + case 422: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy239 = yymsp[0].minor.yy239; } break; - case 421: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 422: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==422); -{ yymsp[-2].minor.yy840 = yymsp[-1].minor.yy840; } + case 423: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 424: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==424); +{ yymsp[-2].minor.yy80 = yymsp[-1].minor.yy80; } break; - case 423: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ yylhsminor.yy840 = createJoinTableNode(pCxt, yymsp[-4].minor.yy708, yymsp[-5].minor.yy840, yymsp[-2].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; + case 425: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy80 = createJoinTableNode(pCxt, yymsp[-4].minor.yy750, yymsp[-5].minor.yy80, yymsp[-2].minor.yy80, yymsp[0].minor.yy80); } + yymsp[-5].minor.yy80 = yylhsminor.yy80; break; - case 424: /* join_type ::= */ -{ yymsp[1].minor.yy708 = JOIN_TYPE_INNER; } + case 426: /* join_type ::= */ +{ yymsp[1].minor.yy750 = JOIN_TYPE_INNER; } break; - case 425: /* join_type ::= INNER */ -{ yymsp[0].minor.yy708 = JOIN_TYPE_INNER; } + case 427: /* join_type ::= INNER */ +{ yymsp[0].minor.yy750 = JOIN_TYPE_INNER; } break; - case 426: /* 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 428: /* 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.yy840 = createSelectStmt(pCxt, yymsp[-10].minor.yy313, yymsp[-9].minor.yy544, yymsp[-8].minor.yy840); - yymsp[-11].minor.yy840 = addWhereClause(pCxt, yymsp[-11].minor.yy840, yymsp[-7].minor.yy840); - yymsp[-11].minor.yy840 = addPartitionByClause(pCxt, yymsp[-11].minor.yy840, yymsp[-6].minor.yy544); - yymsp[-11].minor.yy840 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy840, yymsp[-2].minor.yy840); - yymsp[-11].minor.yy840 = addGroupByClause(pCxt, yymsp[-11].minor.yy840, yymsp[-1].minor.yy544); - yymsp[-11].minor.yy840 = addHavingClause(pCxt, yymsp[-11].minor.yy840, yymsp[0].minor.yy840); - yymsp[-11].minor.yy840 = addRangeClause(pCxt, yymsp[-11].minor.yy840, yymsp[-5].minor.yy840); - yymsp[-11].minor.yy840 = addEveryClause(pCxt, yymsp[-11].minor.yy840, yymsp[-4].minor.yy840); - yymsp[-11].minor.yy840 = addFillClause(pCxt, yymsp[-11].minor.yy840, yymsp[-3].minor.yy840); + yymsp[-11].minor.yy80 = createSelectStmt(pCxt, yymsp[-10].minor.yy845, yymsp[-9].minor.yy574, yymsp[-8].minor.yy80); + yymsp[-11].minor.yy80 = addWhereClause(pCxt, yymsp[-11].minor.yy80, yymsp[-7].minor.yy80); + yymsp[-11].minor.yy80 = addPartitionByClause(pCxt, yymsp[-11].minor.yy80, yymsp[-6].minor.yy574); + yymsp[-11].minor.yy80 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy80, yymsp[-2].minor.yy80); + yymsp[-11].minor.yy80 = addGroupByClause(pCxt, yymsp[-11].minor.yy80, yymsp[-1].minor.yy574); + yymsp[-11].minor.yy80 = addHavingClause(pCxt, yymsp[-11].minor.yy80, yymsp[0].minor.yy80); + yymsp[-11].minor.yy80 = addRangeClause(pCxt, yymsp[-11].minor.yy80, yymsp[-5].minor.yy80); + yymsp[-11].minor.yy80 = addEveryClause(pCxt, yymsp[-11].minor.yy80, yymsp[-4].minor.yy80); + yymsp[-11].minor.yy80 = addFillClause(pCxt, yymsp[-11].minor.yy80, yymsp[-3].minor.yy80); } break; - case 429: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy313 = false; } + case 431: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy845 = false; } break; - case 432: /* select_item ::= NK_STAR */ -{ yylhsminor.yy840 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 434: /* select_item ::= NK_STAR */ +{ yylhsminor.yy80 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy80 = yylhsminor.yy80; break; - case 434: /* select_item ::= common_expression column_alias */ -{ yylhsminor.yy840 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840), &yymsp[0].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 436: /* select_item ::= common_expression column_alias */ +{ yylhsminor.yy80 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy80), &yymsp[0].minor.yy239); } + yymsp[-1].minor.yy80 = yylhsminor.yy80; break; - case 435: /* select_item ::= common_expression AS column_alias */ -{ yylhsminor.yy840 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), &yymsp[0].minor.yy617); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 437: /* select_item ::= common_expression AS column_alias */ +{ yylhsminor.yy80 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), &yymsp[0].minor.yy239); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 440: /* partition_by_clause_opt ::= PARTITION BY expression_list */ - case 457: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==457); - case 473: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==473); -{ yymsp[-2].minor.yy544 = yymsp[0].minor.yy544; } + case 442: /* partition_by_clause_opt ::= PARTITION BY expression_list */ + case 459: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==459); + case 475: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==475); +{ yymsp[-2].minor.yy574 = yymsp[0].minor.yy574; } break; - case 442: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ -{ yymsp[-5].minor.yy840 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } + case 444: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ +{ yymsp[-5].minor.yy80 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), releaseRawExprNode(pCxt, yymsp[-1].minor.yy80)); } break; - case 443: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ -{ yymsp[-3].minor.yy840 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } + case 445: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ +{ yymsp[-3].minor.yy80 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy80)); } break; - case 444: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-5].minor.yy840 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), NULL, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 446: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy80 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), NULL, yymsp[-1].minor.yy80, yymsp[0].minor.yy80); } break; - case 445: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-7].minor.yy840 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy840), releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 447: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy80 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy80), releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), yymsp[-1].minor.yy80, yymsp[0].minor.yy80); } break; - case 447: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - case 465: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==465); -{ yymsp[-3].minor.yy840 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy840); } + case 449: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + case 467: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==467); +{ yymsp[-3].minor.yy80 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy80); } break; - case 449: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ yymsp[-3].minor.yy840 = createFillNode(pCxt, yymsp[-1].minor.yy816, NULL); } + case 451: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy80 = createFillNode(pCxt, yymsp[-1].minor.yy426, NULL); } break; - case 450: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ yymsp[-5].minor.yy840 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy544)); } + case 452: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ yymsp[-5].minor.yy80 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy574)); } break; - case 451: /* fill_mode ::= NONE */ -{ yymsp[0].minor.yy816 = FILL_MODE_NONE; } + case 453: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy426 = FILL_MODE_NONE; } break; - case 452: /* fill_mode ::= PREV */ -{ yymsp[0].minor.yy816 = FILL_MODE_PREV; } + case 454: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy426 = FILL_MODE_PREV; } break; - case 453: /* fill_mode ::= NULL */ -{ yymsp[0].minor.yy816 = FILL_MODE_NULL; } + case 455: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy426 = FILL_MODE_NULL; } break; - case 454: /* fill_mode ::= LINEAR */ -{ yymsp[0].minor.yy816 = FILL_MODE_LINEAR; } + case 456: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy426 = FILL_MODE_LINEAR; } break; - case 455: /* fill_mode ::= NEXT */ -{ yymsp[0].minor.yy816 = FILL_MODE_NEXT; } + case 457: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy426 = FILL_MODE_NEXT; } break; - case 458: /* group_by_list ::= expression */ -{ yylhsminor.yy544 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 460: /* group_by_list ::= expression */ +{ yylhsminor.yy574 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } + yymsp[0].minor.yy574 = yylhsminor.yy574; break; - case 459: /* group_by_list ::= group_by_list NK_COMMA expression */ -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; + case 461: /* group_by_list ::= group_by_list NK_COMMA expression */ +{ yylhsminor.yy574 = addNodeToList(pCxt, yymsp[-2].minor.yy574, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy80))); } + yymsp[-2].minor.yy574 = yylhsminor.yy574; break; - case 463: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ -{ yymsp[-5].minor.yy840 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } + case 465: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ +{ yymsp[-5].minor.yy80 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy80), releaseRawExprNode(pCxt, yymsp[-1].minor.yy80)); } break; - case 466: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 468: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy840 = addOrderByClause(pCxt, yymsp[-3].minor.yy840, yymsp[-2].minor.yy544); - yylhsminor.yy840 = addSlimitClause(pCxt, yylhsminor.yy840, yymsp[-1].minor.yy840); - yylhsminor.yy840 = addLimitClause(pCxt, yylhsminor.yy840, yymsp[0].minor.yy840); + yylhsminor.yy80 = addOrderByClause(pCxt, yymsp[-3].minor.yy80, yymsp[-2].minor.yy574); + yylhsminor.yy80 = addSlimitClause(pCxt, yylhsminor.yy80, yymsp[-1].minor.yy80); + yylhsminor.yy80 = addLimitClause(pCxt, yylhsminor.yy80, yymsp[0].minor.yy80); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 468: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ yylhsminor.yy840 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 470: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ yylhsminor.yy80 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy80, yymsp[0].minor.yy80); } + yymsp[-3].minor.yy80 = yylhsminor.yy80; break; - case 469: /* query_expression_body ::= query_expression_body UNION query_expression_body */ -{ yylhsminor.yy840 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 471: /* query_expression_body ::= query_expression_body UNION query_expression_body */ +{ yylhsminor.yy80 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy80, yymsp[0].minor.yy80); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 471: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ + case 473: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ { - yymsp[-5].minor.yy840 = addOrderByClause(pCxt, yymsp[-4].minor.yy840, yymsp[-3].minor.yy544); - yymsp[-5].minor.yy840 = addSlimitClause(pCxt, yymsp[-5].minor.yy840, yymsp[-2].minor.yy840); - yymsp[-5].minor.yy840 = addLimitClause(pCxt, yymsp[-5].minor.yy840, yymsp[-1].minor.yy840); + yymsp[-5].minor.yy80 = addOrderByClause(pCxt, yymsp[-4].minor.yy80, yymsp[-3].minor.yy574); + yymsp[-5].minor.yy80 = addSlimitClause(pCxt, yymsp[-5].minor.yy80, yymsp[-2].minor.yy80); + yymsp[-5].minor.yy80 = addLimitClause(pCxt, yymsp[-5].minor.yy80, yymsp[-1].minor.yy80); } break; - case 475: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 479: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==479); -{ yymsp[-1].minor.yy840 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 477: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 481: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==481); +{ yymsp[-1].minor.yy80 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 476: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 480: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==480); -{ yymsp[-3].minor.yy840 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 478: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 482: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==482); +{ yymsp[-3].minor.yy80 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 477: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 481: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==481); -{ yymsp[-3].minor.yy840 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 479: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 483: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==483); +{ yymsp[-3].minor.yy80 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 482: /* subquery ::= NK_LP query_expression NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy840); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 484: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy80 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy80); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 486: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy840 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), yymsp[-1].minor.yy204, yymsp[0].minor.yy277); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 488: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy80 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy80), yymsp[-1].minor.yy422, yymsp[0].minor.yy763); } + yymsp[-2].minor.yy80 = yylhsminor.yy80; break; - case 487: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy204 = ORDER_ASC; } + case 489: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy422 = ORDER_ASC; } break; - case 488: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy204 = ORDER_ASC; } + case 490: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy422 = ORDER_ASC; } break; - case 489: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy204 = ORDER_DESC; } + case 491: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy422 = ORDER_DESC; } break; - case 490: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy277 = NULL_ORDER_DEFAULT; } + case 492: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy763 = NULL_ORDER_DEFAULT; } break; - case 491: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy277 = NULL_ORDER_FIRST; } + case 493: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy763 = NULL_ORDER_FIRST; } break; - case 492: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy277 = NULL_ORDER_LAST; } + case 494: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy763 = NULL_ORDER_LAST; } break; default: break; diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp index f84305193b..7725674200 100644 --- a/source/libs/parser/test/mockCatalog.cpp +++ b/source/libs/parser/test/mockCatalog.cpp @@ -83,7 +83,7 @@ void generateInformationSchema(MockCatalogService* mcs) { .done(); mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VNODES, TSDB_SYSTEM_TABLE, 2) .addColumn("dnode_id", TSDB_DATA_TYPE_INT) - .addColumn("dnode_endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN) + .addColumn("dnode_ep", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN) .done(); } diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp index d68adde86d..28bcae53ef 100644 --- a/source/libs/parser/test/parInitialCTest.cpp +++ b/source/libs/parser/test/parInitialCTest.cpp @@ -116,6 +116,8 @@ TEST_F(ParserInitialCTest, createDatabase) { expect.walRollPeriod = TSDB_REP_DEF_DB_WAL_ROLL_PERIOD; expect.walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE; expect.sstTrigger = TSDB_DEFAULT_SST_TRIGGER; + expect.hashPrefix = TSDB_DEFAULT_HASH_PREFIX; + expect.hashSuffix = TSDB_DEFAULT_HASH_SUFFIX; }; auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; }; @@ -157,6 +159,8 @@ TEST_F(ParserInitialCTest, createDatabase) { auto setDbWalRollPeriod = [&](int32_t walRollPeriod) { expect.walRollPeriod = walRollPeriod; }; auto setDbWalSegmentSize = [&](int32_t walSegmentSize) { expect.walSegmentSize = walSegmentSize; }; auto setDbSstTrigger = [&](int32_t sstTrigger) { expect.sstTrigger = sstTrigger; }; + auto setDbHashPrefix = [&](int32_t hashPrefix) { expect.hashPrefix = hashPrefix; }; + auto setDbHashSuffix = [&](int32_t hashSuffix) { expect.hashSuffix = hashSuffix; }; setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) { ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_CREATE_DATABASE_STMT); @@ -188,6 +192,8 @@ TEST_F(ParserInitialCTest, createDatabase) { ASSERT_EQ(req.walRollPeriod, expect.walRollPeriod); ASSERT_EQ(req.walSegmentSize, expect.walSegmentSize); ASSERT_EQ(req.sstTrigger, expect.sstTrigger); + ASSERT_EQ(req.hashPrefix, expect.hashPrefix); + ASSERT_EQ(req.hashSuffix, expect.hashSuffix); ASSERT_EQ(req.ignoreExist, expect.ignoreExist); ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions); if (expect.numOfRetensions > 0) { @@ -236,6 +242,8 @@ TEST_F(ParserInitialCTest, createDatabase) { setDbWalRollPeriod(10); setDbWalSegmentSize(20); setDbSstTrigger(16); + setDbHashPrefix(3); + setDbHashSuffix(4); run("CREATE DATABASE IF NOT EXISTS wxy_db " "BUFFER 64 " "CACHEMODEL 'last_value' " @@ -260,7 +268,9 @@ TEST_F(ParserInitialCTest, createDatabase) { "WAL_RETENTION_SIZE -1 " "WAL_ROLL_PERIOD 10 " "WAL_SEGMENT_SIZE 20 " - "SST_TRIGGER 16"); + "SST_TRIGGER 16 " + "TABLE_PREFIX 3" + "TABLE_SUFFIX 4"); clearCreateDbReq(); setCreateDbReqFunc("wxy_db", 1); diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index 9d4010f60e..a2a45938e4 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -243,6 +243,36 @@ FAIL: return 0; } +int32_t streamSearchAndAddBlock(SStreamTask* pTask, SStreamDispatchReq* pReqs, SSDataBlock* pDataBlock, int32_t vgSz, + int64_t groupId) { + char* ctbName = buildCtbNameByGroupId(pTask->shuffleDispatcher.stbFullName, groupId); + SArray* vgInfo = pTask->shuffleDispatcher.dbInfo.pVgroupInfos; + + // TODO: get hash function by hashMethod + uint32_t hashValue = MurmurHash3_32(ctbName, strlen(ctbName)); + taosMemoryFree(ctbName); + bool found = false; + // TODO: optimize search + int32_t j; + for (j = 0; j < vgSz; j++) { + SVgroupInfo* pVgInfo = taosArrayGet(vgInfo, j); + ASSERT(pVgInfo->vgId > 0); + if (hashValue >= pVgInfo->hashBegin && hashValue <= pVgInfo->hashEnd) { + if (streamAddBlockToDispatchMsg(pDataBlock, &pReqs[j]) < 0) { + return -1; + } + if (pReqs[j].blockNum == 0) { + atomic_add_fetch_32(&pTask->shuffleDispatcher.waitingRspCnt, 1); + } + pReqs[j].blockNum++; + found = true; + break; + } + } + ASSERT(found); + return 0; +} + int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pData) { int32_t code = -1; int32_t blockNum = taosArrayGetSize(pData->blocks); @@ -317,20 +347,10 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat for (int32_t i = 0; i < blockNum; i++) { SSDataBlock* pDataBlock = taosArrayGet(pData->blocks, i); - char* ctbName = buildCtbNameByGroupId(pTask->shuffleDispatcher.stbFullName, pDataBlock->info.groupId); - // TODO: get hash function by hashMethod - uint32_t hashValue = MurmurHash3_32(ctbName, strlen(ctbName)); - - taosMemoryFree(ctbName); - - bool found = false; - // TODO: optimize search - int32_t j; - for (j = 0; j < vgSz; j++) { - SVgroupInfo* pVgInfo = taosArrayGet(vgInfo, j); - ASSERT(pVgInfo->vgId > 0); - if (hashValue >= pVgInfo->hashBegin && hashValue <= pVgInfo->hashEnd) { + // TODO: do not use broadcast + if (pDataBlock->info.type == STREAM_DELETE_RESULT) { + for (int32_t j = 0; j < vgSz; j++) { if (streamAddBlockToDispatchMsg(pDataBlock, &pReqs[j]) < 0) { goto FAIL_SHUFFLE_DISPATCH; } @@ -338,11 +358,13 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat atomic_add_fetch_32(&pTask->shuffleDispatcher.waitingRspCnt, 1); } pReqs[j].blockNum++; - found = true; - break; } + continue; + } + + if (streamSearchAndAddBlock(pTask, pReqs, pDataBlock, vgSz, pDataBlock->info.groupId) < 0) { + goto FAIL_SHUFFLE_DISPATCH; } - ASSERT(found); } for (int32_t i = 0; i < vgSz; i++) { diff --git a/source/libs/transport/src/transComm.c b/source/libs/transport/src/transComm.c index a4d679b281..dea96fa3ac 100644 --- a/source/libs/transport/src/transComm.c +++ b/source/libs/transport/src/transComm.c @@ -287,10 +287,10 @@ void transCtxMerge(STransCtx* dst, STransCtx* src) { STransCtxVal* sVal = (STransCtxVal*)iter; key = taosHashGetKey(sVal, &klen); - STransCtxVal* dVal = taosHashGet(dst->args, key, klen); - if (dVal) { - dst->freeFunc(dVal->val); - } + // STransCtxVal* dVal = taosHashGet(dst->args, key, klen); + // if (dVal) { + // dst->freeFunc(dVal->val); + // } taosHashPut(dst->args, key, klen, sVal, sizeof(*sVal)); iter = taosHashIterate(src->args, iter); } diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 3117152af6..044cdc86b4 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -618,6 +618,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_RSMA_REMOVE_EXISTS, "Rsma remove exists" TAOS_DEFINE_ERROR(TSDB_CODE_RSMA_FETCH_MSG_MSSED_UP, "Rsma fetch msg is messed up") TAOS_DEFINE_ERROR(TSDB_CODE_RSMA_EMPTY_INFO, "Rsma info is empty") TAOS_DEFINE_ERROR(TSDB_CODE_RSMA_INVALID_SCHEMA, "Rsma invalid schema") +TAOS_DEFINE_ERROR(TSDB_CODE_RSMA_REGEX_MATCH, "Rsma regex match") //index TAOS_DEFINE_ERROR(TSDB_CODE_INDEX_REBUILDING, "Index is rebuilding") diff --git a/source/util/src/trbtree.c b/source/util/src/trbtree.c index 0970485dad..65f1bac60a 100644 --- a/source/util/src/trbtree.c +++ b/source/util/src/trbtree.c @@ -13,179 +13,297 @@ * along with this program. If not, see . */ -#include "os.h" +#include "trbtree.h" -typedef int32_t (*tRBTreeCmprFn)(void *, void *); - -typedef struct SRBTree SRBTree; -typedef struct SRBTreeNode SRBTreeNode; -typedef struct SRBTreeIter SRBTreeIter; - -struct SRBTreeNode { - enum { RED, BLACK } color; - SRBTreeNode *parent; - SRBTreeNode *left; - SRBTreeNode *right; - uint8_t payload[]; -}; - -struct SRBTree { - tRBTreeCmprFn cmprFn; - SRBTreeNode *root; -}; - -struct SRBTreeIter { - SRBTree *pTree; -}; - -#define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK) - -// APIs ================================================ -static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *pNode) { - SRBTreeNode *right = pNode->right; - - pNode->right = right->left; - if (pNode->right) { - pNode->right->parent = pNode; +static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *x) { + SRBTreeNode *y = x->right; + x->right = y->left; + if (y->left != pTree->NIL) { + y->left->parent = x; } - - right->parent = pNode->parent; - if (pNode->parent == NULL) { - pTree->root = right; - } else if (pNode == pNode->parent->left) { - pNode->parent->left = right; + y->parent = x->parent; + if (x->parent == pTree->NIL) { + pTree->root = y; + } else if (x == x->parent->left) { + x->parent->left = y; } else { - pNode->parent->right = right; + x->parent->right = y; } - - right->left = pNode; - pNode->parent = right; + y->left = x; + x->parent = y; } -static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) { - SRBTreeNode *left = pNode->left; - - pNode->left = left->right; - if (pNode->left) { - pNode->left->parent = pNode; +static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *x) { + SRBTreeNode *y = x->left; + x->left = y->right; + if (y->right != pTree->NIL) { + y->right->parent = x; } - - left->parent = pNode->parent; - if (pNode->parent == NULL) { - pTree->root = left; - } else if (pNode == pNode->parent->left) { - pNode->parent->left = left; + y->parent = x->parent; + if (x->parent == pTree->NIL) { + pTree->root = y; + } else if (x == x->parent->right) { + x->parent->right = y; } else { - pNode->parent->right = left; + x->parent->left = y; } - - left->right = pNode; - pNode->parent = left; + y->right = x; + x->parent = y; } -#define tRBTreeCreate(compare) \ - (SRBTree) { .cmprFn = (compare), .root = NULL } +static void tRBTreePutFix(SRBTree *pTree, SRBTreeNode *z) { + while (z->parent->color == RED) { + if (z->parent == z->parent->parent->left) { // z.parent is the left child -SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) { - pNew->left = NULL; - pNew->right = NULL; - pNew->color = RED; + SRBTreeNode *y = z->parent->parent->right; // uncle of z - // insert - if (pTree->root == NULL) { - pNew->parent = NULL; - pTree->root = pNew; - } else { - SRBTreeNode *pNode = pTree->root; - while (true) { - ASSERT(pNode); - - int32_t c = pTree->cmprFn(pNew->payload, pNode->payload); - if (c < 0) { - if (pNode->left) { - pNode = pNode->left; - } else { - pNew->parent = pNode; - pNode->left = pNew; - break; - } - } else if (c > 0) { - if (pNode->right) { - pNode = pNode->right; - } else { - pNew->parent = pNode; - pNode->right = pNew; - break; + if (y->color == RED) { // case 1 + z->parent->color = BLACK; + y->color = BLACK; + z->parent->parent->color = RED; + z = z->parent->parent; + } else { // case2 or case3 + if (z == z->parent->right) { // case2 + z = z->parent; // marked z.parent as new z + tRBTreeRotateLeft(pTree, z); } + // case3 + z->parent->color = BLACK; // made parent black + z->parent->parent->color = RED; // made parent red + tRBTreeRotateRight(pTree, z->parent->parent); + } + } else { // z.parent is the right child + SRBTreeNode *y = z->parent->parent->left; // uncle of z + + if (y->color == RED) { + z->parent->color = BLACK; + y->color = BLACK; + z->parent->parent->color = RED; + z = z->parent->parent; } else { - return NULL; + if (z == z->parent->left) { + z = z->parent; // marked z.parent as new z + tRBTreeRotateRight(pTree, z); + } + z->parent->color = BLACK; // made parent black + z->parent->parent->color = RED; // made parent red + tRBTreeRotateLeft(pTree, z->parent->parent); } } } + pTree->root->color = BLACK; +} + +static void tRBTreeTransplant(SRBTree *pTree, SRBTreeNode *u, SRBTreeNode *v) { + if (u->parent == pTree->NIL) + pTree->root = v; + else if (u == u->parent->left) + u->parent->left = v; + else + u->parent->right = v; + v->parent = u->parent; +} + +static void tRBTreeDropFix(SRBTree *pTree, SRBTreeNode *x) { + while (x != pTree->root && x->color == BLACK) { + if (x == x->parent->left) { + SRBTreeNode *w = x->parent->right; + if (w->color == RED) { + w->color = BLACK; + x->parent->color = RED; + tRBTreeRotateLeft(pTree, x->parent); + w = x->parent->right; + } + if (w->left->color == BLACK && w->right->color == BLACK) { + w->color = RED; + x = x->parent; + } else { + if (w->right->color == BLACK) { + w->left->color = BLACK; + w->color = RED; + tRBTreeRotateRight(pTree, w); + w = x->parent->right; + } + w->color = x->parent->color; + x->parent->color = BLACK; + w->right->color = BLACK; + tRBTreeRotateLeft(pTree, x->parent); + x = pTree->root; + } + } else { + SRBTreeNode *w = x->parent->left; + if (w->color == RED) { + w->color = BLACK; + x->parent->color = RED; + tRBTreeRotateRight(pTree, x->parent); + w = x->parent->left; + } + if (w->right->color == BLACK && w->left->color == BLACK) { + w->color = RED; + x = x->parent; + } else { + if (w->left->color == BLACK) { + w->right->color = BLACK; + w->color = RED; + tRBTreeRotateLeft(pTree, w); + w = x->parent->left; + } + w->color = x->parent->color; + x->parent->color = BLACK; + w->left->color = BLACK; + tRBTreeRotateRight(pTree, x->parent); + x = pTree->root; + } + } + } + x->color = BLACK; +} + +static SRBTreeNode *tRBTreeSuccessor(SRBTree *pTree, SRBTreeNode *pNode) { + if (pNode->right != pTree->NIL) { + pNode = pNode->right; + while (pNode->left != pTree->NIL) { + pNode = pNode->left; + } + } else { + while (true) { + if (pNode->parent == pTree->NIL || pNode == pNode->parent->left) { + pNode = pNode->parent; + break; + } else { + pNode = pNode->parent; + } + } + } + + return pNode; +} + +static SRBTreeNode *tRBTreePredecessor(SRBTree *pTree, SRBTreeNode *pNode) { + if (pNode->left != pTree->NIL) { + pNode = pNode->left; + while (pNode->right != pTree->NIL) { + pNode = pNode->right; + } + } else { + while (true) { + if (pNode->parent == pTree->NIL || pNode == pNode->parent->right) { + pNode = pNode->parent; + break; + } else { + pNode = pNode->parent; + } + } + } + + return pNode; +} + +void tRBTreeCreate(SRBTree *pTree, tRBTreeCmprFn cmprFn) { + pTree->cmprFn = cmprFn; + pTree->n = 0; + pTree->NIL = &pTree->NILNODE; + pTree->NIL->color = BLACK; + pTree->NIL->parent = NULL; + pTree->NIL->left = NULL; + pTree->NIL->right = NULL; + pTree->root = pTree->NIL; + pTree->min = pTree->NIL; + pTree->max = pTree->NIL; +} + +SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *z) { + SRBTreeNode *y = pTree->NIL; // variable for the parent of the added node + SRBTreeNode *temp = pTree->root; + + while (temp != pTree->NIL) { + y = temp; + + int32_t c = pTree->cmprFn(RBTREE_NODE_PAYLOAD(z), RBTREE_NODE_PAYLOAD(temp)); + if (c < 0) { + temp = temp->left; + } else if (c > 0) { + temp = temp->right; + } else { + return NULL; + } + } + z->parent = y; + + if (y == pTree->NIL) { + pTree->root = z; + } else if (pTree->cmprFn(RBTREE_NODE_PAYLOAD(z), RBTREE_NODE_PAYLOAD(y)) < 0) { + y->left = z; + } else { + y->right = z; + } + + z->color = RED; + z->left = pTree->NIL; + z->right = pTree->NIL; + + tRBTreePutFix(pTree, z); + + // update min/max node + if (pTree->min == pTree->NIL || pTree->cmprFn(RBTREE_NODE_PAYLOAD(pTree->min), RBTREE_NODE_PAYLOAD(z)) > 0) { + pTree->min = z; + } + if (pTree->max == pTree->NIL || pTree->cmprFn(RBTREE_NODE_PAYLOAD(pTree->max), RBTREE_NODE_PAYLOAD(z)) < 0) { + pTree->max = z; + } + pTree->n++; + return z; +} + +void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *z) { + SRBTreeNode *y = z; + SRBTreeNode *x; + ECOLOR y_orignal_color = y->color; + + // update min/max node + if (pTree->min == z) { + pTree->min = tRBTreeSuccessor(pTree, pTree->min); + } + if (pTree->max == z) { + pTree->max = tRBTreePredecessor(pTree, pTree->max); + } + + // drop impl + if (z->left == pTree->NIL) { + x = z->right; + tRBTreeTransplant(pTree, z, z->right); + } else if (z->right == pTree->NIL) { + x = z->left; + tRBTreeTransplant(pTree, z, z->left); + } else { + y = tRBTreeSuccessor(pTree, z); + y_orignal_color = y->color; + x = y->right; + if (y->parent == z) { + x->parent = z; + } else { + tRBTreeTransplant(pTree, y, y->right); + y->right = z->right; + y->right->parent = y; + } + tRBTreeTransplant(pTree, z, y); + y->left = z->left; + y->left->parent = y; + y->color = z->color; + } // fix - SRBTreeNode *pNode = pNew; - while (pNode->parent && pNode->parent->color == RED) { - SRBTreeNode *p = pNode->parent; - SRBTreeNode *g = p->parent; - - if (p == g->left) { - SRBTreeNode *u = g->right; - - if (RBTREE_NODE_COLOR(u) == RED) { - p->color = BLACK; - u->color = BLACK; - g->color = RED; - pNode = g; - } else { - if (pNode == p->right) { - pNode = p; - tRBTreeRotateLeft(pTree, pNode); - } - pNode->parent->color = BLACK; - pNode->parent->parent->color = RED; - tRBTreeRotateRight(pTree, pNode->parent->parent); - } - } else { - SRBTreeNode *u = g->left; - - if (RBTREE_NODE_COLOR(u) == RED) { - p->color = BLACK; - u->color = BLACK; - g->color = RED; - } else { - if (pNode == p->left) { - pNode = p; - tRBTreeRotateRight(pTree, pNode); - } - pNode->parent->color = BLACK; - pNode->parent->parent->color = RED; - tRBTreeRotateLeft(pTree, pNode->parent->parent); - } - } + if (y_orignal_color == BLACK) { + tRBTreeDropFix(pTree, x); } - - pTree->root->color = BLACK; - return pNew; + pTree->n--; } -SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) { - SRBTreeNode *pNode = pTree->root; - - while (pNode) { - int32_t c = pTree->cmprFn(pKey, pNode->payload); - - if (c < 0) { - pNode = pNode->left; - } else if (c > 0) { - pNode = pNode->right; - } else { - break; - } - } +SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey) { + SRBTreeNode *pNode = tRBTreeGet(pTree, pKey); if (pNode) { - // TODO + tRBTreeDrop(pTree, pNode); } return pNode; @@ -194,8 +312,8 @@ SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) { SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) { SRBTreeNode *pNode = pTree->root; - while (pNode) { - int32_t c = pTree->cmprFn(pKey, pNode->payload); + while (pNode != pTree->NIL) { + int32_t c = pTree->cmprFn(pKey, RBTREE_NODE_PAYLOAD(pNode)); if (c < 0) { pNode = pNode->left; @@ -206,5 +324,23 @@ SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) { } } - return pNode; + return (pNode == pTree->NIL) ? NULL : pNode; } + +// SRBTreeIter ================================================ +SRBTreeNode *tRBTreeIterNext(SRBTreeIter *pIter) { + SRBTreeNode *pNode = pIter->pNode; + + if (pIter->pNode != pIter->pTree->NIL) { + if (pIter->asc) { + // ascend + pIter->pNode = tRBTreeSuccessor(pIter->pTree, pIter->pNode); + } else { + // descend + pIter->pNode = tRBTreePredecessor(pIter->pTree, pIter->pNode); + } + } + +_exit: + return (pNode == pIter->pTree->NIL) ? NULL : pNode; +} \ No newline at end of file diff --git a/source/util/test/CMakeLists.txt b/source/util/test/CMakeLists.txt index d2a503e661..6e42ef7e75 100644 --- a/source/util/test/CMakeLists.txt +++ b/source/util/test/CMakeLists.txt @@ -75,4 +75,12 @@ target_link_libraries(taosbsearchTest os util gtest_main) add_test( NAME taosbsearchTest COMMAND taosbsearchTest +) + +# trbtreeTest +add_executable(rbtreeTest "trbtreeTest.cpp") +target_link_libraries(rbtreeTest os util gtest_main) +add_test( + NAME rbtreeTest + COMMAND rbtreeTest ) \ No newline at end of file diff --git a/source/util/test/trbtreeTest.cpp b/source/util/test/trbtreeTest.cpp new file mode 100644 index 0000000000..cabf315df0 --- /dev/null +++ b/source/util/test/trbtreeTest.cpp @@ -0,0 +1,40 @@ +#include + +#include +#include + +#include "trbtree.h" + +static int32_t tCmprInteger(const void *p1, const void *p2) { + if (*(int *)p1 < *(int *)p2) { + return -1; + } else if (*(int *)p1 > *(int *)p2) { + return 1; + } + return 0; +} + +TEST(trbtreeTest, rbtree_test1) { +#if 0 + SRBTree rt; + tRBTreeCreate(&rt, tCmprInteger); + int a[] = {1, 3, 4, 2, 7, 5, 8}; + + for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { + SRBTreeNode *pNode = (SRBTreeNode *)taosMemoryMalloc(sizeof(*pNode) + sizeof(int)); + *(int *)pNode->payload = a[i]; + + tRBTreePut(&rt, pNode); + } + + SRBTreeIter rti = tRBTreeIterCreate(&rt, 1); + SRBTreeNode *pNode = tRBTreeIterNext(&rti); + int la = 0; + while (pNode) { + GTEST_ASSERT_GT(*(int *)pNode->payload, la); + la = *(int *)pNode->payload; + // printf("%d\n", la); + pNode = tRBTreeIterNext(&rti); + } +#endif +} \ No newline at end of file diff --git a/tests/script/tsim/db/basic1.sim b/tests/script/tsim/db/basic1.sim index 3f6bf05398..5d7d0bd9e9 100644 --- a/tests/script/tsim/db/basic1.sim +++ b/tests/script/tsim/db/basic1.sim @@ -133,10 +133,10 @@ if $data(4)[5] != localhost:7100 then return -1 endi -#sql show vnodes 'localhost:7100' -#if $rows != 9 then -# return -1 -#endi +sql show vnodes 'localhost:7100' +if $rows != 9 then + return -1 +endi print =============== drop database sql drop database d2 diff --git a/tests/script/tsim/parser/slimit_alter_tags.sim b/tests/script/tsim/parser/slimit_alter_tags.sim index 3827b14b45..b5afbfa56e 100644 --- a/tests/script/tsim/parser/slimit_alter_tags.sim +++ b/tests/script/tsim/parser/slimit_alter_tags.sim @@ -128,6 +128,7 @@ if $rows != 5 then return -1 endi if $data00 != $rowNum then + print expect $rowNum , actual: $data00 return -1 endi if $data10 != $rowNum then diff --git a/tests/script/tsim/valgrind/checkError6.sim b/tests/script/tsim/valgrind/checkError6.sim index d85a1bebc8..11a387ed4d 100644 --- a/tests/script/tsim/valgrind/checkError6.sim +++ b/tests/script/tsim/valgrind/checkError6.sim @@ -158,6 +158,8 @@ print =============== restart system sh/exec.sh -n dnode1 -s stop -x SIGINT system sh/exec.sh -n dnode1 -s start -v +sleep 1000 + sql select avg(tbcol) as c from stb sql select avg(tbcol) as c from stb where ts <= 1601481840000 sql select avg(tbcol) as c from stb where tgcol < 5 and ts <= 1601481840000 diff --git a/tests/system-test/fulltest.sh b/tests/system-test/fulltest.sh index 4305ceff56..11df13d451 100755 --- a/tests/system-test/fulltest.sh +++ b/tests/system-test/fulltest.sh @@ -156,8 +156,8 @@ python3 ./test.py -f 2-query/sin.py python3 ./test.py -f 2-query/sin.py -R python3 ./test.py -f 2-query/smaTest.py python3 ./test.py -f 2-query/smaTest.py -R -python3 ./test.py -f 2-query/sml.py -python3 ./test.py -f 2-query/sml.py -R +#python3 ./test.py -f 2-query/sml.py +#python3 ./test.py -f 2-query/sml.py -R python3 ./test.py -f 2-query/spread.py python3 ./test.py -f 2-query/spread.py -R python3 ./test.py -f 2-query/sqrt.py @@ -512,6 +512,6 @@ python3 ./test.py -f 2-query/count_partition.py -Q 3 python3 ./test.py -f 2-query/max_partition.py -Q 3 python3 ./test.py -f 2-query/last_row.py -Q 3 python3 ./test.py -f 2-query/tsbsQuery.py -Q 3 -python3 ./test.py -f 2-query/sml.py -Q 3 +#python3 ./test.py -f 2-query/sml.py -Q 3 python3 ./test.py -f 2-query/interp.py -Q 3 diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt new file mode 100644 index 0000000000..59cbbb3147 --- /dev/null +++ b/utils/CMakeLists.txt @@ -0,0 +1,4 @@ +#ADD_SUBDIRECTORY(examples/c) +ADD_SUBDIRECTORY(tsim) +ADD_SUBDIRECTORY(test/c) +#ADD_SUBDIRECTORY(comparisonTest/tdengine) diff --git a/tests/test/c/CMakeLists.txt b/utils/test/c/CMakeLists.txt similarity index 97% rename from tests/test/c/CMakeLists.txt rename to utils/test/c/CMakeLists.txt index 31331b5265..839c65b633 100644 --- a/tests/test/c/CMakeLists.txt +++ b/utils/test/c/CMakeLists.txt @@ -1,4 +1,5 @@ add_executable(tmq_demo tmqDemo.c) +add_dependencies(tmq_demo taos) add_executable(tmq_sim tmqSim.c) add_executable(create_table createTable.c) add_executable(tmq_taosx_ci tmq_taosx_ci.c) diff --git a/tests/test/c/createTable.c b/utils/test/c/createTable.c similarity index 100% rename from tests/test/c/createTable.c rename to utils/test/c/createTable.c diff --git a/tests/test/c/sdbDump.c b/utils/test/c/sdbDump.c similarity index 100% rename from tests/test/c/sdbDump.c rename to utils/test/c/sdbDump.c diff --git a/tests/test/c/sml_test.c b/utils/test/c/sml_test.c similarity index 100% rename from tests/test/c/sml_test.c rename to utils/test/c/sml_test.c diff --git a/tests/test/c/tmqDemo.c b/utils/test/c/tmqDemo.c similarity index 100% rename from tests/test/c/tmqDemo.c rename to utils/test/c/tmqDemo.c diff --git a/tests/test/c/tmqSim.c b/utils/test/c/tmqSim.c similarity index 100% rename from tests/test/c/tmqSim.c rename to utils/test/c/tmqSim.c diff --git a/tests/test/c/tmq_taosx_ci.c b/utils/test/c/tmq_taosx_ci.c similarity index 100% rename from tests/test/c/tmq_taosx_ci.c rename to utils/test/c/tmq_taosx_ci.c diff --git a/tests/tsim/CMakeLists.txt b/utils/tsim/CMakeLists.txt similarity index 100% rename from tests/tsim/CMakeLists.txt rename to utils/tsim/CMakeLists.txt diff --git a/tests/tsim/inc/simInt.h b/utils/tsim/inc/simInt.h similarity index 100% rename from tests/tsim/inc/simInt.h rename to utils/tsim/inc/simInt.h diff --git a/tests/tsim/inc/simParse.h b/utils/tsim/inc/simParse.h similarity index 100% rename from tests/tsim/inc/simParse.h rename to utils/tsim/inc/simParse.h diff --git a/tests/tsim/src/simExe.c b/utils/tsim/src/simExe.c similarity index 100% rename from tests/tsim/src/simExe.c rename to utils/tsim/src/simExe.c diff --git a/tests/tsim/src/simMain.c b/utils/tsim/src/simMain.c similarity index 100% rename from tests/tsim/src/simMain.c rename to utils/tsim/src/simMain.c diff --git a/tests/tsim/src/simParse.c b/utils/tsim/src/simParse.c similarity index 100% rename from tests/tsim/src/simParse.c rename to utils/tsim/src/simParse.c diff --git a/tests/tsim/src/simSystem.c b/utils/tsim/src/simSystem.c similarity index 100% rename from tests/tsim/src/simSystem.c rename to utils/tsim/src/simSystem.c