diff --git a/docs/en/07-develop/02-model/index.mdx b/docs/en/07-develop/02-model/index.mdx index e0378cc77c..b647c845d0 100644 --- a/docs/en/07-develop/02-model/index.mdx +++ b/docs/en/07-develop/02-model/index.mdx @@ -9,15 +9,15 @@ The data model employed by TDengine is similar to that of a relational database. The [characteristics of time-series data](https://www.taosdata.com/blog/2019/07/09/86.html) from different data collection points may be different. Characteristics include collection frequency, retention policy and others which determine how you create and configure the database. For e.g. days to keep, number of replicas, data block size, whether data updates are allowed and other configurable parameters would be determined by the characteristics of your data and your business requirements. For TDengine to operate with the best performance, we strongly recommend that you create and configure different databases for data with different characteristics. This allows you, for example, to set up different storage and retention policies. When creating a database, there are a lot of parameters that can be configured such as, the days to keep data, the number of replicas, the number of memory blocks, time precision, the minimum and maximum number of rows in each data block, whether compression is enabled, the time range of the data in single data file and so on. Below is an example of the SQL statement to create a database. ```sql -CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 6 UPDATE 1; +CREATE DATABASE power KEEP 365 DURATION 10 BUFFER 16 VGROUPS 100 WAL 1; ``` In the above SQL statement: - a database named "power" will be created - the data in it will be kept for 365 days, which means that data older than 365 days will be deleted automatically - a new data file will be created every 10 days -- the number of memory blocks is 6 -- data is allowed to be updated +- the size of memory cache for writing is 16 MB +- data will be firstly written to WAL without FSYNC For more details please refer to [Database](/taos-sql/database). @@ -30,7 +30,6 @@ USE power; :::note - Any table or STable must belong to a database. To create a table or STable, the database it belongs to must be ready. -- JOIN operations can't be performed on tables from two different databases. - Timestamp needs to be specified when inserting rows or querying historical rows. ::: @@ -52,7 +51,7 @@ Similar to creating a regular table, when creating a STable, the name and schema For each kind of data collection point, a corresponding STable must be created. There may be many STables in an application. For electrical power system, we need to create a STable respectively for meters, transformers, busbars, switches. There may be multiple kinds of data collection points on a single device, for example there may be one data collection point for electrical data like current and voltage and another data collection point for environmental data like temperature, humidity and wind direction. Multiple STables are required for these kinds of devices. -At most 4096 (or 1024 prior to version 2.1.7.0) columns are allowed in a STable. If there are more than 4096 of metrics to be collected for a data collection point, multiple STables are required. There can be multiple databases in a system, while one or more STables can exist in a database. +At most 4096 columns are allowed in a STable. If there are more than 4096 of metrics to be collected for a data collection point, multiple STables are required. There can be multiple databases in a system, while one or more STables can exist in a database. ## Create Table @@ -66,12 +65,11 @@ In the above SQL statement, "d1001" is the table name, "meters" is the STable na In the TDengine system, it's recommended to create a table for a data collection point via STable. A table created via STable is called subtable in some parts of the TDengine documentation. All SQL commands applied on regular tables can be applied on subtables. -:::warning -It's not recommended to create a table in a database while using a STable from another database as template. - :::tip It's suggested to use the globally unique ID of a data collection point as the table name. For example the device serial number could be used as a unique ID. If a unique ID doesn't exist, multiple IDs that are not globally unique can be combined to form a globally unique ID. It's not recommended to use a globally unique ID as tag value. +::: + ## Create Table Automatically In some circumstances, it's unknown whether the table already exists when inserting rows. The table can be created automatically using the SQL statement below, and nothing will happen if the table already exists. diff --git a/docs/en/12-taos-sql/02-database.md b/docs/en/12-taos-sql/02-database.md index 80581b2f1b..c2961d6241 100644 --- a/docs/en/12-taos-sql/02-database.md +++ b/docs/en/12-taos-sql/02-database.md @@ -32,7 +32,6 @@ CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [DAYS days] [UPDATE 1]; - cacheLast: [Description](/reference/config/#cachelast) - replica: [Description](/reference/config/#replica) - quorum: [Description](/reference/config/#quorum) - - maxVgroupsPerDb: [Description](/reference/config/#maxvgroupsperdb) - comp: [Description](/reference/config/#comp) - precision: [Description](/reference/config/#precision) 6. Please note that all of the parameters mentioned in this section are configured in configuration file `taos.cfg` on the TDengine server. If not specified in the `create database` statement, the values from taos.cfg are used by default. To override default parameters, they must be specified in the `create database` statement. diff --git a/docs/zh/07-develop/02-model/index.mdx b/docs/zh/07-develop/02-model/index.mdx index 7e2762b6e7..be545e8813 100644 --- a/docs/zh/07-develop/02-model/index.mdx +++ b/docs/zh/07-develop/02-model/index.mdx @@ -8,13 +8,13 @@ TDengine 采用类关系型数据模型,需要建库、建表。因此对于 ## 创建库 -不同类型的数据采集点往往具有不同的数据特征,包括数据采集频率的高低,数据保留时间的长短,副本的数目,数据块的大小,是否允许更新数据等等。为了在各种场景下 TDengine 都能最大效率的工作,TDengine 建议将不同数据特征的表创建在不同的库里,因为每个库可以配置不同的存储策略。创建一个库时,除 SQL 标准的选项外,还可以指定保留时长、副本数、内存块个数、时间精度、文件块里最大最小记录条数、是否压缩、一个数据文件覆盖的天数等多种参数。比如: +不同类型的数据采集点往往具有不同的数据特征,包括数据采集频率的高低,数据保留时间的长短,副本的数目,数据块的大小,是否允许更新数据等等。为了在各种场景下 TDengine 都能最大效率的工作,TDengine 建议将不同数据特征的表创建在不同的库里,因为每个库可以配置不同的存储策略。创建一个库时,除 SQL 标准的选项外,还可以指定保留时长、副本数、缓存大小、时间精度、文件块里最大最小记录条数、是否压缩、一个数据文件覆盖的天数等多种参数。比如: ```sql -CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 6 UPDATE 1; +CREATE DATABASE power KEEP 365 DURATION 10 BUFFER 16 VGROUPS 100 WAL 1; ``` -上述语句将创建一个名为 power 的库,这个库的数据将保留 365 天(超过 365 天将被自动删除),每 10 天一个数据文件,内存块数为 6,允许更新数据。详细的语法及参数请见 [数据库管理](/taos-sql/database) 章节。 +上述语句将创建一个名为 power 的库,这个库的数据将保留 365 天(超过 365 天将被自动删除),每 10 天一个数据文件,每个 VNODE 的写入内存池的大小为 16 MB,数据库的 VGROUPS 数量,对该数据库入会写 WAL 但不执行 FSYNC。详细的语法及参数请见 [数据库管理](/taos-sql/database) 章节。 创建库之后,需要使用 SQL 命令 `USE` 将当前库切换过来,例如: @@ -27,7 +27,6 @@ USE power; :::note - 任何一张表或超级表必须属于某个库,在创建表之前,必须先创建库。 -- 处于两个不同库的表是不能进行 JOIN 操作的。 - 创建并插入记录、查询历史记录的时候,均需要指定时间戳。 ::: @@ -40,15 +39,11 @@ USE power; CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int); ``` -:::note -这一指令中的 STABLE 关键字,在 2.0.15 之前的版本中需写作 TABLE 。 -::: - 与创建普通表一样,创建超级表时,需要提供表名(示例中为 meters),表结构 Schema,即数据列的定义。第一列必须为时间戳(示例中为 ts),其他列为采集的物理量(示例中为 current, voltage, phase),数据类型可以为整型、浮点型、字符串等。除此之外,还需要提供标签的 schema (示例中为 location, groupId),标签的数据类型可以为整型、浮点型、字符串等。采集点的静态属性往往可以作为标签,比如采集点的地理位置、设备型号、设备组 ID、管理员 ID 等等。标签的 schema 可以事后增加、删除、修改。具体定义以及细节请见 [TAOS SQL 的超级表管理](/taos-sql/stable) 章节。 每一种类型的数据采集点需要建立一个超级表,因此一个物联网系统,往往会有多个超级表。对于电网,我们就需要对智能电表、变压器、母线、开关等都建立一个超级表。在物联网中,一个设备就可能有多个数据采集点(比如一台风力发电的风机,有的采集点采集电流、电压等电参数,有的采集点采集温度、湿度、风向等环境参数),这个时候,对这一类型的设备,需要建立多张超级表。 -一张超级表最多容许 4096 列 (在 2.1.7.0 版本之前,列数限制为 1024 列),如果一个采集点采集的物理量个数超过 4096,需要建多张超级表来处理。一个系统可以有多个 DB,一个 DB 里可以有一到多个超级表。 +一张超级表最多容许 4096 列,如果一个采集点采集的物理量个数超过 4096,需要建多张超级表来处理。一个系统可以有多个 DB,一个 DB 里可以有一到多个超级表。 ## 创建表 @@ -60,11 +55,6 @@ CREATE TABLE d1001 USING meters TAGS ("California.SanFrancisco", 2); 其中 d1001 是表名,meters 是超级表的表名,后面紧跟标签 Location 的具体标签值 "California.SanFrancisco",标签 groupId 的具体标签值 2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 [TAOS SQL 的表管理](/taos-sql/table) 章节。 -:::warning -目前 TDengine 没有从技术层面限制使用一个 database (db1) 的超级表作为模板建立另一个 database (db2) 的子表,后续会禁止这种用法,不建议使用这种方法建表。 - -::: - TDengine 建议将数据采集点的全局唯一 ID 作为表名(比如设备序列号)。但对于有的场景,并没有唯一的 ID,可以将多个 ID 组合成一个唯一的 ID。不建议将具有唯一性的 ID 作为标签值。 ### 自动建表 diff --git a/docs/zh/12-taos-sql/02-database.md b/docs/zh/12-taos-sql/02-database.md index 566fec3241..e3a0aa7c87 100644 --- a/docs/zh/12-taos-sql/02-database.md +++ b/docs/zh/12-taos-sql/02-database.md @@ -32,7 +32,6 @@ CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [DAYS days] [UPDATE 1]; - cacheLast: [详细说明](/reference/config/#cachelast) - replica: [详细说明](/reference/config/#replica) - quorum: [详细说明](/reference/config/#quorum) - - maxVgroupsPerDb: [详细说明](/reference/config/#maxvgroupsperdb) - comp: [详细说明](/reference/config/#comp) - precision: [详细说明](/reference/config/#precision) 6. 请注意上面列出的所有参数都可以配置在配置文件 `taosd.cfg` 中作为创建数据库时使用的默认配置, `create database` 的参数中明确指定的会覆盖配置文件中的设置。 diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 41674b7a70..944eaa28bc 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -67,7 +67,6 @@ extern int32_t tsNumOfVnodeQueryThreads; extern int32_t tsNumOfVnodeFetchThreads; extern int32_t tsNumOfVnodeWriteThreads; extern int32_t tsNumOfVnodeSyncThreads; -extern int32_t tsNumOfVnodeMergeThreads; extern int32_t tsNumOfQnodeQueryThreads; extern int32_t tsNumOfQnodeFetchThreads; extern int32_t tsNumOfSnodeSharedThreads; diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 03b456b212..0ab65e7978 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -55,11 +55,11 @@ extern int32_t tMsgDict[]; #define TMSG_SEG_CODE(TYPE) (((TYPE)&0xff00) >> 8) #define TMSG_SEG_SEQ(TYPE) ((TYPE)&0xff) -#define TMSG_INFO(TYPE) \ - ((TYPE) >= 0 && \ - ((TYPE) < TDMT_DND_MAX_MSG || (TYPE) < TDMT_MND_MAX_MSG || (TYPE) < TDMT_VND_MAX_MSG || (TYPE) < TDMT_SCH_MAX_MSG || \ - (TYPE) < TDMT_STREAM_MAX_MSG || (TYPE) < TDMT_MON_MAX_MSG || (TYPE) < TDMT_SYNC_MAX_MSG)) \ - ? tMsgInfo[tMsgDict[TMSG_SEG_CODE(TYPE)] + TMSG_SEG_SEQ(TYPE)] \ +#define TMSG_INFO(TYPE) \ + ((TYPE) >= 0 && ((TYPE) < TDMT_DND_MAX_MSG || (TYPE) < TDMT_MND_MAX_MSG || (TYPE) < TDMT_VND_MAX_MSG || \ + (TYPE) < TDMT_SCH_MAX_MSG || (TYPE) < TDMT_STREAM_MAX_MSG || (TYPE) < TDMT_MON_MAX_MSG || \ + (TYPE) < TDMT_SYNC_MAX_MSG)) \ + ? tMsgInfo[tMsgDict[TMSG_SEG_CODE(TYPE)] + TMSG_SEG_SEQ(TYPE)] \ : 0 #define TMSG_INDEX(TYPE) (tMsgDict[TMSG_SEG_CODE(TYPE)] + TMSG_SEG_SEQ(TYPE)) @@ -723,7 +723,7 @@ typedef struct { int32_t buffer; // MB int32_t pageSize; int32_t pages; - int32_t lastRowMem; + int32_t cacheLastSize; int32_t daysPerFile; int32_t daysToKeep0; int32_t daysToKeep1; @@ -736,7 +736,7 @@ typedef struct { int8_t compression; int8_t replications; int8_t strict; - int8_t cacheLastRow; + int8_t cacheLast; int8_t schemaless; int8_t ignoreExist; int32_t numOfRetensions; @@ -752,7 +752,7 @@ typedef struct { int32_t buffer; int32_t pageSize; int32_t pages; - int32_t lastRowMem; + int32_t cacheLastSize; int32_t daysPerFile; int32_t daysToKeep0; int32_t daysToKeep1; @@ -760,7 +760,7 @@ typedef struct { int32_t fsyncPeriod; int8_t walLevel; int8_t strict; - int8_t cacheLastRow; + int8_t cacheLast; int8_t replications; } SAlterDbReq; @@ -815,6 +815,27 @@ typedef struct { int32_t tSerializeSDbCfgReq(void* buf, int32_t bufLen, SDbCfgReq* pReq); int32_t tDeserializeSDbCfgReq(void* buf, int32_t bufLen, SDbCfgReq* pReq); +typedef struct { + char db[TSDB_DB_FNAME_LEN]; +} STrimDbReq; + +int32_t tSerializeSTrimDbReq(void* buf, int32_t bufLen, STrimDbReq* pReq); +int32_t tDeserializeSTrimDbReq(void* buf, int32_t bufLen, STrimDbReq* pReq); + +typedef struct { + int32_t timestamp; +} SVTrimDbReq; + +int32_t tSerializeSVTrimDbReq(void* buf, int32_t bufLen, SVTrimDbReq* pReq); +int32_t tDeserializeSVTrimDbReq(void* buf, int32_t bufLen, SVTrimDbReq* pReq); + +typedef struct { + int32_t timestamp; +} SVDropTtlTableReq; + +int32_t tSerializeSVDropTtlTableReq(void* buf, int32_t bufLen, SVDropTtlTableReq* pReq); +int32_t tDeserializeSVDropTtlTableReq(void* buf, int32_t bufLen, SVDropTtlTableReq* pReq); + typedef struct { int32_t numOfVgroups; int32_t numOfStables; @@ -833,7 +854,7 @@ typedef struct { int8_t compression; int8_t replications; int8_t strict; - int8_t cacheLastRow; + int8_t cacheLast; int32_t numOfRetensions; SArray* pRetensions; int8_t schemaless; @@ -1098,7 +1119,7 @@ typedef struct { int32_t buffer; int32_t pageSize; int32_t pages; - int32_t lastRowMem; + int32_t cacheLastSize; int32_t daysPerFile; int32_t daysToKeep0; int32_t daysToKeep1; @@ -1113,7 +1134,7 @@ typedef struct { int8_t precision; int8_t compression; int8_t strict; - int8_t cacheLastRow; + int8_t cacheLast; int8_t isTsma; int8_t standby; int8_t replica; @@ -1151,7 +1172,7 @@ typedef struct { int32_t buffer; int32_t pageSize; int32_t pages; - int32_t lastRowMem; + int32_t cacheLastSize; int32_t daysPerFile; int32_t daysToKeep0; int32_t daysToKeep1; @@ -1159,7 +1180,7 @@ typedef struct { int32_t fsyncPeriod; int8_t walLevel; int8_t strict; - int8_t cacheLastRow; + int8_t cacheLast; int8_t selfIndex; int8_t replica; SReplica replicas[TSDB_MAX_REPLICA]; diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h index 8b39530e84..488bc6346e 100644 --- a/include/common/tmsgdef.h +++ b/include/common/tmsgdef.h @@ -116,6 +116,7 @@ enum { TD_DEF_MSG_TYPE(TDMT_MND_ALTER_DB, "alter-db", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_SYNC_DB, "sync-db", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_COMPACT_DB, "compact-db", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_MND_TRIM_DB, "trim-db", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_GET_DB_CFG, "get-db-cfg", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_VGROUP_LIST, "vgroup-list", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_CREATE_FUNC, "create-func", NULL, NULL) @@ -198,9 +199,10 @@ enum { TD_DEF_MSG_TYPE(TDMT_VND_ALTER_REPLICA, "alter-replica", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_ALTER_CONFIRM, "alter-confirm", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_ALTER_HASHRANGE, "alter-hashrange", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_VND_COMPACT, "compact", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_VND_DROP_TTL_TABLE, "drop-ttl-stb", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_VND_COMMIT, "commit vnode", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_COMPACT, "vnode-compact", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_DROP_TTL_TABLE, "vnode-drop-ttl-stb", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_TRIM, "vnode-trim", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_COMMIT, "vnode-commit", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_MAX_MSG, "vnd-max", NULL, NULL) TD_NEW_MSG_SEG(TDMT_SCH_MSG) diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 5deec2d5f6..29dd4daa25 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -74,201 +74,202 @@ #define TK_DATABASE 56 #define TK_USE 57 #define TK_FLUSH 58 -#define TK_IF 59 -#define TK_NOT 60 -#define TK_EXISTS 61 -#define TK_BUFFER 62 -#define TK_CACHELAST 63 -#define TK_CACHELASTSIZE 64 -#define TK_COMP 65 -#define TK_DURATION 66 -#define TK_NK_VARIABLE 67 -#define TK_FSYNC 68 -#define TK_MAXROWS 69 -#define TK_MINROWS 70 -#define TK_KEEP 71 -#define TK_PAGES 72 -#define TK_PAGESIZE 73 -#define TK_PRECISION 74 -#define TK_REPLICA 75 -#define TK_STRICT 76 -#define TK_WAL 77 -#define TK_VGROUPS 78 -#define TK_SINGLE_STABLE 79 -#define TK_RETENTIONS 80 -#define TK_SCHEMALESS 81 -#define TK_NK_COLON 82 -#define TK_TABLE 83 -#define TK_NK_LP 84 -#define TK_NK_RP 85 -#define TK_STABLE 86 -#define TK_ADD 87 -#define TK_COLUMN 88 -#define TK_MODIFY 89 -#define TK_RENAME 90 -#define TK_TAG 91 -#define TK_SET 92 -#define TK_NK_EQ 93 -#define TK_USING 94 -#define TK_TAGS 95 -#define TK_COMMENT 96 -#define TK_BOOL 97 -#define TK_TINYINT 98 -#define TK_SMALLINT 99 -#define TK_INT 100 -#define TK_INTEGER 101 -#define TK_BIGINT 102 -#define TK_FLOAT 103 -#define TK_DOUBLE 104 -#define TK_BINARY 105 -#define TK_TIMESTAMP 106 -#define TK_NCHAR 107 -#define TK_UNSIGNED 108 -#define TK_JSON 109 -#define TK_VARCHAR 110 -#define TK_MEDIUMBLOB 111 -#define TK_BLOB 112 -#define TK_VARBINARY 113 -#define TK_DECIMAL 114 -#define TK_MAX_DELAY 115 -#define TK_WATERMARK 116 -#define TK_ROLLUP 117 -#define TK_TTL 118 -#define TK_SMA 119 -#define TK_FIRST 120 -#define TK_LAST 121 -#define TK_SHOW 122 -#define TK_DATABASES 123 -#define TK_TABLES 124 -#define TK_STABLES 125 -#define TK_MNODES 126 -#define TK_MODULES 127 -#define TK_QNODES 128 -#define TK_FUNCTIONS 129 -#define TK_INDEXES 130 -#define TK_ACCOUNTS 131 -#define TK_APPS 132 -#define TK_CONNECTIONS 133 -#define TK_LICENCE 134 -#define TK_GRANTS 135 -#define TK_QUERIES 136 -#define TK_SCORES 137 -#define TK_TOPICS 138 -#define TK_VARIABLES 139 -#define TK_BNODES 140 -#define TK_SNODES 141 -#define TK_CLUSTER 142 -#define TK_TRANSACTIONS 143 -#define TK_DISTRIBUTED 144 -#define TK_CONSUMERS 145 -#define TK_SUBSCRIPTIONS 146 -#define TK_LIKE 147 -#define TK_INDEX 148 -#define TK_FUNCTION 149 -#define TK_INTERVAL 150 -#define TK_TOPIC 151 -#define TK_AS 152 -#define TK_WITH 153 -#define TK_META 154 -#define TK_CONSUMER 155 -#define TK_GROUP 156 -#define TK_DESC 157 -#define TK_DESCRIBE 158 -#define TK_RESET 159 -#define TK_QUERY 160 -#define TK_CACHE 161 -#define TK_EXPLAIN 162 -#define TK_ANALYZE 163 -#define TK_VERBOSE 164 -#define TK_NK_BOOL 165 -#define TK_RATIO 166 -#define TK_NK_FLOAT 167 -#define TK_COMPACT 168 -#define TK_VNODES 169 -#define TK_IN 170 -#define TK_OUTPUTTYPE 171 -#define TK_AGGREGATE 172 -#define TK_BUFSIZE 173 -#define TK_STREAM 174 -#define TK_INTO 175 -#define TK_TRIGGER 176 -#define TK_AT_ONCE 177 -#define TK_WINDOW_CLOSE 178 -#define TK_IGNORE 179 -#define TK_EXPIRED 180 -#define TK_KILL 181 -#define TK_CONNECTION 182 -#define TK_TRANSACTION 183 -#define TK_BALANCE 184 -#define TK_VGROUP 185 -#define TK_MERGE 186 -#define TK_REDISTRIBUTE 187 -#define TK_SPLIT 188 -#define TK_SYNCDB 189 -#define TK_DELETE 190 -#define TK_INSERT 191 -#define TK_NULL 192 -#define TK_NK_QUESTION 193 -#define TK_NK_ARROW 194 -#define TK_ROWTS 195 -#define TK_TBNAME 196 -#define TK_QSTARTTS 197 -#define TK_QENDTS 198 -#define TK_WSTARTTS 199 -#define TK_WENDTS 200 -#define TK_WDURATION 201 -#define TK_CAST 202 -#define TK_NOW 203 -#define TK_TODAY 204 -#define TK_TIMEZONE 205 -#define TK_CLIENT_VERSION 206 -#define TK_SERVER_VERSION 207 -#define TK_SERVER_STATUS 208 -#define TK_CURRENT_USER 209 -#define TK_COUNT 210 -#define TK_LAST_ROW 211 -#define TK_BETWEEN 212 -#define TK_IS 213 -#define TK_NK_LT 214 -#define TK_NK_GT 215 -#define TK_NK_LE 216 -#define TK_NK_GE 217 -#define TK_NK_NE 218 -#define TK_MATCH 219 -#define TK_NMATCH 220 -#define TK_CONTAINS 221 -#define TK_JOIN 222 -#define TK_INNER 223 -#define TK_SELECT 224 -#define TK_DISTINCT 225 -#define TK_WHERE 226 -#define TK_PARTITION 227 -#define TK_BY 228 -#define TK_SESSION 229 -#define TK_STATE_WINDOW 230 -#define TK_SLIDING 231 -#define TK_FILL 232 -#define TK_VALUE 233 -#define TK_NONE 234 -#define TK_PREV 235 -#define TK_LINEAR 236 -#define TK_NEXT 237 -#define TK_HAVING 238 -#define TK_RANGE 239 -#define TK_EVERY 240 -#define TK_ORDER 241 -#define TK_SLIMIT 242 -#define TK_SOFFSET 243 -#define TK_LIMIT 244 -#define TK_OFFSET 245 -#define TK_ASC 246 -#define TK_NULLS 247 -#define TK_ID 248 -#define TK_NK_BITNOT 249 -#define TK_VALUES 250 -#define TK_IMPORT 251 -#define TK_NK_SEMI 252 -#define TK_FILE 253 +#define TK_TRIM 59 +#define TK_IF 60 +#define TK_NOT 61 +#define TK_EXISTS 62 +#define TK_BUFFER 63 +#define TK_CACHELAST 64 +#define TK_CACHELASTSIZE 65 +#define TK_COMP 66 +#define TK_DURATION 67 +#define TK_NK_VARIABLE 68 +#define TK_FSYNC 69 +#define TK_MAXROWS 70 +#define TK_MINROWS 71 +#define TK_KEEP 72 +#define TK_PAGES 73 +#define TK_PAGESIZE 74 +#define TK_PRECISION 75 +#define TK_REPLICA 76 +#define TK_STRICT 77 +#define TK_WAL 78 +#define TK_VGROUPS 79 +#define TK_SINGLE_STABLE 80 +#define TK_RETENTIONS 81 +#define TK_SCHEMALESS 82 +#define TK_NK_COLON 83 +#define TK_TABLE 84 +#define TK_NK_LP 85 +#define TK_NK_RP 86 +#define TK_STABLE 87 +#define TK_ADD 88 +#define TK_COLUMN 89 +#define TK_MODIFY 90 +#define TK_RENAME 91 +#define TK_TAG 92 +#define TK_SET 93 +#define TK_NK_EQ 94 +#define TK_USING 95 +#define TK_TAGS 96 +#define TK_COMMENT 97 +#define TK_BOOL 98 +#define TK_TINYINT 99 +#define TK_SMALLINT 100 +#define TK_INT 101 +#define TK_INTEGER 102 +#define TK_BIGINT 103 +#define TK_FLOAT 104 +#define TK_DOUBLE 105 +#define TK_BINARY 106 +#define TK_TIMESTAMP 107 +#define TK_NCHAR 108 +#define TK_UNSIGNED 109 +#define TK_JSON 110 +#define TK_VARCHAR 111 +#define TK_MEDIUMBLOB 112 +#define TK_BLOB 113 +#define TK_VARBINARY 114 +#define TK_DECIMAL 115 +#define TK_MAX_DELAY 116 +#define TK_WATERMARK 117 +#define TK_ROLLUP 118 +#define TK_TTL 119 +#define TK_SMA 120 +#define TK_FIRST 121 +#define TK_LAST 122 +#define TK_SHOW 123 +#define TK_DATABASES 124 +#define TK_TABLES 125 +#define TK_STABLES 126 +#define TK_MNODES 127 +#define TK_MODULES 128 +#define TK_QNODES 129 +#define TK_FUNCTIONS 130 +#define TK_INDEXES 131 +#define TK_ACCOUNTS 132 +#define TK_APPS 133 +#define TK_CONNECTIONS 134 +#define TK_LICENCE 135 +#define TK_GRANTS 136 +#define TK_QUERIES 137 +#define TK_SCORES 138 +#define TK_TOPICS 139 +#define TK_VARIABLES 140 +#define TK_BNODES 141 +#define TK_SNODES 142 +#define TK_CLUSTER 143 +#define TK_TRANSACTIONS 144 +#define TK_DISTRIBUTED 145 +#define TK_CONSUMERS 146 +#define TK_SUBSCRIPTIONS 147 +#define TK_LIKE 148 +#define TK_INDEX 149 +#define TK_FUNCTION 150 +#define TK_INTERVAL 151 +#define TK_TOPIC 152 +#define TK_AS 153 +#define TK_WITH 154 +#define TK_META 155 +#define TK_CONSUMER 156 +#define TK_GROUP 157 +#define TK_DESC 158 +#define TK_DESCRIBE 159 +#define TK_RESET 160 +#define TK_QUERY 161 +#define TK_CACHE 162 +#define TK_EXPLAIN 163 +#define TK_ANALYZE 164 +#define TK_VERBOSE 165 +#define TK_NK_BOOL 166 +#define TK_RATIO 167 +#define TK_NK_FLOAT 168 +#define TK_COMPACT 169 +#define TK_VNODES 170 +#define TK_IN 171 +#define TK_OUTPUTTYPE 172 +#define TK_AGGREGATE 173 +#define TK_BUFSIZE 174 +#define TK_STREAM 175 +#define TK_INTO 176 +#define TK_TRIGGER 177 +#define TK_AT_ONCE 178 +#define TK_WINDOW_CLOSE 179 +#define TK_IGNORE 180 +#define TK_EXPIRED 181 +#define TK_KILL 182 +#define TK_CONNECTION 183 +#define TK_TRANSACTION 184 +#define TK_BALANCE 185 +#define TK_VGROUP 186 +#define TK_MERGE 187 +#define TK_REDISTRIBUTE 188 +#define TK_SPLIT 189 +#define TK_SYNCDB 190 +#define TK_DELETE 191 +#define TK_INSERT 192 +#define TK_NULL 193 +#define TK_NK_QUESTION 194 +#define TK_NK_ARROW 195 +#define TK_ROWTS 196 +#define TK_TBNAME 197 +#define TK_QSTARTTS 198 +#define TK_QENDTS 199 +#define TK_WSTARTTS 200 +#define TK_WENDTS 201 +#define TK_WDURATION 202 +#define TK_CAST 203 +#define TK_NOW 204 +#define TK_TODAY 205 +#define TK_TIMEZONE 206 +#define TK_CLIENT_VERSION 207 +#define TK_SERVER_VERSION 208 +#define TK_SERVER_STATUS 209 +#define TK_CURRENT_USER 210 +#define TK_COUNT 211 +#define TK_LAST_ROW 212 +#define TK_BETWEEN 213 +#define TK_IS 214 +#define TK_NK_LT 215 +#define TK_NK_GT 216 +#define TK_NK_LE 217 +#define TK_NK_GE 218 +#define TK_NK_NE 219 +#define TK_MATCH 220 +#define TK_NMATCH 221 +#define TK_CONTAINS 222 +#define TK_JOIN 223 +#define TK_INNER 224 +#define TK_SELECT 225 +#define TK_DISTINCT 226 +#define TK_WHERE 227 +#define TK_PARTITION 228 +#define TK_BY 229 +#define TK_SESSION 230 +#define TK_STATE_WINDOW 231 +#define TK_SLIDING 232 +#define TK_FILL 233 +#define TK_VALUE 234 +#define TK_NONE 235 +#define TK_PREV 236 +#define TK_LINEAR 237 +#define TK_NEXT 238 +#define TK_HAVING 239 +#define TK_RANGE 240 +#define TK_EVERY 241 +#define TK_ORDER 242 +#define TK_SLIMIT 243 +#define TK_SOFFSET 244 +#define TK_LIMIT 245 +#define TK_OFFSET 246 +#define TK_ASC 247 +#define TK_NULLS 248 +#define TK_ID 249 +#define TK_NK_BITNOT 250 +#define TK_VALUES 251 +#define TK_IMPORT 252 +#define TK_NK_SEMI 253 +#define TK_FILE 254 #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 2187a7b03a..5311915612 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -103,6 +103,11 @@ typedef struct SFlushDatabaseStmt { char dbName[TSDB_DB_NAME_LEN]; } SFlushDatabaseStmt; +typedef struct STrimDatabaseStmt { + ENodeType type; + char dbName[TSDB_DB_NAME_LEN]; +} STrimDatabaseStmt; + typedef struct STableOptions { ENodeType type; bool commentNull; diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h index 30bcf22989..c453ce98f8 100644 --- a/include/libs/nodes/nodes.h +++ b/include/libs/nodes/nodes.h @@ -112,6 +112,7 @@ typedef enum ENodeType { QUERY_NODE_DROP_DATABASE_STMT, QUERY_NODE_ALTER_DATABASE_STMT, QUERY_NODE_FLUSH_DATABASE_STMT, + QUERY_NODE_TRIM_DATABASE_STMT, QUERY_NODE_CREATE_TABLE_STMT, QUERY_NODE_CREATE_SUBTABLE_CLAUSE, QUERY_NODE_CREATE_MULTI_TABLE_STMT, diff --git a/include/libs/wal/wal.h b/include/libs/wal/wal.h index 0a8e55bb4f..7e2d09dd63 100644 --- a/include/libs/wal/wal.h +++ b/include/libs/wal/wal.h @@ -45,7 +45,6 @@ extern "C" { #define WAL_MAGIC 0xFAFBFCFDULL typedef enum { - TAOS_WAL_NOLOG = 0, TAOS_WAL_WRITE = 1, TAOS_WAL_FSYNC = 2, } EWalType; @@ -74,7 +73,7 @@ typedef struct { int8_t isWeek; uint64_t seqNum; uint64_t term; -} SSyncLogMeta; +} SWalSyncInfo; typedef struct { int8_t protoVer; @@ -84,7 +83,7 @@ typedef struct { int64_t ingestTs; // not implemented // sync meta - SSyncLogMeta syncMeta; + SWalSyncInfo syncMeta; char body[]; } SWalCont; @@ -149,11 +148,22 @@ SWal *walOpen(const char *path, SWalCfg *pCfg); int32_t walAlter(SWal *, SWalCfg *pCfg); void walClose(SWal *); -// write -int32_t walWriteWithSyncInfo(SWal *, int64_t index, tmsg_t msgType, SSyncLogMeta syncMeta, const void *body, - int32_t bodyLen); +// write interfaces + +// By assigning index by the caller, wal gurantees linearizability int32_t walWrite(SWal *, int64_t index, tmsg_t msgType, const void *body, int32_t bodyLen); -void walFsync(SWal *, bool force); +int32_t walWriteWithSyncInfo(SWal *, int64_t index, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, + int32_t bodyLen); + +// This interface assign version automatically and return to caller. +// When using this interface with concurrent writes, +// wal will write all logs atomically, +// but not sure which one will be actually write first, +// and then the unique index of successful writen is returned. +// -1 will be returned for failed writes +int64_t walAppendLog(SWal *, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, int32_t bodyLen); + +void walFsync(SWal *, bool force); // apis for lifecycle management int32_t walCommit(SWal *, int64_t ver); diff --git a/include/util/tRealloc.h b/include/util/tRealloc.h index 8d40f6cc5d..f3593d5818 100644 --- a/include/util/tRealloc.h +++ b/include/util/tRealloc.h @@ -25,10 +25,11 @@ extern "C" { static FORCE_INLINE int32_t tRealloc(uint8_t **ppBuf, int64_t size) { int32_t code = 0; int64_t bsize = 0; - uint8_t *pBuf; + uint8_t *pBuf = NULL; if (*ppBuf) { - bsize = *(int64_t *)((*ppBuf) - sizeof(int64_t)); + pBuf = (*ppBuf) - sizeof(int64_t); + bsize = *(int64_t *)pBuf; } if (bsize >= size) goto _exit; @@ -38,7 +39,7 @@ static FORCE_INLINE int32_t tRealloc(uint8_t **ppBuf, int64_t size) { bsize *= 2; } - pBuf = (uint8_t *)taosMemoryRealloc(*ppBuf ? (*ppBuf) - sizeof(int64_t) : *ppBuf, bsize + sizeof(int64_t)); + pBuf = (uint8_t *)taosMemoryRealloc(pBuf, bsize + sizeof(int64_t)); if (pBuf == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; diff --git a/include/util/tdef.h b/include/util/tdef.h index 84bc30b9e7..55194d8647 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -331,12 +331,12 @@ typedef enum ELogicConditionType { #define TSDB_DB_STRICT_OFF 0 #define TSDB_DB_STRICT_ON 1 #define TSDB_DEFAULT_DB_STRICT 0 -#define TSDB_MIN_DB_CACHE_LAST_ROW 0 -#define TSDB_MAX_DB_CACHE_LAST_ROW 3 -#define TSDB_DEFAULT_CACHE_LAST_ROW 0 -#define TSDB_MIN_DB_LAST_ROW_MEM 1 // MB -#define TSDB_MAX_DB_LAST_ROW_MEM 65536 -#define TSDB_DEFAULT_LAST_ROW_MEM 1 +#define TSDB_MIN_DB_CACHE_LAST 0 +#define TSDB_MAX_DB_CACHE_LAST 3 +#define TSDB_DEFAULT_CACHE_LAST 0 +#define TSDB_MIN_DB_CACHE_LAST_SIZE 1 // MB +#define TSDB_MAX_DB_CACHE_LAST_SIZE 65536 +#define TSDB_DEFAULT_CACHE_LAST_SIZE 1 #define TSDB_DB_STREAM_MODE_OFF 0 #define TSDB_DB_STREAM_MODE_ON 1 #define TSDB_DEFAULT_DB_STREAM_MODE 0 diff --git a/include/util/thash.h b/include/util/thash.h index fc8785a8fb..781c22a56a 100644 --- a/include/util/thash.h +++ b/include/util/thash.h @@ -188,7 +188,7 @@ void *taosHashGetKey(void *data, size_t* keyLen); void *taosHashAcquire(SHashObj *pHashObj, const void *key, size_t keyLen); /** - * release the prevous acquired obj + * release the previous acquired obj * * @param pHashObj * @param data diff --git a/include/util/tlockfree.h b/include/util/tlockfree.h index 44e43f81cf..54a90d7b71 100644 --- a/include/util/tlockfree.h +++ b/include/util/tlockfree.h @@ -69,13 +69,14 @@ typedef void (*_ref_fn_t)(const void *pObj); #define T_REF_VAL_GET(x) (x)->_ref.val // single writer multiple reader lock -typedef volatile int32_t SRWLatch; +typedef volatile int64_t SRWLatch; -void taosInitRWLatch(SRWLatch *pLatch); -void taosWLockLatch(SRWLatch *pLatch); -void taosWUnLockLatch(SRWLatch *pLatch); -void taosRLockLatch(SRWLatch *pLatch); -void taosRUnLockLatch(SRWLatch *pLatch); +void taosInitRWLatch(SRWLatch *pLatch); +void taosInitReentrantRWLatch(SRWLatch *pLatch); +void taosWLockLatch(SRWLatch *pLatch); +void taosWUnLockLatch(SRWLatch *pLatch); +void taosRLockLatch(SRWLatch *pLatch); +void taosRUnLockLatch(SRWLatch *pLatch); int32_t taosWTryLockLatch(SRWLatch *pLatch); // copy on read diff --git a/packaging/tools/install.sh b/packaging/tools/install.sh index 77817e5cf6..f409834091 100755 --- a/packaging/tools/install.sh +++ b/packaging/tools/install.sh @@ -328,7 +328,7 @@ function install_header() { ${csudo}ln -s ${install_main_dir}/include/taoserror.h ${inc_link_dir}/taoserror.h ${csudo}ln -s ${install_main_dir}/include/taosudf.h ${inc_link_dir}/taosudf.h - ${csudo}ln -s ${install_main_dir}/include/taosws.h ${inc_link_dir}/taosws.h || : + [ -f ${install_main_dir}/include/taosws.h ] && ${csudo}ln -s ${install_main_dir}/include/taosws.h ${inc_link_dir}/taosws.h || : } function add_newHostname_to_hosts() { diff --git a/packaging/tools/makeclient.sh b/packaging/tools/makeclient.sh index 0f1080521e..ca3a9a19be 100755 --- a/packaging/tools/makeclient.sh +++ b/packaging/tools/makeclient.sh @@ -161,13 +161,11 @@ if [[ $productName == "TDengine" ]]; then mkdir -p ${install_dir}/connector if [[ "$pagMode" != "lite" ]] && [[ "$cpuType" != "aarch32" ]]; then if [ "$osType" != "Darwin" ]; then - cp ${build_dir}/lib/*.jar ${install_dir}/connector || : - fi - if find ${connector_dir}/go -mindepth 1 -maxdepth 1 | read; then - cp -r ${connector_dir}/go ${install_dir}/connector - else - echo "WARNING: go connector not found, please check if want to use it!" + [ -f ${build_dir}/lib/*.jar ] && cp ${build_dir}/lib/*.jar ${install_dir}/connector || : fi + git clone --depth 1 https://github.com/taosdata/driver-go ${install_dir}/connector/go + rm -rf ${install_dir}/connector/go/.git ||: + git clone --depth 1 https://github.com/taosdata/taos-connector-python ${install_dir}/connector/python rm -rf ${install_dir}/connector/python/.git ||: # cp -r ${connector_dir}/python ${install_dir}/connector diff --git a/packaging/tools/makepkg.sh b/packaging/tools/makepkg.sh index 7edab2141b..c37397005c 100755 --- a/packaging/tools/makepkg.sh +++ b/packaging/tools/makepkg.sh @@ -290,19 +290,17 @@ fi # Copy driver mkdir -p ${install_dir}/driver && cp ${lib_files} ${install_dir}/driver && echo "${versionComp}" >${install_dir}/driver/vercomp.txt -cp ${wslib_files} ${install_dir}/driver || : +[ -f ${wslib_files} ] && cp ${wslib_files} ${install_dir}/driver || : # Copy connector if [ "$verMode" == "cluster" ]; then connector_dir="${code_dir}/connector" mkdir -p ${install_dir}/connector if [[ "$pagMode" != "lite" ]] && [[ "$cpuType" != "aarch32" ]]; then - cp ${build_dir}/lib/*.jar ${install_dir}/connector || : - if find ${connector_dir}/go -mindepth 1 -maxdepth 1 | read; then - cp -r ${connector_dir}/go ${install_dir}/connector - else - echo "WARNING: go connector not found, please check if want to use it!" - fi + [ -f ${build_dir}/lib/*.jar ] && cp ${build_dir}/lib/*.jar ${install_dir}/connector || : + git clone --depth 1 https://github.com/taosdata/driver-go ${install_dir}/connector/go + rm -rf ${install_dir}/connector/go/.git ||: + git clone --depth 1 https://github.com/taosdata/taos-connector-python ${install_dir}/connector/python rm -rf ${install_dir}/connector/python/.git ||: @@ -314,6 +312,7 @@ if [ "$verMode" == "cluster" ]; then git clone --depth 1 https://github.com/taosdata/libtaos-rs ${install_dir}/connector/rust rm -rf ${install_dir}/connector/rust/.git ||: + # cp -r ${connector_dir}/python ${install_dir}/connector # cp -r ${connector_dir}/nodejs ${install_dir}/connector fi diff --git a/packaging/tools/remove.sh b/packaging/tools/remove.sh index ec836f2eac..1bd5ed3ea4 100755 --- a/packaging/tools/remove.sh +++ b/packaging/tools/remove.sh @@ -114,6 +114,7 @@ function clean_header() { ${csudo}rm -f ${inc_link_dir}/taos.h || : ${csudo}rm -f ${inc_link_dir}/taosdef.h || : ${csudo}rm -f ${inc_link_dir}/taoserror.h || : + ${csudo}rm -f ${inc_link_dir}/taosudf.h || : ${csudo}rm -f ${inc_link_dir}/taosws.h || : } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index a4a5ec7499..25ba63fd34 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -148,7 +148,8 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas return taosConnectImpl(user, &secretEncrypt[0], localDb, NULL, NULL, *pInst, connType); } -int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, bool validateSql, SRequestObj** pRequest) { +int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, bool validateSql, + SRequestObj** pRequest) { *pRequest = createRequest(connId, TSDB_SQL_SELECT); if (*pRequest == NULL) { tscError("failed to malloc sqlObj, %s", sql); @@ -165,7 +166,7 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, strntolower((*pRequest)->sqlstr, sql, (int32_t)sqlLen); (*pRequest)->sqlstr[sqlLen] = 0; - (*pRequest)->sqlLen = sqlLen; + (*pRequest)->sqlLen = sqlLen; (*pRequest)->validateOnly = validateSql; if (param == NULL) { @@ -351,7 +352,8 @@ int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList) { if (pNodeList) { pInfo->pQnodeList = taosArrayDup(pNodeList); taosArraySort(pInfo->pQnodeList, compareQueryNodeLoad); - tscDebug("QnodeList updated in cluster 0x%" PRIx64 ", num:%d", pInfo->clusterId, taosArrayGetSize(pInfo->pQnodeList)); + tscDebug("QnodeList updated in cluster 0x%" PRIx64 ", num:%d", pInfo->clusterId, + taosArrayGetSize(pInfo->pQnodeList)); } taosThreadMutexUnlock(&pInfo->qnodeMutex); @@ -649,22 +651,22 @@ _return: int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList) { void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter; - SExecResult res = {0}; + SExecResult res = {0}; SRequestConnInfo conn = {.pTrans = pRequest->pTscObj->pAppInfo->pTransporter, .requestId = pRequest->requestId, .requestObjRefId = pRequest->self}; SSchedulerReq req = { - .syncReq = true, - .pConn = &conn, - .pNodeList = pNodeList, - .pDag = pDag, - .sql = pRequest->sqlstr, - .startTs = pRequest->metric.start, - .execFp = NULL, - .cbParam = NULL, - .chkKillFp = chkRequestKilled, - .chkKillParam = (void*)pRequest->self, - .pExecRes = &res, + .syncReq = true, + .pConn = &conn, + .pNodeList = pNodeList, + .pDag = pDag, + .sql = pRequest->sqlstr, + .startTs = pRequest->metric.start, + .execFp = NULL, + .cbParam = NULL, + .chkKillFp = chkRequestKilled, + .chkKillParam = (void*)pRequest->self, + .pExecRes = &res, }; int32_t code = schedulerExecJob(&req, &pRequest->body.queryJob); @@ -778,7 +780,7 @@ int32_t handleQueryExecRsp(SRequestObj* pRequest) { return code; } - SEpSet epset = getEpSet_s(&pAppInfo->mgmtEp); + SEpSet epset = getEpSet_s(&pAppInfo->mgmtEp); SExecResult* pRes = &pRequest->body.resInfo.execRes; switch (pRes->msgType) { @@ -808,11 +810,16 @@ int32_t handleQueryExecRsp(SRequestObj* pRequest) { void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { SRequestObj* pRequest = (SRequestObj*)param; pRequest->code = code; - memcpy(&pRequest->body.resInfo.execRes, pResult, sizeof(*pResult)); + + if (pResult) { + memcpy(&pRequest->body.resInfo.execRes, pResult, sizeof(*pResult)); + } if (TDMT_VND_SUBMIT == pRequest->type || TDMT_VND_DELETE == pRequest->type || TDMT_VND_CREATE_TABLE == pRequest->type) { - pRequest->body.resInfo.numOfRows = pResult->numOfRows; + if (pResult) { + pRequest->body.resInfo.numOfRows = pResult->numOfRows; + } schedulerFreeJob(&pRequest->body.queryJob, 0); } @@ -964,17 +971,17 @@ void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultM SRequestConnInfo conn = { .pTrans = pAppInfo->pTransporter, .requestId = pRequest->requestId, .requestObjRefId = pRequest->self}; SSchedulerReq req = { - .syncReq = false, - .pConn = &conn, - .pNodeList = pNodeList, - .pDag = pDag, - .sql = pRequest->sqlstr, - .startTs = pRequest->metric.start, - .execFp = schedulerExecCb, - .cbParam = pRequest, - .chkKillFp = chkRequestKilled, - .chkKillParam = (void*)pRequest->self, - .pExecRes = NULL, + .syncReq = false, + .pConn = &conn, + .pNodeList = pNodeList, + .pDag = pDag, + .sql = pRequest->sqlstr, + .startTs = pRequest->metric.start, + .execFp = schedulerExecCb, + .cbParam = pRequest, + .chkKillFp = chkRequestKilled, + .chkKillParam = (void*)pRequest->self, + .pExecRes = NULL, }; code = schedulerExecJob(&req, &pRequest->body.queryJob); taosArrayDestroy(pNodeList); @@ -993,6 +1000,7 @@ void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultM pRequest->body.queryFp(pRequest->body.param, pRequest, 0); break; default: + pRequest->body.queryFp(pRequest->body.param, pRequest, -1); break; } @@ -1416,9 +1424,9 @@ void* doFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4) } SReqResultInfo* pResInfo = &pRequest->body.resInfo; - SSchedulerReq req = { - .syncReq = true, - .pFetchRes = (void**)&pResInfo->pData, + SSchedulerReq req = { + .syncReq = true, + .pFetchRes = (void**)&pResInfo->pData, }; pRequest->code = schedulerFetchRows(pRequest->body.queryJob, &req); if (pRequest->code != TSDB_CODE_SUCCESS) { @@ -1473,12 +1481,16 @@ void* doAsyncFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertU tsem_wait(&pParam->sem); } - if (pRequest->code == TSDB_CODE_SUCCESS && pResultInfo->numOfRows > 0 && setupOneRowPtr) { - doSetOneRowPtr(pResultInfo); - pResultInfo->current += 1; - } + if (pResultInfo->numOfRows == 0 || pRequest->code != TSDB_CODE_SUCCESS) { + return NULL; + } else { + if (setupOneRowPtr) { + doSetOneRowPtr(pResultInfo); + pResultInfo->current += 1; + } - return pResultInfo->row; + return pResultInfo->row; + } } static int32_t doPrepareResPtr(SReqResultInfo* pResInfo) { diff --git a/source/client/src/clientStmt.c b/source/client/src/clientStmt.c index d653b8720f..92ed830dee 100644 --- a/source/client/src/clientStmt.c +++ b/source/client/src/clientStmt.c @@ -357,6 +357,7 @@ int32_t stmtGetFromCache(STscStmt* pStmt) { pStmt->bInfo.inExecCache = true; if (pStmt->sql.autoCreateTbl) { + tscDebug("reuse stmt block for tb %s in execBlock", pStmt->bInfo.tbFName); return TSDB_CODE_SUCCESS; } } @@ -365,9 +366,11 @@ int32_t stmtGetFromCache(STscStmt* pStmt) { if (pStmt->bInfo.inExecCache) { ASSERT(taosHashGetSize(pStmt->exec.pBlockHash) == 1); pStmt->bInfo.needParse = false; + tscDebug("reuse stmt block for tb %s in execBlock", pStmt->bInfo.tbFName); return TSDB_CODE_SUCCESS; } + tscDebug("no stmt block cache for tb %s", pStmt->bInfo.tbFName); return TSDB_CODE_SUCCESS; } @@ -391,6 +394,8 @@ int32_t stmtGetFromCache(STscStmt* pStmt) { STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } + tscDebug("reuse stmt block for tb %s in sqlBlock, suid:0x%" PRIx64 , pStmt->bInfo.tbFName, pStmt->bInfo.tbSuid); + return TSDB_CODE_SUCCESS; } @@ -406,6 +411,8 @@ int32_t stmtGetFromCache(STscStmt* pStmt) { if (TSDB_CODE_PAR_TABLE_NOT_EXIST == code) { STMT_ERR_RET(stmtCleanBindInfo(pStmt)); + tscDebug("tb %s not exist", pStmt->bInfo.tbFName); + return TSDB_CODE_SUCCESS; } @@ -420,6 +427,8 @@ int32_t stmtGetFromCache(STscStmt* pStmt) { if (uid == pStmt->bInfo.tbUid) { pStmt->bInfo.needParse = false; + tscDebug("tb %s is current table", pStmt->bInfo.tbFName); + return TSDB_CODE_SUCCESS; } @@ -440,6 +449,8 @@ int32_t stmtGetFromCache(STscStmt* pStmt) { pStmt->bInfo.boundTags = pCache->boundTags; pStmt->bInfo.tagsCached = true; + tscDebug("tb %s in execBlock list, set to current", pStmt->bInfo.tbFName); + return TSDB_CODE_SUCCESS; } @@ -461,6 +472,8 @@ int32_t stmtGetFromCache(STscStmt* pStmt) { STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } + tscDebug("tb %s in sqlBlock list, set to current", pStmt->bInfo.tbFName); + return TSDB_CODE_SUCCESS; } @@ -510,6 +523,8 @@ TAOS_STMT* stmtInit(STscObj* taos) { int stmtPrepare(TAOS_STMT* stmt, const char* sql, unsigned long length) { STscStmt* pStmt = (STscStmt*)stmt; + tscDebug("stmt start to prepare"); + if (pStmt->sql.status >= STMT_PREPARE) { STMT_ERR_RET(stmtResetStmt(pStmt)); } @@ -529,6 +544,8 @@ int stmtPrepare(TAOS_STMT* stmt, const char* sql, unsigned long length) { int stmtSetTbName(TAOS_STMT* stmt, const char* tbName) { STscStmt* pStmt = (STscStmt*)stmt; + tscDebug("stmt start to set tbName: %s", tbName); + STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTBNAME)); int32_t insert = 0; @@ -559,6 +576,8 @@ int stmtSetTbName(TAOS_STMT* stmt, const char* tbName) { int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) { STscStmt* pStmt = (STscStmt*)stmt; + tscDebug("stmt start to set tbTags"); + STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTAGS)); if (pStmt->bInfo.inExecCache) { @@ -572,6 +591,7 @@ int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) { STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR); } + tscDebug("start to bind stmt tag values"); STMT_ERR_RET(qBindStmtTagsValue(*pDataBlock, pStmt->bInfo.boundTags, pStmt->bInfo.tbSuid, pStmt->bInfo.sname.tname, tags, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen)); @@ -617,6 +637,8 @@ int stmtFetchColFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD_E** fields int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) { STscStmt* pStmt = (STscStmt*)stmt; + tscDebug("start to bind stmt data, colIdx: %d", colIdx); + STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_BIND)); if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 && @@ -707,6 +729,8 @@ int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) { int stmtAddBatch(TAOS_STMT* stmt) { STscStmt* pStmt = (STscStmt*)stmt; + tscDebug("stmt start to add batch"); + STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_ADD_BATCH)); STMT_ERR_RET(stmtCacheBlock(pStmt)); @@ -715,6 +739,8 @@ int stmtAddBatch(TAOS_STMT* stmt) { } int stmtUpdateTableUid(STscStmt* pStmt, SSubmitRsp* pRsp) { + tscDebug("stmt start to update tbUid, blockNum: %d", pRsp->nBlocks); + if (pRsp->nBlocks <= 0) { tscError("invalid submit resp block number %d", pRsp->nBlocks); STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR); @@ -727,11 +753,6 @@ int stmtUpdateTableUid(STscStmt* pStmt, SSubmitRsp* pRsp) { char* key = taosHashGetKey(pIter, &keyLen); STableMeta* pMeta = qGetTableMetaInDataBlock(pBlock); - if (pMeta->uid != pStmt->bInfo.tbUid) { - tscError("table uid %" PRIx64 " mis-match with current table uid %" PRIx64, pMeta->uid, pStmt->bInfo.tbUid); - STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR); - } - if (pMeta->uid) { pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter); continue; @@ -775,6 +796,8 @@ int stmtExec(TAOS_STMT* stmt) { SSubmitRsp* pRsp = NULL; bool autoCreateTbl = pStmt->exec.autoCreateTbl; + tscDebug("stmt start to exec"); + STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_EXECUTE)); if (STMT_TYPE_QUERY == pStmt->sql.type) { diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 3bb829f77a..38f46b9b11 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -463,6 +463,7 @@ SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int3 pDst->info = pBlock->info; pDst->info.rows = 0; + pDst->info.capacity = 0; size_t numOfCols = taosArrayGetSize(pBlock->pDataBlock); for (int32_t i = 0; i < numOfCols; ++i) { SColumnInfoData colInfo = {0}; @@ -1746,7 +1747,7 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf) for (int32_t k = 0; k < colNum; k++) { SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, k); void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes); - if (colDataIsNull(pColInfoData, rows, j, NULL) || !var) { + if (colDataIsNull(pColInfoData, rows, j, NULL) || !pColInfoData->pData) { len += snprintf(dumpBuf + len, size - len, " %15s |", "NULL"); if (len >= size -1) return dumpBuf; continue; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 496c7beb47..f19d17d034 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -58,9 +58,8 @@ int32_t tsNumOfVnodeQueryThreads = 2; int32_t tsNumOfVnodeFetchThreads = 4; int32_t tsNumOfVnodeWriteThreads = 2; int32_t tsNumOfVnodeSyncThreads = 2; -int32_t tsNumOfVnodeMergeThreads = 2; int32_t tsNumOfQnodeQueryThreads = 2; -int32_t tsNumOfQnodeFetchThreads = 1; +int32_t tsNumOfQnodeFetchThreads = 4; int32_t tsNumOfSnodeSharedThreads = 2; int32_t tsNumOfSnodeUniqueThreads = 2; @@ -106,11 +105,6 @@ int32_t tsCompressMsgSize = -1; */ int32_t tsCompressColData = -1; -/* - * denote if 3.0 query pattern compatible for 2.0 - */ -int32_t tsCompatibleModel = 1; - // count/hyperloglog function always return values in case of all NULL data or Empty data set. int32_t tsCountAlwaysReturnValue = 1; @@ -414,7 +408,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { tsNumOfMnodeReadThreads = TRANGE(tsNumOfMnodeReadThreads, 1, 4); if (cfgAddInt32(pCfg, "numOfMnodeReadThreads", tsNumOfMnodeReadThreads, 1, 1024, 0) != 0) return -1; - tsNumOfVnodeQueryThreads = tsNumOfCores / 2; + tsNumOfVnodeQueryThreads = tsNumOfCores / 4; tsNumOfVnodeQueryThreads = TMAX(tsNumOfVnodeQueryThreads, 2); if (cfgAddInt32(pCfg, "numOfVnodeQueryThreads", tsNumOfVnodeQueryThreads, 1, 1024, 0) != 0) return -1; @@ -425,19 +419,16 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { tsNumOfVnodeWriteThreads = TMAX(tsNumOfVnodeWriteThreads, 1); if (cfgAddInt32(pCfg, "numOfVnodeWriteThreads", tsNumOfVnodeWriteThreads, 1, 1024, 0) != 0) return -1; - tsNumOfVnodeSyncThreads = tsNumOfCores / 2; + tsNumOfVnodeSyncThreads = tsNumOfCores; tsNumOfVnodeSyncThreads = TMAX(tsNumOfVnodeSyncThreads, 1); if (cfgAddInt32(pCfg, "numOfVnodeSyncThreads", tsNumOfVnodeSyncThreads, 1, 1024, 0) != 0) return -1; - tsNumOfVnodeMergeThreads = tsNumOfCores / 8; - tsNumOfVnodeMergeThreads = TRANGE(tsNumOfVnodeMergeThreads, 1, 1); - if (cfgAddInt32(pCfg, "numOfVnodeMergeThreads", tsNumOfVnodeMergeThreads, 1, 1024, 0) != 0) return -1; - tsNumOfQnodeQueryThreads = tsNumOfCores / 2; tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 1); if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 1, 1024, 0) != 0) return -1; - tsNumOfQnodeFetchThreads = TRANGE(tsNumOfQnodeFetchThreads, 1, 1); + tsNumOfQnodeFetchThreads = tsNumOfCores / 2; + tsNumOfQnodeFetchThreads = TMAX(tsNumOfQnodeFetchThreads, 4); if (cfgAddInt32(pCfg, "numOfQnodeFetchThreads", tsNumOfQnodeFetchThreads, 1, 1024, 0) != 0) return -1; tsNumOfSnodeSharedThreads = tsNumOfCores / 4; @@ -598,7 +589,6 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32; tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32; - tsNumOfVnodeMergeThreads = cfgGetItem(pCfg, "numOfVnodeMergeThreads")->i32; tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32; tsNumOfQnodeFetchThreads = cfgGetItem(pCfg, "numOfQnodeFetchThreads")->i32; tsNumOfSnodeSharedThreads = cfgGetItem(pCfg, "numOfSnodeSharedThreads")->i32; @@ -840,8 +830,6 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) { tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32; } else if (strcasecmp("numOfVnodeSyncThreads", name) == 0) { tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32; - } else if (strcasecmp("numOfVnodeMergeThreads", name) == 0) { - tsNumOfVnodeMergeThreads = cfgGetItem(pCfg, "numOfVnodeMergeThreads")->i32; } else if (strcasecmp("numOfQnodeQueryThreads", name) == 0) { tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32; } else if (strcasecmp("numOfQnodeFetchThreads", name) == 0) { diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index c80960b8ce..adfa5b0f1e 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -2001,7 +2001,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) { if (tEncodeI32(&encoder, pReq->buffer) < 0) return -1; if (tEncodeI32(&encoder, pReq->pageSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->pages) < 0) return -1; - if (tEncodeI32(&encoder, pReq->lastRowMem) < 0) return -1; + if (tEncodeI32(&encoder, pReq->cacheLastSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysPerFile) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1; @@ -2014,7 +2014,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) { if (tEncodeI8(&encoder, pReq->compression) < 0) return -1; if (tEncodeI8(&encoder, pReq->replications) < 0) return -1; if (tEncodeI8(&encoder, pReq->strict) < 0) return -1; - if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1; + if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1; if (tEncodeI8(&encoder, pReq->schemaless) < 0) return -1; if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1; if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1; @@ -2043,7 +2043,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) if (tDecodeI32(&decoder, &pReq->buffer) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pageSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pages) < 0) return -1; - if (tDecodeI32(&decoder, &pReq->lastRowMem) < 0) return -1; + if (tDecodeI32(&decoder, &pReq->cacheLastSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysPerFile) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1; @@ -2056,7 +2056,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1; if (tDecodeI8(&decoder, &pReq->replications) < 0) return -1; if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1; - if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1; + if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1; if (tDecodeI8(&decoder, &pReq->schemaless) < 0) return -1; if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1; if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1; @@ -2098,7 +2098,7 @@ int32_t tSerializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) { if (tEncodeI32(&encoder, pReq->buffer) < 0) return -1; if (tEncodeI32(&encoder, pReq->pageSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->pages) < 0) return -1; - if (tEncodeI32(&encoder, pReq->lastRowMem) < 0) return -1; + if (tEncodeI32(&encoder, pReq->cacheLastSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysPerFile) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1; @@ -2106,7 +2106,7 @@ int32_t tSerializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) { if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1; if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1; if (tEncodeI8(&encoder, pReq->strict) < 0) return -1; - if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1; + if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1; if (tEncodeI8(&encoder, pReq->replications) < 0) return -1; tEndEncode(&encoder); @@ -2124,7 +2124,7 @@ int32_t tDeserializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) { if (tDecodeI32(&decoder, &pReq->buffer) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pageSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pages) < 0) return -1; - if (tDecodeI32(&decoder, &pReq->lastRowMem) < 0) return -1; + if (tDecodeI32(&decoder, &pReq->cacheLastSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysPerFile) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1; @@ -2132,7 +2132,7 @@ int32_t tDeserializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) { if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1; if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1; if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1; - if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1; + if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1; if (tDecodeI8(&decoder, &pReq->replications) < 0) return -1; tEndDecode(&decoder); @@ -2647,6 +2647,81 @@ int32_t tDeserializeSDbCfgReq(void *buf, int32_t bufLen, SDbCfgReq *pReq) { return 0; } +int32_t tSerializeSTrimDbReq(void *buf, int32_t bufLen, STrimDbReq *pReq) { + SEncoder encoder = {0}; + tEncoderInit(&encoder, buf, bufLen); + + if (tStartEncode(&encoder) < 0) return -1; + if (tEncodeCStr(&encoder, pReq->db) < 0) return -1; + tEndEncode(&encoder); + + int32_t tlen = encoder.pos; + tEncoderClear(&encoder); + return tlen; +} + +int32_t tDeserializeSTrimDbReq(void *buf, int32_t bufLen, STrimDbReq *pReq) { + SDecoder decoder = {0}; + tDecoderInit(&decoder, buf, bufLen); + + if (tStartDecode(&decoder) < 0) return -1; + if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1; + tEndDecode(&decoder); + + tDecoderClear(&decoder); + return 0; +} + +int32_t tSerializeSVTrimDbReq(void *buf, int32_t bufLen, SVTrimDbReq *pReq) { + SEncoder encoder = {0}; + tEncoderInit(&encoder, buf, bufLen); + + if (tStartEncode(&encoder) < 0) return -1; + if (tEncodeI32(&encoder, pReq->timestamp) < 0) return -1; + tEndEncode(&encoder); + + int32_t tlen = encoder.pos; + tEncoderClear(&encoder); + return tlen; +} + +int32_t tDeserializeSVTrimDbReq(void *buf, int32_t bufLen, SVTrimDbReq *pReq) { + SDecoder decoder = {0}; + tDecoderInit(&decoder, buf, bufLen); + + if (tStartDecode(&decoder) < 0) return -1; + if (tDecodeI32(&decoder, &pReq->timestamp) < 0) return -1; + tEndDecode(&decoder); + + tDecoderClear(&decoder); + return 0; +} + +int32_t tSerializeSVDropTtlTableReq(void *buf, int32_t bufLen, SVDropTtlTableReq *pReq) { + SEncoder encoder = {0}; + tEncoderInit(&encoder, buf, bufLen); + + if (tStartEncode(&encoder) < 0) return -1; + if (tEncodeI32(&encoder, pReq->timestamp) < 0) return -1; + tEndEncode(&encoder); + + int32_t tlen = encoder.pos; + tEncoderClear(&encoder); + return tlen; +} + +int32_t tDeserializeSVDropTtlTableReq(void *buf, int32_t bufLen, SVDropTtlTableReq *pReq) { + SDecoder decoder = {0}; + tDecoderInit(&decoder, buf, bufLen); + + if (tStartDecode(&decoder) < 0) return -1; + if (tDecodeI32(&decoder, &pReq->timestamp) < 0) return -1; + tEndDecode(&decoder); + + tDecoderClear(&decoder); + return 0; +} + int32_t tSerializeSDbCfgRsp(void *buf, int32_t bufLen, const SDbCfgRsp *pRsp) { SEncoder encoder = {0}; tEncoderInit(&encoder, buf, bufLen); @@ -2669,7 +2744,7 @@ int32_t tSerializeSDbCfgRsp(void *buf, int32_t bufLen, const SDbCfgRsp *pRsp) { if (tEncodeI8(&encoder, pRsp->compression) < 0) return -1; if (tEncodeI8(&encoder, pRsp->replications) < 0) return -1; if (tEncodeI8(&encoder, pRsp->strict) < 0) return -1; - if (tEncodeI8(&encoder, pRsp->cacheLastRow) < 0) return -1; + if (tEncodeI8(&encoder, pRsp->cacheLast) < 0) return -1; if (tEncodeI32(&encoder, pRsp->numOfRetensions) < 0) return -1; for (int32_t i = 0; i < pRsp->numOfRetensions; ++i) { SRetention *pRetension = taosArrayGet(pRsp->pRetensions, i); @@ -2708,7 +2783,7 @@ int32_t tDeserializeSDbCfgRsp(void *buf, int32_t bufLen, SDbCfgRsp *pRsp) { if (tDecodeI8(&decoder, &pRsp->compression) < 0) return -1; if (tDecodeI8(&decoder, &pRsp->replications) < 0) return -1; if (tDecodeI8(&decoder, &pRsp->strict) < 0) return -1; - if (tDecodeI8(&decoder, &pRsp->cacheLastRow) < 0) return -1; + if (tDecodeI8(&decoder, &pRsp->cacheLast) < 0) return -1; if (tDecodeI32(&decoder, &pRsp->numOfRetensions) < 0) return -1; if (pRsp->numOfRetensions > 0) { pRsp->pRetensions = taosArrayInit(pRsp->numOfRetensions, sizeof(SRetention)); @@ -3619,7 +3694,7 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR if (tEncodeI32(&encoder, pReq->buffer) < 0) return -1; if (tEncodeI32(&encoder, pReq->pageSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->pages) < 0) return -1; - if (tEncodeI32(&encoder, pReq->lastRowMem) < 0) return -1; + if (tEncodeI32(&encoder, pReq->cacheLastSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysPerFile) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1; @@ -3634,7 +3709,7 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR if (tEncodeI8(&encoder, pReq->precision) < 0) return -1; if (tEncodeI8(&encoder, pReq->compression) < 0) return -1; if (tEncodeI8(&encoder, pReq->strict) < 0) return -1; - if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1; + if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1; if (tEncodeI8(&encoder, pReq->standby) < 0) return -1; if (tEncodeI8(&encoder, pReq->replica) < 0) return -1; if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1; @@ -3677,7 +3752,7 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq * if (tDecodeI32(&decoder, &pReq->buffer) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pageSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pages) < 0) return -1; - if (tDecodeI32(&decoder, &pReq->lastRowMem) < 0) return -1; + if (tDecodeI32(&decoder, &pReq->cacheLastSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysPerFile) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1; @@ -3692,7 +3767,7 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq * if (tDecodeI8(&decoder, &pReq->precision) < 0) return -1; if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1; if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1; - if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1; + if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1; if (tDecodeI8(&decoder, &pReq->standby) < 0) return -1; if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1; if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1; @@ -3802,7 +3877,7 @@ int32_t tSerializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pReq if (tEncodeI32(&encoder, pReq->buffer) < 0) return -1; if (tEncodeI32(&encoder, pReq->pageSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->pages) < 0) return -1; - if (tEncodeI32(&encoder, pReq->lastRowMem) < 0) return -1; + if (tEncodeI32(&encoder, pReq->cacheLastSize) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysPerFile) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1; if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1; @@ -3810,7 +3885,7 @@ int32_t tSerializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pReq if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1; if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1; if (tEncodeI8(&encoder, pReq->strict) < 0) return -1; - if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1; + if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1; if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1; if (tEncodeI8(&encoder, pReq->replica) < 0) return -1; for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) { @@ -3833,7 +3908,7 @@ int32_t tDeserializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pR if (tDecodeI32(&decoder, &pReq->buffer) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pageSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->pages) < 0) return -1; - if (tDecodeI32(&decoder, &pReq->lastRowMem) < 0) return -1; + if (tDecodeI32(&decoder, &pReq->cacheLastSize) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysPerFile) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1; if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1; @@ -3841,7 +3916,7 @@ int32_t tDeserializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pR if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1; if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1; if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1; - if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1; + if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1; if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1; if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1; for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) { diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c index 4e3449feb7..b9a02728fc 100644 --- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c +++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c @@ -171,6 +171,7 @@ SArray *mmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_MND_USE_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_COMPACT_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_MND_TRIM_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_GET_DB_CFG, mmPutMsgToReadQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_VGROUP_LIST, mmPutMsgToReadQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_REDISTRIBUTE_VGROUP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 5ffddd0127..7e7139ba53 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -138,6 +138,8 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) { pCfg->dbId = pCreate->dbUid; pCfg->szPage = pCreate->pageSize * 1024; pCfg->szCache = pCreate->pages; + pCfg->cacheLast = pCreate->cacheLast; + pCfg->cacheLastSize = pCreate->cacheLastSize; pCfg->szBuf = (uint64_t)pCreate->buffer * 1024 * 1024; pCfg->isWeak = true; pCfg->isTsma = pCreate->isTsma; @@ -210,7 +212,8 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return -1; } - dDebug("vgId:%d, start to create vnode, tsma:%d standby:%d", createReq.vgId, createReq.isTsma, createReq.standby); + 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); vmGenerateVnodeCfg(&createReq, &vnodeCfg); if (vmTsmaAdjustDays(&vnodeCfg, &createReq) < 0) { @@ -370,6 +373,7 @@ SArray *vmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_CONFIRM, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_HASHRANGE, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_VND_COMPACT, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_VND_TRIM, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE, vmPutMsgToMgmtQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE, vmPutMsgToMgmtQueue, 0) == NULL) goto _OVER; diff --git a/source/dnode/mgmt/test/vnode/vnode.cpp b/source/dnode/mgmt/test/vnode/vnode.cpp index 8aba4f81b5..520d844dbd 100644 --- a/source/dnode/mgmt/test/vnode/vnode.cpp +++ b/source/dnode/mgmt/test/vnode/vnode.cpp @@ -45,7 +45,7 @@ TEST_F(DndTestVnode, 01_Create_Vnode) { createReq.compression = 2; createReq.replica = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.selfIndex = 0; for (int r = 0; r < createReq.replica; ++r) { SReplica* pReplica = &createReq.replicas[r]; @@ -80,7 +80,7 @@ TEST_F(DndTestVnode, 02_Alter_Vnode) { alterReq.walLevel = 1; alterReq.replica = 1; alterReq.strict = 1; - alterReq.cacheLastRow = 0; + alterReq.cacheLast = 0; alterReq.selfIndex = 0; for (int r = 0; r < alterReq.replica; ++r) { SReplica* pReplica = &alterReq.replicas[r]; diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index f39a848992..7ac991451e 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -246,7 +246,7 @@ typedef struct { int32_t buffer; int32_t pageSize; int32_t pages; - int32_t lastRowMem; + int32_t cacheLastSize; int32_t daysPerFile; int32_t daysToKeep0; int32_t daysToKeep1; @@ -260,7 +260,7 @@ typedef struct { int8_t replications; int8_t strict; int8_t hashMethod; // default is 1 - int8_t cacheLastRow; + int8_t cacheLast; int32_t numOfRetensions; SArray* pRetensions; int8_t schemaless; diff --git a/source/dnode/mnode/impl/inc/mndPrivilege.h b/source/dnode/mnode/impl/inc/mndPrivilege.h index 0c56f6f155..a149c0f0e2 100644 --- a/source/dnode/mnode/impl/inc/mndPrivilege.h +++ b/source/dnode/mnode/impl/inc/mndPrivilege.h @@ -54,6 +54,7 @@ typedef enum { MND_OPER_ALTER_DB, MND_OPER_DROP_DB, MND_OPER_COMPACT_DB, + MND_OPER_TRIM_DB, MND_OPER_USE_DB, MND_OPER_WRITE_DB, MND_OPER_READ_DB, diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 156afb09fc..b1c2b0e277 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -42,6 +42,7 @@ static int32_t mndProcessAlterDbReq(SRpcMsg *pReq); static int32_t mndProcessDropDbReq(SRpcMsg *pReq); static int32_t mndProcessUseDbReq(SRpcMsg *pReq); static int32_t mndProcessCompactDbReq(SRpcMsg *pReq); +static int32_t mndProcessTrimDbReq(SRpcMsg *pReq); static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity); static void mndCancelGetNextDb(SMnode *pMnode, void *pIter); static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq); @@ -62,6 +63,7 @@ int32_t mndInitDb(SMnode *pMnode) { mndSetMsgHandle(pMnode, TDMT_MND_DROP_DB, mndProcessDropDbReq); mndSetMsgHandle(pMnode, TDMT_MND_USE_DB, mndProcessUseDbReq); mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_DB, mndProcessCompactDbReq); + mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB, mndProcessTrimDbReq); mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq); mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs); @@ -93,7 +95,7 @@ static SSdbRaw *mndDbActionEncode(SDbObj *pDb) { SDB_SET_INT32(pRaw, dataPos, pDb->cfg.buffer, _OVER) SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pageSize, _OVER) SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pages, _OVER) - SDB_SET_INT32(pRaw, dataPos, pDb->cfg.lastRowMem, _OVER) + SDB_SET_INT32(pRaw, dataPos, pDb->cfg.cacheLastSize, _OVER) SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysPerFile, _OVER) SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep0, _OVER) SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep1, _OVER) @@ -106,7 +108,7 @@ static SSdbRaw *mndDbActionEncode(SDbObj *pDb) { SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compression, _OVER) SDB_SET_INT8(pRaw, dataPos, pDb->cfg.replications, _OVER) SDB_SET_INT8(pRaw, dataPos, pDb->cfg.strict, _OVER) - SDB_SET_INT8(pRaw, dataPos, pDb->cfg.cacheLastRow, _OVER) + SDB_SET_INT8(pRaw, dataPos, pDb->cfg.cacheLast, _OVER) SDB_SET_INT8(pRaw, dataPos, pDb->cfg.hashMethod, _OVER) SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfRetensions, _OVER) for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) { @@ -166,7 +168,7 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) { SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.buffer, _OVER) SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pageSize, _OVER) SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pages, _OVER) - SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.lastRowMem, _OVER) + SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.cacheLastSize, _OVER) SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysPerFile, _OVER) SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep0, _OVER) SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep1, _OVER) @@ -179,7 +181,7 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) { SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER) SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.replications, _OVER) SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.strict, _OVER) - SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLastRow, _OVER) + SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLast, _OVER) SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.hashMethod, _OVER) SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfRetensions, _OVER) if (pDb->cfg.numOfRetensions > 0) { @@ -234,7 +236,7 @@ static int32_t mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew) { pOld->cfg.buffer = pNew->cfg.buffer; pOld->cfg.pageSize = pNew->cfg.pageSize; pOld->cfg.pages = pNew->cfg.pages; - pOld->cfg.lastRowMem = pNew->cfg.lastRowMem; + pOld->cfg.cacheLastSize = pNew->cfg.cacheLastSize; pOld->cfg.daysPerFile = pNew->cfg.daysPerFile; pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0; pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1; @@ -242,7 +244,7 @@ static int32_t mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew) { pOld->cfg.fsyncPeriod = pNew->cfg.fsyncPeriod; pOld->cfg.walLevel = pNew->cfg.walLevel; pOld->cfg.strict = pNew->cfg.strict; - pOld->cfg.cacheLastRow = pNew->cfg.cacheLastRow; + pOld->cfg.cacheLast = pNew->cfg.cacheLast; pOld->cfg.replications = pNew->cfg.replications; taosWUnLockLatch(&pOld->lock); return 0; @@ -291,7 +293,7 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) { if (pCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return -1; if (pCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return -1; if (pCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return -1; - if (pCfg->lastRowMem < TSDB_MIN_DB_LAST_ROW_MEM || pCfg->lastRowMem > TSDB_MAX_DB_LAST_ROW_MEM) return -1; + if (pCfg->cacheLastSize < TSDB_MIN_DB_CACHE_LAST_SIZE || pCfg->cacheLastSize > TSDB_MAX_DB_CACHE_LAST_SIZE) return -1; if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return -1; if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return -1; if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return -1; @@ -310,7 +312,7 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) { if (pCfg->replications != 1 && pCfg->replications != 3) return -1; if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return -1; if (pCfg->schemaless < TSDB_DB_SCHEMALESS_OFF || pCfg->schemaless > TSDB_DB_SCHEMALESS_ON) return -1; - if (pCfg->cacheLastRow < TSDB_MIN_DB_CACHE_LAST_ROW || pCfg->cacheLastRow > TSDB_MAX_DB_CACHE_LAST_ROW) return -1; + if (pCfg->cacheLast < TSDB_MIN_DB_CACHE_LAST || pCfg->cacheLast > TSDB_MAX_DB_CACHE_LAST) return -1; if (pCfg->hashMethod != 1) return -1; if (pCfg->replications > mndGetDnodeSize(pMnode)) { terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES; @@ -339,8 +341,8 @@ static void mndSetDefaultDbCfg(SDbCfg *pCfg) { if (pCfg->compression < 0) pCfg->compression = TSDB_DEFAULT_COMP_LEVEL; if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA; if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT; - if (pCfg->cacheLastRow < 0) pCfg->cacheLastRow = TSDB_DEFAULT_CACHE_LAST_ROW; - if (pCfg->lastRowMem <= 0) pCfg->lastRowMem = TSDB_DEFAULT_LAST_ROW_MEM; + if (pCfg->cacheLast < 0) pCfg->cacheLast = TSDB_DEFAULT_CACHE_LAST; + if (pCfg->cacheLastSize <= 0) pCfg->cacheLastSize = TSDB_DEFAULT_CACHE_LAST_SIZE; if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0; if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF; } @@ -439,7 +441,7 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, .buffer = pCreate->buffer, .pageSize = pCreate->pageSize, .pages = pCreate->pages, - .lastRowMem = pCreate->lastRowMem, + .cacheLastSize = pCreate->cacheLastSize, .daysPerFile = pCreate->daysPerFile, .daysToKeep0 = pCreate->daysToKeep0, .daysToKeep1 = pCreate->daysToKeep1, @@ -452,7 +454,7 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, .compression = pCreate->compression, .replications = pCreate->replications, .strict = pCreate->strict, - .cacheLastRow = pCreate->cacheLastRow, + .cacheLast = pCreate->cacheLast, .hashMethod = 1, .schemaless = pCreate->schemaless, }; @@ -623,13 +625,13 @@ static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) { #endif } - if (pAlter->cacheLastRow >= 0 && pAlter->cacheLastRow != pDb->cfg.cacheLastRow) { - pDb->cfg.cacheLastRow = pAlter->cacheLastRow; + if (pAlter->cacheLast >= 0 && pAlter->cacheLast != pDb->cfg.cacheLast) { + pDb->cfg.cacheLast = pAlter->cacheLast; terrno = 0; } - if (pAlter->lastRowMem > 0 && pAlter->lastRowMem != pDb->cfg.lastRowMem) { - pDb->cfg.lastRowMem = pAlter->lastRowMem; + if (pAlter->cacheLastSize > 0 && pAlter->cacheLastSize != pDb->cfg.cacheLastSize) { + pDb->cfg.cacheLastSize = pAlter->cacheLastSize; terrno = 0; } @@ -801,7 +803,7 @@ static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) { cfgRsp.compression = pDb->cfg.compression; cfgRsp.replications = pDb->cfg.replications; cfgRsp.strict = pDb->cfg.strict; - cfgRsp.cacheLastRow = pDb->cfg.cacheLastRow; + cfgRsp.cacheLast = pDb->cfg.cacheLast; cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions; cfgRsp.pRetensions = pDb->cfg.pRetensions; cfgRsp.schemaless = pDb->cfg.schemaless; @@ -1268,6 +1270,8 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs, return 0; } +static int32_t mndCompactDb(SMnode *pMnode, SDbObj *pDb) { return 0; } + static int32_t mndProcessCompactDbReq(SRpcMsg *pReq) { SMnode *pMnode = pReq->info.node; int32_t code = -1; @@ -1279,7 +1283,7 @@ static int32_t mndProcessCompactDbReq(SRpcMsg *pReq) { goto _OVER; } - mDebug("db:%s, start to sync", compactReq.db); + mDebug("db:%s, start to compact", compactReq.db); pDb = mndAcquireDb(pMnode, compactReq.db); if (pDb == NULL) { @@ -1290,7 +1294,7 @@ static int32_t mndProcessCompactDbReq(SRpcMsg *pReq) { goto _OVER; } - // code = mndCompactDb(); + code = mndCompactDb(pMnode, pDb); _OVER: if (code != 0) { @@ -1301,6 +1305,75 @@ _OVER: return code; } +static int32_t mndTrimDb(SMnode *pMnode, SDbObj *pDb) { + SSdb *pSdb = pMnode->pSdb; + SVgObj *pVgroup = NULL; + void *pIter = NULL; + SVTrimDbReq trimReq = {.timestamp = taosGetTimestampSec()}; + int32_t reqLen = tSerializeSVTrimDbReq(NULL, 0, &trimReq); + int32_t contLen = reqLen + sizeof(SMsgHead); + + while (1) { + pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup); + if (pIter == NULL) break; + + SMsgHead *pHead = rpcMallocCont(contLen); + if (pHead == NULL) { + sdbCancelFetch(pSdb, pVgroup); + sdbRelease(pSdb, pVgroup); + continue; + } + pHead->contLen = htonl(contLen); + pHead->vgId = htonl(pVgroup->vgId); + tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), contLen, &trimReq); + + SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen}; + SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup); + int32_t code = tmsgSendReq(&epSet, &rpcMsg); + if (code != 0) { + mError("vgId:%d, failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code); + } else { + mDebug("vgId:%d, send vnode-trim request to vnode, time:%d", pVgroup->vgId, trimReq.timestamp); + } + sdbRelease(pSdb, pVgroup); + } + + return 0; +} + +static int32_t mndProcessTrimDbReq(SRpcMsg *pReq) { + SMnode *pMnode = pReq->info.node; + int32_t code = -1; + SDbObj *pDb = NULL; + STrimDbReq trimReq = {0}; + + if (tDeserializeSTrimDbReq(pReq->pCont, pReq->contLen, &trimReq) != 0) { + terrno = TSDB_CODE_INVALID_MSG; + goto _OVER; + } + + mDebug("db:%s, start to trim", trimReq.db); + + pDb = mndAcquireDb(pMnode, trimReq.db); + if (pDb == NULL) { + goto _OVER; + } + + if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_TRIM_DB, pDb) != 0) { + goto _OVER; + } + + code = mndTrimDb(pMnode, pDb); + +_OVER: + if (code != 0) { + mError("db:%s, failed to process trim db req since %s", trimReq.db, terrstr()); + } + + mndReleaseDb(pMnode, pDb); + return code; +} + const char *mndGetDbStr(const char *src) { char *pos = strstr(src, TS_PATH_DELIMITER); if (pos != NULL) ++pos; @@ -1467,7 +1540,7 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.compression, false); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.cacheLastRow, false); + colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.cacheLast, false); const char *precStr = NULL; switch (pDb->cfg.precision) { diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index f18f3c983e..861aa82a93 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -531,8 +531,7 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) { if (!IsReq(pMsg)) return 0; if (pMsg->msgType == TDMT_SCH_QUERY || pMsg->msgType == TDMT_SCH_MERGE_QUERY || pMsg->msgType == TDMT_SCH_QUERY_CONTINUE || pMsg->msgType == TDMT_SCH_QUERY_HEARTBEAT || - pMsg->msgType == TDMT_SCH_FETCH || pMsg->msgType == TDMT_SCH_MERGE_FETCH || - pMsg->msgType == TDMT_SCH_DROP_TASK) { + pMsg->msgType == TDMT_SCH_FETCH || pMsg->msgType == TDMT_SCH_MERGE_FETCH || pMsg->msgType == TDMT_SCH_DROP_TASK) { return 0; } if (mndAcquireRpcRef(pMsg->info.node) == 0) return 0; diff --git a/source/dnode/mnode/impl/src/mndPrivilege.c b/source/dnode/mnode/impl/src/mndPrivilege.c index dc321e38d1..e4422c480f 100644 --- a/source/dnode/mnode/impl/src/mndPrivilege.c +++ b/source/dnode/mnode/impl/src/mndPrivilege.c @@ -155,7 +155,8 @@ int32_t mndCheckDbPrivilege(SMnode *pMnode, const char *user, EOperType operType if (pUser->sysInfo) goto _OVER; } - if (operType == MND_OPER_ALTER_DB || operType == MND_OPER_DROP_DB || operType == MND_OPER_COMPACT_DB) { + if (operType == MND_OPER_ALTER_DB || operType == MND_OPER_DROP_DB || operType == MND_OPER_COMPACT_DB || + operType == MND_OPER_TRIM_DB) { if (strcmp(pUser->user, pDb->createUser) == 0 && pUser->sysInfo) goto _OVER; } diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 388441b1dc..c040f0d05b 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -204,6 +204,8 @@ _OVER: mError("sma:%s, failed to decode from raw:%p since %s", pSma->name, pRaw, terrstr()); taosMemoryFreeClear(pSma->expr); taosMemoryFreeClear(pSma->tagsFilter); + taosMemoryFreeClear(pSma->sql); + taosMemoryFreeClear(pSma->ast); taosMemoryFreeClear(pRow); return NULL; } @@ -221,6 +223,8 @@ static int32_t mndSmaActionDelete(SSdb *pSdb, SSmaObj *pSma) { mTrace("sma:%s, perform delete action, row:%p", pSma->name, pSma); taosMemoryFreeClear(pSma->tagsFilter); taosMemoryFreeClear(pSma->expr); + taosMemoryFreeClear(pSma->sql); + taosMemoryFreeClear(pSma->ast); return 0; } @@ -527,10 +531,20 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea streamObj.version = 1; streamObj.sql = pCreate->sql; streamObj.smaId = smaObj.uid; - streamObj.watermark = 0; - streamObj.trigger = STREAM_TRIGGER_AT_ONCE; + streamObj.watermark = pCreate->watermark; + streamObj.trigger = STREAM_TRIGGER_WINDOW_CLOSE; + streamObj.triggerParam = pCreate->maxDelay; streamObj.ast = strdup(smaObj.ast); + // check the maxDelay + if (streamObj.triggerParam < TSDB_MIN_ROLLUP_MAX_DELAY) { + int64_t msInterval = convertTimeFromPrecisionToUnit(pCreate->interval, pDb->cfg.precision, TIME_UNIT_MILLISECOND); + streamObj.triggerParam = msInterval > TSDB_MIN_ROLLUP_MAX_DELAY ? msInterval : TSDB_MIN_ROLLUP_MAX_DELAY; + } + if (streamObj.triggerParam > TSDB_MAX_ROLLUP_MAX_DELAY) { + streamObj.triggerParam = TSDB_MAX_ROLLUP_MAX_DELAY; + } + if (mndAllocSmaVgroup(pMnode, pDb, &streamObj.fixedSinkVg) != 0) { mError("sma:%s, failed to create since %s", smaObj.name, terrstr()); return -1; diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index 8ce22c2b2e..1c234cf280 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -813,16 +813,18 @@ int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *p } static int32_t mndProcessTtlTimer(SRpcMsg *pReq) { - SMnode *pMnode = pReq->info.node; - SSdb *pSdb = pMnode->pSdb; - SVgObj *pVgroup = NULL; - void *pIter = NULL; + SMnode *pMnode = pReq->info.node; + SSdb *pSdb = pMnode->pSdb; + SVgObj *pVgroup = NULL; + void *pIter = NULL; + SVDropTtlTableReq ttlReq = {.timestamp = taosGetTimestampSec()}; + int32_t reqLen = tSerializeSVDropTtlTableReq(NULL, 0, &ttlReq); + int32_t contLen = reqLen + sizeof(SMsgHead); while (1) { pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup); if (pIter == NULL) break; - int32_t contLen = sizeof(SMsgHead) + sizeof(int32_t); SMsgHead *pHead = rpcMallocCont(contLen); if (pHead == NULL) { sdbCancelFetch(pSdb, pVgroup); @@ -831,17 +833,15 @@ static int32_t mndProcessTtlTimer(SRpcMsg *pReq) { } pHead->contLen = htonl(contLen); pHead->vgId = htonl(pVgroup->vgId); - - int32_t t = taosGetTimestampSec(); - *(int32_t *)((char *)pHead + sizeof(SMsgHead)) = htonl(t); + tSerializeSVDropTtlTableReq((char *)pHead + sizeof(SMsgHead), contLen, &ttlReq); SRpcMsg rpcMsg = {.msgType = TDMT_VND_DROP_TTL_TABLE, .pCont = pHead, .contLen = contLen}; SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup); int32_t code = tmsgSendReq(&epSet, &rpcMsg); if (code != 0) { - mError("failed to send ttl time seed, code:0x%x", code); + mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code); } else { - mDebug("send ttl time seed success, time:%d", t); + mDebug("vgId:%d, send drop ttl table request to vnode, time:%d", pVgroup->vgId, ttlReq.timestamp); } sdbRelease(pSdb, pVgroup); } diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 85f1ce6843..0b24b570a5 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -207,7 +207,7 @@ void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVg createReq.buffer = pDb->cfg.buffer; createReq.pageSize = pDb->cfg.pageSize; createReq.pages = pDb->cfg.pages; - createReq.lastRowMem = pDb->cfg.lastRowMem; + createReq.cacheLastSize = pDb->cfg.cacheLastSize; createReq.daysPerFile = pDb->cfg.daysPerFile; createReq.daysToKeep0 = pDb->cfg.daysToKeep0; createReq.daysToKeep1 = pDb->cfg.daysToKeep1; @@ -219,7 +219,7 @@ void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVg createReq.precision = pDb->cfg.precision; createReq.compression = pDb->cfg.compression; createReq.strict = pDb->cfg.strict; - createReq.cacheLastRow = pDb->cfg.cacheLastRow; + createReq.cacheLast = pDb->cfg.cacheLast; createReq.replica = pVgroup->replica; createReq.selfIndex = -1; createReq.hashBegin = pVgroup->hashBegin; @@ -277,7 +277,7 @@ void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_ alterReq.buffer = pDb->cfg.buffer; alterReq.pageSize = pDb->cfg.pageSize; alterReq.pages = pDb->cfg.pages; - alterReq.lastRowMem = pDb->cfg.lastRowMem; + alterReq.cacheLastSize = pDb->cfg.cacheLastSize; alterReq.daysPerFile = pDb->cfg.daysPerFile; alterReq.daysToKeep0 = pDb->cfg.daysToKeep0; alterReq.daysToKeep1 = pDb->cfg.daysToKeep1; @@ -285,7 +285,7 @@ void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_ alterReq.fsyncPeriod = pDb->cfg.fsyncPeriod; alterReq.walLevel = pDb->cfg.walLevel; alterReq.strict = pDb->cfg.strict; - alterReq.cacheLastRow = pDb->cfg.cacheLastRow; + alterReq.cacheLast = pDb->cfg.cacheLast; alterReq.replica = pVgroup->replica; for (int32_t v = 0; v < pVgroup->replica; ++v) { @@ -307,7 +307,7 @@ void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_ terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } - contLen += +sizeof(SMsgHead); + contLen += sizeof(SMsgHead); void *pReq = taosMemoryMalloc(contLen); if (pReq == NULL) { @@ -742,8 +742,8 @@ int64_t mndGetVgroupMemory(SMnode *pMnode, SDbObj *pDbInput, SVgObj *pVgroup) { int64_t vgroupMemroy = 0; if (pDb != NULL) { vgroupMemroy = (int64_t)pDb->cfg.buffer * 1024 * 1024 + (int64_t)pDb->cfg.pages * pDb->cfg.pageSize * 1024; - if (pDb->cfg.cacheLastRow > 0) { - vgroupMemroy += (int64_t)pDb->cfg.lastRowMem * 1024 * 1024; + if (pDb->cfg.cacheLast > 0) { + vgroupMemroy += (int64_t)pDb->cfg.cacheLastSize * 1024 * 1024; } } diff --git a/source/dnode/mnode/impl/test/db/db.cpp b/source/dnode/mnode/impl/test/db/db.cpp index a3d129c7c4..0fb8e9d530 100644 --- a/source/dnode/mnode/impl/test/db/db.cpp +++ b/source/dnode/mnode/impl/test/db/db.cpp @@ -50,7 +50,7 @@ TEST_F(MndTestDb, 02_Create_Alter_Drop_Db) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; createReq.numOfStables = 0; createReq.numOfRetensions = 0; @@ -84,7 +84,7 @@ TEST_F(MndTestDb, 02_Create_Alter_Drop_Db) { alterdbReq.fsyncPeriod = 4000; alterdbReq.walLevel = 2; alterdbReq.strict = 1; - alterdbReq.cacheLastRow = 1; + alterdbReq.cacheLast = 1; alterdbReq.replications = 1; int32_t contLen = tSerializeSAlterDbReq(NULL, 0, &alterdbReq); @@ -146,7 +146,7 @@ TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; createReq.numOfStables = 0; createReq.numOfRetensions = 0; diff --git a/source/dnode/mnode/impl/test/dnode/mdnode.cpp b/source/dnode/mnode/impl/test/dnode/mdnode.cpp index 0b42b28219..8e4e728416 100644 --- a/source/dnode/mnode/impl/test/dnode/mdnode.cpp +++ b/source/dnode/mnode/impl/test/dnode/mdnode.cpp @@ -288,7 +288,7 @@ TEST_F(MndTestDnode, 05_Create_Drop_Restart_Dnode) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; createReq.numOfStables = 0; createReq.numOfRetensions = 0; @@ -319,7 +319,7 @@ TEST_F(MndTestDnode, 05_Create_Drop_Restart_Dnode) { alterdbReq.fsyncPeriod = 4000; alterdbReq.walLevel = 2; alterdbReq.strict = 1; - alterdbReq.cacheLastRow = 1; + alterdbReq.cacheLast = 1; alterdbReq.replications = 3; int32_t contLen = tSerializeSAlterDbReq(NULL, 0, &alterdbReq); @@ -345,7 +345,7 @@ TEST_F(MndTestDnode, 05_Create_Drop_Restart_Dnode) { alterdbReq.fsyncPeriod = 4000; alterdbReq.walLevel = 2; alterdbReq.strict = 1; - alterdbReq.cacheLastRow = 1; + alterdbReq.cacheLast = 1; alterdbReq.replications = 1; int32_t contLen = tSerializeSAlterDbReq(NULL, 0, &alterdbReq); diff --git a/source/dnode/mnode/impl/test/sma/sma.cpp b/source/dnode/mnode/impl/test/sma/sma.cpp index d795816f57..ce6954279f 100644 --- a/source/dnode/mnode/impl/test/sma/sma.cpp +++ b/source/dnode/mnode/impl/test/sma/sma.cpp @@ -55,7 +55,7 @@ void* MndTestSma::BuildCreateDbReq(const char* dbname, int32_t* pContLen) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; int32_t contLen = tSerializeSCreateDbReq(NULL, 0, &createReq); diff --git a/source/dnode/mnode/impl/test/stb/stb.cpp b/source/dnode/mnode/impl/test/stb/stb.cpp index 63bb1bf540..dfdd8f3a49 100644 --- a/source/dnode/mnode/impl/test/stb/stb.cpp +++ b/source/dnode/mnode/impl/test/stb/stb.cpp @@ -56,7 +56,7 @@ void* MndTestStb::BuildCreateDbReq(const char* dbname, int32_t* pContLen) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; int32_t contLen = tSerializeSCreateDbReq(NULL, 0, &createReq); diff --git a/source/dnode/mnode/impl/test/topic/topic.cpp b/source/dnode/mnode/impl/test/topic/topic.cpp index 433a0ab5cc..353cedf636 100644 --- a/source/dnode/mnode/impl/test/topic/topic.cpp +++ b/source/dnode/mnode/impl/test/topic/topic.cpp @@ -48,7 +48,7 @@ void* MndTestTopic::BuildCreateDbReq(const char* dbname, int32_t* pContLen) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; int32_t contLen = tSerializeSCreateDbReq(NULL, 0, &createReq); diff --git a/source/dnode/mnode/impl/test/user/user.cpp b/source/dnode/mnode/impl/test/user/user.cpp index 3b1a5fa3c5..d8b6964114 100644 --- a/source/dnode/mnode/impl/test/user/user.cpp +++ b/source/dnode/mnode/impl/test/user/user.cpp @@ -315,7 +315,7 @@ TEST_F(MndTestUser, 03_Alter_User) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; int32_t contLen = tSerializeSCreateDbReq(NULL, 0, &createReq); diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index b42b0f2b44..bba4bdb2b1 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -140,7 +140,10 @@ int32_t tsdbLastRowReaderOpen(void *pVnode, int32_t type, SArray *pTableIdList, void **pReader); int32_t tsdbRetrieveLastRow(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds); int32_t tsdbLastrowReaderClose(void *pReader); -int32_t tsdbGetTableSchema(SVnode* pVnode, int64_t uid, STSchema** pSchema, int64_t* suid); +int32_t tsdbGetTableSchema(SVnode *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid); + +void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity); +size_t tsdbCacheGetCapacity(SVnode *pVnode); // tq @@ -210,11 +213,13 @@ struct SVnodeCfg { int32_t vgId; char dbname[TSDB_DB_FNAME_LEN]; uint64_t dbId; + int32_t cacheLastSize; int32_t szPage; int32_t szCache; uint64_t szBuf; bool isHeap; bool isWeak; + int8_t cacheLast; int8_t isTsma; int8_t isRsma; int8_t hashMethod; diff --git a/source/dnode/vnode/src/inc/sma.h b/source/dnode/vnode/src/inc/sma.h index d5b719dfb9..e767d94ebd 100644 --- a/source/dnode/vnode/src/inc/sma.h +++ b/source/dnode/vnode/src/inc/sma.h @@ -67,7 +67,6 @@ struct SRSmaStat { int64_t submitVer; int64_t refId; // shared by fetch tasks int8_t triggerStat; // shared by fetch tasks - int8_t runningStat; // for persistence task SHashObj *rsmaInfoHash; // key: stbUid, value: SRSmaInfo; }; @@ -83,7 +82,6 @@ struct SSmaStat { #define SMA_RSMA_STAT(s) (&(s)->rsmaStat) #define RSMA_INFO_HASH(r) ((r)->rsmaInfoHash) #define RSMA_TRIGGER_STAT(r) (&(r)->triggerStat) -#define RSMA_RUNNING_STAT(r) (&(r)->runningStat) #define RSMA_REF_ID(r) ((r)->refId) #define RSMA_SUBMIT_VER(r) ((r)->submitVer) @@ -93,7 +91,7 @@ enum { TASK_TRIGGER_STAT_INACTIVE = 2, TASK_TRIGGER_STAT_PAUSED = 3, TASK_TRIGGER_STAT_CANCELLED = 4, - TASK_TRIGGER_STAT_FINISHED = 5, + TASK_TRIGGER_STAT_DROPPED = 5, }; void tdDestroySmaEnv(SSmaEnv *pSmaEnv); diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index cce3da60cb..4df9f96514 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -32,39 +32,38 @@ extern "C" { #define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSDB ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0) // clang-format on -typedef struct TSDBROW TSDBROW; -typedef struct TABLEID TABLEID; -typedef struct TSDBKEY TSDBKEY; -typedef struct SDelData SDelData; -typedef struct SDelIdx SDelIdx; -typedef struct STbData STbData; -typedef struct SMemTable SMemTable; -typedef struct STbDataIter STbDataIter; -typedef struct STable STable; -typedef struct SMapData SMapData; -typedef struct SBlockIdx SBlockIdx; -typedef struct SBlock SBlock; -typedef struct SBlockStatis SBlockStatis; -typedef struct SAggrBlkCol SAggrBlkCol; -typedef struct SColData SColData; -typedef struct SBlockDataHdr SBlockDataHdr; -typedef struct SBlockData SBlockData; -typedef struct SDelFile SDelFile; -typedef struct STsdbCacheFile STsdbCacheFile; -typedef struct SHeadFile SHeadFile; -typedef struct SDataFile SDataFile; -typedef struct SLastFile SLastFile; -typedef struct SSmaFile SSmaFile; -typedef struct SDFileSet SDFileSet; -typedef struct SDataFWriter SDataFWriter; -typedef struct SDataFReader SDataFReader; -typedef struct SDelFWriter SDelFWriter; -typedef struct SDelFReader SDelFReader; -typedef struct SRowIter SRowIter; -typedef struct STsdbFS STsdbFS; -typedef struct SRowMerger SRowMerger; -typedef struct STsdbFSState STsdbFSState; -typedef struct STsdbSnapHdr STsdbSnapHdr; +typedef struct TSDBROW TSDBROW; +typedef struct TABLEID TABLEID; +typedef struct TSDBKEY TSDBKEY; +typedef struct SDelData SDelData; +typedef struct SDelIdx SDelIdx; +typedef struct STbData STbData; +typedef struct SMemTable SMemTable; +typedef struct STbDataIter STbDataIter; +typedef struct STable STable; +typedef struct SMapData SMapData; +typedef struct SBlockIdx SBlockIdx; +typedef struct SBlock SBlock; +typedef struct SBlockStatis SBlockStatis; +typedef struct SAggrBlkCol SAggrBlkCol; +typedef struct SColData SColData; +typedef struct SBlockDataHdr SBlockDataHdr; +typedef struct SBlockData SBlockData; +typedef struct SDelFile SDelFile; +typedef struct SHeadFile SHeadFile; +typedef struct SDataFile SDataFile; +typedef struct SLastFile SLastFile; +typedef struct SSmaFile SSmaFile; +typedef struct SDFileSet SDFileSet; +typedef struct SDataFWriter SDataFWriter; +typedef struct SDataFReader SDataFReader; +typedef struct SDelFWriter SDelFWriter; +typedef struct SDelFReader SDelFReader; +typedef struct SRowIter SRowIter; +typedef struct STsdbFS STsdbFS; +typedef struct SRowMerger SRowMerger; +typedef struct STsdbFSState STsdbFSState; +typedef struct STsdbSnapHdr STsdbSnapHdr; #define TSDB_MAX_SUBBLOCKS 8 #define TSDB_FHDR_SIZE 512 @@ -163,6 +162,7 @@ int32_t tGetMapData(uint8_t *p, SMapData *pMapData); // other int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision); void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey); +int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now); int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline); void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg); // tsdbMemTable ============================================================================================== @@ -200,6 +200,7 @@ int32_t tsdbFSRollback(STsdbFS *pFS); int32_t tsdbFSStateUpsertDelFile(STsdbFSState *pState, SDelFile *pDelFile); int32_t tsdbFSStateUpsertDFileSet(STsdbFSState *pState, SDFileSet *pSet); +void tsdbFSStateDeleteDFileSet(STsdbFSState *pState, int32_t fid); SDelFile *tsdbFSStateGetDelFile(STsdbFSState *pState); SDFileSet *tsdbFSStateGetDFileSet(STsdbFSState *pState, int32_t fid); // tsdbReaderWriter.c ============================================================================================== @@ -213,6 +214,7 @@ int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, uint8_ SBlockIdx *pBlockIdx, SBlock *pBlock, int8_t cmprAlg); SDFileSet *tsdbDataFWriterGetWSet(SDataFWriter *pWriter); +int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo); // SDataFReader int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet); int32_t tsdbDataFReaderClose(SDataFReader **ppReader); @@ -235,17 +237,26 @@ int32_t tsdbDelFReaderClose(SDelFReader **ppReader); int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, uint8_t **ppBuf); int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx, uint8_t **ppBuf); +#define TSDB_CACHE_NO(c) ((c).cacheLast == 0) +#define TSDB_CACHE_LAST_ROW(c) (((c).cacheLast & 1) > 0) +#define TSDB_CACHE_LAST(c) (((c).cacheLast & 2) > 0) + // tsdbCache int32_t tsdbOpenCache(STsdb *pTsdb); void tsdbCloseCache(SLRUCache *pCache); -int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row); +int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb *pTsdb); int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, STSRow *row, bool dup); int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **h); int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **h); int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h); +int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey); +int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey); int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey); +void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity); +size_t tsdbCacheGetCapacity(SVnode *pVnode); + int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema); // structs ======================= diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 0c386babde..7b298ba830 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -122,6 +122,7 @@ int tsdbOpen(SVnode* pVnode, STsdb** ppTsdb, const char* dir, STsdbKeepC int tsdbClose(STsdb** pTsdb); int32_t tsdbBegin(STsdb* pTsdb); int32_t tsdbCommit(STsdb* pTsdb); +int32_t tsdbDoRetention(STsdb* pTsdb, int64_t now); int tsdbScanAndConvertSubmitMsg(STsdb* pTsdb, SSubmitReq* pMsg); int tsdbInsertData(STsdb* pTsdb, int64_t version, SSubmitReq* pMsg, SSubmitRsp* pRsp); int32_t tsdbInsertTableData(STsdb* pTsdb, int64_t version, SSubmitMsgIter* pMsgIter, SSubmitBlk* pBlock, @@ -171,8 +172,9 @@ int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg); int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg); int64_t tdRSmaGetMaxSubmitVer(SSma* pSma, int8_t level); -int32_t tdProcessRSmaCreate(SVnode* pVnode, SVCreateStbReq* pReq); +int32_t tdProcessRSmaCreate(SSma* pSma, SVCreateStbReq* pReq); int32_t tdProcessRSmaSubmit(SSma* pSma, void* pMsg, int32_t inputType); +int32_t tdProcessRSmaDrop(SSma* pSma, SVDropStbReq* pReq); int32_t tdFetchTbUidList(SSma* pSma, STbUidStore** ppStore, tb_uid_t suid, tb_uid_t uid); int32_t tdUpdateTbUidList(SSma* pSma, STbUidStore* pUidStore); void tdUidStoreDestory(STbUidStore* pStore); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index db959a83b0..e1236c2853 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -147,6 +147,8 @@ int metaTbCursorNext(SMTbCursor *pTbCur) { return -1; } + tDecoderClear(&pTbCur->mr.coder); + metaGetTableEntryByVersion(&pTbCur->mr, *(int64_t *)pTbCur->pVal, *(tb_uid_t *)pTbCur->pKey); if (pTbCur->mr.me.type == TSDB_SUPER_TABLE) { continue; diff --git a/source/dnode/vnode/src/sma/smaEnv.c b/source/dnode/vnode/src/sma/smaEnv.c index 5eb9665326..2cf4fd51a9 100644 --- a/source/dnode/vnode/src/sma/smaEnv.c +++ b/source/dnode/vnode/src/sma/smaEnv.c @@ -254,26 +254,7 @@ static void tdDestroyRSmaStat(void *pRSmaStat) { // step 1: set rsma trigger stat cancelled atomic_store_8(RSMA_TRIGGER_STAT(pStat), TASK_TRIGGER_STAT_CANCELLED); - // step 2: wait the persistence thread to finish - int32_t nLoops = 0; - if (atomic_load_8(RSMA_RUNNING_STAT(pStat)) == 1) { - while (1) { - if (atomic_load_8(RSMA_TRIGGER_STAT(pStat)) == TASK_TRIGGER_STAT_FINISHED) { - smaDebug("vgId:%d, rsma persist task finished already", SMA_VID(pSma)); - break; - } else { - smaDebug("vgId:%d, rsma persist task not finished yet since rsma stat in %" PRIi8, SMA_VID(pSma), - atomic_load_8(RSMA_TRIGGER_STAT(pStat))); - } - ++nLoops; - if (nLoops > 1000) { - sched_yield(); - nLoops = 0; - } - } - } - - // step 3: destroy the rsma info and associated fetch tasks + // step 2: destroy the rsma info and associated fetch tasks // TODO: use taosHashSetFreeFp when taosHashSetFreeFp is ready. if (taosHashGetSize(RSMA_INFO_HASH(pStat)) > 0) { void *infoHash = taosHashIterate(RSMA_INFO_HASH(pStat), NULL); @@ -285,8 +266,8 @@ static void tdDestroyRSmaStat(void *pRSmaStat) { } taosHashCleanup(RSMA_INFO_HASH(pStat)); - // step 5: wait all triggered fetch tasks finished - nLoops = 0; + // step 3: wait all triggered fetch tasks finished + int32_t nLoops = 0; while (1) { if (T_REF_VAL_GET((SSmaStat *)pStat) == 0) { smaDebug("vgId:%d, rsma fetch tasks all finished", SMA_VID(pSma)); diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index efa2886e48..14497c6f9b 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -37,8 +37,6 @@ static SRSmaInfo *tdGetRSmaInfoBySuid(SSma *pSma, int64_t suid); static int32_t tdRSmaFetchAndSubmitResult(SRSmaInfoItem *pItem, STSchema *pTSchema, int64_t suid, SRSmaStat *pStat, int8_t blkType); static void tdRSmaFetchTrigger(void *param, void *tmrId); -static void tdRSmaPersistTrigger(void *param, void *tmrId); -static void *tdRSmaPersistExec(void *param); static void tdRSmaQTaskInfoGetFName(int32_t vid, int64_t version, char *outputName); static int32_t tdRSmaQTaskInfoIterInit(SRSmaQTaskInfoIter *pIter, STFile *pTFile); @@ -68,8 +66,8 @@ struct SRSmaInfo { static SRSmaInfo *tdGetRSmaInfoByItem(SRSmaInfoItem *pItem) { // adapt accordingly if definition of SRSmaInfo update int32_t rsmaInfoHeadLen = sizeof(int64_t) + sizeof(STSchema *); - ASSERT(pItem->level == 1 || pItem->level == 2); - return (SRSmaInfo *)POINTER_SHIFT(pItem, -sizeof(SRSmaInfoItem) * (pItem->level - 1) - rsmaInfoHeadLen); + ASSERT(pItem->level == 0 || pItem->level == 1); + return (SRSmaInfo *)POINTER_SHIFT(pItem, -sizeof(SRSmaInfoItem) * pItem->level - rsmaInfoHeadLen); } struct SRSmaQTaskInfoItem { @@ -278,7 +276,7 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat if (pItem->maxDelay > TSDB_MAX_ROLLUP_MAX_DELAY) { pItem->maxDelay = TSDB_MAX_ROLLUP_MAX_DELAY; } - pItem->level = (idx == 0 ? TSDB_RETENTION_L1 : TSDB_RETENTION_L2); + pItem->level = idx; smaInfo("vgId:%d table:%" PRIi64 " level:%" PRIi8 " maxdelay:%" PRIi64 " watermark:%" PRIi64 ", finally maxdelay:%" PRIi32, SMA_VID(pSma), pRSmaInfo->suid, idx + 1, param->maxdelay[idx], param->watermark[idx], pItem->maxDelay); @@ -375,20 +373,48 @@ _err: /** * @brief Check and init qTaskInfo_t, only applicable to stable with SRSmaParam currently * - * @param pVnode + * @param pSma * @param pReq * @return int32_t */ -int32_t tdProcessRSmaCreate(SVnode *pVnode, SVCreateStbReq *pReq) { - SSma *pSma = pVnode->pSma; +int32_t tdProcessRSmaCreate(SSma *pSma, SVCreateStbReq *pReq) { + SVnode *pVnode = pSma->pVnode; if (!pReq->rollup) { - smaTrace("vgId:%d, return directly since no rollup for stable %s %" PRIi64, SMA_VID(pSma), pReq->name, pReq->suid); + smaTrace("vgId:%d, not create rsma for stable %s %" PRIi64 " since no rollup in req", TD_VID(pVnode), pReq->name, + pReq->suid); + return TSDB_CODE_SUCCESS; + } + + if (!VND_IS_RSMA(pVnode)) { + smaTrace("vgId:%d, not create rsma for stable %s %" PRIi64 " since vnd is not rsma", TD_VID(pVnode), pReq->name, + pReq->suid); return TSDB_CODE_SUCCESS; } return tdProcessRSmaCreateImpl(pSma, &pReq->rsmaParam, pReq->suid, pReq->name); } +/** + * @brief drop cache for stb + * + * @param pSma + * @param pReq + * @return int32_t + */ +int32_t tdProcessRSmaDrop(SSma *pSma, SVDropStbReq *pReq) { + SVnode *pVnode = pSma->pVnode; + if (!VND_IS_RSMA(pVnode)) { + smaTrace("vgId:%d, not create rsma for stable %s %" PRIi64 " since vnd is not rsma", TD_VID(pVnode), pReq->name, + pReq->suid); + return TSDB_CODE_SUCCESS; + } + + + + smaDebug("vgId:%d, drop rsma for table %" PRIi64 " succeed", TD_VID(pVnode), pReq->suid); + return TSDB_CODE_SUCCESS; + } + /** * @brief store suid/[uids], prefer to use array and then hash * @@ -1174,123 +1200,6 @@ _err: return TSDB_CODE_FAILED; } -static void *tdRSmaPersistExec(void *param) { - setThreadName("rsma-task-persist"); - SRSmaStat *pRSmaStat = param; - SSma *pSma = pRSmaStat->pSma; - - int8_t triggerStat = atomic_load_8(RSMA_TRIGGER_STAT(pRSmaStat)); - - if (TASK_TRIGGER_STAT_CANCELLED == triggerStat || TASK_TRIGGER_STAT_PAUSED == triggerStat) { - goto _end; - } - - // execution - tdRSmaPersistExecImpl(pRSmaStat); - -_end: - if (TASK_TRIGGER_STAT_INACTIVE == atomic_val_compare_exchange_8(RSMA_TRIGGER_STAT(pRSmaStat), - TASK_TRIGGER_STAT_INACTIVE, - TASK_TRIGGER_STAT_ACTIVE)) { - smaDebug("vgId:%d, rsma persist task is active again", SMA_VID(pSma)); - } else if (TASK_TRIGGER_STAT_CANCELLED == atomic_val_compare_exchange_8(RSMA_TRIGGER_STAT(pRSmaStat), - TASK_TRIGGER_STAT_CANCELLED, - TASK_TRIGGER_STAT_FINISHED)) { - smaDebug("vgId:%d, rsma persist task is cancelled", SMA_VID(pSma)); - } else { - smaWarn("vgId:%d, rsma persist task in stat %" PRIi8, SMA_VID(pSma), atomic_load_8(RSMA_TRIGGER_STAT(pRSmaStat))); - } - - atomic_store_8(RSMA_RUNNING_STAT(pRSmaStat), 0); - smaDebug("vgId:%d, release rsetId rsetId:%" PRIi64 " refId:%d", SMA_VID(pSma), smaMgmt.rsetId, pRSmaStat->refId); - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaStat->refId, __func__, __LINE__); - taosThreadExit(NULL); - return NULL; -} - -static void tdRSmaPersistTask(SRSmaStat *pRSmaStat) { - TdThreadAttr thAttr; - taosThreadAttrInit(&thAttr); - taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_DETACHED); - TdThread tid; - - if (taosThreadCreate(&tid, &thAttr, tdRSmaPersistExec, pRSmaStat) != 0) { - if (TASK_TRIGGER_STAT_INACTIVE == atomic_val_compare_exchange_8(RSMA_TRIGGER_STAT(pRSmaStat), - TASK_TRIGGER_STAT_INACTIVE, - TASK_TRIGGER_STAT_ACTIVE)) { - smaDebug("vgId:%d, persist task is active again", SMA_VID(pRSmaStat->pSma)); - } else if (TASK_TRIGGER_STAT_CANCELLED == atomic_val_compare_exchange_8(RSMA_TRIGGER_STAT(pRSmaStat), - TASK_TRIGGER_STAT_CANCELLED, - TASK_TRIGGER_STAT_FINISHED)) { - smaDebug("vgId:%d, persist task is cancelled and set finished", SMA_VID(pRSmaStat->pSma)); - } else { - smaWarn("vgId:%d, persist task in abnormal stat %" PRIi8, SMA_VID(pRSmaStat->pSma), - atomic_load_8(RSMA_TRIGGER_STAT(pRSmaStat))); - } - atomic_store_8(RSMA_RUNNING_STAT(pRSmaStat), 0); - smaDebug("vgId:%d, release rsetId rsetId:%" PRIi64 " refId:%d)", SMA_VID(pRSmaStat->pSma), smaMgmt.rsetId, - pRSmaStat->refId); - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaStat->refId, __func__, __LINE__); - } - - taosThreadAttrDestroy(&thAttr); -} - -/** - * @brief trigger to persist rsma qTaskInfo - * - * @param param - * @param tmrId - */ -static void tdRSmaPersistTrigger(void *param, void *tmrId) { - SRSmaStat *rsmaStat = param; - SRSmaStat *pRSmaStat = (SRSmaStat *)taosAcquireRef(smaMgmt.rsetId, rsmaStat->refId); - ASSERT(0); - if (!pRSmaStat) { - smaDebug("rsma persistence task not start since already destroyed"); - return; - } - - int8_t tmrStat = - atomic_val_compare_exchange_8(RSMA_TRIGGER_STAT(pRSmaStat), TASK_TRIGGER_STAT_ACTIVE, TASK_TRIGGER_STAT_INACTIVE); - switch (tmrStat) { - case TASK_TRIGGER_STAT_ACTIVE: { - atomic_store_8(RSMA_RUNNING_STAT(pRSmaStat), 1); - if (TASK_TRIGGER_STAT_CANCELLED != atomic_val_compare_exchange_8(RSMA_TRIGGER_STAT(pRSmaStat), - TASK_TRIGGER_STAT_CANCELLED, - TASK_TRIGGER_STAT_FINISHED)) { - smaDebug("vgId:%d, rsma persistence start since active", SMA_VID(pRSmaStat->pSma)); - - // start persist task - tdRSmaPersistTask(pRSmaStat); - - // taosTmrReset(tdRSmaPersistTrigger, 5000, pRSmaStat, pRSmaStat->tmrHandle, - // RSMA_TMR_ID(pRSmaStat)); - } else { - atomic_store_8(RSMA_RUNNING_STAT(pRSmaStat), 0); - } - return; - } break; - case TASK_TRIGGER_STAT_CANCELLED: { - atomic_store_8(RSMA_TRIGGER_STAT(pRSmaStat), TASK_TRIGGER_STAT_FINISHED); - smaDebug("rsma persistence not start since cancelled and finished"); - } break; - case TASK_TRIGGER_STAT_PAUSED: { - smaDebug("rsma persistence not start since paused"); - } break; - case TASK_TRIGGER_STAT_INACTIVE: { - smaDebug("rsma persistence not start since inactive"); - } break; - case TASK_TRIGGER_STAT_INIT: { - smaDebug("rsma persistence not start since init"); - } break; - default: { - smaWarn("rsma persistence not start since unknown stat %" PRIi8, tmrStat); - } break; - } - taosReleaseRef(smaMgmt.rsetId, rsmaStat->refId); -} - /** * @brief trigger to get rsma result * @@ -1314,8 +1223,7 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { int8_t rsmaTriggerStat = atomic_load_8(RSMA_TRIGGER_STAT(pStat)); switch (rsmaTriggerStat) { case TASK_TRIGGER_STAT_PAUSED: - case TASK_TRIGGER_STAT_CANCELLED: - case TASK_TRIGGER_STAT_FINISHED: { + case TASK_TRIGGER_STAT_CANCELLED: { tdReleaseSmaRef(smaMgmt.rsetId, pItem->refId, __func__, __LINE__); smaDebug("vgId:%d, not fetch rsma level %" PRIi8 " data since stat is %" PRIi8 ", rsetId rsetId:%" PRIi64 " refId:%d", @@ -1328,7 +1236,7 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { SRSmaInfo *pRSmaInfo = tdGetRSmaInfoByItem(pItem); - ASSERT(pRSmaInfo->suid > 0); + ASSERT(pRSmaInfo->items[pItem->level].level == pItem->level); int8_t fetchTriggerStat = atomic_val_compare_exchange_8(&pItem->triggerStat, TASK_TRIGGER_STAT_ACTIVE, TASK_TRIGGER_STAT_INACTIVE); diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 3873073f03..fbb972fafe 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -394,7 +394,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) { } else { ASSERT(pHandle->fetchMeta); ASSERT(IS_META_MSG(pHead->msgType)); - tqInfo("fetch meta msg, ver:%" PRId64 ", type:%d", pHead->version, pHead->msgType); + tqDebug("fetch meta msg, ver:%" PRId64 ", type:%d", pHead->version, pHead->msgType); SMqMetaRsp metaRsp = {0}; /*metaRsp.reqOffset = pReq->reqOffset.version;*/ /*metaRsp.rspOffset = fetchVer;*/ diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 0c5f851d97..605f4bf3d5 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -15,11 +15,15 @@ #include "tsdb.h" +typedef struct { + TSKEY ts; + SColVal colVal; +} SLastCol; + int32_t tsdbOpenCache(STsdb *pTsdb) { int32_t code = 0; SLRUCache *pCache = NULL; - // TODO: get cfg from vnode config: pTsdb->pVnode->config.lruCapacity - size_t cfgCapacity = 1024 * 1024; + size_t cfgCapacity = pTsdb->pVnode->config.cacheLastSize * 1024 * 1024; pCache = taosLRUCacheInit(cfgCapacity, -1, .5); if (pCache == NULL) { @@ -61,10 +65,11 @@ static void deleteTableCacheLastrow(const void *key, size_t keyLen, void *value) static void deleteTableCacheLast(const void *key, size_t keyLen, void *value) { taosArrayDestroy(value); } -static int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { +int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { int32_t code = 0; - char key[32] = {0}; - int keyLen = 0; + + char key[32] = {0}; + int keyLen = 0; // getTableCacheKey(uid, "lr", key, &keyLen); getTableCacheKey(uid, 0, key, &keyLen); @@ -83,18 +88,79 @@ static int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKe return code; } -static int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { +int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { int32_t code = 0; - char key[32] = {0}; - int keyLen = 0; + + char key[32] = {0}; + int keyLen = 0; // getTableCacheKey(uid, "l", key, &keyLen); getTableCacheKey(uid, 1, key, &keyLen); LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); if (h) { - // clear last cache anyway, no matter where eKey ends. - taosLRUCacheRelease(pCache, h, true); + SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); + bool invalidate = false; + int16_t nCol = taosArrayGetSize(pLast); + for (int16_t iCol = 0; iCol < nCol; ++iCol) { + SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); + if (eKey >= tTsVal->ts) { + invalidate = true; + break; + } + } + + if (invalidate) { + taosLRUCacheRelease(pCache, h, true); + } else { + taosLRUCacheRelease(pCache, h, false); + } + // void taosLRUCacheErase(SLRUCache * cache, const void *key, size_t keyLen); + } + + return code; +} + +int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { + int32_t code = 0; + char key[32] = {0}; + int keyLen = 0; + + // getTableCacheKey(uid, "lr", key, &keyLen); + getTableCacheKey(uid, 0, key, &keyLen); + LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); + if (h) { + STSRow *pRow = (STSRow *)taosLRUCacheValue(pCache, h); + if (pRow->ts <= eKey) { + taosLRUCacheRelease(pCache, h, true); + } else { + taosLRUCacheRelease(pCache, h, false); + } + + // void taosLRUCacheErase(SLRUCache * cache, const void *key, size_t keyLen); + } + + // getTableCacheKey(uid, "l", key, &keyLen); + getTableCacheKey(uid, 1, key, &keyLen); + h = taosLRUCacheLookup(pCache, key, keyLen); + if (h) { + SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); + bool invalidate = false; + int16_t nCol = taosArrayGetSize(pLast); + + for (int16_t iCol = 0; iCol < nCol; ++iCol) { + SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); + if (eKey >= tTsVal->ts) { + invalidate = true; + break; + } + } + + if (invalidate) { + taosLRUCacheRelease(pCache, h, true); + } else { + taosLRUCacheRelease(pCache, h, false); + } // void taosLRUCacheErase(SLRUCache * cache, const void *key, size_t keyLen); } @@ -173,20 +239,59 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, ST return code; } -int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row) { +int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb *pTsdb) { int32_t code = 0; STSRow *cacheRow = NULL; char key[32] = {0}; int keyLen = 0; - ((void)(row)); + // ((void)(row)); // getTableCacheKey(uid, "l", key, &keyLen); getTableCacheKey(uid, 1, key, &keyLen); LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); if (h) { + STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); + TSKEY keyTs = row->ts; + bool invalidate = false; + + SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); + int16_t nCol = taosArrayGetSize(pLast); + int16_t iCol = 0; + + SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); + if (keyTs > tTsVal->ts) { + STColumn *pTColumn = &pTSchema->columns[0]; + SColVal tColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = keyTs}); + + taosArraySet(pLast, iCol, &(SLastCol){.ts = keyTs, .colVal = tColVal}); + } + + for (++iCol; iCol < nCol; ++iCol) { + SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); + if (keyTs >= tTsVal->ts) { + SColVal *tColVal = &tTsVal->colVal; + + SColVal colVal = {0}; + tTSRowGetVal(row, pTSchema, iCol, &colVal); + if (colVal.isNone || colVal.isNull) { + if (keyTs == tTsVal->ts && !tColVal->isNone && !tColVal->isNull) { + invalidate = true; + + break; + } + } else { + taosArraySet(pLast, iCol, &(SLastCol){.ts = keyTs, .colVal = colVal}); + } + } + } + + taosMemoryFreeClear(pTSchema); + + taosLRUCacheRelease(pCache, h, invalidate); + // clear last cache anyway, lazy load when get last lookup - taosLRUCacheRelease(pCache, h, true); + // taosLRUCacheRelease(pCache, h, true); } return code; @@ -361,12 +466,13 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) { case SFSNEXTROW_FS: state->aDFileSet = state->pTsdb->fs->cState->aDFileSet; state->nFileSet = taosArrayGetSize(state->aDFileSet); - state->iFileSet = state->nFileSet - 1; + state->iFileSet = state->nFileSet; state->pBlockData = NULL; case SFSNEXTROW_FILESET: { SDFileSet *pFileSet = NULL; + _next_fileset: if (--state->iFileSet >= 0) { pFileSet = (SDFileSet *)taosArrayGet(state->aDFileSet, state->iFileSet); } else { @@ -403,6 +509,10 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) { state->pBlockIdx = taosArraySearch(state->aBlockIdx, state->pBlockIdxExp, tCmprBlockIdx, TD_EQ); if (code) goto _err; + if (!state->pBlockIdx) { + goto _next_fileset; + } + tMapDataReset(&state->blockMap); code = tsdbReadBlock(state->pDataFReader, state->pBlockIdx, &state->blockMap, NULL); /* code = tsdbReadBlock(state->pDataFReader, &state->blockIdx, &state->blockMap, NULL); */ @@ -516,12 +626,46 @@ typedef struct SMemNextRowIter { SMEMNEXTROWSTATES state; STbData *pMem; // [input] STbDataIter iter; // mem buffer skip list iterator + // bool iterOpened; + // TSDBROW *curRow; } SMemNextRowIter; static int32_t getNextRowFromMem(void *iter, TSDBROW **ppRow) { + // static int32_t getNextRowFromMem(void *iter, SArray *pRowArray) { SMemNextRowIter *state = (SMemNextRowIter *)iter; int32_t code = 0; + /* + if (!state->iterOpened) { + if (state->pMem != NULL) { + tsdbTbDataIterOpen(state->pMem, NULL, 1, &state->iter); + state->iterOpened = true; + + TSDBROW *pMemRow = tsdbTbDataIterGet(&state->iter); + if (pMemRow) { + state->curRow = pMemRow; + } else { + return code; + } + } else { + return code; + } + } + + taosArrayPush(pRowArray, state->curRow); + while (tsdbTbDataIterNext(&state->iter)) { + TSDBROW *row = tsdbTbDataIterGet(&state->iter); + + if (TSDBROW_TS(row) < TSDBROW_TS(state->curRow)) { + state->curRow = row; + break; + } else { + taosArrayPush(pRowArray, row); + } + } + + return code; + */ switch (state->state) { case SMEMNEXTROW_ENTER: { if (state->pMem != NULL) { @@ -599,7 +743,7 @@ _exit: return code; } -static bool tsdbKeyDeleted(TSDBKEY *key, SArray *pSkyline, int *iSkyline) { +static bool tsdbKeyDeleted(TSDBKEY *key, SArray *pSkyline, int64_t *iSkyline) { bool deleted = false; while (*iSkyline > 0) { TSDBKEY *pItemBack = (TSDBKEY *)taosArrayGet(pSkyline, *iSkyline); @@ -626,9 +770,11 @@ static bool tsdbKeyDeleted(TSDBKEY *key, SArray *pSkyline, int *iSkyline) { } typedef int32_t (*_next_row_fn_t)(void *iter, TSDBROW **ppRow); +// typedef int32_t (*_next_row_fn_t)(void *iter, SArray *pRowArray); typedef int32_t (*_next_row_clear_fn_t)(void *iter); -typedef struct TsdbNextRowState { +// typedef struct TsdbNextRowState { +typedef struct { TSDBROW *pRow; bool stop; bool next; @@ -637,6 +783,388 @@ typedef struct TsdbNextRowState { _next_row_clear_fn_t nextRowClearFn; } TsdbNextRowState; +typedef struct { + // STsdb *pTsdb; + SArray *pSkyline; + int64_t iSkyline; + + SBlockIdx idx; + SMemNextRowIter memState; + SMemNextRowIter imemState; + SFSNextRowIter fsState; + TSDBROW memRow, imemRow, fsRow; + + TsdbNextRowState input[3]; +} CacheNextRowIter; + +static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb) { + int code = 0; + + tb_uid_t suid = getTableSuidByUid(uid, pTsdb); + + STbData *pMem = NULL; + if (pTsdb->mem) { + tsdbGetTbDataFromMemTable(pTsdb->mem, suid, uid, &pMem); + } + + STbData *pIMem = NULL; + if (pTsdb->imem) { + tsdbGetTbDataFromMemTable(pTsdb->imem, suid, uid, &pIMem); + } + + pIter->pSkyline = taosArrayInit(32, sizeof(TSDBKEY)); + + SDelIdx delIdx; + + SDelFile *pDelFile = tsdbFSStateGetDelFile(pTsdb->fs->cState); + if (pDelFile) { + SDelFReader *pDelFReader; + + code = tsdbDelFReaderOpen(&pDelFReader, pDelFile, pTsdb, NULL); + if (code) goto _err; + + code = getTableDelIdx(pDelFReader, suid, uid, &delIdx); + if (code) goto _err; + + code = getTableDelSkyline(pMem, pIMem, pDelFReader, &delIdx, pIter->pSkyline); + if (code) goto _err; + + tsdbDelFReaderClose(&pDelFReader); + } else { + code = getTableDelSkyline(pMem, pIMem, NULL, NULL, pIter->pSkyline); + if (code) goto _err; + } + + pIter->iSkyline = taosArrayGetSize(pIter->pSkyline) - 1; + + pIter->idx = (SBlockIdx){.suid = suid, .uid = uid}; + + pIter->fsState.state = SFSNEXTROW_FS; + pIter->fsState.pTsdb = pTsdb; + pIter->fsState.pBlockIdxExp = &pIter->idx; + + pIter->input[0] = (TsdbNextRowState){&pIter->memRow, true, false, &pIter->memState, getNextRowFromMem, NULL}; + pIter->input[1] = (TsdbNextRowState){&pIter->imemRow, true, false, &pIter->imemState, getNextRowFromMem, NULL}; + pIter->input[2] = + (TsdbNextRowState){&pIter->fsRow, false, true, &pIter->fsState, getNextRowFromFS, clearNextRowFromFS}; + + if (pMem) { + pIter->memState.pMem = pMem; + pIter->memState.state = SMEMNEXTROW_ENTER; + pIter->input[0].stop = false; + pIter->input[0].next = true; + } + + if (pIMem) { + pIter->imemState.pMem = pIMem; + pIter->imemState.state = SMEMNEXTROW_ENTER; + pIter->input[1].stop = false; + pIter->input[1].next = true; + } + + return code; +_err: + return code; +} + +static int32_t nextRowIterClose(CacheNextRowIter *pIter) { + int code = 0; + + for (int i = 0; i < 3; ++i) { + if (pIter->input[i].nextRowClearFn) { + pIter->input[i].nextRowClearFn(pIter->input[i].iter); + } + } + + if (pIter->pSkyline) { + taosArrayDestroy(pIter->pSkyline); + } + + return code; +_err: + return code; +} + +// iterate next row non deleted backward ts, version (from high to low) +static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow) { + int code = 0; + + for (int i = 0; i < 3; ++i) { + if (pIter->input[i].next && !pIter->input[i].stop) { + code = pIter->input[i].nextRowFn(pIter->input[i].iter, &pIter->input[i].pRow); + if (code) goto _err; + + if (pIter->input[i].pRow == NULL) { + pIter->input[i].stop = true; + pIter->input[i].next = false; + } + } + } + + if (pIter->input[0].stop && pIter->input[1].stop && pIter->input[2].stop) { + *ppRow = NULL; + return code; + } + + // select maxpoint(s) from mem, imem, fs + TSDBROW *max[3] = {0}; + int iMax[3] = {-1, -1, -1}; + int nMax = 0; + TSKEY maxKey = TSKEY_MIN; + + for (int i = 0; i < 3; ++i) { + if (!pIter->input[i].stop && pIter->input[i].pRow != NULL) { + TSDBKEY key = TSDBROW_KEY(pIter->input[i].pRow); + + // merging & deduplicating on client side + if (maxKey <= key.ts) { + if (maxKey < key.ts) { + nMax = 0; + maxKey = key.ts; + } + + iMax[nMax] = i; + max[nMax++] = pIter->input[i].pRow; + } + } + } + + // delete detection + TSDBROW *merge[3] = {0}; + int iMerge[3] = {-1, -1, -1}; + int nMerge = 0; + for (int i = 0; i < nMax; ++i) { + TSDBKEY maxKey = TSDBROW_KEY(max[i]); + + bool deleted = tsdbKeyDeleted(&maxKey, pIter->pSkyline, &pIter->iSkyline); + if (!deleted) { + iMerge[nMerge] = iMax[i]; + merge[nMerge++] = max[i]; + } + + pIter->input[iMax[i]].next = deleted; + } + + if (nMerge > 0) { + pIter->input[iMerge[0]].next = true; + + *ppRow = merge[0]; + } else { + *ppRow = NULL; + } + + return code; +_err: + return code; +} + +static int32_t mergeLastRow2(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRow) { + int32_t code = 0; + + STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); + int16_t nCol = pTSchema->numOfCols; + int16_t iCol = 0; + int16_t noneCol = 0; + bool setNoneCol = false; + SArray *pColArray = taosArrayInit(nCol, sizeof(SColVal)); + SColVal *pColVal = &(SColVal){0}; + + // tb_uid_t suid = getTableSuidByUid(uid, pTsdb); + + TSKEY lastRowTs = TSKEY_MAX; + + CacheNextRowIter iter = {0}; + nextRowIterOpen(&iter, uid, pTsdb); + + do { + TSDBROW *pRow = NULL; + nextRowIterGet(&iter, &pRow); + + if (!pRow) { + break; + } + + if (lastRowTs == TSKEY_MAX) { + lastRowTs = TSDBROW_TS(pRow); + STColumn *pTColumn = &pTSchema->columns[0]; + + *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = lastRowTs}); + if (taosArrayPush(pColArray, pColVal) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + + for (iCol = 1; iCol < nCol; ++iCol) { + tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal); + + if (taosArrayPush(pColArray, pColVal) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + + if (pColVal->isNone && !setNoneCol) { + noneCol = iCol; + setNoneCol = true; + } + } + if (!setNoneCol) { + // goto build the result ts row + break; + } else { + continue; + } + } + + if ((TSDBROW_TS(pRow) < lastRowTs)) { + // goto build the result ts row + break; + } + + // merge into pColArray + setNoneCol = false; + for (iCol = noneCol; iCol < nCol; ++iCol) { + // high version's column value + SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, iCol); + + tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal); + if (tColVal->isNone && !pColVal->isNone) { + taosArraySet(pColArray, iCol, pColVal); + } else if (tColVal->isNone && pColVal->isNone && !setNoneCol) { + noneCol = iCol; + setNoneCol = true; + } + } + } while (setNoneCol); + + // build the result ts row here + *dup = false; + if (taosArrayGetSize(pColArray) == nCol) { + code = tdSTSRowNew(pColArray, pTSchema, ppRow); + if (code) goto _err; + } else { + *ppRow = NULL; + } + + nextRowIterClose(&iter); + taosArrayDestroy(pColArray); + taosMemoryFreeClear(pTSchema); + return code; + +_err: + nextRowIterClose(&iter); + taosArrayDestroy(pColArray); + taosMemoryFreeClear(pTSchema); + return code; +} + +static int32_t mergeLast2(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) { + int32_t code = 0; + + STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); + int16_t nCol = pTSchema->numOfCols; + int16_t iCol = 0; + int16_t noneCol = 0; + bool setNoneCol = false; + SArray *pColArray = taosArrayInit(nCol, sizeof(SLastCol)); + SColVal *pColVal = &(SColVal){0}; + + // tb_uid_t suid = getTableSuidByUid(uid, pTsdb); + + TSKEY lastRowTs = TSKEY_MAX; + + CacheNextRowIter iter = {0}; + nextRowIterOpen(&iter, uid, pTsdb); + + do { + TSDBROW *pRow = NULL; + nextRowIterGet(&iter, &pRow); + + if (!pRow) { + break; + } + + TSKEY rowTs = TSDBROW_TS(pRow); + + if (lastRowTs == TSKEY_MAX) { + lastRowTs = rowTs; + STColumn *pTColumn = &pTSchema->columns[0]; + + *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = lastRowTs}); + if (taosArrayPush(pColArray, &(SLastCol){.ts = lastRowTs, .colVal = *pColVal}) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + + for (iCol = 1; iCol < nCol; ++iCol) { + tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal); + + if (taosArrayPush(pColArray, &(SLastCol){.ts = lastRowTs, .colVal = *pColVal}) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + + if ((pColVal->isNone || pColVal->isNull) && !setNoneCol) { + noneCol = iCol; + setNoneCol = true; + } + } + if (!setNoneCol) { + // goto build the result ts row + break; + } else { + continue; + } + } + /* + if ((TSDBROW_TS(pRow) < lastRowTs)) { + // goto build the result ts row + break; + } + */ + // merge into pColArray + setNoneCol = false; + for (iCol = noneCol; iCol < nCol; ++iCol) { + // high version's column value + SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, iCol); + + tsdbRowGetColVal(pRow, pTSchema, iCol, pColVal); + if ((tColVal->isNone || tColVal->isNull) && (!pColVal->isNone && !pColVal->isNull)) { + taosArraySet(pColArray, iCol, &(SLastCol){.ts = rowTs, .colVal = *pColVal}); + //} else if (tColVal->isNone && pColVal->isNone && !setNoneCol) { + } else if ((tColVal->isNone || tColVal->isNull) && (pColVal->isNone || pColVal->isNull) && !setNoneCol) { + noneCol = iCol; + setNoneCol = true; + } + } + } while (setNoneCol); + + // build the result ts row here + //*dup = false; + if (taosArrayGetSize(pColArray) <= 0) { + *ppLastArray = NULL; + taosArrayDestroy(pColArray); + } else { + *ppLastArray = pColArray; + } + /* if (taosArrayGetSize(pColArray) == nCol) { + code = tdSTSRowNew(pColArray, pTSchema, ppRow); + if (code) goto _err; + } else { + *ppRow = NULL; + }*/ + + nextRowIterClose(&iter); + // taosArrayDestroy(pColArray); + taosMemoryFreeClear(pTSchema); + return code; + +_err: + nextRowIterClose(&iter); + // taosArrayDestroy(pColArray); + taosMemoryFreeClear(pTSchema); + return code; +} + static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRow) { int32_t code = 0; SArray *pSkyline = NULL; @@ -682,7 +1210,7 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo if (code) goto _err; } - int iSkyline = taosArrayGetSize(pSkyline) - 1; + int64_t iSkyline = taosArrayGetSize(pSkyline) - 1; SBlockIdx idx = {.suid = suid, .uid = uid}; @@ -719,12 +1247,14 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo do { for (int i = 0; i < 3; ++i) { if (input[i].next && !input[i].stop) { - code = input[i].nextRowFn(input[i].iter, &input[i].pRow); - if (code) goto _err; - if (input[i].pRow == NULL) { - input[i].stop = true; - input[i].next = false; + code = input[i].nextRowFn(input[i].iter, &input[i].pRow); + if (code) goto _err; + + if (input[i].pRow == NULL) { + input[i].stop = true; + input[i].next = false; + } } } } @@ -758,14 +1288,14 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo // delete detection TSDBROW *merge[3] = {0}; - // int iMerge[3] = {-1, -1, -1}; - int nMerge = 0; + int iMerge[3] = {-1, -1, -1}; + int nMerge = 0; for (int i = 0; i < nMax; ++i) { TSDBKEY maxKey = TSDBROW_KEY(max[i]); bool deleted = tsdbKeyDeleted(&maxKey, pSkyline, &iSkyline); if (!deleted) { - // iMerge[nMerge] = i; + iMerge[nMerge] = i; merge[nMerge++] = max[i]; } @@ -792,7 +1322,7 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo } } - } while (*ppRow == NULL); + } while (1); for (int i = 0; i < 3; ++i) { if (input[i].nextRowClearFn) { @@ -819,11 +1349,6 @@ _err: return code; } -typedef struct { - TSKEY ts; - SColVal colVal; -} SLastCol; - // static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) { static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) { int32_t code = 0; @@ -873,7 +1398,7 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) { if (code) goto _err; } - int iSkyline = taosArrayGetSize(pSkyline) - 1; + int64_t iSkyline = taosArrayGetSize(pSkyline) - 1; SBlockIdx idx = {.suid = suid, .uid = uid}; @@ -1128,7 +1653,7 @@ int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUH } else { STSRow *pRow = NULL; bool dup = false; // which is always false for now - code = mergeLastRow(uid, pTsdb, &dup, &pRow); + code = mergeLastRow2(uid, pTsdb, &dup, &pRow); // if table's empty or error, return code of -1 if (code < 0 || pRow == NULL) { if (!dup && pRow) { @@ -1195,7 +1720,8 @@ int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHand // STSRow *pRow = NULL; // code = mergeLast(uid, pTsdb, &pRow); SArray *pLastArray = NULL; - code = mergeLast(uid, pTsdb, &pLastArray); + // code = mergeLast(uid, pTsdb, &pLastArray); + code = mergeLast2(uid, pTsdb, &pLastArray); // if table's empty or error, return code of -1 // if (code < 0 || pRow == NULL) { if (code < 0 || pLastArray == NULL) { @@ -1219,52 +1745,6 @@ int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHand return code; } -int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { - int32_t code = 0; - char key[32] = {0}; - int keyLen = 0; - - // getTableCacheKey(uid, "lr", key, &keyLen); - getTableCacheKey(uid, 0, key, &keyLen); - LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); - if (h) { - STSRow *pRow = (STSRow *)taosLRUCacheValue(pCache, h); - if (pRow->ts <= eKey) { - taosLRUCacheRelease(pCache, h, true); - } else { - taosLRUCacheRelease(pCache, h, false); - } - - // void taosLRUCacheErase(SLRUCache * cache, const void *key, size_t keyLen); - } - - // getTableCacheKey(uid, "l", key, &keyLen); - getTableCacheKey(uid, 1, key, &keyLen); - h = taosLRUCacheLookup(pCache, key, keyLen); - if (h) { - SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); - bool invalidate = false; - int16_t nCol = taosArrayGetSize(pLast); - - for (int16_t iCol = 0; iCol < nCol; ++iCol) { - SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); - if (eKey >= tTsVal->ts) { - invalidate = true; - break; - } - } - - if (invalidate) { - taosLRUCacheRelease(pCache, h, true); - } else { - taosLRUCacheRelease(pCache, h, false); - } - // void taosLRUCacheErase(SLRUCache * cache, const void *key, size_t keyLen); - } - - return code; -} - int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h) { int32_t code = 0; @@ -1272,3 +1752,9 @@ int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h) { return code; } + +void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity) { + taosLRUCacheSetCapacity(pVnode->pTsdb->lruCache, capacity); +} + +size_t tsdbCacheGetCapacity(SVnode *pVnode) { return taosLRUCacheGetCapacity(pVnode->pTsdb->lruCache); } diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c index 4a33dab08c..53b6735c30 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS.c @@ -688,6 +688,14 @@ _exit: return code; } +void tsdbFSStateDeleteDFileSet(STsdbFSState *pState, int32_t fid) { + int32_t idx; + + idx = taosArraySearchIdx(pState->aDFileSet, &(SDFileSet){.fid = fid}, tDFileSetCmprFn, TD_EQ); + ASSERT(idx >= 0); + taosArrayRemove(pState->aDFileSet, idx); +} + SDelFile *tsdbFSStateGetDelFile(STsdbFSState *pState) { return pState->pDelFile; } SDFileSet *tsdbFSStateGetDFileSet(STsdbFSState *pState, int32_t fid) { diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index 9381f673d8..82de931872 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -181,8 +181,12 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid pMemTable->maxVersion = TMAX(pMemTable->maxVersion, version); pMemTable->nDel++; - if (tsdbKeyCmprFn(&lastKey, &pTbData->maxKey) >= 0) { - tsdbCacheDelete(pTsdb->lruCache, pTbData->uid, eKey); + if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && tsdbKeyCmprFn(&lastKey, &pTbData->maxKey) >= 0) { + tsdbCacheDeleteLastrow(pTsdb->lruCache, pTbData->uid, eKey); + } + + if (TSDB_CACHE_LAST(pMemTable->pTsdb->pVnode->config)) { + tsdbCacheDeleteLast(pTsdb->lruCache, pTbData->uid, eKey); } tsdbError("vgId:%d, delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64 @@ -556,12 +560,14 @@ static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, i pTbData->maxKey = key.ts; } - if (pLastRow != NULL) { + if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && pLastRow != NULL) { tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); } } - tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow); + if (TSDB_CACHE_LAST(pMemTable->pTsdb->pVnode->config)) { + tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow, pMemTable->pTsdb); + } pTbData->minVersion = TMIN(pTbData->minVersion, version); pTbData->maxVersion = TMAX(pTbData->maxVersion, version); diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 51f7f23776..5f796bbab9 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -323,6 +323,9 @@ static bool filesetIteratorNext(SFilesetIter* pIter, STsdbReader* pReader) { if ((asc && (win.ekey < pReader->window.skey)) || ((!asc) && (win.skey > pReader->window.ekey))) { pIter->index += step; + if ((asc && pIter->index >= pIter->numOfFiles) || ((!asc) && pIter->index < 0)) { + return false; + } continue; } diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index e96ee03b03..4e7a9d3b04 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -1913,3 +1913,114 @@ _err: taosArrayDestroy(aBlockCol); return code; } + +int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) { + int32_t code = 0; + int64_t n; + int64_t size; + TdFilePtr pOutFD = NULL; // TODO + TdFilePtr PInFD = NULL; // TODO + char fNameFrom[TSDB_FILENAME_LEN]; + char fNameTo[TSDB_FILENAME_LEN]; + + // head + tsdbDataFileName(pTsdb, pSetFrom, TSDB_HEAD_FILE, fNameFrom); + tsdbDataFileName(pTsdb, pSetTo, TSDB_HEAD_FILE, fNameTo); + + pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC); + if (pOutFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + PInFD = taosOpenFile(fNameFrom, TD_FILE_READ); + if (PInFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + n = taosFSendFile(pOutFD, PInFD, 0, pSetFrom->fHead.size); + if (n < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + taosCloseFile(&pOutFD); + taosCloseFile(&PInFD); + + // data + tsdbDataFileName(pTsdb, pSetFrom, TSDB_DATA_FILE, fNameFrom); + tsdbDataFileName(pTsdb, pSetTo, TSDB_DATA_FILE, fNameTo); + + pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC); + if (pOutFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + PInFD = taosOpenFile(fNameFrom, TD_FILE_READ); + if (PInFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + n = taosFSendFile(pOutFD, PInFD, 0, pSetFrom->fData.size); + if (n < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + taosCloseFile(&pOutFD); + taosCloseFile(&PInFD); + + // last + tsdbDataFileName(pTsdb, pSetFrom, TSDB_LAST_FILE, fNameFrom); + tsdbDataFileName(pTsdb, pSetTo, TSDB_LAST_FILE, fNameTo); + pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC); + if (pOutFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + PInFD = taosOpenFile(fNameFrom, TD_FILE_READ); + if (PInFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + n = taosFSendFile(pOutFD, PInFD, 0, pSetFrom->fLast.size); + if (n < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + taosCloseFile(&pOutFD); + taosCloseFile(&PInFD); + + // sma + tsdbDataFileName(pTsdb, pSetFrom, TSDB_SMA_FILE, fNameFrom); + tsdbDataFileName(pTsdb, pSetTo, TSDB_SMA_FILE, fNameTo); + + pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC); + if (pOutFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + PInFD = taosOpenFile(fNameFrom, TD_FILE_READ); + if (PInFD == NULL) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + n = taosFSendFile(pOutFD, PInFD, 0, pSetFrom->fSma.size); + if (n < 0) { + code = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + taosCloseFile(&pOutFD); + taosCloseFile(&PInFD); + + return code; + +_err: + tsdbError("vgId:%d tsdb DFileSet copy failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + return code; +} \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbRetention.c b/source/dnode/vnode/src/tsdb/tsdbRetention.c index e73f3f947c..2ae646a571 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRetention.c +++ b/source/dnode/vnode/src/tsdb/tsdbRetention.c @@ -15,19 +15,80 @@ #include "tsdb.h" +static int32_t tsdbDoRetentionImpl(STsdb *pTsdb, int64_t now, int8_t try, int8_t *canDo) { + int32_t code = 0; + STsdbFSState *pState; + + if (try) { + pState = pTsdb->fs->cState; + *canDo = 0; + } else { + pState = pTsdb->fs->nState; + } + + for (int32_t iSet = 0; iSet < taosArrayGetSize(pState->aDFileSet); iSet++) { + SDFileSet *pDFileSet = (SDFileSet *)taosArrayGet(pState->aDFileSet, iSet); + int32_t expLevel = tsdbFidLevel(pDFileSet->fid, &pTsdb->keepCfg, now); + SDiskID did; + + // check + if (expLevel == pDFileSet->diskId.id) continue; + + // delete or move + if (expLevel < 0) { + if (try) { + *canDo = 1; + } else { + tsdbFSStateDeleteDFileSet(pState, pDFileSet->fid); + iSet--; + } + } else { + // alloc + if (tfsAllocDisk(pTsdb->pVnode->pTfs, expLevel, &did) < 0) { + code = terrno; + goto _exit; + } + + if (did.level == pDFileSet->diskId.level) continue; + + if (try) { + *canDo = 1; + } else { + // copy the file to new disk + + SDFileSet nDFileSet = *pDFileSet; + nDFileSet.diskId = did; + + tfsMkdirRecurAt(pTsdb->pVnode->pTfs, pTsdb->path, did); + + code = tsdbDFileSetCopy(pTsdb, pDFileSet, &nDFileSet); + if (code) goto _exit; + + code = tsdbFSStateUpsertDFileSet(pState, &nDFileSet); + if (code) goto _exit; + } + } + } + +_exit: + return code; +} + int32_t tsdbDoRetention(STsdb *pTsdb, int64_t now) { int32_t code = 0; + int8_t canDo; + + // try + tsdbDoRetentionImpl(pTsdb, now, 1, &canDo); + if (!canDo) goto _exit; // begin code = tsdbFSBegin(pTsdb->fs); if (code) goto _err; // do retention - for (int32_t iSet = 0; iSet < taosArrayGetSize(pTsdb->fs->nState->aDFileSet); iSet++) { - SDFileSet *pDFileSet = (SDFileSet *)taosArrayGet(pTsdb->fs->nState->aDFileSet, iSet); - - // TODO - } + code = tsdbDoRetentionImpl(pTsdb, now, 0, NULL); + if (code) goto _err; // commit code = tsdbFSCommit(pTsdb->fs); @@ -38,5 +99,6 @@ _exit: _err: tsdbError("vgId:%d tsdb do retention failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + tsdbFSRollback(pTsdb->fs); return code; } \ No newline at end of file diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index 54087a7871..06d4a86116 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -312,6 +312,9 @@ struct STsdbSnapWriter { // config int32_t minutes; int8_t precision; + int32_t minRow; + int32_t maxRow; + int8_t cmprAlg; // for data file int32_t fid; @@ -321,14 +324,18 @@ struct STsdbSnapWriter { SBlockIdx* pBlockIdx; SMapData mBlock; int32_t iBlock; + SBlock* pBlock; + SBlock block; SBlockData blockData; int32_t iRow; SDataFWriter* pDataFWriter; SArray* aBlockIdxN; + SBlockIdx* pBlockIdxN; SBlockIdx blockIdx; SMapData mBlockN; - SBlock block; + SBlock* pBlockN; + SBlock blockN; SBlockData nBlockData; // for del file @@ -394,13 +401,114 @@ _err: return code; } +static int32_t tsdbSnapWriteTableDataEnd(STsdbSnapWriter* pWrite) { + int32_t code = 0; + // TODO + return code; +} + +static int32_t tsdbSnapWriteTableData(STsdbSnapWriter* pWriter, uint8_t* pData, uint32_t nData) { + int32_t code = 0; + TABLEID id = {0}; // TODO + + // skip + while (pWriter->pBlockIdx && tTABLEIDCmprFn(&id, pWriter->pBlockIdx) < 0) { + code = tsdbSnapWriteTableDataEnd(pWriter); + if (code) goto _err; + + pWriter->iBlockIdx++; + if (pWriter->iBlockIdx < taosArrayGetSize(pWriter->aBlockIdx)) { + pWriter->pBlockIdx = (SBlockIdx*)taosArrayGet(pWriter->aBlockIdx, pWriter->iBlockIdx); + } else { + pWriter->pBlockIdx = NULL; + } + } + + // new or merge + if (pWriter->pBlockIdx == NULL || tTABLEIDCmprFn(&id, pWriter->pBlockIdx) < 0) { + int32_t c; + + if (pWriter->pBlockIdxN && ((c = tTABLEIDCmprFn(&id, pWriter->pBlockIdxN)) != 0)) { + ASSERT(c > 0); + + code = tsdbSnapWriteTableDataEnd(pWriter); + if (code) goto _err; + } + + if (pWriter->pBlockIdxN == NULL) { + pWriter->pBlockIdx = &pWriter->blockIdx; + pWriter->pBlockIdx->suid = id.suid; + pWriter->pBlockIdx->uid = id.uid; + } + + // loop to write the data + TSDBROW* pRow = NULL; // todo + int32_t nRow = 0; // todo + SBlockData* pBlockData = NULL; // todo + for (int32_t iRow = 0; iRow < nRow; iRow++) { + code = tBlockDataAppendRow(&pWriter->nBlockData, &tsdbRowFromBlockData(pBlockData, iRow), NULL); + if (code) goto _err; + + if (pWriter->nBlockData.nRow > pWriter->maxRow * 4 / 5) { + code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->nBlockData, NULL, NULL, pWriter->pBlockIdxN, + pWriter->pBlockN, pWriter->cmprAlg); + if (code) goto _err; + } + } + } else { + // skip + while (true) { + if (pWriter->pBlock == NULL) break; + if (pWriter->pBlock->last) break; + if (tBlockCmprFn(&(SBlock){.minKey = {0}, .maxKey = {0}}, pWriter->pBlock) >= 0) break; + + code = tMapDataPutItem(&pWriter->mBlockN, pWriter->pBlock, tPutBlock); + if (code) goto _err; + } + + if (pWriter->pBlock) { + if (pWriter->pBlock->last) { + // load the last block and merge with the data (todo) + } else { + int32_t c = tBlockCmprFn(&(SBlock){0 /*TODO*/}, pWriter->pBlock); + + if (c > 0) { + // commit until pWriter->pBlock (todo) + } else { + // load the block and merge with the data (todo) + } + } + } else { + int32_t nRow = 0; + SBlockData* pBlockData = NULL; + + for (int32_t iRow = 0; iRow < nRow; iRow++) { + code = tBlockDataAppendRow(&pWriter->nBlockData, &tsdbRowFromBlockData(pBlockData, iRow), NULL); + if (code) goto _err; + + if (pWriter->nBlockData.nRow >= pWriter->maxRow * 4 / 5) { + code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->nBlockData, NULL, NULL, pWriter->pBlockIdxN, + pWriter->pBlockN, pWriter->cmprAlg); + if (code) goto _err; + + tBlockDataClearData(&pWriter->nBlockData); + } + } + } + } + + return code; + +_err: + tsdbError("vgId:%d tsdb snapshot write table data failed since %s", TD_VID(pWriter->pTsdb->pVnode), tstrerror(code)); + return code; +} + static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint32_t nData) { int32_t code = 0; STsdb* pTsdb = pWriter->pTsdb; - int64_t suid = 0; // todo - int64_t uid = 0; // todo - int64_t skey; // todo - int64_t ekey; // todo + int64_t skey; // todo + int64_t ekey; // todo int32_t fid = tsdbKeyFid(skey, pWriter->minutes, pWriter->precision); ASSERT(fid == tsdbKeyFid(ekey, pWriter->minutes, pWriter->precision)); @@ -440,47 +548,8 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3 taosArrayClear(pWriter->aBlockIdxN); } - // process - TABLEID id = {0}; // TODO - TSKEY minKey = 0; // TODO - TSKEY maxKey = 0; // TODO - - while (true) { - if (pWriter->pBlockIdx) { - int32_t c = tTABLEIDCmprFn(&id, pWriter->pBlockIdx); - - if (c == 0) { - } else if (c < 0) { - // keep merge - } else { - // code = tsdbSnapWriteTableDataEnd(pWriter); - if (code) goto _err; - - pWriter->iBlockIdx++; - if (pWriter->iBlockIdx < taosArrayGetSize(pWriter->aBlockIdx)) { - pWriter->pBlockIdx = (SBlockIdx*)taosArrayGet(pWriter->aBlockIdx, pWriter->iBlockIdx); - } else { - pWriter->pBlockIdx = NULL; - } - - if (pWriter->pBlockIdx) { - code = tsdbReadBlock(pWriter->pDataFReader, pWriter->pBlockIdx, &pWriter->mBlock, NULL); - if (code) goto _err; - } - } - } else { - int32_t c = tTABLEIDCmprFn(&id, &pWriter->blockIdx); - - if (c == 0) { - // merge commit the block data - } else if (c > 0) { - // code = tsdbSnapWriteTableDataEnd(pWriter); - if (code) goto _err; - } else { - ASSERT(0); - } - } - } + code = tsdbSnapWriteTableData(pWriter, pData, nData); + if (code) goto _err; return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 415a674737..dc6c823368 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -465,17 +465,37 @@ void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minK *maxKey = *minKey + minutes * tsTickPerMin[precision] - 1; } -// int tsdFidLevel(int fid, TSKEY now, minute) { -// if (fid >= pRtn->maxFid) { -// return 0; -// } else if (fid >= pRtn->midFid) { -// return 1; -// } else if (fid >= pRtn->minFid) { -// return 2; -// } else { -// return -1; -// } -// } +int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now) { + int32_t aFid[3]; + TSKEY key; + + if (pKeepCfg->precision == TSDB_TIME_PRECISION_MILLI) { + now = now * 1000; + } else if (pKeepCfg->precision == TSDB_TIME_PRECISION_MICRO) { + now = now * 1000000l; + } else if (pKeepCfg->precision == TSDB_TIME_PRECISION_NANO) { + now = now * 1000000000l; + } else { + ASSERT(0); + } + + key = now - pKeepCfg->keep0 * tsTickPerMin[pKeepCfg->precision]; + aFid[0] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision); + key = now - pKeepCfg->keep1 * tsTickPerMin[pKeepCfg->precision]; + aFid[1] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision); + key = now - pKeepCfg->keep2 * tsTickPerMin[pKeepCfg->precision]; + aFid[2] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision); + + if (fid >= aFid[0]) { + return 0; + } else if (fid >= aFid[1]) { + return 1; + } else if (fid >= aFid[2]) { + return 2; + } else { + return -1; + } +} // TSDBROW ====================================================== void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) { diff --git a/source/dnode/vnode/src/vnd/vnodeCfg.c b/source/dnode/vnode/src/vnd/vnodeCfg.c index c74baa6d7b..eac1fd1a74 100644 --- a/source/dnode/vnode/src/vnd/vnodeCfg.c +++ b/source/dnode/vnode/src/vnd/vnodeCfg.c @@ -15,30 +15,39 @@ #include "vnd.h" -const SVnodeCfg vnodeCfgDefault = { - .vgId = -1, - .dbname = "", - .dbId = 0, - .szPage = 4096, - .szCache = 256, - .szBuf = 96 * 1024 * 1024, - .isHeap = false, - .isWeak = 0, - .tsdbCfg = {.precision = TSDB_TIME_PRECISION_MILLI, - .update = 1, - .compression = 2, - .slLevel = 5, - .days = 14400, - .minRows = 100, - .maxRows = 4096, - .keep2 = 5256000, - .keep0 = 5256000, - .keep1 = 5256000}, - .walCfg = - {.vgId = -1, .fsyncPeriod = 0, .retentionPeriod = 0, .rollPeriod = 0, .segSize = 0, .level = TAOS_WAL_WRITE}, - .hashBegin = 0, - .hashEnd = 0, - .hashMethod = 0}; +const SVnodeCfg vnodeCfgDefault = {.vgId = -1, + .dbname = "", + .dbId = 0, + .szPage = 4096, + .szCache = 256, + .cacheLast = 3, + .cacheLastSize = 8, + .szBuf = 96 * 1024 * 1024, + .isHeap = false, + .isWeak = 0, + .tsdbCfg = {.precision = TSDB_TIME_PRECISION_MILLI, + .update = 1, + .compression = 2, + .slLevel = 5, + .days = 14400, + .minRows = 100, + .maxRows = 4096, + .keep2 = 5256000, + .keep0 = 5256000, + .keep1 = 5256000}, + .walCfg = + { + .vgId = -1, + .fsyncPeriod = 0, + .retentionPeriod = -1, + .rollPeriod = -1, + .segSize = -1, + .retentionSize = -1, + .level = TAOS_WAL_WRITE, + }, + .hashBegin = 0, + .hashEnd = 0, + .hashMethod = 0}; int vnodeCheckCfg(const SVnodeCfg *pCfg) { // TODO @@ -53,6 +62,8 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) { if (tjsonAddIntegerToObject(pJson, "dbId", pCfg->dbId) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "szPage", pCfg->szPage) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "szCache", pCfg->szCache) < 0) return -1; + if (tjsonAddIntegerToObject(pJson, "cacheLast", pCfg->cacheLast) < 0) return -1; + if (tjsonAddIntegerToObject(pJson, "cacheLastSize", pCfg->cacheLastSize) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "szBuf", pCfg->szBuf) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "isHeap", pCfg->isHeap) < 0) return -1; if (tjsonAddIntegerToObject(pJson, "isWeak", pCfg->isWeak) < 0) return -1; @@ -79,7 +90,7 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) { SJson *pNodeRetentions = tjsonCreateArray(); tjsonAddItemToObject(pJson, "retentions", pNodeRetentions); for (int32_t i = 0; i < nRetention; ++i) { - SJson * pNodeRetention = tjsonCreateObject(); + SJson *pNodeRetention = tjsonCreateObject(); const SRetention *pRetention = pCfg->tsdbCfg.retentions + i; tjsonAddIntegerToObject(pNodeRetention, "freq", pRetention->freq); tjsonAddIntegerToObject(pNodeRetention, "freqUnit", pRetention->freqUnit); @@ -126,6 +137,10 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) { if (code < 0) return -1; tjsonGetNumberValue(pJson, "szCache", pCfg->szCache, code); if (code < 0) return -1; + tjsonGetNumberValue(pJson, "cacheLast", pCfg->cacheLast, code); + if (code < 0) return -1; + tjsonGetNumberValue(pJson, "cacheLastSize", pCfg->cacheLastSize, code); + if (code < 0) return -1; tjsonGetNumberValue(pJson, "szBuf", pCfg->szBuf, code); if (code < 0) return -1; tjsonGetNumberValue(pJson, "isHeap", pCfg->isHeap, code); @@ -156,7 +171,7 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) { if (code < 0) return -1; tjsonGetNumberValue(pJson, "keep2", pCfg->tsdbCfg.keep2, code); if (code < 0) return -1; - SJson * pNodeRetentions = tjsonGetObjectItem(pJson, "retentions"); + SJson *pNodeRetentions = tjsonGetObjectItem(pJson, "retentions"); int32_t nRetention = tjsonGetArraySize(pNodeRetentions); if (nRetention > TSDB_RETENTION_MAX) { nRetention = TSDB_RETENTION_MAX; diff --git a/source/dnode/vnode/src/vnd/vnodeCommit.c b/source/dnode/vnode/src/vnd/vnodeCommit.c index ed829666cd..ebbb691e28 100644 --- a/source/dnode/vnode/src/vnd/vnodeCommit.c +++ b/source/dnode/vnode/src/vnd/vnodeCommit.c @@ -15,7 +15,7 @@ #include "vnd.h" -#define VND_INFO_FNAME "vnode.json" +#define VND_INFO_FNAME "vnode.json" #define VND_INFO_FNAME_TMP "vnode_tmp.json" static int vnodeEncodeInfo(const SVnodeInfo *pInfo, char **ppData); @@ -230,6 +230,7 @@ int vnodeCommit(SVnode *pVnode) { ASSERT(0); return -1; } + walBeginSnapshot(pVnode->pWal, pVnode->state.applied); // preCommit smaPreCommit(pVnode->pSma); @@ -278,6 +279,7 @@ int vnodeCommit(SVnode *pVnode) { smaPostCommit(pVnode->pSma); // apply the commit (TODO) + walEndSnapshot(pVnode->pWal); vnodeBufPoolReset(pVnode->onCommit); pVnode->onCommit->next = pVnode->pPool; pVnode->pPool = pVnode->onCommit; diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index e59f8ae558..cf95040585 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -28,7 +28,7 @@ int vnodeCreate(const char *path, SVnodeCfg *pCfg, STfs *pTfs) { } // create vnode env - if (tfsMkdir(pTfs, path) < 0) { + if (tfsMkdirAt(pTfs, path, (SDiskID){0}) < 0) { vError("vgId:%d, failed to create vnode since: %s", pCfg->vgId, tstrerror(terrno)); return -1; } @@ -117,6 +117,13 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) { // open wal sprintf(tdir, "%s%s%s", dir, TD_DIRSEP, VNODE_WAL_DIR); taosRealPath(tdir, NULL, sizeof(tdir)); + +// for test tsdb snapshot +#if 0 + pVnode->config.walCfg.segSize = 200; + pVnode->config.walCfg.retentionSize = 2000; +#endif + pVnode->pWal = walOpen(tdir, &(pVnode->config.walCfg)); if (pVnode->pWal == NULL) { vError("vgId:%d, failed to open vnode wal since %s", TD_VID(pVnode), tstrerror(terrno)); diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index dceeb4c282..d25ae817c7 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -24,8 +24,10 @@ static int32_t vnodeProcessDropTbReq(SVnode *pVnode, int64_t version, void *pReq static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessAlterConfirmReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); -static int32_t vnodeProcessAlterHasnRangeReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); +static int32_t vnodeProcessAlterHashRangeReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); +static int32_t vnodeProcessAlterConfigReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessDropTtlTbReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); +static int32_t vnodeProcessTrimReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp); int32_t vnodePreProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) { @@ -172,9 +174,12 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp case TDMT_VND_DROP_TTL_TABLE: if (vnodeProcessDropTtlTbReq(pVnode, version, pReq, len, pRsp) < 0) goto _err; break; - case TDMT_VND_CREATE_SMA: { + case TDMT_VND_TRIM: + if (vnodeProcessTrimReq(pVnode, version, pReq, len, pRsp) < 0) goto _err; + break; + case TDMT_VND_CREATE_SMA: if (vnodeProcessCreateTSmaReq(pVnode, version, pReq, len, pRsp) < 0) goto _err; - } break; + break; /* TSDB */ case TDMT_VND_SUBMIT: if (vnodeProcessSubmitReq(pVnode, version, pMsg->pCont, pMsg->contLen, pRsp) < 0) goto _err; @@ -215,9 +220,10 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp vnodeProcessAlterConfirmReq(pVnode, version, pReq, len, pRsp); break; case TDMT_VND_ALTER_HASHRANGE: - vnodeProcessAlterHasnRangeReq(pVnode, version, pReq, len, pRsp); + vnodeProcessAlterHashRangeReq(pVnode, version, pReq, len, pRsp); break; case TDMT_VND_ALTER_CONFIG: + vnodeProcessAlterConfigReq(pVnode, version, pReq, len, pRsp); break; case TDMT_VND_COMMIT: goto _do_commit; @@ -345,13 +351,38 @@ void vnodeUpdateMetaRsp(SVnode *pVnode, STableMetaRsp *pMetaRsp) { pMetaRsp->precision = pVnode->config.tsdbCfg.precision; } +static int32_t vnodeProcessTrimReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) { + int32_t code = 0; + SVTrimDbReq trimReq = {0}; + + vInfo("vgId:%d, trim vnode request will be processed, time:%d", pVnode->config.vgId, trimReq.timestamp); + + // decode + if (tDeserializeSVTrimDbReq(pReq, len, &trimReq) != 0) { + code = TSDB_CODE_INVALID_MSG; + goto _exit; + } + + // process + code = tsdbDoRetention(pVnode->pTsdb, trimReq.timestamp); + if (code) goto _exit; + +_exit: + return code; +} + static int32_t vnodeProcessDropTtlTbReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) { SArray *tbUids = taosArrayInit(8, sizeof(int64_t)); if (tbUids == NULL) return TSDB_CODE_OUT_OF_MEMORY; - int32_t t = ntohl(*(int32_t *)pReq); - vDebug("rec ttl time:%d", t); - int32_t ret = metaTtlDropTable(pVnode->pMeta, t, tbUids); + SVDropTtlTableReq ttlReq = {0}; + if (tDeserializeSVDropTtlTableReq(pReq, len, &ttlReq) != 0) { + terrno = TSDB_CODE_INVALID_MSG; + goto end; + } + + vInfo("vgId:%d, drop ttl table req will be processed, time:%d", pVnode->config.vgId, ttlReq.timestamp); + int32_t ret = metaTtlDropTable(pVnode->pMeta, ttlReq.timestamp, tbUids); if (ret != 0) { goto end; } @@ -386,7 +417,7 @@ static int32_t vnodeProcessCreateStbReq(SVnode *pVnode, int64_t version, void *p goto _err; } - if (tdProcessRSmaCreate(pVnode, &req) < 0) { + if (tdProcessRSmaCreate(pVnode->pSma, &req) < 0) { pRsp->code = terrno; goto _err; } @@ -542,6 +573,11 @@ static int32_t vnodeProcessDropStbReq(SVnode *pVnode, int64_t version, void *pRe goto _exit; } + if (tdProcessRSmaDrop(pVnode->pSma, &req) < 0) { + rcode = terrno; + goto _exit; + } + // return rsp _exit: pRsp->code = rcode; @@ -886,7 +922,7 @@ static int32_t vnodeProcessAlterConfirmReq(SVnode *pVnode, int64_t version, void return 0; } -static int32_t vnodeProcessAlterHasnRangeReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) { +static int32_t vnodeProcessAlterHashRangeReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) { vInfo("vgId:%d, alter hashrange msg will be processed", TD_VID(pVnode)); // todo @@ -896,6 +932,23 @@ static int32_t vnodeProcessAlterHasnRangeReq(SVnode *pVnode, int64_t version, vo return 0; } +static int32_t vnodeProcessAlterConfigReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) { + SAlterVnodeReq alterReq = {0}; + if (tDeserializeSAlterVnodeReq(pReq, len, &alterReq) != 0) { + terrno = TSDB_CODE_INVALID_MSG; + return TSDB_CODE_INVALID_MSG; + } + + vInfo("vgId:%d, start to alter vnode config, cacheLast:%d cacheLastSize:%d", TD_VID(pVnode), alterReq.cacheLast, + alterReq.cacheLastSize); + if (pVnode->config.cacheLastSize != alterReq.cacheLastSize) { + pVnode->config.cacheLastSize = alterReq.cacheLastSize; + // TODO: save config + tsdbCacheSetCapacity(pVnode, (size_t)pVnode->config.cacheLastSize * 1024 * 1024); + } + return 0; +} + static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) { int32_t code = 0; SDecoder *pCoder = &(SDecoder){0}; diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index 7637c66b84..598a754c50 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -480,37 +480,35 @@ typedef struct SCtgOperation { #define TD_RWLATCH_WRITE_FLAG_COPY 0x40000000 -#define CTG_IS_LOCKED(_lock) atomic_load_32((_lock)) - #define CTG_LOCK(type, _lock) do { \ if (CTG_READ == (type)) { \ - assert(atomic_load_32((_lock)) >= 0); \ - CTG_LOCK_DEBUG("CTG RLOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ + CTG_LOCK_DEBUG("CTG RLOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosRLockLatch(_lock); \ - CTG_LOCK_DEBUG("CTG RLOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) > 0); \ + CTG_LOCK_DEBUG("CTG RLOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) > 0); \ } else { \ - assert(atomic_load_32((_lock)) >= 0); \ - CTG_LOCK_DEBUG("CTG WLOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ + CTG_LOCK_DEBUG("CTG WLOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosWLockLatch(_lock); \ - CTG_LOCK_DEBUG("CTG WLOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ + CTG_LOCK_DEBUG("CTG WLOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ } \ } while (0) #define CTG_UNLOCK(type, _lock) do { \ if (CTG_READ == (type)) { \ - assert(atomic_load_32((_lock)) > 0); \ - CTG_LOCK_DEBUG("CTG RULOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) > 0); \ + CTG_LOCK_DEBUG("CTG RULOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosRUnLockLatch(_lock); \ - CTG_LOCK_DEBUG("CTG RULOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) >= 0); \ + CTG_LOCK_DEBUG("CTG RULOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ } else { \ - assert(atomic_load_32((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ - CTG_LOCK_DEBUG("CTG WULOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ + CTG_LOCK_DEBUG("CTG WULOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosWUnLockLatch(_lock); \ - CTG_LOCK_DEBUG("CTG WULOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) >= 0); \ + CTG_LOCK_DEBUG("CTG WULOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ } \ } while (0) diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c index 455f2bd6a7..e77df8f7f2 100644 --- a/source/libs/catalog/src/ctgAsync.c +++ b/source/libs/catalog/src/ctgAsync.c @@ -789,9 +789,13 @@ _return: int32_t ctgCallUserCb(void* param) { SCtgJob* pJob = (SCtgJob*)param; + + qDebug("QID:0x%" PRIx64 " ctg start to call user cb with rsp %s", pJob->queryId, tstrerror(pJob->jobResCode)); (*pJob->userFp)(&pJob->jobRes, pJob->userParam, pJob->jobResCode); + qDebug("QID:0x%" PRIx64 " ctg end to call user cb", pJob->queryId); + taosRemoveRef(gCtgMgmt.jobPool, pJob->refId); return TSDB_CODE_SUCCESS; @@ -822,8 +826,6 @@ int32_t ctgHandleTaskEnd(SCtgTask* pTask, int32_t rspCode) { _return: - qDebug("QID:0x%" PRIx64 " ctg call user callback with rsp %s", pJob->queryId, tstrerror(code)); - pJob->jobResCode = code; //taosSsleep(2); diff --git a/source/libs/catalog/test/catalogTests.cpp b/source/libs/catalog/test/catalogTests.cpp index 3245fcd16a..51b721f818 100644 --- a/source/libs/catalog/test/catalogTests.cpp +++ b/source/libs/catalog/test/catalogTests.cpp @@ -109,7 +109,7 @@ void sendCreateDbMsg(void *shandle, SEpSet *pEpSet) { createReq.compression = 2; createReq.replications = 1; createReq.strict = 1; - createReq.cacheLastRow = 0; + createReq.cacheLast = 0; createReq.ignoreExist = 1; int32_t contLen = tSerializeSCreateDbReq(NULL, 0, &createReq); diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c index 7f70a78b12..a2816209a9 100644 --- a/source/libs/command/src/command.c +++ b/source/libs/command/src/command.c @@ -223,7 +223,7 @@ static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbFName, S "CREATE DATABASE `%s` BUFFER %d CACHELAST %d COMP %d DURATION %dm " "FSYNC %d MAXROWS %d MINROWS %d KEEP %dm,%dm,%dm PAGES %d PAGESIZE %d PRECISION '%s' REPLICA %d " "STRICT %d WAL %d VGROUPS %d SINGLE_STABLE %d", - dbFName, pCfg->buffer, pCfg->cacheLastRow, pCfg->compression, pCfg->daysPerFile, pCfg->fsyncPeriod, + dbFName, pCfg->buffer, pCfg->cacheLast, pCfg->compression, pCfg->daysPerFile, pCfg->fsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->daysToKeep0, pCfg->daysToKeep1, pCfg->daysToKeep2, pCfg->pages, pCfg->pageSize, prec, pCfg->replications, pCfg->strict, pCfg->walLevel, pCfg->numOfVgroups, 1 == pCfg->numOfStables); diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 3c674e8d10..69ba88916a 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -540,6 +540,9 @@ typedef struct SIndefOperatorInfo { SArray* pPseudoColInfo; SExprSupp scalarSup; SNode* pCondition; + uint64_t groupId; + + SSDataBlock* pNextGroupRes; } SIndefOperatorInfo; typedef struct SFillOperatorInfo { @@ -551,6 +554,8 @@ typedef struct SFillOperatorInfo { bool multigroupResult; STimeWindow win; SNode* pCondition; + SArray* pColMatchColInfo; + int32_t primaryTsCol; } SFillOperatorInfo; typedef struct SGroupbyOperatorInfo { @@ -774,6 +779,8 @@ int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, SLoadRemoteDataInfo* pLo int32_t compLen, int32_t numOfOutput, int64_t startTs, uint64_t* total, SArray* pColList); void getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int64_t key, STimeWindow* win); +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 getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz); diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c new file mode 100644 index 0000000000..b6ad3b6cc0 --- /dev/null +++ b/source/libs/executor/src/cachescanoperator.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "os.h" +#include "function.h" +#include "tname.h" + +#include "tdatablock.h" +#include "tmsg.h" + +#include "executorimpl.h" +#include "tcompare.h" +#include "thash.h" +#include "ttypes.h" +#include "executorInt.h" + +static SSDataBlock* doScanLastrow(SOperatorInfo* pOperator); +static void destroyLastrowScanOperator(void* param, int32_t numOfOutput); +static int32_t extractTargetSlotId(const SArray* pColMatchInfo, SExecTaskInfo* pTaskInfo, int32_t** pSlotIds); + +SOperatorInfo* createLastrowScanOperator(SLastRowScanPhysiNode* pScanNode, SReadHandle* readHandle, SArray* pTableList, + SExecTaskInfo* pTaskInfo) { + SLastrowScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SLastrowScanInfo)); + SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); + if (pInfo == NULL || pOperator == NULL) { + goto _error; + } + + pInfo->pTableList = pTableList; + pInfo->readHandle = *readHandle; + pInfo->pRes = createResDataBlock(pScanNode->node.pOutputDataBlockDesc); + + int32_t numOfCols = 0; + pInfo->pColMatchInfo = extractColMatchInfo(pScanNode->pScanCols, pScanNode->node.pOutputDataBlockDesc, &numOfCols, + COL_MATCH_FROM_COL_ID); + int32_t* pCols = taosMemoryMalloc(numOfCols * sizeof(int32_t)); + for (int32_t i = 0; i < numOfCols; ++i) { + SColMatchInfo* pColMatch = taosArrayGet(pInfo->pColMatchInfo, i); + pCols[i] = pColMatch->colId; + } + + int32_t code = extractTargetSlotId(pInfo->pColMatchInfo, pTaskInfo, &pInfo->pSlotIds); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + tsdbLastRowReaderOpen(readHandle->vnode, LASTROW_RETRIEVE_TYPE_ALL, pTableList, pCols, numOfCols, + &pInfo->pLastrowReader); + taosMemoryFree(pCols); + + pOperator->name = "LastrowScanOperator"; + pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN; + pOperator->blocking = false; + pOperator->status = OP_NOT_OPENED; + pOperator->info = pInfo; + pOperator->pTaskInfo = pTaskInfo; + pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock); + + initResultSizeInfo(pOperator, 1024); + blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); + + pOperator->fpSet = + createOperatorFpSet(operatorDummyOpenFn, doScanLastrow, NULL, NULL, destroyLastrowScanOperator, NULL, NULL, NULL); + pOperator->cost.openCost = 0; + return pOperator; + + _error: + pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY; + taosMemoryFree(pInfo); + taosMemoryFree(pOperator); + return NULL; +} + +SSDataBlock* doScanLastrow(SOperatorInfo* pOperator) { + if (pOperator->status == OP_EXEC_DONE) { + return NULL; + } + + SLastrowScanInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + + int32_t size = taosArrayGetSize(pInfo->pTableList); + if (size == 0) { + setTaskStatus(pTaskInfo, TASK_COMPLETED); + return NULL; + } + + // check if it is a group by tbname + if (size == taosArrayGetSize(pInfo->pTableList)) { + blockDataCleanup(pInfo->pRes); + tsdbRetrieveLastRow(pInfo->pLastrowReader, pInfo->pRes, pInfo->pSlotIds); + return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes; + } else { + // todo fetch the result for each group + } + + return pInfo->pRes->info.rows == 0 ? NULL : pInfo->pRes; +} + +void destroyLastrowScanOperator(void* param, int32_t numOfOutput) { + SLastrowScanInfo* pInfo = (SLastrowScanInfo*)param; + blockDataDestroy(pInfo->pRes); + tsdbLastrowReaderClose(pInfo->pLastrowReader); + + taosMemoryFreeClear(param); +} + +int32_t extractTargetSlotId(const SArray* pColMatchInfo, SExecTaskInfo* pTaskInfo, int32_t** pSlotIds) { + size_t numOfCols = taosArrayGetSize(pColMatchInfo); + + *pSlotIds = taosMemoryMalloc(numOfCols * sizeof(int32_t)); + if (*pSlotIds == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + for (int32_t i = 0; i < numOfCols; ++i) { + SColMatchInfo* pColMatch = taosArrayGet(pColMatchInfo, i); + for (int32_t j = 0; j < pTaskInfo->schemaVer.sw->nCols; ++j) { + if (pColMatch->colId == pTaskInfo->schemaVer.sw->pSchema[j].colId && + pColMatch->colId == PRIMARYKEY_TIMESTAMP_COL_ID) { + (*pSlotIds)[pColMatch->targetSlotId] = -1; + break; + } + + if (pColMatch->colId == pTaskInfo->schemaVer.sw->pSchema[j].colId) { + (*pSlotIds)[pColMatch->targetSlotId] = j; + break; + } + } + } + + return TSDB_CODE_SUCCESS; +} \ No newline at end of file diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index adbfa2c4ba..2da8811e5e 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -869,7 +869,7 @@ static STimeWindow doCalculateTimeWindow(int64_t ts, SInterval* pInterval) { return w; } -static STimeWindow getFirstQualifiedTimeWindow(int64_t ts, STimeWindow* pWindow, SInterval* pInterval, int32_t order) { +STimeWindow getFirstQualifiedTimeWindow(int64_t ts, STimeWindow* pWindow, SInterval* pInterval, int32_t order) { int32_t factor = (order == TSDB_ORDER_ASC)? -1:1; STimeWindow win = *pWindow; diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 95f74ad610..ac80432052 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -545,9 +545,7 @@ static int32_t doAggregateImpl(SOperatorInfo* pOperator, TSKEY startTs, SqlFunct if (pCtx[k].fpSet.process == NULL) { continue; } -#ifdef BUF_PAGE_DEBUG - qDebug("page_process"); -#endif + int32_t code = pCtx[k].fpSet.process(&pCtx[k]); if (code != TSDB_CODE_SUCCESS) { qError("%s aggregate function error happens, code: %s", GET_TASKID(pOperator->pTaskInfo), tstrerror(code)); @@ -571,26 +569,27 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc setPseudoOutputColInfo(pResult, pCtx, pPseudoList); pResult->info.groupId = pSrcBlock->info.groupId; - // if the source equals to the destination, it is to create a new column as the result of scalar function or some - // operators. + // if the source equals to the destination, it is to create a new column as the result of scalar + // function or some operators. bool createNewColModel = (pResult == pSrcBlock); int32_t numOfRows = 0; for (int32_t k = 0; k < numOfOutput; ++k) { - int32_t outputSlotId = pExpr[k].base.resSchema.slotId; - SqlFunctionCtx* pfCtx = &pCtx[k]; + int32_t outputSlotId = pExpr[k].base.resSchema.slotId; + SqlFunctionCtx* pfCtx = &pCtx[k]; + SInputColumnInfoData* pInputData = &pfCtx->input; if (pExpr[k].pExpr->nodeType == QUERY_NODE_COLUMN) { // it is a project query SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId); if (pResult->info.rows > 0 && !createNewColModel) { - colDataMergeCol(pColInfoData, pResult->info.rows, &pResult->info.capacity, pfCtx->input.pData[0], - pfCtx->input.numOfRows); + colDataMergeCol(pColInfoData, pResult->info.rows, &pResult->info.capacity, pInputData->pData[0], + pInputData->numOfRows); } else { - colDataAssign(pColInfoData, pfCtx->input.pData[0], pfCtx->input.numOfRows, &pResult->info); + colDataAssign(pColInfoData, pInputData->pData[0], pInputData->numOfRows, &pResult->info); } - numOfRows = pfCtx->input.numOfRows; + numOfRows = pInputData->numOfRows; } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_VALUE) { SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId); @@ -623,14 +622,12 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc numOfRows = dest.numOfRows; taosArrayDestroy(pBlockList); } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_FUNCTION) { - ASSERT(!fmIsAggFunc(pfCtx->functionId)); - // _rowts/_c0, not tbname column if (fmIsPseudoColumnFunc(pfCtx->functionId) && (!fmIsScanPseudoColumnFunc(pfCtx->functionId))) { // do nothing } else if (fmIsIndefiniteRowsFunc(pfCtx->functionId)) { - SResultRowEntryInfo* pResInfo = GET_RES_INFO(&pCtx[k]); - pfCtx->fpSet.init(&pCtx[k], pResInfo); + SResultRowEntryInfo* pResInfo = GET_RES_INFO(pfCtx); + pfCtx->fpSet.init(pfCtx, pResInfo); pfCtx->pOutput = taosArrayGet(pResult->pDataBlock, outputSlotId); pfCtx->offset = createNewColModel ? 0 : pResult->info.rows; // set the start offset @@ -642,6 +639,23 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc } numOfRows = pfCtx->fpSet.process(pfCtx); + } else if (fmIsAggFunc(pfCtx->functionId)) { + // _group_key function for "partition by tbname" + csum(col_name) query + SColumnInfoData* pOutput = taosArrayGet(pResult->pDataBlock, outputSlotId); + int32_t slotId = pfCtx->param[0].pCol->slotId; + + // todo handle the json tag + SColumnInfoData* pInput = taosArrayGet(pSrcBlock->pDataBlock, slotId); + for (int32_t f = 0; f < pSrcBlock->info.rows; ++f) { + bool isNull = colDataIsNull_s(pInput, f); + if (isNull) { + colDataAppendNULL(pOutput, pResult->info.rows + f); + } else { + char* data = colDataGetData(pInput, f); + colDataAppend(pOutput, pResult->info.rows + f, data, isNull); + } + } + } else { SArray* pBlockList = taosArrayInit(4, POINTER_BYTES); taosArrayPush(pBlockList, &pSrcBlock); @@ -675,25 +689,6 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc return TSDB_CODE_SUCCESS; } -static void setResultRowKey(SResultRow* pResultRow, char* pData, int16_t type) { - if (IS_VAR_DATA_TYPE(type)) { - // todo disable this - - // if (pResultRow->key == NULL) { - // pResultRow->key = taosMemoryMalloc(varDataTLen(pData)); - // varDataCopy(pResultRow->key, pData); - // } else { - // ASSERT(memcmp(pResultRow->key, pData, varDataTLen(pData)) == 0); - // } - } else { - int64_t v = -1; - GET_TYPED_DATA(v, int64_t, type, pData); - - pResultRow->win.skey = v; - pResultRow->win.ekey = v; - } -} - bool functionNeedToExecute(SqlFunctionCtx* pCtx) { struct SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx); @@ -2447,7 +2442,6 @@ _error: doDestroyExchangeOperatorInfo(pInfo); } - taosMemoryFreeClear(pInfo); taosMemoryFreeClear(pOperator); pTaskInfo->code = code; return NULL; @@ -3397,6 +3391,8 @@ static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) { assert(pBlock != NULL); } + blockDataUpdateTsWindow(pBlock, pInfo->primaryTsCol); + if (*newgroup && pInfo->totalInputRows > 0) { // there are already processed current group data block pInfo->existNewGroupBlock = pBlock; *newgroup = false; @@ -3508,11 +3504,7 @@ static void destroyOperatorInfo(SOperatorInfo* pOperator) { pOperator->numOfDownstream = 0; } - if (pOperator->exprSupp.pExprInfo != NULL) { - destroyExprInfo(pOperator->exprSupp.pExprInfo, pOperator->exprSupp.numOfExprs); - } - - taosMemoryFreeClear(pOperator->exprSupp.pExprInfo); + cleanupExprSupp(&pOperator->exprSupp); taosMemoryFreeClear(pOperator); } @@ -3591,6 +3583,25 @@ void initBasicInfo(SOptrBasicInfo* pInfo, SSDataBlock* pBlock) { initResultRowInfo(&pInfo->resultRowInfo); } +static void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput) { + if (pCtx == NULL) { + return NULL; + } + + for (int32_t i = 0; i < numOfOutput; ++i) { + for (int32_t j = 0; j < pCtx[i].numOfParams; ++j) { + taosVariantDestroy(&pCtx[i].param[j].param); + } + + taosMemoryFreeClear(pCtx[i].subsidiaries.pCtx); + taosMemoryFree(pCtx[i].input.pData); + taosMemoryFree(pCtx[i].input.pColumnDataAgg); + } + + taosMemoryFreeClear(pCtx); + return NULL; +} + int32_t initExprSupp(SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfExpr) { pSup->pExprInfo = pExprInfo; pSup->numOfExprs = numOfExpr; @@ -3604,6 +3615,16 @@ int32_t initExprSupp(SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfExpr) { return TSDB_CODE_SUCCESS; } +void cleanupExprSupp(SExprSupp* pSupp) { + destroySqlFunctionCtx(pSupp->pCtx, pSupp->numOfExprs); + if (pSupp->pExprInfo != NULL) { + destroyExprInfo(pSupp->pExprInfo, pSupp->numOfExprs); + } + + taosMemoryFreeClear(pSupp->pExprInfo); + taosMemoryFree(pSupp->rowEntryInfoOffset); +} + SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock, SNode* pCondition, SExprInfo* pScalarExprInfo, int32_t numOfScalarExpr, SExecTaskInfo* pTaskInfo) { @@ -3654,25 +3675,6 @@ _error: return NULL; } -static void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput) { - if (pCtx == NULL) { - return NULL; - } - - for (int32_t i = 0; i < numOfOutput; ++i) { - for (int32_t j = 0; j < pCtx[i].numOfParams; ++j) { - taosVariantDestroy(&pCtx[i].param[j].param); - } - - taosMemoryFreeClear(pCtx[i].subsidiaries.pCtx); - taosMemoryFree(pCtx[i].input.pData); - taosMemoryFree(pCtx[i].input.pColumnDataAgg); - } - - taosMemoryFreeClear(pCtx); - return NULL; -} - void cleanupBasicInfo(SOptrBasicInfo* pInfo) { assert(pInfo != NULL); cleanupResultRowInfo(&pInfo->resultRowInfo); @@ -3714,13 +3716,6 @@ static void destroyProjectOperatorInfo(void* param, int32_t numOfOutput) { taosMemoryFreeClear(param); } -void cleanupExprSupp(SExprSupp* pSupp) { - destroySqlFunctionCtx(pSupp->pCtx, pSupp->numOfExprs); - destroyExprInfo(pSupp->pExprInfo, pSupp->numOfExprs); - - taosMemoryFree(pSupp->rowEntryInfoOffset); -} - static void destroyIndefinitOperatorInfo(void* param, int32_t numOfOutput) { SIndefOperatorInfo* pInfo = (SIndefOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); @@ -3825,6 +3820,41 @@ _error: return NULL; } +static void doHandleDataBlock(SOperatorInfo* pOperator, SSDataBlock* pBlock, SOperatorInfo* downstream, + SExecTaskInfo* pTaskInfo) { + int32_t order = 0; + int32_t scanFlag = 0; + + SIndefOperatorInfo* pIndefInfo = pOperator->info; + SOptrBasicInfo* pInfo = &pIndefInfo->binfo; + SExprSupp* pSup = &pOperator->exprSupp; + + // the pDataBlock are always the same one, no need to call this again + int32_t code = getTableScanInfo(downstream, &order, &scanFlag); + if (code != TSDB_CODE_SUCCESS) { + longjmp(pTaskInfo->env, code); + } + + // there is an scalar expression that needs to be calculated before apply the group aggregation. + SExprSupp* pScalarSup = &pIndefInfo->scalarSup; + if (pScalarSup->pExprInfo != NULL) { + code = projectApplyFunctions(pScalarSup->pExprInfo, pBlock, pBlock, pScalarSup->pCtx, pScalarSup->numOfExprs, + pIndefInfo->pPseudoColInfo); + if (code != TSDB_CODE_SUCCESS) { + longjmp(pTaskInfo->env, code); + } + } + + setInputDataBlock(pOperator, pSup->pCtx, pBlock, order, scanFlag, false); + blockDataEnsureCapacity(pInfo->pRes, pInfo->pRes->info.rows + pBlock->info.rows); + + code = projectApplyFunctions(pSup->pExprInfo, pInfo->pRes, pBlock, pSup->pCtx, pSup->numOfExprs, + pIndefInfo->pPseudoColInfo); + if (code != TSDB_CODE_SUCCESS) { + longjmp(pTaskInfo->env, code); + } +} + static SSDataBlock* doApplyIndefinitFunction(SOperatorInfo* pOperator) { SIndefOperatorInfo* pIndefInfo = pOperator->info; SOptrBasicInfo* pInfo = &pIndefInfo->binfo; @@ -3839,8 +3869,6 @@ static SSDataBlock* doApplyIndefinitFunction(SOperatorInfo* pOperator) { } int64_t st = 0; - int32_t order = 0; - int32_t scanFlag = 0; if (pOperator->cost.openCost == 0) { st = taosGetTimestampUs(); @@ -3849,41 +3877,53 @@ static SSDataBlock* doApplyIndefinitFunction(SOperatorInfo* pOperator) { SOperatorInfo* downstream = pOperator->pDownstream[0]; while (1) { - // The downstream exec may change the value of the newgroup, so use a local variable instead. - SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); - if (pBlock == NULL) { - doSetOperatorCompleted(pOperator); - break; + // here we need to handle the existsed group results + if (pIndefInfo->pNextGroupRes != NULL) { // todo extract method + for (int32_t k = 0; k < pSup->numOfExprs; ++k) { + SqlFunctionCtx* pCtx = &pSup->pCtx[k]; + + SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx); + pResInfo->initialized = false; + pCtx->pOutput = NULL; + } + + doHandleDataBlock(pOperator, pIndefInfo->pNextGroupRes, downstream, pTaskInfo); + pIndefInfo->pNextGroupRes = NULL; } - // the pDataBlock are always the same one, no need to call this again - int32_t code = getTableScanInfo(pOperator->pDownstream[0], &order, &scanFlag); - if (code != TSDB_CODE_SUCCESS) { - longjmp(pTaskInfo->env, code); - } + if (pInfo->pRes->info.rows < pOperator->resultInfo.threshold) { + while (1) { + // The downstream exec may change the value of the newgroup, so use a local variable instead. + SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); + if (pBlock == NULL) { + doSetOperatorCompleted(pOperator); + break; + } - // there is an scalar expression that needs to be calculated before apply the group aggregation. - SExprSupp* pScalarSup = &pIndefInfo->scalarSup; - if (pScalarSup->pExprInfo != NULL) { - code = projectApplyFunctions(pScalarSup->pExprInfo, pBlock, pBlock, pScalarSup->pCtx, pScalarSup->numOfExprs, - pIndefInfo->pPseudoColInfo); - if (code != TSDB_CODE_SUCCESS) { - longjmp(pTaskInfo->env, code); + if (pIndefInfo->groupId == 0 && pBlock->info.groupId != 0) { + pIndefInfo->groupId = pBlock->info.groupId; // this is the initial group result + } else { + if (pIndefInfo->groupId != pBlock->info.groupId) { // reset output buffer and computing status + pIndefInfo->groupId = pBlock->info.groupId; + pIndefInfo->pNextGroupRes = pBlock; + break; + } + } + + doHandleDataBlock(pOperator, pBlock, downstream, pTaskInfo); + if (pInfo->pRes->info.rows >= pOperator->resultInfo.threshold) { + break; + } } } - setInputDataBlock(pOperator, pSup->pCtx, pBlock, order, scanFlag, false); - blockDataEnsureCapacity(pInfo->pRes, pInfo->pRes->info.rows + pBlock->info.rows); - - code = projectApplyFunctions(pOperator->exprSupp.pExprInfo, pInfo->pRes, pBlock, pSup->pCtx, - pOperator->exprSupp.numOfExprs, pIndefInfo->pPseudoColInfo); - if (code != TSDB_CODE_SUCCESS) { - longjmp(pTaskInfo->env, code); + doFilter(pIndefInfo->pCondition, pInfo->pRes); + size_t rows = pInfo->pRes->info.rows; + if (rows >= 0) { + break; } } - doFilter(pIndefInfo->pCondition, pInfo->pRes); - size_t rows = pInfo->pRes->info.rows; pOperator->resultInfo.totalRows += rows; @@ -3928,24 +3968,23 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy if (numOfRows * pResBlock->info.rowSize > TWOMB) { numOfRows = TWOMB / pResBlock->info.rowSize; } + initResultSizeInfo(pOperator, numOfRows); - initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfExpr, keyBufSize, pTaskInfo->id.str); + initAggInfo(pSup, &pInfo->aggSup, pExprInfo, numOfExpr, keyBufSize, pTaskInfo->id.str); initBasicInfo(&pInfo->binfo, pResBlock); setFunctionResultOutput(pOperator, &pInfo->binfo, &pInfo->aggSup, MAIN_SCAN, numOfExpr); pInfo->binfo.pRes = pResBlock; - pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pSup->pCtx, numOfExpr); pInfo->pCondition = pPhyNode->node.pConditions; + pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pSup->pCtx, numOfExpr); pOperator->name = "IndefinitOperator"; - pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_PROJECT; + pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC; pOperator->blocking = false; pOperator->status = OP_NOT_OPENED; pOperator->info = pInfo; - pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->exprSupp.numOfExprs = numOfExpr; pOperator->pTaskInfo = pTaskInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doApplyIndefinitFunction, NULL, NULL, @@ -3971,6 +4010,7 @@ static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t STimeWindow w = TSWINDOW_INITIALIZER; getAlignQueryTimeWindow(pInterval, pInterval->precision, win.skey, &w); + w = getFirstQualifiedTimeWindow(win.skey, &w, pInterval, TSDB_ORDER_ASC); int32_t order = TSDB_ORDER_ASC; pInfo->pFillInfo = taosCreateFillInfo(order, w.skey, 0, capacity, numOfCols, pInterval, fillType, pColInfo, id); @@ -4001,10 +4041,16 @@ SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == downstream->operatorType ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval : &((SIntervalAggOperatorInfo*)downstream->info)->interval; + int32_t type = convertFillType(pPhyFillNode->mode); SResultInfo* pResultInfo = &pOperator->resultInfo; initResultSizeInfo(pOperator, 4096); + pInfo->primaryTsCol = ((SColumnNode*)pPhyFillNode->pWStartTs)->slotId; + + int32_t numOfOutputCols = 0; + SArray* pColMatchColInfo = extractColMatchInfo(pPhyFillNode->pTargets, pPhyFillNode->node.pOutputDataBlockDesc, + &numOfOutputCols, COL_MATCH_FROM_SLOT_ID); int32_t code = initFillInfo(pInfo, pExprInfo, num, (SNodeListNode*)pPhyFillNode->pValues, pPhyFillNode->timeRange, pResultInfo->capacity, pTaskInfo->id.str, pInterval, type); @@ -4015,6 +4061,7 @@ SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pInfo->pRes = pResBlock; pInfo->multigroupResult = multigroupResult; pInfo->pCondition = pPhyFillNode->node.pConditions; + pInfo->pColMatchColInfo = pColMatchColInfo; pOperator->name = "FillOperator"; pOperator->blocking = false; pOperator->status = OP_NOT_OPENED; @@ -4072,6 +4119,8 @@ int32_t extractTableSchemaInfo(SReadHandle* pHandle, uint64_t uid, SExecTaskInfo pTaskInfo->schemaVer.sw = tCloneSSchemaWrapper(&mr.me.stbEntry.schemaRow); pTaskInfo->schemaVer.tversion = mr.me.stbEntry.schemaTag.version; } else if (mr.me.type == TSDB_CHILD_TABLE) { + tDecoderClear(&mr.coder); + tb_uid_t suid = mr.me.ctbEntry.suid; metaGetTableEntryByUid(&mr, suid); pTaskInfo->schemaVer.sw = tCloneSSchemaWrapper(&mr.me.stbEntry.schemaRow); diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 311d7f0d5a..ee20bc7ba6 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -637,6 +637,7 @@ static SSDataBlock* buildPartitionResult(SOperatorInfo* pOperator) { int32_t* pageId = taosArrayGet(pGroupInfo->pPageList, pInfo->pageIndex); void* page = getBufPage(pInfo->pBuf, *pageId); + blockDataEnsureCapacity(pInfo->binfo.pRes, pInfo->rowCapacity); blockDataFromBuf1(pInfo->binfo.pRes, page, pInfo->rowCapacity); pInfo->pageIndex += 1; diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 407f799496..6ab3effc85 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -578,6 +578,7 @@ static void destroyTableScanOperatorInfo(void* param, int32_t numOfOutput) { taosArrayDestroy(pTableScanInfo->pColMatchInfo); } + cleanupExprSupp(&pTableScanInfo->pseudoSup); taosMemoryFreeClear(param); } @@ -1134,12 +1135,6 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock pInfo->pRes->info.type = STREAM_NORMAL; pInfo->pRes->info.capacity = pBlock->info.rows; - // for generating rollup SMA result, each time is an independent time serie. - // TODO temporarily used, when the statement of "partition by tbname" is ready, remove this - if (pInfo->assignBlockUid) { - pInfo->pRes->info.groupId = pBlock->info.uid; - } - uint64_t* groupIdPre = taosHashGet(pOperator->pTaskInfo->tableqinfoList.map, &pBlock->info.uid, sizeof(int64_t)); if (groupIdPre) { pInfo->pRes->info.groupId = *groupIdPre; @@ -1147,6 +1142,12 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock pInfo->pRes->info.groupId = 0; } + // for generating rollup SMA result, each time is an independent time serie. + // TODO temporarily used, when the statement of "partition by tbname" is ready, remove this + if (pInfo->assignBlockUid) { + pInfo->pRes->info.groupId = pBlock->info.uid; + } + // todo extract method for (int32_t i = 0; i < taosArrayGetSize(pInfo->pColMatchInfo); ++i) { SColMatchInfo* pColMatchInfo = taosArrayGet(pInfo->pColMatchInfo, i); diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c index d106d3e749..8d9cac3614 100644 --- a/source/libs/executor/src/sortoperator.c +++ b/source/libs/executor/src/sortoperator.c @@ -217,6 +217,7 @@ SSDataBlock* doSort(SOperatorInfo* pOperator) { doSetOperatorCompleted(pOperator); break; } + if (blockDataGetNumOfRows(pBlock) > 0) { break; } @@ -601,8 +602,7 @@ SSDataBlock* getMultiwaySortedBlockData(SSortHandle* pHandle, SSDataBlock* pData break; } - if (pInfo->groupSort) - { + if (pInfo->groupSort) { uint64_t tupleGroupId = tsortGetGroupId(pTupleHandle); if (!pInfo->hasGroupId) { pInfo->groupId = tupleGroupId; diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index 1d82d6a644..b0e2166baf 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -50,8 +50,11 @@ static void setTagsValue(SFillInfo* pFillInfo, void** data, int32_t genRows) { static void setNullRow(SSDataBlock* pBlock, int32_t numOfCol, int32_t rowIndex) { // the first are always the timestamp column, so start from the second column. - for (int32_t i = 1; i < taosArrayGetSize(pBlock->pDataBlock); ++i) { + for (int32_t i = 0; i < taosArrayGetSize(pBlock->pDataBlock); ++i) { SColumnInfoData* p = taosArrayGet(pBlock->pDataBlock, i); + if (p->info.type == TSDB_DATA_TYPE_TIMESTAMP && i == 0) { + continue; + } colDataAppendNULL(p, rowIndex); } } diff --git a/source/libs/function/inc/builtinsimpl.h b/source/libs/function/inc/builtinsimpl.h index 06944edadd..e8e37e5c6b 100644 --- a/source/libs/function/inc/builtinsimpl.h +++ b/source/libs/function/inc/builtinsimpl.h @@ -157,6 +157,7 @@ int32_t elapsedCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx); bool getHistogramFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv); bool histogramFunctionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo); int32_t histogramFunction(SqlFunctionCtx* pCtx); +int32_t histogramFunctionPartial(SqlFunctionCtx* pCtx); int32_t histogramFunctionMerge(SqlFunctionCtx* pCtx); int32_t histogramFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock); int32_t histogramPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock); diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index 1e7e7e57c3..a735edafab 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -48,8 +48,8 @@ static int32_t validateTimeUnitParam(uint8_t dbPrec, const SValueNode* pVal) { return TIME_UNIT_INVALID; } - if (TSDB_TIME_PRECISION_MILLI == dbPrec && (0 == strcasecmp(pVal->literal, "1u") || - 0 == strcasecmp(pVal->literal, "1b"))) { + if (TSDB_TIME_PRECISION_MILLI == dbPrec && + (0 == strcasecmp(pVal->literal, "1u") || 0 == strcasecmp(pVal->literal, "1b"))) { return TIME_UNIT_TOO_SMALL; } @@ -57,10 +57,9 @@ static int32_t validateTimeUnitParam(uint8_t dbPrec, const SValueNode* pVal) { return TIME_UNIT_TOO_SMALL; } - if (pVal->literal[0] != '1' || (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && - pVal->literal[1] != 's' && pVal->literal[1] != 'm' && - pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && - pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) { + if (pVal->literal[0] != '1' || + (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' && + pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) { return TIME_UNIT_INVALID; } @@ -678,9 +677,10 @@ static int32_t translateElapsed(SFunctionNode* pFunc, char* pErrBuf, int32_t len return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName); } - uint8_t paraType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type; - if (TSDB_DATA_TYPE_TIMESTAMP != paraType) { - return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); + SNode* pPara1 = nodesListGetNode(pFunc->pParameterList, 0); + if (QUERY_NODE_COLUMN != nodeType(pPara1) || PRIMARYKEY_TIMESTAMP_COL_ID != ((SColumnNode*)pPara1)->colId) { + return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, + "The first parameter of the ELAPSED function can only be the timestamp primary key"); } // param1 @@ -694,8 +694,7 @@ static int32_t translateElapsed(SFunctionNode* pFunc, char* pErrBuf, int32_t len pValue->notReserved = true; - paraType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 1))->resType.type; - if (!IS_INTEGER_TYPE(paraType)) { + if (!IS_INTEGER_TYPE(pValue->node.resType.type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -706,8 +705,9 @@ static int32_t translateElapsed(SFunctionNode* pFunc, char* pErrBuf, int32_t len return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "ELAPSED function time unit parameter should be greater than db precision"); } else if (ret == TIME_UNIT_INVALID) { - return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, - "ELAPSED function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]"); + return buildFuncErrMsg( + pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, + "ELAPSED function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]"); } } @@ -1229,7 +1229,8 @@ static int32_t translateStateDuration(SFunctionNode* pFunc, char* pErrBuf, int32 "STATEDURATION function time unit parameter should be greater than db precision"); } else if (ret == TIME_UNIT_INVALID) { return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, - "STATEDURATION function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]"); + "STATEDURATION function time unit parameter should be one of the following: [1b, 1u, 1a, " + "1s, 1m, 1h, 1d, 1w]"); } } @@ -1426,9 +1427,12 @@ static int32_t translateIrate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) } static int32_t translateFirstLast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { - // first(col_list) will be rewritten as first(col) - if (1 != LIST_LENGTH(pFunc->pParameterList)) { - return TSDB_CODE_SUCCESS; + int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList); + for (int32_t i = 0; i < numOfParams; ++i) { + SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i); + if (QUERY_NODE_VALUE == nodeType(pParamNode)) { + return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName); + } } pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType; @@ -1740,8 +1744,9 @@ static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_ return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "TIMETRUNCATE function time unit parameter should be greater than db precision"); } else if (ret == TIME_UNIT_INVALID) { - return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, - "TIMETRUNCATE function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]"); + return buildFuncErrMsg( + pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, + "TIMETRUNCATE function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]"); } addDbPrecisonParam(&pFunc->pParameterList, dbPrec); @@ -1779,8 +1784,9 @@ static int32_t translateTimeDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t le return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "TIMEDIFF function time unit parameter should be greater than db precision"); } else if (ret == TIME_UNIT_INVALID) { - return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, - "TIMEDIFF function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]"); + return buildFuncErrMsg( + pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, + "TIMEDIFF function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]"); } } @@ -2320,7 +2326,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = { .translateFunc = translateHistogramPartial, .getEnvFunc = getHistogramFuncEnv, .initFunc = histogramFunctionSetup, - .processFunc = histogramFunction, + .processFunc = histogramFunctionPartial, .finalizeFunc = histogramPartialFinalize, .invertFunc = NULL, .combineFunc = histogramCombine, diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index 932bfb8793..359352951f 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -4098,7 +4098,7 @@ bool histogramFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultIn return true; } -int32_t histogramFunction(SqlFunctionCtx* pCtx) { +static int32_t histogramFunctionImpl(SqlFunctionCtx* pCtx, bool isPartial) { SHistoFuncInfo* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx)); SInputColumnInfoData* pInput = &pCtx->input; @@ -4130,10 +4130,22 @@ int32_t histogramFunction(SqlFunctionCtx* pCtx) { } } - SET_VAL(GET_RES_INFO(pCtx), numOfElems, pInfo->numOfBins); + if (!isPartial) { + SET_VAL(GET_RES_INFO(pCtx), numOfElems, pInfo->numOfBins); + } else { + SET_VAL(GET_RES_INFO(pCtx), numOfElems, 1); + } return TSDB_CODE_SUCCESS; } +int32_t histogramFunction(SqlFunctionCtx* pCtx) { + return histogramFunctionImpl(pCtx, false); +} + +int32_t histogramFunctionPartial(SqlFunctionCtx* pCtx) { + return histogramFunctionImpl(pCtx, true); +} + static void histogramTransferInfo(SHistoFuncInfo* pInput, SHistoFuncInfo* pOutput) { pOutput->normalized = pInput->normalized; pOutput->numOfBins = pInput->numOfBins; @@ -4153,10 +4165,12 @@ int32_t histogramFunctionMerge(SqlFunctionCtx* pCtx) { SHistoFuncInfo* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx)); int32_t start = pInput->startRowIndex; - char* data = colDataGetData(pCol, start); - SHistoFuncInfo* pInputInfo = (SHistoFuncInfo*)varDataVal(data); - histogramTransferInfo(pInputInfo, pInfo); + for(int32_t i = start; i < start + pInput->numOfRows; ++i) { + char* data = colDataGetData(pCol, i); + SHistoFuncInfo* pInputInfo = (SHistoFuncInfo*)varDataVal(data); + histogramTransferInfo(pInputInfo, pInfo); + } SET_VAL(GET_RES_INFO(pCtx), pInfo->numOfBins, pInfo->numOfBins); return TSDB_CODE_SUCCESS; @@ -4199,6 +4213,7 @@ int32_t histogramFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { } int32_t histogramPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { + SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx); SHistoFuncInfo* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx)); int32_t resultBytes = getHistogramInfoSize(); char* res = taosMemoryCalloc(resultBytes + VARSTR_HEADER_SIZE, sizeof(char)); @@ -4212,7 +4227,7 @@ int32_t histogramPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { colDataAppend(pCol, pBlock->info.rows, res, false); taosMemoryFree(res); - return 1; + return pResInfo->numOfRes; } int32_t histogramCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) { diff --git a/source/libs/function/src/functionMgt.c b/source/libs/function/src/functionMgt.c index 1da9d4a70f..ed82654f77 100644 --- a/source/libs/function/src/functionMgt.c +++ b/source/libs/function/src/functionMgt.c @@ -139,7 +139,7 @@ bool fmIsAggFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC_MG bool fmIsScalarFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC_MGT_SCALAR_FUNC); } -bool fmIsVectorFunc(int32_t funcId) { return !fmIsScalarFunc(funcId) && !fmIsScanPseudoColumnFunc(funcId); } +bool fmIsVectorFunc(int32_t funcId) { return !fmIsScalarFunc(funcId) && !fmIsPseudoColumnFunc(funcId); } bool fmIsSelectFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC_MGT_SELECT_FUNC); } diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index e15375e6ef..897b575e10 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -105,6 +105,8 @@ SNode* nodesMakeNode(ENodeType type) { return makeNode(type, sizeof(SAlterDatabaseStmt)); case QUERY_NODE_FLUSH_DATABASE_STMT: return makeNode(type, sizeof(SFlushDatabaseStmt)); + case QUERY_NODE_TRIM_DATABASE_STMT: + return makeNode(type, sizeof(STrimDatabaseStmt)); case QUERY_NODE_CREATE_TABLE_STMT: return makeNode(type, sizeof(SCreateTableStmt)); case QUERY_NODE_CREATE_SUBTABLE_CLAUSE: @@ -548,6 +550,7 @@ void nodesDestroyNode(SNode* pNode) { nodesDestroyNode((SNode*)((SAlterDatabaseStmt*)pNode)->pOptions); break; case QUERY_NODE_FLUSH_DATABASE_STMT: // no pointer field + case QUERY_NODE_TRIM_DATABASE_STMT: // no pointer field break; case QUERY_NODE_CREATE_TABLE_STMT: { SCreateTableStmt* pStmt = (SCreateTableStmt*)pNode; @@ -1790,7 +1793,7 @@ static EDealRes classifyConditionImpl(SNode* pNode, void* pContext) { } else if (pCol->hasIndex) { pCxt->hasTagIndexCol = true; pCxt->hasTagCol = true; - } else if (COLUMN_TYPE_TAG == pCol->colType) { + } else if (COLUMN_TYPE_TAG == pCol->colType || COLUMN_TYPE_TBNAME == pCol->colType) { pCxt->hasTagCol = true; } else { pCxt->hasOtherCol = true; diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index ee60a14da9..59fc69f768 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -137,6 +137,7 @@ SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, STok SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken* pDbName); SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* pOptions); SNode* createFlushDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName); +SNode* createTrimDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName); SNode* createDefaultTableOptions(SAstCreateContext* pCxt); SNode* createAlterTableOptions(SAstCreateContext* pCxt); SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType type, void* pVal); diff --git a/source/libs/parser/inc/parInsertData.h b/source/libs/parser/inc/parInsertData.h index 167970838b..ea78735d5e 100644 --- a/source/libs/parser/inc/parInsertData.h +++ b/source/libs/parser/inc/parInsertData.h @@ -20,6 +20,7 @@ #include "os.h" #include "tname.h" #include "ttypes.h" +#include "query.h" #define IS_DATA_COL_ORDERED(spd) ((spd->orderStatus) == (int8_t)ORDER_STATUS_ORDERED) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 4bcfcbf5c0..cd0b5c1d6c 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -158,6 +158,7 @@ cmd ::= DROP DATABASE exists_opt(A) db_name(B). cmd ::= USE db_name(A). { pCxt->pRootNode = createUseDatabaseStmt(pCxt, &A); } cmd ::= ALTER DATABASE db_name(A) alter_db_options(B). { pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &A, B); } cmd ::= FLUSH DATABASE db_name(A). { pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &A); } +cmd ::= TRIM DATABASE db_name(A). { pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &A); } %type not_exists_opt { bool } %destructor not_exists_opt { } @@ -934,7 +935,11 @@ query_expression_body(A) ::= query_primary(A) ::= query_specification(B). { A = B; } query_primary(A) ::= NK_LP query_expression_body(B) - order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP. { A = B; } + order_by_clause_opt(C) slimit_clause_opt(D) limit_clause_opt(E) NK_RP. { + A = addOrderByClause(pCxt, B, C); + A = addSlimitClause(pCxt, A, D); + A = addLimitClause(pCxt, A, E); + } %type order_by_clause_opt { SNodeList* } %destructor order_by_clause_opt { nodesDestroyList($$); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index ab73204fb7..c60e5541e0 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -339,6 +339,10 @@ SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) { SNode* createPlaceholderValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) { CHECK_PARSER_STATUS(pCxt); + if (NULL == pCxt->pQueryCxt->pStmtCb) { + pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, pLiteral->z); + return NULL; + } SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); CHECK_OUT_OF_MEM(val); val->literal = strndup(pLiteral->z, pLiteral->n); @@ -665,6 +669,9 @@ SNode* addHavingClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pHaving) { SNode* addOrderByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrderByList) { CHECK_PARSER_STATUS(pCxt); + if (NULL == pOrderByList) { + return pStmt; + } if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) { ((SSelectStmt*)pStmt)->pOrderByList = pOrderByList; } else { @@ -675,6 +682,9 @@ SNode* addOrderByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrder SNode* addSlimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pSlimit) { CHECK_PARSER_STATUS(pCxt); + if (NULL == pSlimit) { + return pStmt; + } if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) { ((SSelectStmt*)pStmt)->pSlimit = (SLimitNode*)pSlimit; } @@ -683,6 +693,9 @@ SNode* addSlimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pSlimit) { SNode* addLimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pLimit) { CHECK_PARSER_STATUS(pCxt); + if (NULL == pLimit) { + return pStmt; + } if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) { ((SSelectStmt*)pStmt)->pLimit = (SLimitNode*)pLimit; } else { @@ -746,8 +759,8 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) { SDatabaseOptions* pOptions = (SDatabaseOptions*)nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS); CHECK_OUT_OF_MEM(pOptions); pOptions->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE; - pOptions->cacheLast = TSDB_DEFAULT_CACHE_LAST_ROW; - pOptions->cacheLastSize = TSDB_DEFAULT_LAST_ROW_MEM; + pOptions->cacheLast = TSDB_DEFAULT_CACHE_LAST; + pOptions->cacheLastSize = TSDB_DEFAULT_CACHE_LAST_SIZE; pOptions->compressionLevel = TSDB_DEFAULT_COMP_LEVEL; pOptions->daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE; pOptions->fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD; @@ -922,7 +935,18 @@ SNode* createFlushDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SAlterDatabaseStmt* pStmt = (SAlterDatabaseStmt*)nodesMakeNode(QUERY_NODE_FLUSH_DATABASE_STMT); + SFlushDatabaseStmt* pStmt = (SFlushDatabaseStmt*)nodesMakeNode(QUERY_NODE_FLUSH_DATABASE_STMT); + CHECK_OUT_OF_MEM(pStmt); + COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); + return (SNode*)pStmt; +} + +SNode* createTrimDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { + CHECK_PARSER_STATUS(pCxt); + if (!checkDbName(pCxt, pDbName, false)) { + return NULL; + } + STrimDatabaseStmt* pStmt = (STrimDatabaseStmt*)nodesMakeNode(QUERY_NODE_TRIM_DATABASE_STMT); CHECK_OUT_OF_MEM(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); return (SNode*)pStmt; diff --git a/source/libs/parser/src/parInsertData.c b/source/libs/parser/src/parInsertData.c index 84bcef7185..290c65de12 100644 --- a/source/libs/parser/src/parInsertData.c +++ b/source/libs/parser/src/parInsertData.c @@ -630,6 +630,17 @@ int32_t qCloneStmtDataBlock(void** pDst, void* pSrc) { memcpy(*pDst, pSrc, sizeof(STableDataBlocks)); ((STableDataBlocks*)(*pDst))->cloned = true; + STableDataBlocks* pBlock = (STableDataBlocks*)(*pDst); + if (pBlock->pTableMeta) { + void *pNewMeta = taosMemoryMalloc(TABLE_META_SIZE(pBlock->pTableMeta)); + if (NULL == pNewMeta) { + taosMemoryFreeClear(*pDst); + return TSDB_CODE_OUT_OF_MEMORY; + } + memcpy(pNewMeta, pBlock->pTableMeta, TABLE_META_SIZE(pBlock->pTableMeta)); + pBlock->pTableMeta = pNewMeta; + } + return qResetStmtDataBlock(*pDst, false); } diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index 920921a3b3..58f6354402 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -216,6 +216,7 @@ static SKeyword keywordTable[] = { {"TRANSACTION", TK_TRANSACTION}, {"TRANSACTIONS", TK_TRANSACTIONS}, {"TRIGGER", TK_TRIGGER}, + {"TRIM", TK_TRIM}, {"TSERIES", TK_TSERIES}, {"TTL", TK_TTL}, {"UNION", TK_UNION}, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 8e6798dcd2..f417f0e084 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -461,12 +461,10 @@ static bool isDistinctOrderBy(STranslateContext* pCxt) { ((SSelectStmt*)pCxt->pCurrStmt)->isDistinct); } -static bool belongTable(const char* currentDb, const SColumnNode* pCol, const STableNode* pTable) { +static bool belongTable(const SColumnNode* pCol, const STableNode* pTable) { int cmp = 0; if ('\0' != pCol->dbName[0]) { cmp = strcmp(pCol->dbName, pTable->dbName); - } else { - cmp = (QUERY_NODE_REAL_TABLE == nodeType(pTable) ? strcmp(currentDb, pTable->dbName) : 0); } if (0 == cmp) { cmp = strcmp(pCol->tableAlias, pTable->tableAlias); @@ -630,7 +628,7 @@ static EDealRes translateColumnWithPrefix(STranslateContext* pCxt, SColumnNode** bool foundTable = false; for (size_t i = 0; i < nums; ++i) { STableNode* pTable = taosArrayGetP(pTables, i); - if (belongTable(pCxt->pParseCxt->db, (*pCol), pTable)) { + if (belongTable((*pCol), pTable)) { foundTable = true; bool foundCol = false; pCxt->errCode = findAndSetColumn(pCxt, pCol, pTable, &foundCol); @@ -1189,7 +1187,7 @@ static void setFuncClassification(SNode* pCurrStmt, SFunctionNode* pFunc) { if (fmIsSelectFunc(pFunc->funcId)) { pSelect->hasSelectFunc = true; ++(pSelect->selectFuncNum); - } else if (fmIsAggFunc(pFunc->funcId) || fmIsIndefiniteRowsFunc(pFunc->funcId)) { + } else if (fmIsVectorFunc(pFunc->funcId)) { pSelect->hasOtherVectorFunc = true; } pSelect->hasUniqueFunc = pSelect->hasUniqueFunc ? true : (FUNCTION_TYPE_UNIQUE == pFunc->funcType); @@ -1514,18 +1512,11 @@ static int32_t rewriteColsToSelectValFunc(STranslateContext* pCxt, SSelectStmt* typedef struct CheckAggColCoexistCxt { STranslateContext* pTranslateCxt; bool existCol; - int32_t selectFuncNum; - bool existOtherVectorFunc; } CheckAggColCoexistCxt; static EDealRes doCheckAggColCoexist(SNode** pNode, void* pContext) { CheckAggColCoexistCxt* pCxt = (CheckAggColCoexistCxt*)pContext; if (isVectorFunc(*pNode)) { - if (isSelectFunc(*pNode)) { - ++(pCxt->selectFuncNum); - } else { - pCxt->existOtherVectorFunc = true; - } return DEAL_RES_IGNORE_CHILD; } SNode* pPartKey = NULL; @@ -1542,16 +1533,15 @@ static EDealRes doCheckAggColCoexist(SNode** pNode, void* pContext) { static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect) { if (NULL != pSelect->pGroupByList || NULL != pSelect->pWindow || - (!pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc)) { + (!pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc && !pSelect->hasInterpFunc)) { return TSDB_CODE_SUCCESS; } - CheckAggColCoexistCxt cxt = { - .pTranslateCxt = pCxt, .existCol = false, .selectFuncNum = 0, .existOtherVectorFunc = false}; + CheckAggColCoexistCxt cxt = {.pTranslateCxt = pCxt, .existCol = false}; nodesRewriteExprs(pSelect->pProjectionList, doCheckAggColCoexist, &cxt); if (!pSelect->isDistinct) { nodesRewriteExprs(pSelect->pOrderByList, doCheckAggColCoexist, &cxt); } - if (1 == cxt.selectFuncNum && !cxt.existOtherVectorFunc) { + if (1 == pSelect->selectFuncNum && !pSelect->hasOtherVectorFunc) { return rewriteColsToSelectValFunc(pCxt, pSelect); } if (cxt.existCol) { @@ -2846,8 +2836,8 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS pReq->compression = pStmt->pOptions->compressionLevel; pReq->replications = pStmt->pOptions->replica; pReq->strict = pStmt->pOptions->strict; - pReq->cacheLastRow = pStmt->pOptions->cacheLast; - pReq->lastRowMem = pStmt->pOptions->cacheLastSize; + pReq->cacheLast = pStmt->pOptions->cacheLast; + pReq->cacheLastSize = pStmt->pOptions->cacheLastSize; pReq->schemaless = pStmt->pOptions->schemaless; pReq->ignoreExist = pStmt->ignoreExists; return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq); @@ -3008,12 +2998,12 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName int32_t code = checkRangeOption(pCxt, "buffer", pOptions->buffer, TSDB_MIN_BUFFER_PER_VNODE, TSDB_MAX_BUFFER_PER_VNODE); if (TSDB_CODE_SUCCESS == code) { - code = checkRangeOption(pCxt, "cacheLast", pOptions->cacheLast, TSDB_MIN_DB_CACHE_LAST_ROW, - TSDB_MAX_DB_CACHE_LAST_ROW); + code = checkRangeOption(pCxt, "cacheLast", pOptions->cacheLast, TSDB_MIN_DB_CACHE_LAST, + TSDB_MAX_DB_CACHE_LAST); } if (TSDB_CODE_SUCCESS == code) { - code = checkRangeOption(pCxt, "cacheLastSize", pOptions->cacheLastSize, TSDB_MIN_DB_LAST_ROW_MEM, - TSDB_MAX_DB_LAST_ROW_MEM); + code = checkRangeOption(pCxt, "cacheLastSize", pOptions->cacheLastSize, TSDB_MIN_DB_CACHE_LAST_SIZE, + TSDB_MAX_DB_CACHE_LAST_SIZE); } if (TSDB_CODE_SUCCESS == code) { code = checkRangeOption(pCxt, "compression", pOptions->compressionLevel, TSDB_MIN_COMP_LEVEL, TSDB_MAX_COMP_LEVEL); @@ -3126,7 +3116,7 @@ static void buildAlterDbReq(STranslateContext* pCxt, SAlterDatabaseStmt* pStmt, pReq->buffer = pStmt->pOptions->buffer; pReq->pageSize = -1; pReq->pages = pStmt->pOptions->pages; - pReq->lastRowMem = -1; + pReq->cacheLastSize = -1; pReq->daysPerFile = -1; pReq->daysToKeep0 = pStmt->pOptions->keep[0]; pReq->daysToKeep1 = pStmt->pOptions->keep[1]; @@ -3134,8 +3124,8 @@ static void buildAlterDbReq(STranslateContext* pCxt, SAlterDatabaseStmt* pStmt, pReq->fsyncPeriod = pStmt->pOptions->fsyncPeriod; pReq->walLevel = pStmt->pOptions->walLevel; pReq->strict = pStmt->pOptions->strict; - pReq->cacheLastRow = pStmt->pOptions->cacheLast; - pReq->lastRowMem = pStmt->pOptions->cacheLastSize; + pReq->cacheLast = pStmt->pOptions->cacheLast; + pReq->cacheLastSize = pStmt->pOptions->cacheLastSize; pReq->replications = pStmt->pOptions->replica; return; } @@ -3152,6 +3142,14 @@ static int32_t translateAlterDatabase(STranslateContext* pCxt, SAlterDatabaseStm return buildCmdMsg(pCxt, TDMT_MND_ALTER_DB, (FSerializeFunc)tSerializeSAlterDbReq, &alterReq); } +static int32_t translateTrimDatabase(STranslateContext* pCxt, STrimDatabaseStmt* pStmt) { + STrimDbReq req = {0}; + SName name = {0}; + tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->dbName, strlen(pStmt->dbName)); + tNameGetFullDbName(&name, req.db); + return buildCmdMsg(pCxt, TDMT_MND_TRIM_DB, (FSerializeFunc)tSerializeSTrimDbReq, &req); +} + static int32_t columnDefNodeToField(SNodeList* pList, SArray** pArray) { *pArray = taosArrayInit(LIST_LENGTH(pList), sizeof(SField)); SNode* pNode; @@ -4017,8 +4015,15 @@ static int32_t buildCreateSmaReq(STranslateContext* pCxt, SCreateIndexStmt* pStm (NULL != pStmt->pOptions->pSliding ? ((SValueNode*)pStmt->pOptions->pSliding)->unit : pReq->intervalUnit); if (NULL != pStmt->pOptions->pStreamOptions) { SStreamOptions* pStreamOpt = (SStreamOptions*)pStmt->pOptions->pStreamOptions; - pReq->maxDelay = (NULL != pStreamOpt->pDelay ? ((SValueNode*)pStreamOpt->pDelay)->datum.i : 0); - pReq->watermark = (NULL != pStreamOpt->pWatermark ? ((SValueNode*)pStreamOpt->pWatermark)->datum.i : 0); + pReq->maxDelay = (NULL != pStreamOpt->pDelay ? ((SValueNode*)pStreamOpt->pDelay)->datum.i : -1); + pReq->watermark = (NULL != pStreamOpt->pWatermark ? ((SValueNode*)pStreamOpt->pWatermark)->datum.i + : TSDB_DEFAULT_ROLLUP_WATERMARK); + if (pReq->watermark < TSDB_MIN_ROLLUP_WATERMARK) { + pReq->watermark = TSDB_MIN_ROLLUP_WATERMARK; + } + if (pReq->watermark > TSDB_MAX_ROLLUP_WATERMARK) { + pReq->watermark = TSDB_MAX_ROLLUP_WATERMARK; + } } int32_t code = getSmaIndexDstVgId(pCxt, pStmt->tableName, &pReq->dstVgId); @@ -4584,6 +4589,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { case QUERY_NODE_ALTER_DATABASE_STMT: code = translateAlterDatabase(pCxt, (SAlterDatabaseStmt*)pNode); break; + case QUERY_NODE_TRIM_DATABASE_STMT: + code = translateTrimDatabase(pCxt, (STrimDatabaseStmt*)pNode); + break; case QUERY_NODE_CREATE_TABLE_STMT: code = translateCreateSuperTable(pCxt, (SCreateTableStmt*)pNode); break; diff --git a/source/libs/parser/src/parser.c b/source/libs/parser/src/parser.c index 218b5d9f4b..fdba0e2fcc 100644 --- a/source/libs/parser/src/parser.c +++ b/source/libs/parser/src/parser.c @@ -41,7 +41,7 @@ bool qIsInsertValuesSql(const char* pStr, size_t length) { } else if (TK_SELECT == t.type) { return false; } - if (0 == t.type) { + if (0 == t.type || 0 == t.n) { break; } } while (pStr - pSql < length); diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 029dae0311..cb09860758 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 377 +#define YYNOCODE 378 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - SToken yy5; - EJoinType yy74; - SNodeList* yy210; - EFillMode yy270; - int64_t yy311; - SAlterOption yy351; - bool yy403; - EOperatorType yy428; - int32_t yy462; - ENullOrder yy477; - int8_t yy535; - SDataType yy552; - EOrder yy553; - SNode* yy652; + EFillMode yy18; + EJoinType yy36; + ENullOrder yy109; + EOperatorType yy128; + bool yy173; + SDataType yy196; + EOrder yy218; + SAlterOption yy389; + int32_t yy424; + SToken yy533; + SNode* yy560; + int64_t yy585; + SNodeList* yy712; + int8_t yy719; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -139,17 +139,17 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 663 -#define YYNRULE 487 -#define YYNTOKEN 254 -#define YY_MAX_SHIFT 662 -#define YY_MIN_SHIFTREDUCE 966 -#define YY_MAX_SHIFTREDUCE 1452 -#define YY_ERROR_ACTION 1453 -#define YY_ACCEPT_ACTION 1454 -#define YY_NO_ACTION 1455 -#define YY_MIN_REDUCE 1456 -#define YY_MAX_REDUCE 1942 +#define YYNSTATE 666 +#define YYNRULE 488 +#define YYNTOKEN 255 +#define YY_MAX_SHIFT 665 +#define YY_MIN_SHIFTREDUCE 969 +#define YY_MAX_SHIFTREDUCE 1456 +#define YY_ERROR_ACTION 1457 +#define YY_ACCEPT_ACTION 1458 +#define YY_NO_ACTION 1459 +#define YY_MIN_REDUCE 1460 +#define YY_MAX_REDUCE 1947 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -216,672 +216,688 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2436) +#define YY_ACTTAB_COUNT (2520) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 430, 1920, 431, 1491, 438, 71, 431, 1491, 514, 62, - /* 10 */ 1645, 1693, 39, 37, 1919, 549, 323, 325, 1917, 1690, - /* 20 */ 337, 86, 1254, 1457, 33, 32, 1643, 1589, 40, 38, - /* 30 */ 36, 35, 34, 1329, 119, 1252, 1777, 40, 38, 36, - /* 40 */ 35, 34, 1585, 122, 103, 1734, 549, 102, 101, 100, - /* 50 */ 99, 98, 97, 96, 95, 94, 1324, 526, 549, 22, - /* 60 */ 14, 1016, 342, 1015, 1795, 1638, 1640, 1260, 113, 142, - /* 70 */ 1795, 1468, 578, 79, 122, 468, 466, 1747, 542, 577, - /* 80 */ 39, 37, 1392, 120, 1, 1593, 122, 61, 337, 61, - /* 90 */ 1254, 1017, 358, 554, 1586, 554, 379, 551, 155, 1862, - /* 100 */ 1863, 1329, 1867, 1252, 1808, 1479, 659, 1521, 89, 1778, - /* 110 */ 580, 1780, 1781, 576, 120, 571, 541, 552, 1854, 552, - /* 120 */ 1331, 1332, 304, 1850, 1324, 1478, 120, 526, 14, 249, - /* 130 */ 1862, 548, 1456, 547, 1920, 1260, 1920, 1920, 164, 30, - /* 140 */ 259, 156, 1862, 1863, 1777, 1867, 1747, 161, 447, 161, - /* 150 */ 159, 1917, 2, 1917, 1917, 1593, 112, 111, 110, 109, - /* 160 */ 108, 107, 106, 105, 104, 1255, 1747, 1253, 1279, 483, - /* 170 */ 482, 481, 1795, 1920, 659, 480, 220, 221, 118, 477, - /* 180 */ 578, 43, 476, 475, 474, 1747, 160, 577, 1331, 1332, - /* 190 */ 1917, 429, 1258, 1259, 433, 1307, 1308, 1310, 1311, 1312, - /* 200 */ 1313, 1314, 573, 569, 1322, 1323, 1325, 1326, 1327, 1328, - /* 210 */ 1330, 1333, 1808, 1413, 1278, 538, 90, 1778, 580, 1780, - /* 220 */ 1781, 576, 1279, 571, 162, 1454, 1854, 162, 552, 162, - /* 230 */ 328, 1850, 1933, 1255, 314, 1253, 61, 303, 140, 143, - /* 240 */ 516, 1888, 999, 1549, 33, 32, 1645, 1596, 40, 38, - /* 250 */ 36, 35, 34, 341, 535, 1411, 1412, 1414, 1415, 1477, - /* 260 */ 1258, 1259, 1643, 1307, 1308, 1310, 1311, 1312, 1313, 1314, - /* 270 */ 573, 569, 1322, 1323, 1325, 1326, 1327, 1328, 1330, 1333, - /* 280 */ 39, 37, 1003, 1004, 315, 349, 313, 312, 337, 470, - /* 290 */ 1254, 1777, 42, 472, 544, 539, 305, 1353, 11, 10, - /* 300 */ 1747, 1329, 103, 1252, 153, 102, 101, 100, 99, 98, - /* 310 */ 97, 96, 95, 94, 385, 471, 378, 1632, 377, 1795, - /* 320 */ 1358, 1292, 1151, 1152, 1324, 1278, 1920, 553, 14, 1351, - /* 330 */ 1639, 1640, 1747, 437, 577, 1260, 433, 39, 37, 159, - /* 340 */ 483, 482, 481, 1917, 1920, 337, 480, 1254, 1518, 118, - /* 350 */ 477, 301, 2, 476, 475, 474, 605, 1918, 1329, 1808, - /* 360 */ 1252, 1917, 27, 90, 1778, 580, 1780, 1781, 576, 435, - /* 370 */ 571, 71, 370, 1854, 659, 1276, 162, 328, 1850, 154, - /* 380 */ 1396, 1324, 1365, 1352, 117, 1016, 1278, 1015, 1331, 1332, - /* 390 */ 1309, 158, 1260, 1588, 372, 368, 543, 33, 32, 1880, - /* 400 */ 1571, 40, 38, 36, 35, 34, 1357, 479, 478, 8, - /* 410 */ 636, 635, 634, 633, 345, 1017, 632, 631, 630, 123, - /* 420 */ 625, 624, 623, 622, 621, 620, 619, 618, 133, 614, - /* 430 */ 324, 659, 162, 1255, 561, 1253, 33, 32, 140, 613, - /* 440 */ 40, 38, 36, 35, 34, 1331, 1332, 1595, 29, 335, - /* 450 */ 1346, 1347, 1348, 1349, 1350, 1354, 1355, 1356, 1280, 447, - /* 460 */ 1258, 1259, 1476, 1307, 1308, 1310, 1311, 1312, 1313, 1314, - /* 470 */ 573, 569, 1322, 1323, 1325, 1326, 1327, 1328, 1330, 1333, - /* 480 */ 33, 32, 214, 526, 40, 38, 36, 35, 34, 170, - /* 490 */ 1255, 207, 1253, 219, 165, 1281, 340, 36, 35, 34, - /* 500 */ 59, 33, 32, 1747, 140, 40, 38, 36, 35, 34, - /* 510 */ 61, 1593, 75, 1595, 629, 627, 69, 1258, 1259, 68, - /* 520 */ 1307, 1308, 1310, 1311, 1312, 1313, 1314, 573, 569, 1322, - /* 530 */ 1323, 1325, 1326, 1327, 1328, 1330, 1333, 39, 37, 1334, - /* 540 */ 1689, 139, 298, 1475, 343, 337, 1777, 1254, 1277, 162, - /* 550 */ 73, 303, 140, 305, 516, 1234, 1235, 1423, 1329, 418, - /* 560 */ 1252, 1595, 1309, 1109, 602, 601, 600, 1113, 599, 1115, - /* 570 */ 1116, 598, 1118, 595, 1795, 1124, 592, 1126, 1127, 589, - /* 580 */ 586, 1324, 578, 488, 1747, 1449, 1351, 1747, 526, 577, - /* 590 */ 251, 472, 1260, 1474, 39, 37, 1683, 1254, 498, 383, - /* 600 */ 44, 4, 337, 554, 1254, 174, 173, 172, 1260, 9, - /* 610 */ 1252, 1071, 206, 471, 1808, 1329, 1593, 1252, 89, 1778, - /* 620 */ 580, 1780, 1781, 576, 497, 571, 491, 231, 1854, 1473, - /* 630 */ 485, 659, 304, 1850, 1747, 205, 562, 495, 1324, 493, - /* 640 */ 1352, 26, 1260, 1073, 1920, 1331, 1332, 33, 32, 1260, - /* 650 */ 162, 40, 38, 36, 35, 34, 1569, 159, 1869, 1472, - /* 660 */ 1471, 1917, 56, 1357, 611, 55, 9, 1869, 558, 526, - /* 670 */ 1747, 33, 32, 1645, 1448, 40, 38, 36, 35, 34, - /* 680 */ 384, 659, 1866, 131, 130, 608, 607, 606, 659, 1644, - /* 690 */ 1255, 1865, 1253, 1003, 1004, 1869, 513, 1593, 1470, 7, - /* 700 */ 1747, 1747, 1331, 1332, 1570, 29, 335, 1346, 1347, 1348, - /* 710 */ 1349, 1350, 1354, 1355, 1356, 613, 1582, 1258, 1259, 1864, - /* 720 */ 1307, 1308, 1310, 1311, 1312, 1313, 1314, 573, 569, 1322, - /* 730 */ 1323, 1325, 1326, 1327, 1328, 1330, 1333, 1920, 556, 1747, - /* 740 */ 1255, 1688, 1253, 298, 617, 28, 1565, 1255, 1403, 1253, - /* 750 */ 159, 33, 32, 514, 1917, 40, 38, 36, 35, 34, - /* 760 */ 347, 1874, 1385, 616, 1691, 33, 32, 1258, 1259, 40, - /* 770 */ 38, 36, 35, 34, 1258, 1259, 213, 1307, 1308, 1310, - /* 780 */ 1311, 1312, 1313, 1314, 573, 569, 1322, 1323, 1325, 1326, - /* 790 */ 1327, 1328, 1330, 1333, 39, 37, 300, 1578, 1276, 1467, - /* 800 */ 611, 1920, 337, 1777, 1254, 411, 74, 609, 423, 1466, - /* 810 */ 1636, 1508, 1389, 526, 159, 1329, 499, 1252, 1917, 131, - /* 820 */ 130, 608, 607, 606, 388, 396, 1465, 424, 1464, 398, - /* 830 */ 1339, 1795, 610, 484, 271, 1636, 1278, 1623, 1324, 578, - /* 840 */ 1747, 1593, 1292, 1568, 1747, 526, 577, 33, 32, 1260, - /* 850 */ 1747, 40, 38, 36, 35, 34, 113, 1920, 549, 52, - /* 860 */ 510, 389, 198, 473, 1263, 196, 2, 1747, 559, 1747, - /* 870 */ 159, 1808, 1580, 1593, 1917, 90, 1778, 580, 1780, 1781, - /* 880 */ 576, 1463, 571, 1385, 1462, 1854, 122, 1461, 659, 328, - /* 890 */ 1850, 1933, 1460, 1459, 200, 11, 10, 199, 1262, 1576, - /* 900 */ 1911, 422, 1331, 1332, 417, 416, 415, 414, 413, 410, - /* 910 */ 409, 408, 407, 406, 402, 401, 400, 399, 393, 392, - /* 920 */ 391, 390, 1747, 387, 386, 1747, 120, 526, 1747, 526, - /* 930 */ 628, 141, 1042, 1747, 1747, 526, 277, 526, 403, 611, - /* 940 */ 404, 157, 1862, 1863, 567, 1867, 446, 1255, 1590, 1253, - /* 950 */ 275, 58, 1451, 1452, 57, 1593, 506, 1593, 131, 130, - /* 960 */ 608, 607, 606, 1593, 1043, 1593, 1777, 210, 572, 604, - /* 970 */ 176, 426, 373, 41, 1258, 1259, 549, 1307, 1308, 1310, - /* 980 */ 1311, 1312, 1313, 1314, 573, 569, 1322, 1323, 1325, 1326, - /* 990 */ 1327, 1328, 1330, 1333, 1795, 526, 1266, 61, 202, 526, - /* 1000 */ 526, 201, 553, 526, 122, 204, 1722, 1747, 203, 577, - /* 1010 */ 507, 511, 1309, 1584, 524, 1202, 218, 1469, 1764, 1550, - /* 1020 */ 254, 526, 500, 1593, 1761, 554, 465, 1593, 1593, 1761, - /* 1030 */ 1265, 1593, 525, 1388, 1808, 88, 526, 1777, 90, 1778, - /* 1040 */ 580, 1780, 1781, 576, 120, 571, 1503, 260, 1854, 1593, - /* 1050 */ 1757, 1763, 328, 1850, 154, 1757, 1763, 326, 222, 249, - /* 1060 */ 1862, 548, 571, 547, 1593, 1795, 1920, 571, 486, 1501, - /* 1070 */ 66, 65, 382, 578, 1881, 169, 1343, 85, 1747, 159, - /* 1080 */ 577, 376, 536, 1917, 1767, 334, 333, 82, 125, 243, - /* 1090 */ 128, 489, 1796, 129, 299, 1268, 50, 366, 1492, 364, - /* 1100 */ 360, 356, 166, 351, 348, 1808, 1329, 1764, 1261, 90, - /* 1110 */ 1778, 580, 1780, 1781, 576, 1765, 571, 235, 1761, 1854, - /* 1120 */ 526, 1633, 1769, 328, 1850, 1933, 1761, 1497, 41, 1324, - /* 1130 */ 519, 344, 228, 1777, 1873, 1102, 346, 162, 1410, 50, - /* 1140 */ 1260, 41, 1884, 584, 1757, 1763, 332, 128, 1593, 129, - /* 1150 */ 114, 128, 1757, 1763, 550, 248, 571, 253, 256, 238, - /* 1160 */ 258, 1795, 80, 53, 571, 5, 3, 350, 1276, 578, - /* 1170 */ 270, 353, 357, 310, 1747, 654, 577, 1071, 311, 566, - /* 1180 */ 1218, 1359, 267, 1315, 405, 1130, 1685, 171, 412, 1134, - /* 1190 */ 554, 1141, 1139, 132, 1777, 420, 419, 425, 421, 427, - /* 1200 */ 428, 1808, 1282, 436, 1285, 284, 1778, 580, 1780, 1781, - /* 1210 */ 576, 439, 571, 1284, 179, 440, 181, 441, 1286, 184, - /* 1220 */ 442, 444, 1795, 186, 1283, 188, 445, 70, 448, 191, - /* 1230 */ 578, 1920, 268, 467, 469, 1747, 1583, 577, 1269, 302, - /* 1240 */ 1264, 93, 195, 501, 161, 208, 1579, 1777, 1917, 197, - /* 1250 */ 134, 554, 135, 1581, 1577, 136, 137, 1727, 211, 502, - /* 1260 */ 508, 512, 1808, 534, 215, 1272, 284, 1778, 580, 1780, - /* 1270 */ 1781, 576, 505, 571, 226, 1795, 569, 1322, 1323, 1325, - /* 1280 */ 1326, 1327, 1328, 578, 126, 515, 1726, 1695, 1747, 520, - /* 1290 */ 577, 127, 1920, 521, 320, 224, 517, 322, 522, 1777, - /* 1300 */ 269, 78, 1594, 1281, 530, 159, 532, 1885, 537, 1917, - /* 1310 */ 233, 533, 237, 1895, 1894, 1808, 327, 6, 540, 91, - /* 1320 */ 1778, 580, 1780, 1781, 576, 546, 571, 1795, 531, 1854, - /* 1330 */ 1876, 529, 528, 1853, 1850, 578, 1385, 247, 148, 1280, - /* 1340 */ 1747, 563, 577, 246, 244, 121, 242, 48, 1870, 329, - /* 1350 */ 582, 272, 1777, 245, 560, 1637, 1566, 263, 655, 656, - /* 1360 */ 658, 51, 285, 147, 1741, 1835, 1777, 1808, 295, 276, - /* 1370 */ 252, 91, 1778, 580, 1780, 1781, 576, 63, 571, 274, - /* 1380 */ 1795, 1854, 1916, 557, 1740, 565, 1850, 564, 575, 294, - /* 1390 */ 1739, 1936, 255, 1747, 1795, 577, 257, 64, 1738, 352, - /* 1400 */ 1735, 354, 578, 355, 1246, 1247, 167, 1747, 359, 577, - /* 1410 */ 1733, 361, 362, 363, 1732, 365, 1731, 367, 1730, 1777, - /* 1420 */ 1808, 369, 1729, 371, 292, 1778, 580, 1780, 1781, 576, - /* 1430 */ 574, 571, 568, 1826, 1808, 1712, 168, 1777, 144, 1778, - /* 1440 */ 580, 1780, 1781, 576, 375, 571, 374, 1795, 1221, 1706, - /* 1450 */ 1220, 1705, 380, 381, 1704, 578, 1703, 1190, 1678, 1677, - /* 1460 */ 1747, 1676, 577, 1675, 67, 1795, 1674, 1673, 1672, 1671, - /* 1470 */ 321, 394, 395, 578, 1670, 397, 1669, 1668, 1747, 1667, - /* 1480 */ 577, 1666, 555, 1934, 1665, 1664, 1663, 1808, 1662, 1777, - /* 1490 */ 1661, 91, 1778, 580, 1780, 1781, 576, 1660, 571, 1659, - /* 1500 */ 1658, 1854, 1657, 1656, 124, 1808, 1851, 1655, 1654, 293, - /* 1510 */ 1778, 580, 1780, 1781, 576, 1653, 571, 1795, 1192, 1649, - /* 1520 */ 1648, 1647, 527, 1652, 1651, 578, 1650, 1646, 1522, 175, - /* 1530 */ 1747, 1777, 577, 1520, 1488, 177, 1006, 115, 152, 1005, - /* 1540 */ 1487, 1777, 1720, 1714, 1702, 178, 1701, 432, 116, 183, - /* 1550 */ 434, 185, 1687, 1572, 1519, 1517, 451, 1808, 450, 1795, - /* 1560 */ 1515, 293, 1778, 580, 1780, 1781, 576, 578, 571, 1795, - /* 1570 */ 449, 453, 1747, 1035, 577, 1513, 454, 578, 455, 458, - /* 1580 */ 457, 1511, 1747, 461, 577, 462, 459, 1500, 463, 1499, - /* 1590 */ 1484, 1777, 1574, 1145, 1144, 1573, 1070, 1069, 1068, 1808, - /* 1600 */ 1067, 1064, 626, 288, 1778, 580, 1780, 1781, 576, 1808, - /* 1610 */ 571, 628, 1063, 144, 1778, 580, 1780, 1781, 576, 1795, - /* 1620 */ 571, 1062, 194, 49, 1509, 316, 1061, 575, 1504, 317, - /* 1630 */ 1502, 487, 1747, 318, 577, 1483, 490, 492, 1482, 494, - /* 1640 */ 1481, 545, 496, 1777, 1719, 92, 1713, 1228, 503, 138, - /* 1650 */ 1700, 1698, 1699, 1697, 1696, 15, 1694, 223, 1935, 1808, - /* 1660 */ 1777, 217, 212, 292, 1778, 580, 1780, 1781, 576, 1238, - /* 1670 */ 571, 1795, 1827, 1686, 82, 225, 336, 76, 77, 578, - /* 1680 */ 230, 16, 41, 23, 1747, 47, 577, 241, 1795, 54, - /* 1690 */ 1425, 234, 232, 338, 1407, 509, 578, 236, 240, 227, - /* 1700 */ 1409, 1747, 504, 577, 1402, 145, 239, 518, 319, 1767, - /* 1710 */ 25, 1808, 1382, 662, 1381, 293, 1778, 580, 1780, 1781, - /* 1720 */ 576, 24, 571, 250, 46, 1766, 18, 266, 1808, 81, - /* 1730 */ 149, 1437, 293, 1778, 580, 1780, 1781, 576, 45, 571, - /* 1740 */ 1436, 151, 17, 1442, 1431, 193, 652, 648, 644, 640, - /* 1750 */ 264, 1777, 330, 1441, 1440, 331, 10, 1270, 19, 146, - /* 1760 */ 1811, 1300, 1344, 1777, 464, 460, 456, 452, 192, 150, - /* 1770 */ 1319, 570, 163, 1317, 31, 1777, 1316, 87, 579, 1795, - /* 1780 */ 229, 12, 20, 21, 581, 1131, 583, 578, 339, 1128, - /* 1790 */ 585, 1795, 1747, 587, 577, 72, 1125, 13, 190, 578, - /* 1800 */ 588, 590, 593, 1795, 1747, 591, 577, 1119, 594, 596, - /* 1810 */ 1117, 578, 597, 523, 1108, 1123, 1747, 1122, 577, 1808, - /* 1820 */ 1140, 1121, 1120, 278, 1778, 580, 1780, 1781, 576, 83, - /* 1830 */ 571, 1808, 603, 84, 60, 279, 1778, 580, 1780, 1781, - /* 1840 */ 576, 261, 571, 1808, 1136, 216, 612, 280, 1778, 580, - /* 1850 */ 1780, 1781, 576, 1058, 571, 1033, 1077, 1777, 615, 262, - /* 1860 */ 189, 182, 1056, 187, 1055, 1054, 1226, 443, 209, 1053, - /* 1870 */ 1052, 1777, 1051, 1050, 1049, 1074, 1516, 1072, 1046, 1045, - /* 1880 */ 1044, 1041, 1040, 1039, 1038, 1795, 180, 637, 1514, 1512, - /* 1890 */ 639, 641, 643, 578, 645, 1510, 649, 647, 1747, 1795, - /* 1900 */ 577, 638, 642, 651, 646, 1498, 653, 578, 996, 650, - /* 1910 */ 1480, 657, 1747, 265, 577, 1256, 273, 660, 661, 1455, - /* 1920 */ 1455, 1777, 1455, 1455, 1455, 1808, 1455, 1455, 1455, 287, - /* 1930 */ 1778, 580, 1780, 1781, 576, 1455, 571, 1777, 1455, 1808, - /* 1940 */ 1455, 1455, 1455, 289, 1778, 580, 1780, 1781, 576, 1795, - /* 1950 */ 571, 1455, 1455, 1455, 1455, 1455, 1455, 578, 1455, 1455, - /* 1960 */ 1455, 1455, 1747, 1455, 577, 1795, 1455, 1455, 1455, 1455, - /* 1970 */ 1455, 1455, 1455, 578, 1455, 1455, 1455, 1455, 1747, 1455, - /* 1980 */ 577, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1808, - /* 1990 */ 1777, 1455, 1455, 281, 1778, 580, 1780, 1781, 576, 1455, - /* 2000 */ 571, 1455, 1455, 1455, 1777, 1808, 1455, 1455, 1455, 290, - /* 2010 */ 1778, 580, 1780, 1781, 576, 1455, 571, 1455, 1795, 1455, - /* 2020 */ 1455, 1455, 1455, 1455, 1455, 1455, 578, 1455, 1455, 1455, - /* 2030 */ 1455, 1747, 1795, 577, 1455, 1455, 1455, 1455, 1455, 1455, - /* 2040 */ 578, 1455, 1455, 1455, 1455, 1747, 1455, 577, 1455, 1455, - /* 2050 */ 1455, 1455, 1455, 1455, 1455, 1455, 1777, 1455, 1808, 1455, - /* 2060 */ 1455, 1455, 282, 1778, 580, 1780, 1781, 576, 1455, 571, - /* 2070 */ 1455, 1455, 1808, 1455, 1777, 1455, 291, 1778, 580, 1780, - /* 2080 */ 1781, 576, 1455, 571, 1795, 1455, 1455, 1455, 1455, 1455, - /* 2090 */ 1455, 1455, 578, 1455, 1455, 1455, 1455, 1747, 1777, 577, - /* 2100 */ 1455, 1455, 1795, 1455, 1455, 1455, 1455, 1455, 1455, 1455, - /* 2110 */ 578, 1455, 1455, 1455, 1455, 1747, 1455, 577, 1455, 1455, - /* 2120 */ 1455, 1455, 1455, 1455, 1808, 1455, 1795, 1455, 283, 1778, - /* 2130 */ 580, 1780, 1781, 576, 578, 571, 1455, 1455, 1455, 1747, - /* 2140 */ 1455, 577, 1808, 1455, 1455, 1455, 296, 1778, 580, 1780, - /* 2150 */ 1781, 576, 1455, 571, 1455, 1455, 1777, 1455, 1455, 1455, - /* 2160 */ 1455, 1455, 1455, 1455, 1455, 1455, 1808, 1455, 1455, 1455, - /* 2170 */ 297, 1778, 580, 1780, 1781, 576, 1455, 571, 1455, 1777, - /* 2180 */ 1455, 1455, 1455, 1455, 1795, 1455, 1455, 1455, 1455, 1455, - /* 2190 */ 1455, 1455, 578, 1455, 1455, 1455, 1455, 1747, 1455, 577, - /* 2200 */ 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1795, 1455, 1455, - /* 2210 */ 1455, 1455, 1455, 1455, 1455, 578, 1455, 1455, 1455, 1455, - /* 2220 */ 1747, 1455, 577, 1455, 1808, 1455, 1455, 1455, 1789, 1778, - /* 2230 */ 580, 1780, 1781, 576, 1455, 571, 1777, 1455, 1455, 1455, - /* 2240 */ 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1808, 1777, 1455, - /* 2250 */ 1455, 1788, 1778, 580, 1780, 1781, 576, 1455, 571, 1455, - /* 2260 */ 1455, 1455, 1777, 1455, 1795, 1455, 1455, 1455, 1455, 1455, - /* 2270 */ 1455, 1455, 578, 1455, 1455, 1455, 1795, 1747, 1455, 577, - /* 2280 */ 1455, 1455, 1455, 1455, 578, 1455, 1455, 1455, 1455, 1747, - /* 2290 */ 1795, 577, 1455, 1455, 1455, 1455, 1455, 1455, 578, 1455, - /* 2300 */ 1455, 1455, 1455, 1747, 1808, 577, 1455, 1455, 1787, 1778, - /* 2310 */ 580, 1780, 1781, 576, 1777, 571, 1808, 1455, 1455, 1455, - /* 2320 */ 308, 1778, 580, 1780, 1781, 576, 1455, 571, 1455, 1455, - /* 2330 */ 1808, 1455, 1777, 1455, 307, 1778, 580, 1780, 1781, 576, - /* 2340 */ 1455, 571, 1795, 1455, 1455, 1455, 1455, 1455, 1455, 1455, - /* 2350 */ 578, 1455, 1455, 1455, 1455, 1747, 1777, 577, 1455, 1455, - /* 2360 */ 1795, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 578, 1455, - /* 2370 */ 1455, 1455, 1455, 1747, 1455, 577, 1455, 1455, 1455, 1455, - /* 2380 */ 1455, 1455, 1808, 1455, 1795, 1455, 309, 1778, 580, 1780, - /* 2390 */ 1781, 576, 578, 571, 1455, 1455, 1455, 1747, 1455, 577, - /* 2400 */ 1808, 1455, 1455, 1455, 306, 1778, 580, 1780, 1781, 576, - /* 2410 */ 1455, 571, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, - /* 2420 */ 1455, 1455, 1455, 1455, 1808, 1455, 1455, 1455, 286, 1778, - /* 2430 */ 580, 1780, 1781, 576, 1455, 571, + /* 0 */ 529, 1698, 433, 552, 434, 1495, 441, 1587, 434, 1495, + /* 10 */ 1769, 113, 39, 37, 386, 62, 517, 1583, 471, 380, + /* 20 */ 338, 1766, 1258, 1002, 324, 79, 1782, 1695, 1598, 30, + /* 30 */ 260, 122, 143, 1333, 103, 1256, 1554, 102, 101, 100, + /* 40 */ 99, 98, 97, 96, 95, 94, 1591, 1762, 1768, 327, + /* 50 */ 71, 302, 557, 1925, 1800, 555, 1328, 1512, 1283, 574, + /* 60 */ 1925, 14, 581, 1006, 1007, 500, 1924, 1752, 1264, 580, + /* 70 */ 1922, 120, 1594, 159, 39, 37, 1396, 1922, 498, 487, + /* 80 */ 496, 529, 338, 557, 1258, 1, 250, 1867, 551, 1019, + /* 90 */ 550, 1018, 164, 1925, 1813, 1333, 61, 1256, 89, 1783, + /* 100 */ 583, 1785, 1786, 579, 469, 574, 161, 662, 1859, 1598, + /* 110 */ 1922, 343, 305, 1855, 1643, 1645, 71, 61, 1328, 1020, + /* 120 */ 43, 1335, 1336, 14, 1925, 1461, 1925, 33, 32, 117, + /* 130 */ 1264, 40, 38, 36, 35, 34, 475, 161, 1593, 160, + /* 140 */ 142, 1922, 1472, 1922, 1483, 1782, 103, 2, 214, 102, + /* 150 */ 101, 100, 99, 98, 97, 96, 95, 94, 474, 1155, + /* 160 */ 1156, 486, 485, 484, 170, 1925, 1259, 483, 1257, 662, + /* 170 */ 118, 480, 325, 1800, 479, 478, 477, 1458, 1923, 74, + /* 180 */ 140, 556, 1922, 1335, 1336, 1752, 1752, 555, 580, 1600, + /* 190 */ 1644, 1645, 69, 1262, 1263, 68, 1311, 1312, 1314, 1315, + /* 200 */ 1316, 1317, 1318, 576, 572, 1326, 1327, 1329, 1330, 1331, + /* 210 */ 1332, 1334, 1337, 1813, 36, 35, 34, 90, 1783, 583, + /* 220 */ 1785, 1786, 579, 529, 574, 162, 371, 1859, 1259, 555, + /* 230 */ 1257, 329, 1855, 154, 113, 419, 162, 350, 1482, 33, + /* 240 */ 32, 476, 450, 40, 38, 36, 35, 34, 373, 369, + /* 250 */ 1283, 1598, 552, 1886, 1393, 1262, 1263, 162, 1311, 1312, + /* 260 */ 1314, 1315, 1316, 1317, 1318, 576, 572, 1326, 1327, 1329, + /* 270 */ 1330, 1331, 1332, 1334, 1337, 39, 37, 1453, 1925, 1752, + /* 280 */ 122, 174, 173, 338, 220, 1258, 40, 38, 36, 35, + /* 290 */ 34, 159, 306, 61, 42, 1922, 1333, 1739, 1256, 1113, + /* 300 */ 605, 604, 603, 1117, 602, 1119, 1120, 601, 1122, 598, + /* 310 */ 1800, 1128, 595, 1130, 1131, 592, 589, 1296, 545, 1328, + /* 320 */ 120, 1782, 33, 32, 14, 1355, 40, 38, 36, 35, + /* 330 */ 34, 1264, 39, 37, 554, 155, 1867, 1868, 86, 1872, + /* 340 */ 338, 552, 1258, 1769, 359, 1650, 1238, 1239, 2, 1800, + /* 350 */ 341, 119, 326, 1333, 1766, 1256, 544, 581, 140, 1590, + /* 360 */ 344, 1648, 1752, 529, 580, 1400, 1452, 1600, 140, 122, + /* 370 */ 662, 1282, 1282, 379, 165, 378, 1328, 1600, 557, 1356, + /* 380 */ 1762, 1768, 333, 1576, 1335, 1336, 1460, 432, 1264, 1813, + /* 390 */ 436, 1598, 574, 89, 1783, 583, 1785, 1786, 579, 1481, + /* 400 */ 574, 440, 1361, 1859, 436, 8, 215, 305, 1855, 120, + /* 410 */ 112, 111, 110, 109, 108, 107, 106, 105, 104, 1925, + /* 420 */ 482, 481, 632, 630, 156, 1867, 1868, 662, 1872, 1259, + /* 430 */ 208, 1257, 159, 162, 162, 61, 1922, 75, 516, 1480, + /* 440 */ 1752, 1335, 1336, 450, 29, 336, 1350, 1351, 1352, 1353, + /* 450 */ 1354, 1358, 1359, 1360, 1479, 315, 1262, 1263, 546, 1311, + /* 460 */ 1312, 1314, 1315, 1316, 1317, 1318, 576, 572, 1326, 1327, + /* 470 */ 1329, 1330, 1331, 1332, 1334, 1337, 1392, 33, 32, 1925, + /* 480 */ 1752, 40, 38, 36, 35, 34, 1259, 1357, 1257, 73, + /* 490 */ 304, 1650, 159, 519, 541, 1752, 1922, 33, 32, 348, + /* 500 */ 1284, 40, 38, 36, 35, 34, 316, 1649, 314, 313, + /* 510 */ 1362, 473, 616, 1262, 1263, 475, 1311, 1312, 1314, 1315, + /* 520 */ 1316, 1317, 1318, 576, 572, 1326, 1327, 1329, 1330, 1331, + /* 530 */ 1332, 1334, 1337, 39, 37, 1338, 438, 474, 1006, 1007, + /* 540 */ 1925, 338, 1280, 1258, 1782, 162, 1874, 1478, 1313, 1019, + /* 550 */ 306, 1018, 27, 159, 1333, 1427, 1256, 1922, 1589, 33, + /* 560 */ 32, 221, 222, 40, 38, 36, 35, 34, 1285, 1766, + /* 570 */ 1871, 552, 1800, 547, 542, 162, 1574, 1328, 1281, 1020, + /* 580 */ 556, 529, 529, 1355, 153, 1752, 1477, 580, 1752, 1264, + /* 590 */ 39, 37, 384, 385, 22, 1762, 1768, 1637, 338, 122, + /* 600 */ 1258, 1522, 1075, 11, 10, 140, 9, 574, 1650, 1598, + /* 610 */ 1598, 1333, 1813, 1256, 1601, 342, 90, 1783, 583, 1785, + /* 620 */ 1786, 579, 304, 574, 1648, 519, 1859, 1752, 662, 529, + /* 630 */ 329, 1855, 154, 252, 1328, 1077, 616, 1356, 1874, 120, + /* 640 */ 389, 1473, 1335, 1336, 158, 1343, 1264, 1694, 1688, 299, + /* 650 */ 517, 1282, 1885, 1264, 157, 1867, 1868, 1598, 1872, 172, + /* 660 */ 1361, 1696, 1870, 9, 639, 638, 637, 636, 346, 561, + /* 670 */ 635, 634, 633, 123, 628, 627, 626, 625, 624, 623, + /* 680 */ 622, 621, 133, 617, 1525, 662, 1282, 1259, 1369, 1257, + /* 690 */ 33, 32, 1874, 1476, 40, 38, 36, 35, 34, 1335, + /* 700 */ 1336, 232, 29, 336, 1350, 1351, 1352, 1353, 1354, 1358, + /* 710 */ 1359, 1360, 7, 1475, 1262, 1263, 1869, 1311, 1312, 1314, + /* 720 */ 1315, 1316, 1317, 1318, 576, 572, 1326, 1327, 1329, 1330, + /* 730 */ 1331, 1332, 1334, 1337, 1752, 33, 32, 1879, 1389, 40, + /* 740 */ 38, 36, 35, 34, 1259, 608, 1257, 486, 485, 484, + /* 750 */ 44, 4, 1258, 483, 1752, 272, 118, 480, 1628, 619, + /* 760 */ 479, 478, 477, 1474, 1585, 1256, 1417, 1693, 1407, 299, + /* 770 */ 612, 1262, 1263, 1641, 1311, 1312, 1314, 1315, 1316, 1317, + /* 780 */ 1318, 576, 572, 1326, 1327, 1329, 1330, 1331, 1332, 1334, + /* 790 */ 1337, 39, 37, 301, 613, 1280, 614, 1641, 1264, 338, + /* 800 */ 1581, 1258, 412, 1782, 1752, 424, 211, 538, 1415, 1416, + /* 810 */ 1418, 1419, 1333, 1296, 1256, 131, 130, 611, 610, 609, + /* 820 */ 11, 10, 397, 1575, 425, 575, 399, 59, 1313, 529, + /* 830 */ 529, 1800, 529, 1471, 620, 1328, 1570, 662, 1573, 581, + /* 840 */ 404, 405, 26, 449, 1752, 509, 580, 1264, 33, 32, + /* 850 */ 1507, 1505, 40, 38, 36, 35, 34, 1598, 1598, 390, + /* 860 */ 1598, 33, 32, 1313, 2, 40, 38, 36, 35, 34, + /* 870 */ 562, 1813, 489, 492, 1752, 91, 1783, 583, 1785, 1786, + /* 880 */ 579, 28, 574, 607, 631, 1859, 662, 33, 32, 1858, + /* 890 */ 1855, 40, 38, 36, 35, 34, 1259, 1389, 1257, 423, + /* 900 */ 1335, 1336, 418, 417, 416, 415, 414, 411, 410, 409, + /* 910 */ 408, 407, 403, 402, 401, 400, 394, 393, 392, 391, + /* 920 */ 614, 388, 387, 1262, 1263, 529, 1470, 374, 199, 141, + /* 930 */ 1555, 197, 564, 529, 278, 614, 1595, 52, 513, 131, + /* 940 */ 130, 611, 610, 609, 1727, 1259, 255, 1257, 276, 58, + /* 950 */ 41, 219, 57, 1598, 131, 130, 611, 610, 609, 1267, + /* 960 */ 1770, 1598, 502, 1469, 1782, 1455, 1456, 1752, 177, 429, + /* 970 */ 427, 1766, 1262, 1263, 1468, 1311, 1312, 1314, 1315, 1316, + /* 980 */ 1317, 1318, 576, 572, 1326, 1327, 1329, 1330, 1331, 1332, + /* 990 */ 1334, 1337, 1800, 1206, 223, 539, 61, 1762, 1768, 529, + /* 1000 */ 581, 468, 529, 1925, 1752, 1752, 139, 580, 1467, 574, + /* 1010 */ 510, 1266, 1466, 514, 529, 1752, 159, 1772, 201, 1465, + /* 1020 */ 1922, 200, 1464, 203, 1463, 527, 202, 1598, 570, 503, + /* 1030 */ 1598, 1801, 1813, 244, 88, 125, 90, 1783, 583, 1785, + /* 1040 */ 1786, 579, 1598, 574, 529, 1782, 1859, 529, 529, 1752, + /* 1050 */ 329, 1855, 1938, 1752, 205, 528, 1774, 204, 261, 345, + /* 1060 */ 1752, 1893, 552, 1752, 1046, 1752, 559, 128, 1501, 66, + /* 1070 */ 65, 383, 1598, 1800, 169, 1598, 1598, 347, 522, 85, + /* 1080 */ 377, 581, 129, 50, 335, 334, 1752, 1496, 580, 82, + /* 1090 */ 122, 236, 1270, 300, 1272, 1638, 367, 1047, 365, 361, + /* 1100 */ 357, 166, 352, 349, 249, 1333, 1889, 1265, 254, 553, + /* 1110 */ 229, 557, 257, 1813, 50, 3, 657, 90, 1783, 583, + /* 1120 */ 1785, 1786, 579, 1782, 574, 1106, 1414, 1859, 1328, 41, + /* 1130 */ 120, 329, 1855, 1938, 239, 565, 162, 41, 491, 259, + /* 1140 */ 1264, 80, 1916, 587, 1269, 250, 1867, 551, 53, 550, + /* 1150 */ 5, 1800, 1925, 501, 351, 1280, 354, 1363, 128, 581, + /* 1160 */ 1347, 358, 1222, 129, 1752, 159, 580, 207, 311, 1922, + /* 1170 */ 114, 128, 1319, 1075, 312, 406, 1782, 268, 1690, 569, + /* 1180 */ 271, 494, 171, 413, 421, 488, 1134, 420, 422, 1286, + /* 1190 */ 206, 1813, 426, 428, 430, 90, 1783, 583, 1785, 1786, + /* 1200 */ 579, 1138, 574, 431, 1800, 1859, 1145, 439, 1289, 329, + /* 1210 */ 1855, 1938, 581, 1143, 132, 442, 180, 1752, 56, 580, + /* 1220 */ 1878, 55, 443, 182, 1288, 1290, 445, 444, 1782, 185, + /* 1230 */ 447, 187, 1287, 557, 189, 451, 70, 448, 1273, 470, + /* 1240 */ 1268, 472, 192, 1588, 1813, 303, 196, 1732, 285, 1783, + /* 1250 */ 583, 1785, 1786, 579, 1584, 574, 1800, 93, 269, 198, + /* 1260 */ 134, 135, 504, 1586, 581, 1276, 1582, 136, 137, 1752, + /* 1270 */ 209, 580, 505, 212, 1925, 511, 572, 1326, 1327, 1329, + /* 1280 */ 1330, 1331, 1332, 515, 508, 557, 216, 161, 518, 537, + /* 1290 */ 227, 1922, 321, 1782, 126, 1731, 1813, 127, 1700, 520, + /* 1300 */ 285, 1783, 583, 1785, 1786, 579, 323, 574, 523, 1782, + /* 1310 */ 225, 524, 270, 525, 78, 1599, 1285, 1890, 533, 535, + /* 1320 */ 540, 1800, 234, 238, 1900, 536, 1925, 328, 6, 581, + /* 1330 */ 543, 549, 534, 532, 1752, 531, 580, 1800, 248, 159, + /* 1340 */ 1389, 121, 1284, 1922, 566, 578, 563, 48, 1899, 330, + /* 1350 */ 1752, 1875, 580, 1840, 585, 1881, 245, 243, 1642, 148, + /* 1360 */ 247, 1813, 273, 264, 1782, 91, 1783, 583, 1785, 1786, + /* 1370 */ 579, 246, 574, 1571, 658, 1859, 1782, 1813, 659, 568, + /* 1380 */ 1855, 293, 1783, 583, 1785, 1786, 579, 577, 574, 571, + /* 1390 */ 1831, 661, 1800, 51, 147, 275, 1746, 1921, 253, 286, + /* 1400 */ 581, 296, 295, 277, 1800, 1752, 560, 580, 256, 1941, + /* 1410 */ 567, 63, 581, 258, 1745, 1744, 64, 1752, 1743, 580, + /* 1420 */ 353, 1740, 355, 356, 1250, 1251, 167, 360, 1738, 362, + /* 1430 */ 363, 364, 1813, 1737, 366, 1736, 144, 1783, 583, 1785, + /* 1440 */ 1786, 579, 368, 574, 1813, 1735, 370, 1734, 91, 1783, + /* 1450 */ 583, 1785, 1786, 579, 1782, 574, 1717, 372, 1859, 375, + /* 1460 */ 168, 376, 1225, 1856, 1224, 1711, 1710, 381, 1782, 382, + /* 1470 */ 1709, 1708, 1194, 1683, 1682, 1681, 67, 1680, 1782, 1679, + /* 1480 */ 558, 1939, 1800, 1678, 1677, 1676, 395, 322, 396, 1675, + /* 1490 */ 581, 398, 1674, 1673, 1672, 1752, 1800, 580, 1671, 1670, + /* 1500 */ 1669, 530, 1668, 1667, 581, 1666, 1800, 1665, 1664, 1752, + /* 1510 */ 1663, 580, 1662, 1661, 581, 1660, 1659, 1658, 124, 1752, + /* 1520 */ 1657, 580, 1813, 1656, 1655, 1654, 294, 1783, 583, 1785, + /* 1530 */ 1786, 579, 1653, 574, 1652, 1782, 1813, 1651, 1527, 1526, + /* 1540 */ 294, 1783, 583, 1785, 1786, 579, 1813, 574, 1524, 1196, + /* 1550 */ 289, 1783, 583, 1785, 1786, 579, 1492, 574, 1491, 1782, + /* 1560 */ 175, 178, 176, 1800, 152, 115, 1009, 1008, 435, 179, + /* 1570 */ 116, 581, 1725, 1719, 437, 1707, 1752, 186, 580, 184, + /* 1580 */ 1706, 1692, 1577, 1523, 1521, 1782, 452, 1800, 548, 453, + /* 1590 */ 1519, 1517, 1039, 454, 456, 578, 457, 460, 1515, 458, + /* 1600 */ 1752, 1504, 580, 1813, 461, 462, 464, 144, 1783, 583, + /* 1610 */ 1785, 1786, 579, 1800, 574, 465, 466, 1503, 337, 1488, + /* 1620 */ 1579, 581, 1149, 1578, 1148, 195, 1752, 1813, 580, 49, + /* 1630 */ 1074, 293, 1783, 583, 1785, 1786, 579, 629, 574, 1782, + /* 1640 */ 1832, 1073, 1072, 631, 1071, 1068, 1067, 1066, 1065, 1513, + /* 1650 */ 317, 1508, 1940, 1813, 318, 665, 1506, 294, 1783, 583, + /* 1660 */ 1785, 1786, 579, 490, 574, 319, 493, 1800, 1487, 267, + /* 1670 */ 495, 1486, 339, 497, 1485, 581, 499, 92, 1724, 1232, + /* 1680 */ 1752, 1718, 580, 151, 506, 1705, 138, 1703, 655, 651, + /* 1690 */ 647, 643, 265, 1704, 54, 213, 507, 1702, 1701, 320, + /* 1700 */ 15, 1699, 512, 1691, 218, 226, 224, 1813, 41, 76, + /* 1710 */ 77, 294, 1783, 583, 1785, 1786, 579, 194, 574, 231, + /* 1720 */ 87, 521, 1782, 230, 82, 228, 16, 23, 242, 47, + /* 1730 */ 233, 146, 1429, 235, 1411, 237, 467, 463, 459, 455, + /* 1740 */ 193, 1413, 1242, 145, 240, 24, 1782, 1406, 241, 81, + /* 1750 */ 1800, 10, 1772, 25, 1441, 1386, 526, 251, 581, 45, + /* 1760 */ 46, 1385, 1771, 1752, 149, 580, 1446, 18, 72, 1435, + /* 1770 */ 1440, 191, 331, 1445, 1800, 1444, 332, 1274, 1348, 17, + /* 1780 */ 1816, 573, 581, 1304, 13, 19, 1323, 1752, 217, 580, + /* 1790 */ 1813, 150, 163, 1321, 279, 1783, 583, 1785, 1786, 579, + /* 1800 */ 31, 574, 1782, 586, 1112, 584, 1320, 12, 20, 1230, + /* 1810 */ 21, 210, 1135, 340, 1813, 588, 590, 582, 280, 1783, + /* 1820 */ 583, 1785, 1786, 579, 591, 574, 593, 596, 599, 1132, + /* 1830 */ 1800, 606, 594, 190, 183, 597, 188, 1129, 581, 1123, + /* 1840 */ 446, 1127, 1121, 1752, 1782, 580, 1144, 600, 83, 84, + /* 1850 */ 60, 262, 1140, 1126, 1782, 1062, 1037, 1125, 615, 181, + /* 1860 */ 618, 1124, 263, 1081, 1060, 1055, 1782, 1059, 1058, 1057, + /* 1870 */ 1813, 1056, 1800, 1054, 281, 1783, 583, 1785, 1786, 579, + /* 1880 */ 581, 574, 1800, 1053, 1078, 1752, 1076, 580, 1050, 1049, + /* 1890 */ 581, 1048, 1045, 1044, 1800, 1752, 1043, 580, 1042, 1520, + /* 1900 */ 640, 642, 581, 1518, 644, 646, 641, 1752, 1516, 580, + /* 1910 */ 648, 645, 1813, 650, 649, 1514, 288, 1783, 583, 1785, + /* 1920 */ 1786, 579, 1813, 574, 652, 653, 290, 1783, 583, 1785, + /* 1930 */ 1786, 579, 654, 574, 1813, 656, 999, 1484, 282, 1783, + /* 1940 */ 583, 1785, 1786, 579, 1502, 574, 266, 1782, 660, 1459, + /* 1950 */ 1260, 274, 663, 664, 1459, 1459, 1459, 1459, 1459, 1459, + /* 1960 */ 1459, 1459, 1459, 1459, 1459, 1459, 1782, 1459, 1459, 1459, + /* 1970 */ 1459, 1459, 1459, 1459, 1459, 1800, 1459, 1459, 1459, 1459, + /* 1980 */ 1459, 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, 1459, + /* 1990 */ 580, 1459, 1459, 1459, 1800, 1459, 1459, 1459, 1459, 1459, + /* 2000 */ 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, 1459, 580, + /* 2010 */ 1459, 1459, 1459, 1459, 1459, 1813, 1459, 1459, 1459, 291, + /* 2020 */ 1783, 583, 1785, 1786, 579, 1459, 574, 1782, 1459, 1459, + /* 2030 */ 1459, 1459, 1459, 1459, 1813, 1459, 1459, 1459, 283, 1783, + /* 2040 */ 583, 1785, 1786, 579, 1459, 574, 1782, 1459, 1459, 1459, + /* 2050 */ 1459, 1459, 1459, 1459, 1459, 1800, 1459, 1459, 1459, 1459, + /* 2060 */ 1459, 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, 1459, + /* 2070 */ 580, 1459, 1459, 1459, 1800, 1459, 1459, 1459, 1459, 1459, + /* 2080 */ 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, 1459, 580, + /* 2090 */ 1459, 1459, 1459, 1459, 1459, 1813, 1459, 1459, 1459, 292, + /* 2100 */ 1783, 583, 1785, 1786, 579, 1459, 574, 1459, 1459, 1459, + /* 2110 */ 1459, 1459, 1459, 1782, 1813, 1459, 1459, 1459, 284, 1783, + /* 2120 */ 583, 1785, 1786, 579, 1459, 574, 1459, 1459, 1459, 1782, + /* 2130 */ 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1782, + /* 2140 */ 1459, 1800, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 581, + /* 2150 */ 1459, 1459, 1459, 1459, 1752, 1459, 580, 1800, 1459, 1459, + /* 2160 */ 1459, 1459, 1459, 1459, 1459, 581, 1459, 1800, 1459, 1459, + /* 2170 */ 1752, 1459, 580, 1459, 1459, 581, 1459, 1459, 1459, 1459, + /* 2180 */ 1752, 1813, 580, 1459, 1459, 297, 1783, 583, 1785, 1786, + /* 2190 */ 579, 1459, 574, 1782, 1459, 1459, 1459, 1813, 1459, 1459, + /* 2200 */ 1459, 298, 1783, 583, 1785, 1786, 579, 1813, 574, 1459, + /* 2210 */ 1459, 1794, 1783, 583, 1785, 1786, 579, 1459, 574, 1459, + /* 2220 */ 1459, 1800, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 581, + /* 2230 */ 1459, 1459, 1459, 1459, 1752, 1459, 580, 1459, 1459, 1459, + /* 2240 */ 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1782, 1459, 1459, + /* 2250 */ 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, + /* 2260 */ 1459, 1813, 1459, 1459, 1459, 1793, 1783, 583, 1785, 1786, + /* 2270 */ 579, 1459, 574, 1459, 1459, 1800, 1459, 1459, 1459, 1459, + /* 2280 */ 1459, 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, 1459, + /* 2290 */ 580, 1459, 1459, 1459, 1459, 1459, 1459, 1782, 1459, 1459, + /* 2300 */ 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, + /* 2310 */ 1459, 1459, 1459, 1459, 1782, 1813, 1459, 1459, 1459, 1792, + /* 2320 */ 1783, 583, 1785, 1786, 579, 1800, 574, 1459, 1459, 1459, + /* 2330 */ 1459, 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, 1459, + /* 2340 */ 580, 1459, 1800, 1459, 1459, 1459, 1459, 1459, 1459, 1459, + /* 2350 */ 581, 1459, 1459, 1459, 1459, 1752, 1459, 580, 1459, 1459, + /* 2360 */ 1459, 1459, 1459, 1459, 1459, 1813, 1459, 1459, 1459, 309, + /* 2370 */ 1783, 583, 1785, 1786, 579, 1459, 574, 1782, 1459, 1459, + /* 2380 */ 1459, 1459, 1813, 1459, 1459, 1459, 308, 1783, 583, 1785, + /* 2390 */ 1786, 579, 1459, 574, 1459, 1459, 1459, 1459, 1782, 1459, + /* 2400 */ 1459, 1459, 1459, 1459, 1459, 1800, 1459, 1459, 1459, 1459, + /* 2410 */ 1459, 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, 1459, + /* 2420 */ 580, 1459, 1459, 1459, 1459, 1459, 1800, 1459, 1459, 1459, + /* 2430 */ 1459, 1459, 1459, 1459, 581, 1459, 1459, 1459, 1459, 1752, + /* 2440 */ 1782, 580, 1459, 1459, 1459, 1813, 1459, 1459, 1459, 310, + /* 2450 */ 1783, 583, 1785, 1786, 579, 1459, 574, 1459, 1459, 1459, + /* 2460 */ 1459, 1459, 1459, 1459, 1459, 1459, 1813, 1459, 1800, 1459, + /* 2470 */ 307, 1783, 583, 1785, 1786, 579, 581, 574, 1459, 1459, + /* 2480 */ 1459, 1752, 1459, 580, 1459, 1459, 1459, 1459, 1459, 1459, + /* 2490 */ 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, + /* 2500 */ 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1813, 1459, + /* 2510 */ 1459, 1459, 287, 1783, 583, 1785, 1786, 579, 1459, 574, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 261, 355, 263, 264, 261, 269, 263, 264, 300, 4, - /* 10 */ 285, 0, 12, 13, 368, 265, 308, 292, 372, 311, - /* 20 */ 20, 267, 22, 0, 8, 9, 301, 291, 12, 13, - /* 30 */ 14, 15, 16, 33, 280, 35, 257, 12, 13, 14, - /* 40 */ 15, 16, 288, 293, 21, 0, 265, 24, 25, 26, - /* 50 */ 27, 28, 29, 30, 31, 32, 56, 265, 265, 43, - /* 60 */ 60, 20, 296, 22, 285, 299, 300, 67, 276, 256, - /* 70 */ 285, 258, 293, 267, 293, 283, 35, 298, 293, 300, - /* 80 */ 12, 13, 14, 333, 84, 293, 293, 84, 20, 84, - /* 90 */ 22, 50, 47, 314, 288, 314, 314, 347, 348, 349, - /* 100 */ 350, 33, 352, 35, 325, 257, 106, 0, 329, 330, - /* 110 */ 331, 332, 333, 334, 333, 336, 331, 20, 339, 20, - /* 120 */ 120, 121, 343, 344, 56, 257, 333, 265, 60, 348, - /* 130 */ 349, 350, 0, 352, 355, 67, 355, 355, 276, 340, - /* 140 */ 341, 348, 349, 350, 257, 352, 298, 368, 59, 368, - /* 150 */ 368, 372, 84, 372, 372, 293, 24, 25, 26, 27, - /* 160 */ 28, 29, 30, 31, 32, 165, 298, 167, 20, 62, - /* 170 */ 63, 64, 285, 355, 106, 68, 115, 116, 71, 72, - /* 180 */ 293, 84, 75, 76, 77, 298, 368, 300, 120, 121, - /* 190 */ 372, 262, 192, 193, 265, 195, 196, 197, 198, 199, + /* 0 */ 266, 0, 262, 266, 264, 265, 262, 287, 264, 265, + /* 10 */ 288, 277, 12, 13, 266, 4, 301, 287, 284, 315, + /* 20 */ 20, 299, 22, 4, 309, 268, 258, 312, 294, 341, + /* 30 */ 342, 294, 271, 33, 21, 35, 275, 24, 25, 26, + /* 40 */ 27, 28, 29, 30, 31, 32, 289, 325, 326, 327, + /* 50 */ 270, 303, 315, 356, 286, 20, 56, 0, 20, 337, + /* 60 */ 356, 61, 294, 44, 45, 21, 369, 299, 68, 301, + /* 70 */ 373, 334, 292, 369, 12, 13, 14, 373, 34, 22, + /* 80 */ 36, 266, 20, 315, 22, 85, 349, 350, 351, 20, + /* 90 */ 353, 22, 277, 356, 326, 33, 85, 35, 330, 331, + /* 100 */ 332, 333, 334, 335, 35, 337, 369, 107, 340, 294, + /* 110 */ 373, 297, 344, 345, 300, 301, 270, 85, 56, 50, + /* 120 */ 85, 121, 122, 61, 356, 0, 356, 8, 9, 283, + /* 130 */ 68, 12, 13, 14, 15, 16, 97, 369, 292, 369, + /* 140 */ 257, 373, 259, 373, 258, 258, 21, 85, 56, 24, + /* 150 */ 25, 26, 27, 28, 29, 30, 31, 32, 119, 121, + /* 160 */ 122, 63, 64, 65, 56, 356, 166, 69, 168, 107, + /* 170 */ 72, 73, 278, 286, 76, 77, 78, 255, 369, 87, + /* 180 */ 286, 294, 373, 121, 122, 299, 299, 20, 301, 295, + /* 190 */ 300, 301, 84, 193, 194, 87, 196, 197, 198, 199, /* 200 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - /* 210 */ 210, 211, 325, 192, 20, 150, 329, 330, 331, 332, - /* 220 */ 333, 334, 20, 336, 224, 254, 339, 224, 20, 224, - /* 230 */ 343, 344, 345, 165, 37, 167, 84, 176, 285, 270, - /* 240 */ 179, 354, 4, 274, 8, 9, 285, 294, 12, 13, - /* 250 */ 14, 15, 16, 292, 233, 234, 235, 236, 237, 257, - /* 260 */ 192, 193, 301, 195, 196, 197, 198, 199, 200, 201, - /* 270 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - /* 280 */ 12, 13, 44, 45, 87, 314, 89, 90, 20, 92, - /* 290 */ 22, 257, 84, 96, 229, 230, 60, 147, 1, 2, - /* 300 */ 298, 33, 21, 35, 284, 24, 25, 26, 27, 28, - /* 310 */ 29, 30, 31, 32, 265, 118, 164, 297, 166, 285, - /* 320 */ 170, 85, 120, 121, 56, 20, 355, 293, 60, 93, - /* 330 */ 299, 300, 298, 262, 300, 67, 265, 12, 13, 368, - /* 340 */ 62, 63, 64, 372, 355, 20, 68, 22, 0, 71, - /* 350 */ 72, 302, 84, 75, 76, 77, 95, 368, 33, 325, - /* 360 */ 35, 372, 212, 329, 330, 331, 332, 333, 334, 14, - /* 370 */ 336, 269, 160, 339, 106, 20, 224, 343, 344, 345, - /* 380 */ 14, 56, 85, 147, 282, 20, 20, 22, 120, 121, - /* 390 */ 196, 357, 67, 291, 182, 183, 20, 8, 9, 365, - /* 400 */ 0, 12, 13, 14, 15, 16, 170, 271, 272, 84, - /* 410 */ 62, 63, 64, 65, 66, 50, 68, 69, 70, 71, - /* 420 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - /* 430 */ 277, 106, 224, 165, 43, 167, 8, 9, 285, 59, - /* 440 */ 12, 13, 14, 15, 16, 120, 121, 294, 212, 213, - /* 450 */ 214, 215, 216, 217, 218, 219, 220, 221, 20, 59, - /* 460 */ 192, 193, 257, 195, 196, 197, 198, 199, 200, 201, - /* 470 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - /* 480 */ 8, 9, 56, 265, 12, 13, 14, 15, 16, 56, - /* 490 */ 165, 116, 167, 115, 276, 20, 277, 14, 15, 16, - /* 500 */ 3, 8, 9, 298, 285, 12, 13, 14, 15, 16, - /* 510 */ 84, 293, 86, 294, 271, 272, 83, 192, 193, 86, - /* 520 */ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - /* 530 */ 205, 206, 207, 208, 209, 210, 211, 12, 13, 14, - /* 540 */ 310, 152, 312, 257, 277, 20, 257, 22, 20, 224, - /* 550 */ 175, 176, 285, 60, 179, 177, 178, 85, 33, 78, - /* 560 */ 35, 294, 196, 97, 98, 99, 100, 101, 102, 103, - /* 570 */ 104, 105, 106, 107, 285, 109, 110, 111, 112, 113, - /* 580 */ 114, 56, 293, 4, 298, 157, 93, 298, 265, 300, - /* 590 */ 152, 96, 67, 257, 12, 13, 293, 22, 19, 276, - /* 600 */ 42, 43, 20, 314, 22, 124, 125, 304, 67, 84, - /* 610 */ 35, 35, 33, 118, 325, 33, 293, 35, 329, 330, - /* 620 */ 331, 332, 333, 334, 21, 336, 47, 152, 339, 257, - /* 630 */ 51, 106, 343, 344, 298, 56, 245, 34, 56, 36, - /* 640 */ 147, 2, 67, 67, 355, 120, 121, 8, 9, 67, - /* 650 */ 224, 12, 13, 14, 15, 16, 0, 368, 327, 257, - /* 660 */ 257, 372, 83, 170, 96, 86, 84, 327, 43, 265, - /* 670 */ 298, 8, 9, 285, 246, 12, 13, 14, 15, 16, - /* 680 */ 276, 106, 351, 115, 116, 117, 118, 119, 106, 301, - /* 690 */ 165, 351, 167, 44, 45, 327, 314, 293, 257, 39, - /* 700 */ 298, 298, 120, 121, 0, 212, 213, 214, 215, 216, - /* 710 */ 217, 218, 219, 220, 221, 59, 286, 192, 193, 351, - /* 720 */ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - /* 730 */ 205, 206, 207, 208, 209, 210, 211, 355, 241, 298, - /* 740 */ 165, 310, 167, 312, 273, 2, 275, 165, 85, 167, - /* 750 */ 368, 8, 9, 300, 372, 12, 13, 14, 15, 16, - /* 760 */ 314, 222, 223, 67, 311, 8, 9, 192, 193, 12, - /* 770 */ 13, 14, 15, 16, 192, 193, 56, 195, 196, 197, - /* 780 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - /* 790 */ 208, 209, 210, 211, 12, 13, 18, 286, 20, 257, - /* 800 */ 96, 355, 20, 257, 22, 27, 86, 295, 30, 257, - /* 810 */ 298, 0, 4, 265, 368, 33, 314, 35, 372, 115, - /* 820 */ 116, 117, 118, 119, 276, 47, 257, 49, 257, 51, - /* 830 */ 14, 285, 295, 22, 278, 298, 20, 281, 56, 293, - /* 840 */ 298, 293, 85, 0, 298, 265, 300, 8, 9, 67, - /* 850 */ 298, 12, 13, 14, 15, 16, 276, 355, 265, 152, - /* 860 */ 153, 83, 88, 283, 35, 91, 84, 298, 243, 298, - /* 870 */ 368, 325, 286, 293, 372, 329, 330, 331, 332, 333, - /* 880 */ 334, 257, 336, 223, 257, 339, 293, 257, 106, 343, - /* 890 */ 344, 345, 257, 257, 88, 1, 2, 91, 35, 286, - /* 900 */ 354, 123, 120, 121, 126, 127, 128, 129, 130, 131, - /* 910 */ 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - /* 920 */ 142, 143, 298, 145, 146, 298, 333, 265, 298, 265, - /* 930 */ 43, 18, 35, 298, 298, 265, 23, 265, 276, 96, - /* 940 */ 276, 348, 349, 350, 60, 352, 276, 165, 276, 167, - /* 950 */ 37, 38, 120, 121, 41, 293, 318, 293, 115, 116, - /* 960 */ 117, 118, 119, 293, 67, 293, 257, 286, 286, 286, - /* 970 */ 57, 58, 85, 43, 192, 193, 265, 195, 196, 197, - /* 980 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - /* 990 */ 208, 209, 210, 211, 285, 265, 167, 84, 88, 265, - /* 1000 */ 265, 91, 293, 265, 293, 88, 276, 298, 91, 300, - /* 1010 */ 276, 276, 196, 287, 276, 85, 43, 258, 287, 274, - /* 1020 */ 375, 265, 321, 293, 298, 314, 266, 293, 293, 298, - /* 1030 */ 167, 293, 276, 225, 325, 122, 265, 257, 329, 330, - /* 1040 */ 331, 332, 333, 334, 333, 336, 0, 276, 339, 293, - /* 1050 */ 324, 325, 343, 344, 345, 324, 325, 326, 85, 348, - /* 1060 */ 349, 350, 336, 352, 293, 285, 355, 336, 22, 0, - /* 1070 */ 157, 158, 159, 293, 365, 162, 192, 84, 298, 368, - /* 1080 */ 300, 168, 366, 372, 46, 12, 13, 94, 43, 362, - /* 1090 */ 43, 22, 285, 43, 181, 22, 43, 184, 264, 186, - /* 1100 */ 187, 188, 189, 190, 191, 325, 33, 287, 35, 329, - /* 1110 */ 330, 331, 332, 333, 334, 287, 336, 43, 298, 339, - /* 1120 */ 265, 297, 84, 343, 344, 345, 298, 0, 43, 56, - /* 1130 */ 85, 276, 85, 257, 354, 85, 266, 224, 85, 43, - /* 1140 */ 67, 43, 328, 43, 324, 325, 326, 43, 293, 43, - /* 1150 */ 43, 43, 324, 325, 353, 346, 336, 369, 369, 85, - /* 1160 */ 369, 285, 84, 289, 336, 226, 356, 323, 20, 293, - /* 1170 */ 85, 265, 47, 322, 298, 48, 300, 35, 271, 106, - /* 1180 */ 163, 85, 316, 85, 265, 85, 265, 42, 305, 85, - /* 1190 */ 314, 85, 85, 85, 257, 147, 303, 265, 303, 265, - /* 1200 */ 259, 325, 20, 259, 20, 329, 330, 331, 332, 333, - /* 1210 */ 334, 320, 336, 20, 269, 300, 269, 313, 20, 269, - /* 1220 */ 315, 313, 285, 269, 20, 269, 306, 269, 265, 269, - /* 1230 */ 293, 355, 320, 259, 285, 298, 285, 300, 165, 259, - /* 1240 */ 167, 265, 285, 173, 368, 267, 285, 257, 372, 285, - /* 1250 */ 285, 314, 285, 285, 285, 285, 285, 298, 267, 319, - /* 1260 */ 265, 265, 325, 231, 267, 192, 329, 330, 331, 332, - /* 1270 */ 333, 334, 300, 336, 267, 285, 203, 204, 205, 206, - /* 1280 */ 207, 208, 209, 293, 309, 298, 298, 298, 298, 149, - /* 1290 */ 300, 309, 355, 307, 313, 293, 298, 298, 306, 257, - /* 1300 */ 281, 267, 293, 20, 298, 368, 298, 328, 232, 372, - /* 1310 */ 309, 298, 309, 361, 361, 325, 298, 238, 298, 329, - /* 1320 */ 330, 331, 332, 333, 334, 156, 336, 285, 240, 339, - /* 1330 */ 364, 239, 227, 343, 344, 293, 223, 323, 361, 20, - /* 1340 */ 298, 244, 300, 358, 360, 293, 363, 84, 327, 247, - /* 1350 */ 289, 265, 257, 359, 242, 298, 275, 267, 36, 260, - /* 1360 */ 259, 317, 279, 312, 0, 342, 257, 325, 279, 255, - /* 1370 */ 370, 329, 330, 331, 332, 333, 334, 175, 336, 268, - /* 1380 */ 285, 339, 371, 371, 0, 343, 344, 371, 293, 279, - /* 1390 */ 0, 376, 370, 298, 285, 300, 370, 42, 0, 75, - /* 1400 */ 0, 35, 293, 185, 35, 35, 35, 298, 185, 300, - /* 1410 */ 0, 35, 35, 185, 0, 185, 0, 35, 0, 257, - /* 1420 */ 325, 22, 0, 35, 329, 330, 331, 332, 333, 334, - /* 1430 */ 335, 336, 337, 338, 325, 0, 84, 257, 329, 330, - /* 1440 */ 331, 332, 333, 334, 169, 336, 170, 285, 167, 0, - /* 1450 */ 165, 0, 161, 160, 0, 293, 0, 46, 0, 0, - /* 1460 */ 298, 0, 300, 0, 144, 285, 0, 0, 0, 0, - /* 1470 */ 290, 139, 35, 293, 0, 139, 0, 0, 298, 0, - /* 1480 */ 300, 0, 373, 374, 0, 0, 0, 325, 0, 257, - /* 1490 */ 0, 329, 330, 331, 332, 333, 334, 0, 336, 0, - /* 1500 */ 0, 339, 0, 0, 42, 325, 344, 0, 0, 329, - /* 1510 */ 330, 331, 332, 333, 334, 0, 336, 285, 22, 0, - /* 1520 */ 0, 0, 290, 0, 0, 293, 0, 0, 0, 56, - /* 1530 */ 298, 257, 300, 0, 0, 42, 14, 39, 43, 14, - /* 1540 */ 0, 257, 0, 0, 0, 40, 0, 46, 39, 39, - /* 1550 */ 46, 156, 0, 0, 0, 0, 39, 325, 47, 285, - /* 1560 */ 0, 329, 330, 331, 332, 333, 334, 293, 336, 285, - /* 1570 */ 35, 35, 298, 61, 300, 0, 47, 293, 39, 47, - /* 1580 */ 35, 0, 298, 35, 300, 47, 39, 0, 39, 0, - /* 1590 */ 0, 257, 0, 35, 22, 0, 35, 35, 35, 325, - /* 1600 */ 35, 35, 43, 329, 330, 331, 332, 333, 334, 325, - /* 1610 */ 336, 43, 35, 329, 330, 331, 332, 333, 334, 285, - /* 1620 */ 336, 35, 91, 93, 0, 22, 35, 293, 0, 22, - /* 1630 */ 0, 49, 298, 22, 300, 0, 35, 35, 0, 35, - /* 1640 */ 0, 367, 22, 257, 0, 20, 0, 35, 22, 171, - /* 1650 */ 0, 0, 0, 0, 0, 84, 0, 84, 374, 325, - /* 1660 */ 257, 85, 149, 329, 330, 331, 332, 333, 334, 180, - /* 1670 */ 336, 285, 338, 0, 94, 39, 290, 84, 84, 293, - /* 1680 */ 46, 228, 43, 84, 298, 43, 300, 46, 285, 152, - /* 1690 */ 85, 85, 84, 290, 85, 154, 293, 84, 43, 148, - /* 1700 */ 85, 298, 152, 300, 85, 84, 84, 150, 152, 46, - /* 1710 */ 43, 325, 85, 19, 85, 329, 330, 331, 332, 333, - /* 1720 */ 334, 84, 336, 46, 43, 46, 43, 33, 325, 84, - /* 1730 */ 46, 35, 329, 330, 331, 332, 333, 334, 222, 336, - /* 1740 */ 35, 47, 228, 85, 85, 33, 52, 53, 54, 55, - /* 1750 */ 56, 257, 35, 35, 35, 35, 2, 22, 43, 47, - /* 1760 */ 84, 22, 192, 257, 52, 53, 54, 55, 56, 46, - /* 1770 */ 85, 84, 46, 85, 84, 257, 85, 83, 194, 285, - /* 1780 */ 86, 84, 84, 84, 95, 85, 35, 293, 35, 85, - /* 1790 */ 84, 285, 298, 35, 300, 83, 85, 228, 86, 293, - /* 1800 */ 84, 35, 35, 285, 298, 84, 300, 85, 84, 35, - /* 1810 */ 85, 293, 84, 119, 22, 108, 298, 108, 300, 325, - /* 1820 */ 35, 108, 108, 329, 330, 331, 332, 333, 334, 84, - /* 1830 */ 336, 325, 96, 84, 84, 329, 330, 331, 332, 333, - /* 1840 */ 334, 43, 336, 325, 22, 151, 60, 329, 330, 331, - /* 1850 */ 332, 333, 334, 35, 336, 61, 67, 257, 82, 43, - /* 1860 */ 148, 149, 35, 151, 35, 35, 172, 155, 174, 35, - /* 1870 */ 35, 257, 22, 35, 35, 67, 0, 35, 35, 35, - /* 1880 */ 35, 35, 35, 35, 35, 285, 174, 35, 0, 0, - /* 1890 */ 39, 35, 39, 293, 35, 0, 35, 39, 298, 285, - /* 1900 */ 300, 47, 47, 39, 47, 0, 35, 293, 35, 47, - /* 1910 */ 0, 21, 298, 22, 300, 22, 22, 21, 20, 377, - /* 1920 */ 377, 257, 377, 377, 377, 325, 377, 377, 377, 329, - /* 1930 */ 330, 331, 332, 333, 334, 377, 336, 257, 377, 325, - /* 1940 */ 377, 377, 377, 329, 330, 331, 332, 333, 334, 285, - /* 1950 */ 336, 377, 377, 377, 377, 377, 377, 293, 377, 377, - /* 1960 */ 377, 377, 298, 377, 300, 285, 377, 377, 377, 377, - /* 1970 */ 377, 377, 377, 293, 377, 377, 377, 377, 298, 377, - /* 1980 */ 300, 377, 377, 377, 377, 377, 377, 377, 377, 325, - /* 1990 */ 257, 377, 377, 329, 330, 331, 332, 333, 334, 377, - /* 2000 */ 336, 377, 377, 377, 257, 325, 377, 377, 377, 329, - /* 2010 */ 330, 331, 332, 333, 334, 377, 336, 377, 285, 377, - /* 2020 */ 377, 377, 377, 377, 377, 377, 293, 377, 377, 377, - /* 2030 */ 377, 298, 285, 300, 377, 377, 377, 377, 377, 377, - /* 2040 */ 293, 377, 377, 377, 377, 298, 377, 300, 377, 377, - /* 2050 */ 377, 377, 377, 377, 377, 377, 257, 377, 325, 377, - /* 2060 */ 377, 377, 329, 330, 331, 332, 333, 334, 377, 336, - /* 2070 */ 377, 377, 325, 377, 257, 377, 329, 330, 331, 332, - /* 2080 */ 333, 334, 377, 336, 285, 377, 377, 377, 377, 377, - /* 2090 */ 377, 377, 293, 377, 377, 377, 377, 298, 257, 300, - /* 2100 */ 377, 377, 285, 377, 377, 377, 377, 377, 377, 377, - /* 2110 */ 293, 377, 377, 377, 377, 298, 377, 300, 377, 377, - /* 2120 */ 377, 377, 377, 377, 325, 377, 285, 377, 329, 330, - /* 2130 */ 331, 332, 333, 334, 293, 336, 377, 377, 377, 298, - /* 2140 */ 377, 300, 325, 377, 377, 377, 329, 330, 331, 332, - /* 2150 */ 333, 334, 377, 336, 377, 377, 257, 377, 377, 377, - /* 2160 */ 377, 377, 377, 377, 377, 377, 325, 377, 377, 377, - /* 2170 */ 329, 330, 331, 332, 333, 334, 377, 336, 377, 257, - /* 2180 */ 377, 377, 377, 377, 285, 377, 377, 377, 377, 377, - /* 2190 */ 377, 377, 293, 377, 377, 377, 377, 298, 377, 300, - /* 2200 */ 377, 377, 377, 377, 377, 377, 377, 285, 377, 377, - /* 2210 */ 377, 377, 377, 377, 377, 293, 377, 377, 377, 377, - /* 2220 */ 298, 377, 300, 377, 325, 377, 377, 377, 329, 330, - /* 2230 */ 331, 332, 333, 334, 377, 336, 257, 377, 377, 377, - /* 2240 */ 377, 377, 377, 377, 377, 377, 377, 325, 257, 377, - /* 2250 */ 377, 329, 330, 331, 332, 333, 334, 377, 336, 377, - /* 2260 */ 377, 377, 257, 377, 285, 377, 377, 377, 377, 377, - /* 2270 */ 377, 377, 293, 377, 377, 377, 285, 298, 377, 300, - /* 2280 */ 377, 377, 377, 377, 293, 377, 377, 377, 377, 298, - /* 2290 */ 285, 300, 377, 377, 377, 377, 377, 377, 293, 377, - /* 2300 */ 377, 377, 377, 298, 325, 300, 377, 377, 329, 330, - /* 2310 */ 331, 332, 333, 334, 257, 336, 325, 377, 377, 377, - /* 2320 */ 329, 330, 331, 332, 333, 334, 377, 336, 377, 377, - /* 2330 */ 325, 377, 257, 377, 329, 330, 331, 332, 333, 334, - /* 2340 */ 377, 336, 285, 377, 377, 377, 377, 377, 377, 377, - /* 2350 */ 293, 377, 377, 377, 377, 298, 257, 300, 377, 377, - /* 2360 */ 285, 377, 377, 377, 377, 377, 377, 377, 293, 377, - /* 2370 */ 377, 377, 377, 298, 377, 300, 377, 377, 377, 377, - /* 2380 */ 377, 377, 325, 377, 285, 377, 329, 330, 331, 332, - /* 2390 */ 333, 334, 293, 336, 377, 377, 377, 298, 377, 300, - /* 2400 */ 325, 377, 377, 377, 329, 330, 331, 332, 333, 334, - /* 2410 */ 377, 336, 377, 377, 377, 377, 377, 377, 377, 377, - /* 2420 */ 377, 377, 377, 377, 325, 377, 377, 377, 329, 330, - /* 2430 */ 331, 332, 333, 334, 377, 336, + /* 210 */ 210, 211, 212, 326, 14, 15, 16, 330, 331, 332, + /* 220 */ 333, 334, 335, 266, 337, 225, 161, 340, 166, 20, + /* 230 */ 168, 344, 345, 346, 277, 79, 225, 315, 258, 8, + /* 240 */ 9, 284, 60, 12, 13, 14, 15, 16, 183, 184, + /* 250 */ 20, 294, 266, 366, 4, 193, 194, 225, 196, 197, + /* 260 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + /* 270 */ 208, 209, 210, 211, 212, 12, 13, 158, 356, 299, + /* 280 */ 294, 125, 126, 20, 116, 22, 12, 13, 14, 15, + /* 290 */ 16, 369, 61, 85, 85, 373, 33, 0, 35, 98, + /* 300 */ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + /* 310 */ 286, 110, 111, 112, 113, 114, 115, 86, 294, 56, + /* 320 */ 334, 258, 8, 9, 61, 94, 12, 13, 14, 15, + /* 330 */ 16, 68, 12, 13, 348, 349, 350, 351, 268, 353, + /* 340 */ 20, 266, 22, 288, 47, 286, 178, 179, 85, 286, + /* 350 */ 278, 281, 293, 33, 299, 35, 332, 294, 286, 289, + /* 360 */ 278, 302, 299, 266, 301, 14, 247, 295, 286, 294, + /* 370 */ 107, 20, 20, 165, 277, 167, 56, 295, 315, 148, + /* 380 */ 325, 326, 327, 0, 121, 122, 0, 263, 68, 326, + /* 390 */ 266, 294, 337, 330, 331, 332, 333, 334, 335, 258, + /* 400 */ 337, 263, 171, 340, 266, 85, 56, 344, 345, 334, + /* 410 */ 24, 25, 26, 27, 28, 29, 30, 31, 32, 356, + /* 420 */ 272, 273, 272, 273, 349, 350, 351, 107, 353, 166, + /* 430 */ 117, 168, 369, 225, 225, 85, 373, 87, 315, 258, + /* 440 */ 299, 121, 122, 60, 213, 214, 215, 216, 217, 218, + /* 450 */ 219, 220, 221, 222, 258, 37, 193, 194, 20, 196, + /* 460 */ 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + /* 470 */ 207, 208, 209, 210, 211, 212, 226, 8, 9, 356, + /* 480 */ 299, 12, 13, 14, 15, 16, 166, 148, 168, 176, + /* 490 */ 177, 286, 369, 180, 151, 299, 373, 8, 9, 315, + /* 500 */ 20, 12, 13, 14, 15, 16, 88, 302, 90, 91, + /* 510 */ 171, 93, 60, 193, 194, 97, 196, 197, 198, 199, + /* 520 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + /* 530 */ 210, 211, 212, 12, 13, 14, 14, 119, 44, 45, + /* 540 */ 356, 20, 20, 22, 258, 225, 328, 258, 197, 20, + /* 550 */ 61, 22, 213, 369, 33, 86, 35, 373, 288, 8, + /* 560 */ 9, 116, 117, 12, 13, 14, 15, 16, 20, 299, + /* 570 */ 352, 266, 286, 230, 231, 225, 0, 56, 20, 50, + /* 580 */ 294, 266, 266, 94, 285, 299, 258, 301, 299, 68, + /* 590 */ 12, 13, 277, 277, 43, 325, 326, 298, 20, 294, + /* 600 */ 22, 0, 35, 1, 2, 286, 85, 337, 286, 294, + /* 610 */ 294, 33, 326, 35, 295, 293, 330, 331, 332, 333, + /* 620 */ 334, 335, 177, 337, 302, 180, 340, 299, 107, 266, + /* 630 */ 344, 345, 346, 153, 56, 68, 60, 148, 328, 334, + /* 640 */ 277, 259, 121, 122, 358, 14, 68, 311, 294, 313, + /* 650 */ 301, 20, 366, 68, 349, 350, 351, 294, 353, 305, + /* 660 */ 171, 312, 352, 85, 63, 64, 65, 66, 67, 43, + /* 670 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + /* 680 */ 79, 80, 81, 82, 0, 107, 20, 166, 86, 168, + /* 690 */ 8, 9, 328, 258, 12, 13, 14, 15, 16, 121, + /* 700 */ 122, 153, 213, 214, 215, 216, 217, 218, 219, 220, + /* 710 */ 221, 222, 39, 258, 193, 194, 352, 196, 197, 198, + /* 720 */ 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + /* 730 */ 209, 210, 211, 212, 299, 8, 9, 223, 224, 12, + /* 740 */ 13, 14, 15, 16, 166, 96, 168, 63, 64, 65, + /* 750 */ 42, 43, 22, 69, 299, 279, 72, 73, 282, 68, + /* 760 */ 76, 77, 78, 258, 287, 35, 193, 311, 86, 313, + /* 770 */ 296, 193, 194, 299, 196, 197, 198, 199, 200, 201, + /* 780 */ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + /* 790 */ 212, 12, 13, 18, 296, 20, 97, 299, 68, 20, + /* 800 */ 287, 22, 27, 258, 299, 30, 287, 234, 235, 236, + /* 810 */ 237, 238, 33, 86, 35, 116, 117, 118, 119, 120, + /* 820 */ 1, 2, 47, 0, 49, 287, 51, 3, 197, 266, + /* 830 */ 266, 286, 266, 258, 274, 56, 276, 107, 0, 294, + /* 840 */ 277, 277, 2, 277, 299, 319, 301, 68, 8, 9, + /* 850 */ 0, 0, 12, 13, 14, 15, 16, 294, 294, 84, + /* 860 */ 294, 8, 9, 197, 85, 12, 13, 14, 15, 16, + /* 870 */ 244, 326, 22, 22, 299, 330, 331, 332, 333, 334, + /* 880 */ 335, 2, 337, 287, 43, 340, 107, 8, 9, 344, + /* 890 */ 345, 12, 13, 14, 15, 16, 166, 224, 168, 124, + /* 900 */ 121, 122, 127, 128, 129, 130, 131, 132, 133, 134, + /* 910 */ 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + /* 920 */ 97, 146, 147, 193, 194, 266, 258, 86, 89, 18, + /* 930 */ 275, 92, 43, 266, 23, 97, 277, 153, 154, 116, + /* 940 */ 117, 118, 119, 120, 277, 166, 376, 168, 37, 38, + /* 950 */ 43, 43, 41, 294, 116, 117, 118, 119, 120, 35, + /* 960 */ 288, 294, 315, 258, 258, 121, 122, 299, 57, 58, + /* 970 */ 59, 299, 193, 194, 258, 196, 197, 198, 199, 200, + /* 980 */ 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + /* 990 */ 211, 212, 286, 86, 86, 367, 85, 325, 326, 266, + /* 1000 */ 294, 267, 266, 356, 299, 299, 153, 301, 258, 337, + /* 1010 */ 277, 35, 258, 277, 266, 299, 369, 46, 89, 258, + /* 1020 */ 373, 92, 258, 89, 258, 277, 92, 294, 61, 322, + /* 1030 */ 294, 286, 326, 363, 123, 43, 330, 331, 332, 333, + /* 1040 */ 334, 335, 294, 337, 266, 258, 340, 266, 266, 299, + /* 1050 */ 344, 345, 346, 299, 89, 277, 85, 92, 277, 277, + /* 1060 */ 299, 355, 266, 299, 35, 299, 242, 43, 0, 158, + /* 1070 */ 159, 160, 294, 286, 163, 294, 294, 267, 86, 85, + /* 1080 */ 169, 294, 43, 43, 12, 13, 299, 265, 301, 95, + /* 1090 */ 294, 43, 168, 182, 22, 298, 185, 68, 187, 188, + /* 1100 */ 189, 190, 191, 192, 347, 33, 329, 35, 370, 354, + /* 1110 */ 86, 315, 370, 326, 43, 357, 48, 330, 331, 332, + /* 1120 */ 333, 334, 335, 258, 337, 86, 86, 340, 56, 43, + /* 1130 */ 334, 344, 345, 346, 86, 246, 225, 43, 4, 370, + /* 1140 */ 68, 85, 355, 43, 168, 349, 350, 351, 290, 353, + /* 1150 */ 227, 286, 356, 19, 324, 20, 266, 86, 43, 294, + /* 1160 */ 193, 47, 164, 43, 299, 369, 301, 33, 323, 373, + /* 1170 */ 43, 43, 86, 35, 272, 266, 258, 317, 266, 107, + /* 1180 */ 86, 47, 42, 306, 148, 51, 86, 304, 304, 20, + /* 1190 */ 56, 326, 266, 266, 266, 330, 331, 332, 333, 334, + /* 1200 */ 335, 86, 337, 260, 286, 340, 86, 260, 20, 344, + /* 1210 */ 345, 346, 294, 86, 86, 321, 270, 299, 84, 301, + /* 1220 */ 355, 87, 301, 270, 20, 20, 316, 314, 258, 270, + /* 1230 */ 314, 270, 20, 315, 270, 266, 270, 307, 166, 260, + /* 1240 */ 168, 286, 270, 286, 326, 260, 286, 299, 330, 331, + /* 1250 */ 332, 333, 334, 335, 286, 337, 286, 266, 321, 286, + /* 1260 */ 286, 286, 174, 286, 294, 193, 286, 286, 286, 299, + /* 1270 */ 268, 301, 320, 268, 356, 266, 204, 205, 206, 207, + /* 1280 */ 208, 209, 210, 266, 301, 315, 268, 369, 299, 232, + /* 1290 */ 268, 373, 314, 258, 310, 299, 326, 310, 299, 299, + /* 1300 */ 330, 331, 332, 333, 334, 335, 299, 337, 150, 258, + /* 1310 */ 294, 308, 282, 307, 268, 294, 20, 329, 299, 299, + /* 1320 */ 233, 286, 310, 310, 362, 299, 356, 299, 239, 294, + /* 1330 */ 299, 157, 241, 240, 299, 228, 301, 286, 324, 369, + /* 1340 */ 224, 294, 20, 373, 245, 294, 243, 85, 362, 248, + /* 1350 */ 299, 328, 301, 343, 290, 365, 361, 364, 299, 362, + /* 1360 */ 359, 326, 266, 268, 258, 330, 331, 332, 333, 334, + /* 1370 */ 335, 360, 337, 276, 36, 340, 258, 326, 261, 344, + /* 1380 */ 345, 330, 331, 332, 333, 334, 335, 336, 337, 338, + /* 1390 */ 339, 260, 286, 318, 313, 269, 0, 372, 371, 280, + /* 1400 */ 294, 280, 280, 256, 286, 299, 372, 301, 371, 377, + /* 1410 */ 372, 176, 294, 371, 0, 0, 42, 299, 0, 301, + /* 1420 */ 76, 0, 35, 186, 35, 35, 35, 186, 0, 35, + /* 1430 */ 35, 186, 326, 0, 186, 0, 330, 331, 332, 333, + /* 1440 */ 334, 335, 35, 337, 326, 0, 22, 0, 330, 331, + /* 1450 */ 332, 333, 334, 335, 258, 337, 0, 35, 340, 171, + /* 1460 */ 85, 170, 168, 345, 166, 0, 0, 162, 258, 161, + /* 1470 */ 0, 0, 46, 0, 0, 0, 145, 0, 258, 0, + /* 1480 */ 374, 375, 286, 0, 0, 0, 140, 291, 35, 0, + /* 1490 */ 294, 140, 0, 0, 0, 299, 286, 301, 0, 0, + /* 1500 */ 0, 291, 0, 0, 294, 0, 286, 0, 0, 299, + /* 1510 */ 0, 301, 0, 0, 294, 0, 0, 0, 42, 299, + /* 1520 */ 0, 301, 326, 0, 0, 0, 330, 331, 332, 333, + /* 1530 */ 334, 335, 0, 337, 0, 258, 326, 0, 0, 0, + /* 1540 */ 330, 331, 332, 333, 334, 335, 326, 337, 0, 22, + /* 1550 */ 330, 331, 332, 333, 334, 335, 0, 337, 0, 258, + /* 1560 */ 56, 42, 56, 286, 43, 39, 14, 14, 46, 40, + /* 1570 */ 39, 294, 0, 0, 46, 0, 299, 157, 301, 39, + /* 1580 */ 0, 0, 0, 0, 0, 258, 35, 286, 368, 47, + /* 1590 */ 0, 0, 62, 39, 35, 294, 47, 35, 0, 39, + /* 1600 */ 299, 0, 301, 326, 47, 39, 35, 330, 331, 332, + /* 1610 */ 333, 334, 335, 286, 337, 47, 39, 0, 291, 0, + /* 1620 */ 0, 294, 35, 0, 22, 92, 299, 326, 301, 94, + /* 1630 */ 35, 330, 331, 332, 333, 334, 335, 43, 337, 258, + /* 1640 */ 339, 35, 35, 43, 35, 35, 35, 35, 35, 0, + /* 1650 */ 22, 0, 375, 326, 22, 19, 0, 330, 331, 332, + /* 1660 */ 333, 334, 335, 49, 337, 22, 35, 286, 0, 33, + /* 1670 */ 35, 0, 291, 35, 0, 294, 22, 20, 0, 35, + /* 1680 */ 299, 0, 301, 47, 22, 0, 172, 0, 52, 53, + /* 1690 */ 54, 55, 56, 0, 153, 150, 153, 0, 0, 153, + /* 1700 */ 85, 0, 155, 0, 86, 39, 85, 326, 43, 85, + /* 1710 */ 85, 330, 331, 332, 333, 334, 335, 33, 337, 46, + /* 1720 */ 84, 151, 258, 87, 95, 149, 229, 85, 46, 43, + /* 1730 */ 85, 47, 86, 86, 86, 85, 52, 53, 54, 55, + /* 1740 */ 56, 86, 181, 85, 85, 85, 258, 86, 43, 85, + /* 1750 */ 286, 2, 46, 43, 35, 86, 120, 46, 294, 223, + /* 1760 */ 43, 86, 46, 299, 46, 301, 86, 43, 84, 86, + /* 1770 */ 35, 87, 35, 35, 286, 35, 35, 22, 193, 229, + /* 1780 */ 85, 85, 294, 22, 229, 43, 86, 299, 152, 301, + /* 1790 */ 326, 46, 46, 86, 330, 331, 332, 333, 334, 335, + /* 1800 */ 85, 337, 258, 35, 22, 96, 86, 85, 85, 173, + /* 1810 */ 85, 175, 86, 35, 326, 85, 35, 195, 330, 331, + /* 1820 */ 332, 333, 334, 335, 85, 337, 35, 35, 35, 86, + /* 1830 */ 286, 97, 85, 149, 150, 85, 152, 86, 294, 86, + /* 1840 */ 156, 109, 86, 299, 258, 301, 35, 85, 85, 85, + /* 1850 */ 85, 43, 22, 109, 258, 35, 62, 109, 61, 175, + /* 1860 */ 83, 109, 43, 68, 35, 22, 258, 35, 35, 35, + /* 1870 */ 326, 35, 286, 35, 330, 331, 332, 333, 334, 335, + /* 1880 */ 294, 337, 286, 35, 68, 299, 35, 301, 35, 35, + /* 1890 */ 294, 35, 35, 35, 286, 299, 35, 301, 35, 0, + /* 1900 */ 35, 39, 294, 0, 35, 39, 47, 299, 0, 301, + /* 1910 */ 35, 47, 326, 39, 47, 0, 330, 331, 332, 333, + /* 1920 */ 334, 335, 326, 337, 35, 47, 330, 331, 332, 333, + /* 1930 */ 334, 335, 39, 337, 326, 35, 35, 0, 330, 331, + /* 1940 */ 332, 333, 334, 335, 0, 337, 22, 258, 21, 378, + /* 1950 */ 22, 22, 21, 20, 378, 378, 378, 378, 378, 378, + /* 1960 */ 378, 378, 378, 378, 378, 378, 258, 378, 378, 378, + /* 1970 */ 378, 378, 378, 378, 378, 286, 378, 378, 378, 378, + /* 1980 */ 378, 378, 378, 294, 378, 378, 378, 378, 299, 378, + /* 1990 */ 301, 378, 378, 378, 286, 378, 378, 378, 378, 378, + /* 2000 */ 378, 378, 294, 378, 378, 378, 378, 299, 378, 301, + /* 2010 */ 378, 378, 378, 378, 378, 326, 378, 378, 378, 330, + /* 2020 */ 331, 332, 333, 334, 335, 378, 337, 258, 378, 378, + /* 2030 */ 378, 378, 378, 378, 326, 378, 378, 378, 330, 331, + /* 2040 */ 332, 333, 334, 335, 378, 337, 258, 378, 378, 378, + /* 2050 */ 378, 378, 378, 378, 378, 286, 378, 378, 378, 378, + /* 2060 */ 378, 378, 378, 294, 378, 378, 378, 378, 299, 378, + /* 2070 */ 301, 378, 378, 378, 286, 378, 378, 378, 378, 378, + /* 2080 */ 378, 378, 294, 378, 378, 378, 378, 299, 378, 301, + /* 2090 */ 378, 378, 378, 378, 378, 326, 378, 378, 378, 330, + /* 2100 */ 331, 332, 333, 334, 335, 378, 337, 378, 378, 378, + /* 2110 */ 378, 378, 378, 258, 326, 378, 378, 378, 330, 331, + /* 2120 */ 332, 333, 334, 335, 378, 337, 378, 378, 378, 258, + /* 2130 */ 378, 378, 378, 378, 378, 378, 378, 378, 378, 258, + /* 2140 */ 378, 286, 378, 378, 378, 378, 378, 378, 378, 294, + /* 2150 */ 378, 378, 378, 378, 299, 378, 301, 286, 378, 378, + /* 2160 */ 378, 378, 378, 378, 378, 294, 378, 286, 378, 378, + /* 2170 */ 299, 378, 301, 378, 378, 294, 378, 378, 378, 378, + /* 2180 */ 299, 326, 301, 378, 378, 330, 331, 332, 333, 334, + /* 2190 */ 335, 378, 337, 258, 378, 378, 378, 326, 378, 378, + /* 2200 */ 378, 330, 331, 332, 333, 334, 335, 326, 337, 378, + /* 2210 */ 378, 330, 331, 332, 333, 334, 335, 378, 337, 378, + /* 2220 */ 378, 286, 378, 378, 378, 378, 378, 378, 378, 294, + /* 2230 */ 378, 378, 378, 378, 299, 378, 301, 378, 378, 378, + /* 2240 */ 378, 378, 378, 378, 378, 378, 378, 258, 378, 378, + /* 2250 */ 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, + /* 2260 */ 378, 326, 378, 378, 378, 330, 331, 332, 333, 334, + /* 2270 */ 335, 378, 337, 378, 378, 286, 378, 378, 378, 378, + /* 2280 */ 378, 378, 378, 294, 378, 378, 378, 378, 299, 378, + /* 2290 */ 301, 378, 378, 378, 378, 378, 378, 258, 378, 378, + /* 2300 */ 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, + /* 2310 */ 378, 378, 378, 378, 258, 326, 378, 378, 378, 330, + /* 2320 */ 331, 332, 333, 334, 335, 286, 337, 378, 378, 378, + /* 2330 */ 378, 378, 378, 294, 378, 378, 378, 378, 299, 378, + /* 2340 */ 301, 378, 286, 378, 378, 378, 378, 378, 378, 378, + /* 2350 */ 294, 378, 378, 378, 378, 299, 378, 301, 378, 378, + /* 2360 */ 378, 378, 378, 378, 378, 326, 378, 378, 378, 330, + /* 2370 */ 331, 332, 333, 334, 335, 378, 337, 258, 378, 378, + /* 2380 */ 378, 378, 326, 378, 378, 378, 330, 331, 332, 333, + /* 2390 */ 334, 335, 378, 337, 378, 378, 378, 378, 258, 378, + /* 2400 */ 378, 378, 378, 378, 378, 286, 378, 378, 378, 378, + /* 2410 */ 378, 378, 378, 294, 378, 378, 378, 378, 299, 378, + /* 2420 */ 301, 378, 378, 378, 378, 378, 286, 378, 378, 378, + /* 2430 */ 378, 378, 378, 378, 294, 378, 378, 378, 378, 299, + /* 2440 */ 258, 301, 378, 378, 378, 326, 378, 378, 378, 330, + /* 2450 */ 331, 332, 333, 334, 335, 378, 337, 378, 378, 378, + /* 2460 */ 378, 378, 378, 378, 378, 378, 326, 378, 286, 378, + /* 2470 */ 330, 331, 332, 333, 334, 335, 294, 337, 378, 378, + /* 2480 */ 378, 299, 378, 301, 378, 378, 378, 378, 378, 378, + /* 2490 */ 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, + /* 2500 */ 378, 378, 378, 378, 378, 378, 378, 378, 326, 378, + /* 2510 */ 378, 378, 330, 331, 332, 333, 334, 335, 378, 337, }; -#define YY_SHIFT_COUNT (662) +#define YY_SHIFT_COUNT (665) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (1910) +#define YY_SHIFT_MAX (1944) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 913, 0, 0, 68, 68, 268, 268, 268, 325, 325, - /* 10 */ 268, 268, 525, 582, 782, 582, 582, 582, 582, 582, - /* 20 */ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, - /* 30 */ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, - /* 40 */ 582, 582, 208, 208, 97, 97, 97, 1073, 1073, 1073, - /* 50 */ 1073, 152, 426, 3, 3, 99, 99, 238, 238, 5, - /* 60 */ 202, 3, 3, 99, 99, 99, 99, 99, 99, 99, - /* 70 */ 99, 99, 89, 99, 99, 99, 148, 305, 99, 99, - /* 80 */ 305, 376, 99, 305, 305, 305, 99, 380, 778, 236, - /* 90 */ 493, 493, 281, 278, 575, 575, 575, 575, 575, 575, - /* 100 */ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, - /* 110 */ 575, 575, 575, 197, 202, 355, 355, 400, 576, 656, - /* 120 */ 438, 438, 438, 576, 528, 148, 11, 11, 305, 305, - /* 130 */ 541, 541, 261, 696, 466, 466, 466, 466, 466, 466, - /* 140 */ 466, 1694, 23, 107, 428, 21, 41, 375, 65, 366, - /* 150 */ 816, 365, 649, 495, 475, 539, 660, 539, 558, 497, - /* 160 */ 497, 497, 808, 194, 1078, 939, 1148, 1125, 1142, 1017, - /* 170 */ 1148, 1148, 1145, 1048, 1048, 1148, 1148, 1182, 1182, 1184, - /* 180 */ 89, 148, 89, 1193, 1198, 89, 1193, 89, 1204, 89, - /* 190 */ 89, 1148, 89, 1182, 305, 305, 305, 305, 305, 305, - /* 200 */ 305, 305, 305, 305, 305, 1148, 1182, 541, 1184, 380, - /* 210 */ 1070, 148, 380, 1148, 1148, 1193, 380, 1032, 541, 541, - /* 220 */ 541, 541, 1032, 541, 1140, 528, 1204, 380, 261, 380, - /* 230 */ 528, 1283, 541, 1076, 1032, 541, 541, 1076, 1032, 541, - /* 240 */ 541, 305, 1079, 1169, 1076, 1088, 1092, 1105, 939, 1113, - /* 250 */ 528, 1319, 1097, 1112, 1102, 1097, 1112, 1097, 1112, 1263, - /* 260 */ 1078, 541, 696, 1148, 380, 1322, 1182, 2436, 2436, 2436, - /* 270 */ 2436, 2436, 2436, 2436, 348, 1712, 132, 579, 472, 16, - /* 280 */ 663, 639, 743, 389, 757, 704, 839, 839, 839, 839, - /* 290 */ 839, 839, 839, 839, 843, 568, 25, 25, 61, 212, - /* 300 */ 433, 481, 603, 378, 297, 150, 483, 483, 483, 483, - /* 310 */ 45, 887, 774, 806, 910, 917, 811, 1046, 1069, 720, - /* 320 */ 707, 930, 973, 1045, 1047, 1050, 1053, 1074, 894, 832, - /* 330 */ 625, 391, 1096, 829, 863, 884, 1098, 1038, 1085, 1100, - /* 340 */ 1104, 1106, 1107, 1108, 993, 897, 1127, 1364, 1202, 1384, - /* 350 */ 1390, 1355, 1398, 1324, 1400, 1366, 1218, 1369, 1370, 1371, - /* 360 */ 1223, 1410, 1376, 1377, 1228, 1414, 1230, 1416, 1382, 1418, - /* 370 */ 1399, 1422, 1388, 1435, 1352, 1276, 1275, 1281, 1285, 1449, - /* 380 */ 1451, 1291, 1293, 1454, 1456, 1411, 1458, 1459, 1461, 1320, - /* 390 */ 1463, 1466, 1467, 1468, 1469, 1332, 1437, 1474, 1336, 1476, - /* 400 */ 1477, 1479, 1481, 1484, 1485, 1486, 1488, 1490, 1497, 1499, - /* 410 */ 1500, 1502, 1503, 1462, 1507, 1508, 1515, 1523, 1524, 1526, - /* 420 */ 1496, 1519, 1520, 1521, 1527, 1528, 1473, 1533, 1534, 1493, - /* 430 */ 1498, 1495, 1522, 1501, 1525, 1504, 1540, 1505, 1509, 1542, - /* 440 */ 1543, 1544, 1510, 1395, 1546, 1552, 1553, 1512, 1554, 1555, - /* 450 */ 1535, 1511, 1517, 1560, 1536, 1529, 1539, 1575, 1545, 1532, - /* 460 */ 1547, 1581, 1548, 1538, 1549, 1587, 1589, 1590, 1592, 1530, - /* 470 */ 1531, 1558, 1572, 1595, 1561, 1562, 1563, 1565, 1559, 1568, - /* 480 */ 1566, 1577, 1586, 1591, 1624, 1603, 1628, 1607, 1582, 1630, - /* 490 */ 1611, 1601, 1635, 1602, 1638, 1604, 1640, 1620, 1625, 1644, - /* 500 */ 1537, 1612, 1646, 1478, 1626, 1550, 1513, 1650, 1651, 1556, - /* 510 */ 1541, 1652, 1653, 1654, 1571, 1576, 1489, 1656, 1573, 1557, - /* 520 */ 1593, 1673, 1636, 1551, 1594, 1580, 1634, 1639, 1453, 1599, - /* 530 */ 1605, 1608, 1606, 1609, 1613, 1642, 1615, 1621, 1622, 1637, - /* 540 */ 1619, 1655, 1641, 1663, 1645, 1667, 1514, 1627, 1629, 1677, - /* 550 */ 1516, 1681, 1679, 1684, 1658, 1683, 1569, 1659, 1696, 1705, - /* 560 */ 1717, 1718, 1719, 1720, 1659, 1754, 1735, 1570, 1715, 1676, - /* 570 */ 1685, 1687, 1688, 1690, 1691, 1723, 1697, 1698, 1726, 1739, - /* 580 */ 1584, 1699, 1689, 1700, 1751, 1753, 1706, 1704, 1758, 1716, - /* 590 */ 1711, 1766, 1721, 1722, 1767, 1724, 1725, 1774, 1728, 1707, - /* 600 */ 1709, 1713, 1714, 1792, 1736, 1745, 1749, 1785, 1750, 1798, - /* 610 */ 1798, 1822, 1794, 1786, 1818, 1789, 1776, 1816, 1827, 1829, - /* 620 */ 1830, 1834, 1835, 1850, 1838, 1839, 1808, 1559, 1842, 1568, - /* 630 */ 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1876, 1852, 1854, - /* 640 */ 1851, 1888, 1856, 1855, 1853, 1889, 1859, 1857, 1858, 1895, - /* 650 */ 1861, 1862, 1864, 1905, 1871, 1873, 1910, 1891, 1890, 1893, - /* 660 */ 1894, 1896, 1898, + /* 0 */ 911, 0, 0, 62, 62, 263, 263, 263, 320, 320, + /* 10 */ 263, 263, 521, 578, 779, 578, 578, 578, 578, 578, + /* 20 */ 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + /* 30 */ 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + /* 40 */ 578, 578, 209, 209, 35, 35, 35, 1072, 1072, 1072, + /* 50 */ 1072, 208, 350, 32, 32, 167, 167, 19, 19, 11, + /* 60 */ 38, 32, 32, 167, 167, 167, 167, 167, 167, 167, + /* 70 */ 167, 167, 182, 167, 167, 167, 230, 352, 167, 167, + /* 80 */ 352, 438, 167, 352, 352, 352, 167, 452, 775, 231, + /* 90 */ 489, 489, 13, 98, 730, 730, 730, 730, 730, 730, + /* 100 */ 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, + /* 110 */ 730, 730, 730, 418, 38, 522, 522, 383, 567, 576, + /* 120 */ 480, 480, 480, 567, 558, 230, 1, 1, 352, 352, + /* 130 */ 585, 585, 649, 691, 201, 201, 201, 201, 201, 201, + /* 140 */ 201, 1636, 125, 684, 119, 573, 69, 313, 343, 351, + /* 150 */ 631, 529, 494, 39, 548, 514, 673, 514, 708, 824, + /* 160 */ 824, 824, 250, 666, 1056, 923, 1135, 1114, 1138, 998, + /* 170 */ 1135, 1135, 1140, 1036, 1036, 1135, 1135, 1135, 1169, 1169, + /* 180 */ 1188, 182, 230, 182, 1204, 1205, 182, 1204, 182, 1212, + /* 190 */ 182, 182, 1135, 182, 1169, 352, 352, 352, 352, 352, + /* 200 */ 352, 352, 352, 352, 352, 352, 1135, 1169, 585, 1188, + /* 210 */ 452, 1088, 230, 452, 1135, 1135, 1204, 452, 1057, 585, + /* 220 */ 585, 585, 585, 1057, 585, 1158, 558, 1212, 452, 649, + /* 230 */ 452, 558, 1296, 585, 1087, 1057, 585, 585, 1087, 1057, + /* 240 */ 585, 585, 352, 1089, 1174, 1087, 1091, 1093, 1107, 923, + /* 250 */ 1116, 558, 1322, 1099, 1103, 1101, 1099, 1103, 1099, 1103, + /* 260 */ 1262, 1056, 585, 691, 1135, 452, 1338, 1169, 2520, 2520, + /* 270 */ 2520, 2520, 2520, 2520, 2520, 601, 1684, 386, 1134, 469, + /* 280 */ 551, 682, 840, 879, 853, 727, 823, 314, 314, 314, + /* 290 */ 314, 314, 314, 314, 314, 838, 699, 274, 274, 445, + /* 300 */ 65, 108, 156, 44, 168, 602, 339, 200, 200, 200, + /* 310 */ 200, 297, 841, 839, 929, 934, 965, 57, 850, 851, + /* 320 */ 92, 784, 907, 908, 992, 1024, 1039, 1040, 1048, 819, + /* 330 */ 844, 626, 889, 1071, 924, 976, 967, 1086, 971, 1094, + /* 340 */ 1100, 1115, 1120, 1127, 1128, 994, 1029, 1068, 1396, 1235, + /* 350 */ 1414, 1415, 1374, 1418, 1344, 1421, 1387, 1237, 1389, 1390, + /* 360 */ 1391, 1241, 1428, 1394, 1395, 1245, 1433, 1248, 1435, 1407, + /* 370 */ 1445, 1424, 1447, 1422, 1456, 1375, 1288, 1291, 1294, 1298, + /* 380 */ 1465, 1466, 1305, 1308, 1470, 1471, 1426, 1473, 1474, 1475, + /* 390 */ 1331, 1477, 1479, 1483, 1484, 1485, 1346, 1453, 1489, 1351, + /* 400 */ 1492, 1493, 1494, 1498, 1499, 1500, 1502, 1503, 1505, 1507, + /* 410 */ 1508, 1510, 1512, 1513, 1476, 1515, 1516, 1517, 1520, 1523, + /* 420 */ 1524, 1527, 1525, 1532, 1534, 1537, 1538, 1504, 1539, 1506, + /* 430 */ 1548, 1556, 1519, 1526, 1521, 1552, 1522, 1553, 1528, 1558, + /* 440 */ 1529, 1531, 1572, 1573, 1575, 1540, 1420, 1580, 1581, 1582, + /* 450 */ 1530, 1583, 1584, 1551, 1542, 1554, 1590, 1559, 1549, 1560, + /* 460 */ 1591, 1562, 1557, 1566, 1598, 1571, 1568, 1577, 1601, 1617, + /* 470 */ 1619, 1620, 1535, 1533, 1587, 1602, 1623, 1595, 1606, 1607, + /* 480 */ 1609, 1594, 1600, 1610, 1611, 1612, 1613, 1649, 1628, 1651, + /* 490 */ 1632, 1614, 1656, 1643, 1631, 1668, 1635, 1671, 1638, 1674, + /* 500 */ 1654, 1657, 1678, 1541, 1644, 1681, 1514, 1662, 1543, 1545, + /* 510 */ 1685, 1687, 1546, 1547, 1693, 1697, 1698, 1615, 1618, 1561, + /* 520 */ 1701, 1621, 1570, 1624, 1703, 1666, 1576, 1625, 1629, 1673, + /* 530 */ 1665, 1497, 1642, 1646, 1645, 1647, 1648, 1650, 1686, 1655, + /* 540 */ 1658, 1659, 1660, 1661, 1705, 1682, 1706, 1664, 1710, 1550, + /* 550 */ 1669, 1675, 1711, 1536, 1717, 1716, 1718, 1680, 1724, 1555, + /* 560 */ 1683, 1719, 1735, 1737, 1738, 1740, 1741, 1683, 1749, 1755, + /* 570 */ 1585, 1742, 1695, 1700, 1696, 1707, 1715, 1720, 1745, 1722, + /* 580 */ 1723, 1746, 1761, 1622, 1725, 1709, 1726, 1768, 1778, 1730, + /* 590 */ 1743, 1781, 1739, 1751, 1791, 1747, 1753, 1792, 1750, 1756, + /* 600 */ 1793, 1762, 1732, 1744, 1748, 1752, 1782, 1734, 1763, 1764, + /* 610 */ 1811, 1765, 1808, 1808, 1830, 1794, 1797, 1820, 1795, 1777, + /* 620 */ 1819, 1829, 1832, 1833, 1834, 1836, 1843, 1838, 1848, 1816, + /* 630 */ 1594, 1851, 1600, 1853, 1854, 1856, 1857, 1858, 1861, 1863, + /* 640 */ 1899, 1865, 1859, 1862, 1903, 1869, 1864, 1866, 1908, 1875, + /* 650 */ 1867, 1874, 1915, 1889, 1878, 1893, 1944, 1900, 1901, 1937, + /* 660 */ 1924, 1927, 1928, 1929, 1931, 1933, }; -#define YY_REDUCE_COUNT (273) -#define YY_REDUCE_MIN (-354) -#define YY_REDUCE_MAX (2099) +#define YY_REDUCE_COUNT (274) +#define YY_REDUCE_MIN (-312) +#define YY_REDUCE_MAX (2182) static const short yy_reduce_ofst[] = { - /* 0 */ -29, -221, 289, 34, 709, -113, 546, 780, 876, 937, - /* 10 */ 990, 1042, 1095, 1109, 1162, 1180, 1232, 1274, 1284, 1334, - /* 20 */ 1386, 1403, 1494, 1506, 1518, 1600, 1614, 1664, 1680, 1733, - /* 30 */ 1747, 1799, 1817, 1841, 1899, 1922, 1979, 1991, 2005, 2057, - /* 40 */ 2075, 2099, -219, 711, -250, -207, 593, 731, 820, 726, - /* 50 */ 828, -218, 382, 446, 502, -208, 580, -261, -257, -354, - /* 60 */ -234, -182, -11, -138, 218, 323, 404, 548, 662, 664, - /* 70 */ 670, 672, 102, 730, 734, 735, -292, 153, 738, 756, - /* 80 */ -275, -215, 771, 219, -39, 267, 855, -246, 49, -201, - /* 90 */ -201, -201, -187, -31, -152, -132, 2, 205, 286, 336, - /* 100 */ 372, 402, 403, 441, 542, 552, 569, 571, 624, 627, - /* 110 */ 630, 635, 636, 20, 31, -71, 71, -264, 136, -194, - /* 120 */ 331, 340, 368, 243, 303, 453, 230, 431, -47, 388, - /* 130 */ 512, 537, 556, 471, 430, 511, 586, 613, 681, 682, - /* 140 */ 683, 638, 759, 745, 645, 716, 760, 701, 727, 807, - /* 150 */ 807, 870, 834, 824, 814, 801, 801, 801, 809, 788, - /* 160 */ 789, 791, 810, 807, 874, 844, 906, 851, 907, 866, - /* 170 */ 919, 921, 883, 893, 895, 932, 934, 941, 944, 891, - /* 180 */ 945, 915, 947, 904, 905, 950, 908, 954, 920, 956, - /* 190 */ 958, 963, 960, 974, 949, 951, 957, 961, 964, 965, - /* 200 */ 967, 968, 969, 970, 971, 976, 980, 959, 912, 978, - /* 210 */ 940, 972, 991, 995, 996, 981, 997, 975, 987, 988, - /* 220 */ 989, 998, 982, 999, 986, 1002, 992, 1007, 1019, 1034, - /* 230 */ 1009, 979, 1006, 952, 1001, 1008, 1013, 953, 1003, 1018, - /* 240 */ 1020, 807, 966, 983, 977, 984, 994, 985, 1014, 801, - /* 250 */ 1052, 1021, 1011, 1000, 1015, 1012, 1022, 1016, 1026, 1023, - /* 260 */ 1061, 1057, 1081, 1086, 1090, 1099, 1101, 1044, 1051, 1083, - /* 270 */ 1089, 1110, 1111, 1114, + /* 0 */ -78, -232, 63, 286, -113, 706, 787, 865, 918, 970, + /* 10 */ 545, 1035, 1051, 1106, 1118, 1196, 1210, 1220, 1277, 1301, + /* 20 */ 1327, 1381, 1464, 1488, 1544, 1586, 1596, 1608, 1689, 1708, + /* 30 */ 1769, 1788, 1855, 1871, 1881, 1935, 1989, 2039, 2056, 2119, + /* 40 */ 2140, 2182, -263, 796, -14, 75, 305, -278, 55, 270, + /* 50 */ 672, -296, 123, 184, 647, -266, -43, -260, -256, -303, + /* 60 */ -186, -230, -191, -185, 97, 315, 316, 363, 563, 564, + /* 70 */ 566, 659, -154, 667, 733, 736, -285, -106, 748, 778, + /* 80 */ 59, 24, 781, 72, 322, 82, 782, 70, -252, -312, + /* 90 */ -312, -312, -117, -239, -114, -20, 141, 181, 196, 289, + /* 100 */ 328, 435, 455, 505, 575, 668, 705, 716, 750, 754, + /* 110 */ 761, 764, 766, 299, -110, 124, 138, -220, 148, -243, + /* 120 */ 218, 310, 364, 150, 354, 349, 336, 456, 319, 205, + /* 130 */ 474, 498, 476, 560, -280, -270, 477, 513, 519, 538, + /* 140 */ 596, 526, 382, 655, 570, 628, 734, 707, 670, 745, + /* 150 */ 745, 810, 822, 797, 777, 755, 755, 755, 757, 738, + /* 160 */ 742, 769, 758, 745, 858, 830, 890, 845, 902, 860, + /* 170 */ 909, 912, 877, 883, 884, 926, 927, 928, 943, 947, + /* 180 */ 894, 946, 921, 953, 913, 910, 959, 916, 961, 930, + /* 190 */ 964, 966, 969, 972, 979, 955, 957, 960, 968, 973, + /* 200 */ 974, 975, 977, 980, 981, 982, 991, 985, 948, 937, + /* 210 */ 1002, 952, 983, 1005, 1009, 1017, 978, 1018, 984, 989, + /* 220 */ 996, 999, 1000, 987, 1007, 1003, 1016, 1006, 1022, 1030, + /* 230 */ 1046, 1021, 988, 1019, 962, 1012, 1020, 1026, 986, 1013, + /* 240 */ 1028, 1031, 745, 990, 993, 997, 995, 1011, 1001, 1014, + /* 250 */ 755, 1047, 1023, 1025, 1027, 1032, 1034, 1037, 1038, 1042, + /* 260 */ 1010, 1064, 1059, 1097, 1096, 1095, 1117, 1131, 1075, 1081, + /* 270 */ 1119, 1121, 1122, 1126, 1147, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 10 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 20 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 30 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 40 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 50 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 60 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 70 */ 1453, 1453, 1526, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 80 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1524, 1679, 1453, - /* 90 */ 1856, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 100 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 110 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1526, 1453, 1524, - /* 120 */ 1868, 1868, 1868, 1453, 1453, 1453, 1723, 1723, 1453, 1453, - /* 130 */ 1453, 1453, 1622, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 140 */ 1453, 1715, 1453, 1453, 1937, 1453, 1453, 1721, 1891, 1453, - /* 150 */ 1453, 1453, 1453, 1575, 1883, 1860, 1874, 1861, 1858, 1922, - /* 160 */ 1922, 1922, 1877, 1453, 1591, 1887, 1453, 1453, 1453, 1707, - /* 170 */ 1453, 1453, 1684, 1681, 1681, 1453, 1453, 1453, 1453, 1453, - /* 180 */ 1526, 1453, 1526, 1453, 1453, 1526, 1453, 1526, 1453, 1526, - /* 190 */ 1526, 1453, 1526, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 200 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1524, - /* 210 */ 1717, 1453, 1524, 1453, 1453, 1453, 1524, 1896, 1453, 1453, - /* 220 */ 1453, 1453, 1896, 1453, 1453, 1453, 1453, 1524, 1453, 1524, - /* 230 */ 1453, 1453, 1453, 1898, 1896, 1453, 1453, 1898, 1896, 1453, - /* 240 */ 1453, 1453, 1910, 1906, 1898, 1914, 1912, 1889, 1887, 1874, - /* 250 */ 1453, 1453, 1928, 1924, 1940, 1928, 1924, 1928, 1924, 1453, - /* 260 */ 1591, 1453, 1453, 1453, 1524, 1485, 1453, 1709, 1723, 1625, - /* 270 */ 1625, 1625, 1527, 1458, 1453, 1453, 1453, 1453, 1453, 1453, - /* 280 */ 1453, 1453, 1453, 1453, 1453, 1453, 1794, 1909, 1908, 1832, - /* 290 */ 1831, 1830, 1828, 1793, 1453, 1587, 1792, 1791, 1453, 1453, - /* 300 */ 1453, 1453, 1453, 1453, 1453, 1453, 1785, 1786, 1784, 1783, - /* 310 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 320 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1857, 1453, - /* 330 */ 1925, 1929, 1453, 1453, 1453, 1453, 1453, 1768, 1453, 1453, - /* 340 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 350 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 360 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 370 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 380 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 390 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 400 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 410 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 420 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 430 */ 1453, 1490, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 440 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 450 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 460 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 470 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1556, 1555, - /* 480 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 490 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 500 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 510 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1727, 1453, 1453, - /* 520 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1890, 1453, 1453, - /* 530 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 540 */ 1453, 1453, 1453, 1768, 1453, 1907, 1453, 1867, 1863, 1453, - /* 550 */ 1453, 1859, 1767, 1453, 1453, 1923, 1453, 1453, 1453, 1453, - /* 560 */ 1453, 1453, 1453, 1453, 1453, 1852, 1453, 1453, 1825, 1810, - /* 570 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 580 */ 1779, 1453, 1453, 1453, 1453, 1453, 1619, 1453, 1453, 1453, - /* 590 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1604, - /* 600 */ 1602, 1601, 1600, 1453, 1597, 1453, 1453, 1453, 1453, 1628, - /* 610 */ 1627, 1453, 1453, 1453, 1453, 1453, 1453, 1547, 1453, 1453, - /* 620 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1538, 1453, 1537, - /* 630 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 640 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 650 */ 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, - /* 660 */ 1453, 1453, 1453, + /* 0 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 10 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 20 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 30 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 40 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 50 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 60 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 70 */ 1457, 1457, 1531, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 80 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1529, 1684, 1457, + /* 90 */ 1861, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 100 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 110 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1531, 1457, 1529, + /* 120 */ 1873, 1873, 1873, 1457, 1457, 1457, 1728, 1728, 1457, 1457, + /* 130 */ 1457, 1457, 1627, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 140 */ 1457, 1720, 1457, 1457, 1942, 1457, 1457, 1726, 1896, 1457, + /* 150 */ 1457, 1457, 1457, 1580, 1888, 1865, 1879, 1866, 1863, 1927, + /* 160 */ 1927, 1927, 1882, 1457, 1596, 1892, 1457, 1457, 1457, 1712, + /* 170 */ 1457, 1457, 1689, 1686, 1686, 1457, 1457, 1457, 1457, 1457, + /* 180 */ 1457, 1531, 1457, 1531, 1457, 1457, 1531, 1457, 1531, 1457, + /* 190 */ 1531, 1531, 1457, 1531, 1457, 1457, 1457, 1457, 1457, 1457, + /* 200 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 210 */ 1529, 1722, 1457, 1529, 1457, 1457, 1457, 1529, 1901, 1457, + /* 220 */ 1457, 1457, 1457, 1901, 1457, 1457, 1457, 1457, 1529, 1457, + /* 230 */ 1529, 1457, 1457, 1457, 1903, 1901, 1457, 1457, 1903, 1901, + /* 240 */ 1457, 1457, 1457, 1915, 1911, 1903, 1919, 1917, 1894, 1892, + /* 250 */ 1879, 1457, 1457, 1933, 1929, 1945, 1933, 1929, 1933, 1929, + /* 260 */ 1457, 1596, 1457, 1457, 1457, 1529, 1489, 1457, 1714, 1728, + /* 270 */ 1630, 1630, 1630, 1532, 1462, 1457, 1457, 1457, 1457, 1457, + /* 280 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1799, 1914, 1913, + /* 290 */ 1837, 1836, 1835, 1833, 1798, 1457, 1592, 1797, 1796, 1457, + /* 300 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1790, 1791, 1789, + /* 310 */ 1788, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 320 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1862, + /* 330 */ 1457, 1930, 1934, 1457, 1457, 1457, 1457, 1457, 1773, 1457, + /* 340 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 350 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 360 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 370 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 380 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 390 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 400 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 410 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 420 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 430 */ 1457, 1457, 1457, 1457, 1494, 1457, 1457, 1457, 1457, 1457, + /* 440 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 450 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 460 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 470 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 480 */ 1457, 1561, 1560, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 490 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 500 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 510 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 520 */ 1732, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 530 */ 1895, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 540 */ 1457, 1457, 1457, 1457, 1457, 1457, 1773, 1457, 1912, 1457, + /* 550 */ 1872, 1868, 1457, 1457, 1864, 1772, 1457, 1457, 1928, 1457, + /* 560 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1857, 1457, + /* 570 */ 1457, 1830, 1815, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 580 */ 1457, 1457, 1457, 1784, 1457, 1457, 1457, 1457, 1457, 1624, + /* 590 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 600 */ 1457, 1457, 1609, 1607, 1606, 1605, 1457, 1602, 1457, 1457, + /* 610 */ 1457, 1457, 1633, 1632, 1457, 1457, 1457, 1457, 1457, 1457, + /* 620 */ 1552, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 630 */ 1543, 1457, 1542, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 640 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 650 */ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, + /* 660 */ 1457, 1457, 1457, 1457, 1457, 1457, }; /********** End of lemon-generated parsing tables *****************************/ @@ -960,6 +976,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* DATABASE => nothing */ 0, /* USE => nothing */ 0, /* FLUSH => nothing */ + 0, /* TRIM => nothing */ 0, /* IF => nothing */ 0, /* NOT => nothing */ 0, /* EXISTS => nothing */ @@ -1150,11 +1167,11 @@ static const YYCODETYPE yyFallback[] = { 0, /* ASC => nothing */ 0, /* NULLS => nothing */ 0, /* ID => nothing */ - 248, /* NK_BITNOT => ID */ - 248, /* VALUES => ID */ - 248, /* IMPORT => ID */ - 248, /* NK_SEMI => ID */ - 248, /* FILE => ID */ + 249, /* NK_BITNOT => ID */ + 249, /* VALUES => ID */ + 249, /* IMPORT => ID */ + 249, /* NK_SEMI => ID */ + 249, /* FILE => ID */ }; #endif /* YYFALLBACK */ @@ -1301,324 +1318,325 @@ static const char *const yyTokenName[] = { /* 56 */ "DATABASE", /* 57 */ "USE", /* 58 */ "FLUSH", - /* 59 */ "IF", - /* 60 */ "NOT", - /* 61 */ "EXISTS", - /* 62 */ "BUFFER", - /* 63 */ "CACHELAST", - /* 64 */ "CACHELASTSIZE", - /* 65 */ "COMP", - /* 66 */ "DURATION", - /* 67 */ "NK_VARIABLE", - /* 68 */ "FSYNC", - /* 69 */ "MAXROWS", - /* 70 */ "MINROWS", - /* 71 */ "KEEP", - /* 72 */ "PAGES", - /* 73 */ "PAGESIZE", - /* 74 */ "PRECISION", - /* 75 */ "REPLICA", - /* 76 */ "STRICT", - /* 77 */ "WAL", - /* 78 */ "VGROUPS", - /* 79 */ "SINGLE_STABLE", - /* 80 */ "RETENTIONS", - /* 81 */ "SCHEMALESS", - /* 82 */ "NK_COLON", - /* 83 */ "TABLE", - /* 84 */ "NK_LP", - /* 85 */ "NK_RP", - /* 86 */ "STABLE", - /* 87 */ "ADD", - /* 88 */ "COLUMN", - /* 89 */ "MODIFY", - /* 90 */ "RENAME", - /* 91 */ "TAG", - /* 92 */ "SET", - /* 93 */ "NK_EQ", - /* 94 */ "USING", - /* 95 */ "TAGS", - /* 96 */ "COMMENT", - /* 97 */ "BOOL", - /* 98 */ "TINYINT", - /* 99 */ "SMALLINT", - /* 100 */ "INT", - /* 101 */ "INTEGER", - /* 102 */ "BIGINT", - /* 103 */ "FLOAT", - /* 104 */ "DOUBLE", - /* 105 */ "BINARY", - /* 106 */ "TIMESTAMP", - /* 107 */ "NCHAR", - /* 108 */ "UNSIGNED", - /* 109 */ "JSON", - /* 110 */ "VARCHAR", - /* 111 */ "MEDIUMBLOB", - /* 112 */ "BLOB", - /* 113 */ "VARBINARY", - /* 114 */ "DECIMAL", - /* 115 */ "MAX_DELAY", - /* 116 */ "WATERMARK", - /* 117 */ "ROLLUP", - /* 118 */ "TTL", - /* 119 */ "SMA", - /* 120 */ "FIRST", - /* 121 */ "LAST", - /* 122 */ "SHOW", - /* 123 */ "DATABASES", - /* 124 */ "TABLES", - /* 125 */ "STABLES", - /* 126 */ "MNODES", - /* 127 */ "MODULES", - /* 128 */ "QNODES", - /* 129 */ "FUNCTIONS", - /* 130 */ "INDEXES", - /* 131 */ "ACCOUNTS", - /* 132 */ "APPS", - /* 133 */ "CONNECTIONS", - /* 134 */ "LICENCE", - /* 135 */ "GRANTS", - /* 136 */ "QUERIES", - /* 137 */ "SCORES", - /* 138 */ "TOPICS", - /* 139 */ "VARIABLES", - /* 140 */ "BNODES", - /* 141 */ "SNODES", - /* 142 */ "CLUSTER", - /* 143 */ "TRANSACTIONS", - /* 144 */ "DISTRIBUTED", - /* 145 */ "CONSUMERS", - /* 146 */ "SUBSCRIPTIONS", - /* 147 */ "LIKE", - /* 148 */ "INDEX", - /* 149 */ "FUNCTION", - /* 150 */ "INTERVAL", - /* 151 */ "TOPIC", - /* 152 */ "AS", - /* 153 */ "WITH", - /* 154 */ "META", - /* 155 */ "CONSUMER", - /* 156 */ "GROUP", - /* 157 */ "DESC", - /* 158 */ "DESCRIBE", - /* 159 */ "RESET", - /* 160 */ "QUERY", - /* 161 */ "CACHE", - /* 162 */ "EXPLAIN", - /* 163 */ "ANALYZE", - /* 164 */ "VERBOSE", - /* 165 */ "NK_BOOL", - /* 166 */ "RATIO", - /* 167 */ "NK_FLOAT", - /* 168 */ "COMPACT", - /* 169 */ "VNODES", - /* 170 */ "IN", - /* 171 */ "OUTPUTTYPE", - /* 172 */ "AGGREGATE", - /* 173 */ "BUFSIZE", - /* 174 */ "STREAM", - /* 175 */ "INTO", - /* 176 */ "TRIGGER", - /* 177 */ "AT_ONCE", - /* 178 */ "WINDOW_CLOSE", - /* 179 */ "IGNORE", - /* 180 */ "EXPIRED", - /* 181 */ "KILL", - /* 182 */ "CONNECTION", - /* 183 */ "TRANSACTION", - /* 184 */ "BALANCE", - /* 185 */ "VGROUP", - /* 186 */ "MERGE", - /* 187 */ "REDISTRIBUTE", - /* 188 */ "SPLIT", - /* 189 */ "SYNCDB", - /* 190 */ "DELETE", - /* 191 */ "INSERT", - /* 192 */ "NULL", - /* 193 */ "NK_QUESTION", - /* 194 */ "NK_ARROW", - /* 195 */ "ROWTS", - /* 196 */ "TBNAME", - /* 197 */ "QSTARTTS", - /* 198 */ "QENDTS", - /* 199 */ "WSTARTTS", - /* 200 */ "WENDTS", - /* 201 */ "WDURATION", - /* 202 */ "CAST", - /* 203 */ "NOW", - /* 204 */ "TODAY", - /* 205 */ "TIMEZONE", - /* 206 */ "CLIENT_VERSION", - /* 207 */ "SERVER_VERSION", - /* 208 */ "SERVER_STATUS", - /* 209 */ "CURRENT_USER", - /* 210 */ "COUNT", - /* 211 */ "LAST_ROW", - /* 212 */ "BETWEEN", - /* 213 */ "IS", - /* 214 */ "NK_LT", - /* 215 */ "NK_GT", - /* 216 */ "NK_LE", - /* 217 */ "NK_GE", - /* 218 */ "NK_NE", - /* 219 */ "MATCH", - /* 220 */ "NMATCH", - /* 221 */ "CONTAINS", - /* 222 */ "JOIN", - /* 223 */ "INNER", - /* 224 */ "SELECT", - /* 225 */ "DISTINCT", - /* 226 */ "WHERE", - /* 227 */ "PARTITION", - /* 228 */ "BY", - /* 229 */ "SESSION", - /* 230 */ "STATE_WINDOW", - /* 231 */ "SLIDING", - /* 232 */ "FILL", - /* 233 */ "VALUE", - /* 234 */ "NONE", - /* 235 */ "PREV", - /* 236 */ "LINEAR", - /* 237 */ "NEXT", - /* 238 */ "HAVING", - /* 239 */ "RANGE", - /* 240 */ "EVERY", - /* 241 */ "ORDER", - /* 242 */ "SLIMIT", - /* 243 */ "SOFFSET", - /* 244 */ "LIMIT", - /* 245 */ "OFFSET", - /* 246 */ "ASC", - /* 247 */ "NULLS", - /* 248 */ "ID", - /* 249 */ "NK_BITNOT", - /* 250 */ "VALUES", - /* 251 */ "IMPORT", - /* 252 */ "NK_SEMI", - /* 253 */ "FILE", - /* 254 */ "cmd", - /* 255 */ "account_options", - /* 256 */ "alter_account_options", - /* 257 */ "literal", - /* 258 */ "alter_account_option", - /* 259 */ "user_name", - /* 260 */ "sysinfo_opt", - /* 261 */ "privileges", - /* 262 */ "priv_level", - /* 263 */ "priv_type_list", - /* 264 */ "priv_type", - /* 265 */ "db_name", - /* 266 */ "dnode_endpoint", - /* 267 */ "not_exists_opt", - /* 268 */ "db_options", - /* 269 */ "exists_opt", - /* 270 */ "alter_db_options", - /* 271 */ "integer_list", - /* 272 */ "variable_list", - /* 273 */ "retention_list", - /* 274 */ "alter_db_option", - /* 275 */ "retention", - /* 276 */ "full_table_name", - /* 277 */ "column_def_list", - /* 278 */ "tags_def_opt", - /* 279 */ "table_options", - /* 280 */ "multi_create_clause", - /* 281 */ "tags_def", - /* 282 */ "multi_drop_clause", - /* 283 */ "alter_table_clause", - /* 284 */ "alter_table_options", - /* 285 */ "column_name", - /* 286 */ "type_name", - /* 287 */ "signed_literal", - /* 288 */ "create_subtable_clause", - /* 289 */ "specific_cols_opt", - /* 290 */ "expression_list", - /* 291 */ "drop_table_clause", - /* 292 */ "col_name_list", - /* 293 */ "table_name", - /* 294 */ "column_def", - /* 295 */ "duration_list", - /* 296 */ "rollup_func_list", - /* 297 */ "alter_table_option", - /* 298 */ "duration_literal", - /* 299 */ "rollup_func_name", - /* 300 */ "function_name", - /* 301 */ "col_name", - /* 302 */ "db_name_cond_opt", - /* 303 */ "like_pattern_opt", - /* 304 */ "table_name_cond", - /* 305 */ "from_db_opt", - /* 306 */ "index_name", - /* 307 */ "index_options", - /* 308 */ "func_list", - /* 309 */ "sliding_opt", - /* 310 */ "sma_stream_opt", - /* 311 */ "func", - /* 312 */ "stream_options", - /* 313 */ "topic_name", - /* 314 */ "query_expression", - /* 315 */ "cgroup_name", - /* 316 */ "analyze_opt", - /* 317 */ "explain_options", - /* 318 */ "agg_func_opt", - /* 319 */ "bufsize_opt", - /* 320 */ "stream_name", - /* 321 */ "into_opt", - /* 322 */ "dnode_list", - /* 323 */ "where_clause_opt", - /* 324 */ "signed", - /* 325 */ "literal_func", - /* 326 */ "literal_list", - /* 327 */ "table_alias", - /* 328 */ "column_alias", - /* 329 */ "expression", - /* 330 */ "pseudo_column", - /* 331 */ "column_reference", - /* 332 */ "function_expression", - /* 333 */ "subquery", - /* 334 */ "star_func", - /* 335 */ "star_func_para_list", - /* 336 */ "noarg_func", - /* 337 */ "other_para_list", - /* 338 */ "star_func_para", - /* 339 */ "predicate", - /* 340 */ "compare_op", - /* 341 */ "in_op", - /* 342 */ "in_predicate_value", - /* 343 */ "boolean_value_expression", - /* 344 */ "boolean_primary", - /* 345 */ "common_expression", - /* 346 */ "from_clause_opt", - /* 347 */ "table_reference_list", - /* 348 */ "table_reference", - /* 349 */ "table_primary", - /* 350 */ "joined_table", - /* 351 */ "alias_opt", - /* 352 */ "parenthesized_joined_table", - /* 353 */ "join_type", - /* 354 */ "search_condition", - /* 355 */ "query_specification", - /* 356 */ "set_quantifier_opt", - /* 357 */ "select_list", - /* 358 */ "partition_by_clause_opt", - /* 359 */ "range_opt", - /* 360 */ "every_opt", - /* 361 */ "fill_opt", - /* 362 */ "twindow_clause_opt", - /* 363 */ "group_by_clause_opt", - /* 364 */ "having_clause_opt", - /* 365 */ "select_item", - /* 366 */ "fill_mode", - /* 367 */ "group_by_list", - /* 368 */ "query_expression_body", - /* 369 */ "order_by_clause_opt", - /* 370 */ "slimit_clause_opt", - /* 371 */ "limit_clause_opt", - /* 372 */ "query_primary", - /* 373 */ "sort_specification_list", - /* 374 */ "sort_specification", - /* 375 */ "ordering_specification_opt", - /* 376 */ "null_ordering_opt", + /* 59 */ "TRIM", + /* 60 */ "IF", + /* 61 */ "NOT", + /* 62 */ "EXISTS", + /* 63 */ "BUFFER", + /* 64 */ "CACHELAST", + /* 65 */ "CACHELASTSIZE", + /* 66 */ "COMP", + /* 67 */ "DURATION", + /* 68 */ "NK_VARIABLE", + /* 69 */ "FSYNC", + /* 70 */ "MAXROWS", + /* 71 */ "MINROWS", + /* 72 */ "KEEP", + /* 73 */ "PAGES", + /* 74 */ "PAGESIZE", + /* 75 */ "PRECISION", + /* 76 */ "REPLICA", + /* 77 */ "STRICT", + /* 78 */ "WAL", + /* 79 */ "VGROUPS", + /* 80 */ "SINGLE_STABLE", + /* 81 */ "RETENTIONS", + /* 82 */ "SCHEMALESS", + /* 83 */ "NK_COLON", + /* 84 */ "TABLE", + /* 85 */ "NK_LP", + /* 86 */ "NK_RP", + /* 87 */ "STABLE", + /* 88 */ "ADD", + /* 89 */ "COLUMN", + /* 90 */ "MODIFY", + /* 91 */ "RENAME", + /* 92 */ "TAG", + /* 93 */ "SET", + /* 94 */ "NK_EQ", + /* 95 */ "USING", + /* 96 */ "TAGS", + /* 97 */ "COMMENT", + /* 98 */ "BOOL", + /* 99 */ "TINYINT", + /* 100 */ "SMALLINT", + /* 101 */ "INT", + /* 102 */ "INTEGER", + /* 103 */ "BIGINT", + /* 104 */ "FLOAT", + /* 105 */ "DOUBLE", + /* 106 */ "BINARY", + /* 107 */ "TIMESTAMP", + /* 108 */ "NCHAR", + /* 109 */ "UNSIGNED", + /* 110 */ "JSON", + /* 111 */ "VARCHAR", + /* 112 */ "MEDIUMBLOB", + /* 113 */ "BLOB", + /* 114 */ "VARBINARY", + /* 115 */ "DECIMAL", + /* 116 */ "MAX_DELAY", + /* 117 */ "WATERMARK", + /* 118 */ "ROLLUP", + /* 119 */ "TTL", + /* 120 */ "SMA", + /* 121 */ "FIRST", + /* 122 */ "LAST", + /* 123 */ "SHOW", + /* 124 */ "DATABASES", + /* 125 */ "TABLES", + /* 126 */ "STABLES", + /* 127 */ "MNODES", + /* 128 */ "MODULES", + /* 129 */ "QNODES", + /* 130 */ "FUNCTIONS", + /* 131 */ "INDEXES", + /* 132 */ "ACCOUNTS", + /* 133 */ "APPS", + /* 134 */ "CONNECTIONS", + /* 135 */ "LICENCE", + /* 136 */ "GRANTS", + /* 137 */ "QUERIES", + /* 138 */ "SCORES", + /* 139 */ "TOPICS", + /* 140 */ "VARIABLES", + /* 141 */ "BNODES", + /* 142 */ "SNODES", + /* 143 */ "CLUSTER", + /* 144 */ "TRANSACTIONS", + /* 145 */ "DISTRIBUTED", + /* 146 */ "CONSUMERS", + /* 147 */ "SUBSCRIPTIONS", + /* 148 */ "LIKE", + /* 149 */ "INDEX", + /* 150 */ "FUNCTION", + /* 151 */ "INTERVAL", + /* 152 */ "TOPIC", + /* 153 */ "AS", + /* 154 */ "WITH", + /* 155 */ "META", + /* 156 */ "CONSUMER", + /* 157 */ "GROUP", + /* 158 */ "DESC", + /* 159 */ "DESCRIBE", + /* 160 */ "RESET", + /* 161 */ "QUERY", + /* 162 */ "CACHE", + /* 163 */ "EXPLAIN", + /* 164 */ "ANALYZE", + /* 165 */ "VERBOSE", + /* 166 */ "NK_BOOL", + /* 167 */ "RATIO", + /* 168 */ "NK_FLOAT", + /* 169 */ "COMPACT", + /* 170 */ "VNODES", + /* 171 */ "IN", + /* 172 */ "OUTPUTTYPE", + /* 173 */ "AGGREGATE", + /* 174 */ "BUFSIZE", + /* 175 */ "STREAM", + /* 176 */ "INTO", + /* 177 */ "TRIGGER", + /* 178 */ "AT_ONCE", + /* 179 */ "WINDOW_CLOSE", + /* 180 */ "IGNORE", + /* 181 */ "EXPIRED", + /* 182 */ "KILL", + /* 183 */ "CONNECTION", + /* 184 */ "TRANSACTION", + /* 185 */ "BALANCE", + /* 186 */ "VGROUP", + /* 187 */ "MERGE", + /* 188 */ "REDISTRIBUTE", + /* 189 */ "SPLIT", + /* 190 */ "SYNCDB", + /* 191 */ "DELETE", + /* 192 */ "INSERT", + /* 193 */ "NULL", + /* 194 */ "NK_QUESTION", + /* 195 */ "NK_ARROW", + /* 196 */ "ROWTS", + /* 197 */ "TBNAME", + /* 198 */ "QSTARTTS", + /* 199 */ "QENDTS", + /* 200 */ "WSTARTTS", + /* 201 */ "WENDTS", + /* 202 */ "WDURATION", + /* 203 */ "CAST", + /* 204 */ "NOW", + /* 205 */ "TODAY", + /* 206 */ "TIMEZONE", + /* 207 */ "CLIENT_VERSION", + /* 208 */ "SERVER_VERSION", + /* 209 */ "SERVER_STATUS", + /* 210 */ "CURRENT_USER", + /* 211 */ "COUNT", + /* 212 */ "LAST_ROW", + /* 213 */ "BETWEEN", + /* 214 */ "IS", + /* 215 */ "NK_LT", + /* 216 */ "NK_GT", + /* 217 */ "NK_LE", + /* 218 */ "NK_GE", + /* 219 */ "NK_NE", + /* 220 */ "MATCH", + /* 221 */ "NMATCH", + /* 222 */ "CONTAINS", + /* 223 */ "JOIN", + /* 224 */ "INNER", + /* 225 */ "SELECT", + /* 226 */ "DISTINCT", + /* 227 */ "WHERE", + /* 228 */ "PARTITION", + /* 229 */ "BY", + /* 230 */ "SESSION", + /* 231 */ "STATE_WINDOW", + /* 232 */ "SLIDING", + /* 233 */ "FILL", + /* 234 */ "VALUE", + /* 235 */ "NONE", + /* 236 */ "PREV", + /* 237 */ "LINEAR", + /* 238 */ "NEXT", + /* 239 */ "HAVING", + /* 240 */ "RANGE", + /* 241 */ "EVERY", + /* 242 */ "ORDER", + /* 243 */ "SLIMIT", + /* 244 */ "SOFFSET", + /* 245 */ "LIMIT", + /* 246 */ "OFFSET", + /* 247 */ "ASC", + /* 248 */ "NULLS", + /* 249 */ "ID", + /* 250 */ "NK_BITNOT", + /* 251 */ "VALUES", + /* 252 */ "IMPORT", + /* 253 */ "NK_SEMI", + /* 254 */ "FILE", + /* 255 */ "cmd", + /* 256 */ "account_options", + /* 257 */ "alter_account_options", + /* 258 */ "literal", + /* 259 */ "alter_account_option", + /* 260 */ "user_name", + /* 261 */ "sysinfo_opt", + /* 262 */ "privileges", + /* 263 */ "priv_level", + /* 264 */ "priv_type_list", + /* 265 */ "priv_type", + /* 266 */ "db_name", + /* 267 */ "dnode_endpoint", + /* 268 */ "not_exists_opt", + /* 269 */ "db_options", + /* 270 */ "exists_opt", + /* 271 */ "alter_db_options", + /* 272 */ "integer_list", + /* 273 */ "variable_list", + /* 274 */ "retention_list", + /* 275 */ "alter_db_option", + /* 276 */ "retention", + /* 277 */ "full_table_name", + /* 278 */ "column_def_list", + /* 279 */ "tags_def_opt", + /* 280 */ "table_options", + /* 281 */ "multi_create_clause", + /* 282 */ "tags_def", + /* 283 */ "multi_drop_clause", + /* 284 */ "alter_table_clause", + /* 285 */ "alter_table_options", + /* 286 */ "column_name", + /* 287 */ "type_name", + /* 288 */ "signed_literal", + /* 289 */ "create_subtable_clause", + /* 290 */ "specific_cols_opt", + /* 291 */ "expression_list", + /* 292 */ "drop_table_clause", + /* 293 */ "col_name_list", + /* 294 */ "table_name", + /* 295 */ "column_def", + /* 296 */ "duration_list", + /* 297 */ "rollup_func_list", + /* 298 */ "alter_table_option", + /* 299 */ "duration_literal", + /* 300 */ "rollup_func_name", + /* 301 */ "function_name", + /* 302 */ "col_name", + /* 303 */ "db_name_cond_opt", + /* 304 */ "like_pattern_opt", + /* 305 */ "table_name_cond", + /* 306 */ "from_db_opt", + /* 307 */ "index_name", + /* 308 */ "index_options", + /* 309 */ "func_list", + /* 310 */ "sliding_opt", + /* 311 */ "sma_stream_opt", + /* 312 */ "func", + /* 313 */ "stream_options", + /* 314 */ "topic_name", + /* 315 */ "query_expression", + /* 316 */ "cgroup_name", + /* 317 */ "analyze_opt", + /* 318 */ "explain_options", + /* 319 */ "agg_func_opt", + /* 320 */ "bufsize_opt", + /* 321 */ "stream_name", + /* 322 */ "into_opt", + /* 323 */ "dnode_list", + /* 324 */ "where_clause_opt", + /* 325 */ "signed", + /* 326 */ "literal_func", + /* 327 */ "literal_list", + /* 328 */ "table_alias", + /* 329 */ "column_alias", + /* 330 */ "expression", + /* 331 */ "pseudo_column", + /* 332 */ "column_reference", + /* 333 */ "function_expression", + /* 334 */ "subquery", + /* 335 */ "star_func", + /* 336 */ "star_func_para_list", + /* 337 */ "noarg_func", + /* 338 */ "other_para_list", + /* 339 */ "star_func_para", + /* 340 */ "predicate", + /* 341 */ "compare_op", + /* 342 */ "in_op", + /* 343 */ "in_predicate_value", + /* 344 */ "boolean_value_expression", + /* 345 */ "boolean_primary", + /* 346 */ "common_expression", + /* 347 */ "from_clause_opt", + /* 348 */ "table_reference_list", + /* 349 */ "table_reference", + /* 350 */ "table_primary", + /* 351 */ "joined_table", + /* 352 */ "alias_opt", + /* 353 */ "parenthesized_joined_table", + /* 354 */ "join_type", + /* 355 */ "search_condition", + /* 356 */ "query_specification", + /* 357 */ "set_quantifier_opt", + /* 358 */ "select_list", + /* 359 */ "partition_by_clause_opt", + /* 360 */ "range_opt", + /* 361 */ "every_opt", + /* 362 */ "fill_opt", + /* 363 */ "twindow_clause_opt", + /* 364 */ "group_by_clause_opt", + /* 365 */ "having_clause_opt", + /* 366 */ "select_item", + /* 367 */ "fill_mode", + /* 368 */ "group_by_list", + /* 369 */ "query_expression_body", + /* 370 */ "order_by_clause_opt", + /* 371 */ "slimit_clause_opt", + /* 372 */ "limit_clause_opt", + /* 373 */ "query_primary", + /* 374 */ "sort_specification_list", + /* 375 */ "sort_specification", + /* 376 */ "ordering_specification_opt", + /* 377 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -1693,426 +1711,427 @@ static const char *const yyRuleName[] = { /* 64 */ "cmd ::= USE db_name", /* 65 */ "cmd ::= ALTER DATABASE db_name alter_db_options", /* 66 */ "cmd ::= FLUSH DATABASE db_name", - /* 67 */ "not_exists_opt ::= IF NOT EXISTS", - /* 68 */ "not_exists_opt ::=", - /* 69 */ "exists_opt ::= IF EXISTS", - /* 70 */ "exists_opt ::=", - /* 71 */ "db_options ::=", - /* 72 */ "db_options ::= db_options BUFFER NK_INTEGER", - /* 73 */ "db_options ::= db_options CACHELAST NK_INTEGER", - /* 74 */ "db_options ::= db_options CACHELASTSIZE NK_INTEGER", - /* 75 */ "db_options ::= db_options COMP NK_INTEGER", - /* 76 */ "db_options ::= db_options DURATION NK_INTEGER", - /* 77 */ "db_options ::= db_options DURATION NK_VARIABLE", - /* 78 */ "db_options ::= db_options FSYNC NK_INTEGER", - /* 79 */ "db_options ::= db_options MAXROWS NK_INTEGER", - /* 80 */ "db_options ::= db_options MINROWS NK_INTEGER", - /* 81 */ "db_options ::= db_options KEEP integer_list", - /* 82 */ "db_options ::= db_options KEEP variable_list", - /* 83 */ "db_options ::= db_options PAGES NK_INTEGER", - /* 84 */ "db_options ::= db_options PAGESIZE NK_INTEGER", - /* 85 */ "db_options ::= db_options PRECISION NK_STRING", - /* 86 */ "db_options ::= db_options REPLICA NK_INTEGER", - /* 87 */ "db_options ::= db_options STRICT NK_INTEGER", - /* 88 */ "db_options ::= db_options WAL NK_INTEGER", - /* 89 */ "db_options ::= db_options VGROUPS NK_INTEGER", - /* 90 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", - /* 91 */ "db_options ::= db_options RETENTIONS retention_list", - /* 92 */ "db_options ::= db_options SCHEMALESS NK_INTEGER", - /* 93 */ "alter_db_options ::= alter_db_option", - /* 94 */ "alter_db_options ::= alter_db_options alter_db_option", - /* 95 */ "alter_db_option ::= BUFFER NK_INTEGER", - /* 96 */ "alter_db_option ::= CACHELAST NK_INTEGER", - /* 97 */ "alter_db_option ::= CACHELASTSIZE NK_INTEGER", - /* 98 */ "alter_db_option ::= FSYNC NK_INTEGER", - /* 99 */ "alter_db_option ::= KEEP integer_list", - /* 100 */ "alter_db_option ::= KEEP variable_list", - /* 101 */ "alter_db_option ::= PAGES NK_INTEGER", - /* 102 */ "alter_db_option ::= REPLICA NK_INTEGER", - /* 103 */ "alter_db_option ::= STRICT NK_INTEGER", - /* 104 */ "alter_db_option ::= WAL NK_INTEGER", - /* 105 */ "integer_list ::= NK_INTEGER", - /* 106 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", - /* 107 */ "variable_list ::= NK_VARIABLE", - /* 108 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", - /* 109 */ "retention_list ::= retention", - /* 110 */ "retention_list ::= retention_list NK_COMMA retention", - /* 111 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", - /* 112 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", - /* 113 */ "cmd ::= CREATE TABLE multi_create_clause", - /* 114 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", - /* 115 */ "cmd ::= DROP TABLE multi_drop_clause", - /* 116 */ "cmd ::= DROP STABLE exists_opt full_table_name", - /* 117 */ "cmd ::= ALTER TABLE alter_table_clause", - /* 118 */ "cmd ::= ALTER STABLE alter_table_clause", - /* 119 */ "alter_table_clause ::= full_table_name alter_table_options", - /* 120 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", - /* 121 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", - /* 122 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", - /* 123 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", - /* 124 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", - /* 125 */ "alter_table_clause ::= full_table_name DROP TAG column_name", - /* 126 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", - /* 127 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", - /* 128 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", - /* 129 */ "multi_create_clause ::= create_subtable_clause", - /* 130 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", - /* 131 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options", - /* 132 */ "multi_drop_clause ::= drop_table_clause", - /* 133 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", - /* 134 */ "drop_table_clause ::= exists_opt full_table_name", - /* 135 */ "specific_cols_opt ::=", - /* 136 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", - /* 137 */ "full_table_name ::= table_name", - /* 138 */ "full_table_name ::= db_name NK_DOT table_name", - /* 139 */ "column_def_list ::= column_def", - /* 140 */ "column_def_list ::= column_def_list NK_COMMA column_def", - /* 141 */ "column_def ::= column_name type_name", - /* 142 */ "column_def ::= column_name type_name COMMENT NK_STRING", - /* 143 */ "type_name ::= BOOL", - /* 144 */ "type_name ::= TINYINT", - /* 145 */ "type_name ::= SMALLINT", - /* 146 */ "type_name ::= INT", - /* 147 */ "type_name ::= INTEGER", - /* 148 */ "type_name ::= BIGINT", - /* 149 */ "type_name ::= FLOAT", - /* 150 */ "type_name ::= DOUBLE", - /* 151 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", - /* 152 */ "type_name ::= TIMESTAMP", - /* 153 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", - /* 154 */ "type_name ::= TINYINT UNSIGNED", - /* 155 */ "type_name ::= SMALLINT UNSIGNED", - /* 156 */ "type_name ::= INT UNSIGNED", - /* 157 */ "type_name ::= BIGINT UNSIGNED", - /* 158 */ "type_name ::= JSON", - /* 159 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", - /* 160 */ "type_name ::= MEDIUMBLOB", - /* 161 */ "type_name ::= BLOB", - /* 162 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", - /* 163 */ "type_name ::= DECIMAL", - /* 164 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", - /* 165 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", - /* 166 */ "tags_def_opt ::=", - /* 167 */ "tags_def_opt ::= tags_def", - /* 168 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", - /* 169 */ "table_options ::=", - /* 170 */ "table_options ::= table_options COMMENT NK_STRING", - /* 171 */ "table_options ::= table_options MAX_DELAY duration_list", - /* 172 */ "table_options ::= table_options WATERMARK duration_list", - /* 173 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", - /* 174 */ "table_options ::= table_options TTL NK_INTEGER", - /* 175 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", - /* 176 */ "alter_table_options ::= alter_table_option", - /* 177 */ "alter_table_options ::= alter_table_options alter_table_option", - /* 178 */ "alter_table_option ::= COMMENT NK_STRING", - /* 179 */ "alter_table_option ::= TTL NK_INTEGER", - /* 180 */ "duration_list ::= duration_literal", - /* 181 */ "duration_list ::= duration_list NK_COMMA duration_literal", - /* 182 */ "rollup_func_list ::= rollup_func_name", - /* 183 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", - /* 184 */ "rollup_func_name ::= function_name", - /* 185 */ "rollup_func_name ::= FIRST", - /* 186 */ "rollup_func_name ::= LAST", - /* 187 */ "col_name_list ::= col_name", - /* 188 */ "col_name_list ::= col_name_list NK_COMMA col_name", - /* 189 */ "col_name ::= column_name", - /* 190 */ "cmd ::= SHOW DNODES", - /* 191 */ "cmd ::= SHOW USERS", - /* 192 */ "cmd ::= SHOW DATABASES", - /* 193 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", - /* 194 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", - /* 195 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", - /* 196 */ "cmd ::= SHOW MNODES", - /* 197 */ "cmd ::= SHOW MODULES", - /* 198 */ "cmd ::= SHOW QNODES", - /* 199 */ "cmd ::= SHOW FUNCTIONS", - /* 200 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", - /* 201 */ "cmd ::= SHOW STREAMS", - /* 202 */ "cmd ::= SHOW ACCOUNTS", - /* 203 */ "cmd ::= SHOW APPS", - /* 204 */ "cmd ::= SHOW CONNECTIONS", - /* 205 */ "cmd ::= SHOW LICENCE", - /* 206 */ "cmd ::= SHOW GRANTS", - /* 207 */ "cmd ::= SHOW CREATE DATABASE db_name", - /* 208 */ "cmd ::= SHOW CREATE TABLE full_table_name", - /* 209 */ "cmd ::= SHOW CREATE STABLE full_table_name", - /* 210 */ "cmd ::= SHOW QUERIES", - /* 211 */ "cmd ::= SHOW SCORES", - /* 212 */ "cmd ::= SHOW TOPICS", - /* 213 */ "cmd ::= SHOW VARIABLES", - /* 214 */ "cmd ::= SHOW LOCAL VARIABLES", - /* 215 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", - /* 216 */ "cmd ::= SHOW BNODES", - /* 217 */ "cmd ::= SHOW SNODES", - /* 218 */ "cmd ::= SHOW CLUSTER", - /* 219 */ "cmd ::= SHOW TRANSACTIONS", - /* 220 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", - /* 221 */ "cmd ::= SHOW CONSUMERS", - /* 222 */ "cmd ::= SHOW SUBSCRIPTIONS", - /* 223 */ "db_name_cond_opt ::=", - /* 224 */ "db_name_cond_opt ::= db_name NK_DOT", - /* 225 */ "like_pattern_opt ::=", - /* 226 */ "like_pattern_opt ::= LIKE NK_STRING", - /* 227 */ "table_name_cond ::= table_name", - /* 228 */ "from_db_opt ::=", - /* 229 */ "from_db_opt ::= FROM db_name", - /* 230 */ "cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options", - /* 231 */ "cmd ::= DROP INDEX exists_opt index_name", - /* 232 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", - /* 233 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", - /* 234 */ "func_list ::= func", - /* 235 */ "func_list ::= func_list NK_COMMA func", - /* 236 */ "func ::= function_name NK_LP expression_list NK_RP", - /* 237 */ "sma_stream_opt ::=", - /* 238 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", - /* 239 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", - /* 240 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", - /* 241 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", - /* 242 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", - /* 243 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", - /* 244 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", - /* 245 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 246 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", - /* 247 */ "cmd ::= DESC full_table_name", - /* 248 */ "cmd ::= DESCRIBE full_table_name", - /* 249 */ "cmd ::= RESET QUERY CACHE", - /* 250 */ "cmd ::= EXPLAIN analyze_opt explain_options query_expression", - /* 251 */ "analyze_opt ::=", - /* 252 */ "analyze_opt ::= ANALYZE", - /* 253 */ "explain_options ::=", - /* 254 */ "explain_options ::= explain_options VERBOSE NK_BOOL", - /* 255 */ "explain_options ::= explain_options RATIO NK_FLOAT", - /* 256 */ "cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP", - /* 257 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", - /* 258 */ "cmd ::= DROP FUNCTION exists_opt function_name", - /* 259 */ "agg_func_opt ::=", - /* 260 */ "agg_func_opt ::= AGGREGATE", - /* 261 */ "bufsize_opt ::=", - /* 262 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 263 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression", - /* 264 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 265 */ "into_opt ::=", - /* 266 */ "into_opt ::= INTO full_table_name", - /* 267 */ "stream_options ::=", - /* 268 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 269 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 270 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 271 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 272 */ "stream_options ::= stream_options IGNORE EXPIRED", - /* 273 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 274 */ "cmd ::= KILL QUERY NK_STRING", - /* 275 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 276 */ "cmd ::= BALANCE VGROUP", - /* 277 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 278 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 279 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 280 */ "dnode_list ::= DNODE NK_INTEGER", - /* 281 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 282 */ "cmd ::= SYNCDB db_name REPLICA", - /* 283 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 284 */ "cmd ::= query_expression", - /* 285 */ "cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression", - /* 286 */ "literal ::= NK_INTEGER", - /* 287 */ "literal ::= NK_FLOAT", - /* 288 */ "literal ::= NK_STRING", - /* 289 */ "literal ::= NK_BOOL", - /* 290 */ "literal ::= TIMESTAMP NK_STRING", - /* 291 */ "literal ::= duration_literal", - /* 292 */ "literal ::= NULL", - /* 293 */ "literal ::= NK_QUESTION", - /* 294 */ "duration_literal ::= NK_VARIABLE", - /* 295 */ "signed ::= NK_INTEGER", - /* 296 */ "signed ::= NK_PLUS NK_INTEGER", - /* 297 */ "signed ::= NK_MINUS NK_INTEGER", - /* 298 */ "signed ::= NK_FLOAT", - /* 299 */ "signed ::= NK_PLUS NK_FLOAT", - /* 300 */ "signed ::= NK_MINUS NK_FLOAT", - /* 301 */ "signed_literal ::= signed", - /* 302 */ "signed_literal ::= NK_STRING", - /* 303 */ "signed_literal ::= NK_BOOL", - /* 304 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 305 */ "signed_literal ::= duration_literal", - /* 306 */ "signed_literal ::= NULL", - /* 307 */ "signed_literal ::= literal_func", - /* 308 */ "literal_list ::= signed_literal", - /* 309 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 310 */ "db_name ::= NK_ID", - /* 311 */ "table_name ::= NK_ID", - /* 312 */ "column_name ::= NK_ID", - /* 313 */ "function_name ::= NK_ID", - /* 314 */ "table_alias ::= NK_ID", - /* 315 */ "column_alias ::= NK_ID", - /* 316 */ "user_name ::= NK_ID", - /* 317 */ "index_name ::= NK_ID", - /* 318 */ "topic_name ::= NK_ID", - /* 319 */ "stream_name ::= NK_ID", - /* 320 */ "cgroup_name ::= NK_ID", - /* 321 */ "expression ::= literal", - /* 322 */ "expression ::= pseudo_column", - /* 323 */ "expression ::= column_reference", - /* 324 */ "expression ::= function_expression", - /* 325 */ "expression ::= subquery", - /* 326 */ "expression ::= NK_LP expression NK_RP", - /* 327 */ "expression ::= NK_PLUS expression", - /* 328 */ "expression ::= NK_MINUS expression", - /* 329 */ "expression ::= expression NK_PLUS expression", - /* 330 */ "expression ::= expression NK_MINUS expression", - /* 331 */ "expression ::= expression NK_STAR expression", - /* 332 */ "expression ::= expression NK_SLASH expression", - /* 333 */ "expression ::= expression NK_REM expression", - /* 334 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 335 */ "expression ::= expression NK_BITAND expression", - /* 336 */ "expression ::= expression NK_BITOR expression", - /* 337 */ "expression_list ::= expression", - /* 338 */ "expression_list ::= expression_list NK_COMMA expression", - /* 339 */ "column_reference ::= column_name", - /* 340 */ "column_reference ::= table_name NK_DOT column_name", - /* 341 */ "pseudo_column ::= ROWTS", - /* 342 */ "pseudo_column ::= TBNAME", - /* 343 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 344 */ "pseudo_column ::= QSTARTTS", - /* 345 */ "pseudo_column ::= QENDTS", - /* 346 */ "pseudo_column ::= WSTARTTS", - /* 347 */ "pseudo_column ::= WENDTS", - /* 348 */ "pseudo_column ::= WDURATION", - /* 349 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 350 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 351 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", - /* 352 */ "function_expression ::= literal_func", - /* 353 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 354 */ "literal_func ::= NOW", - /* 355 */ "noarg_func ::= NOW", - /* 356 */ "noarg_func ::= TODAY", - /* 357 */ "noarg_func ::= TIMEZONE", - /* 358 */ "noarg_func ::= DATABASE", - /* 359 */ "noarg_func ::= CLIENT_VERSION", - /* 360 */ "noarg_func ::= SERVER_VERSION", - /* 361 */ "noarg_func ::= SERVER_STATUS", - /* 362 */ "noarg_func ::= CURRENT_USER", - /* 363 */ "noarg_func ::= USER", - /* 364 */ "star_func ::= COUNT", - /* 365 */ "star_func ::= FIRST", - /* 366 */ "star_func ::= LAST", - /* 367 */ "star_func ::= LAST_ROW", - /* 368 */ "star_func_para_list ::= NK_STAR", - /* 369 */ "star_func_para_list ::= other_para_list", - /* 370 */ "other_para_list ::= star_func_para", - /* 371 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 372 */ "star_func_para ::= expression", - /* 373 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 374 */ "predicate ::= expression compare_op expression", - /* 375 */ "predicate ::= expression BETWEEN expression AND expression", - /* 376 */ "predicate ::= expression NOT BETWEEN expression AND expression", - /* 377 */ "predicate ::= expression IS NULL", - /* 378 */ "predicate ::= expression IS NOT NULL", - /* 379 */ "predicate ::= expression in_op in_predicate_value", - /* 380 */ "compare_op ::= NK_LT", - /* 381 */ "compare_op ::= NK_GT", - /* 382 */ "compare_op ::= NK_LE", - /* 383 */ "compare_op ::= NK_GE", - /* 384 */ "compare_op ::= NK_NE", - /* 385 */ "compare_op ::= NK_EQ", - /* 386 */ "compare_op ::= LIKE", - /* 387 */ "compare_op ::= NOT LIKE", - /* 388 */ "compare_op ::= MATCH", - /* 389 */ "compare_op ::= NMATCH", - /* 390 */ "compare_op ::= CONTAINS", - /* 391 */ "in_op ::= IN", - /* 392 */ "in_op ::= NOT IN", - /* 393 */ "in_predicate_value ::= NK_LP literal_list NK_RP", - /* 394 */ "boolean_value_expression ::= boolean_primary", - /* 395 */ "boolean_value_expression ::= NOT boolean_primary", - /* 396 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 397 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 398 */ "boolean_primary ::= predicate", - /* 399 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 400 */ "common_expression ::= expression", - /* 401 */ "common_expression ::= boolean_value_expression", - /* 402 */ "from_clause_opt ::=", - /* 403 */ "from_clause_opt ::= FROM table_reference_list", - /* 404 */ "table_reference_list ::= table_reference", - /* 405 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 406 */ "table_reference ::= table_primary", - /* 407 */ "table_reference ::= joined_table", - /* 408 */ "table_primary ::= table_name alias_opt", - /* 409 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 410 */ "table_primary ::= subquery alias_opt", - /* 411 */ "table_primary ::= parenthesized_joined_table", - /* 412 */ "alias_opt ::=", - /* 413 */ "alias_opt ::= table_alias", - /* 414 */ "alias_opt ::= AS table_alias", - /* 415 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 416 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 417 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 418 */ "join_type ::=", - /* 419 */ "join_type ::= INNER", - /* 420 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", - /* 421 */ "set_quantifier_opt ::=", - /* 422 */ "set_quantifier_opt ::= DISTINCT", - /* 423 */ "set_quantifier_opt ::= ALL", - /* 424 */ "select_list ::= select_item", - /* 425 */ "select_list ::= select_list NK_COMMA select_item", - /* 426 */ "select_item ::= NK_STAR", - /* 427 */ "select_item ::= common_expression", - /* 428 */ "select_item ::= common_expression column_alias", - /* 429 */ "select_item ::= common_expression AS column_alias", - /* 430 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 431 */ "where_clause_opt ::=", - /* 432 */ "where_clause_opt ::= WHERE search_condition", - /* 433 */ "partition_by_clause_opt ::=", - /* 434 */ "partition_by_clause_opt ::= PARTITION BY expression_list", - /* 435 */ "twindow_clause_opt ::=", - /* 436 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", - /* 437 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", - /* 438 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 439 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 440 */ "sliding_opt ::=", - /* 441 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 442 */ "fill_opt ::=", - /* 443 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 444 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 445 */ "fill_mode ::= NONE", - /* 446 */ "fill_mode ::= PREV", - /* 447 */ "fill_mode ::= NULL", - /* 448 */ "fill_mode ::= LINEAR", - /* 449 */ "fill_mode ::= NEXT", - /* 450 */ "group_by_clause_opt ::=", - /* 451 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 452 */ "group_by_list ::= expression", - /* 453 */ "group_by_list ::= group_by_list NK_COMMA expression", - /* 454 */ "having_clause_opt ::=", - /* 455 */ "having_clause_opt ::= HAVING search_condition", - /* 456 */ "range_opt ::=", - /* 457 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", - /* 458 */ "every_opt ::=", - /* 459 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 460 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 461 */ "query_expression_body ::= query_primary", - /* 462 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 463 */ "query_expression_body ::= query_expression_body UNION query_expression_body", - /* 464 */ "query_primary ::= query_specification", - /* 465 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", - /* 466 */ "order_by_clause_opt ::=", - /* 467 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 468 */ "slimit_clause_opt ::=", - /* 469 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 470 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 471 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 472 */ "limit_clause_opt ::=", - /* 473 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 474 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 475 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 476 */ "subquery ::= NK_LP query_expression NK_RP", - /* 477 */ "search_condition ::= common_expression", - /* 478 */ "sort_specification_list ::= sort_specification", - /* 479 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 480 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", - /* 481 */ "ordering_specification_opt ::=", - /* 482 */ "ordering_specification_opt ::= ASC", - /* 483 */ "ordering_specification_opt ::= DESC", - /* 484 */ "null_ordering_opt ::=", - /* 485 */ "null_ordering_opt ::= NULLS FIRST", - /* 486 */ "null_ordering_opt ::= NULLS LAST", + /* 67 */ "cmd ::= TRIM DATABASE db_name", + /* 68 */ "not_exists_opt ::= IF NOT EXISTS", + /* 69 */ "not_exists_opt ::=", + /* 70 */ "exists_opt ::= IF EXISTS", + /* 71 */ "exists_opt ::=", + /* 72 */ "db_options ::=", + /* 73 */ "db_options ::= db_options BUFFER NK_INTEGER", + /* 74 */ "db_options ::= db_options CACHELAST NK_INTEGER", + /* 75 */ "db_options ::= db_options CACHELASTSIZE NK_INTEGER", + /* 76 */ "db_options ::= db_options COMP NK_INTEGER", + /* 77 */ "db_options ::= db_options DURATION NK_INTEGER", + /* 78 */ "db_options ::= db_options DURATION NK_VARIABLE", + /* 79 */ "db_options ::= db_options FSYNC NK_INTEGER", + /* 80 */ "db_options ::= db_options MAXROWS NK_INTEGER", + /* 81 */ "db_options ::= db_options MINROWS NK_INTEGER", + /* 82 */ "db_options ::= db_options KEEP integer_list", + /* 83 */ "db_options ::= db_options KEEP variable_list", + /* 84 */ "db_options ::= db_options PAGES NK_INTEGER", + /* 85 */ "db_options ::= db_options PAGESIZE NK_INTEGER", + /* 86 */ "db_options ::= db_options PRECISION NK_STRING", + /* 87 */ "db_options ::= db_options REPLICA NK_INTEGER", + /* 88 */ "db_options ::= db_options STRICT NK_INTEGER", + /* 89 */ "db_options ::= db_options WAL NK_INTEGER", + /* 90 */ "db_options ::= db_options VGROUPS NK_INTEGER", + /* 91 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", + /* 92 */ "db_options ::= db_options RETENTIONS retention_list", + /* 93 */ "db_options ::= db_options SCHEMALESS NK_INTEGER", + /* 94 */ "alter_db_options ::= alter_db_option", + /* 95 */ "alter_db_options ::= alter_db_options alter_db_option", + /* 96 */ "alter_db_option ::= BUFFER NK_INTEGER", + /* 97 */ "alter_db_option ::= CACHELAST NK_INTEGER", + /* 98 */ "alter_db_option ::= CACHELASTSIZE NK_INTEGER", + /* 99 */ "alter_db_option ::= FSYNC NK_INTEGER", + /* 100 */ "alter_db_option ::= KEEP integer_list", + /* 101 */ "alter_db_option ::= KEEP variable_list", + /* 102 */ "alter_db_option ::= PAGES NK_INTEGER", + /* 103 */ "alter_db_option ::= REPLICA NK_INTEGER", + /* 104 */ "alter_db_option ::= STRICT NK_INTEGER", + /* 105 */ "alter_db_option ::= WAL NK_INTEGER", + /* 106 */ "integer_list ::= NK_INTEGER", + /* 107 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", + /* 108 */ "variable_list ::= NK_VARIABLE", + /* 109 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", + /* 110 */ "retention_list ::= retention", + /* 111 */ "retention_list ::= retention_list NK_COMMA retention", + /* 112 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", + /* 113 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", + /* 114 */ "cmd ::= CREATE TABLE multi_create_clause", + /* 115 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", + /* 116 */ "cmd ::= DROP TABLE multi_drop_clause", + /* 117 */ "cmd ::= DROP STABLE exists_opt full_table_name", + /* 118 */ "cmd ::= ALTER TABLE alter_table_clause", + /* 119 */ "cmd ::= ALTER STABLE alter_table_clause", + /* 120 */ "alter_table_clause ::= full_table_name alter_table_options", + /* 121 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", + /* 122 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", + /* 123 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", + /* 124 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", + /* 125 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", + /* 126 */ "alter_table_clause ::= full_table_name DROP TAG column_name", + /* 127 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", + /* 128 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", + /* 129 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", + /* 130 */ "multi_create_clause ::= create_subtable_clause", + /* 131 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", + /* 132 */ "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", + /* 133 */ "multi_drop_clause ::= drop_table_clause", + /* 134 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", + /* 135 */ "drop_table_clause ::= exists_opt full_table_name", + /* 136 */ "specific_cols_opt ::=", + /* 137 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", + /* 138 */ "full_table_name ::= table_name", + /* 139 */ "full_table_name ::= db_name NK_DOT table_name", + /* 140 */ "column_def_list ::= column_def", + /* 141 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 142 */ "column_def ::= column_name type_name", + /* 143 */ "column_def ::= column_name type_name COMMENT NK_STRING", + /* 144 */ "type_name ::= BOOL", + /* 145 */ "type_name ::= TINYINT", + /* 146 */ "type_name ::= SMALLINT", + /* 147 */ "type_name ::= INT", + /* 148 */ "type_name ::= INTEGER", + /* 149 */ "type_name ::= BIGINT", + /* 150 */ "type_name ::= FLOAT", + /* 151 */ "type_name ::= DOUBLE", + /* 152 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 153 */ "type_name ::= TIMESTAMP", + /* 154 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 155 */ "type_name ::= TINYINT UNSIGNED", + /* 156 */ "type_name ::= SMALLINT UNSIGNED", + /* 157 */ "type_name ::= INT UNSIGNED", + /* 158 */ "type_name ::= BIGINT UNSIGNED", + /* 159 */ "type_name ::= JSON", + /* 160 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 161 */ "type_name ::= MEDIUMBLOB", + /* 162 */ "type_name ::= BLOB", + /* 163 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 164 */ "type_name ::= DECIMAL", + /* 165 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 166 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 167 */ "tags_def_opt ::=", + /* 168 */ "tags_def_opt ::= tags_def", + /* 169 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", + /* 170 */ "table_options ::=", + /* 171 */ "table_options ::= table_options COMMENT NK_STRING", + /* 172 */ "table_options ::= table_options MAX_DELAY duration_list", + /* 173 */ "table_options ::= table_options WATERMARK duration_list", + /* 174 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", + /* 175 */ "table_options ::= table_options TTL NK_INTEGER", + /* 176 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", + /* 177 */ "alter_table_options ::= alter_table_option", + /* 178 */ "alter_table_options ::= alter_table_options alter_table_option", + /* 179 */ "alter_table_option ::= COMMENT NK_STRING", + /* 180 */ "alter_table_option ::= TTL NK_INTEGER", + /* 181 */ "duration_list ::= duration_literal", + /* 182 */ "duration_list ::= duration_list NK_COMMA duration_literal", + /* 183 */ "rollup_func_list ::= rollup_func_name", + /* 184 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", + /* 185 */ "rollup_func_name ::= function_name", + /* 186 */ "rollup_func_name ::= FIRST", + /* 187 */ "rollup_func_name ::= LAST", + /* 188 */ "col_name_list ::= col_name", + /* 189 */ "col_name_list ::= col_name_list NK_COMMA col_name", + /* 190 */ "col_name ::= column_name", + /* 191 */ "cmd ::= SHOW DNODES", + /* 192 */ "cmd ::= SHOW USERS", + /* 193 */ "cmd ::= SHOW DATABASES", + /* 194 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", + /* 195 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", + /* 196 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", + /* 197 */ "cmd ::= SHOW MNODES", + /* 198 */ "cmd ::= SHOW MODULES", + /* 199 */ "cmd ::= SHOW QNODES", + /* 200 */ "cmd ::= SHOW FUNCTIONS", + /* 201 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", + /* 202 */ "cmd ::= SHOW STREAMS", + /* 203 */ "cmd ::= SHOW ACCOUNTS", + /* 204 */ "cmd ::= SHOW APPS", + /* 205 */ "cmd ::= SHOW CONNECTIONS", + /* 206 */ "cmd ::= SHOW LICENCE", + /* 207 */ "cmd ::= SHOW GRANTS", + /* 208 */ "cmd ::= SHOW CREATE DATABASE db_name", + /* 209 */ "cmd ::= SHOW CREATE TABLE full_table_name", + /* 210 */ "cmd ::= SHOW CREATE STABLE full_table_name", + /* 211 */ "cmd ::= SHOW QUERIES", + /* 212 */ "cmd ::= SHOW SCORES", + /* 213 */ "cmd ::= SHOW TOPICS", + /* 214 */ "cmd ::= SHOW VARIABLES", + /* 215 */ "cmd ::= SHOW LOCAL VARIABLES", + /* 216 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", + /* 217 */ "cmd ::= SHOW BNODES", + /* 218 */ "cmd ::= SHOW SNODES", + /* 219 */ "cmd ::= SHOW CLUSTER", + /* 220 */ "cmd ::= SHOW TRANSACTIONS", + /* 221 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", + /* 222 */ "cmd ::= SHOW CONSUMERS", + /* 223 */ "cmd ::= SHOW SUBSCRIPTIONS", + /* 224 */ "db_name_cond_opt ::=", + /* 225 */ "db_name_cond_opt ::= db_name NK_DOT", + /* 226 */ "like_pattern_opt ::=", + /* 227 */ "like_pattern_opt ::= LIKE NK_STRING", + /* 228 */ "table_name_cond ::= table_name", + /* 229 */ "from_db_opt ::=", + /* 230 */ "from_db_opt ::= FROM db_name", + /* 231 */ "cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options", + /* 232 */ "cmd ::= DROP INDEX exists_opt index_name", + /* 233 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", + /* 234 */ "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", + /* 235 */ "func_list ::= func", + /* 236 */ "func_list ::= func_list NK_COMMA func", + /* 237 */ "func ::= function_name NK_LP expression_list NK_RP", + /* 238 */ "sma_stream_opt ::=", + /* 239 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", + /* 240 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", + /* 241 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", + /* 242 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", + /* 243 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", + /* 244 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", + /* 245 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", + /* 246 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 247 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", + /* 248 */ "cmd ::= DESC full_table_name", + /* 249 */ "cmd ::= DESCRIBE full_table_name", + /* 250 */ "cmd ::= RESET QUERY CACHE", + /* 251 */ "cmd ::= EXPLAIN analyze_opt explain_options query_expression", + /* 252 */ "analyze_opt ::=", + /* 253 */ "analyze_opt ::= ANALYZE", + /* 254 */ "explain_options ::=", + /* 255 */ "explain_options ::= explain_options VERBOSE NK_BOOL", + /* 256 */ "explain_options ::= explain_options RATIO NK_FLOAT", + /* 257 */ "cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP", + /* 258 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", + /* 259 */ "cmd ::= DROP FUNCTION exists_opt function_name", + /* 260 */ "agg_func_opt ::=", + /* 261 */ "agg_func_opt ::= AGGREGATE", + /* 262 */ "bufsize_opt ::=", + /* 263 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", + /* 264 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression", + /* 265 */ "cmd ::= DROP STREAM exists_opt stream_name", + /* 266 */ "into_opt ::=", + /* 267 */ "into_opt ::= INTO full_table_name", + /* 268 */ "stream_options ::=", + /* 269 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 270 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 271 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 272 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 273 */ "stream_options ::= stream_options IGNORE EXPIRED", + /* 274 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 275 */ "cmd ::= KILL QUERY NK_STRING", + /* 276 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 277 */ "cmd ::= BALANCE VGROUP", + /* 278 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 279 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 280 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 281 */ "dnode_list ::= DNODE NK_INTEGER", + /* 282 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 283 */ "cmd ::= SYNCDB db_name REPLICA", + /* 284 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 285 */ "cmd ::= query_expression", + /* 286 */ "cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression", + /* 287 */ "literal ::= NK_INTEGER", + /* 288 */ "literal ::= NK_FLOAT", + /* 289 */ "literal ::= NK_STRING", + /* 290 */ "literal ::= NK_BOOL", + /* 291 */ "literal ::= TIMESTAMP NK_STRING", + /* 292 */ "literal ::= duration_literal", + /* 293 */ "literal ::= NULL", + /* 294 */ "literal ::= NK_QUESTION", + /* 295 */ "duration_literal ::= NK_VARIABLE", + /* 296 */ "signed ::= NK_INTEGER", + /* 297 */ "signed ::= NK_PLUS NK_INTEGER", + /* 298 */ "signed ::= NK_MINUS NK_INTEGER", + /* 299 */ "signed ::= NK_FLOAT", + /* 300 */ "signed ::= NK_PLUS NK_FLOAT", + /* 301 */ "signed ::= NK_MINUS NK_FLOAT", + /* 302 */ "signed_literal ::= signed", + /* 303 */ "signed_literal ::= NK_STRING", + /* 304 */ "signed_literal ::= NK_BOOL", + /* 305 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 306 */ "signed_literal ::= duration_literal", + /* 307 */ "signed_literal ::= NULL", + /* 308 */ "signed_literal ::= literal_func", + /* 309 */ "literal_list ::= signed_literal", + /* 310 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 311 */ "db_name ::= NK_ID", + /* 312 */ "table_name ::= NK_ID", + /* 313 */ "column_name ::= NK_ID", + /* 314 */ "function_name ::= NK_ID", + /* 315 */ "table_alias ::= NK_ID", + /* 316 */ "column_alias ::= NK_ID", + /* 317 */ "user_name ::= NK_ID", + /* 318 */ "index_name ::= NK_ID", + /* 319 */ "topic_name ::= NK_ID", + /* 320 */ "stream_name ::= NK_ID", + /* 321 */ "cgroup_name ::= NK_ID", + /* 322 */ "expression ::= literal", + /* 323 */ "expression ::= pseudo_column", + /* 324 */ "expression ::= column_reference", + /* 325 */ "expression ::= function_expression", + /* 326 */ "expression ::= subquery", + /* 327 */ "expression ::= NK_LP expression NK_RP", + /* 328 */ "expression ::= NK_PLUS expression", + /* 329 */ "expression ::= NK_MINUS expression", + /* 330 */ "expression ::= expression NK_PLUS expression", + /* 331 */ "expression ::= expression NK_MINUS expression", + /* 332 */ "expression ::= expression NK_STAR expression", + /* 333 */ "expression ::= expression NK_SLASH expression", + /* 334 */ "expression ::= expression NK_REM expression", + /* 335 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 336 */ "expression ::= expression NK_BITAND expression", + /* 337 */ "expression ::= expression NK_BITOR expression", + /* 338 */ "expression_list ::= expression", + /* 339 */ "expression_list ::= expression_list NK_COMMA expression", + /* 340 */ "column_reference ::= column_name", + /* 341 */ "column_reference ::= table_name NK_DOT column_name", + /* 342 */ "pseudo_column ::= ROWTS", + /* 343 */ "pseudo_column ::= TBNAME", + /* 344 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 345 */ "pseudo_column ::= QSTARTTS", + /* 346 */ "pseudo_column ::= QENDTS", + /* 347 */ "pseudo_column ::= WSTARTTS", + /* 348 */ "pseudo_column ::= WENDTS", + /* 349 */ "pseudo_column ::= WDURATION", + /* 350 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 351 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 352 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", + /* 353 */ "function_expression ::= literal_func", + /* 354 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 355 */ "literal_func ::= NOW", + /* 356 */ "noarg_func ::= NOW", + /* 357 */ "noarg_func ::= TODAY", + /* 358 */ "noarg_func ::= TIMEZONE", + /* 359 */ "noarg_func ::= DATABASE", + /* 360 */ "noarg_func ::= CLIENT_VERSION", + /* 361 */ "noarg_func ::= SERVER_VERSION", + /* 362 */ "noarg_func ::= SERVER_STATUS", + /* 363 */ "noarg_func ::= CURRENT_USER", + /* 364 */ "noarg_func ::= USER", + /* 365 */ "star_func ::= COUNT", + /* 366 */ "star_func ::= FIRST", + /* 367 */ "star_func ::= LAST", + /* 368 */ "star_func ::= LAST_ROW", + /* 369 */ "star_func_para_list ::= NK_STAR", + /* 370 */ "star_func_para_list ::= other_para_list", + /* 371 */ "other_para_list ::= star_func_para", + /* 372 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 373 */ "star_func_para ::= expression", + /* 374 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 375 */ "predicate ::= expression compare_op expression", + /* 376 */ "predicate ::= expression BETWEEN expression AND expression", + /* 377 */ "predicate ::= expression NOT BETWEEN expression AND expression", + /* 378 */ "predicate ::= expression IS NULL", + /* 379 */ "predicate ::= expression IS NOT NULL", + /* 380 */ "predicate ::= expression in_op in_predicate_value", + /* 381 */ "compare_op ::= NK_LT", + /* 382 */ "compare_op ::= NK_GT", + /* 383 */ "compare_op ::= NK_LE", + /* 384 */ "compare_op ::= NK_GE", + /* 385 */ "compare_op ::= NK_NE", + /* 386 */ "compare_op ::= NK_EQ", + /* 387 */ "compare_op ::= LIKE", + /* 388 */ "compare_op ::= NOT LIKE", + /* 389 */ "compare_op ::= MATCH", + /* 390 */ "compare_op ::= NMATCH", + /* 391 */ "compare_op ::= CONTAINS", + /* 392 */ "in_op ::= IN", + /* 393 */ "in_op ::= NOT IN", + /* 394 */ "in_predicate_value ::= NK_LP literal_list NK_RP", + /* 395 */ "boolean_value_expression ::= boolean_primary", + /* 396 */ "boolean_value_expression ::= NOT boolean_primary", + /* 397 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 398 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 399 */ "boolean_primary ::= predicate", + /* 400 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 401 */ "common_expression ::= expression", + /* 402 */ "common_expression ::= boolean_value_expression", + /* 403 */ "from_clause_opt ::=", + /* 404 */ "from_clause_opt ::= FROM table_reference_list", + /* 405 */ "table_reference_list ::= table_reference", + /* 406 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 407 */ "table_reference ::= table_primary", + /* 408 */ "table_reference ::= joined_table", + /* 409 */ "table_primary ::= table_name alias_opt", + /* 410 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 411 */ "table_primary ::= subquery alias_opt", + /* 412 */ "table_primary ::= parenthesized_joined_table", + /* 413 */ "alias_opt ::=", + /* 414 */ "alias_opt ::= table_alias", + /* 415 */ "alias_opt ::= AS table_alias", + /* 416 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 417 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 418 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 419 */ "join_type ::=", + /* 420 */ "join_type ::= INNER", + /* 421 */ "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", + /* 422 */ "set_quantifier_opt ::=", + /* 423 */ "set_quantifier_opt ::= DISTINCT", + /* 424 */ "set_quantifier_opt ::= ALL", + /* 425 */ "select_list ::= select_item", + /* 426 */ "select_list ::= select_list NK_COMMA select_item", + /* 427 */ "select_item ::= NK_STAR", + /* 428 */ "select_item ::= common_expression", + /* 429 */ "select_item ::= common_expression column_alias", + /* 430 */ "select_item ::= common_expression AS column_alias", + /* 431 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 432 */ "where_clause_opt ::=", + /* 433 */ "where_clause_opt ::= WHERE search_condition", + /* 434 */ "partition_by_clause_opt ::=", + /* 435 */ "partition_by_clause_opt ::= PARTITION BY expression_list", + /* 436 */ "twindow_clause_opt ::=", + /* 437 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", + /* 438 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", + /* 439 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 440 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 441 */ "sliding_opt ::=", + /* 442 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 443 */ "fill_opt ::=", + /* 444 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 445 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 446 */ "fill_mode ::= NONE", + /* 447 */ "fill_mode ::= PREV", + /* 448 */ "fill_mode ::= NULL", + /* 449 */ "fill_mode ::= LINEAR", + /* 450 */ "fill_mode ::= NEXT", + /* 451 */ "group_by_clause_opt ::=", + /* 452 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 453 */ "group_by_list ::= expression", + /* 454 */ "group_by_list ::= group_by_list NK_COMMA expression", + /* 455 */ "having_clause_opt ::=", + /* 456 */ "having_clause_opt ::= HAVING search_condition", + /* 457 */ "range_opt ::=", + /* 458 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", + /* 459 */ "every_opt ::=", + /* 460 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 461 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 462 */ "query_expression_body ::= query_primary", + /* 463 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 464 */ "query_expression_body ::= query_expression_body UNION query_expression_body", + /* 465 */ "query_primary ::= query_specification", + /* 466 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", + /* 467 */ "order_by_clause_opt ::=", + /* 468 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 469 */ "slimit_clause_opt ::=", + /* 470 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 471 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 472 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 473 */ "limit_clause_opt ::=", + /* 474 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 475 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 476 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 477 */ "subquery ::= NK_LP query_expression NK_RP", + /* 478 */ "search_condition ::= common_expression", + /* 479 */ "sort_specification_list ::= sort_specification", + /* 480 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 481 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", + /* 482 */ "ordering_specification_opt ::=", + /* 483 */ "ordering_specification_opt ::= ASC", + /* 484 */ "ordering_specification_opt ::= DESC", + /* 485 */ "null_ordering_opt ::=", + /* 486 */ "null_ordering_opt ::= NULLS FIRST", + /* 487 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -2239,181 +2258,181 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 254: /* cmd */ - case 257: /* literal */ - case 268: /* db_options */ - case 270: /* alter_db_options */ - case 275: /* retention */ - case 276: /* full_table_name */ - case 279: /* table_options */ - case 283: /* alter_table_clause */ - case 284: /* alter_table_options */ - case 287: /* signed_literal */ - case 288: /* create_subtable_clause */ - case 291: /* drop_table_clause */ - case 294: /* column_def */ - case 298: /* duration_literal */ - case 299: /* rollup_func_name */ - case 301: /* col_name */ - case 302: /* db_name_cond_opt */ - case 303: /* like_pattern_opt */ - case 304: /* table_name_cond */ - case 305: /* from_db_opt */ - case 307: /* index_options */ - case 309: /* sliding_opt */ - case 310: /* sma_stream_opt */ - case 311: /* func */ - case 312: /* stream_options */ - case 314: /* query_expression */ - case 317: /* explain_options */ - case 321: /* into_opt */ - case 323: /* where_clause_opt */ - case 324: /* signed */ - case 325: /* literal_func */ - case 329: /* expression */ - case 330: /* pseudo_column */ - case 331: /* column_reference */ - case 332: /* function_expression */ - case 333: /* subquery */ - case 338: /* star_func_para */ - case 339: /* predicate */ - case 342: /* in_predicate_value */ - case 343: /* boolean_value_expression */ - case 344: /* boolean_primary */ - case 345: /* common_expression */ - case 346: /* from_clause_opt */ - case 347: /* table_reference_list */ - case 348: /* table_reference */ - case 349: /* table_primary */ - case 350: /* joined_table */ - case 352: /* parenthesized_joined_table */ - case 354: /* search_condition */ - case 355: /* query_specification */ - case 359: /* range_opt */ - case 360: /* every_opt */ - case 361: /* fill_opt */ - case 362: /* twindow_clause_opt */ - case 364: /* having_clause_opt */ - case 365: /* select_item */ - case 368: /* query_expression_body */ - case 370: /* slimit_clause_opt */ - case 371: /* limit_clause_opt */ - case 372: /* query_primary */ - case 374: /* sort_specification */ + case 255: /* cmd */ + case 258: /* literal */ + case 269: /* db_options */ + case 271: /* alter_db_options */ + case 276: /* retention */ + case 277: /* full_table_name */ + case 280: /* table_options */ + case 284: /* alter_table_clause */ + case 285: /* alter_table_options */ + case 288: /* signed_literal */ + case 289: /* create_subtable_clause */ + case 292: /* drop_table_clause */ + case 295: /* column_def */ + case 299: /* duration_literal */ + case 300: /* rollup_func_name */ + case 302: /* col_name */ + case 303: /* db_name_cond_opt */ + case 304: /* like_pattern_opt */ + case 305: /* table_name_cond */ + case 306: /* from_db_opt */ + case 308: /* index_options */ + case 310: /* sliding_opt */ + case 311: /* sma_stream_opt */ + case 312: /* func */ + case 313: /* stream_options */ + case 315: /* query_expression */ + case 318: /* explain_options */ + case 322: /* into_opt */ + case 324: /* where_clause_opt */ + case 325: /* signed */ + case 326: /* literal_func */ + case 330: /* expression */ + case 331: /* pseudo_column */ + case 332: /* column_reference */ + case 333: /* function_expression */ + case 334: /* subquery */ + case 339: /* star_func_para */ + case 340: /* predicate */ + case 343: /* in_predicate_value */ + case 344: /* boolean_value_expression */ + case 345: /* boolean_primary */ + case 346: /* common_expression */ + case 347: /* from_clause_opt */ + case 348: /* table_reference_list */ + case 349: /* table_reference */ + case 350: /* table_primary */ + case 351: /* joined_table */ + case 353: /* parenthesized_joined_table */ + case 355: /* search_condition */ + case 356: /* query_specification */ + case 360: /* range_opt */ + case 361: /* every_opt */ + case 362: /* fill_opt */ + case 363: /* twindow_clause_opt */ + case 365: /* having_clause_opt */ + case 366: /* select_item */ + case 369: /* query_expression_body */ + case 371: /* slimit_clause_opt */ + case 372: /* limit_clause_opt */ + case 373: /* query_primary */ + case 375: /* sort_specification */ { - nodesDestroyNode((yypminor->yy652)); + nodesDestroyNode((yypminor->yy560)); } break; - case 255: /* account_options */ - case 256: /* alter_account_options */ - case 258: /* alter_account_option */ - case 319: /* bufsize_opt */ + case 256: /* account_options */ + case 257: /* alter_account_options */ + case 259: /* alter_account_option */ + case 320: /* bufsize_opt */ { } break; - case 259: /* user_name */ - case 262: /* priv_level */ - case 265: /* db_name */ - case 266: /* dnode_endpoint */ - case 285: /* column_name */ - case 293: /* table_name */ - case 300: /* function_name */ - case 306: /* index_name */ - case 313: /* topic_name */ - case 315: /* cgroup_name */ - case 320: /* stream_name */ - case 327: /* table_alias */ - case 328: /* column_alias */ - case 334: /* star_func */ - case 336: /* noarg_func */ - case 351: /* alias_opt */ + case 260: /* user_name */ + case 263: /* priv_level */ + case 266: /* db_name */ + case 267: /* dnode_endpoint */ + case 286: /* column_name */ + case 294: /* table_name */ + case 301: /* function_name */ + case 307: /* index_name */ + case 314: /* topic_name */ + case 316: /* cgroup_name */ + case 321: /* stream_name */ + case 328: /* table_alias */ + case 329: /* column_alias */ + case 335: /* star_func */ + case 337: /* noarg_func */ + case 352: /* alias_opt */ { } break; - case 260: /* sysinfo_opt */ + case 261: /* sysinfo_opt */ { } break; - case 261: /* privileges */ - case 263: /* priv_type_list */ - case 264: /* priv_type */ + case 262: /* privileges */ + case 264: /* priv_type_list */ + case 265: /* priv_type */ { } break; - case 267: /* not_exists_opt */ - case 269: /* exists_opt */ - case 316: /* analyze_opt */ - case 318: /* agg_func_opt */ - case 356: /* set_quantifier_opt */ + case 268: /* not_exists_opt */ + case 270: /* exists_opt */ + case 317: /* analyze_opt */ + case 319: /* agg_func_opt */ + case 357: /* set_quantifier_opt */ { } break; - case 271: /* integer_list */ - case 272: /* variable_list */ - case 273: /* retention_list */ - case 277: /* column_def_list */ - case 278: /* tags_def_opt */ - case 280: /* multi_create_clause */ - case 281: /* tags_def */ - case 282: /* multi_drop_clause */ - case 289: /* specific_cols_opt */ - case 290: /* expression_list */ - case 292: /* col_name_list */ - case 295: /* duration_list */ - case 296: /* rollup_func_list */ - case 308: /* func_list */ - case 322: /* dnode_list */ - case 326: /* literal_list */ - case 335: /* star_func_para_list */ - case 337: /* other_para_list */ - case 357: /* select_list */ - case 358: /* partition_by_clause_opt */ - case 363: /* group_by_clause_opt */ - case 367: /* group_by_list */ - case 369: /* order_by_clause_opt */ - case 373: /* sort_specification_list */ + case 272: /* integer_list */ + case 273: /* variable_list */ + case 274: /* retention_list */ + case 278: /* column_def_list */ + case 279: /* tags_def_opt */ + case 281: /* multi_create_clause */ + case 282: /* tags_def */ + case 283: /* multi_drop_clause */ + case 290: /* specific_cols_opt */ + case 291: /* expression_list */ + case 293: /* col_name_list */ + case 296: /* duration_list */ + case 297: /* rollup_func_list */ + case 309: /* func_list */ + case 323: /* dnode_list */ + case 327: /* literal_list */ + case 336: /* star_func_para_list */ + case 338: /* other_para_list */ + case 358: /* select_list */ + case 359: /* partition_by_clause_opt */ + case 364: /* group_by_clause_opt */ + case 368: /* group_by_list */ + case 370: /* order_by_clause_opt */ + case 374: /* sort_specification_list */ { - nodesDestroyList((yypminor->yy210)); + nodesDestroyList((yypminor->yy712)); } break; - case 274: /* alter_db_option */ - case 297: /* alter_table_option */ + case 275: /* alter_db_option */ + case 298: /* alter_table_option */ { } break; - case 286: /* type_name */ + case 287: /* type_name */ { } break; - case 340: /* compare_op */ - case 341: /* in_op */ + case 341: /* compare_op */ + case 342: /* in_op */ { } break; - case 353: /* join_type */ + case 354: /* join_type */ { } break; - case 366: /* fill_mode */ + case 367: /* fill_mode */ { } break; - case 375: /* ordering_specification_opt */ + case 376: /* ordering_specification_opt */ { } break; - case 376: /* null_ordering_opt */ + case 377: /* null_ordering_opt */ { } @@ -2712,493 +2731,494 @@ 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[] = { - { 254, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ - { 254, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ - { 255, 0 }, /* (2) account_options ::= */ - { 255, -3 }, /* (3) account_options ::= account_options PPS literal */ - { 255, -3 }, /* (4) account_options ::= account_options TSERIES literal */ - { 255, -3 }, /* (5) account_options ::= account_options STORAGE literal */ - { 255, -3 }, /* (6) account_options ::= account_options STREAMS literal */ - { 255, -3 }, /* (7) account_options ::= account_options QTIME literal */ - { 255, -3 }, /* (8) account_options ::= account_options DBS literal */ - { 255, -3 }, /* (9) account_options ::= account_options USERS literal */ - { 255, -3 }, /* (10) account_options ::= account_options CONNS literal */ - { 255, -3 }, /* (11) account_options ::= account_options STATE literal */ - { 256, -1 }, /* (12) alter_account_options ::= alter_account_option */ - { 256, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ - { 258, -2 }, /* (14) alter_account_option ::= PASS literal */ - { 258, -2 }, /* (15) alter_account_option ::= PPS literal */ - { 258, -2 }, /* (16) alter_account_option ::= TSERIES literal */ - { 258, -2 }, /* (17) alter_account_option ::= STORAGE literal */ - { 258, -2 }, /* (18) alter_account_option ::= STREAMS literal */ - { 258, -2 }, /* (19) alter_account_option ::= QTIME literal */ - { 258, -2 }, /* (20) alter_account_option ::= DBS literal */ - { 258, -2 }, /* (21) alter_account_option ::= USERS literal */ - { 258, -2 }, /* (22) alter_account_option ::= CONNS literal */ - { 258, -2 }, /* (23) alter_account_option ::= STATE literal */ - { 254, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ - { 254, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ - { 254, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ - { 254, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ - { 254, -3 }, /* (28) cmd ::= DROP USER user_name */ - { 260, 0 }, /* (29) sysinfo_opt ::= */ - { 260, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ - { 254, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ - { 254, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ - { 261, -1 }, /* (33) privileges ::= ALL */ - { 261, -1 }, /* (34) privileges ::= priv_type_list */ - { 263, -1 }, /* (35) priv_type_list ::= priv_type */ - { 263, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ - { 264, -1 }, /* (37) priv_type ::= READ */ - { 264, -1 }, /* (38) priv_type ::= WRITE */ - { 262, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ - { 262, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ - { 254, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ - { 254, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ - { 254, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ - { 254, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ - { 254, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ - { 254, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ - { 254, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ - { 254, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ - { 266, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ - { 266, -1 }, /* (50) dnode_endpoint ::= NK_ID */ - { 266, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ - { 254, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ - { 254, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ - { 254, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ - { 254, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ - { 254, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ - { 254, -2 }, /* (64) cmd ::= USE db_name */ - { 254, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ - { 254, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ - { 267, -3 }, /* (67) not_exists_opt ::= IF NOT EXISTS */ - { 267, 0 }, /* (68) not_exists_opt ::= */ - { 269, -2 }, /* (69) exists_opt ::= IF EXISTS */ - { 269, 0 }, /* (70) exists_opt ::= */ - { 268, 0 }, /* (71) db_options ::= */ - { 268, -3 }, /* (72) db_options ::= db_options BUFFER NK_INTEGER */ - { 268, -3 }, /* (73) db_options ::= db_options CACHELAST NK_INTEGER */ - { 268, -3 }, /* (74) db_options ::= db_options CACHELASTSIZE NK_INTEGER */ - { 268, -3 }, /* (75) db_options ::= db_options COMP NK_INTEGER */ - { 268, -3 }, /* (76) db_options ::= db_options DURATION NK_INTEGER */ - { 268, -3 }, /* (77) db_options ::= db_options DURATION NK_VARIABLE */ - { 268, -3 }, /* (78) db_options ::= db_options FSYNC NK_INTEGER */ - { 268, -3 }, /* (79) db_options ::= db_options MAXROWS NK_INTEGER */ - { 268, -3 }, /* (80) db_options ::= db_options MINROWS NK_INTEGER */ - { 268, -3 }, /* (81) db_options ::= db_options KEEP integer_list */ - { 268, -3 }, /* (82) db_options ::= db_options KEEP variable_list */ - { 268, -3 }, /* (83) db_options ::= db_options PAGES NK_INTEGER */ - { 268, -3 }, /* (84) db_options ::= db_options PAGESIZE NK_INTEGER */ - { 268, -3 }, /* (85) db_options ::= db_options PRECISION NK_STRING */ - { 268, -3 }, /* (86) db_options ::= db_options REPLICA NK_INTEGER */ - { 268, -3 }, /* (87) db_options ::= db_options STRICT NK_INTEGER */ - { 268, -3 }, /* (88) db_options ::= db_options WAL NK_INTEGER */ - { 268, -3 }, /* (89) db_options ::= db_options VGROUPS NK_INTEGER */ - { 268, -3 }, /* (90) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ - { 268, -3 }, /* (91) db_options ::= db_options RETENTIONS retention_list */ - { 268, -3 }, /* (92) db_options ::= db_options SCHEMALESS NK_INTEGER */ - { 270, -1 }, /* (93) alter_db_options ::= alter_db_option */ - { 270, -2 }, /* (94) alter_db_options ::= alter_db_options alter_db_option */ - { 274, -2 }, /* (95) alter_db_option ::= BUFFER NK_INTEGER */ - { 274, -2 }, /* (96) alter_db_option ::= CACHELAST NK_INTEGER */ - { 274, -2 }, /* (97) alter_db_option ::= CACHELASTSIZE NK_INTEGER */ - { 274, -2 }, /* (98) alter_db_option ::= FSYNC NK_INTEGER */ - { 274, -2 }, /* (99) alter_db_option ::= KEEP integer_list */ - { 274, -2 }, /* (100) alter_db_option ::= KEEP variable_list */ - { 274, -2 }, /* (101) alter_db_option ::= PAGES NK_INTEGER */ - { 274, -2 }, /* (102) alter_db_option ::= REPLICA NK_INTEGER */ - { 274, -2 }, /* (103) alter_db_option ::= STRICT NK_INTEGER */ - { 274, -2 }, /* (104) alter_db_option ::= WAL NK_INTEGER */ - { 271, -1 }, /* (105) integer_list ::= NK_INTEGER */ - { 271, -3 }, /* (106) integer_list ::= integer_list NK_COMMA NK_INTEGER */ - { 272, -1 }, /* (107) variable_list ::= NK_VARIABLE */ - { 272, -3 }, /* (108) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ - { 273, -1 }, /* (109) retention_list ::= retention */ - { 273, -3 }, /* (110) retention_list ::= retention_list NK_COMMA retention */ - { 275, -3 }, /* (111) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ - { 254, -9 }, /* (112) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - { 254, -3 }, /* (113) cmd ::= CREATE TABLE multi_create_clause */ - { 254, -9 }, /* (114) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ - { 254, -3 }, /* (115) cmd ::= DROP TABLE multi_drop_clause */ - { 254, -4 }, /* (116) cmd ::= DROP STABLE exists_opt full_table_name */ - { 254, -3 }, /* (117) cmd ::= ALTER TABLE alter_table_clause */ - { 254, -3 }, /* (118) cmd ::= ALTER STABLE alter_table_clause */ - { 283, -2 }, /* (119) alter_table_clause ::= full_table_name alter_table_options */ - { 283, -5 }, /* (120) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ - { 283, -4 }, /* (121) alter_table_clause ::= full_table_name DROP COLUMN column_name */ - { 283, -5 }, /* (122) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ - { 283, -5 }, /* (123) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ - { 283, -5 }, /* (124) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ - { 283, -4 }, /* (125) alter_table_clause ::= full_table_name DROP TAG column_name */ - { 283, -5 }, /* (126) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ - { 283, -5 }, /* (127) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ - { 283, -6 }, /* (128) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ - { 280, -1 }, /* (129) multi_create_clause ::= create_subtable_clause */ - { 280, -2 }, /* (130) multi_create_clause ::= multi_create_clause create_subtable_clause */ - { 288, -10 }, /* (131) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ - { 282, -1 }, /* (132) multi_drop_clause ::= drop_table_clause */ - { 282, -2 }, /* (133) multi_drop_clause ::= multi_drop_clause drop_table_clause */ - { 291, -2 }, /* (134) drop_table_clause ::= exists_opt full_table_name */ - { 289, 0 }, /* (135) specific_cols_opt ::= */ - { 289, -3 }, /* (136) specific_cols_opt ::= NK_LP col_name_list NK_RP */ - { 276, -1 }, /* (137) full_table_name ::= table_name */ - { 276, -3 }, /* (138) full_table_name ::= db_name NK_DOT table_name */ - { 277, -1 }, /* (139) column_def_list ::= column_def */ - { 277, -3 }, /* (140) column_def_list ::= column_def_list NK_COMMA column_def */ - { 294, -2 }, /* (141) column_def ::= column_name type_name */ - { 294, -4 }, /* (142) column_def ::= column_name type_name COMMENT NK_STRING */ - { 286, -1 }, /* (143) type_name ::= BOOL */ - { 286, -1 }, /* (144) type_name ::= TINYINT */ - { 286, -1 }, /* (145) type_name ::= SMALLINT */ - { 286, -1 }, /* (146) type_name ::= INT */ - { 286, -1 }, /* (147) type_name ::= INTEGER */ - { 286, -1 }, /* (148) type_name ::= BIGINT */ - { 286, -1 }, /* (149) type_name ::= FLOAT */ - { 286, -1 }, /* (150) type_name ::= DOUBLE */ - { 286, -4 }, /* (151) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 286, -1 }, /* (152) type_name ::= TIMESTAMP */ - { 286, -4 }, /* (153) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 286, -2 }, /* (154) type_name ::= TINYINT UNSIGNED */ - { 286, -2 }, /* (155) type_name ::= SMALLINT UNSIGNED */ - { 286, -2 }, /* (156) type_name ::= INT UNSIGNED */ - { 286, -2 }, /* (157) type_name ::= BIGINT UNSIGNED */ - { 286, -1 }, /* (158) type_name ::= JSON */ - { 286, -4 }, /* (159) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 286, -1 }, /* (160) type_name ::= MEDIUMBLOB */ - { 286, -1 }, /* (161) type_name ::= BLOB */ - { 286, -4 }, /* (162) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 286, -1 }, /* (163) type_name ::= DECIMAL */ - { 286, -4 }, /* (164) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 286, -6 }, /* (165) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 278, 0 }, /* (166) tags_def_opt ::= */ - { 278, -1 }, /* (167) tags_def_opt ::= tags_def */ - { 281, -4 }, /* (168) tags_def ::= TAGS NK_LP column_def_list NK_RP */ - { 279, 0 }, /* (169) table_options ::= */ - { 279, -3 }, /* (170) table_options ::= table_options COMMENT NK_STRING */ - { 279, -3 }, /* (171) table_options ::= table_options MAX_DELAY duration_list */ - { 279, -3 }, /* (172) table_options ::= table_options WATERMARK duration_list */ - { 279, -5 }, /* (173) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ - { 279, -3 }, /* (174) table_options ::= table_options TTL NK_INTEGER */ - { 279, -5 }, /* (175) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ - { 284, -1 }, /* (176) alter_table_options ::= alter_table_option */ - { 284, -2 }, /* (177) alter_table_options ::= alter_table_options alter_table_option */ - { 297, -2 }, /* (178) alter_table_option ::= COMMENT NK_STRING */ - { 297, -2 }, /* (179) alter_table_option ::= TTL NK_INTEGER */ - { 295, -1 }, /* (180) duration_list ::= duration_literal */ - { 295, -3 }, /* (181) duration_list ::= duration_list NK_COMMA duration_literal */ - { 296, -1 }, /* (182) rollup_func_list ::= rollup_func_name */ - { 296, -3 }, /* (183) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ - { 299, -1 }, /* (184) rollup_func_name ::= function_name */ - { 299, -1 }, /* (185) rollup_func_name ::= FIRST */ - { 299, -1 }, /* (186) rollup_func_name ::= LAST */ - { 292, -1 }, /* (187) col_name_list ::= col_name */ - { 292, -3 }, /* (188) col_name_list ::= col_name_list NK_COMMA col_name */ - { 301, -1 }, /* (189) col_name ::= column_name */ - { 254, -2 }, /* (190) cmd ::= SHOW DNODES */ - { 254, -2 }, /* (191) cmd ::= SHOW USERS */ - { 254, -2 }, /* (192) cmd ::= SHOW DATABASES */ - { 254, -4 }, /* (193) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ - { 254, -4 }, /* (194) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ - { 254, -3 }, /* (195) cmd ::= SHOW db_name_cond_opt VGROUPS */ - { 254, -2 }, /* (196) cmd ::= SHOW MNODES */ - { 254, -2 }, /* (197) cmd ::= SHOW MODULES */ - { 254, -2 }, /* (198) cmd ::= SHOW QNODES */ - { 254, -2 }, /* (199) cmd ::= SHOW FUNCTIONS */ - { 254, -5 }, /* (200) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ - { 254, -2 }, /* (201) cmd ::= SHOW STREAMS */ - { 254, -2 }, /* (202) cmd ::= SHOW ACCOUNTS */ - { 254, -2 }, /* (203) cmd ::= SHOW APPS */ - { 254, -2 }, /* (204) cmd ::= SHOW CONNECTIONS */ - { 254, -2 }, /* (205) cmd ::= SHOW LICENCE */ - { 254, -2 }, /* (206) cmd ::= SHOW GRANTS */ - { 254, -4 }, /* (207) cmd ::= SHOW CREATE DATABASE db_name */ - { 254, -4 }, /* (208) cmd ::= SHOW CREATE TABLE full_table_name */ - { 254, -4 }, /* (209) cmd ::= SHOW CREATE STABLE full_table_name */ - { 254, -2 }, /* (210) cmd ::= SHOW QUERIES */ - { 254, -2 }, /* (211) cmd ::= SHOW SCORES */ - { 254, -2 }, /* (212) cmd ::= SHOW TOPICS */ - { 254, -2 }, /* (213) cmd ::= SHOW VARIABLES */ - { 254, -3 }, /* (214) cmd ::= SHOW LOCAL VARIABLES */ - { 254, -4 }, /* (215) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ - { 254, -2 }, /* (216) cmd ::= SHOW BNODES */ - { 254, -2 }, /* (217) cmd ::= SHOW SNODES */ - { 254, -2 }, /* (218) cmd ::= SHOW CLUSTER */ - { 254, -2 }, /* (219) cmd ::= SHOW TRANSACTIONS */ - { 254, -4 }, /* (220) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ - { 254, -2 }, /* (221) cmd ::= SHOW CONSUMERS */ - { 254, -2 }, /* (222) cmd ::= SHOW SUBSCRIPTIONS */ - { 302, 0 }, /* (223) db_name_cond_opt ::= */ - { 302, -2 }, /* (224) db_name_cond_opt ::= db_name NK_DOT */ - { 303, 0 }, /* (225) like_pattern_opt ::= */ - { 303, -2 }, /* (226) like_pattern_opt ::= LIKE NK_STRING */ - { 304, -1 }, /* (227) table_name_cond ::= table_name */ - { 305, 0 }, /* (228) from_db_opt ::= */ - { 305, -2 }, /* (229) from_db_opt ::= FROM db_name */ - { 254, -8 }, /* (230) cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ - { 254, -4 }, /* (231) cmd ::= DROP INDEX exists_opt index_name */ - { 307, -10 }, /* (232) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ - { 307, -12 }, /* (233) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ - { 308, -1 }, /* (234) func_list ::= func */ - { 308, -3 }, /* (235) func_list ::= func_list NK_COMMA func */ - { 311, -4 }, /* (236) func ::= function_name NK_LP expression_list NK_RP */ - { 310, 0 }, /* (237) sma_stream_opt ::= */ - { 310, -3 }, /* (238) sma_stream_opt ::= stream_options WATERMARK duration_literal */ - { 310, -3 }, /* (239) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ - { 254, -6 }, /* (240) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ - { 254, -7 }, /* (241) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ - { 254, -9 }, /* (242) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - { 254, -7 }, /* (243) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - { 254, -9 }, /* (244) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ - { 254, -4 }, /* (245) cmd ::= DROP TOPIC exists_opt topic_name */ - { 254, -7 }, /* (246) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ - { 254, -2 }, /* (247) cmd ::= DESC full_table_name */ - { 254, -2 }, /* (248) cmd ::= DESCRIBE full_table_name */ - { 254, -3 }, /* (249) cmd ::= RESET QUERY CACHE */ - { 254, -4 }, /* (250) cmd ::= EXPLAIN analyze_opt explain_options query_expression */ - { 316, 0 }, /* (251) analyze_opt ::= */ - { 316, -1 }, /* (252) analyze_opt ::= ANALYZE */ - { 317, 0 }, /* (253) explain_options ::= */ - { 317, -3 }, /* (254) explain_options ::= explain_options VERBOSE NK_BOOL */ - { 317, -3 }, /* (255) explain_options ::= explain_options RATIO NK_FLOAT */ - { 254, -6 }, /* (256) cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ - { 254, -10 }, /* (257) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ - { 254, -4 }, /* (258) cmd ::= DROP FUNCTION exists_opt function_name */ - { 318, 0 }, /* (259) agg_func_opt ::= */ - { 318, -1 }, /* (260) agg_func_opt ::= AGGREGATE */ - { 319, 0 }, /* (261) bufsize_opt ::= */ - { 319, -2 }, /* (262) bufsize_opt ::= BUFSIZE NK_INTEGER */ - { 254, -8 }, /* (263) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ - { 254, -4 }, /* (264) cmd ::= DROP STREAM exists_opt stream_name */ - { 321, 0 }, /* (265) into_opt ::= */ - { 321, -2 }, /* (266) into_opt ::= INTO full_table_name */ - { 312, 0 }, /* (267) stream_options ::= */ - { 312, -3 }, /* (268) stream_options ::= stream_options TRIGGER AT_ONCE */ - { 312, -3 }, /* (269) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - { 312, -4 }, /* (270) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - { 312, -3 }, /* (271) stream_options ::= stream_options WATERMARK duration_literal */ - { 312, -3 }, /* (272) stream_options ::= stream_options IGNORE EXPIRED */ - { 254, -3 }, /* (273) cmd ::= KILL CONNECTION NK_INTEGER */ - { 254, -3 }, /* (274) cmd ::= KILL QUERY NK_STRING */ - { 254, -3 }, /* (275) cmd ::= KILL TRANSACTION NK_INTEGER */ - { 254, -2 }, /* (276) cmd ::= BALANCE VGROUP */ - { 254, -4 }, /* (277) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ - { 254, -4 }, /* (278) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ - { 254, -3 }, /* (279) cmd ::= SPLIT VGROUP NK_INTEGER */ - { 322, -2 }, /* (280) dnode_list ::= DNODE NK_INTEGER */ - { 322, -3 }, /* (281) dnode_list ::= dnode_list DNODE NK_INTEGER */ - { 254, -3 }, /* (282) cmd ::= SYNCDB db_name REPLICA */ - { 254, -4 }, /* (283) cmd ::= DELETE FROM full_table_name where_clause_opt */ - { 254, -1 }, /* (284) cmd ::= query_expression */ - { 254, -5 }, /* (285) cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ - { 257, -1 }, /* (286) literal ::= NK_INTEGER */ - { 257, -1 }, /* (287) literal ::= NK_FLOAT */ - { 257, -1 }, /* (288) literal ::= NK_STRING */ - { 257, -1 }, /* (289) literal ::= NK_BOOL */ - { 257, -2 }, /* (290) literal ::= TIMESTAMP NK_STRING */ - { 257, -1 }, /* (291) literal ::= duration_literal */ - { 257, -1 }, /* (292) literal ::= NULL */ - { 257, -1 }, /* (293) literal ::= NK_QUESTION */ - { 298, -1 }, /* (294) duration_literal ::= NK_VARIABLE */ - { 324, -1 }, /* (295) signed ::= NK_INTEGER */ - { 324, -2 }, /* (296) signed ::= NK_PLUS NK_INTEGER */ - { 324, -2 }, /* (297) signed ::= NK_MINUS NK_INTEGER */ - { 324, -1 }, /* (298) signed ::= NK_FLOAT */ - { 324, -2 }, /* (299) signed ::= NK_PLUS NK_FLOAT */ - { 324, -2 }, /* (300) signed ::= NK_MINUS NK_FLOAT */ - { 287, -1 }, /* (301) signed_literal ::= signed */ - { 287, -1 }, /* (302) signed_literal ::= NK_STRING */ - { 287, -1 }, /* (303) signed_literal ::= NK_BOOL */ - { 287, -2 }, /* (304) signed_literal ::= TIMESTAMP NK_STRING */ - { 287, -1 }, /* (305) signed_literal ::= duration_literal */ - { 287, -1 }, /* (306) signed_literal ::= NULL */ - { 287, -1 }, /* (307) signed_literal ::= literal_func */ - { 326, -1 }, /* (308) literal_list ::= signed_literal */ - { 326, -3 }, /* (309) literal_list ::= literal_list NK_COMMA signed_literal */ - { 265, -1 }, /* (310) db_name ::= NK_ID */ - { 293, -1 }, /* (311) table_name ::= NK_ID */ - { 285, -1 }, /* (312) column_name ::= NK_ID */ - { 300, -1 }, /* (313) function_name ::= NK_ID */ - { 327, -1 }, /* (314) table_alias ::= NK_ID */ - { 328, -1 }, /* (315) column_alias ::= NK_ID */ - { 259, -1 }, /* (316) user_name ::= NK_ID */ - { 306, -1 }, /* (317) index_name ::= NK_ID */ - { 313, -1 }, /* (318) topic_name ::= NK_ID */ - { 320, -1 }, /* (319) stream_name ::= NK_ID */ - { 315, -1 }, /* (320) cgroup_name ::= NK_ID */ - { 329, -1 }, /* (321) expression ::= literal */ - { 329, -1 }, /* (322) expression ::= pseudo_column */ - { 329, -1 }, /* (323) expression ::= column_reference */ - { 329, -1 }, /* (324) expression ::= function_expression */ - { 329, -1 }, /* (325) expression ::= subquery */ - { 329, -3 }, /* (326) expression ::= NK_LP expression NK_RP */ - { 329, -2 }, /* (327) expression ::= NK_PLUS expression */ - { 329, -2 }, /* (328) expression ::= NK_MINUS expression */ - { 329, -3 }, /* (329) expression ::= expression NK_PLUS expression */ - { 329, -3 }, /* (330) expression ::= expression NK_MINUS expression */ - { 329, -3 }, /* (331) expression ::= expression NK_STAR expression */ - { 329, -3 }, /* (332) expression ::= expression NK_SLASH expression */ - { 329, -3 }, /* (333) expression ::= expression NK_REM expression */ - { 329, -3 }, /* (334) expression ::= column_reference NK_ARROW NK_STRING */ - { 329, -3 }, /* (335) expression ::= expression NK_BITAND expression */ - { 329, -3 }, /* (336) expression ::= expression NK_BITOR expression */ - { 290, -1 }, /* (337) expression_list ::= expression */ - { 290, -3 }, /* (338) expression_list ::= expression_list NK_COMMA expression */ - { 331, -1 }, /* (339) column_reference ::= column_name */ - { 331, -3 }, /* (340) column_reference ::= table_name NK_DOT column_name */ - { 330, -1 }, /* (341) pseudo_column ::= ROWTS */ - { 330, -1 }, /* (342) pseudo_column ::= TBNAME */ - { 330, -3 }, /* (343) pseudo_column ::= table_name NK_DOT TBNAME */ - { 330, -1 }, /* (344) pseudo_column ::= QSTARTTS */ - { 330, -1 }, /* (345) pseudo_column ::= QENDTS */ - { 330, -1 }, /* (346) pseudo_column ::= WSTARTTS */ - { 330, -1 }, /* (347) pseudo_column ::= WENDTS */ - { 330, -1 }, /* (348) pseudo_column ::= WDURATION */ - { 332, -4 }, /* (349) function_expression ::= function_name NK_LP expression_list NK_RP */ - { 332, -4 }, /* (350) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ - { 332, -6 }, /* (351) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ - { 332, -1 }, /* (352) function_expression ::= literal_func */ - { 325, -3 }, /* (353) literal_func ::= noarg_func NK_LP NK_RP */ - { 325, -1 }, /* (354) literal_func ::= NOW */ - { 336, -1 }, /* (355) noarg_func ::= NOW */ - { 336, -1 }, /* (356) noarg_func ::= TODAY */ - { 336, -1 }, /* (357) noarg_func ::= TIMEZONE */ - { 336, -1 }, /* (358) noarg_func ::= DATABASE */ - { 336, -1 }, /* (359) noarg_func ::= CLIENT_VERSION */ - { 336, -1 }, /* (360) noarg_func ::= SERVER_VERSION */ - { 336, -1 }, /* (361) noarg_func ::= SERVER_STATUS */ - { 336, -1 }, /* (362) noarg_func ::= CURRENT_USER */ - { 336, -1 }, /* (363) noarg_func ::= USER */ - { 334, -1 }, /* (364) star_func ::= COUNT */ - { 334, -1 }, /* (365) star_func ::= FIRST */ - { 334, -1 }, /* (366) star_func ::= LAST */ - { 334, -1 }, /* (367) star_func ::= LAST_ROW */ - { 335, -1 }, /* (368) star_func_para_list ::= NK_STAR */ - { 335, -1 }, /* (369) star_func_para_list ::= other_para_list */ - { 337, -1 }, /* (370) other_para_list ::= star_func_para */ - { 337, -3 }, /* (371) other_para_list ::= other_para_list NK_COMMA star_func_para */ - { 338, -1 }, /* (372) star_func_para ::= expression */ - { 338, -3 }, /* (373) star_func_para ::= table_name NK_DOT NK_STAR */ - { 339, -3 }, /* (374) predicate ::= expression compare_op expression */ - { 339, -5 }, /* (375) predicate ::= expression BETWEEN expression AND expression */ - { 339, -6 }, /* (376) predicate ::= expression NOT BETWEEN expression AND expression */ - { 339, -3 }, /* (377) predicate ::= expression IS NULL */ - { 339, -4 }, /* (378) predicate ::= expression IS NOT NULL */ - { 339, -3 }, /* (379) predicate ::= expression in_op in_predicate_value */ - { 340, -1 }, /* (380) compare_op ::= NK_LT */ - { 340, -1 }, /* (381) compare_op ::= NK_GT */ - { 340, -1 }, /* (382) compare_op ::= NK_LE */ - { 340, -1 }, /* (383) compare_op ::= NK_GE */ - { 340, -1 }, /* (384) compare_op ::= NK_NE */ - { 340, -1 }, /* (385) compare_op ::= NK_EQ */ - { 340, -1 }, /* (386) compare_op ::= LIKE */ - { 340, -2 }, /* (387) compare_op ::= NOT LIKE */ - { 340, -1 }, /* (388) compare_op ::= MATCH */ - { 340, -1 }, /* (389) compare_op ::= NMATCH */ - { 340, -1 }, /* (390) compare_op ::= CONTAINS */ - { 341, -1 }, /* (391) in_op ::= IN */ - { 341, -2 }, /* (392) in_op ::= NOT IN */ - { 342, -3 }, /* (393) in_predicate_value ::= NK_LP literal_list NK_RP */ - { 343, -1 }, /* (394) boolean_value_expression ::= boolean_primary */ - { 343, -2 }, /* (395) boolean_value_expression ::= NOT boolean_primary */ - { 343, -3 }, /* (396) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 343, -3 }, /* (397) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 344, -1 }, /* (398) boolean_primary ::= predicate */ - { 344, -3 }, /* (399) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 345, -1 }, /* (400) common_expression ::= expression */ - { 345, -1 }, /* (401) common_expression ::= boolean_value_expression */ - { 346, 0 }, /* (402) from_clause_opt ::= */ - { 346, -2 }, /* (403) from_clause_opt ::= FROM table_reference_list */ - { 347, -1 }, /* (404) table_reference_list ::= table_reference */ - { 347, -3 }, /* (405) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 348, -1 }, /* (406) table_reference ::= table_primary */ - { 348, -1 }, /* (407) table_reference ::= joined_table */ - { 349, -2 }, /* (408) table_primary ::= table_name alias_opt */ - { 349, -4 }, /* (409) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 349, -2 }, /* (410) table_primary ::= subquery alias_opt */ - { 349, -1 }, /* (411) table_primary ::= parenthesized_joined_table */ - { 351, 0 }, /* (412) alias_opt ::= */ - { 351, -1 }, /* (413) alias_opt ::= table_alias */ - { 351, -2 }, /* (414) alias_opt ::= AS table_alias */ - { 352, -3 }, /* (415) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 352, -3 }, /* (416) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 350, -6 }, /* (417) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 353, 0 }, /* (418) join_type ::= */ - { 353, -1 }, /* (419) join_type ::= INNER */ - { 355, -12 }, /* (420) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ - { 356, 0 }, /* (421) set_quantifier_opt ::= */ - { 356, -1 }, /* (422) set_quantifier_opt ::= DISTINCT */ - { 356, -1 }, /* (423) set_quantifier_opt ::= ALL */ - { 357, -1 }, /* (424) select_list ::= select_item */ - { 357, -3 }, /* (425) select_list ::= select_list NK_COMMA select_item */ - { 365, -1 }, /* (426) select_item ::= NK_STAR */ - { 365, -1 }, /* (427) select_item ::= common_expression */ - { 365, -2 }, /* (428) select_item ::= common_expression column_alias */ - { 365, -3 }, /* (429) select_item ::= common_expression AS column_alias */ - { 365, -3 }, /* (430) select_item ::= table_name NK_DOT NK_STAR */ - { 323, 0 }, /* (431) where_clause_opt ::= */ - { 323, -2 }, /* (432) where_clause_opt ::= WHERE search_condition */ - { 358, 0 }, /* (433) partition_by_clause_opt ::= */ - { 358, -3 }, /* (434) partition_by_clause_opt ::= PARTITION BY expression_list */ - { 362, 0 }, /* (435) twindow_clause_opt ::= */ - { 362, -6 }, /* (436) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ - { 362, -4 }, /* (437) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ - { 362, -6 }, /* (438) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 362, -8 }, /* (439) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 309, 0 }, /* (440) sliding_opt ::= */ - { 309, -4 }, /* (441) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 361, 0 }, /* (442) fill_opt ::= */ - { 361, -4 }, /* (443) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 361, -6 }, /* (444) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 366, -1 }, /* (445) fill_mode ::= NONE */ - { 366, -1 }, /* (446) fill_mode ::= PREV */ - { 366, -1 }, /* (447) fill_mode ::= NULL */ - { 366, -1 }, /* (448) fill_mode ::= LINEAR */ - { 366, -1 }, /* (449) fill_mode ::= NEXT */ - { 363, 0 }, /* (450) group_by_clause_opt ::= */ - { 363, -3 }, /* (451) group_by_clause_opt ::= GROUP BY group_by_list */ - { 367, -1 }, /* (452) group_by_list ::= expression */ - { 367, -3 }, /* (453) group_by_list ::= group_by_list NK_COMMA expression */ - { 364, 0 }, /* (454) having_clause_opt ::= */ - { 364, -2 }, /* (455) having_clause_opt ::= HAVING search_condition */ - { 359, 0 }, /* (456) range_opt ::= */ - { 359, -6 }, /* (457) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ - { 360, 0 }, /* (458) every_opt ::= */ - { 360, -4 }, /* (459) every_opt ::= EVERY NK_LP duration_literal NK_RP */ - { 314, -4 }, /* (460) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 368, -1 }, /* (461) query_expression_body ::= query_primary */ - { 368, -4 }, /* (462) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 368, -3 }, /* (463) query_expression_body ::= query_expression_body UNION query_expression_body */ - { 372, -1 }, /* (464) query_primary ::= query_specification */ - { 372, -6 }, /* (465) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ - { 369, 0 }, /* (466) order_by_clause_opt ::= */ - { 369, -3 }, /* (467) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 370, 0 }, /* (468) slimit_clause_opt ::= */ - { 370, -2 }, /* (469) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 370, -4 }, /* (470) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 370, -4 }, /* (471) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 371, 0 }, /* (472) limit_clause_opt ::= */ - { 371, -2 }, /* (473) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 371, -4 }, /* (474) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 371, -4 }, /* (475) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 333, -3 }, /* (476) subquery ::= NK_LP query_expression NK_RP */ - { 354, -1 }, /* (477) search_condition ::= common_expression */ - { 373, -1 }, /* (478) sort_specification_list ::= sort_specification */ - { 373, -3 }, /* (479) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 374, -3 }, /* (480) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ - { 375, 0 }, /* (481) ordering_specification_opt ::= */ - { 375, -1 }, /* (482) ordering_specification_opt ::= ASC */ - { 375, -1 }, /* (483) ordering_specification_opt ::= DESC */ - { 376, 0 }, /* (484) null_ordering_opt ::= */ - { 376, -2 }, /* (485) null_ordering_opt ::= NULLS FIRST */ - { 376, -2 }, /* (486) null_ordering_opt ::= NULLS LAST */ + { 255, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ + { 255, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ + { 256, 0 }, /* (2) account_options ::= */ + { 256, -3 }, /* (3) account_options ::= account_options PPS literal */ + { 256, -3 }, /* (4) account_options ::= account_options TSERIES literal */ + { 256, -3 }, /* (5) account_options ::= account_options STORAGE literal */ + { 256, -3 }, /* (6) account_options ::= account_options STREAMS literal */ + { 256, -3 }, /* (7) account_options ::= account_options QTIME literal */ + { 256, -3 }, /* (8) account_options ::= account_options DBS literal */ + { 256, -3 }, /* (9) account_options ::= account_options USERS literal */ + { 256, -3 }, /* (10) account_options ::= account_options CONNS literal */ + { 256, -3 }, /* (11) account_options ::= account_options STATE literal */ + { 257, -1 }, /* (12) alter_account_options ::= alter_account_option */ + { 257, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ + { 259, -2 }, /* (14) alter_account_option ::= PASS literal */ + { 259, -2 }, /* (15) alter_account_option ::= PPS literal */ + { 259, -2 }, /* (16) alter_account_option ::= TSERIES literal */ + { 259, -2 }, /* (17) alter_account_option ::= STORAGE literal */ + { 259, -2 }, /* (18) alter_account_option ::= STREAMS literal */ + { 259, -2 }, /* (19) alter_account_option ::= QTIME literal */ + { 259, -2 }, /* (20) alter_account_option ::= DBS literal */ + { 259, -2 }, /* (21) alter_account_option ::= USERS literal */ + { 259, -2 }, /* (22) alter_account_option ::= CONNS literal */ + { 259, -2 }, /* (23) alter_account_option ::= STATE literal */ + { 255, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ + { 255, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ + { 255, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ + { 255, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ + { 255, -3 }, /* (28) cmd ::= DROP USER user_name */ + { 261, 0 }, /* (29) sysinfo_opt ::= */ + { 261, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ + { 255, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ + { 255, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ + { 262, -1 }, /* (33) privileges ::= ALL */ + { 262, -1 }, /* (34) privileges ::= priv_type_list */ + { 264, -1 }, /* (35) priv_type_list ::= priv_type */ + { 264, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ + { 265, -1 }, /* (37) priv_type ::= READ */ + { 265, -1 }, /* (38) priv_type ::= WRITE */ + { 263, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ + { 263, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ + { 255, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ + { 255, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ + { 255, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ + { 255, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ + { 255, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ + { 255, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ + { 255, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ + { 255, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ + { 267, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ + { 267, -1 }, /* (50) dnode_endpoint ::= NK_ID */ + { 267, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ + { 255, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ + { 255, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ + { 255, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ + { 255, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ + { 255, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ + { 255, -2 }, /* (64) cmd ::= USE db_name */ + { 255, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ + { 255, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ + { 255, -3 }, /* (67) cmd ::= TRIM DATABASE db_name */ + { 268, -3 }, /* (68) not_exists_opt ::= IF NOT EXISTS */ + { 268, 0 }, /* (69) not_exists_opt ::= */ + { 270, -2 }, /* (70) exists_opt ::= IF EXISTS */ + { 270, 0 }, /* (71) exists_opt ::= */ + { 269, 0 }, /* (72) db_options ::= */ + { 269, -3 }, /* (73) db_options ::= db_options BUFFER NK_INTEGER */ + { 269, -3 }, /* (74) db_options ::= db_options CACHELAST NK_INTEGER */ + { 269, -3 }, /* (75) db_options ::= db_options CACHELASTSIZE NK_INTEGER */ + { 269, -3 }, /* (76) db_options ::= db_options COMP NK_INTEGER */ + { 269, -3 }, /* (77) db_options ::= db_options DURATION NK_INTEGER */ + { 269, -3 }, /* (78) db_options ::= db_options DURATION NK_VARIABLE */ + { 269, -3 }, /* (79) db_options ::= db_options FSYNC NK_INTEGER */ + { 269, -3 }, /* (80) db_options ::= db_options MAXROWS NK_INTEGER */ + { 269, -3 }, /* (81) db_options ::= db_options MINROWS NK_INTEGER */ + { 269, -3 }, /* (82) db_options ::= db_options KEEP integer_list */ + { 269, -3 }, /* (83) db_options ::= db_options KEEP variable_list */ + { 269, -3 }, /* (84) db_options ::= db_options PAGES NK_INTEGER */ + { 269, -3 }, /* (85) db_options ::= db_options PAGESIZE NK_INTEGER */ + { 269, -3 }, /* (86) db_options ::= db_options PRECISION NK_STRING */ + { 269, -3 }, /* (87) db_options ::= db_options REPLICA NK_INTEGER */ + { 269, -3 }, /* (88) db_options ::= db_options STRICT NK_INTEGER */ + { 269, -3 }, /* (89) db_options ::= db_options WAL NK_INTEGER */ + { 269, -3 }, /* (90) db_options ::= db_options VGROUPS NK_INTEGER */ + { 269, -3 }, /* (91) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ + { 269, -3 }, /* (92) db_options ::= db_options RETENTIONS retention_list */ + { 269, -3 }, /* (93) db_options ::= db_options SCHEMALESS NK_INTEGER */ + { 271, -1 }, /* (94) alter_db_options ::= alter_db_option */ + { 271, -2 }, /* (95) alter_db_options ::= alter_db_options alter_db_option */ + { 275, -2 }, /* (96) alter_db_option ::= BUFFER NK_INTEGER */ + { 275, -2 }, /* (97) alter_db_option ::= CACHELAST NK_INTEGER */ + { 275, -2 }, /* (98) alter_db_option ::= CACHELASTSIZE NK_INTEGER */ + { 275, -2 }, /* (99) alter_db_option ::= FSYNC NK_INTEGER */ + { 275, -2 }, /* (100) alter_db_option ::= KEEP integer_list */ + { 275, -2 }, /* (101) alter_db_option ::= KEEP variable_list */ + { 275, -2 }, /* (102) alter_db_option ::= PAGES NK_INTEGER */ + { 275, -2 }, /* (103) alter_db_option ::= REPLICA NK_INTEGER */ + { 275, -2 }, /* (104) alter_db_option ::= STRICT NK_INTEGER */ + { 275, -2 }, /* (105) alter_db_option ::= WAL NK_INTEGER */ + { 272, -1 }, /* (106) integer_list ::= NK_INTEGER */ + { 272, -3 }, /* (107) integer_list ::= integer_list NK_COMMA NK_INTEGER */ + { 273, -1 }, /* (108) variable_list ::= NK_VARIABLE */ + { 273, -3 }, /* (109) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ + { 274, -1 }, /* (110) retention_list ::= retention */ + { 274, -3 }, /* (111) retention_list ::= retention_list NK_COMMA retention */ + { 276, -3 }, /* (112) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ + { 255, -9 }, /* (113) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + { 255, -3 }, /* (114) cmd ::= CREATE TABLE multi_create_clause */ + { 255, -9 }, /* (115) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ + { 255, -3 }, /* (116) cmd ::= DROP TABLE multi_drop_clause */ + { 255, -4 }, /* (117) cmd ::= DROP STABLE exists_opt full_table_name */ + { 255, -3 }, /* (118) cmd ::= ALTER TABLE alter_table_clause */ + { 255, -3 }, /* (119) cmd ::= ALTER STABLE alter_table_clause */ + { 284, -2 }, /* (120) alter_table_clause ::= full_table_name alter_table_options */ + { 284, -5 }, /* (121) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + { 284, -4 }, /* (122) alter_table_clause ::= full_table_name DROP COLUMN column_name */ + { 284, -5 }, /* (123) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + { 284, -5 }, /* (124) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + { 284, -5 }, /* (125) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + { 284, -4 }, /* (126) alter_table_clause ::= full_table_name DROP TAG column_name */ + { 284, -5 }, /* (127) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + { 284, -5 }, /* (128) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + { 284, -6 }, /* (129) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ + { 281, -1 }, /* (130) multi_create_clause ::= create_subtable_clause */ + { 281, -2 }, /* (131) multi_create_clause ::= multi_create_clause create_subtable_clause */ + { 289, -10 }, /* (132) 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 */ + { 283, -1 }, /* (133) multi_drop_clause ::= drop_table_clause */ + { 283, -2 }, /* (134) multi_drop_clause ::= multi_drop_clause drop_table_clause */ + { 292, -2 }, /* (135) drop_table_clause ::= exists_opt full_table_name */ + { 290, 0 }, /* (136) specific_cols_opt ::= */ + { 290, -3 }, /* (137) specific_cols_opt ::= NK_LP col_name_list NK_RP */ + { 277, -1 }, /* (138) full_table_name ::= table_name */ + { 277, -3 }, /* (139) full_table_name ::= db_name NK_DOT table_name */ + { 278, -1 }, /* (140) column_def_list ::= column_def */ + { 278, -3 }, /* (141) column_def_list ::= column_def_list NK_COMMA column_def */ + { 295, -2 }, /* (142) column_def ::= column_name type_name */ + { 295, -4 }, /* (143) column_def ::= column_name type_name COMMENT NK_STRING */ + { 287, -1 }, /* (144) type_name ::= BOOL */ + { 287, -1 }, /* (145) type_name ::= TINYINT */ + { 287, -1 }, /* (146) type_name ::= SMALLINT */ + { 287, -1 }, /* (147) type_name ::= INT */ + { 287, -1 }, /* (148) type_name ::= INTEGER */ + { 287, -1 }, /* (149) type_name ::= BIGINT */ + { 287, -1 }, /* (150) type_name ::= FLOAT */ + { 287, -1 }, /* (151) type_name ::= DOUBLE */ + { 287, -4 }, /* (152) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 287, -1 }, /* (153) type_name ::= TIMESTAMP */ + { 287, -4 }, /* (154) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 287, -2 }, /* (155) type_name ::= TINYINT UNSIGNED */ + { 287, -2 }, /* (156) type_name ::= SMALLINT UNSIGNED */ + { 287, -2 }, /* (157) type_name ::= INT UNSIGNED */ + { 287, -2 }, /* (158) type_name ::= BIGINT UNSIGNED */ + { 287, -1 }, /* (159) type_name ::= JSON */ + { 287, -4 }, /* (160) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 287, -1 }, /* (161) type_name ::= MEDIUMBLOB */ + { 287, -1 }, /* (162) type_name ::= BLOB */ + { 287, -4 }, /* (163) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 287, -1 }, /* (164) type_name ::= DECIMAL */ + { 287, -4 }, /* (165) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 287, -6 }, /* (166) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 279, 0 }, /* (167) tags_def_opt ::= */ + { 279, -1 }, /* (168) tags_def_opt ::= tags_def */ + { 282, -4 }, /* (169) tags_def ::= TAGS NK_LP column_def_list NK_RP */ + { 280, 0 }, /* (170) table_options ::= */ + { 280, -3 }, /* (171) table_options ::= table_options COMMENT NK_STRING */ + { 280, -3 }, /* (172) table_options ::= table_options MAX_DELAY duration_list */ + { 280, -3 }, /* (173) table_options ::= table_options WATERMARK duration_list */ + { 280, -5 }, /* (174) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ + { 280, -3 }, /* (175) table_options ::= table_options TTL NK_INTEGER */ + { 280, -5 }, /* (176) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + { 285, -1 }, /* (177) alter_table_options ::= alter_table_option */ + { 285, -2 }, /* (178) alter_table_options ::= alter_table_options alter_table_option */ + { 298, -2 }, /* (179) alter_table_option ::= COMMENT NK_STRING */ + { 298, -2 }, /* (180) alter_table_option ::= TTL NK_INTEGER */ + { 296, -1 }, /* (181) duration_list ::= duration_literal */ + { 296, -3 }, /* (182) duration_list ::= duration_list NK_COMMA duration_literal */ + { 297, -1 }, /* (183) rollup_func_list ::= rollup_func_name */ + { 297, -3 }, /* (184) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ + { 300, -1 }, /* (185) rollup_func_name ::= function_name */ + { 300, -1 }, /* (186) rollup_func_name ::= FIRST */ + { 300, -1 }, /* (187) rollup_func_name ::= LAST */ + { 293, -1 }, /* (188) col_name_list ::= col_name */ + { 293, -3 }, /* (189) col_name_list ::= col_name_list NK_COMMA col_name */ + { 302, -1 }, /* (190) col_name ::= column_name */ + { 255, -2 }, /* (191) cmd ::= SHOW DNODES */ + { 255, -2 }, /* (192) cmd ::= SHOW USERS */ + { 255, -2 }, /* (193) cmd ::= SHOW DATABASES */ + { 255, -4 }, /* (194) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ + { 255, -4 }, /* (195) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ + { 255, -3 }, /* (196) cmd ::= SHOW db_name_cond_opt VGROUPS */ + { 255, -2 }, /* (197) cmd ::= SHOW MNODES */ + { 255, -2 }, /* (198) cmd ::= SHOW MODULES */ + { 255, -2 }, /* (199) cmd ::= SHOW QNODES */ + { 255, -2 }, /* (200) cmd ::= SHOW FUNCTIONS */ + { 255, -5 }, /* (201) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ + { 255, -2 }, /* (202) cmd ::= SHOW STREAMS */ + { 255, -2 }, /* (203) cmd ::= SHOW ACCOUNTS */ + { 255, -2 }, /* (204) cmd ::= SHOW APPS */ + { 255, -2 }, /* (205) cmd ::= SHOW CONNECTIONS */ + { 255, -2 }, /* (206) cmd ::= SHOW LICENCE */ + { 255, -2 }, /* (207) cmd ::= SHOW GRANTS */ + { 255, -4 }, /* (208) cmd ::= SHOW CREATE DATABASE db_name */ + { 255, -4 }, /* (209) cmd ::= SHOW CREATE TABLE full_table_name */ + { 255, -4 }, /* (210) cmd ::= SHOW CREATE STABLE full_table_name */ + { 255, -2 }, /* (211) cmd ::= SHOW QUERIES */ + { 255, -2 }, /* (212) cmd ::= SHOW SCORES */ + { 255, -2 }, /* (213) cmd ::= SHOW TOPICS */ + { 255, -2 }, /* (214) cmd ::= SHOW VARIABLES */ + { 255, -3 }, /* (215) cmd ::= SHOW LOCAL VARIABLES */ + { 255, -4 }, /* (216) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + { 255, -2 }, /* (217) cmd ::= SHOW BNODES */ + { 255, -2 }, /* (218) cmd ::= SHOW SNODES */ + { 255, -2 }, /* (219) cmd ::= SHOW CLUSTER */ + { 255, -2 }, /* (220) cmd ::= SHOW TRANSACTIONS */ + { 255, -4 }, /* (221) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ + { 255, -2 }, /* (222) cmd ::= SHOW CONSUMERS */ + { 255, -2 }, /* (223) cmd ::= SHOW SUBSCRIPTIONS */ + { 303, 0 }, /* (224) db_name_cond_opt ::= */ + { 303, -2 }, /* (225) db_name_cond_opt ::= db_name NK_DOT */ + { 304, 0 }, /* (226) like_pattern_opt ::= */ + { 304, -2 }, /* (227) like_pattern_opt ::= LIKE NK_STRING */ + { 305, -1 }, /* (228) table_name_cond ::= table_name */ + { 306, 0 }, /* (229) from_db_opt ::= */ + { 306, -2 }, /* (230) from_db_opt ::= FROM db_name */ + { 255, -8 }, /* (231) cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ + { 255, -4 }, /* (232) cmd ::= DROP INDEX exists_opt index_name */ + { 308, -10 }, /* (233) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ + { 308, -12 }, /* (234) 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 */ + { 309, -1 }, /* (235) func_list ::= func */ + { 309, -3 }, /* (236) func_list ::= func_list NK_COMMA func */ + { 312, -4 }, /* (237) func ::= function_name NK_LP expression_list NK_RP */ + { 311, 0 }, /* (238) sma_stream_opt ::= */ + { 311, -3 }, /* (239) sma_stream_opt ::= stream_options WATERMARK duration_literal */ + { 311, -3 }, /* (240) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ + { 255, -6 }, /* (241) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ + { 255, -7 }, /* (242) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ + { 255, -9 }, /* (243) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ + { 255, -7 }, /* (244) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ + { 255, -9 }, /* (245) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + { 255, -4 }, /* (246) cmd ::= DROP TOPIC exists_opt topic_name */ + { 255, -7 }, /* (247) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ + { 255, -2 }, /* (248) cmd ::= DESC full_table_name */ + { 255, -2 }, /* (249) cmd ::= DESCRIBE full_table_name */ + { 255, -3 }, /* (250) cmd ::= RESET QUERY CACHE */ + { 255, -4 }, /* (251) cmd ::= EXPLAIN analyze_opt explain_options query_expression */ + { 317, 0 }, /* (252) analyze_opt ::= */ + { 317, -1 }, /* (253) analyze_opt ::= ANALYZE */ + { 318, 0 }, /* (254) explain_options ::= */ + { 318, -3 }, /* (255) explain_options ::= explain_options VERBOSE NK_BOOL */ + { 318, -3 }, /* (256) explain_options ::= explain_options RATIO NK_FLOAT */ + { 255, -6 }, /* (257) cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ + { 255, -10 }, /* (258) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ + { 255, -4 }, /* (259) cmd ::= DROP FUNCTION exists_opt function_name */ + { 319, 0 }, /* (260) agg_func_opt ::= */ + { 319, -1 }, /* (261) agg_func_opt ::= AGGREGATE */ + { 320, 0 }, /* (262) bufsize_opt ::= */ + { 320, -2 }, /* (263) bufsize_opt ::= BUFSIZE NK_INTEGER */ + { 255, -8 }, /* (264) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ + { 255, -4 }, /* (265) cmd ::= DROP STREAM exists_opt stream_name */ + { 322, 0 }, /* (266) into_opt ::= */ + { 322, -2 }, /* (267) into_opt ::= INTO full_table_name */ + { 313, 0 }, /* (268) stream_options ::= */ + { 313, -3 }, /* (269) stream_options ::= stream_options TRIGGER AT_ONCE */ + { 313, -3 }, /* (270) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + { 313, -4 }, /* (271) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + { 313, -3 }, /* (272) stream_options ::= stream_options WATERMARK duration_literal */ + { 313, -3 }, /* (273) stream_options ::= stream_options IGNORE EXPIRED */ + { 255, -3 }, /* (274) cmd ::= KILL CONNECTION NK_INTEGER */ + { 255, -3 }, /* (275) cmd ::= KILL QUERY NK_STRING */ + { 255, -3 }, /* (276) cmd ::= KILL TRANSACTION NK_INTEGER */ + { 255, -2 }, /* (277) cmd ::= BALANCE VGROUP */ + { 255, -4 }, /* (278) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + { 255, -4 }, /* (279) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + { 255, -3 }, /* (280) cmd ::= SPLIT VGROUP NK_INTEGER */ + { 323, -2 }, /* (281) dnode_list ::= DNODE NK_INTEGER */ + { 323, -3 }, /* (282) dnode_list ::= dnode_list DNODE NK_INTEGER */ + { 255, -3 }, /* (283) cmd ::= SYNCDB db_name REPLICA */ + { 255, -4 }, /* (284) cmd ::= DELETE FROM full_table_name where_clause_opt */ + { 255, -1 }, /* (285) cmd ::= query_expression */ + { 255, -5 }, /* (286) cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ + { 258, -1 }, /* (287) literal ::= NK_INTEGER */ + { 258, -1 }, /* (288) literal ::= NK_FLOAT */ + { 258, -1 }, /* (289) literal ::= NK_STRING */ + { 258, -1 }, /* (290) literal ::= NK_BOOL */ + { 258, -2 }, /* (291) literal ::= TIMESTAMP NK_STRING */ + { 258, -1 }, /* (292) literal ::= duration_literal */ + { 258, -1 }, /* (293) literal ::= NULL */ + { 258, -1 }, /* (294) literal ::= NK_QUESTION */ + { 299, -1 }, /* (295) duration_literal ::= NK_VARIABLE */ + { 325, -1 }, /* (296) signed ::= NK_INTEGER */ + { 325, -2 }, /* (297) signed ::= NK_PLUS NK_INTEGER */ + { 325, -2 }, /* (298) signed ::= NK_MINUS NK_INTEGER */ + { 325, -1 }, /* (299) signed ::= NK_FLOAT */ + { 325, -2 }, /* (300) signed ::= NK_PLUS NK_FLOAT */ + { 325, -2 }, /* (301) signed ::= NK_MINUS NK_FLOAT */ + { 288, -1 }, /* (302) signed_literal ::= signed */ + { 288, -1 }, /* (303) signed_literal ::= NK_STRING */ + { 288, -1 }, /* (304) signed_literal ::= NK_BOOL */ + { 288, -2 }, /* (305) signed_literal ::= TIMESTAMP NK_STRING */ + { 288, -1 }, /* (306) signed_literal ::= duration_literal */ + { 288, -1 }, /* (307) signed_literal ::= NULL */ + { 288, -1 }, /* (308) signed_literal ::= literal_func */ + { 327, -1 }, /* (309) literal_list ::= signed_literal */ + { 327, -3 }, /* (310) literal_list ::= literal_list NK_COMMA signed_literal */ + { 266, -1 }, /* (311) db_name ::= NK_ID */ + { 294, -1 }, /* (312) table_name ::= NK_ID */ + { 286, -1 }, /* (313) column_name ::= NK_ID */ + { 301, -1 }, /* (314) function_name ::= NK_ID */ + { 328, -1 }, /* (315) table_alias ::= NK_ID */ + { 329, -1 }, /* (316) column_alias ::= NK_ID */ + { 260, -1 }, /* (317) user_name ::= NK_ID */ + { 307, -1 }, /* (318) index_name ::= NK_ID */ + { 314, -1 }, /* (319) topic_name ::= NK_ID */ + { 321, -1 }, /* (320) stream_name ::= NK_ID */ + { 316, -1 }, /* (321) cgroup_name ::= NK_ID */ + { 330, -1 }, /* (322) expression ::= literal */ + { 330, -1 }, /* (323) expression ::= pseudo_column */ + { 330, -1 }, /* (324) expression ::= column_reference */ + { 330, -1 }, /* (325) expression ::= function_expression */ + { 330, -1 }, /* (326) expression ::= subquery */ + { 330, -3 }, /* (327) expression ::= NK_LP expression NK_RP */ + { 330, -2 }, /* (328) expression ::= NK_PLUS expression */ + { 330, -2 }, /* (329) expression ::= NK_MINUS expression */ + { 330, -3 }, /* (330) expression ::= expression NK_PLUS expression */ + { 330, -3 }, /* (331) expression ::= expression NK_MINUS expression */ + { 330, -3 }, /* (332) expression ::= expression NK_STAR expression */ + { 330, -3 }, /* (333) expression ::= expression NK_SLASH expression */ + { 330, -3 }, /* (334) expression ::= expression NK_REM expression */ + { 330, -3 }, /* (335) expression ::= column_reference NK_ARROW NK_STRING */ + { 330, -3 }, /* (336) expression ::= expression NK_BITAND expression */ + { 330, -3 }, /* (337) expression ::= expression NK_BITOR expression */ + { 291, -1 }, /* (338) expression_list ::= expression */ + { 291, -3 }, /* (339) expression_list ::= expression_list NK_COMMA expression */ + { 332, -1 }, /* (340) column_reference ::= column_name */ + { 332, -3 }, /* (341) column_reference ::= table_name NK_DOT column_name */ + { 331, -1 }, /* (342) pseudo_column ::= ROWTS */ + { 331, -1 }, /* (343) pseudo_column ::= TBNAME */ + { 331, -3 }, /* (344) pseudo_column ::= table_name NK_DOT TBNAME */ + { 331, -1 }, /* (345) pseudo_column ::= QSTARTTS */ + { 331, -1 }, /* (346) pseudo_column ::= QENDTS */ + { 331, -1 }, /* (347) pseudo_column ::= WSTARTTS */ + { 331, -1 }, /* (348) pseudo_column ::= WENDTS */ + { 331, -1 }, /* (349) pseudo_column ::= WDURATION */ + { 333, -4 }, /* (350) function_expression ::= function_name NK_LP expression_list NK_RP */ + { 333, -4 }, /* (351) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ + { 333, -6 }, /* (352) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ + { 333, -1 }, /* (353) function_expression ::= literal_func */ + { 326, -3 }, /* (354) literal_func ::= noarg_func NK_LP NK_RP */ + { 326, -1 }, /* (355) literal_func ::= NOW */ + { 337, -1 }, /* (356) noarg_func ::= NOW */ + { 337, -1 }, /* (357) noarg_func ::= TODAY */ + { 337, -1 }, /* (358) noarg_func ::= TIMEZONE */ + { 337, -1 }, /* (359) noarg_func ::= DATABASE */ + { 337, -1 }, /* (360) noarg_func ::= CLIENT_VERSION */ + { 337, -1 }, /* (361) noarg_func ::= SERVER_VERSION */ + { 337, -1 }, /* (362) noarg_func ::= SERVER_STATUS */ + { 337, -1 }, /* (363) noarg_func ::= CURRENT_USER */ + { 337, -1 }, /* (364) noarg_func ::= USER */ + { 335, -1 }, /* (365) star_func ::= COUNT */ + { 335, -1 }, /* (366) star_func ::= FIRST */ + { 335, -1 }, /* (367) star_func ::= LAST */ + { 335, -1 }, /* (368) star_func ::= LAST_ROW */ + { 336, -1 }, /* (369) star_func_para_list ::= NK_STAR */ + { 336, -1 }, /* (370) star_func_para_list ::= other_para_list */ + { 338, -1 }, /* (371) other_para_list ::= star_func_para */ + { 338, -3 }, /* (372) other_para_list ::= other_para_list NK_COMMA star_func_para */ + { 339, -1 }, /* (373) star_func_para ::= expression */ + { 339, -3 }, /* (374) star_func_para ::= table_name NK_DOT NK_STAR */ + { 340, -3 }, /* (375) predicate ::= expression compare_op expression */ + { 340, -5 }, /* (376) predicate ::= expression BETWEEN expression AND expression */ + { 340, -6 }, /* (377) predicate ::= expression NOT BETWEEN expression AND expression */ + { 340, -3 }, /* (378) predicate ::= expression IS NULL */ + { 340, -4 }, /* (379) predicate ::= expression IS NOT NULL */ + { 340, -3 }, /* (380) predicate ::= expression in_op in_predicate_value */ + { 341, -1 }, /* (381) compare_op ::= NK_LT */ + { 341, -1 }, /* (382) compare_op ::= NK_GT */ + { 341, -1 }, /* (383) compare_op ::= NK_LE */ + { 341, -1 }, /* (384) compare_op ::= NK_GE */ + { 341, -1 }, /* (385) compare_op ::= NK_NE */ + { 341, -1 }, /* (386) compare_op ::= NK_EQ */ + { 341, -1 }, /* (387) compare_op ::= LIKE */ + { 341, -2 }, /* (388) compare_op ::= NOT LIKE */ + { 341, -1 }, /* (389) compare_op ::= MATCH */ + { 341, -1 }, /* (390) compare_op ::= NMATCH */ + { 341, -1 }, /* (391) compare_op ::= CONTAINS */ + { 342, -1 }, /* (392) in_op ::= IN */ + { 342, -2 }, /* (393) in_op ::= NOT IN */ + { 343, -3 }, /* (394) in_predicate_value ::= NK_LP literal_list NK_RP */ + { 344, -1 }, /* (395) boolean_value_expression ::= boolean_primary */ + { 344, -2 }, /* (396) boolean_value_expression ::= NOT boolean_primary */ + { 344, -3 }, /* (397) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 344, -3 }, /* (398) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 345, -1 }, /* (399) boolean_primary ::= predicate */ + { 345, -3 }, /* (400) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 346, -1 }, /* (401) common_expression ::= expression */ + { 346, -1 }, /* (402) common_expression ::= boolean_value_expression */ + { 347, 0 }, /* (403) from_clause_opt ::= */ + { 347, -2 }, /* (404) from_clause_opt ::= FROM table_reference_list */ + { 348, -1 }, /* (405) table_reference_list ::= table_reference */ + { 348, -3 }, /* (406) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 349, -1 }, /* (407) table_reference ::= table_primary */ + { 349, -1 }, /* (408) table_reference ::= joined_table */ + { 350, -2 }, /* (409) table_primary ::= table_name alias_opt */ + { 350, -4 }, /* (410) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 350, -2 }, /* (411) table_primary ::= subquery alias_opt */ + { 350, -1 }, /* (412) table_primary ::= parenthesized_joined_table */ + { 352, 0 }, /* (413) alias_opt ::= */ + { 352, -1 }, /* (414) alias_opt ::= table_alias */ + { 352, -2 }, /* (415) alias_opt ::= AS table_alias */ + { 353, -3 }, /* (416) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 353, -3 }, /* (417) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 351, -6 }, /* (418) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 354, 0 }, /* (419) join_type ::= */ + { 354, -1 }, /* (420) join_type ::= INNER */ + { 356, -12 }, /* (421) 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 */ + { 357, 0 }, /* (422) set_quantifier_opt ::= */ + { 357, -1 }, /* (423) set_quantifier_opt ::= DISTINCT */ + { 357, -1 }, /* (424) set_quantifier_opt ::= ALL */ + { 358, -1 }, /* (425) select_list ::= select_item */ + { 358, -3 }, /* (426) select_list ::= select_list NK_COMMA select_item */ + { 366, -1 }, /* (427) select_item ::= NK_STAR */ + { 366, -1 }, /* (428) select_item ::= common_expression */ + { 366, -2 }, /* (429) select_item ::= common_expression column_alias */ + { 366, -3 }, /* (430) select_item ::= common_expression AS column_alias */ + { 366, -3 }, /* (431) select_item ::= table_name NK_DOT NK_STAR */ + { 324, 0 }, /* (432) where_clause_opt ::= */ + { 324, -2 }, /* (433) where_clause_opt ::= WHERE search_condition */ + { 359, 0 }, /* (434) partition_by_clause_opt ::= */ + { 359, -3 }, /* (435) partition_by_clause_opt ::= PARTITION BY expression_list */ + { 363, 0 }, /* (436) twindow_clause_opt ::= */ + { 363, -6 }, /* (437) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + { 363, -4 }, /* (438) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ + { 363, -6 }, /* (439) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 363, -8 }, /* (440) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 310, 0 }, /* (441) sliding_opt ::= */ + { 310, -4 }, /* (442) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 362, 0 }, /* (443) fill_opt ::= */ + { 362, -4 }, /* (444) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 362, -6 }, /* (445) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 367, -1 }, /* (446) fill_mode ::= NONE */ + { 367, -1 }, /* (447) fill_mode ::= PREV */ + { 367, -1 }, /* (448) fill_mode ::= NULL */ + { 367, -1 }, /* (449) fill_mode ::= LINEAR */ + { 367, -1 }, /* (450) fill_mode ::= NEXT */ + { 364, 0 }, /* (451) group_by_clause_opt ::= */ + { 364, -3 }, /* (452) group_by_clause_opt ::= GROUP BY group_by_list */ + { 368, -1 }, /* (453) group_by_list ::= expression */ + { 368, -3 }, /* (454) group_by_list ::= group_by_list NK_COMMA expression */ + { 365, 0 }, /* (455) having_clause_opt ::= */ + { 365, -2 }, /* (456) having_clause_opt ::= HAVING search_condition */ + { 360, 0 }, /* (457) range_opt ::= */ + { 360, -6 }, /* (458) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ + { 361, 0 }, /* (459) every_opt ::= */ + { 361, -4 }, /* (460) every_opt ::= EVERY NK_LP duration_literal NK_RP */ + { 315, -4 }, /* (461) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 369, -1 }, /* (462) query_expression_body ::= query_primary */ + { 369, -4 }, /* (463) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 369, -3 }, /* (464) query_expression_body ::= query_expression_body UNION query_expression_body */ + { 373, -1 }, /* (465) query_primary ::= query_specification */ + { 373, -6 }, /* (466) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ + { 370, 0 }, /* (467) order_by_clause_opt ::= */ + { 370, -3 }, /* (468) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 371, 0 }, /* (469) slimit_clause_opt ::= */ + { 371, -2 }, /* (470) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 371, -4 }, /* (471) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 371, -4 }, /* (472) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 372, 0 }, /* (473) limit_clause_opt ::= */ + { 372, -2 }, /* (474) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 372, -4 }, /* (475) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 372, -4 }, /* (476) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 334, -3 }, /* (477) subquery ::= NK_LP query_expression NK_RP */ + { 355, -1 }, /* (478) search_condition ::= common_expression */ + { 374, -1 }, /* (479) sort_specification_list ::= sort_specification */ + { 374, -3 }, /* (480) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 375, -3 }, /* (481) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ + { 376, 0 }, /* (482) ordering_specification_opt ::= */ + { 376, -1 }, /* (483) ordering_specification_opt ::= ASC */ + { 376, -1 }, /* (484) ordering_specification_opt ::= DESC */ + { 377, 0 }, /* (485) null_ordering_opt ::= */ + { 377, -2 }, /* (486) null_ordering_opt ::= NULLS FIRST */ + { 377, -2 }, /* (487) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -3287,11 +3307,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,255,&yymsp[0].minor); + yy_destructor(yypParser,256,&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,256,&yymsp[0].minor); + yy_destructor(yypParser,257,&yymsp[0].minor); break; case 2: /* account_options ::= */ { } @@ -3305,20 +3325,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,255,&yymsp[-2].minor); +{ yy_destructor(yypParser,256,&yymsp[-2].minor); { } - yy_destructor(yypParser,257,&yymsp[0].minor); + yy_destructor(yypParser,258,&yymsp[0].minor); } break; case 12: /* alter_account_options ::= alter_account_option */ -{ yy_destructor(yypParser,258,&yymsp[0].minor); +{ yy_destructor(yypParser,259,&yymsp[0].minor); { } } break; case 13: /* alter_account_options ::= alter_account_options alter_account_option */ -{ yy_destructor(yypParser,256,&yymsp[-1].minor); +{ yy_destructor(yypParser,257,&yymsp[-1].minor); { } - yy_destructor(yypParser,258,&yymsp[0].minor); + yy_destructor(yypParser,259,&yymsp[0].minor); } break; case 14: /* alter_account_option ::= PASS literal */ @@ -3332,72 +3352,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,257,&yymsp[0].minor); + yy_destructor(yypParser,258,&yymsp[0].minor); break; case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ -{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy5, &yymsp[-1].minor.yy0, yymsp[0].minor.yy535); } +{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy533, &yymsp[-1].minor.yy0, yymsp[0].minor.yy719); } break; case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy5, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy533, 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.yy5, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy533, 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.yy5, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy533, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } break; case 28: /* cmd ::= DROP USER user_name */ -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy5); } +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy533); } break; case 29: /* sysinfo_opt ::= */ -{ yymsp[1].minor.yy535 = 1; } +{ yymsp[1].minor.yy719 = 1; } break; case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */ -{ yymsp[-1].minor.yy535 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } +{ yymsp[-1].minor.yy719 = 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.yy311, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5); } +{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy585, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy533); } break; case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */ -{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy311, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5); } +{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy585, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy533); } break; case 33: /* privileges ::= ALL */ -{ yymsp[0].minor.yy311 = PRIVILEGE_TYPE_ALL; } +{ yymsp[0].minor.yy585 = PRIVILEGE_TYPE_ALL; } break; case 34: /* privileges ::= priv_type_list */ case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35); -{ yylhsminor.yy311 = yymsp[0].minor.yy311; } - yymsp[0].minor.yy311 = yylhsminor.yy311; +{ yylhsminor.yy585 = yymsp[0].minor.yy585; } + yymsp[0].minor.yy585 = yylhsminor.yy585; break; case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ -{ yylhsminor.yy311 = yymsp[-2].minor.yy311 | yymsp[0].minor.yy311; } - yymsp[-2].minor.yy311 = yylhsminor.yy311; +{ yylhsminor.yy585 = yymsp[-2].minor.yy585 | yymsp[0].minor.yy585; } + yymsp[-2].minor.yy585 = yylhsminor.yy585; break; case 37: /* priv_type ::= READ */ -{ yymsp[0].minor.yy311 = PRIVILEGE_TYPE_READ; } +{ yymsp[0].minor.yy585 = PRIVILEGE_TYPE_READ; } break; case 38: /* priv_type ::= WRITE */ -{ yymsp[0].minor.yy311 = PRIVILEGE_TYPE_WRITE; } +{ yymsp[0].minor.yy585 = PRIVILEGE_TYPE_WRITE; } break; case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ -{ yylhsminor.yy5 = yymsp[-2].minor.yy0; } - yymsp[-2].minor.yy5 = yylhsminor.yy5; +{ yylhsminor.yy533 = yymsp[-2].minor.yy0; } + yymsp[-2].minor.yy533 = yylhsminor.yy533; break; case 40: /* priv_level ::= db_name NK_DOT NK_STAR */ -{ yylhsminor.yy5 = yymsp[-2].minor.yy5; } - yymsp[-2].minor.yy5 = yylhsminor.yy5; +{ yylhsminor.yy533 = yymsp[-2].minor.yy533; } + yymsp[-2].minor.yy533 = yylhsminor.yy533; break; case 41: /* cmd ::= CREATE DNODE dnode_endpoint */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy5, NULL); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy533, NULL); } break; case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy533, &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.yy5); } +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy533); } break; case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } @@ -3414,32 +3434,32 @@ static YYACTIONTYPE yy_reduce( case 49: /* dnode_endpoint ::= NK_STRING */ case 50: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==50); case 51: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==51); - case 310: /* db_name ::= NK_ID */ yytestcase(yyruleno==310); - case 311: /* table_name ::= NK_ID */ yytestcase(yyruleno==311); - case 312: /* column_name ::= NK_ID */ yytestcase(yyruleno==312); - case 313: /* function_name ::= NK_ID */ yytestcase(yyruleno==313); - case 314: /* table_alias ::= NK_ID */ yytestcase(yyruleno==314); - case 315: /* column_alias ::= NK_ID */ yytestcase(yyruleno==315); - case 316: /* user_name ::= NK_ID */ yytestcase(yyruleno==316); - case 317: /* index_name ::= NK_ID */ yytestcase(yyruleno==317); - case 318: /* topic_name ::= NK_ID */ yytestcase(yyruleno==318); - case 319: /* stream_name ::= NK_ID */ yytestcase(yyruleno==319); - case 320: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==320); - case 355: /* noarg_func ::= NOW */ yytestcase(yyruleno==355); - case 356: /* noarg_func ::= TODAY */ yytestcase(yyruleno==356); - case 357: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==357); - case 358: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==358); - case 359: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==359); - case 360: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==360); - case 361: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==361); - case 362: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==362); - case 363: /* noarg_func ::= USER */ yytestcase(yyruleno==363); - case 364: /* star_func ::= COUNT */ yytestcase(yyruleno==364); - case 365: /* star_func ::= FIRST */ yytestcase(yyruleno==365); - case 366: /* star_func ::= LAST */ yytestcase(yyruleno==366); - case 367: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==367); -{ yylhsminor.yy5 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy5 = yylhsminor.yy5; + case 311: /* db_name ::= NK_ID */ yytestcase(yyruleno==311); + case 312: /* table_name ::= NK_ID */ yytestcase(yyruleno==312); + case 313: /* column_name ::= NK_ID */ yytestcase(yyruleno==313); + case 314: /* function_name ::= NK_ID */ yytestcase(yyruleno==314); + case 315: /* table_alias ::= NK_ID */ yytestcase(yyruleno==315); + case 316: /* column_alias ::= NK_ID */ yytestcase(yyruleno==316); + case 317: /* user_name ::= NK_ID */ yytestcase(yyruleno==317); + case 318: /* index_name ::= NK_ID */ yytestcase(yyruleno==318); + case 319: /* topic_name ::= NK_ID */ yytestcase(yyruleno==319); + case 320: /* stream_name ::= NK_ID */ yytestcase(yyruleno==320); + case 321: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==321); + case 356: /* noarg_func ::= NOW */ yytestcase(yyruleno==356); + case 357: /* noarg_func ::= TODAY */ yytestcase(yyruleno==357); + case 358: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==358); + case 359: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==359); + case 360: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==360); + case 361: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==361); + case 362: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==362); + case 363: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==363); + case 364: /* noarg_func ::= USER */ yytestcase(yyruleno==364); + case 365: /* star_func ::= COUNT */ yytestcase(yyruleno==365); + case 366: /* star_func ::= FIRST */ yytestcase(yyruleno==366); + case 367: /* star_func ::= LAST */ yytestcase(yyruleno==367); + case 368: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==368); +{ yylhsminor.yy533 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy533 = yylhsminor.yy533; break; case 52: /* cmd ::= ALTER LOCAL NK_STRING */ { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } @@ -3472,1234 +3492,1238 @@ 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.yy403, &yymsp[-1].minor.yy5, yymsp[0].minor.yy652); } +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy173, &yymsp[-1].minor.yy533, yymsp[0].minor.yy560); } break; case 63: /* cmd ::= DROP DATABASE exists_opt db_name */ -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy173, &yymsp[0].minor.yy533); } break; case 64: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy5); } +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy533); } break; case 65: /* cmd ::= ALTER DATABASE db_name alter_db_options */ -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy5, yymsp[0].minor.yy652); } +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy533, yymsp[0].minor.yy560); } break; case 66: /* cmd ::= FLUSH DATABASE db_name */ -{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy5); } +{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy533); } break; - case 67: /* not_exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy403 = true; } + case 67: /* cmd ::= TRIM DATABASE db_name */ +{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[0].minor.yy533); } break; - case 68: /* not_exists_opt ::= */ - case 70: /* exists_opt ::= */ yytestcase(yyruleno==70); - case 251: /* analyze_opt ::= */ yytestcase(yyruleno==251); - case 259: /* agg_func_opt ::= */ yytestcase(yyruleno==259); - case 421: /* set_quantifier_opt ::= */ yytestcase(yyruleno==421); -{ yymsp[1].minor.yy403 = false; } + case 68: /* not_exists_opt ::= IF NOT EXISTS */ +{ yymsp[-2].minor.yy173 = true; } break; - case 69: /* exists_opt ::= IF EXISTS */ -{ yymsp[-1].minor.yy403 = true; } + case 69: /* not_exists_opt ::= */ + case 71: /* exists_opt ::= */ yytestcase(yyruleno==71); + case 252: /* analyze_opt ::= */ yytestcase(yyruleno==252); + case 260: /* agg_func_opt ::= */ yytestcase(yyruleno==260); + case 422: /* set_quantifier_opt ::= */ yytestcase(yyruleno==422); +{ yymsp[1].minor.yy173 = false; } break; - case 71: /* db_options ::= */ -{ yymsp[1].minor.yy652 = createDefaultDatabaseOptions(pCxt); } + case 70: /* exists_opt ::= IF EXISTS */ +{ yymsp[-1].minor.yy173 = true; } break; - case 72: /* db_options ::= db_options BUFFER NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 72: /* db_options ::= */ +{ yymsp[1].minor.yy560 = createDefaultDatabaseOptions(pCxt); } break; - case 73: /* db_options ::= db_options CACHELAST NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 73: /* db_options ::= db_options BUFFER NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 74: /* db_options ::= db_options CACHELASTSIZE NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_CACHELASTSIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 74: /* db_options ::= db_options CACHELAST NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 75: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 75: /* db_options ::= db_options CACHELASTSIZE NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_CACHELASTSIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 76: /* db_options ::= db_options DURATION NK_INTEGER */ - case 77: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==77); -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 76: /* db_options ::= db_options COMP NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 78: /* db_options ::= db_options FSYNC NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 77: /* db_options ::= db_options DURATION NK_INTEGER */ + case 78: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==78); +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 79: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 79: /* db_options ::= db_options FSYNC NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 80: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 80: /* db_options ::= db_options MAXROWS NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 81: /* db_options ::= db_options KEEP integer_list */ - case 82: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==82); -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_KEEP, yymsp[0].minor.yy210); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 81: /* db_options ::= db_options MINROWS NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 83: /* db_options ::= db_options PAGES NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 84: /* db_options ::= db_options PAGESIZE NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 85: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 86: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 87: /* db_options ::= db_options STRICT NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 88: /* db_options ::= db_options WAL NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 89: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 90: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 91: /* db_options ::= db_options RETENTIONS retention_list */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_RETENTIONS, yymsp[0].minor.yy210); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 92: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ -{ yylhsminor.yy652 = setDatabaseOption(pCxt, yymsp[-2].minor.yy652, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 93: /* alter_db_options ::= alter_db_option */ -{ yylhsminor.yy652 = createAlterDatabaseOptions(pCxt); yylhsminor.yy652 = setAlterDatabaseOption(pCxt, yylhsminor.yy652, &yymsp[0].minor.yy351); } - yymsp[0].minor.yy652 = yylhsminor.yy652; - break; - case 94: /* alter_db_options ::= alter_db_options alter_db_option */ -{ yylhsminor.yy652 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy652, &yymsp[0].minor.yy351); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; - break; - case 95: /* alter_db_option ::= BUFFER NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 96: /* alter_db_option ::= CACHELAST NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_CACHELAST; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 97: /* alter_db_option ::= CACHELASTSIZE NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_CACHELASTSIZE; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 98: /* alter_db_option ::= FSYNC NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 99: /* alter_db_option ::= KEEP integer_list */ - case 100: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==100); -{ yymsp[-1].minor.yy351.type = DB_OPTION_KEEP; yymsp[-1].minor.yy351.pList = yymsp[0].minor.yy210; } - break; - case 101: /* alter_db_option ::= PAGES NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_PAGES; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 102: /* alter_db_option ::= REPLICA NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 103: /* alter_db_option ::= STRICT NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_STRICT; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 104: /* alter_db_option ::= WAL NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = DB_OPTION_WAL; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } - break; - case 105: /* integer_list ::= NK_INTEGER */ -{ yylhsminor.yy210 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy210 = yylhsminor.yy210; - break; - case 106: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 281: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==281); -{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy210 = yylhsminor.yy210; - break; - case 107: /* variable_list ::= NK_VARIABLE */ -{ yylhsminor.yy210 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy210 = yylhsminor.yy210; - break; - case 108: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ -{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy210 = yylhsminor.yy210; - break; - case 109: /* retention_list ::= retention */ - case 129: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==129); - case 132: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==132); - case 139: /* column_def_list ::= column_def */ yytestcase(yyruleno==139); - case 182: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==182); - case 187: /* col_name_list ::= col_name */ yytestcase(yyruleno==187); - case 234: /* func_list ::= func */ yytestcase(yyruleno==234); - case 308: /* literal_list ::= signed_literal */ yytestcase(yyruleno==308); - case 370: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==370); - case 424: /* select_list ::= select_item */ yytestcase(yyruleno==424); - case 478: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==478); -{ yylhsminor.yy210 = createNodeList(pCxt, yymsp[0].minor.yy652); } - yymsp[0].minor.yy210 = yylhsminor.yy210; - break; - case 110: /* retention_list ::= retention_list NK_COMMA retention */ - case 140: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==140); - case 183: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==183); - case 188: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==188); - case 235: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==235); - case 309: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==309); - case 371: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==371); - case 425: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==425); - case 479: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==479); -{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, yymsp[0].minor.yy652); } - yymsp[-2].minor.yy210 = yylhsminor.yy210; - break; - case 111: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ -{ yylhsminor.yy652 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; - break; - case 112: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - case 114: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==114); -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy403, yymsp[-5].minor.yy652, yymsp[-3].minor.yy210, yymsp[-1].minor.yy210, yymsp[0].minor.yy652); } - break; - case 113: /* cmd ::= CREATE TABLE multi_create_clause */ -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy210); } - break; - case 115: /* cmd ::= DROP TABLE multi_drop_clause */ -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy210); } - break; - case 116: /* cmd ::= DROP STABLE exists_opt full_table_name */ -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy403, yymsp[0].minor.yy652); } - break; - case 117: /* cmd ::= ALTER TABLE alter_table_clause */ - case 284: /* cmd ::= query_expression */ yytestcase(yyruleno==284); -{ pCxt->pRootNode = yymsp[0].minor.yy652; } - break; - case 118: /* cmd ::= ALTER STABLE alter_table_clause */ -{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy652); } - break; - case 119: /* alter_table_clause ::= full_table_name alter_table_options */ -{ yylhsminor.yy652 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 82: /* db_options ::= db_options KEEP integer_list */ + case 83: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==83); +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_KEEP, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 120: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ -{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 84: /* db_options ::= db_options PAGES NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 121: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ -{ yylhsminor.yy652 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy652, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy5); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; - break; - case 122: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ -{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 85: /* db_options ::= db_options PAGESIZE NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 123: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ -{ yylhsminor.yy652 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 86: /* db_options ::= db_options PRECISION NK_STRING */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 87: /* db_options ::= db_options REPLICA NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 88: /* db_options ::= db_options STRICT NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 89: /* db_options ::= db_options WAL NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 90: /* db_options ::= db_options VGROUPS NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 91: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 92: /* db_options ::= db_options RETENTIONS retention_list */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_RETENTIONS, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 93: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ +{ yylhsminor.yy560 = setDatabaseOption(pCxt, yymsp[-2].minor.yy560, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 94: /* alter_db_options ::= alter_db_option */ +{ yylhsminor.yy560 = createAlterDatabaseOptions(pCxt); yylhsminor.yy560 = setAlterDatabaseOption(pCxt, yylhsminor.yy560, &yymsp[0].minor.yy389); } + yymsp[0].minor.yy560 = yylhsminor.yy560; + break; + case 95: /* alter_db_options ::= alter_db_options alter_db_option */ +{ yylhsminor.yy560 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy560, &yymsp[0].minor.yy389); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; + break; + case 96: /* alter_db_option ::= BUFFER NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 97: /* alter_db_option ::= CACHELAST NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_CACHELAST; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 98: /* alter_db_option ::= CACHELASTSIZE NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_CACHELASTSIZE; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 99: /* alter_db_option ::= FSYNC NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 100: /* alter_db_option ::= KEEP integer_list */ + case 101: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==101); +{ yymsp[-1].minor.yy389.type = DB_OPTION_KEEP; yymsp[-1].minor.yy389.pList = yymsp[0].minor.yy712; } + break; + case 102: /* alter_db_option ::= PAGES NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_PAGES; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 103: /* alter_db_option ::= REPLICA NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 104: /* alter_db_option ::= STRICT NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_STRICT; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 105: /* alter_db_option ::= WAL NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = DB_OPTION_WAL; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } + break; + case 106: /* integer_list ::= NK_INTEGER */ +{ yylhsminor.yy712 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; + break; + case 107: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ + case 282: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==282); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; + break; + case 108: /* variable_list ::= NK_VARIABLE */ +{ yylhsminor.yy712 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; + break; + case 109: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; + break; + case 110: /* retention_list ::= retention */ + case 130: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==130); + case 133: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==133); + case 140: /* column_def_list ::= column_def */ yytestcase(yyruleno==140); + case 183: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==183); + case 188: /* col_name_list ::= col_name */ yytestcase(yyruleno==188); + case 235: /* func_list ::= func */ yytestcase(yyruleno==235); + case 309: /* literal_list ::= signed_literal */ yytestcase(yyruleno==309); + case 371: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==371); + case 425: /* select_list ::= select_item */ yytestcase(yyruleno==425); + case 479: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==479); +{ yylhsminor.yy712 = createNodeList(pCxt, yymsp[0].minor.yy560); } + yymsp[0].minor.yy712 = yylhsminor.yy712; + break; + case 111: /* retention_list ::= retention_list NK_COMMA retention */ + case 141: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==141); + case 184: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==184); + case 189: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==189); + case 236: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==236); + case 310: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==310); + case 372: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==372); + case 426: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==426); + case 480: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==480); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, yymsp[0].minor.yy560); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; + break; + case 112: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ +{ yylhsminor.yy560 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; + break; + case 113: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + case 115: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==115); +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy173, yymsp[-5].minor.yy560, yymsp[-3].minor.yy712, yymsp[-1].minor.yy712, yymsp[0].minor.yy560); } + break; + case 114: /* cmd ::= CREATE TABLE multi_create_clause */ +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy712); } + break; + case 116: /* cmd ::= DROP TABLE multi_drop_clause */ +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy712); } + break; + case 117: /* cmd ::= DROP STABLE exists_opt full_table_name */ +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy173, yymsp[0].minor.yy560); } + break; + case 118: /* cmd ::= ALTER TABLE alter_table_clause */ + case 285: /* cmd ::= query_expression */ yytestcase(yyruleno==285); +{ pCxt->pRootNode = yymsp[0].minor.yy560; } + break; + case 119: /* cmd ::= ALTER STABLE alter_table_clause */ +{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy560); } + break; + case 120: /* alter_table_clause ::= full_table_name alter_table_options */ +{ yylhsminor.yy560 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy560, yymsp[0].minor.yy560); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 124: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ -{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 121: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ +{ yylhsminor.yy560 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy560, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy533, yymsp[0].minor.yy196); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 125: /* alter_table_clause ::= full_table_name DROP TAG column_name */ -{ yylhsminor.yy652 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy652, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy5); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + case 122: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ +{ yylhsminor.yy560 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy560, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy533); } + yymsp[-3].minor.yy560 = yylhsminor.yy560; + break; + case 123: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ +{ yylhsminor.yy560 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy560, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy533, yymsp[0].minor.yy196); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 126: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ -{ yylhsminor.yy652 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 124: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ +{ yylhsminor.yy560 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy560, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy533, &yymsp[0].minor.yy533); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 127: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ -{ yylhsminor.yy652 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy652, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 125: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ +{ yylhsminor.yy560 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy560, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy533, yymsp[0].minor.yy196); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 128: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ -{ yylhsminor.yy652 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy652, &yymsp[-2].minor.yy5, yymsp[0].minor.yy652); } - yymsp[-5].minor.yy652 = yylhsminor.yy652; + case 126: /* alter_table_clause ::= full_table_name DROP TAG column_name */ +{ yylhsminor.yy560 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy560, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy533); } + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 130: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ - case 133: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==133); -{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-1].minor.yy210, yymsp[0].minor.yy652); } - yymsp[-1].minor.yy210 = yylhsminor.yy210; + case 127: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ +{ yylhsminor.yy560 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy560, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy533, yymsp[0].minor.yy196); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 131: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ -{ yylhsminor.yy652 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy403, yymsp[-8].minor.yy652, yymsp[-6].minor.yy652, yymsp[-5].minor.yy210, yymsp[-2].minor.yy210, yymsp[0].minor.yy652); } - yymsp[-9].minor.yy652 = yylhsminor.yy652; + case 128: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ +{ yylhsminor.yy560 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy560, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy533, &yymsp[0].minor.yy533); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 134: /* drop_table_clause ::= exists_opt full_table_name */ -{ yylhsminor.yy652 = createDropTableClause(pCxt, yymsp[-1].minor.yy403, yymsp[0].minor.yy652); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 129: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ +{ yylhsminor.yy560 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy560, &yymsp[-2].minor.yy533, yymsp[0].minor.yy560); } + yymsp[-5].minor.yy560 = yylhsminor.yy560; break; - case 135: /* specific_cols_opt ::= */ - case 166: /* tags_def_opt ::= */ yytestcase(yyruleno==166); - case 433: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==433); - case 450: /* group_by_clause_opt ::= */ yytestcase(yyruleno==450); - case 466: /* order_by_clause_opt ::= */ yytestcase(yyruleno==466); -{ yymsp[1].minor.yy210 = NULL; } + case 131: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ + case 134: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==134); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-1].minor.yy712, yymsp[0].minor.yy560); } + yymsp[-1].minor.yy712 = yylhsminor.yy712; break; - case 136: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ -{ yymsp[-2].minor.yy210 = yymsp[-1].minor.yy210; } + case 132: /* 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.yy560 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy173, yymsp[-8].minor.yy560, yymsp[-6].minor.yy560, yymsp[-5].minor.yy712, yymsp[-2].minor.yy712, yymsp[0].minor.yy560); } + yymsp[-9].minor.yy560 = yylhsminor.yy560; break; - case 137: /* full_table_name ::= table_name */ -{ yylhsminor.yy652 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy5, NULL); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 135: /* drop_table_clause ::= exists_opt full_table_name */ +{ yylhsminor.yy560 = createDropTableClause(pCxt, yymsp[-1].minor.yy173, yymsp[0].minor.yy560); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 138: /* full_table_name ::= db_name NK_DOT table_name */ -{ yylhsminor.yy652 = createRealTableNode(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5, NULL); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 136: /* specific_cols_opt ::= */ + case 167: /* tags_def_opt ::= */ yytestcase(yyruleno==167); + case 434: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==434); + case 451: /* group_by_clause_opt ::= */ yytestcase(yyruleno==451); + case 467: /* order_by_clause_opt ::= */ yytestcase(yyruleno==467); +{ yymsp[1].minor.yy712 = NULL; } break; - case 141: /* column_def ::= column_name type_name */ -{ yylhsminor.yy652 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy5, yymsp[0].minor.yy552, NULL); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 137: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ +{ yymsp[-2].minor.yy712 = yymsp[-1].minor.yy712; } break; - case 142: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy652 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy5, yymsp[-2].minor.yy552, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + case 138: /* full_table_name ::= table_name */ +{ yylhsminor.yy560 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy533, NULL); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 143: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_BOOL); } + case 139: /* full_table_name ::= db_name NK_DOT table_name */ +{ yylhsminor.yy560 = createRealTableNode(pCxt, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy533, NULL); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 144: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_TINYINT); } + case 142: /* column_def ::= column_name type_name */ +{ yylhsminor.yy560 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy533, yymsp[0].minor.yy196, NULL); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 145: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_SMALLINT); } + case 143: /* column_def ::= column_name type_name COMMENT NK_STRING */ +{ yylhsminor.yy560 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy533, yymsp[-2].minor.yy196, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 146: /* type_name ::= INT */ - case 147: /* type_name ::= INTEGER */ yytestcase(yyruleno==147); -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_INT); } + case 144: /* type_name ::= BOOL */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_BOOL); } break; - case 148: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_BIGINT); } + case 145: /* type_name ::= TINYINT */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; - case 149: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_FLOAT); } + case 146: /* type_name ::= SMALLINT */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; - case 150: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_DOUBLE); } + case 147: /* type_name ::= INT */ + case 148: /* type_name ::= INTEGER */ yytestcase(yyruleno==148); +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_INT); } break; - case 151: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } + case 149: /* type_name ::= BIGINT */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; - case 152: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } + case 150: /* type_name ::= FLOAT */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; - case 153: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } + case 151: /* type_name ::= DOUBLE */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; - case 154: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_UTINYINT); } + case 152: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy196 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; - case 155: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_USMALLINT); } + case 153: /* type_name ::= TIMESTAMP */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; - case 156: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_UINT); } + case 154: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy196 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; - case 157: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy552 = createDataType(TSDB_DATA_TYPE_UBIGINT); } + case 155: /* type_name ::= TINYINT UNSIGNED */ +{ yymsp[-1].minor.yy196 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; - case 158: /* type_name ::= JSON */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_JSON); } + case 156: /* type_name ::= SMALLINT UNSIGNED */ +{ yymsp[-1].minor.yy196 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; - case 159: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } + case 157: /* type_name ::= INT UNSIGNED */ +{ yymsp[-1].minor.yy196 = createDataType(TSDB_DATA_TYPE_UINT); } break; - case 160: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } + case 158: /* type_name ::= BIGINT UNSIGNED */ +{ yymsp[-1].minor.yy196 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; - case 161: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_BLOB); } + case 159: /* type_name ::= JSON */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_JSON); } break; - case 162: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy552 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } + case 160: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy196 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; - case 163: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy552 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 161: /* type_name ::= MEDIUMBLOB */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; - case 164: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy552 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 162: /* type_name ::= BLOB */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_BLOB); } break; - case 165: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy552 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 163: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy196 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; - case 167: /* tags_def_opt ::= tags_def */ - case 369: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==369); -{ yylhsminor.yy210 = yymsp[0].minor.yy210; } - yymsp[0].minor.yy210 = yylhsminor.yy210; + case 164: /* type_name ::= DECIMAL */ +{ yymsp[0].minor.yy196 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 168: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ -{ yymsp[-3].minor.yy210 = yymsp[-1].minor.yy210; } + case 165: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy196 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 169: /* table_options ::= */ -{ yymsp[1].minor.yy652 = createDefaultTableOptions(pCxt); } + case 166: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy196 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 170: /* table_options ::= table_options COMMENT NK_STRING */ -{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 168: /* tags_def_opt ::= tags_def */ + case 370: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==370); +{ yylhsminor.yy712 = yymsp[0].minor.yy712; } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; - case 171: /* table_options ::= table_options MAX_DELAY duration_list */ -{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy210); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 169: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ +{ yymsp[-3].minor.yy712 = yymsp[-1].minor.yy712; } break; - case 172: /* table_options ::= table_options WATERMARK duration_list */ -{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy210); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 170: /* table_options ::= */ +{ yymsp[1].minor.yy560 = createDefaultTableOptions(pCxt); } break; - case 173: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ -{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-4].minor.yy652, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy210); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 171: /* table_options ::= table_options COMMENT NK_STRING */ +{ yylhsminor.yy560 = setTableOption(pCxt, yymsp[-2].minor.yy560, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 174: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-2].minor.yy652, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 172: /* table_options ::= table_options MAX_DELAY duration_list */ +{ yylhsminor.yy560 = setTableOption(pCxt, yymsp[-2].minor.yy560, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 175: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-4].minor.yy652, TABLE_OPTION_SMA, yymsp[-1].minor.yy210); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + case 173: /* table_options ::= table_options WATERMARK duration_list */ +{ yylhsminor.yy560 = setTableOption(pCxt, yymsp[-2].minor.yy560, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy712); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 176: /* alter_table_options ::= alter_table_option */ -{ yylhsminor.yy652 = createAlterTableOptions(pCxt); yylhsminor.yy652 = setTableOption(pCxt, yylhsminor.yy652, yymsp[0].minor.yy351.type, &yymsp[0].minor.yy351.val); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 174: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ +{ yylhsminor.yy560 = setTableOption(pCxt, yymsp[-4].minor.yy560, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy712); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 177: /* alter_table_options ::= alter_table_options alter_table_option */ -{ yylhsminor.yy652 = setTableOption(pCxt, yymsp[-1].minor.yy652, yymsp[0].minor.yy351.type, &yymsp[0].minor.yy351.val); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 175: /* table_options ::= table_options TTL NK_INTEGER */ +{ yylhsminor.yy560 = setTableOption(pCxt, yymsp[-2].minor.yy560, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 178: /* alter_table_option ::= COMMENT NK_STRING */ -{ yymsp[-1].minor.yy351.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + case 176: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ +{ yylhsminor.yy560 = setTableOption(pCxt, yymsp[-4].minor.yy560, TABLE_OPTION_SMA, yymsp[-1].minor.yy712); } + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 179: /* alter_table_option ::= TTL NK_INTEGER */ -{ yymsp[-1].minor.yy351.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy351.val = yymsp[0].minor.yy0; } + case 177: /* alter_table_options ::= alter_table_option */ +{ yylhsminor.yy560 = createAlterTableOptions(pCxt); yylhsminor.yy560 = setTableOption(pCxt, yylhsminor.yy560, yymsp[0].minor.yy389.type, &yymsp[0].minor.yy389.val); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 180: /* duration_list ::= duration_literal */ - case 337: /* expression_list ::= expression */ yytestcase(yyruleno==337); -{ yylhsminor.yy210 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy652)); } - yymsp[0].minor.yy210 = yylhsminor.yy210; + case 178: /* alter_table_options ::= alter_table_options alter_table_option */ +{ yylhsminor.yy560 = setTableOption(pCxt, yymsp[-1].minor.yy560, yymsp[0].minor.yy389.type, &yymsp[0].minor.yy389.val); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 181: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 338: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==338); -{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, releaseRawExprNode(pCxt, yymsp[0].minor.yy652)); } - yymsp[-2].minor.yy210 = yylhsminor.yy210; + case 179: /* alter_table_option ::= COMMENT NK_STRING */ +{ yymsp[-1].minor.yy389.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } break; - case 184: /* rollup_func_name ::= function_name */ -{ yylhsminor.yy652 = createFunctionNode(pCxt, &yymsp[0].minor.yy5, NULL); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 180: /* alter_table_option ::= TTL NK_INTEGER */ +{ yymsp[-1].minor.yy389.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy389.val = yymsp[0].minor.yy0; } break; - case 185: /* rollup_func_name ::= FIRST */ - case 186: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==186); -{ yylhsminor.yy652 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 181: /* duration_list ::= duration_literal */ + case 338: /* expression_list ::= expression */ yytestcase(yyruleno==338); +{ yylhsminor.yy712 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy560)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; - case 189: /* col_name ::= column_name */ -{ yylhsminor.yy652 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy5); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 182: /* duration_list ::= duration_list NK_COMMA duration_literal */ + case 339: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==339); +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, releaseRawExprNode(pCxt, yymsp[0].minor.yy560)); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; break; - case 190: /* cmd ::= SHOW DNODES */ + case 185: /* rollup_func_name ::= function_name */ +{ yylhsminor.yy560 = createFunctionNode(pCxt, &yymsp[0].minor.yy533, NULL); } + yymsp[0].minor.yy560 = yylhsminor.yy560; + break; + case 186: /* rollup_func_name ::= FIRST */ + case 187: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==187); +{ yylhsminor.yy560 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } + yymsp[0].minor.yy560 = yylhsminor.yy560; + break; + case 190: /* col_name ::= column_name */ +{ yylhsminor.yy560 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy533); } + yymsp[0].minor.yy560 = yylhsminor.yy560; + break; + case 191: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } break; - case 191: /* cmd ::= SHOW USERS */ + case 192: /* cmd ::= SHOW USERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); } break; - case 192: /* cmd ::= SHOW DATABASES */ + case 193: /* cmd ::= SHOW DATABASES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; - case 193: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy652, yymsp[0].minor.yy652, OP_TYPE_LIKE); } + case 194: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy560, yymsp[0].minor.yy560, OP_TYPE_LIKE); } break; - case 194: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy652, yymsp[0].minor.yy652, OP_TYPE_LIKE); } + case 195: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy560, yymsp[0].minor.yy560, OP_TYPE_LIKE); } break; - case 195: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy652, NULL, OP_TYPE_LIKE); } + case 196: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy560, NULL, OP_TYPE_LIKE); } break; - case 196: /* cmd ::= SHOW MNODES */ + case 197: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } break; - case 197: /* cmd ::= SHOW MODULES */ + case 198: /* cmd ::= SHOW MODULES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MODULES_STMT); } break; - case 198: /* cmd ::= SHOW QNODES */ + case 199: /* cmd ::= SHOW QNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); } break; - case 199: /* cmd ::= SHOW FUNCTIONS */ + case 200: /* cmd ::= SHOW FUNCTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } break; - case 200: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy652, yymsp[-1].minor.yy652, OP_TYPE_EQUAL); } + case 201: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy560, yymsp[-1].minor.yy560, OP_TYPE_EQUAL); } break; - case 201: /* cmd ::= SHOW STREAMS */ + case 202: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } break; - case 202: /* cmd ::= SHOW ACCOUNTS */ + case 203: /* cmd ::= SHOW ACCOUNTS */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } break; - case 203: /* cmd ::= SHOW APPS */ + case 204: /* cmd ::= SHOW APPS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT); } break; - case 204: /* cmd ::= SHOW CONNECTIONS */ + case 205: /* cmd ::= SHOW CONNECTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT); } break; - case 205: /* cmd ::= SHOW LICENCE */ - case 206: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==206); + case 206: /* cmd ::= SHOW LICENCE */ + case 207: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==207); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCE_STMT); } break; - case 207: /* cmd ::= SHOW CREATE DATABASE db_name */ -{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy5); } + case 208: /* cmd ::= SHOW CREATE DATABASE db_name */ +{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy533); } break; - case 208: /* cmd ::= SHOW CREATE TABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy652); } + case 209: /* cmd ::= SHOW CREATE TABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy560); } break; - case 209: /* cmd ::= SHOW CREATE STABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy652); } + case 210: /* cmd ::= SHOW CREATE STABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy560); } break; - case 210: /* cmd ::= SHOW QUERIES */ + case 211: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } break; - case 211: /* cmd ::= SHOW SCORES */ + case 212: /* cmd ::= SHOW SCORES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); } break; - case 212: /* cmd ::= SHOW TOPICS */ + case 213: /* cmd ::= SHOW TOPICS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); } break; - case 213: /* cmd ::= SHOW VARIABLES */ + case 214: /* cmd ::= SHOW VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } break; - case 214: /* cmd ::= SHOW LOCAL VARIABLES */ + case 215: /* cmd ::= SHOW LOCAL VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); } break; - case 215: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + case 216: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ { pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-1].minor.yy0)); } break; - case 216: /* cmd ::= SHOW BNODES */ + case 217: /* cmd ::= SHOW BNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); } break; - case 217: /* cmd ::= SHOW SNODES */ + case 218: /* cmd ::= SHOW SNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } break; - case 218: /* cmd ::= SHOW CLUSTER */ + case 219: /* cmd ::= SHOW CLUSTER */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } break; - case 219: /* cmd ::= SHOW TRANSACTIONS */ + case 220: /* cmd ::= SHOW TRANSACTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } break; - case 220: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ -{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy652); } + case 221: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ +{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy560); } break; - case 221: /* cmd ::= SHOW CONSUMERS */ + case 222: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } break; - case 222: /* cmd ::= SHOW SUBSCRIPTIONS */ + case 223: /* cmd ::= SHOW SUBSCRIPTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } break; - case 223: /* db_name_cond_opt ::= */ - case 228: /* from_db_opt ::= */ yytestcase(yyruleno==228); -{ yymsp[1].minor.yy652 = createDefaultDatabaseCondValue(pCxt); } + case 224: /* db_name_cond_opt ::= */ + case 229: /* from_db_opt ::= */ yytestcase(yyruleno==229); +{ yymsp[1].minor.yy560 = createDefaultDatabaseCondValue(pCxt); } break; - case 224: /* db_name_cond_opt ::= db_name NK_DOT */ -{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy5); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 225: /* db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy533); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 225: /* like_pattern_opt ::= */ - case 265: /* into_opt ::= */ yytestcase(yyruleno==265); - case 402: /* from_clause_opt ::= */ yytestcase(yyruleno==402); - case 431: /* where_clause_opt ::= */ yytestcase(yyruleno==431); - case 435: /* twindow_clause_opt ::= */ yytestcase(yyruleno==435); - case 440: /* sliding_opt ::= */ yytestcase(yyruleno==440); - case 442: /* fill_opt ::= */ yytestcase(yyruleno==442); - case 454: /* having_clause_opt ::= */ yytestcase(yyruleno==454); - case 456: /* range_opt ::= */ yytestcase(yyruleno==456); - case 458: /* every_opt ::= */ yytestcase(yyruleno==458); - case 468: /* slimit_clause_opt ::= */ yytestcase(yyruleno==468); - case 472: /* limit_clause_opt ::= */ yytestcase(yyruleno==472); -{ yymsp[1].minor.yy652 = NULL; } + case 226: /* like_pattern_opt ::= */ + case 266: /* into_opt ::= */ yytestcase(yyruleno==266); + case 403: /* from_clause_opt ::= */ yytestcase(yyruleno==403); + case 432: /* where_clause_opt ::= */ yytestcase(yyruleno==432); + case 436: /* twindow_clause_opt ::= */ yytestcase(yyruleno==436); + case 441: /* sliding_opt ::= */ yytestcase(yyruleno==441); + case 443: /* fill_opt ::= */ yytestcase(yyruleno==443); + case 455: /* having_clause_opt ::= */ yytestcase(yyruleno==455); + case 457: /* range_opt ::= */ yytestcase(yyruleno==457); + case 459: /* every_opt ::= */ yytestcase(yyruleno==459); + case 469: /* slimit_clause_opt ::= */ yytestcase(yyruleno==469); + case 473: /* limit_clause_opt ::= */ yytestcase(yyruleno==473); +{ yymsp[1].minor.yy560 = NULL; } break; - case 226: /* like_pattern_opt ::= LIKE NK_STRING */ -{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + case 227: /* like_pattern_opt ::= LIKE NK_STRING */ +{ yymsp[-1].minor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; - case 227: /* table_name_cond ::= table_name */ -{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy5); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 228: /* table_name_cond ::= table_name */ +{ yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy533); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 229: /* from_db_opt ::= FROM db_name */ -{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy5); } + case 230: /* from_db_opt ::= FROM db_name */ +{ yymsp[-1].minor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy533); } break; - case 230: /* cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy403, &yymsp[-3].minor.yy5, &yymsp[-1].minor.yy5, NULL, yymsp[0].minor.yy652); } + case 231: /* cmd ::= CREATE SMA INDEX not_exists_opt index_name ON table_name index_options */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy173, &yymsp[-3].minor.yy533, &yymsp[-1].minor.yy533, NULL, yymsp[0].minor.yy560); } break; - case 231: /* cmd ::= DROP INDEX exists_opt index_name */ -{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } + case 232: /* cmd ::= DROP INDEX exists_opt index_name */ +{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy173, &yymsp[0].minor.yy533); } break; - case 232: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-9].minor.yy652 = createIndexOption(pCxt, yymsp[-7].minor.yy210, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), NULL, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + case 233: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-9].minor.yy560 = createIndexOption(pCxt, yymsp[-7].minor.yy712, releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), NULL, yymsp[-1].minor.yy560, yymsp[0].minor.yy560); } break; - case 233: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-11].minor.yy652 = createIndexOption(pCxt, yymsp[-9].minor.yy210, releaseRawExprNode(pCxt, yymsp[-5].minor.yy652), releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + case 234: /* 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.yy560 = createIndexOption(pCxt, yymsp[-9].minor.yy712, releaseRawExprNode(pCxt, yymsp[-5].minor.yy560), releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), yymsp[-1].minor.yy560, yymsp[0].minor.yy560); } break; - case 236: /* func ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy652 = createFunctionNode(pCxt, &yymsp[-3].minor.yy5, yymsp[-1].minor.yy210); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + case 237: /* func ::= function_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy560 = createFunctionNode(pCxt, &yymsp[-3].minor.yy533, yymsp[-1].minor.yy712); } + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 237: /* sma_stream_opt ::= */ - case 267: /* stream_options ::= */ yytestcase(yyruleno==267); -{ yymsp[1].minor.yy652 = createStreamOptions(pCxt); } + case 238: /* sma_stream_opt ::= */ + case 268: /* stream_options ::= */ yytestcase(yyruleno==268); +{ yymsp[1].minor.yy560 = createStreamOptions(pCxt); } break; - case 238: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ - case 271: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==271); -{ ((SStreamOptions*)yymsp[-2].minor.yy652)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); yylhsminor.yy652 = yymsp[-2].minor.yy652; } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 239: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ + case 272: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==272); +{ ((SStreamOptions*)yymsp[-2].minor.yy560)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy560); yylhsminor.yy560 = yymsp[-2].minor.yy560; } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 239: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-2].minor.yy652)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); yylhsminor.yy652 = yymsp[-2].minor.yy652; } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 240: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy560)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy560); yylhsminor.yy560 = yymsp[-2].minor.yy560; } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 240: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ -{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy403, &yymsp[-2].minor.yy5, yymsp[0].minor.yy652); } + case 241: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ +{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy173, &yymsp[-2].minor.yy533, yymsp[0].minor.yy560); } break; - case 241: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy403, &yymsp[-3].minor.yy5, &yymsp[0].minor.yy5, false); } + case 242: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy173, &yymsp[-3].minor.yy533, &yymsp[0].minor.yy533, false); } break; - case 242: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy403, &yymsp[-5].minor.yy5, &yymsp[0].minor.yy5, true); } + case 243: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy173, &yymsp[-5].minor.yy533, &yymsp[0].minor.yy533, true); } break; - case 243: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy403, &yymsp[-3].minor.yy5, yymsp[0].minor.yy652, false); } + case 244: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy173, &yymsp[-3].minor.yy533, yymsp[0].minor.yy560, false); } break; - case 244: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy403, &yymsp[-5].minor.yy5, yymsp[0].minor.yy652, true); } + case 245: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy173, &yymsp[-5].minor.yy533, yymsp[0].minor.yy560, true); } break; - case 245: /* cmd ::= DROP TOPIC exists_opt topic_name */ -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } + case 246: /* cmd ::= DROP TOPIC exists_opt topic_name */ +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy173, &yymsp[0].minor.yy533); } break; - case 246: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy403, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5); } + case 247: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ +{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy173, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy533); } break; - case 247: /* cmd ::= DESC full_table_name */ - case 248: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==248); -{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy652); } + case 248: /* cmd ::= DESC full_table_name */ + case 249: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==249); +{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy560); } break; - case 249: /* cmd ::= RESET QUERY CACHE */ + case 250: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } break; - case 250: /* cmd ::= EXPLAIN analyze_opt explain_options query_expression */ -{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy403, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + case 251: /* cmd ::= EXPLAIN analyze_opt explain_options query_expression */ +{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy173, yymsp[-1].minor.yy560, yymsp[0].minor.yy560); } break; - case 252: /* analyze_opt ::= ANALYZE */ - case 260: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==260); - case 422: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==422); -{ yymsp[0].minor.yy403 = true; } + case 253: /* analyze_opt ::= ANALYZE */ + case 261: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==261); + case 423: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==423); +{ yymsp[0].minor.yy173 = true; } break; - case 253: /* explain_options ::= */ -{ yymsp[1].minor.yy652 = createDefaultExplainOptions(pCxt); } + case 254: /* explain_options ::= */ +{ yymsp[1].minor.yy560 = createDefaultExplainOptions(pCxt); } break; - case 254: /* explain_options ::= explain_options VERBOSE NK_BOOL */ -{ yylhsminor.yy652 = setExplainVerbose(pCxt, yymsp[-2].minor.yy652, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 255: /* explain_options ::= explain_options VERBOSE NK_BOOL */ +{ yylhsminor.yy560 = setExplainVerbose(pCxt, yymsp[-2].minor.yy560, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 255: /* explain_options ::= explain_options RATIO NK_FLOAT */ -{ yylhsminor.yy652 = setExplainRatio(pCxt, yymsp[-2].minor.yy652, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 256: /* explain_options ::= explain_options RATIO NK_FLOAT */ +{ yylhsminor.yy560 = setExplainRatio(pCxt, yymsp[-2].minor.yy560, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 256: /* cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ -{ pCxt->pRootNode = createCompactStmt(pCxt, yymsp[-1].minor.yy210); } + case 257: /* cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP */ +{ pCxt->pRootNode = createCompactStmt(pCxt, yymsp[-1].minor.yy712); } break; - case 257: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ -{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy403, yymsp[-8].minor.yy403, &yymsp[-5].minor.yy5, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy552, yymsp[0].minor.yy462); } + case 258: /* 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.yy173, yymsp[-8].minor.yy173, &yymsp[-5].minor.yy533, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy196, yymsp[0].minor.yy424); } break; - case 258: /* cmd ::= DROP FUNCTION exists_opt function_name */ -{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } + case 259: /* cmd ::= DROP FUNCTION exists_opt function_name */ +{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy173, &yymsp[0].minor.yy533); } break; - case 261: /* bufsize_opt ::= */ -{ yymsp[1].minor.yy462 = 0; } + case 262: /* bufsize_opt ::= */ +{ yymsp[1].minor.yy424 = 0; } break; - case 262: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ -{ yymsp[-1].minor.yy462 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } + case 263: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ +{ yymsp[-1].minor.yy424 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } break; - case 263: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ -{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-5].minor.yy403, &yymsp[-4].minor.yy5, yymsp[-2].minor.yy652, yymsp[-3].minor.yy652, yymsp[0].minor.yy652); } + case 264: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ +{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-5].minor.yy173, &yymsp[-4].minor.yy533, yymsp[-2].minor.yy560, yymsp[-3].minor.yy560, yymsp[0].minor.yy560); } break; - case 264: /* cmd ::= DROP STREAM exists_opt stream_name */ -{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy403, &yymsp[0].minor.yy5); } + case 265: /* cmd ::= DROP STREAM exists_opt stream_name */ +{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy173, &yymsp[0].minor.yy533); } break; - case 266: /* into_opt ::= INTO full_table_name */ - case 403: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==403); - case 432: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==432); - case 455: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==455); -{ yymsp[-1].minor.yy652 = yymsp[0].minor.yy652; } + case 267: /* into_opt ::= INTO full_table_name */ + case 404: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==404); + case 433: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==433); + case 456: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==456); +{ yymsp[-1].minor.yy560 = yymsp[0].minor.yy560; } break; - case 268: /* stream_options ::= stream_options TRIGGER AT_ONCE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy652)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy652 = yymsp[-2].minor.yy652; } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 269: /* stream_options ::= stream_options TRIGGER AT_ONCE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy560)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy560 = yymsp[-2].minor.yy560; } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 269: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy652)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy652 = yymsp[-2].minor.yy652; } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 270: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy560)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy560 = yymsp[-2].minor.yy560; } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 270: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-3].minor.yy652)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy652)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); yylhsminor.yy652 = yymsp[-3].minor.yy652; } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + case 271: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-3].minor.yy560)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy560)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy560); yylhsminor.yy560 = yymsp[-3].minor.yy560; } + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 272: /* stream_options ::= stream_options IGNORE EXPIRED */ -{ ((SStreamOptions*)yymsp[-2].minor.yy652)->ignoreExpired = true; yylhsminor.yy652 = yymsp[-2].minor.yy652; } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 273: /* stream_options ::= stream_options IGNORE EXPIRED */ +{ ((SStreamOptions*)yymsp[-2].minor.yy560)->ignoreExpired = true; yylhsminor.yy560 = yymsp[-2].minor.yy560; } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 273: /* cmd ::= KILL CONNECTION NK_INTEGER */ + case 274: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } break; - case 274: /* cmd ::= KILL QUERY NK_STRING */ + case 275: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 275: /* cmd ::= KILL TRANSACTION NK_INTEGER */ + case 276: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } break; - case 276: /* cmd ::= BALANCE VGROUP */ + case 277: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } break; - case 277: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + case 278: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 278: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ -{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy210); } + case 279: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ +{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy712); } break; - case 279: /* cmd ::= SPLIT VGROUP NK_INTEGER */ + case 280: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 280: /* dnode_list ::= DNODE NK_INTEGER */ -{ yymsp[-1].minor.yy210 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + case 281: /* dnode_list ::= DNODE NK_INTEGER */ +{ yymsp[-1].minor.yy712 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } break; - case 282: /* cmd ::= SYNCDB db_name REPLICA */ -{ pCxt->pRootNode = createSyncdbStmt(pCxt, &yymsp[-1].minor.yy5); } + case 283: /* cmd ::= SYNCDB db_name REPLICA */ +{ pCxt->pRootNode = createSyncdbStmt(pCxt, &yymsp[-1].minor.yy533); } break; - case 283: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ -{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + case 284: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ +{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy560, yymsp[0].minor.yy560); } break; - case 285: /* cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-2].minor.yy652, yymsp[-1].minor.yy210, yymsp[0].minor.yy652); } + case 286: /* cmd ::= INSERT INTO full_table_name specific_cols_opt query_expression */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-2].minor.yy560, yymsp[-1].minor.yy712, yymsp[0].minor.yy560); } break; - case 286: /* literal ::= NK_INTEGER */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 287: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 287: /* literal ::= NK_FLOAT */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 288: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 288: /* literal ::= NK_STRING */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 289: /* literal ::= NK_STRING */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 289: /* literal ::= NK_BOOL */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 290: /* literal ::= NK_BOOL */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 290: /* literal ::= TIMESTAMP NK_STRING */ -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 291: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 291: /* literal ::= duration_literal */ - case 301: /* signed_literal ::= signed */ yytestcase(yyruleno==301); - case 321: /* expression ::= literal */ yytestcase(yyruleno==321); - case 322: /* expression ::= pseudo_column */ yytestcase(yyruleno==322); - case 323: /* expression ::= column_reference */ yytestcase(yyruleno==323); - case 324: /* expression ::= function_expression */ yytestcase(yyruleno==324); - case 325: /* expression ::= subquery */ yytestcase(yyruleno==325); - case 352: /* function_expression ::= literal_func */ yytestcase(yyruleno==352); - case 394: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==394); - case 398: /* boolean_primary ::= predicate */ yytestcase(yyruleno==398); - case 400: /* common_expression ::= expression */ yytestcase(yyruleno==400); - case 401: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==401); - case 404: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==404); - case 406: /* table_reference ::= table_primary */ yytestcase(yyruleno==406); - case 407: /* table_reference ::= joined_table */ yytestcase(yyruleno==407); - case 411: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==411); - case 461: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==461); - case 464: /* query_primary ::= query_specification */ yytestcase(yyruleno==464); -{ yylhsminor.yy652 = yymsp[0].minor.yy652; } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 292: /* literal ::= duration_literal */ + case 302: /* signed_literal ::= signed */ yytestcase(yyruleno==302); + case 322: /* expression ::= literal */ yytestcase(yyruleno==322); + case 323: /* expression ::= pseudo_column */ yytestcase(yyruleno==323); + case 324: /* expression ::= column_reference */ yytestcase(yyruleno==324); + case 325: /* expression ::= function_expression */ yytestcase(yyruleno==325); + case 326: /* expression ::= subquery */ yytestcase(yyruleno==326); + case 353: /* function_expression ::= literal_func */ yytestcase(yyruleno==353); + case 395: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==395); + case 399: /* boolean_primary ::= predicate */ yytestcase(yyruleno==399); + case 401: /* common_expression ::= expression */ yytestcase(yyruleno==401); + case 402: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==402); + case 405: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==405); + case 407: /* table_reference ::= table_primary */ yytestcase(yyruleno==407); + case 408: /* table_reference ::= joined_table */ yytestcase(yyruleno==408); + case 412: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==412); + case 462: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==462); + case 465: /* query_primary ::= query_specification */ yytestcase(yyruleno==465); +{ yylhsminor.yy560 = yymsp[0].minor.yy560; } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 292: /* literal ::= NULL */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 293: /* literal ::= NULL */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 293: /* literal ::= NK_QUESTION */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 294: /* literal ::= NK_QUESTION */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 294: /* duration_literal ::= NK_VARIABLE */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 295: /* duration_literal ::= NK_VARIABLE */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 295: /* signed ::= NK_INTEGER */ -{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 296: /* signed ::= NK_INTEGER */ +{ yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 296: /* signed ::= NK_PLUS NK_INTEGER */ -{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } + case 297: /* signed ::= NK_PLUS NK_INTEGER */ +{ yymsp[-1].minor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0); } break; - case 297: /* signed ::= NK_MINUS NK_INTEGER */ + case 298: /* 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.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); + yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 298: /* signed ::= NK_FLOAT */ -{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 299: /* signed ::= NK_FLOAT */ +{ yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 299: /* signed ::= NK_PLUS NK_FLOAT */ -{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + case 300: /* signed ::= NK_PLUS NK_FLOAT */ +{ yymsp[-1].minor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 300: /* signed ::= NK_MINUS NK_FLOAT */ + case 301: /* 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.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); + yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 302: /* signed_literal ::= NK_STRING */ -{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 303: /* signed_literal ::= NK_STRING */ +{ yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 303: /* signed_literal ::= NK_BOOL */ -{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 304: /* signed_literal ::= NK_BOOL */ +{ yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 304: /* signed_literal ::= TIMESTAMP NK_STRING */ -{ yymsp[-1].minor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + case 305: /* signed_literal ::= TIMESTAMP NK_STRING */ +{ yymsp[-1].minor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 305: /* signed_literal ::= duration_literal */ - case 307: /* signed_literal ::= literal_func */ yytestcase(yyruleno==307); - case 372: /* star_func_para ::= expression */ yytestcase(yyruleno==372); - case 427: /* select_item ::= common_expression */ yytestcase(yyruleno==427); - case 477: /* search_condition ::= common_expression */ yytestcase(yyruleno==477); -{ yylhsminor.yy652 = releaseRawExprNode(pCxt, yymsp[0].minor.yy652); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 306: /* signed_literal ::= duration_literal */ + case 308: /* signed_literal ::= literal_func */ yytestcase(yyruleno==308); + case 373: /* star_func_para ::= expression */ yytestcase(yyruleno==373); + case 428: /* select_item ::= common_expression */ yytestcase(yyruleno==428); + case 478: /* search_condition ::= common_expression */ yytestcase(yyruleno==478); +{ yylhsminor.yy560 = releaseRawExprNode(pCxt, yymsp[0].minor.yy560); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 306: /* signed_literal ::= NULL */ -{ yylhsminor.yy652 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 307: /* signed_literal ::= NULL */ +{ yylhsminor.yy560 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 326: /* expression ::= NK_LP expression NK_RP */ - case 399: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==399); -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 327: /* expression ::= NK_LP expression NK_RP */ + case 400: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==400); +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy560)); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 327: /* expression ::= NK_PLUS expression */ + case 328: /* expression ::= NK_PLUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy652)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy560)); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 328: /* expression ::= NK_MINUS expression */ + case 329: /* expression ::= NK_MINUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy652), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy560), NULL)); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 329: /* expression ::= expression NK_PLUS expression */ + case 330: /* expression ::= expression NK_PLUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 330: /* expression ::= expression NK_MINUS expression */ + case 331: /* expression ::= expression NK_MINUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 331: /* expression ::= expression NK_STAR expression */ + case 332: /* expression ::= expression NK_STAR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 332: /* expression ::= expression NK_SLASH expression */ + case 333: /* expression ::= expression NK_SLASH expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 333: /* expression ::= expression NK_REM expression */ + case 334: /* expression ::= expression NK_REM expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 334: /* expression ::= column_reference NK_ARROW NK_STRING */ + case 335: /* expression ::= column_reference NK_ARROW NK_STRING */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 335: /* expression ::= expression NK_BITAND expression */ + case 336: /* expression ::= expression NK_BITAND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 336: /* expression ::= expression NK_BITOR expression */ + case 337: /* expression ::= expression NK_BITOR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 339: /* column_reference ::= column_name */ -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy5, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy5)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 340: /* column_reference ::= column_name */ +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy533, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy533)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 340: /* column_reference ::= table_name NK_DOT column_name */ -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5, createColumnNode(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy5)); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 341: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy533, createColumnNode(pCxt, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy533)); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 341: /* pseudo_column ::= ROWTS */ - case 342: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==342); - case 344: /* pseudo_column ::= QSTARTTS */ yytestcase(yyruleno==344); - case 345: /* pseudo_column ::= QENDTS */ yytestcase(yyruleno==345); - case 346: /* pseudo_column ::= WSTARTTS */ yytestcase(yyruleno==346); - case 347: /* pseudo_column ::= WENDTS */ yytestcase(yyruleno==347); - case 348: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==348); - case 354: /* literal_func ::= NOW */ yytestcase(yyruleno==354); -{ yylhsminor.yy652 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 342: /* pseudo_column ::= ROWTS */ + case 343: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==343); + case 345: /* pseudo_column ::= QSTARTTS */ yytestcase(yyruleno==345); + case 346: /* pseudo_column ::= QENDTS */ yytestcase(yyruleno==346); + case 347: /* pseudo_column ::= WSTARTTS */ yytestcase(yyruleno==347); + case 348: /* pseudo_column ::= WENDTS */ yytestcase(yyruleno==348); + case 349: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==349); + case 355: /* literal_func ::= NOW */ yytestcase(yyruleno==355); +{ yylhsminor.yy560 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 343: /* pseudo_column ::= table_name NK_DOT TBNAME */ -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy5)))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 344: /* pseudo_column ::= table_name NK_DOT TBNAME */ +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy533)))); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 349: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 350: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==350); -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy5, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy5, yymsp[-1].minor.yy210)); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + case 350: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 351: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==351); +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy533, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy533, yymsp[-1].minor.yy712)); } + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 351: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), yymsp[-1].minor.yy552)); } - yymsp[-5].minor.yy652 = yylhsminor.yy652; + case 352: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), yymsp[-1].minor.yy196)); } + yymsp[-5].minor.yy560 = yylhsminor.yy560; break; - case 353: /* literal_func ::= noarg_func NK_LP NK_RP */ -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy5, NULL)); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 354: /* literal_func ::= noarg_func NK_LP NK_RP */ +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy533, NULL)); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 368: /* star_func_para_list ::= NK_STAR */ -{ yylhsminor.yy210 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy210 = yylhsminor.yy210; + case 369: /* star_func_para_list ::= NK_STAR */ +{ yylhsminor.yy712 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; - case 373: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 430: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==430); -{ yylhsminor.yy652 = createColumnNode(pCxt, &yymsp[-2].minor.yy5, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 374: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 431: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==431); +{ yylhsminor.yy560 = createColumnNode(pCxt, &yymsp[-2].minor.yy533, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 374: /* predicate ::= expression compare_op expression */ - case 379: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==379); + case 375: /* predicate ::= expression compare_op expression */ + case 380: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==380); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy428, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy128, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 375: /* predicate ::= expression BETWEEN expression AND expression */ + case 376: /* predicate ::= expression BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy652), releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy560), releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-4].minor.yy652 = yylhsminor.yy652; + yymsp[-4].minor.yy560 = yylhsminor.yy560; break; - case 376: /* predicate ::= expression NOT BETWEEN expression AND expression */ + case 377: /* predicate ::= expression NOT BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy652), releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy560), releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-5].minor.yy652 = yylhsminor.yy652; + yymsp[-5].minor.yy560 = yylhsminor.yy560; break; - case 377: /* predicate ::= expression IS NULL */ + case 378: /* predicate ::= expression IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), NULL)); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 378: /* predicate ::= expression IS NOT NULL */ + case 379: /* predicate ::= expression IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), NULL)); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 380: /* compare_op ::= NK_LT */ -{ yymsp[0].minor.yy428 = OP_TYPE_LOWER_THAN; } + case 381: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy128 = OP_TYPE_LOWER_THAN; } break; - case 381: /* compare_op ::= NK_GT */ -{ yymsp[0].minor.yy428 = OP_TYPE_GREATER_THAN; } + case 382: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy128 = OP_TYPE_GREATER_THAN; } break; - case 382: /* compare_op ::= NK_LE */ -{ yymsp[0].minor.yy428 = OP_TYPE_LOWER_EQUAL; } + case 383: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy128 = OP_TYPE_LOWER_EQUAL; } break; - case 383: /* compare_op ::= NK_GE */ -{ yymsp[0].minor.yy428 = OP_TYPE_GREATER_EQUAL; } + case 384: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy128 = OP_TYPE_GREATER_EQUAL; } break; - case 384: /* compare_op ::= NK_NE */ -{ yymsp[0].minor.yy428 = OP_TYPE_NOT_EQUAL; } + case 385: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy128 = OP_TYPE_NOT_EQUAL; } break; - case 385: /* compare_op ::= NK_EQ */ -{ yymsp[0].minor.yy428 = OP_TYPE_EQUAL; } + case 386: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy128 = OP_TYPE_EQUAL; } break; - case 386: /* compare_op ::= LIKE */ -{ yymsp[0].minor.yy428 = OP_TYPE_LIKE; } + case 387: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy128 = OP_TYPE_LIKE; } break; - case 387: /* compare_op ::= NOT LIKE */ -{ yymsp[-1].minor.yy428 = OP_TYPE_NOT_LIKE; } + case 388: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy128 = OP_TYPE_NOT_LIKE; } break; - case 388: /* compare_op ::= MATCH */ -{ yymsp[0].minor.yy428 = OP_TYPE_MATCH; } + case 389: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy128 = OP_TYPE_MATCH; } break; - case 389: /* compare_op ::= NMATCH */ -{ yymsp[0].minor.yy428 = OP_TYPE_NMATCH; } + case 390: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy128 = OP_TYPE_NMATCH; } break; - case 390: /* compare_op ::= CONTAINS */ -{ yymsp[0].minor.yy428 = OP_TYPE_JSON_CONTAINS; } + case 391: /* compare_op ::= CONTAINS */ +{ yymsp[0].minor.yy128 = OP_TYPE_JSON_CONTAINS; } break; - case 391: /* in_op ::= IN */ -{ yymsp[0].minor.yy428 = OP_TYPE_IN; } + case 392: /* in_op ::= IN */ +{ yymsp[0].minor.yy128 = OP_TYPE_IN; } break; - case 392: /* in_op ::= NOT IN */ -{ yymsp[-1].minor.yy428 = OP_TYPE_NOT_IN; } + case 393: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy128 = OP_TYPE_NOT_IN; } break; - case 393: /* in_predicate_value ::= NK_LP literal_list NK_RP */ -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy210)); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 394: /* in_predicate_value ::= NK_LP literal_list NK_RP */ +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy712)); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 395: /* boolean_value_expression ::= NOT boolean_primary */ + case 396: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy652), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy560), NULL)); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 396: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 397: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 397: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 398: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy652); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy652); - yylhsminor.yy652 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy560); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy560); + yylhsminor.yy560 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 405: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yylhsminor.yy652 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy652, yymsp[0].minor.yy652, NULL); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 406: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy560 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy560, yymsp[0].minor.yy560, NULL); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 408: /* table_primary ::= table_name alias_opt */ -{ yylhsminor.yy652 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 409: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy560 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy533, &yymsp[0].minor.yy533); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 409: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ yylhsminor.yy652 = createRealTableNode(pCxt, &yymsp[-3].minor.yy5, &yymsp[-1].minor.yy5, &yymsp[0].minor.yy5); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + case 410: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy560 = createRealTableNode(pCxt, &yymsp[-3].minor.yy533, &yymsp[-1].minor.yy533, &yymsp[0].minor.yy533); } + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 410: /* table_primary ::= subquery alias_opt */ -{ yylhsminor.yy652 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652), &yymsp[0].minor.yy5); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 411: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy560 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy560), &yymsp[0].minor.yy533); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 412: /* alias_opt ::= */ -{ yymsp[1].minor.yy5 = nil_token; } + case 413: /* alias_opt ::= */ +{ yymsp[1].minor.yy533 = nil_token; } break; - case 413: /* alias_opt ::= table_alias */ -{ yylhsminor.yy5 = yymsp[0].minor.yy5; } - yymsp[0].minor.yy5 = yylhsminor.yy5; + case 414: /* alias_opt ::= table_alias */ +{ yylhsminor.yy533 = yymsp[0].minor.yy533; } + yymsp[0].minor.yy533 = yylhsminor.yy533; break; - case 414: /* alias_opt ::= AS table_alias */ -{ yymsp[-1].minor.yy5 = yymsp[0].minor.yy5; } + case 415: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy533 = yymsp[0].minor.yy533; } break; - case 415: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 416: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==416); -{ yymsp[-2].minor.yy652 = yymsp[-1].minor.yy652; } + case 416: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 417: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==417); +{ yymsp[-2].minor.yy560 = yymsp[-1].minor.yy560; } break; - case 417: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ yylhsminor.yy652 = createJoinTableNode(pCxt, yymsp[-4].minor.yy74, yymsp[-5].minor.yy652, yymsp[-2].minor.yy652, yymsp[0].minor.yy652); } - yymsp[-5].minor.yy652 = yylhsminor.yy652; + case 418: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy560 = createJoinTableNode(pCxt, yymsp[-4].minor.yy36, yymsp[-5].minor.yy560, yymsp[-2].minor.yy560, yymsp[0].minor.yy560); } + yymsp[-5].minor.yy560 = yylhsminor.yy560; break; - case 418: /* join_type ::= */ -{ yymsp[1].minor.yy74 = JOIN_TYPE_INNER; } + case 419: /* join_type ::= */ +{ yymsp[1].minor.yy36 = JOIN_TYPE_INNER; } break; - case 419: /* join_type ::= INNER */ -{ yymsp[0].minor.yy74 = JOIN_TYPE_INNER; } + case 420: /* join_type ::= INNER */ +{ yymsp[0].minor.yy36 = JOIN_TYPE_INNER; } break; - case 420: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + case 421: /* 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.yy652 = createSelectStmt(pCxt, yymsp[-10].minor.yy403, yymsp[-9].minor.yy210, yymsp[-8].minor.yy652); - yymsp[-11].minor.yy652 = addWhereClause(pCxt, yymsp[-11].minor.yy652, yymsp[-7].minor.yy652); - yymsp[-11].minor.yy652 = addPartitionByClause(pCxt, yymsp[-11].minor.yy652, yymsp[-6].minor.yy210); - yymsp[-11].minor.yy652 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy652, yymsp[-2].minor.yy652); - yymsp[-11].minor.yy652 = addGroupByClause(pCxt, yymsp[-11].minor.yy652, yymsp[-1].minor.yy210); - yymsp[-11].minor.yy652 = addHavingClause(pCxt, yymsp[-11].minor.yy652, yymsp[0].minor.yy652); - yymsp[-11].minor.yy652 = addRangeClause(pCxt, yymsp[-11].minor.yy652, yymsp[-5].minor.yy652); - yymsp[-11].minor.yy652 = addEveryClause(pCxt, yymsp[-11].minor.yy652, yymsp[-4].minor.yy652); - yymsp[-11].minor.yy652 = addFillClause(pCxt, yymsp[-11].minor.yy652, yymsp[-3].minor.yy652); + yymsp[-11].minor.yy560 = createSelectStmt(pCxt, yymsp[-10].minor.yy173, yymsp[-9].minor.yy712, yymsp[-8].minor.yy560); + yymsp[-11].minor.yy560 = addWhereClause(pCxt, yymsp[-11].minor.yy560, yymsp[-7].minor.yy560); + yymsp[-11].minor.yy560 = addPartitionByClause(pCxt, yymsp[-11].minor.yy560, yymsp[-6].minor.yy712); + yymsp[-11].minor.yy560 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy560, yymsp[-2].minor.yy560); + yymsp[-11].minor.yy560 = addGroupByClause(pCxt, yymsp[-11].minor.yy560, yymsp[-1].minor.yy712); + yymsp[-11].minor.yy560 = addHavingClause(pCxt, yymsp[-11].minor.yy560, yymsp[0].minor.yy560); + yymsp[-11].minor.yy560 = addRangeClause(pCxt, yymsp[-11].minor.yy560, yymsp[-5].minor.yy560); + yymsp[-11].minor.yy560 = addEveryClause(pCxt, yymsp[-11].minor.yy560, yymsp[-4].minor.yy560); + yymsp[-11].minor.yy560 = addFillClause(pCxt, yymsp[-11].minor.yy560, yymsp[-3].minor.yy560); } break; - case 423: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy403 = false; } + case 424: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy173 = false; } break; - case 426: /* select_item ::= NK_STAR */ -{ yylhsminor.yy652 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy652 = yylhsminor.yy652; + case 427: /* select_item ::= NK_STAR */ +{ yylhsminor.yy560 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy560 = yylhsminor.yy560; break; - case 428: /* select_item ::= common_expression column_alias */ -{ yylhsminor.yy652 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652), &yymsp[0].minor.yy5); } - yymsp[-1].minor.yy652 = yylhsminor.yy652; + case 429: /* select_item ::= common_expression column_alias */ +{ yylhsminor.yy560 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy560), &yymsp[0].minor.yy533); } + yymsp[-1].minor.yy560 = yylhsminor.yy560; break; - case 429: /* select_item ::= common_expression AS column_alias */ -{ yylhsminor.yy652 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), &yymsp[0].minor.yy5); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 430: /* select_item ::= common_expression AS column_alias */ +{ yylhsminor.yy560 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), &yymsp[0].minor.yy533); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 434: /* partition_by_clause_opt ::= PARTITION BY expression_list */ - case 451: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==451); - case 467: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==467); -{ yymsp[-2].minor.yy210 = yymsp[0].minor.yy210; } + case 435: /* partition_by_clause_opt ::= PARTITION BY expression_list */ + case 452: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==452); + case 468: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==468); +{ yymsp[-2].minor.yy712 = yymsp[0].minor.yy712; } break; - case 436: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ -{ yymsp[-5].minor.yy652 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } + case 437: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ +{ yymsp[-5].minor.yy560 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), releaseRawExprNode(pCxt, yymsp[-1].minor.yy560)); } break; - case 437: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ -{ yymsp[-3].minor.yy652 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } + case 438: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ +{ yymsp[-3].minor.yy560 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy560)); } break; - case 438: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-5].minor.yy652 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), NULL, yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + case 439: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy560 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), NULL, yymsp[-1].minor.yy560, yymsp[0].minor.yy560); } break; - case 439: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-7].minor.yy652 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy652), releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), yymsp[-1].minor.yy652, yymsp[0].minor.yy652); } + case 440: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy560 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy560), releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), yymsp[-1].minor.yy560, yymsp[0].minor.yy560); } break; - case 441: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - case 459: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==459); -{ yymsp[-3].minor.yy652 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy652); } + case 442: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + case 460: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==460); +{ yymsp[-3].minor.yy560 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy560); } break; - case 443: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ yymsp[-3].minor.yy652 = createFillNode(pCxt, yymsp[-1].minor.yy270, NULL); } + case 444: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy560 = createFillNode(pCxt, yymsp[-1].minor.yy18, NULL); } break; - case 444: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ yymsp[-5].minor.yy652 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy210)); } + case 445: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ yymsp[-5].minor.yy560 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy712)); } break; - case 445: /* fill_mode ::= NONE */ -{ yymsp[0].minor.yy270 = FILL_MODE_NONE; } + case 446: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy18 = FILL_MODE_NONE; } break; - case 446: /* fill_mode ::= PREV */ -{ yymsp[0].minor.yy270 = FILL_MODE_PREV; } + case 447: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy18 = FILL_MODE_PREV; } break; - case 447: /* fill_mode ::= NULL */ -{ yymsp[0].minor.yy270 = FILL_MODE_NULL; } + case 448: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy18 = FILL_MODE_NULL; } break; - case 448: /* fill_mode ::= LINEAR */ -{ yymsp[0].minor.yy270 = FILL_MODE_LINEAR; } + case 449: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy18 = FILL_MODE_LINEAR; } break; - case 449: /* fill_mode ::= NEXT */ -{ yymsp[0].minor.yy270 = FILL_MODE_NEXT; } + case 450: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy18 = FILL_MODE_NEXT; } break; - case 452: /* group_by_list ::= expression */ -{ yylhsminor.yy210 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[0].minor.yy210 = yylhsminor.yy210; + case 453: /* group_by_list ::= expression */ +{ yylhsminor.yy712 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } + yymsp[0].minor.yy712 = yylhsminor.yy712; break; - case 453: /* group_by_list ::= group_by_list NK_COMMA expression */ -{ yylhsminor.yy210 = addNodeToList(pCxt, yymsp[-2].minor.yy210, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy652))); } - yymsp[-2].minor.yy210 = yylhsminor.yy210; + case 454: /* group_by_list ::= group_by_list NK_COMMA expression */ +{ yylhsminor.yy712 = addNodeToList(pCxt, yymsp[-2].minor.yy712, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy560))); } + yymsp[-2].minor.yy712 = yylhsminor.yy712; break; - case 457: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ -{ yymsp[-5].minor.yy652 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy652), releaseRawExprNode(pCxt, yymsp[-1].minor.yy652)); } + case 458: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ +{ yymsp[-5].minor.yy560 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy560), releaseRawExprNode(pCxt, yymsp[-1].minor.yy560)); } break; - case 460: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 461: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy652 = addOrderByClause(pCxt, yymsp[-3].minor.yy652, yymsp[-2].minor.yy210); - yylhsminor.yy652 = addSlimitClause(pCxt, yylhsminor.yy652, yymsp[-1].minor.yy652); - yylhsminor.yy652 = addLimitClause(pCxt, yylhsminor.yy652, yymsp[0].minor.yy652); + yylhsminor.yy560 = addOrderByClause(pCxt, yymsp[-3].minor.yy560, yymsp[-2].minor.yy712); + yylhsminor.yy560 = addSlimitClause(pCxt, yylhsminor.yy560, yymsp[-1].minor.yy560); + yylhsminor.yy560 = addLimitClause(pCxt, yylhsminor.yy560, yymsp[0].minor.yy560); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 462: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ yylhsminor.yy652 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy652, yymsp[0].minor.yy652); } - yymsp[-3].minor.yy652 = yylhsminor.yy652; + case 463: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ yylhsminor.yy560 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy560, yymsp[0].minor.yy560); } + yymsp[-3].minor.yy560 = yylhsminor.yy560; break; - case 463: /* query_expression_body ::= query_expression_body UNION query_expression_body */ -{ yylhsminor.yy652 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy652, yymsp[0].minor.yy652); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 464: /* query_expression_body ::= query_expression_body UNION query_expression_body */ +{ yylhsminor.yy560 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy560, yymsp[0].minor.yy560); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 465: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ -{ yymsp[-5].minor.yy652 = yymsp[-4].minor.yy652; } - yy_destructor(yypParser,369,&yymsp[-3].minor); - yy_destructor(yypParser,370,&yymsp[-2].minor); - yy_destructor(yypParser,371,&yymsp[-1].minor); + case 466: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ +{ + yymsp[-5].minor.yy560 = addOrderByClause(pCxt, yymsp[-4].minor.yy560, yymsp[-3].minor.yy712); + yymsp[-5].minor.yy560 = addSlimitClause(pCxt, yymsp[-5].minor.yy560, yymsp[-2].minor.yy560); + yymsp[-5].minor.yy560 = addLimitClause(pCxt, yymsp[-5].minor.yy560, yymsp[-1].minor.yy560); + } break; - case 469: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 473: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==473); -{ yymsp[-1].minor.yy652 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 470: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 474: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==474); +{ yymsp[-1].minor.yy560 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 470: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 474: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==474); -{ yymsp[-3].minor.yy652 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 471: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 475: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==475); +{ yymsp[-3].minor.yy560 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 471: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 475: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==475); -{ yymsp[-3].minor.yy652 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 472: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 476: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==476); +{ yymsp[-3].minor.yy560 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 476: /* subquery ::= NK_LP query_expression NK_RP */ -{ yylhsminor.yy652 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy652); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 477: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy560 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy560); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 480: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy652 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy652), yymsp[-1].minor.yy553, yymsp[0].minor.yy477); } - yymsp[-2].minor.yy652 = yylhsminor.yy652; + case 481: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy560 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy560), yymsp[-1].minor.yy218, yymsp[0].minor.yy109); } + yymsp[-2].minor.yy560 = yylhsminor.yy560; break; - case 481: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy553 = ORDER_ASC; } + case 482: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy218 = ORDER_ASC; } break; - case 482: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy553 = ORDER_ASC; } + case 483: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy218 = ORDER_ASC; } break; - case 483: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy553 = ORDER_DESC; } + case 484: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy218 = ORDER_DESC; } break; - case 484: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy477 = NULL_ORDER_DEFAULT; } + case 485: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy109 = NULL_ORDER_DEFAULT; } break; - case 485: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy477 = NULL_ORDER_FIRST; } + case 486: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy109 = NULL_ORDER_FIRST; } break; - case 486: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy477 = NULL_ORDER_LAST; } + case 487: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy109 = NULL_ORDER_LAST; } break; default: break; diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp index b39a066ba1..e9c8fb5326 100644 --- a/source/libs/parser/test/parInitialCTest.cpp +++ b/source/libs/parser/test/parInitialCTest.cpp @@ -76,8 +76,8 @@ TEST_F(ParserInitialCTest, createDatabase) { expect.db[len] = '\0'; expect.ignoreExist = igExists; expect.buffer = TSDB_DEFAULT_BUFFER_PER_VNODE; - expect.cacheLastRow = TSDB_DEFAULT_CACHE_LAST_ROW; - expect.lastRowMem = TSDB_DEFAULT_LAST_ROW_MEM; + expect.cacheLast = TSDB_DEFAULT_CACHE_LAST; + expect.cacheLastSize = TSDB_DEFAULT_CACHE_LAST_SIZE; expect.compression = TSDB_DEFAULT_COMP_LEVEL; expect.daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE; expect.fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD; @@ -98,8 +98,8 @@ TEST_F(ParserInitialCTest, createDatabase) { }; auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; }; - auto setDbCachelastFunc = [&](int8_t cachelast) { expect.cacheLastRow = cachelast; }; - auto setDbCachelastSize = [&](int8_t cachelastSize) { expect.lastRowMem = cachelastSize; }; + auto setDbCachelastFunc = [&](int8_t cachelast) { expect.cacheLast = cachelast; }; + auto setDbCachelastSize = [&](int8_t cachelastSize) { expect.cacheLastSize = cachelastSize; }; auto setDbCompressionFunc = [&](int8_t compressionLevel) { expect.compression = compressionLevel; }; auto setDbDaysFunc = [&](int32_t daysPerFile) { expect.daysPerFile = daysPerFile; }; auto setDbFsyncFunc = [&](int32_t fsyncPeriod) { expect.fsyncPeriod = fsyncPeriod; }; @@ -155,8 +155,8 @@ TEST_F(ParserInitialCTest, createDatabase) { ASSERT_EQ(req.compression, expect.compression); ASSERT_EQ(req.replications, expect.replications); ASSERT_EQ(req.strict, expect.strict); - ASSERT_EQ(req.cacheLastRow, expect.cacheLastRow); - ASSERT_EQ(req.lastRowMem, expect.lastRowMem); + ASSERT_EQ(req.cacheLast, expect.cacheLast); + ASSERT_EQ(req.cacheLastSize, expect.cacheLastSize); // ASSERT_EQ(req.schemaless, expect.schemaless); ASSERT_EQ(req.ignoreExist, expect.ignoreExist); ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions); diff --git a/source/libs/parser/test/parSelectTest.cpp b/source/libs/parser/test/parSelectTest.cpp index c6d74c5305..0aa1773c28 100644 --- a/source/libs/parser/test/parSelectTest.cpp +++ b/source/libs/parser/test/parSelectTest.cpp @@ -245,13 +245,21 @@ TEST_F(ParserSelectTest, orderBy) { TEST_F(ParserSelectTest, distinct) { useDb("root", "test"); - // run("SELECT distinct c1, c2 FROM t1 WHERE c1 > 0 order by c1"); + run("SELECT distinct c1, c2 FROM t1 WHERE c1 > 0 order by c1"); - // run("SELECT distinct c1 + 10, c2 FROM t1 WHERE c1 > 0 order by c1 + 10, c2"); + run("SELECT distinct c1 + 10, c2 FROM t1 WHERE c1 > 0 order by c1 + 10, c2"); - // run("SELECT distinct c1 + 10 cc1, c2 cc2 FROM t1 WHERE c1 > 0 order by cc1, c2"); + run("SELECT distinct c1 + 10 cc1, c2 cc2 FROM t1 WHERE c1 > 0 order by cc1, c2"); - // run("SELECT distinct COUNT(c2) FROM t1 WHERE c1 > 0 GROUP BY c1 order by COUNT(c2)"); + run("SELECT distinct COUNT(c2) FROM t1 WHERE c1 > 0 GROUP BY c1 order by COUNT(c2)"); +} + +TEST_F(ParserSelectTest, limit) { + useDb("root", "test"); + + run("SELECT c1, c2 FROM t1 LIMIT 10"); + + run("(SELECT c1, c2 FROM t1 LIMIT 10)"); } // INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [FILL(fill_mod_and_val)] @@ -329,70 +337,69 @@ TEST_F(ParserSelectTest, semanticCheck) { useDb("root", "test"); // TSDB_CODE_PAR_INVALID_COLUMN - run("SELECT c1, cc1 FROM t1", TSDB_CODE_PAR_INVALID_COLUMN, PARSER_STAGE_TRANSLATE); + run("SELECT c1, cc1 FROM t1", TSDB_CODE_PAR_INVALID_COLUMN); - run("SELECT t1.c1, t1.cc1 FROM t1", TSDB_CODE_PAR_INVALID_COLUMN, PARSER_STAGE_TRANSLATE); + run("SELECT t1.c1, t1.cc1 FROM t1", TSDB_CODE_PAR_INVALID_COLUMN); // TSDB_CODE_PAR_TABLE_NOT_EXIST - run("SELECT * FROM t10", TSDB_CODE_PAR_TABLE_NOT_EXIST, PARSER_STAGE_TRANSLATE); + run("SELECT * FROM t10", TSDB_CODE_PAR_TABLE_NOT_EXIST); - run("SELECT * FROM test.t10", TSDB_CODE_PAR_TABLE_NOT_EXIST, PARSER_STAGE_TRANSLATE); + run("SELECT * FROM test.t10", TSDB_CODE_PAR_TABLE_NOT_EXIST); - run("SELECT t2.c1 FROM t1", TSDB_CODE_PAR_TABLE_NOT_EXIST, PARSER_STAGE_TRANSLATE); + run("SELECT t2.c1 FROM t1", TSDB_CODE_PAR_TABLE_NOT_EXIST); // TSDB_CODE_PAR_AMBIGUOUS_COLUMN - run("SELECT c2 FROM t1 tt1, t1 tt2 WHERE tt1.c1 = tt2.c1", TSDB_CODE_PAR_AMBIGUOUS_COLUMN, PARSER_STAGE_TRANSLATE); + run("SELECT c2 FROM t1 tt1, t1 tt2 WHERE tt1.c1 = tt2.c1", TSDB_CODE_PAR_AMBIGUOUS_COLUMN); - run("SELECT c2 FROM (SELECT c1 c2, c2 FROM t1)", TSDB_CODE_PAR_AMBIGUOUS_COLUMN, PARSER_STAGE_TRANSLATE); + run("SELECT c2 FROM (SELECT c1 c2, c2 FROM t1)", TSDB_CODE_PAR_AMBIGUOUS_COLUMN); // TSDB_CODE_PAR_WRONG_VALUE_TYPE - run("SELECT timestamp '2010a' FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE, PARSER_STAGE_TRANSLATE); + run("SELECT timestamp '2010a' FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE); - run("SELECT LAST(*) + SUM(c1) FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE, PARSER_STAGE_TRANSLATE); + run("SELECT LAST(*) + SUM(c1) FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE); - run("SELECT CEIL(LAST(ts, c1)) FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE, PARSER_STAGE_TRANSLATE); + run("SELECT CEIL(LAST(ts, c1)) FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE); // TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION - run("SELECT c2 FROM t1 tt1 join t1 tt2 on COUNT(*) > 0", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION, - PARSER_STAGE_TRANSLATE); + run("SELECT c2 FROM t1 tt1 join t1 tt2 on COUNT(*) > 0", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION); - run("SELECT c2 FROM t1 WHERE COUNT(*) > 0", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION, PARSER_STAGE_TRANSLATE); + run("SELECT c2 FROM t1 WHERE COUNT(*) > 0", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION); - run("SELECT c2 FROM t1 GROUP BY COUNT(*)", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION, PARSER_STAGE_TRANSLATE); + run("SELECT c2 FROM t1 GROUP BY COUNT(*)", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION); // TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT - run("SELECT c2 FROM t1 order by 0", TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT, PARSER_STAGE_TRANSLATE); + run("SELECT c2 FROM t1 order by 0", TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT); - run("SELECT c2 FROM t1 order by 2", TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT, PARSER_STAGE_TRANSLATE); + run("SELECT c2 FROM t1 order by 2", TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT); // TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION - run("SELECT COUNT(*) cnt FROM t1 having c1 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION, PARSER_STAGE_TRANSLATE); + run("SELECT COUNT(*) cnt FROM t1 having c1 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION); - run("SELECT COUNT(*) cnt FROM t1 GROUP BY c2 having c1 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION, - PARSER_STAGE_TRANSLATE); + run("SELECT COUNT(*) cnt FROM t1 GROUP BY c2 having c1 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION); - run("SELECT COUNT(*), c1 cnt FROM t1 GROUP BY c2 having c2 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION, - PARSER_STAGE_TRANSLATE); + run("SELECT COUNT(*), c1 cnt FROM t1 GROUP BY c2 having c2 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION); - run("SELECT COUNT(*) cnt FROM t1 GROUP BY c2 having c2 > 0 order by c1", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION, - PARSER_STAGE_TRANSLATE); + run("SELECT COUNT(*) cnt FROM t1 GROUP BY c2 having c2 > 0 order by c1", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION); // TSDB_CODE_PAR_NOT_SINGLE_GROUP - run("SELECT COUNT(*), c1 FROM t1", TSDB_CODE_PAR_NOT_SINGLE_GROUP, PARSER_STAGE_TRANSLATE); + run("SELECT COUNT(*), c1 FROM t1", TSDB_CODE_PAR_NOT_SINGLE_GROUP); - run("SELECT COUNT(*) FROM t1 order by c1", TSDB_CODE_PAR_NOT_SINGLE_GROUP, PARSER_STAGE_TRANSLATE); + run("SELECT COUNT(*) FROM t1 order by c1", TSDB_CODE_PAR_NOT_SINGLE_GROUP); - run("SELECT c1 FROM t1 order by COUNT(*)", TSDB_CODE_PAR_NOT_SINGLE_GROUP, PARSER_STAGE_TRANSLATE); + run("SELECT c1 FROM t1 order by COUNT(*)", TSDB_CODE_PAR_NOT_SINGLE_GROUP); // TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION - run("SELECT distinct c1, c2 FROM t1 WHERE c1 > 0 order by ts", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION, - PARSER_STAGE_TRANSLATE); + run("SELECT distinct c1, c2 FROM t1 WHERE c1 > 0 order by ts", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION); - run("SELECT distinct c1 FROM t1 WHERE c1 > 0 order by COUNT(c2)", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION, - PARSER_STAGE_TRANSLATE); + run("SELECT distinct c1 FROM t1 WHERE c1 > 0 order by COUNT(c2)", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION); - run("SELECT distinct c2 FROM t1 WHERE c1 > 0 order by COUNT(c2)", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION, - PARSER_STAGE_TRANSLATE); + run("SELECT distinct c2 FROM t1 WHERE c1 > 0 order by COUNT(c2)", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION); +} + +TEST_F(ParserSelectTest, syntaxError) { + useDb("root", "test"); + + run("SELECT CAST(? AS BINARY(10)) FROM t1", TSDB_CODE_PAR_SYNTAX_ERROR, PARSER_STAGE_PARSE); } TEST_F(ParserSelectTest, setOperator) { diff --git a/source/libs/parser/test/parShowToUse.cpp b/source/libs/parser/test/parShowToUse.cpp index e109781169..eecb291554 100644 --- a/source/libs/parser/test/parShowToUse.cpp +++ b/source/libs/parser/test/parShowToUse.cpp @@ -222,6 +222,25 @@ TEST_F(ParserShowToUseTest, splitVgroup) { run("SPLIT VGROUP 15"); } +TEST_F(ParserShowToUseTest, trimDatabase) { + useDb("root", "test"); + + STrimDbReq expect = {0}; + + auto setTrimDbReq = [&](const char* pDb) { snprintf(expect.db, sizeof(expect.db), "0.%s", pDb); }; + + setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) { + ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_TRIM_DATABASE_STMT); + ASSERT_EQ(pQuery->pCmdMsg->msgType, TDMT_MND_TRIM_DB); + STrimDbReq req = {0}; + ASSERT_EQ(tDeserializeSTrimDbReq(pQuery->pCmdMsg->pMsg, pQuery->pCmdMsg->msgLen, &req), TSDB_CODE_SUCCESS); + ASSERT_EQ(std::string(req.db), std::string(expect.db)); + }); + + setTrimDbReq("wxy_db"); + run("TRIM DATABASE wxy_db"); +} + TEST_F(ParserShowToUseTest, useDatabase) { useDb("root", "test"); diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index cb38e1fc18..e90be75743 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -476,12 +476,12 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, int32_t code = TSDB_CODE_SUCCESS; // set grouyp keys, agg funcs and having conditions - if (TSDB_CODE_SUCCESS == code && pSelect->hasAggFuncs) { + if (TSDB_CODE_SUCCESS == code) { code = nodesCollectFuncs(pSelect, SQL_CLAUSE_GROUP_BY, fmIsAggFunc, &pAgg->pAggFuncs); } // rewrite the expression in subsequent clauses - if (TSDB_CODE_SUCCESS == code) { + if (TSDB_CODE_SUCCESS == code && NULL != pAgg->pAggFuncs) { code = rewriteExprsForSelect(pAgg->pAggFuncs, pSelect, SQL_CLAUSE_GROUP_BY); } diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index d4c470be3c..855427f26e 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -80,6 +80,23 @@ static void optResetParent(SLogicNode* pNode) { FOREACH(pChild, pNode->pChildren) { ((SLogicNode*)pChild)->pParent = pNode; } } +static EDealRes optRebuildTbanme(SNode** pNode, void* pContext) { + if (QUERY_NODE_COLUMN == nodeType(*pNode) && COLUMN_TYPE_TBNAME == ((SColumnNode*)*pNode)->colType) { + SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + if (NULL == pFunc) { + *(int32_t*)pContext = TSDB_CODE_OUT_OF_MEMORY; + return DEAL_RES_ERROR; + } + strcpy(pFunc->functionName, "tbname"); + pFunc->funcType = FUNCTION_TYPE_TBNAME; + pFunc->node.resType = ((SColumnNode*)*pNode)->node.resType; + nodesDestroyNode(*pNode); + *pNode = (SNode*)pFunc; + return DEAL_RES_IGNORE_CHILD; + } + return DEAL_RES_CONTINUE; +} + EDealRes scanPathOptHaveNormalColImpl(SNode* pNode, void* pContext) { if (QUERY_NODE_COLUMN == nodeType(pNode)) { // *((bool*)pContext) = (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType); @@ -312,6 +329,12 @@ static int32_t pushDownCondOptCalcTimeRange(SOptimizeContext* pCxt, SScanLogicNo return code; } +static int32_t pushDownCondOptRebuildTbanme(SNode** pTagCond) { + int32_t code = TSDB_CODE_SUCCESS; + nodesRewriteExpr(pTagCond, optRebuildTbanme, &code); + return code; +} + static int32_t pushDownCondOptDealScan(SOptimizeContext* pCxt, SScanLogicNode* pScan) { if (NULL == pScan->node.pConditions || OPTIMIZE_FLAG_TEST_MASK(pScan->node.optimizedFlag, OPTIMIZE_FLAG_PUSH_DOWN_CONDE) || @@ -323,6 +346,9 @@ static int32_t pushDownCondOptDealScan(SOptimizeContext* pCxt, SScanLogicNode* p SNode* pOtherCond = NULL; int32_t code = nodesPartitionCond(&pScan->node.pConditions, &pPrimaryKeyCond, &pScan->pTagIndexCond, &pScan->pTagCond, &pOtherCond); + if (TSDB_CODE_SUCCESS == code && NULL != pScan->pTagCond) { + code = pushDownCondOptRebuildTbanme(&pScan->pTagCond); + } if (TSDB_CODE_SUCCESS == code && NULL != pPrimaryKeyCond) { code = pushDownCondOptCalcTimeRange(pCxt, pScan, &pPrimaryKeyCond, &pOtherCond); } @@ -1338,9 +1364,9 @@ static EDealRes partTagsOptHasColImpl(SNode* pNode, void* pContext) { return DEAL_RES_CONTINUE; } -static bool partTagsOptHasCol(SNodeList* pPartKeys) { +static bool planOptNodeListHasCol(SNodeList* pKeys) { bool hasCol = false; - nodesWalkExprs(pPartKeys, partTagsOptHasColImpl, &hasCol); + nodesWalkExprs(pKeys, partTagsOptHasColImpl, &hasCol); return hasCol; } @@ -1383,29 +1409,12 @@ static bool partTagsOptMayBeOptimized(SLogicNode* pNode) { return false; } - return !partTagsOptHasCol(partTagsGetPartKeys(pNode)) && partTagsOptAreSupportedFuncs(partTagsGetFuncs(pNode)); -} - -static EDealRes partTagsOptRebuildTbanmeImpl(SNode** pNode, void* pContext) { - if (QUERY_NODE_COLUMN == nodeType(*pNode) && COLUMN_TYPE_TBNAME == ((SColumnNode*)*pNode)->colType) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (NULL == pFunc) { - *(int32_t*)pContext = TSDB_CODE_OUT_OF_MEMORY; - return DEAL_RES_ERROR; - } - strcpy(pFunc->functionName, "tbname"); - pFunc->funcType = FUNCTION_TYPE_TBNAME; - pFunc->node.resType = ((SColumnNode*)*pNode)->node.resType; - nodesDestroyNode(*pNode); - *pNode = (SNode*)pFunc; - return DEAL_RES_IGNORE_CHILD; - } - return DEAL_RES_CONTINUE; + return !planOptNodeListHasCol(partTagsGetPartKeys(pNode)) && partTagsOptAreSupportedFuncs(partTagsGetFuncs(pNode)); } static int32_t partTagsOptRebuildTbanme(SNodeList* pPartKeys) { int32_t code = TSDB_CODE_SUCCESS; - nodesRewriteExprs(pPartKeys, partTagsOptRebuildTbanmeImpl, &code); + nodesRewriteExprs(pPartKeys, optRebuildTbanme, &code); return code; } @@ -1977,7 +1986,8 @@ static bool lastRowScanOptMayBeOptimized(SLogicNode* pNode) { SNode* pFunc = NULL; FOREACH(pFunc, ((SAggLogicNode*)pNode)->pAggFuncs) { - if (FUNCTION_TYPE_LAST_ROW != ((SFunctionNode*)pFunc)->funcType) { + if (FUNCTION_TYPE_LAST_ROW != ((SFunctionNode*)pFunc)->funcType && + FUNCTION_TYPE_SELECT_VALUE != ((SFunctionNode*)pFunc)->funcType) { return false; } } @@ -2086,6 +2096,37 @@ static int32_t mergeProjectsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLog return mergeProjectsOptimizeImpl(pCxt, pLogicSubplan, pProjectNode); } +static bool tagScanMayBeOptimized(SLogicNode* pNode) { + if (QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(pNode) || (SCAN_TYPE_TAG == ((SScanLogicNode*)pNode)->scanType)) { + return false; + } + SScanLogicNode *pScan = (SScanLogicNode*)pNode; + if (NULL != pScan->pScanCols) { + return false; + } + if (NULL == pNode->pParent || QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pNode->pParent) || 1 != LIST_LENGTH(pNode->pParent->pChildren)) { + return false; + } + + SAggLogicNode* pAgg = (SAggLogicNode*)(pNode->pParent); + if (NULL == pAgg->pGroupKeys || NULL != pAgg->pAggFuncs || planOptNodeListHasCol(pAgg->pGroupKeys)) { + return false; + } + + return true; +} + +static int32_t tagScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { + SScanLogicNode* pScanNode = (SScanLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, tagScanMayBeOptimized); + if (NULL == pScanNode) { + return TSDB_CODE_SUCCESS; + } + + pScanNode->scanType = SCAN_TYPE_TAG; + pCxt->optimized = true; + return TSDB_CODE_SUCCESS; +} + // clang-format off static const SOptimizeRule optimizeRuleSet[] = { {.pName = "ScanPath", .optimizeFunc = scanPathOptimize}, @@ -2098,7 +2139,8 @@ static const SOptimizeRule optimizeRuleSet[] = { {.pName = "EliminateSetOperator", .optimizeFunc = eliminateSetOpOptimize}, {.pName = "RewriteTail", .optimizeFunc = rewriteTailOptimize}, {.pName = "RewriteUnique", .optimizeFunc = rewriteUniqueOptimize}, - {.pName = "LastRowScan", .optimizeFunc = lastRowScanOptimize} + {.pName = "LastRowScan", .optimizeFunc = lastRowScanOptimize}, + {.pName = "TagScan", .optimizeFunc = tagScanOptimize} }; // clang-format on diff --git a/source/libs/planner/src/planPhysiCreater.c b/source/libs/planner/src/planPhysiCreater.c index d10fe1ce0c..8c9c06be35 100644 --- a/source/libs/planner/src/planPhysiCreater.c +++ b/source/libs/planner/src/planPhysiCreater.c @@ -1519,6 +1519,7 @@ static SSubplan* makeSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubpl static int32_t buildInsertValuesSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan) { pSubplan->msgType = pModify->msgType; + pSubplan->execNode.nodeId = pModify->pVgDataBlocks->vg.vgId; pSubplan->execNode.epSet = pModify->pVgDataBlocks->vg.epSet; return createDataInserter(pCxt, pModify->pVgDataBlocks, &pSubplan->pDataSink); } diff --git a/source/libs/planner/src/planSpliter.c b/source/libs/planner/src/planSpliter.c index d7eccf4b8e..987da0dd17 100644 --- a/source/libs/planner/src/planSpliter.c +++ b/source/libs/planner/src/planSpliter.c @@ -877,7 +877,7 @@ static int32_t stbSplSplitSortNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) return code; } -static int32_t stbSplSplitScanNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) { +static int32_t stbSplSplitScanNodeWithoutPartTags(SSplitContext* pCxt, SStableSplitInfo* pInfo) { int32_t code = splCreateExchangeNodeForSubplan(pCxt, pInfo->pSubplan, pInfo->pSplitNode, SUBPLAN_TYPE_MERGE); if (TSDB_CODE_SUCCESS == code) { code = nodesListMakeStrictAppend(&pInfo->pSubplan->pChildren, @@ -887,6 +887,25 @@ static int32_t stbSplSplitScanNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) return code; } +static int32_t stbSplSplitScanNodeWithPartTags(SSplitContext* pCxt, SStableSplitInfo* pInfo) { + int32_t code = stbSplCreateMergeNode(pCxt, pInfo->pSubplan, pInfo->pSplitNode, NULL, pInfo->pSplitNode, true); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pInfo->pSubplan->pChildren, + (SNode*)splCreateScanSubplan(pCxt, pInfo->pSplitNode, SPLIT_FLAG_STABLE_SPLIT)); + } + pInfo->pSubplan->subplanType = SUBPLAN_TYPE_MERGE; + ++(pCxt->groupId); + return code; +} + +static int32_t stbSplSplitScanNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) { + SScanLogicNode* pScan = (SScanLogicNode*)pInfo->pSplitNode; + if (NULL != pScan->pGroupTags) { + return stbSplSplitScanNodeWithPartTags(pCxt, pInfo); + } + return stbSplSplitScanNodeWithoutPartTags(pCxt, pInfo); +} + static SNode* stbSplFindPrimaryKeyFromScan(SScanLogicNode* pScan) { SNode* pCol = NULL; FOREACH(pCol, pScan->pScanCols) { diff --git a/source/libs/planner/test/planOptimizeTest.cpp b/source/libs/planner/test/planOptimizeTest.cpp index e4019292d8..316148df27 100644 --- a/source/libs/planner/test/planOptimizeTest.cpp +++ b/source/libs/planner/test/planOptimizeTest.cpp @@ -37,6 +37,8 @@ TEST_F(PlanOptimizeTest, pushDownCondition) { run("SELECT ts, c1 FROM st1 WHERE tag1 > 4"); + run("SELECT ts, c1 FROM st1 WHERE TBNAME = 'st1s1'"); + run("SELECT ts, c1 FROM st1 WHERE tag1 > 4 or tag1 < 2"); run("SELECT ts, c1 FROM st1 WHERE tag1 > 4 AND tag2 = 'hello'"); @@ -85,4 +87,11 @@ TEST_F(PlanOptimizeTest, eliminateProjection) { TEST_F(PlanOptimizeTest, pushDownProjectCond) { useDb("root", "test"); run("select 1-abs(c1) from (select unique(c1) c1 from st1s3) where 1-c1>5 order by 1 nulls first"); +} + +TEST_F(PlanOptimizeTest, tagScan) { + useDb("root", "test"); + run("select tag1 from st1 group by tag1"); + run("select distinct tag1 from st1"); + run("select tag1*tag1 from st1 group by tag1*tag1"); } \ No newline at end of file diff --git a/source/libs/planner/test/planPartByTest.cpp b/source/libs/planner/test/planPartByTest.cpp index 48a4c12577..f1dd9403dd 100644 --- a/source/libs/planner/test/planPartByTest.cpp +++ b/source/libs/planner/test/planPartByTest.cpp @@ -59,4 +59,6 @@ TEST_F(PlanPartitionByTest, withGroupBy) { useDb("root", "test"); run("select count(*) from t1 partition by c1 group by c2"); + + run("SELECT TBNAME, c1 FROM st1 PARTITION BY TBNAME GROUP BY c1"); } diff --git a/source/libs/planner/test/planTestUtil.cpp b/source/libs/planner/test/planTestUtil.cpp index 4780249ec9..0f90b54adb 100644 --- a/source/libs/planner/test/planTestUtil.cpp +++ b/source/libs/planner/test/planTestUtil.cpp @@ -330,6 +330,10 @@ class PlannerTestBaseImpl { cxt.pMsg = stmtEnv_.msgBuf_.data(); cxt.msgLen = stmtEnv_.msgBuf_.max_size(); cxt.svrVer = "3.0.0.0"; + if (prepare) { + SStmtCallback stmtCb = {0}; + cxt.pStmtCb = &stmtCb; + } DO_WITH_THROW(qParseSql, &cxt, pQuery); if (prepare) { diff --git a/source/libs/qworker/inc/qwInt.h b/source/libs/qworker/inc/qwInt.h index 539643c390..b35e0e2fc4 100644 --- a/source/libs/qworker/inc/qwInt.h +++ b/source/libs/qworker/inc/qwInt.h @@ -316,34 +316,34 @@ typedef struct SQWorkerMgmt { #define QW_LOCK(type, _lock) \ do { \ if (QW_READ == (type)) { \ - assert(atomic_load_32((_lock)) >= 0); \ - QW_LOCK_DEBUG("QW RLOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ + QW_LOCK_DEBUG("QW RLOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosRLockLatch(_lock); \ - QW_LOCK_DEBUG("QW RLOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) > 0); \ + QW_LOCK_DEBUG("QW RLOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) > 0); \ } else { \ - assert(atomic_load_32((_lock)) >= 0); \ - QW_LOCK_DEBUG("QW WLOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ + QW_LOCK_DEBUG("QW WLOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosWLockLatch(_lock); \ - QW_LOCK_DEBUG("QW WLOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ + QW_LOCK_DEBUG("QW WLOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ } \ } while (0) #define QW_UNLOCK(type, _lock) \ do { \ if (QW_READ == (type)) { \ - assert(atomic_load_32((_lock)) > 0); \ - QW_LOCK_DEBUG("QW RULOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) > 0); \ + QW_LOCK_DEBUG("QW RULOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosRUnLockLatch(_lock); \ - QW_LOCK_DEBUG("QW RULOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) >= 0); \ + QW_LOCK_DEBUG("QW RULOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ } else { \ - assert(atomic_load_32((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ - QW_LOCK_DEBUG("QW WULOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \ + QW_LOCK_DEBUG("QW WULOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ taosWUnLockLatch(_lock); \ - QW_LOCK_DEBUG("QW WULOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \ - assert(atomic_load_32((_lock)) >= 0); \ + QW_LOCK_DEBUG("QW WULOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ } \ } while (0) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 42121e8813..0348f13191 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -3623,7 +3623,8 @@ EDealRes fltReviseRewriter(SNode** pNode, void* pContext) { return DEAL_RES_CONTINUE; } - if (FILTER_GET_FLAG(stat->info->options, FLT_OPTION_TIMESTAMP) && node->opType >= OP_TYPE_NOT_EQUAL) { + if (FILTER_GET_FLAG(stat->info->options, FLT_OPTION_TIMESTAMP) && + (node->opType >= OP_TYPE_NOT_EQUAL) && (node->opType != OP_TYPE_IS_NULL && node->opType != OP_TYPE_IS_NOT_NULL)) { stat->scalarMode = true; return DEAL_RES_CONTINUE; } diff --git a/source/libs/scheduler/inc/schInt.h b/source/libs/scheduler/inc/schInt.h index 052fdefa61..e5c7e37479 100644 --- a/source/libs/scheduler/inc/schInt.h +++ b/source/libs/scheduler/inc/schInt.h @@ -54,6 +54,11 @@ typedef enum { SCH_OP_GET_STATUS, } SCH_OP_TYPE; +typedef struct SSchDebug { + bool lockEnable; + bool apiEnable; +} SSchDebug; + typedef struct SSchTrans { void *pTrans; void *pHandle; @@ -186,7 +191,7 @@ typedef struct SSchTaskProfile { typedef struct SSchTask { uint64_t taskId; // task id - SRWLatch lock; // task lock + SRWLatch lock; // task reentrant lock int32_t maxExecTimes; // task may exec times int32_t execId; // task current execute try index SSchLevel *level; // level @@ -356,8 +361,41 @@ extern SSchedulerMgmt schMgmt; #define SCH_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { SCH_SET_ERRNO(_code); } return _code; } while (0) #define SCH_ERR_JRET(c) do { code = c; if (code != TSDB_CODE_SUCCESS) { SCH_SET_ERRNO(code); goto _return; } } while (0) -#define SCH_LOCK(type, _lock) (SCH_READ == (type) ? taosRLockLatch(_lock) : taosWLockLatch(_lock)) -#define SCH_UNLOCK(type, _lock) (SCH_READ == (type) ? taosRUnLockLatch(_lock) : taosWUnLockLatch(_lock)) +#define SCH_LOCK_DEBUG(...) do { if (gSCHDebug.lockEnable) { qDebug(__VA_ARGS__); } } while (0) + +#define TD_RWLATCH_WRITE_FLAG_COPY 0x40000000 + +#define SCH_LOCK(type, _lock) do { \ + if (SCH_READ == (type)) { \ + assert(atomic_load_64(_lock) >= 0); \ + SCH_LOCK_DEBUG("SCH RLOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + taosRLockLatch(_lock); \ + SCH_LOCK_DEBUG("SCH RLOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64(_lock) > 0); \ + } else { \ + assert(atomic_load_64(_lock) >= 0); \ + SCH_LOCK_DEBUG("SCH WLOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + taosWLockLatch(_lock); \ + SCH_LOCK_DEBUG("SCH WLOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64(_lock) & TD_RWLATCH_WRITE_FLAG_COPY); \ + } \ +} while (0) + +#define SCH_UNLOCK(type, _lock) do { \ + if (SCH_READ == (type)) { \ + assert(atomic_load_64((_lock)) > 0); \ + SCH_LOCK_DEBUG("SCH RULOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + taosRUnLockLatch(_lock); \ + SCH_LOCK_DEBUG("SCH RULOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ + } else { \ + assert(atomic_load_64((_lock)) & TD_RWLATCH_WRITE_FLAG_COPY); \ + SCH_LOCK_DEBUG("SCH WULOCK%p:%" PRIx64 ", %s:%d B", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + taosWUnLockLatch(_lock); \ + SCH_LOCK_DEBUG("SCH WULOCK%p:%" PRIx64 ", %s:%d E", (_lock), atomic_load_64(_lock), __FILE__, __LINE__); \ + assert(atomic_load_64((_lock)) >= 0); \ + } \ +} while (0) void schDeregisterTaskHb(SSchJob *pJob, SSchTask *pTask); @@ -434,6 +472,9 @@ int32_t schLaunchLevelTasks(SSchJob *pJob, SSchLevel *level); int32_t schGetTaskFromList(SHashObj *pTaskList, uint64_t taskId, SSchTask **pTask); int32_t schInitTask(SSchJob *pJob, SSchTask *pTask, SSubplan *pPlan, SSchLevel *pLevel, int32_t levelNum); int32_t schSwitchTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask); +void schDirectPostJobRes(SSchedulerReq* pReq, int32_t errCode); + +extern SSchDebug gSCHDebug; #ifdef __cplusplus diff --git a/source/libs/scheduler/src/schDbg.c b/source/libs/scheduler/src/schDbg.c index 7f013b8f32..a6398522d3 100644 --- a/source/libs/scheduler/src/schDbg.c +++ b/source/libs/scheduler/src/schDbg.c @@ -17,6 +17,7 @@ #include "schInt.h" tsem_t schdRspSem; +SSchDebug gSCHDebug = {0}; void schdExecCallback(SExecResult* pResult, void* param, int32_t code) { if (code) { diff --git a/source/libs/scheduler/src/schJob.c b/source/libs/scheduler/src/schJob.c index d2f9624eee..e482814ee7 100644 --- a/source/libs/scheduler/src/schJob.c +++ b/source/libs/scheduler/src/schJob.c @@ -337,14 +337,14 @@ int32_t schValidateAndBuildJob(SQueryPlan *pDag, SSchJob *pJob) { SCH_SET_JOB_TYPE(pJob, plan->subplanType); SSchTask task = {0}; - SCH_ERR_JRET(schInitTask(pJob, &task, plan, pLevel, levelNum)); - SSchTask *pTask = taosArrayPush(pLevel->subTasks, &task); if (NULL == pTask) { SCH_TASK_ELOG("taosArrayPush task to level failed, level:%d, taskIdx:%d", pLevel->level, n); SCH_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY); } + SCH_ERR_JRET(schInitTask(pJob, pTask, plan, pLevel, levelNum)); + SCH_ERR_JRET(schAppendJobDataSrc(pJob, pTask)); if (0 != taosHashPut(planToTask, &plan, POINTER_BYTES, &pTask, POINTER_BYTES)) { @@ -543,9 +543,12 @@ int32_t schLaunchJobLowerLevel(SSchJob *pJob, SSchTask *pTask) { int32_t schSaveJobQueryRes(SSchJob *pJob, SQueryTableRsp *rsp) { if (rsp->tbFName[0]) { + SCH_LOCK(SCH_WRITE, &pJob->resLock); + if (NULL == pJob->execRes.res) { pJob->execRes.res = taosArrayInit(pJob->taskNum, sizeof(STbVerInfo)); if (NULL == pJob->execRes.res) { + SCH_UNLOCK(SCH_WRITE, &pJob->resLock); SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } } @@ -557,6 +560,8 @@ int32_t schSaveJobQueryRes(SSchJob *pJob, SQueryTableRsp *rsp) { taosArrayPush((SArray *)pJob->execRes.res, &tbInfo); pJob->execRes.msgType = TDMT_SCH_QUERY; + + SCH_UNLOCK(SCH_WRITE, &pJob->resLock); } return TSDB_CODE_SUCCESS; @@ -758,6 +763,17 @@ int32_t schExecJob(SSchJob *pJob, SSchedulerReq *pReq) { return TSDB_CODE_SUCCESS; } +void schDirectPostJobRes(SSchedulerReq* pReq, int32_t errCode) { + if (NULL == pReq || pReq->syncReq) { + return; + } + + if (pReq->execFp) { + (*pReq->execFp)(NULL, pReq->cbParam, errCode); + } else if (pReq->fetchFp) { + (*pReq->fetchFp)(NULL, pReq->cbParam, errCode); + } +} void schProcessOnOpEnd(SSchJob *pJob, SCH_OP_TYPE type, SSchedulerReq* pReq, int32_t errCode) { int32_t op = 0; @@ -796,17 +812,13 @@ void schProcessOnOpEnd(SSchJob *pJob, SCH_OP_TYPE type, SSchedulerReq* pReq, int int32_t schProcessOnOpBegin(SSchJob* pJob, SCH_OP_TYPE type, SSchedulerReq* pReq) { int32_t code = 0; - int8_t status = 0; - - if (schJobNeedToStop(pJob, &status)) { - SCH_JOB_ELOG("abort op %s cause of job need to stop, status:%s", schGetOpStr(type), jobTaskStatusStr(status)); - SCH_ERR_RET(TSDB_CODE_SCH_IGNORE_ERROR); - } + int8_t status = SCH_GET_JOB_STATUS(pJob); switch (type) { case SCH_OP_EXEC: if (SCH_OP_NULL != atomic_val_compare_exchange_32(&pJob->opStatus.op, SCH_OP_NULL, type)) { SCH_JOB_ELOG("job already in %s operation", schGetOpStr(pJob->opStatus.op)); + schDirectPostJobRes(pReq, TSDB_CODE_TSC_APP_ERROR); SCH_ERR_RET(TSDB_CODE_TSC_APP_ERROR); } @@ -817,11 +829,16 @@ int32_t schProcessOnOpBegin(SSchJob* pJob, SCH_OP_TYPE type, SSchedulerReq* pReq case SCH_OP_FETCH: if (SCH_OP_NULL != atomic_val_compare_exchange_32(&pJob->opStatus.op, SCH_OP_NULL, type)) { SCH_JOB_ELOG("job already in %s operation", schGetOpStr(pJob->opStatus.op)); + schDirectPostJobRes(pReq, TSDB_CODE_TSC_APP_ERROR); SCH_ERR_RET(TSDB_CODE_TSC_APP_ERROR); } SCH_JOB_DLOG("job start %s operation", schGetOpStr(pJob->opStatus.op)); - + + pJob->userRes.fetchRes = pReq->pFetchRes; + pJob->userRes.fetchFp = pReq->fetchFp; + pJob->userRes.cbParam = pReq->cbParam; + pJob->opStatus.syncReq = pReq->syncReq; if (!SCH_JOB_NEED_FETCH(pJob)) { @@ -834,10 +851,6 @@ int32_t schProcessOnOpBegin(SSchJob* pJob, SCH_OP_TYPE type, SSchedulerReq* pReq SCH_ERR_RET(TSDB_CODE_SCH_STATUS_ERROR); } - pJob->userRes.fetchRes = pReq->pFetchRes; - pJob->userRes.fetchFp = pReq->fetchFp; - pJob->userRes.cbParam = pReq->cbParam; - break; case SCH_OP_GET_STATUS: if (pJob->status < JOB_TASK_STATUS_INIT || pJob->levelNum <= 0 || NULL == pJob->levels) { @@ -850,6 +863,11 @@ int32_t schProcessOnOpBegin(SSchJob* pJob, SCH_OP_TYPE type, SSchedulerReq* pReq SCH_ERR_RET(TSDB_CODE_TSC_APP_ERROR); } + if (schJobNeedToStop(pJob, &status)) { + SCH_JOB_ELOG("abort op %s cause of job need to stop, status:%s", schGetOpStr(type), jobTaskStatusStr(status)); + SCH_ERR_RET(TSDB_CODE_SCH_IGNORE_ERROR); + } + return TSDB_CODE_SUCCESS; } diff --git a/source/libs/scheduler/src/schRemote.c b/source/libs/scheduler/src/schRemote.c index 2257ba8328..1b893739bd 100644 --- a/source/libs/scheduler/src/schRemote.c +++ b/source/libs/scheduler/src/schRemote.c @@ -35,7 +35,7 @@ int32_t schValidateRspMsgType(SSchJob *pJob, SSchTask *pTask, int32_t msgType) { SCH_TASK_ELOG("rsp msg type mis-match, last sent msgType:%s, rspType:%s", TMSG_INFO(lastMsgType), TMSG_INFO(msgType)); SCH_ERR_RET(TSDB_CODE_SCH_STATUS_ERROR); - } + } if (taskStatus != JOB_TASK_STATUS_PART_SUCC) { SCH_TASK_ELOG("rsp msg conflicted with task status, status:%s, rspType:%s", jobTaskStatusStr(taskStatus), TMSG_INFO(msgType)); @@ -75,7 +75,7 @@ int32_t schValidateRspMsgType(SSchJob *pJob, SSchTask *pTask, int32_t msgType) { // Note: no more task error processing, handled in function internal int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDataBuf *pMsg, int32_t rspCode) { int32_t code = 0; - char *msg = pMsg->pData; + char *msg = pMsg->pData; int32_t msgSize = pMsg->len; int32_t msgType = pMsg->msgType; @@ -253,15 +253,15 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDa rsp->sversion = ntohl(rsp->sversion); rsp->tversion = ntohl(rsp->tversion); rsp->affectedRows = be64toh(rsp->affectedRows); - + SCH_ERR_JRET(rsp->code); SCH_ERR_JRET(schSaveJobQueryRes(pJob, rsp)); atomic_add_fetch_32(&pJob->resNumOfRows, rsp->affectedRows); - taosMemoryFreeClear(msg); - + taosMemoryFreeClear(msg); + SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask)); break; @@ -375,7 +375,8 @@ int32_t schHandleCallback(void *param, SDataBuf *pMsg, int32_t rspCode) { SSchTask *pTask = NULL; SSchJob *pJob = NULL; - qDebug("begin to handle rsp msg, type:%s, handle:%p, code:%s", TMSG_INFO(pMsg->msgType), pMsg->handle, tstrerror(rspCode)); + qDebug("begin to handle rsp msg, type:%s, handle:%p, code:%s", TMSG_INFO(pMsg->msgType), pMsg->handle, + tstrerror(rspCode)); SCH_ERR_RET(schProcessOnCbBegin(&pJob, &pTask, pParam->queryId, pParam->refId, pParam->taskId)); @@ -387,7 +388,8 @@ int32_t schHandleCallback(void *param, SDataBuf *pMsg, int32_t rspCode) { taosMemoryFreeClear(pMsg->pData); taosMemoryFreeClear(param); - qDebug("end to handle rsp msg, type:%s, handle:%p, code:%s", TMSG_INFO(pMsg->msgType), pMsg->handle, tstrerror(rspCode)); + qDebug("end to handle rsp msg, type:%s, handle:%p, code:%s", TMSG_INFO(pMsg->msgType), pMsg->handle, + tstrerror(rspCode)); SCH_RET(code); } @@ -424,7 +426,7 @@ int32_t schHandleCommitCallback(void *param, SDataBuf *pMsg, int32_t code) { } int32_t schHandleHbCallback(void *param, SDataBuf *pMsg, int32_t code) { - SSchedulerHbRsp rsp = {0}; + SSchedulerHbRsp rsp = {0}; SSchTaskCallbackParam *pParam = (SSchTaskCallbackParam *)param; if (code) { @@ -453,8 +455,8 @@ _return: SCH_RET(code); } - -int32_t schMakeCallbackParam(SSchJob *pJob, SSchTask *pTask, int32_t msgType, bool isHb, SSchTrans *trans, void **pParam) { +int32_t schMakeCallbackParam(SSchJob *pJob, SSchTask *pTask, int32_t msgType, bool isHb, SSchTrans *trans, + void **pParam) { if (!isHb) { SSchTaskCallbackParam *param = taosMemoryCalloc(1, sizeof(SSchTaskCallbackParam)); if (NULL == param) { @@ -940,7 +942,8 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr, if (NULL == addr) { addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx); isCandidateAddr = true; - SCH_TASK_DLOG("target candidateIdx %d", pTask->candidateIdx); + SCH_TASK_DLOG("target candidateIdx %d, epInUse %d/%d", pTask->candidateIdx, addr->epSet.inUse, + addr->epSet.numOfEps); } switch (msgType) { diff --git a/source/libs/scheduler/src/schStatus.c b/source/libs/scheduler/src/schStatus.c index 091b1359e0..a4fa4f2839 100644 --- a/source/libs/scheduler/src/schStatus.c +++ b/source/libs/scheduler/src/schStatus.c @@ -77,6 +77,7 @@ int32_t schHandleOpEndEvent(SSchJob* pJob, SCH_OP_TYPE type, SSchedulerReq* pReq int32_t code = errCode; if (NULL == pJob) { + schDirectPostJobRes(pReq, errCode); SCH_RET(code); } diff --git a/source/libs/scheduler/src/schTask.c b/source/libs/scheduler/src/schTask.c index e1e4ed8769..4275bea3f0 100644 --- a/source/libs/scheduler/src/schTask.c +++ b/source/libs/scheduler/src/schTask.c @@ -21,11 +21,9 @@ #include "tref.h" #include "trpc.h" - - void schFreeTask(SSchJob *pJob, SSchTask *pTask) { schDeregisterTaskHb(pJob, pTask); - + if (pTask->candidateAddrs) { taosArrayDestroy(pTask->candidateAddrs); } @@ -45,21 +43,22 @@ void schFreeTask(SSchJob *pJob, SSchTask *pTask) { } } - int32_t schInitTask(SSchJob *pJob, SSchTask *pTask, SSubplan *pPlan, SSchLevel *pLevel, int32_t levelNum) { int32_t code = 0; - + pTask->plan = pPlan; pTask->level = pLevel; pTask->execId = -1; pTask->maxExecTimes = SCH_TASK_MAX_EXEC_TIMES(pLevel->level, levelNum); pTask->timeoutUsec = SCH_DEFAULT_TASK_TIMEOUT_USEC; pTask->taskId = schGenTaskId(); - pTask->execNodes = taosHashInit(SCH_MAX_CANDIDATE_EP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK); + pTask->execNodes = + taosHashInit(SCH_MAX_CANDIDATE_EP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK); pTask->profile.execTime = taosMemoryCalloc(pTask->maxExecTimes, sizeof(int64_t)); if (NULL == pTask->execNodes || NULL == pTask->profile.execTime) { SCH_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY); } + taosInitReentrantRWLatch(&pTask->lock); SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_INIT); @@ -109,8 +108,8 @@ int32_t schDropTaskExecNode(SSchJob *pJob, SSchTask *pTask, void *handle, int32_ } else { SCH_TASK_DLOG("execId %d removed from execNodeList", execId); } - - if (execId != pTask->execId) { // ignore it + + if (execId != pTask->execId) { // ignore it SCH_TASK_DLOG("execId %d is not current execId %d", execId, pTask->execId); SCH_ERR_RET(TSDB_CODE_SCH_IGNORE_ERROR); } @@ -148,13 +147,13 @@ int32_t schProcessOnTaskFailure(SSchJob *pJob, SSchTask *pTask, int32_t errCode) if (TSDB_CODE_SCH_IGNORE_ERROR == errCode) { return TSDB_CODE_SCH_IGNORE_ERROR; } - + int8_t status = 0; if (schJobNeedToStop(pJob, &status)) { SCH_TASK_DLOG("no more task failure processing cause of job status %s", jobTaskStatusStr(status)); SCH_ERR_RET(TSDB_CODE_SCH_IGNORE_ERROR); } - + if (SCH_GET_TASK_STATUS(pTask) != JOB_TASK_STATUS_EXEC) { SCH_TASK_ELOG("task already not in EXEC status, status:%s", SCH_GET_TASK_STATUS_STR(pTask)); SCH_ERR_RET(TSDB_CODE_SCH_STATUS_ERROR); @@ -203,8 +202,6 @@ int32_t schProcessOnTaskFailure(SSchJob *pJob, SSchTask *pTask, int32_t errCode) SCH_RET(errCode); } - - // Note: no more task error processing, handled in function internal int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) { bool moved = false; @@ -263,16 +260,17 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) { SSchTask *parent = *(SSchTask **)taosArrayGet(pTask->parents, i); int32_t readyNum = atomic_add_fetch_32(&parent->childReady, 1); - SCH_LOCK(SCH_WRITE, &parent->lock); - SDownstreamSourceNode source = {.type = QUERY_NODE_DOWNSTREAM_SOURCE, - .taskId = pTask->taskId, - .schedId = schMgmt.sId, - .execId = pTask->execId, - .addr = pTask->succeedAddr, - .fetchMsgType = SCH_FETCH_TYPE(pTask), - }; + SCH_LOCK_TASK(parent); + SDownstreamSourceNode source = { + .type = QUERY_NODE_DOWNSTREAM_SOURCE, + .taskId = pTask->taskId, + .schedId = schMgmt.sId, + .execId = pTask->execId, + .addr = pTask->succeedAddr, + .fetchMsgType = SCH_FETCH_TYPE(pTask), + }; qSetSubplanExecutionNode(parent->plan, pTask->plan->id.groupId, &source); - SCH_UNLOCK(SCH_WRITE, &parent->lock); + SCH_UNLOCK_TASK(parent); if (SCH_TASK_READY_FOR_LAUNCH(readyNum, parent)) { SCH_TASK_DLOG("all %d children task done, start to launch parent task 0x%" PRIx64, readyNum, parent->taskId); @@ -290,29 +288,29 @@ int32_t schRescheduleTask(SSchJob *pJob, SSchTask *pTask) { return TSDB_CODE_SUCCESS; } - if (SCH_TASK_TIMEOUT(pTask) && JOB_TASK_STATUS_EXEC == pTask->status && - pJob->fetchTask != pTask && taosArrayGetSize(pTask->candidateAddrs) > 1) { + if (SCH_TASK_TIMEOUT(pTask) && JOB_TASK_STATUS_EXEC == pTask->status && pJob->fetchTask != pTask && + taosArrayGetSize(pTask->candidateAddrs) > 1) { SCH_TASK_DLOG("task execId %d will be rescheduled now", pTask->execId); schDropTaskOnExecNode(pJob, pTask); taosHashClear(pTask->execNodes); - + SCH_ERR_RET(schProcessOnTaskFailure(pJob, pTask, TSDB_CODE_SCH_TIMEOUT_ERROR)); } return TSDB_CODE_SUCCESS; } -int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf* pData, int32_t rspCode) { +int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32_t rspCode) { int32_t code = 0; - + if ((pTask->execId + 1) >= pTask->maxExecTimes) { SCH_TASK_DLOG("task no more retry since reach max try times, execId:%d", pTask->execId); - schSwitchJobStatus(pJob, JOB_TASK_STATUS_FAIL, (void*)&rspCode); + schSwitchJobStatus(pJob, JOB_TASK_STATUS_FAIL, (void *)&rspCode); return TSDB_CODE_SUCCESS; } SCH_TASK_DLOG("task will be redirected now, status:%s", SCH_GET_TASK_STATUS_STR(pTask)); - + schDropTaskOnExecNode(pJob, pTask); taosHashClear(pTask->execNodes); SCH_ERR_JRET(schRemoveTaskFromExecList(pJob, pTask)); @@ -327,25 +325,24 @@ int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf* pData, int32 if (pData) { SCH_ERR_JRET(schUpdateTaskCandidateAddr(pJob, pTask, pData->pEpSet)); } - + if (SCH_TASK_NEED_FLOW_CTRL(pJob, pTask)) { if (JOB_TASK_STATUS_EXEC == SCH_GET_TASK_STATUS(pTask)) { SCH_ERR_JRET(schLaunchTasksInFlowCtrlList(pJob, pTask)); } - } + } SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_INIT); - + SCH_ERR_JRET(schLaunchTask(pJob, pTask)); return TSDB_CODE_SUCCESS; } - // merge plan - + pTask->childReady = 0; - + qClearSubplanExecutionNode(pTask->plan); // Note: current error task and upper level merge task @@ -354,10 +351,10 @@ int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf* pData, int32 } SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_INIT); - + int32_t childrenNum = taosArrayGetSize(pTask->children); for (int32_t i = 0; i < childrenNum; ++i) { - SSchTask* pChild = taosArrayGetP(pTask->children, i); + SSchTask *pChild = taosArrayGetP(pTask->children, i); SCH_LOCK_TASK(pChild); schDoTaskRedirect(pJob, pChild, NULL, rspCode); SCH_UNLOCK_TASK(pChild); @@ -370,7 +367,7 @@ _return: SCH_RET(schProcessOnTaskFailure(pJob, pTask, code)); } -int32_t schHandleRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf* pData, int32_t rspCode) { +int32_t schHandleRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32_t rspCode) { int32_t code = 0; if (SCH_IS_DATA_BIND_TASK(pTask)) { @@ -536,7 +533,7 @@ int32_t schHandleTaskRetry(SSchJob *pJob, SSchTask *pTask) { SCH_ERR_RET(schRemoveTaskFromExecList(pJob, pTask)); SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_INIT); - + if (SCH_TASK_NEED_FLOW_CTRL(pJob, pTask)) { SCH_ERR_RET(schLaunchTasksInFlowCtrlList(pJob, pTask)); } @@ -544,7 +541,8 @@ int32_t schHandleTaskRetry(SSchJob *pJob, SSchTask *pTask) { schDeregisterTaskHb(pJob, pTask); if (SCH_IS_DATA_BIND_TASK(pTask)) { - SCH_SWITCH_EPSET(&pTask->plan->execNode); + SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx); + SCH_SWITCH_EPSET(addr); } else { SCH_ERR_RET(schSwitchTaskCandidateAddr(pJob, pTask)); } @@ -557,20 +555,21 @@ int32_t schHandleTaskRetry(SSchJob *pJob, SSchTask *pTask) { int32_t schSetAddrsFromNodeList(SSchJob *pJob, SSchTask *pTask) { int32_t addNum = 0; int32_t nodeNum = 0; - + if (pJob->nodeList) { nodeNum = taosArrayGetSize(pJob->nodeList); for (int32_t i = 0; i < nodeNum && addNum < SCH_MAX_CANDIDATE_EP_NUM; ++i) { SQueryNodeLoad *nload = taosArrayGet(pJob->nodeList, i); SQueryNodeAddr *naddr = &nload->addr; - + if (NULL == taosArrayPush(pTask->candidateAddrs, naddr)) { SCH_TASK_ELOG("taosArrayPush execNode to candidate addrs failed, addNum:%d, errno:%d", addNum, errno); SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY); } - SCH_TASK_DLOG("set %dth candidate addr, id %d, fqdn:%s, port:%d", i, naddr->nodeId, SCH_GET_CUR_EP(naddr)->fqdn, SCH_GET_CUR_EP(naddr)->port); + SCH_TASK_DLOG("set %dth candidate addr, id %d, fqdn:%s, port:%d", i, naddr->nodeId, SCH_GET_CUR_EP(naddr)->fqdn, + SCH_GET_CUR_EP(naddr)->port); ++addNum; } @@ -584,7 +583,6 @@ int32_t schSetAddrsFromNodeList(SSchJob *pJob, SSchTask *pTask) { return TSDB_CODE_SUCCESS; } - int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) { if (NULL != pTask->candidateAddrs) { return TSDB_CODE_SUCCESS; @@ -627,16 +625,17 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) { return TSDB_CODE_SUCCESS; } -int32_t schUpdateTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask, SEpSet* pEpSet) { +int32_t schUpdateTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask, SEpSet *pEpSet) { if (NULL == pTask->candidateAddrs || 1 != taosArrayGetSize(pTask->candidateAddrs)) { - SCH_TASK_ELOG("not able to update cndidate addr, addr num %d", (int32_t)(pTask->candidateAddrs ? taosArrayGetSize(pTask->candidateAddrs): 0)); + SCH_TASK_ELOG("not able to update cndidate addr, addr num %d", + (int32_t)(pTask->candidateAddrs ? taosArrayGetSize(pTask->candidateAddrs) : 0)); SCH_ERR_RET(TSDB_CODE_APP_ERROR); } - SQueryNodeAddr* pAddr = taosArrayGet(pTask->candidateAddrs, 0); + SQueryNodeAddr *pAddr = taosArrayGet(pTask->candidateAddrs, 0); - SEp* pOld = &pAddr->epSet.eps[pAddr->epSet.inUse]; - SEp* pNew = &pEpSet->eps[pEpSet->inUse]; + SEp *pOld = &pAddr->epSet.eps[pAddr->epSet.inUse]; + SEp *pNew = &pEpSet->eps[pEpSet->inUse]; SCH_TASK_DLOG("update task ep from %s:%d to %s:%d", pOld->fqdn, pOld->port, pNew->fqdn, pNew->port); @@ -646,7 +645,7 @@ int32_t schUpdateTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask, SEpSet* pEpSe } int32_t schSwitchTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask) { - int32_t candidateNum = taosArrayGetSize(pTask->candidateAddrs); + int32_t candidateNum = taosArrayGetSize(pTask->candidateAddrs); if (++pTask->candidateIdx >= candidateNum) { pTask->candidateIdx = 0; } @@ -654,8 +653,6 @@ int32_t schSwitchTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask) { return TSDB_CODE_SUCCESS; } - - int32_t schRemoveTaskFromExecList(SSchJob *pJob, SSchTask *pTask) { int32_t code = taosHashRemove(pJob->execTasks, &pTask->taskId, sizeof(pTask->taskId)); if (code) { @@ -691,33 +688,32 @@ void schDropTaskOnExecNode(SSchJob *pJob, SSchTask *pTask) { SCH_TASK_DLOG("task has been dropped on %d exec nodes", size); } - - -int32_t schProcessOnTaskStatusRsp(SQueryNodeEpId* pEpId, SArray* pStatusList) { - int32_t taskNum = (int32_t)taosArrayGetSize(pStatusList); +int32_t schProcessOnTaskStatusRsp(SQueryNodeEpId *pEpId, SArray *pStatusList) { + int32_t taskNum = (int32_t)taosArrayGetSize(pStatusList); SSchTask *pTask = NULL; - SSchJob *pJob = NULL; + SSchJob *pJob = NULL; - qDebug("%d task status in hb rsp from nodeId:%d, fqdn:%s, port:%d", taskNum, pEpId->nodeId, pEpId->ep.fqdn, pEpId->ep.port); + qDebug("%d task status in hb rsp from nodeId:%d, fqdn:%s, port:%d", taskNum, pEpId->nodeId, pEpId->ep.fqdn, + pEpId->ep.port); for (int32_t i = 0; i < taskNum; ++i) { STaskStatus *pStatus = taosArrayGet(pStatusList, i); - int32_t code = 0; - - qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ",EID:%d task status in server: %s", - pStatus->queryId, pStatus->taskId, pStatus->execId, jobTaskStatusStr(pStatus->status)); + int32_t code = 0; + + qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ",EID:%d task status in server: %s", pStatus->queryId, pStatus->taskId, + pStatus->execId, jobTaskStatusStr(pStatus->status)); if (schProcessOnCbBegin(&pJob, &pTask, pStatus->queryId, pStatus->refId, pStatus->taskId)) { continue; } if (pStatus->execId != pTask->execId) { - //TODO + // TODO SCH_TASK_DLOG("execId %d mis-match current execId %d", pStatus->execId, pTask->execId); schProcessOnCbEnd(pJob, pTask, 0); continue; } - + if (pStatus->status == JOB_TASK_STATUS_FAIL) { // RECORD AND HANDLE ERROR!!!! schProcessOnCbEnd(pJob, pTask, 0); @@ -831,7 +827,6 @@ void schDropTaskInHashList(SSchJob *pJob, SHashObj *list) { } } - // Note: no more error processing, handled in function internal int32_t schLaunchFetchTask(SSchJob *pJob) { int32_t code = 0; @@ -850,5 +845,3 @@ _return: SCH_RET(schProcessOnTaskFailure(pJob, pJob->fetchTask, code)); } - - diff --git a/source/libs/stream/src/stream.c b/source/libs/stream/src/stream.c index 8b8badd67a..29e0f7ded0 100644 --- a/source/libs/stream/src/stream.c +++ b/source/libs/stream/src/stream.c @@ -208,7 +208,7 @@ int32_t streamProcessDispatchReq(SStreamTask* pTask, SStreamDispatchReq* pReq, S int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp) { ASSERT(pRsp->inputStatus == TASK_OUTPUT_STATUS__NORMAL || pRsp->inputStatus == TASK_OUTPUT_STATUS__BLOCKED); - qInfo("task %d receive dispatch rsp", pTask->taskId); + qDebug("task %d receive dispatch rsp", pTask->taskId); int8_t old = atomic_exchange_8(&pTask->outputStatus, pRsp->inputStatus); ASSERT(old == TASK_OUTPUT_STATUS__WAIT); @@ -242,7 +242,7 @@ int32_t streamProcessRecoverRsp(SStreamTask* pTask, SStreamTaskRecoverRsp* pRsp) } int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pRsp) { - qInfo("task %d receive retrieve req from node %d task %d", pTask->taskId, pReq->srcNodeId, pReq->srcTaskId); + qDebug("task %d receive retrieve req from node %d task %d", pTask->taskId, pReq->srcNodeId, pReq->srcTaskId); streamTaskEnqueueRetrieve(pTask, pReq, pRsp); diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index 8034840fce..98b0874b00 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -303,7 +303,7 @@ int32_t streamDispatch(SStreamTask* pTask, SMsgCb* pMsgCb) { } ASSERT(pBlock->type == STREAM_INPUT__DATA_BLOCK); - qInfo("stream continue dispatching: task %d", pTask->taskId); + qDebug("stream continue dispatching: task %d", pTask->taskId); SRpcMsg dispatchMsg = {0}; SEpSet* pEpSet = NULL; diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 9742f93824..e361c8021c 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -251,6 +251,9 @@ void syncStartStandBy(int64_t rid); bool syncNodeCanChange(SSyncNode* pSyncNode); bool syncNodeCheckNewConfig(SSyncNode* pSyncNode, const SSyncCfg* pNewCfg); +int32_t syncNodeLeaderTransfer(SSyncNode* pSyncNode); +int32_t syncNodeLeaderTransferTo(SSyncNode* pSyncNode, SNodeInfo newLeader); + // for debug -------------- void syncNodePrint(SSyncNode* pObj); void syncNodePrint2(char* s, SSyncNode* pObj); diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c index f7bee01030..b3cdd079a4 100644 --- a/source/libs/sync/src/syncCommit.c +++ b/source/libs/sync/src/syncCommit.c @@ -83,7 +83,8 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { newCommitIndex = index; if (gRaftDetailLog) { - sTrace("syncMaybeAdvanceCommitIndex maybe to update, newCommitIndex:%" PRId64 " commit, pSyncNode->commitIndex:%" PRId64, + sTrace("syncMaybeAdvanceCommitIndex maybe to update, newCommitIndex:%" PRId64 + " commit, pSyncNode->commitIndex:%" PRId64, newCommitIndex, pSyncNode->commitIndex); } diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 1db60495c2..e1c3d4bb33 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -316,6 +316,40 @@ int32_t syncLeaderTransferTo(int64_t rid, SNodeInfo newLeader) { return ret; } +int32_t syncNodeLeaderTransfer(SSyncNode* pSyncNode) { + if (pSyncNode->peersNum == 0) { + sError("only one replica, cannot leader transfer"); + terrno = TSDB_CODE_SYN_ONE_REPLICA; + return -1; + } + + SNodeInfo newLeader = (pSyncNode->peersNodeInfo)[0]; + int32_t ret = syncNodeLeaderTransferTo(pSyncNode, newLeader); + return ret; +} + +int32_t syncNodeLeaderTransferTo(SSyncNode* pSyncNode, SNodeInfo newLeader) { + int32_t ret = 0; + + if (pSyncNode->replicaNum == 1) { + sError("only one replica, cannot leader transfer"); + terrno = TSDB_CODE_SYN_ONE_REPLICA; + return -1; + } + + SyncLeaderTransfer* pMsg = syncLeaderTransferBuild(pSyncNode->vgId); + pMsg->newLeaderId.addr = syncUtilAddr2U64(newLeader.nodeFqdn, newLeader.nodePort); + pMsg->newLeaderId.vgId = pSyncNode->vgId; + pMsg->newNodeInfo = newLeader; + ASSERT(pMsg != NULL); + SRpcMsg rpcMsg = {0}; + syncLeaderTransfer2RpcMsg(pMsg, &rpcMsg); + syncLeaderTransferDestroy(pMsg); + + ret = syncNodePropose(pSyncNode, &rpcMsg, false); + return ret; +} + bool syncCanLeaderTransfer(int64_t rid) { SSyncNode* pSyncNode = (SSyncNode*)taosAcquireRef(tsNodeRefId, rid); if (pSyncNode == NULL) { @@ -824,8 +858,8 @@ int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak) { } else { ret = -1; terrno = TSDB_CODE_SYN_INTERNAL_ERROR; - sError("vgId:%d optimized index:%" PRId64 " error, msgtype:%s,%d", pSyncNode->vgId, retIndex, TMSG_INFO(pMsg->msgType), - pMsg->msgType); + sError("vgId:%d optimized index:%" PRId64 " error, msgtype:%s,%d", pSyncNode->vgId, retIndex, + TMSG_INFO(pMsg->msgType), pMsg->msgType); } } else { @@ -1113,6 +1147,8 @@ void syncNodeStartStandBy(SSyncNode* pSyncNode) { void syncNodeClose(SSyncNode* pSyncNode) { syncNodeEventLog(pSyncNode, "sync close"); + // leader transfer + int32_t ret; ASSERT(pSyncNode != NULL); @@ -1527,7 +1563,9 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) { char logBuf[256 + 256]; if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) { snprintf(logBuf, sizeof(logBuf), - "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", beginlog:%" PRId64 ", lastlog:%" PRId64 ", lastsnapshot:%" PRId64 ", standby:%d, " + "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", first:%" PRId64 ", last:%" PRId64 + ", snapshot:%" PRId64 + ", standby:%d, " "strategy:%d, batch:%d, " "replica-num:%d, " "lconfig:%" PRId64 ", changing:%d, restore:%d, %s", @@ -1546,7 +1584,9 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) { char* s = (char*)taosMemoryMalloc(len); if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) { snprintf(s, len, - "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", beginlog:%" PRId64 ", lastlog:%" PRId64 ", lastsnapshot:%" PRId64 ", standby:%d, " + "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", first:%" PRId64 ", last:%" PRId64 + ", snapshot:%" PRId64 + ", standby:%d, " "strategy:%d, batch:%d, " "replica-num:%d, " "lconfig:%" PRId64 ", changing:%d, restore:%d, %s", @@ -1590,7 +1630,9 @@ void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) { char logBuf[256 + 256]; if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) { snprintf(logBuf, sizeof(logBuf), - "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", beginlog:%" PRId64 ", lastlog:%" PRId64 ", lastsnapshot:%" PRId64 ", standby:%d, " + "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", first:%" PRId64 ", last:%" PRId64 + ", snapshot:%" PRId64 + ", standby:%d, " "replica-num:%d, " "lconfig:%" PRId64 ", changing:%d, restore:%d, %s", pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm, @@ -1607,7 +1649,9 @@ void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) { char* s = (char*)taosMemoryMalloc(len); if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) { snprintf(s, len, - "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", beginlog:%" PRId64 ", lastlog:%" PRId64 ", lastsnapshot:%" PRId64 ", standby:%d, " + "vgId:%d, sync %s %s, term:%" PRIu64 ", commit:%" PRId64 ", first:%" PRId64 ", last:%" PRId64 + ", snapshot:%" PRId64 + ", standby:%d, " "replica-num:%d, " "lconfig:%" PRId64 ", changing:%d, restore:%d, %s", pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm, @@ -1636,7 +1680,9 @@ char* syncNode2SimpleStr(const SSyncNode* pSyncNode) { SyncIndex logBeginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore); snprintf(s, len, - "vgId:%d, sync %s, term:%" PRIu64 ", commit:%" PRId64 ", beginlog:%" PRId64 ", lastlog:%" PRId64 ", lastsnapshot:%" PRId64 ", standby:%d, " + "vgId:%d, sync %s, term:%" PRIu64 ", commit:%" PRId64 ", first:%" PRId64 ", last:%" PRId64 + ", snapshot:%" PRId64 + ", standby:%d, " "replica-num:%d, " "lconfig:%" PRId64 ", changing:%d, restore:%d", pSyncNode->vgId, syncUtilState2String(pSyncNode->state), pSyncNode->pRaftStore->currentTerm, @@ -1839,8 +1885,8 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde char tmpbuf[512]; char* oldStr = syncCfg2SimpleStr(&oldConfig); char* newStr = syncCfg2SimpleStr(pNewConfig); - snprintf(tmpbuf, sizeof(tmpbuf), "config change from %d to %d, index:%" PRId64 ", %s --> %s", oldConfig.replicaNum, - pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr); + snprintf(tmpbuf, sizeof(tmpbuf), "config change from %d to %d, index:%" PRId64 ", %s --> %s", + oldConfig.replicaNum, pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr); taosMemoryFree(oldStr); taosMemoryFree(newStr); @@ -1863,8 +1909,8 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde char tmpbuf[512]; char* oldStr = syncCfg2SimpleStr(&oldConfig); char* newStr = syncCfg2SimpleStr(pNewConfig); - snprintf(tmpbuf, sizeof(tmpbuf), "do not config change from %d to %d, index:%" PRId64 ", %s --> %s", oldConfig.replicaNum, - pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr); + snprintf(tmpbuf, sizeof(tmpbuf), "do not config change from %d to %d, index:%" PRId64 ", %s --> %s", + oldConfig.replicaNum, pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr); taosMemoryFree(oldStr); taosMemoryFree(newStr); syncNodeEventLog(pSyncNode, tmpbuf); @@ -2399,7 +2445,8 @@ int32_t syncNodeOnPingCb(SSyncNode* ths, SyncPing* pMsg) { // log state char logBuf[1024] = {0}; snprintf(logBuf, sizeof(logBuf), - "==syncNodeOnPingCb== vgId:%d, state: %d, %s, term:%" PRIu64 " electTimerLogicClock:%" PRIu64 ", " + "==syncNodeOnPingCb== vgId:%d, state: %d, %s, term:%" PRIu64 " electTimerLogicClock:%" PRIu64 + ", " "electTimerLogicClockUser:%" PRIu64 ", electTimerMS:%d", ths->vgId, ths->state, syncUtilState2String(ths->state), ths->pRaftStore->currentTerm, ths->electTimerLogicClock, ths->electTimerLogicClockUser, ths->electTimerMS); diff --git a/source/libs/sync/src/syncRaftCfg.c b/source/libs/sync/src/syncRaftCfg.c index c06bd2338d..0bbeaaf5b0 100644 --- a/source/libs/sync/src/syncRaftCfg.c +++ b/source/libs/sync/src/syncRaftCfg.c @@ -101,7 +101,7 @@ cJSON *syncCfg2Json(SSyncCfg *pSyncCfg) { char *syncCfg2Str(SSyncCfg *pSyncCfg) { cJSON *pJson = syncCfg2Json(pSyncCfg); - char *serialized = cJSON_Print(pJson); + char * serialized = cJSON_Print(pJson); cJSON_Delete(pJson); return serialized; } @@ -109,7 +109,7 @@ char *syncCfg2Str(SSyncCfg *pSyncCfg) { char *syncCfg2SimpleStr(SSyncCfg *pSyncCfg) { if (pSyncCfg != NULL) { int32_t len = 512; - char *s = taosMemoryMalloc(len); + char * s = taosMemoryMalloc(len); memset(s, 0, len); snprintf(s, len, "{replica-num:%d, my-index:%d, ", pSyncCfg->replicaNum, pSyncCfg->myIndex); @@ -206,7 +206,7 @@ cJSON *raftCfg2Json(SRaftCfg *pRaftCfg) { char *raftCfg2Str(SRaftCfg *pRaftCfg) { cJSON *pJson = raftCfg2Json(pRaftCfg); - char *serialized = cJSON_Print(pJson); + char * serialized = cJSON_Print(pJson); cJSON_Delete(pJson); return serialized; } @@ -285,7 +285,7 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) { (pRaftCfg->configIndexArr)[i] = atoll(pIndex->valuestring); } - cJSON *pJsonSyncCfg = cJSON_GetObjectItem(pJson, "SSyncCfg"); + cJSON * pJsonSyncCfg = cJSON_GetObjectItem(pJson, "SSyncCfg"); int32_t code = syncCfgFromJson(pJsonSyncCfg, &(pRaftCfg->cfg)); ASSERT(code == 0); diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c index a135002f44..edc01c9a05 100644 --- a/source/libs/sync/src/syncRaftLog.c +++ b/source/libs/sync/src/syncRaftLog.c @@ -122,8 +122,8 @@ static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncI char logBuf[128]; snprintf(logBuf, sizeof(logBuf), - "wal restore from snapshot error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", snapshotIndex, err, - err, errStr, sysErr, sysErrStr); + "wal restore from snapshot error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", + snapshotIndex, err, err, errStr, sysErr, sysErrStr); syncNodeErrorLog(pData->pSyncNode, logBuf); return -1; @@ -201,19 +201,56 @@ static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore) { return SYNC_TERM_INVALID; } +static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { + SSyncLogStoreData* pData = pLogStore->data; + SWal* pWal = pData->pWal; + + SyncIndex index = 0; + SWalSyncInfo syncMeta; + syncMeta.isWeek = pEntry->isWeak; + syncMeta.seqNum = pEntry->seqNum; + syncMeta.term = pEntry->term; + index = walAppendLog(pWal, pEntry->originalRpcType, syncMeta, pEntry->data, pEntry->dataLen); + if (index < 0) { + int32_t err = terrno; + const char* errStr = tstrerror(err); + int32_t sysErr = errno; + const char* sysErrStr = strerror(errno); + + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "wal write error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", + pEntry->index, err, err, errStr, sysErr, sysErrStr); + syncNodeErrorLog(pData->pSyncNode, logBuf); + + ASSERT(0); + return -1; + } + pEntry->index = index; + + do { + char eventLog[128]; + snprintf(eventLog, sizeof(eventLog), "write index:%" PRId64 ", type:%s,%d, type2:%s,%d", pEntry->index, + TMSG_INFO(pEntry->msgType), pEntry->msgType, TMSG_INFO(pEntry->originalRpcType), pEntry->originalRpcType); + syncNodeEventLog(pData->pSyncNode, eventLog); + } while (0); + + return 0; +} + +#if 0 static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { SSyncLogStoreData* pData = pLogStore->data; SWal* pWal = pData->pWal; SyncIndex writeIndex = raftLogWriteIndex(pLogStore); if (pEntry->index != writeIndex) { - sError("vgId:%d wal write index error, entry-index:%" PRId64 " update to %" PRId64, pData->pSyncNode->vgId, pEntry->index, - writeIndex); + sError("vgId:%d wal write index error, entry-index:%" PRId64 " update to %" PRId64, pData->pSyncNode->vgId, + pEntry->index, writeIndex); pEntry->index = writeIndex; } int code = 0; - SSyncLogMeta syncMeta; + SWalSyncInfo syncMeta; syncMeta.isWeek = pEntry->isWeak; syncMeta.seqNum = pEntry->seqNum; syncMeta.term = pEntry->term; @@ -243,6 +280,7 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr return code; } +#endif // entry found, return 0 // entry not found, return -1, terrno = TSDB_CODE_WAL_LOG_NOT_EXIST @@ -272,8 +310,8 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, do { char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "wal read error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", index, err, - err, errStr, sysErr, sysErrStr); + snprintf(logBuf, sizeof(logBuf), "wal read error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", + index, err, err, errStr, sysErr, sysErrStr); if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { syncNodeEventLog(pData->pSyncNode, logBuf); } else { @@ -361,6 +399,8 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp //------------------------------- // log[0 .. n] + +#if 0 int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { SSyncLogStoreData* pData = pLogStore->data; SWal* pWal = pData->pWal; @@ -369,7 +409,7 @@ int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { ASSERT(pEntry->index == lastIndex + 1); int code = 0; - SSyncLogMeta syncMeta; + SWalSyncInfo syncMeta; syncMeta.isWeek = pEntry->isWeak; syncMeta.seqNum = pEntry->seqNum; syncMeta.term = pEntry->term; @@ -397,6 +437,44 @@ int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { return code; } +#endif + +int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { + SSyncLogStoreData* pData = pLogStore->data; + SWal* pWal = pData->pWal; + + SyncIndex index = 0; + SWalSyncInfo syncMeta; + syncMeta.isWeek = pEntry->isWeak; + syncMeta.seqNum = pEntry->seqNum; + syncMeta.term = pEntry->term; + + index = walAppendLog(pWal, pEntry->originalRpcType, syncMeta, pEntry->data, pEntry->dataLen); + if (index < 0) { + int32_t err = terrno; + const char* errStr = tstrerror(err); + int32_t sysErr = errno; + const char* sysErrStr = strerror(errno); + + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "wal write error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", + pEntry->index, err, err, errStr, sysErr, sysErrStr); + syncNodeErrorLog(pData->pSyncNode, logBuf); + + ASSERT(0); + return -1; + } + pEntry->index = index; + + do { + char eventLog[128]; + snprintf(eventLog, sizeof(eventLog), "write2 index:%" PRId64 ", type:%s,%d, type2:%s,%d", pEntry->index, + TMSG_INFO(pEntry->msgType), pEntry->msgType, TMSG_INFO(pEntry->originalRpcType), pEntry->originalRpcType); + syncNodeEventLog(pData->pSyncNode, eventLog); + } while (0); + + return 0; +} SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) { SSyncLogStoreData* pData = pLogStore->data; @@ -418,8 +496,8 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) { do { char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "wal read error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", index, - err, err, errStr, sysErr, sysErrStr); + snprintf(logBuf, sizeof(logBuf), "wal read error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", + index, err, err, errStr, sysErr, sysErrStr); if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { syncNodeEventLog(pData->pSyncNode, logBuf); } else { diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 18e94e0523..b6bc4bc816 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -135,7 +135,8 @@ int32_t syncNodeAppendEntriesPeersSnapshot2(SSyncNode* pSyncNode) { SyncIndex newNextIndex = syncNodeGetLastIndex(pSyncNode) + 1; syncIndexMgrSetIndex(pSyncNode->pNextIndex, pDestId, newNextIndex); syncIndexMgrSetIndex(pSyncNode->pMatchIndex, pDestId, SYNC_INDEX_INVALID); - sError("vgId:%d sync get pre term error, nextIndex:%" PRId64 ", update next-index:%" PRId64 ", match-index:%d, raftid:%" PRId64, + sError("vgId:%d sync get pre term error, nextIndex:%" PRId64 ", update next-index:%" PRId64 + ", match-index:%d, raftid:%" PRId64, pSyncNode->vgId, nextIndex, newNextIndex, SYNC_INDEX_INVALID, pDestId->addr); return -1; @@ -224,7 +225,8 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) { SyncIndex newNextIndex = syncNodeGetLastIndex(pSyncNode) + 1; syncIndexMgrSetIndex(pSyncNode->pNextIndex, pDestId, newNextIndex); syncIndexMgrSetIndex(pSyncNode->pMatchIndex, pDestId, SYNC_INDEX_INVALID); - sError("vgId:%d sync get pre term error, nextIndex:%" PRId64 ", update next-index:%" PRId64 ", match-index:%d, raftid:%" PRId64, + sError("vgId:%d sync get pre term error, nextIndex:%" PRId64 ", update next-index:%" PRId64 + ", match-index:%d, raftid:%" PRId64, pSyncNode->vgId, nextIndex, newNextIndex, SYNC_INDEX_INVALID, pDestId->addr); return -1; @@ -314,11 +316,12 @@ int32_t syncNodeAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, c char host[128]; uint16_t port; syncUtilU642Addr(destRaftId->addr, host, sizeof(host), &port); - sDebug( - "vgId:%d, send sync-append-entries to %s:%d, {term:%" PRIu64 ", pre-index:%" PRId64 ", pre-term:%" PRIu64 ", pterm:%" PRIu64 ", commit:%" PRId64 ", " - "datalen:%d}", - pSyncNode->vgId, host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->privateTerm, - pMsg->commitIndex, pMsg->dataLen); + sDebug("vgId:%d, send sync-append-entries to %s:%d, {term:%" PRIu64 ", pre-index:%" PRId64 ", pre-term:%" PRIu64 + ", pterm:%" PRIu64 ", commit:%" PRId64 + ", " + "datalen:%d}", + pSyncNode->vgId, host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->privateTerm, + pMsg->commitIndex, pMsg->dataLen); } while (0); SRpcMsg rpcMsg; diff --git a/source/libs/sync/src/syncRequestVote.c b/source/libs/sync/src/syncRequestVote.c index db1a33c28b..a6ca0e6d78 100644 --- a/source/libs/sync/src/syncRequestVote.c +++ b/source/libs/sync/src/syncRequestVote.c @@ -55,7 +55,8 @@ int32_t syncNodeOnRequestVoteCb(SSyncNode* ths, SyncRequestVote* pMsg) { uint16_t port; syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); snprintf(logBuf, sizeof(logBuf), - "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 ", maybe replica already dropped", + "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 + ", maybe replica already dropped", host, port, pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm); syncNodeEventLog(ths, logBuf); } while (0); @@ -97,8 +98,9 @@ int32_t syncNodeOnRequestVoteCb(SSyncNode* ths, SyncRequestVote* pMsg) { uint16_t port; syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); snprintf(logBuf, sizeof(logBuf), - "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 ", reply-grant:%d", host, port, - pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, pReply->voteGranted); + "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 + ", reply-grant:%d", + host, port, pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, pReply->voteGranted); syncNodeEventLog(ths, logBuf); } while (0); @@ -181,7 +183,8 @@ int32_t syncNodeOnRequestVoteSnapshotCb(SSyncNode* ths, SyncRequestVote* pMsg) { uint16_t port; syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); snprintf(logBuf, sizeof(logBuf), - "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 ", maybe replica already dropped", + "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 + ", maybe replica already dropped", host, port, pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm); syncNodeEventLog(ths, logBuf); } while (0); @@ -221,8 +224,9 @@ int32_t syncNodeOnRequestVoteSnapshotCb(SSyncNode* ths, SyncRequestVote* pMsg) { uint16_t port; syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); snprintf(logBuf, sizeof(logBuf), - "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 ", reply-grant:%d", host, port, - pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, pReply->voteGranted); + "recv sync-request-vote from %s:%d, term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 + ", reply-grant:%d", + host, port, pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, pReply->voteGranted); syncNodeEventLog(ths, logBuf); } while (0); diff --git a/source/libs/sync/src/syncRequestVoteReply.c b/source/libs/sync/src/syncRequestVoteReply.c index 12af7cf531..8ab4f75c5c 100644 --- a/source/libs/sync/src/syncRequestVoteReply.c +++ b/source/libs/sync/src/syncRequestVoteReply.c @@ -66,8 +66,8 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg) if (pMsg->term > ths->pRaftStore->currentTerm) { char logBuf[128] = {0}; - snprintf(logBuf, sizeof(logBuf), "syncNodeOnRequestVoteReplyCb error term, receive:%" PRIu64 " current:%" PRIu64, pMsg->term, - ths->pRaftStore->currentTerm); + snprintf(logBuf, sizeof(logBuf), "syncNodeOnRequestVoteReplyCb error term, receive:%" PRIu64 " current:%" PRIu64, + pMsg->term, ths->pRaftStore->currentTerm); syncNodePrint2(logBuf, ths); sError("%s", logBuf); return ret; @@ -190,8 +190,9 @@ int32_t syncNodeOnRequestVoteReplySnapshotCb(SSyncNode* ths, SyncRequestVoteRepl if (pMsg->term > ths->pRaftStore->currentTerm) { char logBuf[128] = {0}; - snprintf(logBuf, sizeof(logBuf), "recv SyncRequestVoteReply, error term, receive_term:%" PRIu64 " current_term:%" PRIu64, - pMsg->term, ths->pRaftStore->currentTerm); + snprintf(logBuf, sizeof(logBuf), + "recv SyncRequestVoteReply, error term, receive_term:%" PRIu64 " current_term:%" PRIu64, pMsg->term, + ths->pRaftStore->currentTerm); syncNodePrint2(logBuf, ths); sError("%s", logBuf); return ret; diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index 3079aa17ca..87cc5685f3 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -153,8 +153,8 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender, SSnapshotParam snapsho // event log do { char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "snapshot sender update lcindex from %" PRId64 " to %" PRId64, oldLastConfigIndex, - newLastConfigIndex); + snprintf(logBuf, sizeof(logBuf), "snapshot sender update lcindex from %" PRId64 " to %" PRId64, + oldLastConfigIndex, newLastConfigIndex); char *eventLog = snapshotSender2SimpleStr(pSender, logBuf); syncNodeEventLog(pSender->pSyncNode, eventLog); taosMemoryFree(eventLog); @@ -389,7 +389,9 @@ char *snapshotSender2SimpleStr(SSyncSnapshotSender *pSender, char *event) { syncUtilU642Addr(destId.addr, host, sizeof(host), &port); snprintf(s, len, - "%s {%p s-param:%" PRId64 " e-param:%" PRId64 " laindex:%" PRId64 " laterm:%" PRIu64 " lcindex:%" PRId64 " seq:%d ack:%d finish:%d pterm:%" PRIu64 " " + "%s {%p s-param:%" PRId64 " e-param:%" PRId64 " laindex:%" PRId64 " laterm:%" PRIu64 " lcindex:%" PRId64 + " seq:%d ack:%d finish:%d pterm:%" PRIu64 + " " "replica-index:%d %s:%d}", event, pSender, pSender->snapshotParam.start, pSender->snapshotParam.end, pSender->snapshot.lastApplyIndex, pSender->snapshot.lastApplyTerm, pSender->snapshot.lastConfigIndex, pSender->seq, pSender->ack, @@ -692,7 +694,9 @@ char *snapshotReceiver2SimpleStr(SSyncSnapshotReceiver *pReceiver, char *event) syncUtilU642Addr(fromId.addr, host, sizeof(host), &port); snprintf(s, len, - "%s {%p start:%d ack:%d term:%" PRIu64 " pterm:%" PRIu64 " from:%s:%d s-param:%" PRId64 " e-param:%" PRId64 " laindex:%" PRId64 " laterm:%" PRIu64 " " + "%s {%p start:%d ack:%d term:%" PRIu64 " pterm:%" PRIu64 " from:%s:%d s-param:%" PRId64 " e-param:%" PRId64 + " laindex:%" PRId64 " laterm:%" PRIu64 + " " "lcindex:%" PRId64 "}", event, pReceiver, pReceiver->start, pReceiver->ack, pReceiver->term, pReceiver->privateTerm, host, port, pReceiver->snapshotParam.start, pReceiver->snapshotParam.end, pReceiver->snapshot.lastApplyIndex, diff --git a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp index de82df3fbd..339ebe90e7 100644 --- a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp +++ b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp @@ -45,7 +45,8 @@ void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { if (cbMeta.index > beginIndex) { char logBuf[256] = {0}; snprintf(logBuf, sizeof(logBuf), - "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 ", term:%" PRIu64 " \n", + "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 + ", term:%" PRIu64 " \n", pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag, cbMeta.term); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); @@ -56,17 +57,19 @@ void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { void PreCommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256] = {0}; - snprintf(logBuf, sizeof(logBuf), - "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", pFsm, - cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag); + snprintf( + logBuf, sizeof(logBuf), + "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", + pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } void RollBackCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; snprintf(logBuf, sizeof(logBuf), - "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", pFsm, - cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag); + "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", + pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), + cbMeta.flag); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } @@ -147,8 +150,8 @@ int32_t SnapshotDoWrite(struct SSyncFSM* pFsm, void* pWriter, void* pBuf, int32_ void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); } void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMeta) { - sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, cbMeta.flag, - cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term); + sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, + cbMeta.flag, cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term); } SSyncFSM* createFsm() { @@ -267,7 +270,8 @@ SRpcMsg* createRpcMsg(int i, int count, int myIndex) { pMsg->msgType = 9999; pMsg->contLen = 256; pMsg->pCont = rpcMallocCont(pMsg->contLen); - snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, taosGetTimestampMs()); + snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, + taosGetTimestampMs()); return pMsg; } diff --git a/source/libs/sync/test/syncConfigChangeTest.cpp b/source/libs/sync/test/syncConfigChangeTest.cpp index 80a5e65274..ba3fc77650 100644 --- a/source/libs/sync/test/syncConfigChangeTest.cpp +++ b/source/libs/sync/test/syncConfigChangeTest.cpp @@ -44,8 +44,9 @@ void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { if (cbMeta.index > beginIndex) { char logBuf[256] = {0}; snprintf(logBuf, sizeof(logBuf), - "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", pFsm, - cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag); + "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", + pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), + cbMeta.flag); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } else { sTrace("==callback== ==CommitCb== do not apply again %" PRId64, cbMeta.index); @@ -54,17 +55,19 @@ void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { void PreCommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256] = {0}; - snprintf(logBuf, sizeof(logBuf), - "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", pFsm, - cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag); + snprintf( + logBuf, sizeof(logBuf), + "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", + pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } void RollBackCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; snprintf(logBuf, sizeof(logBuf), - "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", pFsm, - cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag); + "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s flag:%" PRIu64 "\n", + pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), + cbMeta.flag); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } @@ -78,8 +81,8 @@ int32_t GetSnapshotCb(struct SSyncFSM* pFsm, SSnapshot* pSnapshot) { void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); } void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMeta) { - sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, cbMeta.flag, - cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term); + sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, + cbMeta.flag, cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term); } SSyncFSM* createFsm() { @@ -188,7 +191,8 @@ SRpcMsg* createRpcMsg(int i, int count, int myIndex) { pMsg->msgType = 9999; pMsg->contLen = 256; pMsg->pCont = rpcMallocCont(pMsg->contLen); - snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, taosGetTimestampMs()); + snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, + taosGetTimestampMs()); return pMsg; } diff --git a/source/libs/sync/test/syncEntryCacheTest.cpp b/source/libs/sync/test/syncEntryCacheTest.cpp index 787c08e507..6250181b25 100644 --- a/source/libs/sync/test/syncEntryCacheTest.cpp +++ b/source/libs/sync/test/syncEntryCacheTest.cpp @@ -5,6 +5,7 @@ #include "syncRaftLog.h" #include "syncRaftStore.h" #include "syncUtil.h" +#include "tskiplist.h" void logTest() { sTrace("--- sync log test: trace"); @@ -148,15 +149,131 @@ void test4() { raftCacheLog2((char*)"==test4 after get-and-del entry 3==", pCache); } +static char* keyFn(const void* pData) { + SSyncRaftEntry* pEntry = (SSyncRaftEntry*)pData; + return (char*)(&(pEntry->index)); +} + +static int cmpFn(const void* p1, const void* p2) { return memcmp(p1, p2, sizeof(SyncIndex)); } + +void printSkipList(SSkipList* pSkipList) { + ASSERT(pSkipList != NULL); + + SSkipListIterator* pIter = tSkipListCreateIter(pSkipList); + while (tSkipListIterNext(pIter)) { + SSkipListNode* pNode = tSkipListIterGet(pIter); + ASSERT(pNode != NULL); + SSyncRaftEntry* pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(pNode); + syncEntryPrint2((char*)"", pEntry); + } +} + +void delSkipListFirst(SSkipList* pSkipList, int n) { + ASSERT(pSkipList != NULL); + + sTrace("delete first %d -------------", n); + SSkipListIterator* pIter = tSkipListCreateIter(pSkipList); + for (int i = 0; i < n; ++i) { + tSkipListIterNext(pIter); + SSkipListNode* pNode = tSkipListIterGet(pIter); + tSkipListRemoveNode(pSkipList, pNode); + } +} + + +SSyncRaftEntry* getLogEntry2(SSkipList* pSkipList, SyncIndex index) { + SyncIndex index2 = index; + SSyncRaftEntry *pEntry = NULL; + int arraySize = 0; + + SArray* entryPArray = tSkipListGet(pSkipList, (char*)(&index2)); + arraySize = taosArrayGetSize(entryPArray); + if (arraySize > 0) { + SSkipListNode** ppNode = (SSkipListNode**)taosArrayGet(entryPArray, 0); + ASSERT(*ppNode != NULL); + pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(*ppNode); + } + taosArrayDestroy(entryPArray); + + sTrace("get index2: %ld, arraySize:%d -------------", index, arraySize); + syncEntryLog2((char*)"getLogEntry2", pEntry); + return pEntry; +} + + +SSyncRaftEntry* getLogEntry(SSkipList* pSkipList, SyncIndex index) { + sTrace("get index: %ld -------------", index); + SyncIndex index2 = index; + SSyncRaftEntry *pEntry = NULL; + SSkipListIterator* pIter = tSkipListCreateIterFromVal(pSkipList, (const char *)&index2, TSDB_DATA_TYPE_BINARY, TSDB_ORDER_ASC); + if (tSkipListIterNext(pIter)) { + SSkipListNode* pNode = tSkipListIterGet(pIter); + ASSERT(pNode != NULL); + pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(pNode); + } + + syncEntryLog2((char*)"getLogEntry", pEntry); + return pEntry; +} + +void test5() { + SSkipList* pSkipList = + tSkipListCreate(MAX_SKIP_LIST_LEVEL, TSDB_DATA_TYPE_BINARY, sizeof(SyncIndex), cmpFn, SL_ALLOW_DUP_KEY, keyFn); + ASSERT(pSkipList != NULL); + + sTrace("insert 9 - 5"); + for (int i = 9; i >= 5; --i) { + SSyncRaftEntry* pEntry = createEntry(i); + SSkipListNode* pSkipListNode = tSkipListPut(pSkipList, pEntry); + } + + sTrace("insert 0 - 4"); + for (int i = 0; i <= 4; ++i) { + SSyncRaftEntry* pEntry = createEntry(i); + SSkipListNode* pSkipListNode = tSkipListPut(pSkipList, pEntry); + } + + sTrace("insert 7 7 7 7 7"); + for (int i = 0; i <= 4; ++i) { + SSyncRaftEntry* pEntry = createEntry(7); + SSkipListNode* pSkipListNode = tSkipListPut(pSkipList, pEntry); + } + + sTrace("print: -------------"); + printSkipList(pSkipList); + + delSkipListFirst(pSkipList, 3); + + sTrace("print: -------------"); + printSkipList(pSkipList); + + getLogEntry(pSkipList, 2); + getLogEntry(pSkipList, 5); + getLogEntry(pSkipList, 7); + getLogEntry(pSkipList, 7); + + getLogEntry2(pSkipList, 2); + getLogEntry2(pSkipList, 5); + getLogEntry2(pSkipList, 7); + getLogEntry2(pSkipList, 7); + + + tSkipListDestroy(pSkipList); +} + int main(int argc, char** argv) { gRaftDetailLog = true; tsAsyncLog = 0; sDebugFlag = DEBUG_TRACE + DEBUG_SCREEN + DEBUG_FILE + DEBUG_DEBUG; - test1(); - test2(); - test3(); - test4(); + /* + test1(); + test2(); + test3(); + test4(); + */ + + test5(); return 0; } diff --git a/source/libs/sync/test/syncReplicateTest.cpp b/source/libs/sync/test/syncReplicateTest.cpp index 9148ab6195..d3ba4bc136 100644 --- a/source/libs/sync/test/syncReplicateTest.cpp +++ b/source/libs/sync/test/syncReplicateTest.cpp @@ -40,8 +40,9 @@ void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { if (cbMeta.index > beginIndex) { char logBuf[256]; - snprintf(logBuf, sizeof(logBuf), "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", - pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + snprintf(logBuf, sizeof(logBuf), + "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } else { sTrace("==callback== ==CommitCb== do not apply again %" PRId64, cbMeta.index); @@ -51,15 +52,16 @@ void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { void PreCommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; snprintf(logBuf, sizeof(logBuf), - "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, cbMeta.index, - cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } void RollBackCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; - snprintf(logBuf, sizeof(logBuf), "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", - pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + snprintf(logBuf, sizeof(logBuf), + "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg*)pMsg); } @@ -143,7 +145,8 @@ SRpcMsg* createRpcMsg(int i, int count, int myIndex) { pMsg->msgType = 9999; pMsg->contLen = 256; pMsg->pCont = rpcMallocCont(pMsg->contLen); - snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, taosGetTimestampMs()); + snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, + taosGetTimestampMs()); return pMsg; } diff --git a/source/libs/sync/test/syncRespMgrTest.cpp b/source/libs/sync/test/syncRespMgrTest.cpp index 9e982e0a59..35daff796f 100644 --- a/source/libs/sync/test/syncRespMgrTest.cpp +++ b/source/libs/sync/test/syncRespMgrTest.cpp @@ -35,8 +35,8 @@ void syncRespMgrDelTest(uint64_t begin, uint64_t end) { } void printStub(SRespStub *p) { - printf("createTime:%" PRId64 ", rpcMsg.code:%d rpcMsg.ahandle:%" PRId64 " rpcMsg.handle:%" PRId64 " \n", p->createTime, p->rpcMsg.code, - (int64_t)(p->rpcMsg.info.ahandle), (int64_t)(p->rpcMsg.info.handle)); + printf("createTime:%" PRId64 ", rpcMsg.code:%d rpcMsg.ahandle:%" PRId64 " rpcMsg.handle:%" PRId64 " \n", + p->createTime, p->rpcMsg.code, (int64_t)(p->rpcMsg.info.ahandle), (int64_t)(p->rpcMsg.info.handle)); } void syncRespMgrPrint() { printf("\n----------------syncRespMgrPrint--------------\n"); diff --git a/source/libs/sync/test/syncSnapshotTest.cpp b/source/libs/sync/test/syncSnapshotTest.cpp index 9e50fa62ef..e0d33598b0 100644 --- a/source/libs/sync/test/syncSnapshotTest.cpp +++ b/source/libs/sync/test/syncSnapshotTest.cpp @@ -43,8 +43,9 @@ void CommitCb(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) { if (cbMeta.index > beginIndex) { char logBuf[256]; - snprintf(logBuf, sizeof(logBuf), "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", - pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + snprintf(logBuf, sizeof(logBuf), + "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg); } else { sTrace("==callback== ==CommitCb== do not apply again %" PRId64, cbMeta.index); @@ -54,15 +55,16 @@ void CommitCb(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) { void PreCommitCb(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; snprintf(logBuf, sizeof(logBuf), - "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, cbMeta.index, - cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg); } void RollBackCb(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; - snprintf(logBuf, sizeof(logBuf), "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", - pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + snprintf(logBuf, sizeof(logBuf), + "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg); } diff --git a/source/libs/sync/test/syncTestTool.cpp b/source/libs/sync/test/syncTestTool.cpp index 714b73a9e5..f35c6f8a2f 100644 --- a/source/libs/sync/test/syncTestTool.cpp +++ b/source/libs/sync/test/syncTestTool.cpp @@ -40,7 +40,9 @@ void cleanup() { walCleanUp(); } void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256] = {0}; snprintf(logBuf, sizeof(logBuf), - "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 ", term:%" PRIu64 " " + "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 + ", term:%" PRIu64 + " " "currentTerm:%" PRIu64 " \n", pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag, cbMeta.term, cbMeta.currentTerm); @@ -50,7 +52,9 @@ void CommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { void PreCommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256] = {0}; snprintf(logBuf, sizeof(logBuf), - "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 ", term:%" PRIu64 " " + "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 + ", term:%" PRIu64 + " " "currentTerm:%" PRIu64 " \n", pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag, cbMeta.term, cbMeta.currentTerm); @@ -60,7 +64,9 @@ void PreCommitCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) void RollBackCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256] = {0}; snprintf(logBuf, sizeof(logBuf), - "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 ", term:%" PRIu64 " " + "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 + ", term:%" PRIu64 + " " "currentTerm:%" PRIu64 " \n", pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag, cbMeta.term, cbMeta.currentTerm); @@ -128,7 +134,8 @@ int32_t SnapshotStopWrite(struct SSyncFSM* pFsm, void* pWriter, bool isApply) { char logBuf[256] = {0}; snprintf(logBuf, sizeof(logBuf), - "==callback== ==SnapshotStopWrite== pFsm:%p, pWriter:%p, isApply:%d, gSnapshotLastApplyIndex:%" PRId64 ", " + "==callback== ==SnapshotStopWrite== pFsm:%p, pWriter:%p, isApply:%d, gSnapshotLastApplyIndex:%" PRId64 + ", " "gSnapshotLastApplyTerm:%" PRId64, pFsm, pWriter, isApply, gSnapshotLastApplyIndex, gSnapshotLastApplyTerm); sTrace("%s", logBuf); @@ -148,7 +155,8 @@ void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFini void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMeta) { char* s = syncCfg2Str(&(cbMeta.newCfg)); - sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64 ", newCfg:%s", + sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64 + ", newCfg:%s", cbMeta.flag, cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term, s); taosMemoryFree(s); } @@ -156,7 +164,9 @@ void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMe void LeaderTransferCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta) { char logBuf[256] = {0}; snprintf(logBuf, sizeof(logBuf), - "==callback== ==LeaderTransferCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 ", term:%" PRIu64 " " + "==callback== ==LeaderTransferCb== pFsm:%p, index:%" PRId64 + ", isWeak:%d, code:%d, state:%d %s, flag:%" PRIu64 ", term:%" PRIu64 + " " "currentTerm:%" PRIu64 " \n", pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), cbMeta.flag, cbMeta.term, cbMeta.currentTerm); @@ -300,7 +310,8 @@ SRpcMsg* createRpcMsg(int i, int count, int myIndex) { pMsg->msgType = TDMT_VND_SUBMIT; pMsg->contLen = 256; pMsg->pCont = rpcMallocCont(pMsg->contLen); - snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, taosGetTimestampMs()); + snprintf((char*)(pMsg->pCont), pMsg->contLen, "value-myIndex:%u-%d-%d-" PRId64, myIndex, i, count, + taosGetTimestampMs()); return pMsg; } diff --git a/source/libs/sync/test/syncWriteTest.cpp b/source/libs/sync/test/syncWriteTest.cpp index d99923a8b9..3bf068e3c7 100644 --- a/source/libs/sync/test/syncWriteTest.cpp +++ b/source/libs/sync/test/syncWriteTest.cpp @@ -33,23 +33,25 @@ const char *pDir = "./syncWriteTest"; void CommitCb(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; - snprintf(logBuf, sizeof(logBuf), "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", - pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + snprintf(logBuf, sizeof(logBuf), + "==callback== ==CommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg); } void PreCommitCb(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; snprintf(logBuf, sizeof(logBuf), - "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, cbMeta.index, - cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + "==callback== ==PreCommitCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg); } void RollBackCb(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) { char logBuf[256]; - snprintf(logBuf, sizeof(logBuf), "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", - pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); + snprintf(logBuf, sizeof(logBuf), + "==callback== ==RollBackCb== pFsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s \n", pFsm, + cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state)); syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg); } diff --git a/source/libs/transport/inc/transComm.h b/source/libs/transport/inc/transComm.h index e73ddedd73..5bb6349d9b 100644 --- a/source/libs/transport/inc/transComm.h +++ b/source/libs/transport/inc/transComm.h @@ -311,6 +311,17 @@ void transCtxMerge(STransCtx* dst, STransCtx* src); void* transCtxDumpVal(STransCtx* ctx, int32_t key); void* transCtxDumpBrokenlinkVal(STransCtx* ctx, int32_t* msgType); +// request list +typedef struct STransReq { + queue q; + void* data; +} STransReq; + +void transReqQueueInit(queue* q); +void* transReqQueuePushReq(queue* q); +void* transReqQueueRemove(void* arg); +void transReqQueueClear(queue* q); + // queue sending msgs typedef struct { SArray* q; diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 0600b1130d..5d087d5769 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -19,7 +19,7 @@ typedef struct SCliConn { T_REF_DECLARE() uv_connect_t connReq; uv_stream_t* stream; - uv_write_t writeReq; + queue wreqQueue; void* hostThrd; @@ -573,8 +573,7 @@ static void cliRecvCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { return; } if (nread < 0) { - tWarn("%s conn %p read error:%s, ref:%d", CONN_GET_INST_LABEL(conn), conn, uv_err_name(nread), - T_REF_VAL_GET(conn)); + tWarn("%s conn %p read error:%s, ref:%d", CONN_GET_INST_LABEL(conn), conn, uv_err_name(nread), T_REF_VAL_GET(conn)); conn->broken = true; cliHandleExcept(conn); } @@ -587,9 +586,10 @@ static SCliConn* cliCreateConn(SCliThrd* pThrd) { uv_tcp_init(pThrd->loop, (uv_tcp_t*)(conn->stream)); conn->stream->data = conn; - conn->writeReq.data = conn; conn->connReq.data = conn; + transReqQueueInit(&conn->wreqQueue); + transQueueInit(&conn->cliMsgs, NULL); QUEUE_INIT(&conn->conn); conn->hostThrd = pThrd; @@ -628,6 +628,8 @@ static void cliDestroy(uv_handle_t* handle) { transCtxCleanup(&conn->ctx); transQueueDestroy(&conn->cliMsgs); tTrace("%s conn %p destroy successfully", CONN_GET_INST_LABEL(conn), conn); + transReqQueueClear(&conn->wreqQueue); + transDestroyBuffer(&conn->readBuf); taosMemoryFree(conn); } @@ -650,7 +652,8 @@ static bool cliHandleNoResp(SCliConn* conn) { return res; } static void cliSendCb(uv_write_t* req, int status) { - SCliConn* pConn = req->data; + SCliConn* pConn = transReqQueueRemove(req); + if (pConn == NULL) return; if (status == 0) { tTrace("%s conn %p data already was written out", CONN_GET_INST_LABEL(pConn), pConn); @@ -708,8 +711,8 @@ void cliSend(SCliConn* pConn) { CONN_SET_PERSIST_BY_APP(pConn); } - pConn->writeReq.data = pConn; - uv_write(&pConn->writeReq, (uv_stream_t*)pConn->stream, &wb, 1, cliSendCb); + uv_write_t* req = transReqQueuePushReq(&pConn->wreqQueue); + uv_write(req, (uv_stream_t*)pConn->stream, &wb, 1, cliSendCb); return; _RETURN: return; diff --git a/source/libs/transport/src/transComm.c b/source/libs/transport/src/transComm.c index 812123441c..84af8da513 100644 --- a/source/libs/transport/src/transComm.c +++ b/source/libs/transport/src/transComm.c @@ -293,6 +293,48 @@ void* transCtxDumpBrokenlinkVal(STransCtx* ctx, int32_t* msgType) { return ret; } +void transReqQueueInit(queue* q) { + // init req queue + QUEUE_INIT(q); +} +void* transReqQueuePushReq(queue* q) { + uv_write_t* req = taosMemoryCalloc(1, sizeof(uv_write_t)); + STransReq* wreq = taosMemoryCalloc(1, sizeof(STransReq)); + wreq->data = req; + req->data = wreq; + QUEUE_PUSH(q, &wreq->q); + return req; +} +void* transReqQueueRemove(void* arg) { + void* ret = NULL; + uv_write_t* req = arg; + STransReq* wreq = req && req->data ? req->data : NULL; + + assert(wreq->data == req); + if (wreq == NULL || wreq->data == NULL) { + taosMemoryFree(wreq->data); + taosMemoryFree(wreq); + return req; + } + + QUEUE_REMOVE(&wreq->q); + + ret = req && req->handle ? req->handle->data : NULL; + taosMemoryFree(wreq->data); + taosMemoryFree(wreq); + + return ret; +} +void transReqQueueClear(queue* q) { + while (!QUEUE_IS_EMPTY(q)) { + queue* h = QUEUE_HEAD(q); + QUEUE_REMOVE(h); + STransReq* req = QUEUE_DATA(h, STransReq, q); + taosMemoryFree(req->data); + taosMemoryFree(req); + } +} + void transQueueInit(STransQueue* queue, void (*freeFunc)(const void* arg)) { queue->q = taosArrayInit(2, sizeof(void*)); queue->freeFunc = (void (*)(const void*))freeFunc; diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index a239f90c29..68e12a1963 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -29,7 +29,7 @@ typedef struct { typedef struct SSvrConn { T_REF_DECLARE() uv_tcp_t* pTcp; - uv_write_t pWriter; + queue wreqQueue; uv_timer_t pTimer; queue queue; @@ -265,8 +265,8 @@ static void uvHandleReq(SSvrConn* pConn) { transMsg.info.refId = pConn->refId; transMsg.info.traceId = pHead->traceId; - tGTrace("%s handle %p conn:%p translated to app, refId:%" PRIu64, transLabel(pTransInst), transMsg.info.handle, - pConn, pConn->refId); + tGTrace("%s handle %p conn:%p translated to app, refId:%" PRIu64, transLabel(pTransInst), transMsg.info.handle, pConn, + pConn->refId); assert(transMsg.info.handle != NULL); if (pHead->noResp == 1) { @@ -316,7 +316,7 @@ void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) { memset(&conn->regArg, 0, sizeof(conn->regArg)); } } - transUnrefSrvHandle(conn); + destroyConn(conn, true); } } void uvAllocConnBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { @@ -331,7 +331,9 @@ void uvOnTimeoutCb(uv_timer_t* handle) { } void uvOnSendCb(uv_write_t* req, int status) { - SSvrConn* conn = req->data; + SSvrConn* conn = transReqQueueRemove(req); + if (conn == NULL) return; + if (status == 0) { tTrace("conn %p data already was written on stream", conn); if (!transQueueEmpty(&conn->srvMsgs)) { @@ -390,7 +392,6 @@ static void uvPrepareSendData(SSvrMsg* smsg, uv_buf_t* wb) { pHead->traceId = pMsg->info.traceId; pHead->hasEpSet = pMsg->info.hasEpSet; - if (pConn->status == ConnNormal) { pHead->msgType = (0 == pMsg->msgType ? pConn->inType + 1 : pMsg->msgType); } else { @@ -433,12 +434,12 @@ static void uvStartSendRespInternal(SSvrMsg* smsg) { uvPrepareSendData(smsg, &wb); transRefSrvHandle(pConn); - uv_write(&pConn->pWriter, (uv_stream_t*)pConn->pTcp, &wb, 1, uvOnSendCb); + uv_write_t* req = transReqQueuePushReq(&pConn->wreqQueue); + uv_write(req, (uv_stream_t*)pConn->pTcp, &wb, 1, uvOnSendCb); } static void uvStartSendResp(SSvrMsg* smsg) { // impl SSvrConn* pConn = smsg->pConn; - if (pConn->broken == true) { // persist by transFreeMsg(smsg->msg.pCont); @@ -635,8 +636,6 @@ void uvOnConnectionCb(uv_stream_t* q, ssize_t nread, const uv_buf_t* buf) { uv_tcp_init(pThrd->loop, pConn->pTcp); pConn->pTcp->data = pConn; - pConn->pWriter.data = pConn; - transSetConnOption((uv_tcp_t*)pConn->pTcp); if (uv_accept(q, (uv_stream_t*)(pConn->pTcp)) == 0) { @@ -744,6 +743,8 @@ static SSvrConn* createConn(void* hThrd) { SWorkThrd* pThrd = hThrd; SSvrConn* pConn = (SSvrConn*)taosMemoryCalloc(1, sizeof(SSvrConn)); + + transReqQueueInit(&pConn->wreqQueue); QUEUE_INIT(&pConn->queue); QUEUE_PUSH(&pThrd->conn, &pConn->queue); @@ -778,9 +779,6 @@ static void destroyConn(SSvrConn* conn, bool clear) { tTrace("conn %p to be destroyed", conn); uv_close((uv_handle_t*)conn->pTcp, uvDestroyConn); } - //} else { - // uvDestroyConn((uv_handle_t*)conn->pTcp); - //} } } static void destroyConnRegArg(SSvrConn* conn) { @@ -819,6 +817,8 @@ static void uvDestroyConn(uv_handle_t* handle) { SSvrMsg* msg = transQueueGet(&conn->srvMsgs, i); destroySmsg(msg); } + + transReqQueueClear(&conn->wreqQueue); transQueueDestroy(&conn->srvMsgs); QUEUE_REMOVE(&conn->queue); diff --git a/source/libs/wal/inc/walInt.h b/source/libs/wal/inc/walInt.h index 2767780ff3..20667fc918 100644 --- a/source/libs/wal/inc/walInt.h +++ b/source/libs/wal/inc/walInt.h @@ -146,12 +146,12 @@ int walMetaDeserialize(SWal* pWal, const char* bytes); // seek section int walChangeWrite(SWal* pWal, int64_t ver); -int walSetWrite(SWal* pWal); +int walInitWriteFile(SWal* pWal); // seek section end int64_t walGetSeq(); int walSeekWriteVer(SWal* pWal, int64_t ver); -int walRoll(SWal* pWal); +int32_t walRollImpl(SWal* pWal); #ifdef __cplusplus } diff --git a/source/libs/wal/src/walMeta.c b/source/libs/wal/src/walMeta.c index 313fd06c8e..991b50f7c0 100644 --- a/source/libs/wal/src/walMeta.c +++ b/source/libs/wal/src/walMeta.c @@ -51,10 +51,10 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal) { char fnameStr[WAL_FILE_LEN]; walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr); - int64_t file_size = 0; - taosStatFile(fnameStr, &file_size, NULL); - int readSize = TMIN(WAL_MAX_SIZE + 2, file_size); - pLastFileInfo->fileSize = file_size; + int64_t fileSize = 0; + taosStatFile(fnameStr, &fileSize, NULL); + int readSize = TMIN(WAL_MAX_SIZE + 2, fileSize); + pLastFileInfo->fileSize = fileSize; TdFilePtr pFile = taosOpenFile(fnameStr, TD_FILE_READ); if (pFile == NULL) { @@ -141,34 +141,53 @@ int walCheckAndRepairMeta(SWal* pWal) { regfree(&idxRegPattern); taosArraySort(pLogInfoArray, compareWalFileInfo); - int oldSz = 0; - if (pWal->fileInfoSet) { - oldSz = taosArrayGetSize(pWal->fileInfoSet); - } - int newSz = taosArrayGetSize(pLogInfoArray); - if (oldSz > newSz) { - taosArrayPopFrontBatch(pWal->fileInfoSet, oldSz - newSz); - } else if (oldSz < newSz) { - for (int i = oldSz; i < newSz; i++) { + int metaFileNum = taosArrayGetSize(pWal->fileInfoSet); + int actualFileNum = taosArrayGetSize(pLogInfoArray); + +#if 0 + for (int32_t fileNo = actualFileNum - 1; fileNo >= 0; fileNo--) { + SWalFileInfo* pFileInfo = taosArrayGet(pLogInfoArray, fileNo); + char fnameStr[WAL_FILE_LEN]; + walBuildLogName(pWal, pFileInfo->firstVer, fnameStr); + int64_t fileSize = 0; + taosStatFile(fnameStr, &fileSize, NULL); + if (fileSize == 0) { + taosRemoveFile(fnameStr); + walBuildIdxName(pWal, pFileInfo->firstVer, fnameStr); + taosRemoveFile(fnameStr); + taosArrayPop(pLogInfoArray); + } else { + break; + } + } + + actualFileNum = taosArrayGetSize(pLogInfoArray); +#endif + + if (metaFileNum > actualFileNum) { + taosArrayPopFrontBatch(pWal->fileInfoSet, metaFileNum - actualFileNum); + } else if (metaFileNum < actualFileNum) { + for (int i = metaFileNum; i < actualFileNum; i++) { SWalFileInfo* pFileInfo = taosArrayGet(pLogInfoArray, i); taosArrayPush(pWal->fileInfoSet, pFileInfo); } } taosArrayDestroy(pLogInfoArray); - pWal->writeCur = newSz - 1; - if (newSz > 0) { + pWal->writeCur = actualFileNum - 1; + if (actualFileNum > 0) { pWal->vers.firstVer = ((SWalFileInfo*)taosArrayGet(pWal->fileInfoSet, 0))->firstVer; - SWalFileInfo* pLastFileInfo = taosArrayGet(pWal->fileInfoSet, newSz - 1); + SWalFileInfo* pLastFileInfo = taosArrayGet(pWal->fileInfoSet, actualFileNum - 1); char fnameStr[WAL_FILE_LEN]; walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr); - int64_t file_size = 0; - taosStatFile(fnameStr, &file_size, NULL); + int64_t fileSize = 0; + taosStatFile(fnameStr, &fileSize, NULL); + /*ASSERT(fileSize != 0);*/ - if (oldSz != newSz || pLastFileInfo->fileSize != file_size) { - pLastFileInfo->fileSize = file_size; + if (metaFileNum != actualFileNum || pLastFileInfo->fileSize != fileSize) { + pLastFileInfo->fileSize = fileSize; pWal->vers.lastVer = walScanLogGetLastVer(pWal); ((SWalFileInfo*)taosArrayGetLast(pWal->fileInfoSet))->lastVer = pWal->vers.lastVer; ASSERT(pWal->vers.lastVer != -1); @@ -382,9 +401,9 @@ int walLoadMeta(SWal* pWal) { char fnameStr[WAL_FILE_LEN]; walBuildMetaName(pWal, metaVer, fnameStr); // read metafile - int64_t file_size = 0; - taosStatFile(fnameStr, &file_size, NULL); - int size = (int)file_size; + int64_t fileSize = 0; + taosStatFile(fnameStr, &fileSize, NULL); + int size = (int)fileSize; char* buf = taosMemoryMalloc(size + 5); if (buf == NULL) { terrno = TSDB_CODE_WAL_OUT_OF_MEMORY; diff --git a/source/libs/wal/src/walSeek.c b/source/libs/wal/src/walSeek.c index b99206fe98..78d45c84e2 100644 --- a/source/libs/wal/src/walSeek.c +++ b/source/libs/wal/src/walSeek.c @@ -48,7 +48,7 @@ static int64_t walSeekWritePos(SWal* pWal, int64_t ver) { return 0; } -int walSetWrite(SWal* pWal) { +int walInitWriteFile(SWal* pWal) { TdFilePtr pIdxTFile, pLogTFile; SWalFileInfo* pRet = taosArrayGetLast(pWal->fileInfoSet); ASSERT(pRet != NULL); @@ -70,6 +70,7 @@ int walSetWrite(SWal* pWal) { // switch file pWal->pWriteIdxTFile = pIdxTFile; pWal->pWriteLogTFile = pLogTFile; + pWal->writeCur = taosArrayGetSize(pWal->fileInfoSet) - 1; return 0; } diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c index 900d866a1d..26dc3cdffb 100644 --- a/source/libs/wal/src/walWrite.c +++ b/source/libs/wal/src/walWrite.c @@ -99,7 +99,7 @@ int32_t walRollback(SWal *pWal, int64_t ver) { // delete files int fileSetSize = taosArrayGetSize(pWal->fileInfoSet); - for (int i = pWal->writeCur; i < fileSetSize; i++) { + for (int i = pWal->writeCur + 1; i < fileSetSize; i++) { walBuildLogName(pWal, ((SWalFileInfo *)taosArrayGet(pWal->fileInfoSet, i))->firstVer, fnameStr); taosRemoveFile(fnameStr); walBuildIdxName(pWal, ((SWalFileInfo *)taosArrayGet(pWal->fileInfoSet, i))->firstVer, fnameStr); @@ -113,18 +113,21 @@ int32_t walRollback(SWal *pWal, int64_t ver) { TdFilePtr pIdxTFile = taosOpenFile(fnameStr, TD_FILE_WRITE | TD_FILE_READ | TD_FILE_APPEND); if (pIdxTFile == NULL) { + ASSERT(0); taosThreadMutexUnlock(&pWal->mutex); return -1; } int64_t idxOff = walGetVerIdxOffset(pWal, ver); code = taosLSeekFile(pIdxTFile, idxOff, SEEK_SET); if (code < 0) { + ASSERT(0); taosThreadMutexUnlock(&pWal->mutex); return -1; } // read idx file and get log file pos SWalIdxEntry entry; if (taosReadFile(pIdxTFile, &entry, sizeof(SWalIdxEntry)) != sizeof(SWalIdxEntry)) { + ASSERT(0); taosThreadMutexUnlock(&pWal->mutex); return -1; } @@ -133,12 +136,14 @@ int32_t walRollback(SWal *pWal, int64_t ver) { walBuildLogName(pWal, walGetCurFileFirstVer(pWal), fnameStr); TdFilePtr pLogTFile = taosOpenFile(fnameStr, TD_FILE_WRITE | TD_FILE_READ | TD_FILE_APPEND); if (pLogTFile == NULL) { + ASSERT(0); // TODO taosThreadMutexUnlock(&pWal->mutex); return -1; } code = taosLSeekFile(pLogTFile, entry.offset, SEEK_SET); if (code < 0) { + ASSERT(0); // TODO taosThreadMutexUnlock(&pWal->mutex); return -1; @@ -148,6 +153,7 @@ int32_t walRollback(SWal *pWal, int64_t ver) { ASSERT(taosValidFile(pLogTFile)); int64_t size = taosReadFile(pLogTFile, &head, sizeof(SWalCkHead)); if (size != sizeof(SWalCkHead)) { + ASSERT(0); taosThreadMutexUnlock(&pWal->mutex); return -1; } @@ -201,19 +207,49 @@ int32_t walRollback(SWal *pWal, int64_t ver) { return 0; } +static FORCE_INLINE int32_t walCheckAndRoll(SWal *pWal) { + if (taosArrayGetSize(pWal->fileInfoSet) == 0) { + /*pWal->vers.firstVer = index;*/ + if (walRollImpl(pWal) < 0) { + return -1; + } + } else { + int64_t passed = walGetSeq() - pWal->lastRollSeq; + if (pWal->cfg.rollPeriod != -1 && pWal->cfg.rollPeriod != 0 && passed > pWal->cfg.rollPeriod) { + if (walRollImpl(pWal) < 0) { + return -1; + } + } else if (pWal->cfg.segSize != -1 && pWal->cfg.segSize != 0 && walGetLastFileSize(pWal) > pWal->cfg.segSize) { + if (walRollImpl(pWal) < 0) { + return -1; + } + } + } + return 0; +} + int32_t walBeginSnapshot(SWal *pWal, int64_t ver) { pWal->vers.verInSnapshotting = ver; // check file rolling if (pWal->cfg.retentionPeriod == 0) { - walRoll(pWal); + taosThreadMutexLock(&pWal->mutex); + if (walGetLastFileSize(pWal) != 0) { + walRollImpl(pWal); + } + taosThreadMutexUnlock(&pWal->mutex); } return 0; } int32_t walEndSnapshot(SWal *pWal) { + int32_t code = 0; + taosThreadMutexLock(&pWal->mutex); int64_t ver = pWal->vers.verInSnapshotting; - if (ver == -1) return 0; + if (ver == -1) { + code = -1; + goto END; + }; pWal->vers.snapshotVer = ver; int ts = taosGetTimestampSec(); @@ -229,7 +265,7 @@ int32_t walEndSnapshot(SWal *pWal) { } // iterate files, until the searched result for (SWalFileInfo *iter = pWal->fileInfoSet->pData; iter < pInfo; iter++) { - if ((pWal->cfg.retentionSize != -1 && pWal->totSize > pWal->cfg.retentionSize) || + if ((pWal->cfg.retentionSize != -1 && newTotSize > pWal->cfg.retentionSize) || (pWal->cfg.retentionPeriod != -1 && iter->closeTs + pWal->cfg.retentionPeriod > ts)) { // delete according to file size or close time deleteCnt++; @@ -259,28 +295,30 @@ int32_t walEndSnapshot(SWal *pWal) { pWal->vers.verInSnapshotting = -1; // save snapshot ver, commit ver - int code = walSaveMeta(pWal); + code = walSaveMeta(pWal); if (code < 0) { - return -1; + goto END; } - return 0; +END: + taosThreadMutexUnlock(&pWal->mutex); + return code; } -int walRoll(SWal *pWal) { +int32_t walRollImpl(SWal *pWal) { int32_t code = 0; if (pWal->pWriteIdxTFile != NULL) { code = taosCloseFile(&pWal->pWriteIdxTFile); if (code != 0) { terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + goto END; } } if (pWal->pWriteLogTFile != NULL) { code = taosCloseFile(&pWal->pWriteLogTFile); if (code != 0) { terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + goto END; } } TdFilePtr pIdxTFile, pLogTFile; @@ -291,18 +329,20 @@ int walRoll(SWal *pWal) { pIdxTFile = taosOpenFile(fnameStr, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND); if (pIdxTFile == NULL) { terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + code = -1; + goto END; } walBuildLogName(pWal, newFileFirstVersion, fnameStr); pLogTFile = taosOpenFile(fnameStr, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND); if (pLogTFile == NULL) { terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + code = -1; + goto END; } - // terrno set inner + // error code was set inner code = walRollFileInfo(pWal); if (code != 0) { - return -1; + goto END; } // switch file @@ -312,10 +352,14 @@ int walRoll(SWal *pWal) { ASSERT(pWal->writeCur >= 0); pWal->lastRollSeq = walGetSeq(); - return 0; + + walSaveMeta(pWal); + +END: + return code; } -static int walWriteIndex(SWal *pWal, int64_t ver, int64_t offset) { +static int32_t walWriteIndex(SWal *pWal, int64_t ver, int64_t offset) { SWalIdxEntry entry = {.ver = ver, .offset = offset}; int64_t idxOffset = taosLSeekFile(pWal->pWriteIdxTFile, 0, SEEK_END); wDebug("vgId:%d, write index, index:%" PRId64 ", offset:%" PRId64 ", at %" PRId64, pWal->cfg.vgId, ver, offset, @@ -329,61 +373,14 @@ static int walWriteIndex(SWal *pWal, int64_t ver, int64_t offset) { return 0; } -int32_t walWriteWithSyncInfo(SWal *pWal, int64_t index, tmsg_t msgType, SSyncLogMeta syncMeta, const void *body, - int32_t bodyLen) { - int32_t code = 0; - - // no wal - if (pWal->cfg.level == TAOS_WAL_NOLOG) return 0; - - if (bodyLen > TSDB_MAX_WAL_SIZE) { - terrno = TSDB_CODE_WAL_SIZE_LIMIT; - return -1; - } - taosThreadMutexLock(&pWal->mutex); - - if (index == pWal->vers.lastVer + 1) { - if (taosArrayGetSize(pWal->fileInfoSet) == 0) { - pWal->vers.firstVer = index; - if (walRoll(pWal) < 0) { - taosThreadMutexUnlock(&pWal->mutex); - return -1; - } - } else { - int64_t passed = walGetSeq() - pWal->lastRollSeq; - if (pWal->cfg.rollPeriod != -1 && pWal->cfg.rollPeriod != 0 && passed > pWal->cfg.rollPeriod) { - if (walRoll(pWal) < 0) { - taosThreadMutexUnlock(&pWal->mutex); - return -1; - } - } else if (pWal->cfg.segSize != -1 && pWal->cfg.segSize != 0 && walGetLastFileSize(pWal) > pWal->cfg.segSize) { - if (walRoll(pWal) < 0) { - taosThreadMutexUnlock(&pWal->mutex); - return -1; - } - } - } - } else { - // reject skip log or rewrite log - // must truncate explicitly first - terrno = TSDB_CODE_WAL_INVALID_VER; - taosThreadMutexUnlock(&pWal->mutex); - return -1; - } - - /*if (!tfValid(pWal->pWriteLogTFile)) return -1;*/ - - ASSERT(pWal->writeCur >= 0); - - if (pWal->pWriteIdxTFile == NULL || pWal->pWriteLogTFile == NULL) { - walSetWrite(pWal); - taosLSeekFile(pWal->pWriteLogTFile, 0, SEEK_END); - taosLSeekFile(pWal->pWriteIdxTFile, 0, SEEK_END); - } - - pWal->writeHead.head.version = index; +// TODO gurantee atomicity by truncate failed writing +static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgType, SWalSyncInfo syncMeta, + const void *body, int32_t bodyLen) { + int64_t code = 0; int64_t offset = walGetCurFileOffset(pWal); + + pWal->writeHead.head.version = index; pWal->writeHead.head.bodyLen = bodyLen; pWal->writeHead.head.msgType = msgType; @@ -398,7 +395,8 @@ int32_t walWriteWithSyncInfo(SWal *pWal, int64_t index, tmsg_t msgType, SSyncLog terrno = TAOS_SYSTEM_ERROR(errno); wError("vgId:%d, file:%" PRId64 ".log, failed to write since %s", pWal->cfg.vgId, walGetLastFileFirstVer(pWal), strerror(errno)); - return -1; + code = -1; + goto END; } if (taosWriteFile(pWal->pWriteLogTFile, (char *)body, bodyLen) != bodyLen) { @@ -406,13 +404,14 @@ int32_t walWriteWithSyncInfo(SWal *pWal, int64_t index, tmsg_t msgType, SSyncLog terrno = TAOS_SYSTEM_ERROR(errno); wError("vgId:%d, file:%" PRId64 ".log, failed to write since %s", pWal->cfg.vgId, walGetLastFileFirstVer(pWal), strerror(errno)); - return -1; + code = -1; + goto END; } code = walWriteIndex(pWal, index, offset); - if (code != 0) { - // TODO - return -1; + if (code < 0) { + // TODO ftruncate + goto END; } // set status @@ -425,13 +424,88 @@ int32_t walWriteWithSyncInfo(SWal *pWal, int64_t index, tmsg_t msgType, SSyncLog walGetCurFileInfo(pWal)->lastVer = index; walGetCurFileInfo(pWal)->fileSize += sizeof(SWalCkHead) + bodyLen; - taosThreadMutexUnlock(&pWal->mutex); - return 0; +END: + return -1; +} + +int64_t walAppendLog(SWal *pWal, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, int32_t bodyLen) { + if (bodyLen > TSDB_MAX_WAL_SIZE) { + terrno = TSDB_CODE_WAL_SIZE_LIMIT; + return -1; + } + + taosThreadMutexLock(&pWal->mutex); + + int64_t index = pWal->vers.lastVer + 1; + + if (walCheckAndRoll(pWal) < 0) { + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } + + if (pWal->pWriteIdxTFile == NULL || pWal->pWriteIdxTFile == NULL || pWal->writeCur < 0) { + if (walInitWriteFile(pWal) < 0) { + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } + } + + ASSERT(pWal->pWriteIdxTFile != NULL && pWal->pWriteLogTFile != NULL && pWal->writeCur >= 0); + + if (walWriteImpl(pWal, index, msgType, syncMeta, body, bodyLen) < 0) { + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } + + taosThreadMutexUnlock(&pWal->mutex); + return index; +} + +int32_t walWriteWithSyncInfo(SWal *pWal, int64_t index, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, + int32_t bodyLen) { + int32_t code = 0; + + if (bodyLen > TSDB_MAX_WAL_SIZE) { + terrno = TSDB_CODE_WAL_SIZE_LIMIT; + return -1; + } + taosThreadMutexLock(&pWal->mutex); + + // concurrency control: + // if logs are write with assigned index, + // smaller index must be write before larger one + if (index != pWal->vers.lastVer + 1) { + terrno = TSDB_CODE_WAL_INVALID_VER; + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } + + if (walCheckAndRoll(pWal) < 0) { + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } + + if (pWal->pWriteIdxTFile == NULL || pWal->pWriteIdxTFile == NULL || pWal->writeCur < 0) { + if (walInitWriteFile(pWal) < 0) { + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } + } + + ASSERT(pWal->pWriteIdxTFile != NULL && pWal->pWriteLogTFile != NULL && pWal->writeCur >= 0); + + if (walWriteImpl(pWal, index, msgType, syncMeta, body, bodyLen) < 0) { + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } + + taosThreadMutexUnlock(&pWal->mutex); + return code; } int32_t walWrite(SWal *pWal, int64_t index, tmsg_t msgType, const void *body, int32_t bodyLen) { - SSyncLogMeta syncMeta = { + SWalSyncInfo syncMeta = { .isWeek = -1, .seqNum = UINT64_MAX, .term = UINT64_MAX, diff --git a/source/os/src/osDir.c b/source/os/src/osDir.c index 243a234abe..b755a35815 100644 --- a/source/os/src/osDir.c +++ b/source/os/src/osDir.c @@ -106,8 +106,8 @@ int32_t taosMkDir(const char *dirname) { int32_t taosMulMkDir(const char *dirname) { if (dirname == NULL) return -1; - char temp[1024]; - char * pos = temp; + char temp[1024]; + char *pos = temp; int32_t code = 0; #ifdef WINDOWS taosRealPath(dirname, temp, sizeof(temp)); @@ -127,11 +127,11 @@ int32_t taosMulMkDir(const char *dirname) { for (; *pos != '\0'; pos++) { if (*pos == TD_DIRSEP[0]) { *pos = '\0'; - #ifdef WINDOWS +#ifdef WINDOWS code = _mkdir(temp, 0755); - #else +#else code = mkdir(temp, 0755); - #endif +#endif if (code < 0 && errno != EEXIST) { return code; } @@ -140,11 +140,11 @@ int32_t taosMulMkDir(const char *dirname) { } if (*(pos - 1) != TD_DIRSEP[0]) { - #ifdef WINDOWS +#ifdef WINDOWS code = _mkdir(temp, 0755); - #else +#else code = mkdir(temp, 0755); - #endif +#endif if (code < 0 && errno != EEXIST) { return code; } @@ -267,7 +267,7 @@ char *taosDirName(char *name) { } else { name[0] = 0; } - return name; + return name; #else return dirname(name); #endif @@ -334,9 +334,9 @@ bool taosDirEntryIsDir(TdDirEntryPtr pDirEntry) { } char *taosGetDirEntryName(TdDirEntryPtr pDirEntry) { - if (pDirEntry == NULL) { - return NULL; - } + /*if (pDirEntry == NULL) {*/ + /*return NULL;*/ + /*}*/ #ifdef WINDOWS return pDirEntry->findFileData.cFileName; #else diff --git a/source/util/src/tlockfree.c b/source/util/src/tlockfree.c index a755a67cc8..3cab16ee83 100644 --- a/source/util/src/tlockfree.c +++ b/source/util/src/tlockfree.c @@ -17,8 +17,10 @@ #include "tlockfree.h" #define TD_RWLATCH_WRITE_FLAG 0x40000000 +#define TD_RWLATCH_REENTRANT_FLAG 0x4000000000000000 void taosInitRWLatch(SRWLatch *pLatch) { *pLatch = 0; } +void taosInitReentrantRWLatch(SRWLatch *pLatch) { *pLatch = TD_RWLATCH_REENTRANT_FLAG; } void taosWLockLatch(SRWLatch *pLatch) { SRWLatch oLatch, nLatch; @@ -26,8 +28,14 @@ void taosWLockLatch(SRWLatch *pLatch) { // Set write flag while (1) { - oLatch = atomic_load_32(pLatch); + oLatch = atomic_load_64(pLatch); if (oLatch & TD_RWLATCH_WRITE_FLAG) { + if (oLatch & TD_RWLATCH_REENTRANT_FLAG) { + nLatch = (((oLatch >> 32) + 1) << 32) | (oLatch & 0xFFFFFFFF); + if (atomic_val_compare_exchange_64(pLatch, oLatch, nLatch) == oLatch) break; + + continue; + } nLoops++; if (nLoops > 1000) { sched_yield(); @@ -37,14 +45,14 @@ void taosWLockLatch(SRWLatch *pLatch) { } nLatch = oLatch | TD_RWLATCH_WRITE_FLAG; - if (atomic_val_compare_exchange_32(pLatch, oLatch, nLatch) == oLatch) break; + if (atomic_val_compare_exchange_64(pLatch, oLatch, nLatch) == oLatch) break; } // wait for all reads end nLoops = 0; while (1) { - oLatch = atomic_load_32(pLatch); - if (oLatch == TD_RWLATCH_WRITE_FLAG) break; + oLatch = atomic_load_64(pLatch); + if (0 == (oLatch & 0xFFFFFFF)) break; nLoops++; if (nLoops > 1000) { sched_yield(); @@ -53,29 +61,50 @@ void taosWLockLatch(SRWLatch *pLatch) { } } +// no reentrant int32_t taosWTryLockLatch(SRWLatch *pLatch) { SRWLatch oLatch, nLatch; - oLatch = atomic_load_32(pLatch); - if (oLatch) { + oLatch = atomic_load_64(pLatch); + if (oLatch << 2) { return -1; } nLatch = oLatch | TD_RWLATCH_WRITE_FLAG; - if (atomic_val_compare_exchange_32(pLatch, oLatch, nLatch) == oLatch) { + if (atomic_val_compare_exchange_64(pLatch, oLatch, nLatch) == oLatch) { return 0; } return -1; } -void taosWUnLockLatch(SRWLatch *pLatch) { atomic_store_32(pLatch, 0); } +void taosWUnLockLatch(SRWLatch *pLatch) { + SRWLatch oLatch, nLatch, wLatch; + + while (1) { + oLatch = atomic_load_64(pLatch); + + if (0 == (oLatch & TD_RWLATCH_REENTRANT_FLAG)) { + atomic_store_64(pLatch, 0); + break; + } + + wLatch = ((oLatch << 2) >> 34); + if (wLatch) { + nLatch = ((--wLatch) << 32) | TD_RWLATCH_REENTRANT_FLAG | TD_RWLATCH_WRITE_FLAG; + } else { + nLatch = TD_RWLATCH_REENTRANT_FLAG; + } + + if (atomic_val_compare_exchange_64(pLatch, oLatch, nLatch) == oLatch) break; + } +} void taosRLockLatch(SRWLatch *pLatch) { SRWLatch oLatch, nLatch; int32_t nLoops = 0; while (1) { - oLatch = atomic_load_32(pLatch); + oLatch = atomic_load_64(pLatch); if (oLatch & TD_RWLATCH_WRITE_FLAG) { nLoops++; if (nLoops > 1000) { @@ -86,8 +115,8 @@ void taosRLockLatch(SRWLatch *pLatch) { } nLatch = oLatch + 1; - if (atomic_val_compare_exchange_32(pLatch, oLatch, nLatch) == oLatch) break; + if (atomic_val_compare_exchange_64(pLatch, oLatch, nLatch) == oLatch) break; } } -void taosRUnLockLatch(SRWLatch *pLatch) { atomic_fetch_sub_32(pLatch, 1); } \ No newline at end of file +void taosRUnLockLatch(SRWLatch *pLatch) { atomic_fetch_sub_64(pLatch, 1); } diff --git a/tests/pytest/crash_gen/shared/misc.py b/tests/pytest/crash_gen/shared/misc.py index 78923bcc29..fd73f97fcb 100644 --- a/tests/pytest/crash_gen/shared/misc.py +++ b/tests/pytest/crash_gen/shared/misc.py @@ -4,7 +4,8 @@ import logging import os import sys from typing import Optional - +import time , datetime +from datetime import datetime import taos @@ -43,6 +44,10 @@ class MyLoggingAdapter(logging.LoggerAdapter): class Logging: logger = None # type: Optional[MyLoggingAdapter] + @classmethod + def _get_datetime(cls): + return datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-1] + @classmethod def getLogger(cls): return cls.logger @@ -64,22 +69,22 @@ class Logging: # global logger cls.logger = MyLoggingAdapter(_logger, {}) cls.logger.setLevel(logging.DEBUG if debugMode else logging.INFO) # default seems to be INFO - + @classmethod def info(cls, msg): - cls.logger.info(msg) + cls.logger.info("[time]: " + cls._get_datetime() +" [msg]: "+ msg) @classmethod def debug(cls, msg): - cls.logger.debug(msg) + cls.logger.debug("[time]: " + cls._get_datetime() +" [msg]: "+ msg) @classmethod def warning(cls, msg): - cls.logger.warning(msg) + cls.logger.warning("[time]: " + cls._get_datetime() +" [msg]: "+ msg) @classmethod def error(cls, msg): - cls.logger.error(msg) + cls.logger.error("[time]: " + cls._get_datetime() +" [msg]: "+ msg) class Status: STATUS_EMPTY = 99 diff --git a/tests/pytest/util/sqlset.py b/tests/pytest/util/sqlset.py index 1897b3cf23..bccd49a209 100644 --- a/tests/pytest/util/sqlset.py +++ b/tests/pytest/util/sqlset.py @@ -41,6 +41,30 @@ class TDSetSql: create_stb_sql = f'create table {stbname} ({column_sql[:-1]}) tags({tag_sql[:-1]})' return create_stb_sql + def set_insertsql(self,column_dict,tbname,binary_str,nchar_str): + sql = '' + for k, v in column_dict.items(): + if v.lower() == 'timestamp' or v.lower() == 'tinyint' or v.lower() == 'smallint' or v.lower() == 'int' or v.lower() == 'bigint' or \ + v.lower() == 'tinyint unsigned' or v.lower() == 'smallint unsigned' or v.lower() == 'int unsigned' or v.lower() == 'bigint unsigned' or v.lower() == 'bool': + sql += '%d,' + elif v.lower() == 'float' or v.lower() == 'double': + sql += '%f,' + elif 'binary' in v.lower(): + sql += f'"{binary_str}%d",' + elif 'nchar' in v.lower(): + sql += f'"{nchar_str}%d",' + return (f'insert into {tbname} values({sql[:-1]})') - - \ No newline at end of file + def insert_values(self,column_dict,i,insert_sql,insert_list,ts): + for k, v in column_dict.items(): + if v.lower() in[ 'tinyint' , 'smallint' , 'int', 'bigint' , 'tinyint unsigned' , 'smallint unsigned' , 'int unsigned' , 'bigint unsigned'] or\ + 'binary' in v.lower() or 'nchar' in v.lower(): + insert_list.append(0 + i) + elif v.lower() == 'float' or v.lower() == 'double': + insert_list.append(0.1 + i) + elif v.lower() == 'bool': + insert_list.append(i % 2) + elif v.lower() == 'timestamp': + insert_list.append(ts + i) + tdSql.execute(insert_sql%(tuple(insert_list))) + \ No newline at end of file diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt index 94414edbf2..6826258151 100644 --- a/tests/script/jenkins/basic.txt +++ b/tests/script/jenkins/basic.txt @@ -164,8 +164,8 @@ # --- sma ./test.sh -f tsim/sma/drop_sma.sim ./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim -#./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim -#./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim +./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim +./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim # --- valgrind ./test.sh -f tsim/valgrind/checkError1.sim diff --git a/tests/script/tsim/sync/vnodesnapshot-test.sim b/tests/script/tsim/sync/vnodesnapshot-test.sim new file mode 100644 index 0000000000..3cf8cb4d93 --- /dev/null +++ b/tests/script/tsim/sync/vnodesnapshot-test.sim @@ -0,0 +1,270 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -i 1 +system sh/deploy.sh -n dnode2 -i 2 +system sh/deploy.sh -n dnode3 -i 3 +system sh/deploy.sh -n dnode4 -i 4 + +system sh/cfg.sh -n dnode1 -c supportVnodes -v 0 + +system sh/exec.sh -n dnode1 -s start +system sh/exec.sh -n dnode2 -s start +system sh/exec.sh -n dnode3 -s start +system sh/exec.sh -n dnode4 -s start + +$loop_cnt = 0 +check_dnode_ready: + $loop_cnt = $loop_cnt + 1 + sleep 200 + if $loop_cnt == 10 then + print ====> dnode not ready! + return -1 + endi +sql show dnodes +print ===> $rows $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4] $data[0][5] $data[0][6] +print ===> $rows $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4] $data[1][5] $data[1][6] +print ===> $rows $data[2][0] $data[2][1] $data[2][2] $data[2][3] $data[2][4] $data[2][5] $data[2][6] +print ===> $rows $data[3][0] $data[3][1] $data[3][2] $data[3][3] $data[3][4] $data[3][5] $data[3][6] +if $data[0][0] != 1 then + return -1 +endi +if $data[0][4] != ready then + goto check_dnode_ready +endi + +sql connect +sql create dnode $hostname port 7200 +sql create dnode $hostname port 7300 +sql create dnode $hostname port 7400 + +$loop_cnt = 0 +check_dnode_ready_1: +$loop_cnt = $loop_cnt + 1 +sleep 200 +if $loop_cnt == 10 then + print ====> dnodes not ready! + return -1 +endi +sql show dnodes +print ===> $rows $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4] $data[0][5] $data[0][6] +print ===> $rows $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4] $data[1][5] $data[1][6] +print ===> $rows $data[2][0] $data[2][1] $data[2][2] $data[2][3] $data[2][4] $data[2][5] $data[2][6] +print ===> $rows $data[3][0] $data[3][1] $data[3][2] $data[3][3] $data[3][4] $data[3][5] $data[3][6] +if $data[0][4] != ready then + goto check_dnode_ready_1 +endi +if $data[1][4] != ready then + goto check_dnode_ready_1 +endi +if $data[2][4] != ready then + goto check_dnode_ready_1 +endi +if $data[3][4] != ready then + goto check_dnode_ready_1 +endi + +$replica = 3 +$vgroups = 1 + +print ============= create database +sql create database db replica $replica vgroups $vgroups + +$loop_cnt = 0 +check_db_ready: +$loop_cnt = $loop_cnt + 1 +sleep 200 +if $loop_cnt == 100 then + print ====> db not ready! + return -1 +endi +sql show databases +print ===> rows: $rows +print $data[2][0] $data[2][1] $data[2][2] $data[2][3] $data[2][4] $data[2][5] $data[2][6] $data[2][7] $data[2][8] $data[2][9] $data[2][6] $data[2][11] $data[2][12] $data[2][13] $data[2][14] $data[2][15] $data[2][16] $data[2][17] $data[2][18] $data[2][19] +if $rows != 3 then + return -1 +endi +if $data[2][19] != ready then + goto check_db_ready +endi + +sql use db + +$loop_cnt = 0 +check_vg_ready: +$loop_cnt = $loop_cnt + 1 +sleep 200 +if $loop_cnt == 300 then + print ====> vgroups not ready! + return -1 +endi + +sql show vgroups +print ===> rows: $rows +print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4] $data[0][5] $data[0][6] $data[0][7] $data[0][8] $data[0][9] $data[0][10] $data[0][11] + +if $rows != $vgroups then + return -1 +endi + +if $data[0][4] == leader then + if $data[0][6] == follower then + if $data[0][8] == follower then + print ---- vgroup $data[0][0] leader locate on dnode $data[0][3] + endi + endi +elif $data[0][6] == leader then + if $data[0][4] == follower then + if $data[0][8] == follower then + print ---- vgroup $data[0][0] leader locate on dnode $data[0][5] + endi + endi +elif $data[0][8] == leader then + if $data[0][4] == follower then + if $data[0][6] == follower then + print ---- vgroup $data[0][0] leader locate on dnode $data[0][7] + endi + endi +else + goto check_vg_ready +endi + + +vg_ready: +print ====> create stable/child table +sql create table stb (ts timestamp, c1 int, c2 float, c3 double) tags (t1 int) + +sql show stables +if $rows != 1 then + return -1 +endi + +sql create table ct1 using stb tags(1000) + + +print ===> stop dnode4 +system sh/exec.sh -n dnode4 -s stop -x SIGINT +sleep 3000 + + +print ===> write 100 records +$N = 100 +$count = 0 +while $count < $N + $ms = 1591200000000 + $count + sql insert into ct1 values( $ms , $count , 2.1, 3.1) + $count = $count + 1 +endw + + +#sql flush database db; + + +sleep 3000 + + +print ===> stop dnode1 dnode2 dnode3 +system sh/exec.sh -n dnode1 -s stop -x SIGINT +system sh/exec.sh -n dnode2 -s stop -x SIGINT +system sh/exec.sh -n dnode3 -s stop -x SIGINT + + + +######################################################## +print ===> start dnode1 dnode2 dnode3 dnode4 +system sh/exec.sh -n dnode1 -s start +system sh/exec.sh -n dnode2 -s start +system sh/exec.sh -n dnode3 -s start +system sh/exec.sh -n dnode4 -s start + +sleep 3000 + +print =============== query data +sql connect +sql use db +sql select * from ct1 +print rows: $rows +print $data00 $data01 $data02 +if $rows != 100 then + return -1 +endi + +system sh/exec.sh -n dnode1 -s stop -x SIGINT +system sh/exec.sh -n dnode2 -s stop -x SIGINT +system sh/exec.sh -n dnode3 -s stop -x SIGINT +system sh/exec.sh -n dnode4 -s stop -x SIGINT +######################################################## + + +######################################################## +print ===> start dnode1 dnode3 dnode4 +system sh/exec.sh -n dnode1 -s start +#system sh/exec.sh -n dnode2 -s start +system sh/exec.sh -n dnode3 -s start +system sh/exec.sh -n dnode4 -s start + +sleep 7000 + +print =============== query data +sql connect +sql use db +sql select * from ct1 +print rows: $rows +print $data00 $data01 $data02 +if $rows != 100 then + return -1 +endi + +system sh/exec.sh -n dnode1 -s stop -x SIGINT +#system sh/exec.sh -n dnode2 -s stop -x SIGINT +system sh/exec.sh -n dnode3 -s stop -x SIGINT +system sh/exec.sh -n dnode4 -s stop -x SIGINT +######################################################## + + +######################################################## +print ===> start dnode1 dnode2 dnode4 +system sh/exec.sh -n dnode1 -s start +system sh/exec.sh -n dnode2 -s start +#system sh/exec.sh -n dnode3 -s start +system sh/exec.sh -n dnode4 -s start + +sleep 3000 + +print =============== query data +sql select * from ct1 +print rows: $rows +print $data00 $data01 $data02 +if $rows != 100 then + return -1 +endi + +system sh/exec.sh -n dnode1 -s stop -x SIGINT +system sh/exec.sh -n dnode2 -s stop -x SIGINT +#system sh/exec.sh -n dnode3 -s stop -x SIGINT +system sh/exec.sh -n dnode4 -s stop -x SIGINT +######################################################## + + +######################################################## +print ===> start dnode1 dnode2 dnode3 +system sh/exec.sh -n dnode1 -s start +system sh/exec.sh -n dnode2 -s start +system sh/exec.sh -n dnode3 -s start +#system sh/exec.sh -n dnode4 -s start + +sleep 3000 + +print =============== query data +sql select * from ct1 +print rows: $rows +print $data00 $data01 $data02 +if $rows != 100 then + return -1 +endi + +system sh/exec.sh -n dnode1 -s stop -x SIGINT +system sh/exec.sh -n dnode2 -s stop -x SIGINT +system sh/exec.sh -n dnode3 -s stop -x SIGINT +#system sh/exec.sh -n dnode4 -s stop -x SIGINT +######################################################## + + diff --git a/tests/script/tsim/valgrind/basic1.sim b/tests/script/tsim/valgrind/basic1.sim index 2c5b8a5d96..e9dfc0eb4e 100644 --- a/tests/script/tsim/valgrind/basic1.sim +++ b/tests/script/tsim/valgrind/basic1.sim @@ -47,7 +47,7 @@ sql insert into ct1 values(now+0s, 10, 2.0, 3.0) sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s, -13, -2.3, -3.3) print =============== step6: select data -#sql select * from ct1 +sql select * from ct1 #sql select * from stb _OVER: diff --git a/tests/script/tsim/valgrind/checkError2.sim b/tests/script/tsim/valgrind/checkError2.sim index 3a2819776d..fdac687224 100644 --- a/tests/script/tsim/valgrind/checkError2.sim +++ b/tests/script/tsim/valgrind/checkError2.sim @@ -37,10 +37,10 @@ endi print =============== step3: create show table sql create table ct1 using stb tags(1000) -#sql show tables -#if $rows != 1 then -# return -1 -#endi +sql show tables +if $rows != 1 then + return -1 +endi print =============== step5: insert data sql insert into ct1 values(now+0s, 10, 2.0, 3.0) @@ -48,7 +48,7 @@ sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s print =============== step6: select data sql select * from ct1 -#sql select * from stb +sql select * from stb _OVER: system sh/exec.sh -n dnode1 -s stop -x SIGINT @@ -58,7 +58,7 @@ print ----> start to check if there are ERRORS in vagrind log file for each dnod system_content sh/checkValgrind.sh -n dnode1 print cmd return result ----> [ $system_content ] -if $system_content <= 2 then +if $system_content <= 0 then return 0 endi diff --git a/tests/script/tsim/valgrind/checkError3.sim b/tests/script/tsim/valgrind/checkError3.sim index 5a60dfe254..3713f372ae 100644 --- a/tests/script/tsim/valgrind/checkError3.sim +++ b/tests/script/tsim/valgrind/checkError3.sim @@ -96,7 +96,7 @@ if $rows != 1 then endi sql select * from information_schema.user_tables -if $rows != 31 then +if $rows != 30 then return -1 endi diff --git a/tests/system-test/1-insert/alter_table.py b/tests/system-test/1-insert/alter_table.py index a2613c39e7..f2de7c6bae 100644 --- a/tests/system-test/1-insert/alter_table.py +++ b/tests/system-test/1-insert/alter_table.py @@ -184,20 +184,36 @@ class TDTestCase: for k,v in self.tag_dict.items(): if v.lower() == 'tinyint': self.tag_check(i,k,tag_tinyint) + for error in [constant.TINYINT_MIN-1,constant.TINYINT_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'smallint': self.tag_check(i,k,tag_smallint) + for error in [constant.SMALLINT_MIN-1,constant.SMALLINT_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'int': self.tag_check(i,k,tag_int) + for error in [constant.INT_MIN-1,constant.INT_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'bigint': self.tag_check(i,k,tag_bigint) + for error in [constant.BIGINT_MIN-1,constant.BIGINT_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'tinyint unsigned': self.tag_check(i,k,tag_untinyint) + for error in [constant.TINYINT_UN_MIN-1,constant.TINYINT_UN_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'smallint unsigned': self.tag_check(i,k,tag_unsmallint) + for error in [constant.SMALLINT_UN_MIN-1,constant.SMALLINT_UN_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'int unsigned': - self.tag_check(i,k,tag_unint) + self.tag_check(i,k,tag_unint) + for error in [constant.INT_UN_MIN-1,constant.INT_UN_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'bigint unsigned': self.tag_check(i,k,tag_unbigint) + for error in [constant.BIGINT_UN_MIN-1,constant.BIGINT_UN_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'bool': self.tag_check(i,k,tag_bool) elif v.lower() == 'float': @@ -207,6 +223,8 @@ class TDTestCase: tdSql.checkEqual(tdSql.queryResult[0][0],tdSql.queryResult[0][0]) else: tdLog.exit(f'select {k} from {self.stbname}_{i},data check failure') + # for error in [constant.FLOAT_MIN*10,constant.FLOAT_MAX*10]: + # tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif v.lower() == 'double': tdSql.execute(f'alter table {self.stbname}_{i} set tag {k} = {tag_double}') tdSql.query(f'select {k} from {self.stbname}_{i}') @@ -214,12 +232,17 @@ class TDTestCase: tdSql.checkEqual(tdSql.queryResult[0][0],tdSql.queryResult[0][0]) else: tdLog.exit(f'select {k} from {self.stbname}_{i},data check failure') + for error in [constant.DOUBLE_MIN-1,constant.DOUBLE_MAX+1]: + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = {error}') elif 'binary' in v.lower(): + tag_binary_error = tdCom.getLongName(self.binary_length+1) + tdSql.error(f'alter table {self.stbname}_{i} set tag {k} = "{tag_binary_error}"') tdSql.execute(f'alter table {self.stbname}_{i} set tag {k} = "{tag_binary}"') tdSql.query(f'select {k} from {self.stbname}_{i}') tdSql.checkData(0,0,tag_binary) elif 'nchar' in v.lower(): - tdSql.execute(f'alter table {self.stbname}_{i} set tag {k} = "{tag_nchar}"') + tag_nchar_error = tdCom.getLongName(self.nchar_length+1) + tdSql.execute(f'alter table {self.stbname}_{i} set tag {k} = "{tag_nchar_error}"') tdSql.query(f'select {k} from {self.stbname}_{i}') tdSql.checkData(0,0,tag_nchar) diff --git a/tests/system-test/2-query/apercentile.py b/tests/system-test/2-query/apercentile.py index 150c4d3f17..8c8b47f3bf 100644 --- a/tests/system-test/2-query/apercentile.py +++ b/tests/system-test/2-query/apercentile.py @@ -15,90 +15,118 @@ from util.log import * from util.cases import * from util.sql import * import numpy as np - +from util.sqlset import TDSetSql class TDTestCase: def init(self, conn, logSql): tdLog.debug("start to execute %s" % __file__) - tdSql.init(conn.cursor()) + tdSql.init(conn.cursor(),logSql) self.rowNum = 10 self.ts = 1537146000000 + self.setsql = TDSetSql() + self.ntbname = 'ntb' + self.stbname = 'stb' + self.binary_length = 20 # the length of binary for column_dict + self.nchar_length = 20 # the length of nchar for column_dict + self.column_dict = { + 'ts' : 'timestamp', + 'col1': 'tinyint', + 'col2': 'smallint', + 'col3': 'int', + 'col4': 'bigint', + 'col5': 'tinyint unsigned', + 'col6': 'smallint unsigned', + 'col7': 'int unsigned', + 'col8': 'bigint unsigned', + 'col9': 'float', + 'col10': 'double', + 'col11': 'bool', + 'col12': f'binary({self.binary_length})', + 'col13': f'nchar({self.nchar_length})' + } - def check_apercentile(self,data,expect_data,param,percent,column): - if param == "default": - if abs((expect_data-data) <= expect_data * 0.2): - tdLog.info(f"apercentile function values check success with col{column}, param = {param},percent = {percent}") - else: - tdLog.notice(f"apercentile function value has not as expected with col{column}, param = {param},percent = {percent}") - sys.exit(1) - elif param == "t-digest": - if abs((expect_data-data) <= expect_data * 0.2): - tdLog.info(f"apercentile function values check success with col{column}, param = {param},percent = {percent}") - else: - tdLog.notice(f"apercentile function value has not as expected with col{column}, param = {param},percent = {percent}") - sys.exit(1) + self.tag_dict = { + 'ts_tag' : 'timestamp', + 't1': 'tinyint', + 't2': 'smallint', + 't3': 'int', + 't4': 'bigint', + 't5': 'tinyint unsigned', + 't6': 'smallint unsigned', + 't7': 'int unsigned', + 't8': 'bigint unsigned', + 't9': 'float', + 't10': 'double', + 't11': 'bool', + 't12': f'binary({self.binary_length})', + 't13': f'nchar({self.nchar_length})' + } + self.binary_str = 'taosdata' + self.nchar_str = '涛思数据' + self.tbnum = 2 + self.tag_ts = self.ts + self.tag_tinyint = 1 + self.tag_smallint = 2 + self.tag_int = 3 + self.tag_bigint = 4 + self.tag_utint = 5 + self.tag_usint = 6 + self.tag_uint = 7 + self.tag_ubint = 8 + self.tag_float = 9.1 + self.tag_double = 10.1 + self.tag_bool = True + self.tag_values = [ + f'{self.tag_ts},{self.tag_tinyint},{self.tag_smallint},{self.tag_int},{self.tag_bigint},\ + {self.tag_utint},{self.tag_usint},{self.tag_uint},{self.tag_ubint},{self.tag_float},{self.tag_double},{self.tag_bool},"{self.binary_str}","{self.nchar_str}"' + + ] + + self.percent = [1,50,100] + self.param_list = ['default','t-digest'] + def insert_data(self,column_dict,tbname,row_num): + insert_sql = self.setsql.set_insertsql(column_dict,tbname,self.binary_str,self.nchar_str) + for i in range(row_num): + insert_list = [] + self.setsql.insert_values(column_dict,i,insert_sql,insert_list,self.ts) - def run(self): + + def function_check_ntb(self): tdSql.prepare() - - intData = [] - floatData = [] - percent_list = [0,50,100] - param_list = ['default','t-digest'] - tdSql.execute('''create table test(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 float, col6 double, - col7 bool, col8 binary(20), col9 nchar(20), col11 tinyint unsigned, col12 smallint unsigned, col13 int unsigned, col14 bigint unsigned)''') - for i in range(self.rowNum): - tdSql.execute("insert into test values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)" - % (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1)) - intData.append(i + 1) - floatData.append(i + 0.1) - - # percentile verifacation + tdSql.execute(self.setsql.set_create_normaltable_sql(self.ntbname,self.column_dict)) + self.insert_data(self.column_dict,self.ntbname,self.rowNum) + for k,v in self.column_dict.items(): + for percent in self.percent: + for param in self.param_list: + if v.lower() in ['timestamp','bool'] or 'binary' in v.lower() or 'nchar' in v.lower(): + tdSql.error(f'select apercentile({k},{percent},"{param}") from {self.ntbname}') + else: + tdSql.query(f"select apercentile({k},{percent},'{param}') from {self.ntbname}") + def function_check_stb(self): + tdSql.prepare() + tdSql.execute(self.setsql.set_create_stable_sql(self.stbname,self.column_dict,self.tag_dict)) + for i in range(self.tbnum): + tdSql.execute(f"create table {self.stbname}_{i} using {self.stbname} tags({self.tag_values[0]})") + self.insert_data(self.column_dict,f'{self.stbname}_{i}',self.rowNum) + for i in range(self.tbnum): + for k,v in self.column_dict.items(): + for percent in self.percent: + for param in self.param_list: + if v.lower() in ['timestamp','bool'] or 'binary' in v.lower() or 'nchar' in v.lower(): + tdSql.error(f'select apercentile({k},{percent},"{param}") from {self.stbname}_{i}') + else: + tdSql.query(f"select apercentile({k},{percent},'{param}') from {self.stbname}_{i}") + for k,v in self.column_dict.items(): + for percent in self.percent: + for param in self.param_list: + if v.lower() in ['timestamp','bool'] or 'binary' in v.lower() or 'nchar' in v.lower(): + tdSql.error(f'select apercentile({k},{percent},"{param}") from {self.stbname}') + else: + tdSql.query(f"select apercentile({k},{percent},'{param}') from {self.stbname}") + def run(self): + self.function_check_ntb() + self.function_check_stb() - tdSql.error("select apercentile(ts ,20) from test") - tdSql.error("select apercentile(col7 ,20) from test") - tdSql.error("select apercentile(col8 ,20) from test") - tdSql.error("select apercentile(col9 ,20) from test") - - column_list = [1,2,3,4,5,6,11,12,13,14] - - for i in column_list: - for j in percent_list: - for k in param_list: - tdSql.query(f"select apercentile(col{i},{j},'{k}') from test") - data = tdSql.getData(0, 0) - tdSql.query(f"select percentile(col{i},{j}) from test") - expect_data = tdSql.getData(0, 0) - self.check_apercentile(data,expect_data,k,j,i) - - error_param_list = [-1,101,'"a"'] - for i in error_param_list: - tdSql.error(f'select apercentile(col1,{i}) from test') - - tdSql.execute("create table meters (ts timestamp, voltage int) tags(loc nchar(20))") - tdSql.execute("create table t0 using meters tags('beijing')") - tdSql.execute("create table t1 using meters tags('shanghai')") - for i in range(self.rowNum): - tdSql.execute("insert into t0 values(%d, %d)" % (self.ts + i, i + 1)) - tdSql.execute("insert into t1 values(%d, %d)" % (self.ts + i, i + 1)) - - column_list = ['voltage'] - for i in column_list: - for j in percent_list: - for k in param_list: - tdSql.query(f"select apercentile({i}, {j},'{k}') from t0") - data = tdSql.getData(0, 0) - tdSql.query(f"select percentile({i},{j}) from t0") - expect_data = tdSql.getData(0,0) - self.check_apercentile(data,expect_data,k,j,i) - tdSql.query(f"select apercentile({i}, {j},'{k}') from meters") - tdSql.checkRows(1) - table_list = ["meters","t0"] - for i in error_param_list: - for j in table_list: - for k in column_list: - tdSql.error(f'select apercentile({k},{i}) from {j}') - def stop(self): tdSql.close() tdLog.success("%s successfully executed" % __file__) diff --git a/tests/system-test/2-query/bottom.py b/tests/system-test/2-query/bottom.py index a95daf22f4..3aeadb172a 100644 --- a/tests/system-test/2-query/bottom.py +++ b/tests/system-test/2-query/bottom.py @@ -51,31 +51,10 @@ class TDTestCase: self.param_list = [1,100] def insert_data(self,column_dict,tbname,row_num): - sql = '' - for k, v in column_dict.items(): - if v.lower() == 'timestamp' or v.lower() == 'tinyint' or v.lower() == 'smallint' or v.lower() == 'int' or v.lower() == 'bigint' or \ - v.lower() == 'tinyint unsigned' or v.lower() == 'smallint unsigned' or v.lower() == 'int unsigned' or v.lower() == 'bigint unsigned' or v.lower() == 'bool': - sql += '%d,' - elif v.lower() == 'float' or v.lower() == 'double': - sql += '%f,' - elif 'binary' in v.lower(): - sql += f'"{self.binary_str}%d",' - elif 'nchar' in v.lower(): - sql += f'"{self.nchar_str}%d",' - insert_sql = f'insert into {tbname} values({sql[:-1]})' + insert_sql = self.setsql.set_insertsql(column_dict,tbname,self.binary_str,self.nchar_str) for i in range(row_num): insert_list = [] - for k, v in column_dict.items(): - if v.lower() in[ 'tinyint' , 'smallint' , 'int', 'bigint' , 'tinyint unsigned' , 'smallint unsigned' , 'int unsigned' , 'bigint unsigned'] or\ - 'binary' in v.lower() or 'nchar' in v.lower(): - insert_list.append(0 + i) - elif v.lower() == 'float' or v.lower() == 'double': - insert_list.append(0.1 + i) - elif v.lower() == 'bool': - insert_list.append(i % 2) - elif v.lower() == 'timestamp': - insert_list.append(self.ts + i) - tdSql.execute(insert_sql%(tuple(insert_list))) + self.setsql.insert_values(column_dict,i,insert_sql,insert_list,self.ts) def bottom_check_data(self,tbname,tb_type): new_column_dict = {} for param in self.param_list: @@ -129,7 +108,7 @@ class TDTestCase: tdSql.execute(self.setsql.set_create_stable_sql(stbname,self.column_dict,tag_dict)) for i in range(self.tbnum): tdSql.execute(f"create table {stbname}_{i} using {stbname} tags({tag_values[0]})") - tdSql.execute(self.insert_data(self.column_dict,f'{stbname}_{i}',self.rowNum)) + self.insert_data(self.column_dict,f'{stbname}_{i}',self.rowNum) tdSql.query('show tables') vgroup_list = [] for i in range(len(tdSql.queryResult)): diff --git a/tests/system-test/2-query/elapsed.py b/tests/system-test/2-query/elapsed.py index dfebb61d62..d2f1331e00 100644 --- a/tests/system-test/2-query/elapsed.py +++ b/tests/system-test/2-query/elapsed.py @@ -1315,24 +1315,26 @@ class TDTestCase: tdSql.error("select elapsed(tsv ,1s) from (select elapsed(ts,1s) tsv from regular_table_1);") tdSql.error("select elapsed(ts ,1s) from (select elapsed(ts,1s) ts from regular_table_1);") # # bug fix - # tdSql.error("select elapsed(tsc ,1s) from (select tscol tsc from regular_table_1) ;") + tdSql.error("select elapsed(tsc ,1s) from (select tscol tsc from regular_table_1) ;") # case TD-12276 - # tdSql.error("select elapsed(ts,1s) from (select ts,tbname from regular_table_1 order by ts asc );") + tdSql.query("select elapsed(ts,1s) from (select ts,tbname from regular_table_1 order by ts asc );") + tdSql.checkData(0,0,90.000000000) - # tdSql.error("select elapsed(ts,1s) from (select ts,tbname from regular_table_1 order by ts desc );") + tdSql.query("select elapsed(ts,1s) from (select ts,tbname from regular_table_1 order by ts desc );") + tdSql.checkData(0,0,90.000000000) - # tdSql.error("select elapsed(ts,1s) from (select ts ,max(q_int),tbname from regular_table_1 order by ts ) interval(1s);") + tdSql.query("select elapsed(ts,1s) from (select ts ,max(q_int),tbname from regular_table_1 order by ts ) interval(1s);") - # tdSql.error("select elapsed(ts,1s) from (select ts ,q_int,tbname from regular_table_1 order by ts ) interval(1s);") + tdSql.query("select elapsed(ts,1s) from (select ts ,q_int,tbname from regular_table_1 order by ts ) interval(10s);") # sub table tdSql.query("select elapsed(ts,1s) from (select ts from sub_table1_1 );") - # tdSql.error("select elapsed(ts,1s) from (select ts ,max(q_int),tbname from sub_table1_1 order by ts ) interval(1s);") + tdSql.query("select elapsed(ts,1s) from (select ts ,max(q_int),tbname from sub_table1_1 order by ts ) interval(1s);") - # tdSql.error("select elapsed(ts,1s) from (select ts ,q_int,tbname from sub_table1_1 order by ts ) interval(1s);") + tdSql.query("select elapsed(ts,1s) from (select ts ,q_int,tbname from sub_table1_1 order by ts ) interval(10s);") tdSql.query("select elapsed(ts,1s) from (select ts ,tbname,top(q_int,3) from sub_table1_1 ) interval(10s);") @@ -1342,7 +1344,7 @@ class TDTestCase: tdSql.query("select elapsed(ts,1s) from (select ts ,tbname from sub_table1_1 ) interval(10s);") - # tdSql.error("select elapsed(ts,1s) from (select ts ,count(*),tbname from sub_table1_1 order by ts ) interval(1s);") + tdSql.error("select elapsed(ts,1s) from (select ts ,count(*),tbname from sub_table1_1 order by ts ) interval(1s);") querys = ["count(*)","avg(q_int)", "sum(q_double)","stddev(q_float)","LEASTSQUARES(q_int,0,1)","elapsed(ts,1s)"] @@ -1488,8 +1490,8 @@ class TDTestCase: tdSql.query('select elapsed(ts,1s) from ( select * from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") session(ts,1w) ; ') - # tdSql.error('select elapsed(ts,1s) from ( select ts ,q_int from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") session(ts,1w) ; ') - # tdSql.error('select elapsed(ts,1s) from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(20s) fill (next) session(ts,1w) ; ') + tdSql.query('select elapsed(ts,1s) from ( select ts ,q_int from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") session(ts,1w) ; ') + # tdSql.query('select elapsed(ts,1s) from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(20s) fill (next) session(ts,1w) ; ') tdSql.query('select elapsed(ts,1s) from sub_empty_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" session(ts,1w) ; ') tdSql.checkRows(0) @@ -1506,14 +1508,14 @@ class TDTestCase: tdSql.checkRows(10) tdSql.checkData(0,0,0) - # tdSql.error('select elapsed(ts,1s) from ( select * from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") state_window(q_int) ; ') + tdSql.query('select elapsed(ts,1s) from ( select * from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") state_window(q_int) ; ') - # tdSql.error('select elapsed(ts,1s) from ( select ts ,q_int from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") state_window(q_int) ; ') + tdSql.query('select elapsed(ts,1s) from ( select ts ,q_int from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") state_window(q_int) ; ') - # tdSql.error('select elapsed(ts,1s) from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(20s) fill (next) state_window(q_int) ; ') + tdSql.error('select elapsed(ts,1s) from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(20s) fill (next) state_window(q_int) ; ') - # tdSql.query('select elapsed(ts,1s) from sub_empty_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" state_window(q_int); ') - # tdSql.checkRows(0) + tdSql.query('select elapsed(ts,1s) from sub_empty_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" state_window(q_int); ') + tdSql.checkRows(0) def continuous_query(self): diff --git a/tests/system-test/2-query/function_diff.py b/tests/system-test/2-query/function_diff.py index 2bcacd5ae3..7d49f875d1 100644 --- a/tests/system-test/2-query/function_diff.py +++ b/tests/system-test/2-query/function_diff.py @@ -360,15 +360,15 @@ class TDTestCase: tdSql.checkRows(229) tdSql.checkData(0,0,0) tdSql.query("select diff(c1) from stb1 partition by tbname ") - tdSql.checkRows(199) + tdSql.checkRows(190) # tdSql.query("select diff(st1) from stb1 partition by tbname") # tdSql.checkRows(229) tdSql.query("select diff(st1+c1) from stb1 partition by tbname") - tdSql.checkRows(199) + tdSql.checkRows(190) tdSql.query("select diff(st1+c1) from stb1 partition by tbname") - tdSql.checkRows(199) + tdSql.checkRows(190) tdSql.query("select diff(st1+c1) from stb1 partition by tbname") - tdSql.checkRows(199) + tdSql.checkRows(190) # # bug need fix # tdSql.query("select diff(st1+c1) from stb1 partition by tbname slimit 1 ") @@ -378,7 +378,7 @@ class TDTestCase: # bug need fix tdSql.query("select diff(st1+c1) from stb1 partition by tbname") - tdSql.checkRows(199) + tdSql.checkRows(190) # bug need fix # tdSql.query("select tbname , diff(c1) from stb1 partition by tbname") diff --git a/tests/system-test/2-query/mavg.py b/tests/system-test/2-query/mavg.py index 346d9e1df3..de379e39ce 100644 --- a/tests/system-test/2-query/mavg.py +++ b/tests/system-test/2-query/mavg.py @@ -678,15 +678,15 @@ class TDTestCase: tdSql.checkRows(68) tdSql.checkData(0,0,1.000000000) tdSql.query("select mavg(c1,3) from stb1 partition by tbname ") - tdSql.checkRows(38) + tdSql.checkRows(20) # tdSql.query("select mavg(st1,3) from stb1 partition by tbname") # tdSql.checkRows(38) tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname") - tdSql.checkRows(38) + tdSql.checkRows(20) tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname") - tdSql.checkRows(38) + tdSql.checkRows(20) tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname") - tdSql.checkRows(38) + tdSql.checkRows(20) # # bug need fix # tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname slimit 1 ") @@ -696,7 +696,7 @@ class TDTestCase: # bug need fix tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname") - tdSql.checkRows(38) + tdSql.checkRows(20) # bug need fix # tdSql.query("select tbname , mavg(c1,3) from stb1 partition by tbname") diff --git a/tests/system-test/2-query/percentile.py b/tests/system-test/2-query/percentile.py index c2584fd394..21bb8763dc 100644 --- a/tests/system-test/2-query/percentile.py +++ b/tests/system-test/2-query/percentile.py @@ -11,12 +11,14 @@ # -*- coding: utf-8 -*- -from platform import java_ver + from util.log import * from util.cases import * from util.sql import * import numpy as np +from util.sqlset import TDSetSql + class TDTestCase: def init(self, conn, logSql): @@ -25,55 +27,141 @@ class TDTestCase: self.rowNum = 10 self.ts = 1537146000000 + self.setsql = TDSetSql() + self.ntbname = 'ntb' + self.stbname = 'stb' + self.binary_length = 20 # the length of binary for column_dict + self.nchar_length = 20 # the length of nchar for column_dict + self.column_dict = { + 'ts' : 'timestamp', + 'col1': 'tinyint', + 'col2': 'smallint', + 'col3': 'int', + 'col4': 'bigint', + 'col5': 'tinyint unsigned', + 'col6': 'smallint unsigned', + 'col7': 'int unsigned', + 'col8': 'bigint unsigned', + 'col9': 'float', + 'col10': 'double', + 'col11': 'bool', + 'col12': f'binary({self.binary_length})', + 'col13': f'nchar({self.nchar_length})' + } - def run(self): - tdSql.prepare() - + self.tag_dict = { + 'ts_tag' : 'timestamp', + 't1': 'tinyint', + 't2': 'smallint', + 't3': 'int', + 't4': 'bigint', + 't5': 'tinyint unsigned', + 't6': 'smallint unsigned', + 't7': 'int unsigned', + 't8': 'bigint unsigned', + 't9': 'float', + 't10': 'double', + 't11': 'bool', + 't12': f'binary({self.binary_length})', + 't13': f'nchar({self.nchar_length})' + } + self.binary_str = 'taosdata' + self.nchar_str = '涛思数据' + self.tbnum = 2 + self.tag_ts = self.ts + self.tag_tinyint = 1 + self.tag_smallint = 2 + self.tag_int = 3 + self.tag_bigint = 4 + self.tag_utint = 5 + self.tag_usint = 6 + self.tag_uint = 7 + self.tag_ubint = 8 + self.tag_float = 9.1 + self.tag_double = 10.1 + self.tag_bool = True + self.tag_values = [ + f'{self.tag_ts},{self.tag_tinyint},{self.tag_smallint},{self.tag_int},{self.tag_bigint},\ + {self.tag_utint},{self.tag_usint},{self.tag_uint},{self.tag_ubint},{self.tag_float},{self.tag_double},{self.tag_bool},"{self.binary_str}","{self.nchar_str}"' + + ] + + self.param = [1,50,100] + + def insert_data(self,column_dict,tbname,row_num): intData = [] floatData = [] - - tdSql.execute('''create table test(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 float, col6 double, - col7 bool, col8 binary(20), col9 nchar(20), col11 tinyint unsigned, col12 smallint unsigned, col13 int unsigned, col14 bigint unsigned)''') - for i in range(self.rowNum): - tdSql.execute("insert into test values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)" - % (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1)) - intData.append(i + 1) - floatData.append(i + 0.1) - - # percentile verifacation - tdSql.error("select percentile(ts ,20) from test") - tdSql.error("select percentile(col7 ,20) from test") - tdSql.error("select percentile(col8 ,20) from test") - tdSql.error("select percentile(col9 ,20) from test") - column_list = [1,2,3,4,11,12,13,14] - percent_list = [0,50,100] - for i in column_list: - for j in percent_list: - tdSql.query(f"select percentile(col{i}, {j}) from test") - tdSql.checkData(0, 0, np.percentile(intData, j)) - - for i in [5,6]: - for j in percent_list: - tdSql.query(f"select percentile(col{i}, {j}) from test") - tdSql.checkData(0, 0, np.percentile(floatData, j)) - - tdSql.execute("create table meters (ts timestamp, voltage int) tags(loc nchar(20))") - tdSql.execute("create table t0 using meters tags('beijing')") - tdSql.execute("create table t1 using meters tags('shanghai')") - for i in range(self.rowNum): - tdSql.execute("insert into t0 values(%d, %d)" % (self.ts + i, i + 1)) - tdSql.execute("insert into t1 values(%d, %d)" % (self.ts + i, i + 1)) - - # tdSql.error("select percentile(voltage, 20) from meters") - - - - tdSql.execute("create table st(ts timestamp, k int)") - tdSql.execute("insert into st values(now, -100)(now+1a,-99)") - tdSql.query("select apercentile(k, 20) from st") - tdSql.checkData(0, 0, -100.00) - - + insert_sql = self.setsql.set_insertsql(column_dict,tbname,self.binary_str,self.nchar_str) + for i in range(row_num): + insert_list = [] + self.setsql.insert_values(column_dict,i,insert_sql,insert_list,self.ts) + intData.append(i) + floatData.append(i + 0.1) + return intData,floatData + def check_tags(self,tags,param,num,value): + tdSql.query(f'select percentile({tags}, {param}) from {self.stbname}_{num}') + print(tdSql.queryResult) + tdSql.checkEqual(tdSql.queryResult[0][0], value) + def function_check_ntb(self): + tdSql.prepare() + tdSql.execute(self.setsql.set_create_normaltable_sql(self.ntbname,self.column_dict)) + intData,floatData = self.insert_data(self.column_dict,self.ntbname,self.rowNum) + for k,v in self.column_dict.items(): + for param in self.param: + if v.lower() in ['timestamp','bool'] or 'binary' in v.lower() or 'nchar' in v.lower(): + tdSql.error(f'select percentile({k},{param}) from {self.ntbname}') + elif v.lower() in ['tinyint','smallint','int','bigint','tinyint unsigned','smallint unsigned','int unsigned','bigint unsigned']: + tdSql.query(f'select percentile({k}, {param}) from {self.ntbname}') + tdSql.checkData(0, 0, np.percentile(intData, param)) + else: + tdSql.query(f'select percentile({k}, {param}) from {self.ntbname}') + tdSql.checkData(0, 0, np.percentile(floatData, param)) + def function_check_ctb(self): + tdSql.prepare() + tdSql.execute(self.setsql.set_create_stable_sql(self.stbname,self.column_dict,self.tag_dict)) + for i in range(self.tbnum): + tdSql.execute(f"create table {self.stbname}_{i} using {self.stbname} tags({self.tag_values[0]})") + intData,floatData = self.insert_data(self.column_dict,f'{self.stbname}_{i}',self.rowNum) + for i in range(self.tbnum): + for k,v in self.column_dict.items(): + for param in self.param: + if v.lower() in ['timestamp','bool'] or 'binary' in v.lower() or 'nchar' in v.lower(): + tdSql.error(f'select percentile({k},{param}) from {self.stbname}_{i}') + elif v.lower() in ['tinyint','smallint','int','bigint','tinyint unsigned','smallint unsigned','int unsigned','bigint unsigned']: + tdSql.query(f'select percentile({k}, {param}) from {self.stbname}_{i}') + tdSql.checkData(0, 0, np.percentile(intData, param)) + else: + tdSql.query(f'select percentile({k}, {param}) from {self.stbname}_{i}') + tdSql.checkData(0, 0, np.percentile(floatData, param)) + + #!bug TD-17119 + # for k,v in self.tag_dict.items(): + # for param in self.param: + # if v.lower() in ['timestamp','bool'] or 'binary' in v.lower() or 'nchar' in v.lower(): + # tdSql.error(f'select percentile({k},{param}) from {self.stbname}_{i}') + # elif v.lower() == 'tinyint': + # self.check_tags(k,param,i,self.tag_tinyint) + # elif v.lower() == 'smallint': + # self.check_tags(k,param,i,self.tag_smallint) + # elif v.lower() == 'int': + # self.check_tags(k,param,i,self.tag_int) + # elif v.lower() == 'bigint': + # self.check_tags(k,param,i,self.tag_bigint) + # elif v.lower() == 'tinyint unsigned': + # self.check_tags(k,param,i,self.tag_utint) + # elif v.lower() == 'smallint unsigned': + # self.check_tags(k,param,i,self.tag_usint) + # elif v.lower() == 'int unsigned': + # self.check_tags(k,param,i,self.tag_uint) + # elif v.lower() == 'bigint unsigned': + # self.check_tags(k,param,i,self.tag_ubint) + # elif v.lower() == 'float': + # self.check_tags(k,param,i,self.tag_float) + # elif v.lower() == 'double': + # self.check_tags(k,param,i,self.tag_double) + def run(self): + self.function_check_ntb() + self.function_check_ctb() def stop(self): tdSql.close() diff --git a/tests/system-test/2-query/queryQnode.py b/tests/system-test/2-query/queryQnode.py index 8b893a93d7..3fdc09478d 100644 --- a/tests/system-test/2-query/queryQnode.py +++ b/tests/system-test/2-query/queryQnode.py @@ -32,9 +32,9 @@ class TDTestCase: # # --------------- main frame ------------------- # - clientCfgDict = {'queryPolicy': '1','debugFlag': 135} + clientCfgDict = {'queryPolicy': '1','debugFlag': 143} clientCfgDict["queryPolicy"] = '1' - clientCfgDict["debugFlag"] = 131 + clientCfgDict["debugFlag"] = 143 updatecfgDict = {'clientCfg': {}} updatecfgDict = {'debugFlag': 143} @@ -480,4 +480,4 @@ class TDTestCase: # add case with filename # tdCases.addWindows(__file__, TDTestCase()) -tdCases.addLinux(__file__, TDTestCase()) \ No newline at end of file +tdCases.addLinux(__file__, TDTestCase()) diff --git a/tests/system-test/2-query/top.py b/tests/system-test/2-query/top.py index 86e201ea9a..6120f81e6d 100644 --- a/tests/system-test/2-query/top.py +++ b/tests/system-test/2-query/top.py @@ -49,32 +49,10 @@ class TDTestCase: self.param_list = [1,100] def insert_data(self,column_dict,tbname,row_num): - sql = '' - for k, v in column_dict.items(): - if v.lower() == 'timestamp' or v.lower() == 'tinyint' or v.lower() == 'smallint' or v.lower() == 'int' or v.lower() == 'bigint' or \ - v.lower() == 'tinyint unsigned' or v.lower() == 'smallint unsigned' or v.lower() == 'int unsigned' or v.lower() == 'bigint unsigned' or v.lower() == 'bool': - sql += '%d,' - elif v.lower() == 'float' or v.lower() == 'double': - sql += '%f,' - elif 'binary' in v.lower(): - sql += f'"{self.binary_str}%d",' - elif 'nchar' in v.lower(): - sql += f'"{self.nchar_str}%d",' - insert_sql = f'insert into {tbname} values({sql[:-1]})' + insert_sql = self.setsql.set_insertsql(column_dict,tbname,self.binary_str,self.nchar_str) for i in range(row_num): insert_list = [] - for k, v in column_dict.items(): - if v.lower() in[ 'tinyint' , 'smallint' , 'int', 'bigint' , 'tinyint unsigned' , 'smallint unsigned' , 'int unsigned' , 'bigint unsigned'] or\ - 'binary' in v.lower() or 'nchar' in v.lower(): - insert_list.append(1 + i) - elif v.lower() == 'float' or v.lower() == 'double': - insert_list.append(0.1 + i) - elif v.lower() == 'bool': - insert_list.append(i % 2) - elif v.lower() == 'timestamp': - insert_list.append(self.ts + i) - tdSql.execute(insert_sql%(tuple(insert_list))) - pass + self.setsql.insert_values(column_dict,i,insert_sql,insert_list,self.ts) def top_check_data(self,tbname,tb_type): new_column_dict = {} for param in self.param_list: @@ -86,7 +64,7 @@ class TDTestCase: tdSql.checkRows(self.rowNum) values_list = [] for i in range(self.rowNum): - tp = (self.rowNum-i,) + tp = (self.rowNum-i-1,) values_list.insert(0,tp) tdSql.checkEqual(tdSql.queryResult,values_list) elif tb_type == 'stable': @@ -96,7 +74,7 @@ class TDTestCase: tdSql.checkRows(param) values_list = [] for i in range(param): - tp = (self.rowNum-i,) + tp = (self.rowNum-i-1,) values_list.insert(0,tp) tdSql.checkEqual(tdSql.queryResult,values_list) elif tb_type == 'stable': @@ -132,7 +110,7 @@ class TDTestCase: for i in range(self.tbnum): tdSql.execute(f"create table {stbname}_{i} using {stbname} tags({tag_values[0]})") - tdSql.execute(self.insert_data(self.column_dict,f'{stbname}_{i}',self.rowNum)) + self.insert_data(self.column_dict,f'{stbname}_{i}',self.rowNum) tdSql.query('show tables') vgroup_list = [] for i in range(len(tdSql.queryResult)): diff --git a/tests/system-test/7-tmq/tmqAutoCreateTbl.py b/tests/system-test/7-tmq/tmqAutoCreateTbl.py new file mode 100644 index 0000000000..6a9f10ebbf --- /dev/null +++ b/tests/system-test/7-tmq/tmqAutoCreateTbl.py @@ -0,0 +1,333 @@ + +import taos +import sys +import time +import socket +import os +import threading +from enum import Enum + +from util.log import * +from util.sql import * +from util.cases import * +from util.dnodes import * +sys.path.append("./7-tmq") +from tmqCommon import * + +class TDTestCase: + def __init__(self): + self.vgroups = 2 + self.ctbNum = 100 + self.rowsPerTbl = 10000 + + def init(self, conn, logSql): + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor(), False) + + def prepareTestEnv(self): + tdLog.printNoPrefix("======== prepare test env include database, stable, ctables, and insert data: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 3, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 500, + 'rowsPerTbl': 1000, + 'batchNum': 500, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 3, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 0} + + paraDict['vgroups'] = self.vgroups + paraDict['ctbNum'] = self.ctbNum + paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("create ctb") + tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], + ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("insert data") + tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"], + ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], + startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) + + tdLog.info("restart taosd to ensure that the data falls into the disk") + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) + return + + def tmqCase1(self): + tdLog.printNoPrefix("======== test case 1: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 1000, + 'rowsPerTbl': 1000, + 'batchNum': 400, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 5, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 1} + + # paraDict['vgroups'] = self.vgroups + # paraDict['ctbNum'] = self.ctbNum + # paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("create ctb") + tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], + ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("insert data") + tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"], + ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], + startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) + + tdLog.info("create topics from stb1") + topicFromStb1 = 'topic_stb1' + queryString = "select ts, c1, c2 from %s.%s"%(paraDict['dbName'], paraDict['stbName']) + sqlString = "create topic %s as %s" %(topicFromStb1, queryString) + tdLog.info("create topic sql: %s"%sqlString) + tdSql.execute(sqlString) + + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] + topicList = topicFromStb1 + ifcheckdata = 0 + ifManualCommit = 0 + keyList = 'group.id:cgrp1,\ + enable.auto.commit:true,\ + auto.commit.interval.ms:500,\ + auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) + + # time.sleep(3) + tmqCom.getStartCommitNotifyFromTmqsim() + tdLog.info("================= restart dnode ===========================") + tdDnodes.stop(1) + tdDnodes.start(1) + time.sleep(5) + + tdLog.info("insert process end, and start to check consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + totalConsumeRows = 0 + for i in range(expectRows): + totalConsumeRows += resultList[i] + + tdSql.query(queryString) + totalRowsInserted = tdSql.getRows() + + if totalConsumeRows != totalRowsInserted: + tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, totalRowsInserted)) + tdLog.exit("tmq consume rows error!") + + tdSql.query("drop topic %s"%topicFromStb1) + + tdLog.printNoPrefix("======== test case 1 end ...... ") + + def tmqCase2(self): + tdLog.printNoPrefix("======== test case 2: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 1000, + 'rowsPerTbl': 1000, + 'batchNum': 1000, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 5, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 1} + + # paraDict['vgroups'] = self.vgroups + # paraDict['ctbNum'] = self.ctbNum + # paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("create ctb") + tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], + ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("insert data") + tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"], + ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], + startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("create topics from stb1") + topicFromStb1 = 'topic_stb1' + queryString = "select ts, c1, c2 from %s.%s"%(paraDict['dbName'], paraDict['stbName']) + sqlString = "create topic %s as %s" %(topicFromStb1, queryString) + tdLog.info("create topic sql: %s"%sqlString) + tdSql.execute(sqlString) + + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] * 2 + topicList = topicFromStb1 + ifcheckdata = 0 + ifManualCommit = 0 + keyList = 'group.id:cgrp1,\ + enable.auto.commit:true,\ + auto.commit.interval.ms:1000,\ + auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) + + tdLog.info("create some new child table and insert data ") + tmqCom.insert_data_with_autoCreateTbl(tdSql,paraDict["dbName"],paraDict["stbName"],"ctb",paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"]) + + tmqCom.getStartCommitNotifyFromTmqsim() + tdLog.info("================= restart dnode ===========================") + tdDnodes.stop(1) + tdDnodes.start(1) + time.sleep(5) + + tdLog.info("insert process end, and start to check consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + totalConsumeRows = 0 + for i in range(expectRows): + totalConsumeRows += resultList[i] + + tdSql.query(queryString) + totalRowsInserted = tdSql.getRows() + + if totalConsumeRows != totalRowsInserted: + tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, totalRowsInserted)) + tdLog.exit("tmq consume rows error!") + + tdSql.query("drop topic %s"%topicFromStb1) + + tdLog.printNoPrefix("======== test case 2 end ...... ") + + # 自动建表完成数据插入,启动消费 + def tmqCase3(self): + tdLog.printNoPrefix("======== test case 3: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 1000, + 'rowsPerTbl': 1000, + 'batchNum': 400, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 5, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 1} + + paraDict['vgroups'] = self.vgroups + paraDict['ctbNum'] = self.ctbNum + paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("insert data by auto create ctb") + tmqCom.insert_data_with_autoCreateTbl(tdSql,paraDict["dbName"],paraDict["stbName"],"ctb",paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"]) + + tdLog.info("create topics from stb1") + topicFromStb1 = 'topic_stb1' + queryString = "select ts, c1, c2 from %s.%s"%(paraDict['dbName'], paraDict['stbName']) + sqlString = "create topic %s as %s" %(topicFromStb1, queryString) + tdLog.info("create topic sql: %s"%sqlString) + tdSql.execute(sqlString) + + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] + topicList = topicFromStb1 + ifcheckdata = 0 + ifManualCommit = 0 + keyList = 'group.id:cgrp1,\ + enable.auto.commit:true,\ + auto.commit.interval.ms:1000,\ + auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) + + # tdLog.info("================= restart dnode ===========================") + # tdDnodes.stop(1) + # tdDnodes.start(1) + # time.sleep(2) + + tdLog.info("insert process end, and start to check consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + totalConsumeRows = 0 + for i in range(expectRows): + totalConsumeRows += resultList[i] + + tdSql.query(queryString) + totalRowsInserted = tdSql.getRows() + + if totalConsumeRows != totalRowsInserted: + tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, totalRowsInserted)) + tdLog.exit("tmq consume rows error!") + + tdSql.query("drop topic %s"%topicFromStb1) + + tdLog.printNoPrefix("======== test case 3 end ...... ") + + + def run(self): + tdSql.prepare() + + # self.tmqCase1() + # self.tmqCase2() + self.tmqCase3() + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +event = threading.Event() + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) diff --git a/tests/system-test/7-tmq/tmqCommon.py b/tests/system-test/7-tmq/tmqCommon.py index 7f9d36bd26..2030563a9a 100644 --- a/tests/system-test/7-tmq/tmqCommon.py +++ b/tests/system-test/7-tmq/tmqCommon.py @@ -361,19 +361,25 @@ class TMQCom: if startTs == 0: t = time.time() startTs = int(round(t * 1000)) - + #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows)) rowsBatched = 0 for i in range(ctbNum): - sql += " %s.%s_%d using %s.%s tags (%d) values "%(dbName,ctbPrefix,i+ctbStartIdx,dbName,stbName,i) + tagBinaryValue = 'beijing' + if (i % 2 == 0): + tagBinaryValue = 'shanghai' + elif (i % 3 == 0): + tagBinaryValue = 'changsha' + + sql += " %s.%s_%d using %s.%s tags (%d, %d, %d, '%s', '%s') values "%(dbName,ctbPrefix,i+ctbStartIdx,dbName,stbName,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx,tagBinaryValue,tagBinaryValue) for j in range(rowsPerTbl): - sql += "(%d, %d, 'tmqrow_%d') "%(startTs + j, j, j) + sql += "(%d, %d, %d, %d, 'binary_%d', 'nchar_%d', now) "%(startTs+j, j,j, j,i+ctbStartIdx,rowsBatched) rowsBatched += 1 if ((rowsBatched == batchNum) or (j == rowsPerTbl - 1)): tsql.execute(sql) rowsBatched = 0 if j < rowsPerTbl - 1: - sql = "insert into %s.%s_%d using %s.%s tags (%d) values " %(dbName,ctbPrefix,i+ctbStartIdx,dbName,stbName,i) + sql = "insert into %s.%s_%d using %s.%s tags (%d, %d, %d, '%s', '%s') values " %(dbName,ctbPrefix,i+ctbStartIdx,dbName,stbName,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx,tagBinaryValue,tagBinaryValue) else: sql = "insert into " #end sql diff --git a/tests/system-test/99-TDcase/TD-17255.py b/tests/system-test/99-TDcase/TD-17255.py new file mode 100644 index 0000000000..9eb8d531f7 --- /dev/null +++ b/tests/system-test/99-TDcase/TD-17255.py @@ -0,0 +1,333 @@ + +import taos +import sys +import time +import socket +import os +import threading +from enum import Enum + +from util.log import * +from util.sql import * +from util.cases import * +from util.dnodes import * +sys.path.append("./7-tmq") +from tmqCommon import * + +class TDTestCase: + def __init__(self): + self.vgroups = 2 + self.ctbNum = 100 + self.rowsPerTbl = 10000 + + def init(self, conn, logSql): + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor(), False) + + def prepareTestEnv(self): + tdLog.printNoPrefix("======== prepare test env include database, stable, ctables, and insert data: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 3, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 500, + 'rowsPerTbl': 1000, + 'batchNum': 500, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 3, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 0} + + paraDict['vgroups'] = self.vgroups + paraDict['ctbNum'] = self.ctbNum + paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("create ctb") + tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], + ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("insert data") + tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"], + ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], + startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) + + tdLog.info("restart taosd to ensure that the data falls into the disk") + # tdDnodes.stop(1) + # tdDnodes.start(1) + tdSql.query("flush database %s"%(paraDict['dbName'])) + return + + def tmqCase1(self): + tdLog.printNoPrefix("======== test case 1: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 1000, + 'rowsPerTbl': 1000, + 'batchNum': 400, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 5, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 1} + + # paraDict['vgroups'] = self.vgroups + # paraDict['ctbNum'] = self.ctbNum + # paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("create ctb") + tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], + ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("insert data") + tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"], + ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], + startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) + + tdLog.info("create topics from stb1") + topicFromStb1 = 'topic_stb1' + queryString = "select ts, c1, c2 from %s.%s"%(paraDict['dbName'], paraDict['stbName']) + sqlString = "create topic %s as %s" %(topicFromStb1, queryString) + tdLog.info("create topic sql: %s"%sqlString) + tdSql.execute(sqlString) + + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] + topicList = topicFromStb1 + ifcheckdata = 0 + ifManualCommit = 0 + keyList = 'group.id:cgrp1,\ + enable.auto.commit:true,\ + auto.commit.interval.ms:500,\ + auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) + + # time.sleep(3) + tmqCom.getStartCommitNotifyFromTmqsim() + tdLog.info("================= restart dnode ===========================") + tdDnodes.stop(1) + tdDnodes.start(1) + time.sleep(5) + + tdLog.info("insert process end, and start to check consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + totalConsumeRows = 0 + for i in range(expectRows): + totalConsumeRows += resultList[i] + + tdSql.query(queryString) + totalRowsInserted = tdSql.getRows() + + if totalConsumeRows != totalRowsInserted: + tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, totalRowsInserted)) + tdLog.exit("tmq consume rows error!") + + tdSql.query("drop topic %s"%topicFromStb1) + + tdLog.printNoPrefix("======== test case 1 end ...... ") + + def tmqCase2(self): + tdLog.printNoPrefix("======== test case 2: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 1000, + 'rowsPerTbl': 1000, + 'batchNum': 1000, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 5, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 1} + + # paraDict['vgroups'] = self.vgroups + # paraDict['ctbNum'] = self.ctbNum + # paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("create ctb") + tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], + ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("insert data") + tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"], + ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], + startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) + tdLog.info("create topics from stb1") + topicFromStb1 = 'topic_stb1' + queryString = "select ts, c1, c2 from %s.%s"%(paraDict['dbName'], paraDict['stbName']) + sqlString = "create topic %s as %s" %(topicFromStb1, queryString) + tdLog.info("create topic sql: %s"%sqlString) + tdSql.execute(sqlString) + + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] * 2 + topicList = topicFromStb1 + ifcheckdata = 0 + ifManualCommit = 0 + keyList = 'group.id:cgrp1,\ + enable.auto.commit:true,\ + auto.commit.interval.ms:1000,\ + auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) + + tdLog.info("create some new child table and insert data ") + tmqCom.insert_data_with_autoCreateTbl(tdSql,paraDict["dbName"],paraDict["stbName"],"ctb",paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"]) + + tmqCom.getStartCommitNotifyFromTmqsim() + tdLog.info("================= restart dnode ===========================") + tdDnodes.stop(1) + tdDnodes.start(1) + time.sleep(5) + + tdLog.info("insert process end, and start to check consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + totalConsumeRows = 0 + for i in range(expectRows): + totalConsumeRows += resultList[i] + + tdSql.query(queryString) + totalRowsInserted = tdSql.getRows() + + if totalConsumeRows != totalRowsInserted: + tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, totalRowsInserted)) + tdLog.exit("tmq consume rows error!") + + tdSql.query("drop topic %s"%topicFromStb1) + + tdLog.printNoPrefix("======== test case 2 end ...... ") + + # 自动建表完成数据插入,启动消费 + def tmqCase3(self): + tdLog.printNoPrefix("======== test case 3: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 1000, + 'rowsPerTbl': 1000, + 'batchNum': 400, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 5, + 'showMsg': 1, + 'showRow': 1, + 'snapshot': 1} + + paraDict['vgroups'] = self.vgroups + paraDict['ctbNum'] = self.ctbNum + paraDict['rowsPerTbl'] = self.rowsPerTbl + + tmqCom.initConsumerTable() + tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("insert data by auto create ctb") + tmqCom.insert_data_with_autoCreateTbl(tdSql,paraDict["dbName"],paraDict["stbName"],"ctb",paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"]) + + tdLog.info("create topics from stb1") + topicFromStb1 = 'topic_stb1' + queryString = "select ts, c1, c2 from %s.%s"%(paraDict['dbName'], paraDict['stbName']) + sqlString = "create topic %s as %s" %(topicFromStb1, queryString) + tdLog.info("create topic sql: %s"%sqlString) + tdSql.execute(sqlString) + + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] + topicList = topicFromStb1 + ifcheckdata = 0 + ifManualCommit = 0 + keyList = 'group.id:cgrp1,\ + enable.auto.commit:true,\ + auto.commit.interval.ms:1000,\ + auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) + + # tdLog.info("================= restart dnode ===========================") + # tdDnodes.stop(1) + # tdDnodes.start(1) + # time.sleep(2) + + tdLog.info("insert process end, and start to check consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + totalConsumeRows = 0 + for i in range(expectRows): + totalConsumeRows += resultList[i] + + tdSql.query(queryString) + totalRowsInserted = tdSql.getRows() + + if totalConsumeRows != totalRowsInserted: + tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, totalRowsInserted)) + tdLog.exit("tmq consume rows error!") + + tdSql.query("drop topic %s"%topicFromStb1) + + tdLog.printNoPrefix("======== test case 3 end ...... ") + + + def run(self): + tdSql.prepare() + + self.tmqCase1() + # self.tmqCase2() + self.tmqCase3() + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +event = threading.Event() + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) diff --git a/tests/test/c/sdbDump.c b/tests/test/c/sdbDump.c index 42f1bb4062..4d0f582dc6 100644 --- a/tests/test/c/sdbDump.c +++ b/tests/test/c/sdbDump.c @@ -72,6 +72,7 @@ void dumpDb(SSdb *pSdb, SJson *json) { tjsonAddIntegerToObject(item, "buffer", pObj->cfg.buffer); tjsonAddIntegerToObject(item, "pageSize", pObj->cfg.pageSize); tjsonAddIntegerToObject(item, "pages", pObj->cfg.pages); + tjsonAddIntegerToObject(item, "cacheLastSize", pObj->cfg.cacheLastSize); tjsonAddIntegerToObject(item, "daysPerFile", pObj->cfg.daysPerFile); tjsonAddIntegerToObject(item, "daysToKeep0", pObj->cfg.daysToKeep0); tjsonAddIntegerToObject(item, "daysToKeep1", pObj->cfg.daysToKeep1); @@ -84,7 +85,7 @@ void dumpDb(SSdb *pSdb, SJson *json) { tjsonAddIntegerToObject(item, "compression", pObj->cfg.compression); tjsonAddIntegerToObject(item, "replications", pObj->cfg.replications); tjsonAddIntegerToObject(item, "strict", pObj->cfg.strict); - tjsonAddIntegerToObject(item, "cacheLastRow", pObj->cfg.cacheLastRow); + tjsonAddIntegerToObject(item, "cacheLast", pObj->cfg.cacheLast); tjsonAddIntegerToObject(item, "hashMethod", pObj->cfg.hashMethod); tjsonAddIntegerToObject(item, "numOfRetensions", pObj->cfg.numOfRetensions); tjsonAddIntegerToObject(item, "schemaless", pObj->cfg.schemaless); diff --git a/tests/test/c/tmqSim.c b/tests/test/c/tmqSim.c index 85fe456670..b4f86d52b5 100644 --- a/tests/test/c/tmqSim.c +++ b/tests/test/c/tmqSim.c @@ -52,6 +52,7 @@ typedef struct { // char autoOffsetRest[16]; // none, earliest, latest TdFilePtr pConsumeRowsFile; + TdFilePtr pConsumeMetaFile; int32_t ifCheckData; int64_t expectMsgCnt; @@ -445,7 +446,7 @@ static void dumpToFileForCheck(TdFilePtr pFile, TAOS_ROW row, TAOS_FIELD* fields taosFprintfFile(pFile, "\n"); } -static int32_t msg_process(TAOS_RES* msg, SThreadInfo* pInfo, int32_t msgIndex) { +static int32_t data_msg_process(TAOS_RES* msg, SThreadInfo* pInfo, int32_t msgIndex) { char buf[1024]; int32_t totalRows = 0; @@ -496,6 +497,52 @@ static int32_t msg_process(TAOS_RES* msg, SThreadInfo* pInfo, int32_t msgIndex) return totalRows; } + +static int32_t meta_msg_process(TAOS_RES* msg, SThreadInfo* pInfo, int32_t msgIndex) { + char buf[1024]; + int32_t totalRows = 0; + + // printf("topic: %s\n", tmq_get_topic_name(msg)); + int32_t vgroupId = tmq_get_vgroup_id(msg); + const char* dbName = tmq_get_db_name(msg); + + taosFprintfFile(g_fp, "consumerId: %d, msg index:%" PRId64 "\n", pInfo->consumerId, msgIndex); + taosFprintfFile(g_fp, "dbName: %s, topic: %s, vgroupId: %d\n", dbName != NULL ? dbName : "invalid table", + tmq_get_topic_name(msg), vgroupId); + + { + tmq_raw_data *raw = tmq_get_raw_meta(msg); + + if(raw){ + TAOS_RES* pRes = taos_query(pInfo->taos, "use metadb"); + if (taos_errno(pRes) != 0) { + pError("error when use metadb, reason:%s\n", taos_errstr(pRes)); + taosFprintfFile(g_fp, "error when use metadb, reason:%s\n", taos_errstr(pRes)); + taosCloseFile(&g_fp); + taos_free_result(pRes); + exit(-1); + } + taos_free_result(pRes); + taosFprintfFile(g_fp, "raw:%p\n", raw); + + int32_t ret = taos_write_raw_meta(pInfo->taos, raw); + taosMemoryFree(raw); + } + + char* result = tmq_get_json_meta(msg); + if(result){ + //printf("meta result: %s\n", result); + taosFprintfFile(pInfo->pConsumeMetaFile, "%s\n", result); + taosMemoryFree(result); + } + } + + totalRows++; + + return totalRows; +} + + int queryDB(TAOS* taos, char* command) { TAOS_RES* pRes = taos_query(taos, command); int code = taos_errno(pRes); @@ -526,7 +573,7 @@ int32_t notifyMainScript(SThreadInfo* pInfo, int32_t cmdId) { static int32_t g_once_commit_flag = 0; static void tmq_commit_cb_print(tmq_t* tmq, int32_t code, void* param) { - pError("tmq_commit_cb_print() commit %d\n", code); + taosFprintfFile(g_fp, "tmq_commit_cb_print() commit %d\n", code); if (0 == g_once_commit_flag) { g_once_commit_flag = 1; @@ -630,8 +677,12 @@ void loop_consume(SThreadInfo* pInfo) { // getCurrentTimeString(tmpString)); sprintf(filename, "%s/../log/consumerid_%d.txt", configDir, pInfo->consumerId); pInfo->pConsumeRowsFile = taosOpenFile(filename, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_STREAM); - if (pInfo->pConsumeRowsFile == NULL) { - taosFprintfFile(g_fp, "%s create file fail for save rows content\n", getCurrentTimeString(tmpString)); + + sprintf(filename, "%s/../log/meta_consumerid_%d.txt", configDir, pInfo->consumerId); + pInfo->pConsumeMetaFile = taosOpenFile(filename, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_STREAM); + + if (pInfo->pConsumeRowsFile == NULL || pInfo->pConsumeMetaFile == NULL) { + taosFprintfFile(g_fp, "%s create file fail for save rows or save meta\n", getCurrentTimeString(tmpString)); return; } } @@ -645,7 +696,11 @@ void loop_consume(SThreadInfo* pInfo) { TAOS_RES* tmqMsg = tmq_consumer_poll(pInfo->tmq, consumeDelay); if (tmqMsg) { if (0 != g_stConfInfo.showMsgFlag) { - totalRows += msg_process(tmqMsg, pInfo, totalMsgs); + tmq_res_t msgType = tmq_get_res_type(tmqMsg); + if (msgType == TMQ_RES_TABLE_META) { + totalRows += meta_msg_process(tmqMsg, pInfo, totalMsgs); + } else if (msgType == TMQ_RES_DATA) + totalRows += data_msg_process(tmqMsg, pInfo, totalMsgs); } taos_free_result(tmqMsg); diff --git a/tools/taos-tools b/tools/taos-tools index d69d9feaf0..3f42d428eb 160000 --- a/tools/taos-tools +++ b/tools/taos-tools @@ -1 +1 @@ -Subproject commit d69d9feaf067db6af7c49b651f67ba0b0e11a861 +Subproject commit 3f42d428eb6b90dea2651f4ccea66e44705c831b