diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000000..7d877987ac
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,5 @@
+# Pull Request Checklist
+
+- [ ] Is the user manual updated?
+- [ ] Are the test cases passed and automated?
+- [ ] Is there no significant decrease in test coverage?
diff --git a/Jenkinsfile2 b/Jenkinsfile2
index 086883dfac..4ba38879eb 100644
--- a/Jenkinsfile2
+++ b/Jenkinsfile2
@@ -355,7 +355,7 @@ def pre_test_build_win() {
bat '''
cd %WIN_COMMUNITY_ROOT%/tests/ci
pip3 install taospy==2.7.16
- pip3 install taos-ws-py==0.3.3
+ pip3 install taos-ws-py==0.3.5
xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\lib\\taos.dll C:\\Windows\\System32
'''
return 1
diff --git a/docs/en/14-reference/05-connectors/30-python.mdx b/docs/en/14-reference/05-connectors/30-python.mdx
index 7263a3caa6..4f17261b33 100644
--- a/docs/en/14-reference/05-connectors/30-python.mdx
+++ b/docs/en/14-reference/05-connectors/30-python.mdx
@@ -41,12 +41,18 @@ We recommend using the latest version of `taospy`, regardless of the version of
|Python Client Library Version|major changes|
|:-------------------:|:----:|
+|2.7.16|add subscription configuration (session.timeout.ms, max.poll.interval.ms)|
+|2.7.15|added support for VARBINARY and GEOMETRY types|
+|2.7.14|fix known issues|
+|2.7.13|add TMQ synchronous submission offset interface|
|2.7.12|1. added support for `varbinary` type (STMT does not yet support)
2. improved query performance (thanks to contributor [hadrianl](https://github.com/taosdata/taos-connector-python/pull/209))|
|2.7.9|support for getting assignment and seek function on subscription|
|2.7.8|add `execute_many` method|
|Python Websocket Connection Version|major changes|
|:----------------------------:|:-----:|
+|0.3.5|1. added support for VARBINARY and GEOMETRY types
2. Fix known issues|
+|0.3.2|1. optimize WebSocket SQL query and insertion performance
2. Fix known issues
3. Modify the readme and document|
|0.2.9|bugs fixes|
|0.2.5|1. support for getting assignment and seek function on subscription
2. support schemaless
3. support STMT|
|0.2.4|support `unsubscribe` on subscription|
diff --git a/docs/en/14-reference/05-connectors/35-node.mdx b/docs/en/14-reference/05-connectors/35-node.mdx
index 476f9bab71..2aeef7af1e 100644
--- a/docs/en/14-reference/05-connectors/35-node.mdx
+++ b/docs/en/14-reference/05-connectors/35-node.mdx
@@ -27,6 +27,8 @@ Node.js client library needs to be run with Node.js 14 or higher version.
| Node.js connector version | major changes | TDengine 版本 |
| :-----------------------: | :------------------: | :----------------:|
+| 3.1.2 | Optimized the data protocol and parsing, resulting in a significant improvement in performance | 3.2.0.0 or later |
+| 3.1.1 | Optimized data transmission performance | 3.2.0.0 or later |
| 3.1.0 | new version, supports websocket | 3.2.0.0 or later |
## Supported features
diff --git a/docs/en/14-reference/12-config/index.md b/docs/en/14-reference/12-config/index.md
index 77d183a5ef..63aa6ed447 100755
--- a/docs/en/14-reference/12-config/index.md
+++ b/docs/en/14-reference/12-config/index.md
@@ -773,7 +773,7 @@ lossyColumns float|double
02/22 10:49:27.607990 00002933 UTL lossyColumns float|double
```
-### ifAdtFse
+### ifAdtFse
| Attribute | Description |
| -------- | -------------------------------- |
@@ -898,4 +898,4 @@ lossyColumns float|double
| 53 | udf | Yes | Yes | |
| 54 | enableCoreFile | Yes | Yes | |
| 55 | ttlChangeOnWrite | No | Yes | |
-| 56 | keepTimeOffset | Yes | Yes(discarded since 3.2.0.0) | |
+| 56 | keepTimeOffset | Yes | Yes(discarded since 3.2.0.0) | see "KEEP_TIME_OFFSET" |
diff --git a/docs/examples/node/package.json b/docs/examples/node/package.json
index 14303c8f37..d77c96fbb3 100644
--- a/docs/examples/node/package.json
+++ b/docs/examples/node/package.json
@@ -4,6 +4,12 @@
"main": "index.js",
"license": "MIT",
"dependencies": {
- "@tdengine/websocket": "^3.1.1"
- }
+ "@tdengine/websocket": "^3.1.2"
+ },
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "description": ""
}
diff --git a/docs/zh/06-advanced/03-stream.md b/docs/zh/06-advanced/03-stream.md
index c47831dde3..c26924561c 100644
--- a/docs/zh/06-advanced/03-stream.md
+++ b/docs/zh/06-advanced/03-stream.md
@@ -124,7 +124,7 @@ create stream if not exists count_history_s fill_history 1 into count_history as
窗口关闭是由事件时间决定的,如事件流中断、或持续延迟,此时事件时间无法更新,可能导致无法得到最新的计算结果。
-因此,流计算提供了以事件时间结合处理时间计算的 MAX_DELAY 触发模式。MAX_DELAY 模式在窗口关闭时会立即触发计算。此外,当数据写入后,计算触发的时间超过 max delay 指定的时间,则立即触发计算。
+因此,流计算提供了以事件时间结合处理时间计算的 MAX_DELAY 触发模式:MAX_DELAY 模式在窗口关闭时会立即触发计算,它的单位可以自行指定,具体单位:a(毫秒)、s(秒)、m(分)、h(小时)、d(天)、w(周)。此外,当数据写入后,计算触发的时间超过 MAX_DELAY 指定的时间,则立即触发计算。
### 流计算的窗口关闭
@@ -259,4 +259,4 @@ flush database test1;
5.修改 taos.cfg,去掉 disableStream 1,或将 disableStream 改为 0
-6.启动 taosd
\ No newline at end of file
+6.启动 taosd
diff --git a/docs/zh/07-develop/07-tmq.md b/docs/zh/07-develop/07-tmq.md
index a91a764c67..8b272bdfff 100644
--- a/docs/zh/07-develop/07-tmq.md
+++ b/docs/zh/07-develop/07-tmq.md
@@ -16,7 +16,7 @@ TDengine 提供了类似于消息队列产品的数据订阅和消费接口。
**注意**
在 TDengine 连接器实现中,对于订阅查询,有以下限制。
-- 查询语句限制:订阅查询只能使用 select 语句,不支持其他类型的SQL,如 insert、update 或 delete 等。
+- 查询语句限制:订阅查询只能使用 select 语句,并不支持其他类型的SQL,如订阅库,订阅超级表(非 select 方式),insert、update 或 delete 等。
- 原始始数据查询:订阅查询只能查询原始数据,而不能查询聚合或计算结果。
- 时间顺序限制:订阅查询只能按照时间正序查询数据。
diff --git a/docs/zh/14-reference/01-components/01-taosd.md b/docs/zh/14-reference/01-components/01-taosd.md
index dc35d40b07..64ae69528b 100644
--- a/docs/zh/14-reference/01-components/01-taosd.md
+++ b/docs/zh/14-reference/01-components/01-taosd.md
@@ -27,65 +27,65 @@ taosd 命令行参数如下
### 连接相关
|参数名称|支持版本|参数含义|
-|-----------------------|-----------|-|
-|firstEp | |taosd 启动时,主动连接的集群中首个 dnode 的 end point,默认值 localhost:6030|
-|secondEp | |taosd 启动时,如果 firstEp 连接不上,尝试连接集群中第二个 dnode 的 endpoint,无默认值|
-|fqdn | |taosd 监听的服务地址,默认为所在服务器上配置的第一个 hostname|
-|serverPort | |taosd 监听的端口,默认值 6030|
-|compressMsgSize | |是否对 RPC 消息进行压缩;-1:所有消息都不压缩;0:所有消息都压缩;N (N>0):只有大于 N 个字节的消息才压缩;默认值 -1|
-|shellActivityTimer | |客户端向 mnode 发送心跳的时长,单位为秒,取值范围 1-120,默认值 3|
-|numOfRpcSessions | |RPC 支持的最大连接数,取值范围 100-100000,默认值 30000|
-|numOfRpcThreads | |RPC 线程数目,默认值为 CPU 核数的一半|
-|numOfTaskQueueThreads | |dnode 处理 RPC 消息的线程数|
-|statusInterval | |dnode 与 mnode 之间的心跳间隔|
-|rpcQueueMemoryAllowed | |dnode 允许的 rpc 消息占用的内存最大值,单位 bytes,取值范围 104857600-INT64_MAX,默认值 服务器内存的 1/10 |
-|resolveFQDNRetryTime | |FQDN 解析失败时的重试次数|
-|timeToGetAvailableConn | |获得可用连接的最长等待时间,取值范围 10-50000000,单位为毫秒,默认值 500000|
-|maxShellConns | |允许创建的最大链接数|
-|maxRetryWaitTime | |重连最大超时时间|
-|shareConnLimit |3.3.4.3 之后|内部参数,一个链接可以共享的查询数目,取值范围 1-256,默认值 10|
-|readTimeout |3.3.4.3 之后|内部参数,最小超时时间,取值范围 64-604800,单位为秒,默认值 900|
+|-----------------------|----------|-|
+|firstEp | |taosd 启动时,主动连接的集群中首个 dnode 的 end point,默认值 localhost:6030|
+|secondEp | |taosd 启动时,如果 firstEp 连接不上,尝试连接集群中第二个 dnode 的 endpoint,无默认值|
+|fqdn | |taosd 监听的服务地址,默认为所在服务器上配置的第一个 hostname|
+|serverPort | |taosd 监听的端口,默认值 6030|
+|compressMsgSize | |是否对 RPC 消息进行压缩;-1:所有消息都不压缩;0:所有消息都压缩;N (N>0):只有大于 N 个字节的消息才压缩;默认值 -1|
+|shellActivityTimer | |客户端向 mnode 发送心跳的时长,单位为秒,取值范围 1-120,默认值 3|
+|numOfRpcSessions | |RPC 支持的最大连接数,取值范围 100-100000,默认值 30000|
+|numOfRpcThreads | |RPC 线程数目,默认值为 CPU 核数的一半|
+|numOfTaskQueueThreads | |dnode 处理 RPC 消息的线程数|
+|statusInterval | |dnode 与 mnode 之间的心跳间隔|
+|rpcQueueMemoryAllowed | |dnode 允许的 rpc 消息占用的内存最大值,单位 bytes,取值范围 104857600-INT64_MAX,默认值 服务器内存的 1/10 |
+|resolveFQDNRetryTime | |FQDN 解析失败时的重试次数|
+|timeToGetAvailableConn | |获得可用连接的最长等待时间,取值范围 10-50000000,单位为毫秒,默认值 500000|
+|maxShellConns | |允许创建的最大链接数|
+|maxRetryWaitTime | |重连最大超时时间|
+|shareConnLimit |3.3.4.3 后|内部参数,一个链接可以共享的查询数目,取值范围 1-256,默认值 10|
+|readTimeout |3.3.4.3 后|内部参数,最小超时时间,取值范围 64-604800,单位为秒,默认值 900|
### 监控相关
|参数名称|支持版本|参数含义|
-|-----------------------|-----------|-|
-|monitor | |是否收集监控数据并上报,0:关闭;1:打开;默认值 0|
-|monitorFqdn | |taosKeeper 服务所在服务器的 FQDN,默认值 无|
-|monitorPort | |taosKeeper 服务所监听的端口号,默认值 6043|
-|monitorInterval | |监控数据库记录系统参数(CPU/内存)的时间间隔,单位是秒,取值范围 1-200000 ,默认值 30|
-|monitorMaxLogs | |缓存的待上报日志条数|
-|monitorComp | |是否采用压缩方式上报监控日志时|
-|monitorLogProtocol | |是否打印监控日志|
-|monitorForceV2 | |是否使用 V2 版本协议上报|
-|telemetryReporting | |是否上传 telemetry,0:不上传,1:上传,默认值 1|
-|telemetryServer | |telemetry 服务器地址|
-|telemetryPort | |telemetry 服务器端口编号|
-|telemetryInterval | |telemetry 上传时间间隔,单位为秒,默认 43200|
-|crashReporting | |是否上传 crash 信息;0:不上传,1:上传;默认值 1|
+|-----------------------|----------|-|
+|monitor | |是否收集监控数据并上报,0:关闭;1:打开;默认值 0|
+|monitorFqdn | |taosKeeper 服务所在服务器的 FQDN,默认值 无|
+|monitorPort | |taosKeeper 服务所监听的端口号,默认值 6043|
+|monitorInterval | |监控数据库记录系统参数(CPU/内存)的时间间隔,单位是秒,取值范围 1-200000 ,默认值 30|
+|monitorMaxLogs | |缓存的待上报日志条数|
+|monitorComp | |是否采用压缩方式上报监控日志时|
+|monitorLogProtocol | |是否打印监控日志|
+|monitorForceV2 | |是否使用 V2 版本协议上报|
+|telemetryReporting | |是否上传 telemetry,0:不上传,1:上传,默认值 1|
+|telemetryServer | |telemetry 服务器地址|
+|telemetryPort | |telemetry 服务器端口编号|
+|telemetryInterval | |telemetry 上传时间间隔,单位为秒,默认 43200|
+|crashReporting | |是否上传 crash 信息;0:不上传,1:上传;默认值 1|
### 查询相关
|参数名称|支持版本|参数含义|
-|------------------------|-----------|-|
-|countAlwaysReturnValue | |count/hyperloglog 函数在输入数据为空或者 NULL 的情况下是否返回值;0:返回空行,1:返回;默认值 1;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了 TSMA 时,且相应的组或窗口内数据为空或者 NULL,对应的组或窗口将不返回查询结果;注意此参数客户端和服务端值应保持一致|
-|tagFilterCache | |是否缓存标签过滤结果|
-|maxNumOfDistinctRes | |允许返回的 distinct 结果最大行数,默认值 10 万,最大允许值 1 亿|
-|queryBufferSize | |暂不生效|
-|queryRspPolicy | |查询响应策略|
-|filterScalarMode | |强制使用标量过滤模式,0:关闭;1:开启,默认值 0|
-|queryPlannerTrace | |内部参数,查询计划是否输出详细日志|
-|queryNodeChunkSize | |内部参数,查询计划的块大小|
-|queryUseNodeAllocator | |内部参数,查询计划的分配方法|
-|queryMaxConcurrentTables| |内部参数,查询计划的并发数目|
-|queryRsmaTolerance | |内部参数,用于判定查询哪一级 rsma 数据时的容忍时间,单位为毫秒|
-|enableQueryHb | |内部参数,是否发送查询心跳消息|
-|pqSortMemThreshold | |内部参数,排序使用的内存阈值|
+|------------------------|----------|-|
+|countAlwaysReturnValue | |count/hyperloglog 函数在输入数据为空或者 NULL 的情况下是否返回值;0:返回空行,1:返回;默认值 1;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了 TSMA 时,且相应的组或窗口内数据为空或者 NULL,对应的组或窗口将不返回查询结果;注意此参数客户端和服务端值应保持一致|
+|tagFilterCache | |是否缓存标签过滤结果|
+|maxNumOfDistinctRes | |允许返回的 distinct 结果最大行数,默认值 10 万,最大允许值 1 亿|
+|queryBufferSize | |暂不生效|
+|queryRspPolicy | |查询响应策略|
+|filterScalarMode | |强制使用标量过滤模式,0:关闭;1:开启,默认值 0|
+|queryPlannerTrace | |内部参数,查询计划是否输出详细日志|
+|queryNodeChunkSize | |内部参数,查询计划的块大小|
+|queryUseNodeAllocator | |内部参数,查询计划的分配方法|
+|queryMaxConcurrentTables| |内部参数,查询计划的并发数目|
+|queryRsmaTolerance | |内部参数,用于判定查询哪一级 rsma 数据时的容忍时间,单位为毫秒|
+|enableQueryHb | |内部参数,是否发送查询心跳消息|
+|pqSortMemThreshold | |内部参数,排序使用的内存阈值|
### 区域相关
|参数名称|支持版本|参数含义|
-|-----------------|-----------|-|
-|timezone | |时区;缺省从系统中动态获取当前的时区设置|
-|locale | |系统区位信息及编码格式,缺省从系统中获取|
-|charset | |字符集编码,缺省从系统中获取|
+|-----------------|----------|-|
+|timezone | |时区;缺省从系统中动态获取当前的时区设置|
+|locale | |系统区位信息及编码格式,缺省从系统中获取|
+|charset | |字符集编码,缺省从系统中获取|
:::info
1. 为应对多时区的数据写入和查询问题,TDengine 采用 Unix 时间戳(Unix Timestamp)来记录和存储时间戳。Unix 时间戳的特点决定了任一时刻不论在任何时区,产生的时间戳均一致。需要注意的是,Unix 时间戳是在客户端完成转换和记录。为了确保客户端其他形式的时间转换为正确的 Unix 时间戳,需要设置正确的时区。
@@ -164,147 +164,147 @@ charset 的有效值是 UTF-8。
### 存储相关
|参数名称|支持版本|参数含义|
-|--------------------|-----------|-|
-|dataDir | |数据文件目录,所有的数据文件都将写入该目录,默认值 /var/lib/taos|
-|tempDir | |指定所有系统运行过程中的临时文件生成的目录,默认值 /tmp|
-|minimalDataDirGB | |dataDir 指定的时序数据存储目录所需要保留的最小空间,单位 GB,默认值 2|
-|minimalTmpDirGB | |tempDir 所指定的临时文件目录所需要保留的最小空间,单位 GB,默认值 1|
-|minDiskFreeSize |3.1.1.0 之后|当某块磁盘上的可用空间小于等于这个阈值时,该磁盘将不再被选择用于生成新的数据文件,单位为字节,取值范围 52428800-1073741824,默认值为 52428800;企业版参数|
-|s3MigrateIntervalSec|3.3.4.3 之后|本地数据文件自动上传 S3 的触发周期,单位为秒。最小值:600;最大值:100000。默认值 3600;企业版参数|
-|s3MigrateEnabled |3.3.4.3 之后|是否自动进行 S3 迁移,默认值为 0,表示关闭自动 S3 迁移,可配置为 1;企业版参数|
-|s3Accesskey |3.3.4.3 之后|冒号分隔的用户 SecretId:SecretKey,例如 AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E;企业版参数|
-|s3Endpoint |3.3.4.3 之后|用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 保持一致,否则无法访问;企业版参数|
-|s3BucketName |3.3.4.3 之后|存储桶名称,减号后面是用户注册 COS 服务的 AppId,其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔;参数值均为字符串类型,但不需要引号;例如 test0711-1309024725;企业版参数|
-|s3PageCacheSize |3.3.4.3 之后|S3 page cache 缓存页数目,取值范围 4-1048576,单位为页,默认值 4096;企业版参数|
-|s3UploadDelaySec |3.3.4.3 之后|data 文件持续多长时间不再变动后上传至 S3,取值范围 1-2592000 (30天),单位为秒,默认值 60;企业版参数|
-|cacheLazyLoadThreshold | |内部参数,缓存的装载策略|
+|--------------------|----------|-|
+|dataDir | |数据文件目录,所有的数据文件都将写入该目录,默认值 /var/lib/taos|
+|tempDir | |指定所有系统运行过程中的临时文件生成的目录,默认值 /tmp|
+|minimalDataDirGB | |dataDir 指定的时序数据存储目录所需要保留的最小空间,单位 GB,默认值 2|
+|minimalTmpDirGB | |tempDir 所指定的临时文件目录所需要保留的最小空间,单位 GB,默认值 1|
+|minDiskFreeSize |3.1.1.0 后|当某块磁盘上的可用空间小于等于这个阈值时,该磁盘将不再被选择用于生成新的数据文件,单位为字节,取值范围 52428800-1073741824,默认值为 52428800;企业版参数|
+|s3MigrateIntervalSec|3.3.4.3 后|本地数据文件自动上传 S3 的触发周期,单位为秒。最小值:600;最大值:100000。默认值 3600;企业版参数|
+|s3MigrateEnabled |3.3.4.3 后|是否自动进行 S3 迁移,默认值为 0,表示关闭自动 S3 迁移,可配置为 1;企业版参数|
+|s3Accesskey |3.3.4.3 后|冒号分隔的用户 SecretId:SecretKey,例如 AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E;企业版参数|
+|s3Endpoint |3.3.4.3 后|用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 保持一致,否则无法访问;企业版参数|
+|s3BucketName |3.3.4.3 后|存储桶名称,减号后面是用户注册 COS 服务的 AppId,其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔;参数值均为字符串类型,但不需要引号;例如 test0711-1309024725;企业版参数|
+|s3PageCacheSize |3.3.4.3 后|S3 page cache 缓存页数目,取值范围 4-1048576,单位为页,默认值 4096;企业版参数|
+|s3UploadDelaySec |3.3.4.3 后|data 文件持续多长时间不再变动后上传至 S3,取值范围 1-2592000 (30天),单位为秒,默认值 60;企业版参数|
+|cacheLazyLoadThreshold| |内部参数,缓存的装载策略|
### 集群相关
|参数名称|支持版本|参数含义|
-|--------------------------|-----------|-|
-|supportVnodes | |dnode 支持的最大 vnode 数目,取值范围 0-4096,默认值 CPU 核数的 2 倍 + 5|
-|numOfCommitThreads | |落盘线程的最大数量,取值范围 0-1024,默认值为 4|
-|numOfMnodeReadThreads | |mnode 的 Read 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)|
-|numOfVnodeQueryThreads | |vnode 的 Query 线程数目,取值范围 0-1024,默认值为 CPU 核数的两倍(不超过 16)|
-|numOfVnodeFetchThreads | |vnode 的 Fetch 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)|
-|numOfVnodeRsmaThreads | |vnode 的 Rsma 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)|
-|numOfQnodeQueryThreads | |qnode 的 Query 线程数目,取值范围 0-1024,默认值为 CPU 核数的两倍(不超过 16)|
-|numOfSnodeSharedThreads | |snode 的共享线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不小于 2,不超过 4)|
-|numOfSnodeUniqueThreads | |snode 的独占线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不小于 2,不超过 4)|
-|ratioOfVnodeStreamThreads | |流计算使用 vnode 线程的比例,取值范围 0.01-4,默认值 4|
-|ttlUnit | |ttl 参数的单位,取值范围 1-31572500,单位为秒,默认值 86400|
-|ttlPushInterval | |ttl 检测超时频率,取值范围 1-100000,单位为秒,默认值 10|
-|ttlChangeOnWrite | |ttl 到期时间是否伴随表的修改操作改变;0:不改变,1:改变;默认值为 0|
-|ttlBatchDropNum | |ttl 一批删除子表的数目,最小值为 0,默认值 10000|
-|retentionSpeedLimitMB | |数据在不同级别硬盘上迁移时的速度限制,取值范围 0-1024,单位 MB,默认值 0,表示不限制|
-|maxTsmaNum | |集群内可创建的TSMA个数;取值范围 0-3;默认值 3|
-|tmqMaxTopicNum | |订阅最多可建立的 topic 数量;取值范围 1-10000;默认值为 20|
-|tmqRowSize | |订阅数据块的最大记录条数,取值范围 1-1000000,默认值 4096|
-|audit | |审计功能开关;企业版参数|
-|auditInterval | |审计数据上报的时间间隔;企业版参数|
-|auditCreateTable | |是否针对创建子表开启申计功能;企业版参数|
-|encryptAlgorithm | |数据加密算法;企业版参数|
-|encryptScope | |加密范围;企业版参数|
-|enableWhiteList | |白名单功能开关;企业版参数|
-|syncLogBufferMemoryAllowed| |一个 dnode 允许的 sync 日志缓存消息占用的内存最大值,单位 bytes,取值范围 104857600-INT64_MAX,默认值 服务器内存的 1/10,3.1.3.2/3.3.2.13 版本开始生效 |
-|syncElectInterval | |内部参数,用于同步模块调试|
-|syncHeartbeatInterval | |内部参数,用于同步模块调试|
-|syncHeartbeatTimeout | |内部参数,用于同步模块调试|
-|syncSnapReplMaxWaitN | |内部参数,用于同步模块调试|
-|syncSnapReplMaxWaitN | |内部参数,用于同步模块调试|
-|arbHeartBeatIntervalSec | |内部参数,用于同步模块调试|
-|arbCheckSyncIntervalSec | |内部参数,用于同步模块调试|
-|arbSetAssignedTimeoutSec | |内部参数,用于同步模块调试|
-|mndSdbWriteDelta | |内部参数,用于 mnode 模块调试|
-|mndLogRetention | |内部参数,用于 mnode 模块调试|
-|skipGrant | |内部参数,用于授权检查|
-|trimVDbIntervalSec | |内部参数,用于删除过期数据|
-|ttlFlushThreshold | |内部参数,ttl 定时器的频率|
-|compactPullupInterval | |内部参数,数据重整定时器的频率|
-|walFsyncDataSizeLimit | |内部参数,WAL 进行 FSYNC 的阈值|
-|transPullupInterval | |内部参数,mnode 执行事务的重试间隔|
-|mqRebalanceInterval | |内部参数,消费者再平衡的时间间隔|
-|uptimeInterval | |内部参数,用于记录系统启动时间|
-|timeseriesThreshold | |内部参数,用于统计用量|
-|udf | |是否启动 UDF 服务;0:不启动,1:启动;默认值为 0 |
-|udfdResFuncs | |内部参数,用于 UDF 结果集设置|
-|udfdLdLibPath | |内部参数,表示 UDF 装载的库路径|
+|--------------------------|----------|-|
+|supportVnodes | |dnode 支持的最大 vnode 数目,取值范围 0-4096,默认值 CPU 核数的 2 倍 + 5|
+|numOfCommitThreads | |落盘线程的最大数量,取值范围 0-1024,默认值为 4|
+|numOfMnodeReadThreads | |mnode 的 Read 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)|
+|numOfVnodeQueryThreads | |vnode 的 Query 线程数目,取值范围 0-1024,默认值为 CPU 核数的两倍(不超过 16)|
+|numOfVnodeFetchThreads | |vnode 的 Fetch 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)|
+|numOfVnodeRsmaThreads | |vnode 的 Rsma 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)|
+|numOfQnodeQueryThreads | |qnode 的 Query 线程数目,取值范围 0-1024,默认值为 CPU 核数的两倍(不超过 16)|
+|numOfSnodeSharedThreads | |snode 的共享线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不小于 2,不超过 4)|
+|numOfSnodeUniqueThreads | |snode 的独占线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不小于 2,不超过 4)|
+|ratioOfVnodeStreamThreads | |流计算使用 vnode 线程的比例,取值范围 0.01-4,默认值 4|
+|ttlUnit | |ttl 参数的单位,取值范围 1-31572500,单位为秒,默认值 86400|
+|ttlPushInterval | |ttl 检测超时频率,取值范围 1-100000,单位为秒,默认值 10|
+|ttlChangeOnWrite | |ttl 到期时间是否伴随表的修改操作改变;0:不改变,1:改变;默认值为 0|
+|ttlBatchDropNum | |ttl 一批删除子表的数目,最小值为 0,默认值 10000|
+|retentionSpeedLimitMB | |数据在不同级别硬盘上迁移时的速度限制,取值范围 0-1024,单位 MB,默认值 0,表示不限制|
+|maxTsmaNum | |集群内可创建的TSMA个数;取值范围 0-3;默认值 3|
+|tmqMaxTopicNum | |订阅最多可建立的 topic 数量;取值范围 1-10000;默认值为 20|
+|tmqRowSize | |订阅数据块的最大记录条数,取值范围 1-1000000,默认值 4096|
+|audit | |审计功能开关;企业版参数|
+|auditInterval | |审计数据上报的时间间隔;企业版参数|
+|auditCreateTable | |是否针对创建子表开启申计功能;企业版参数|
+|encryptAlgorithm | |数据加密算法;企业版参数|
+|encryptScope | |加密范围;企业版参数|
+|enableWhiteList | |白名单功能开关;企业版参数|
+|syncLogBufferMemoryAllowed| |一个 dnode 允许的 sync 日志缓存消息占用的内存最大值,单位 bytes,取值范围 104857600-INT64_MAX,默认值 服务器内存的 1/10,3.1.3.2/3.3.2.13 版本开始生效 |
+|syncElectInterval | |内部参数,用于同步模块调试|
+|syncHeartbeatInterval | |内部参数,用于同步模块调试|
+|syncHeartbeatTimeout | |内部参数,用于同步模块调试|
+|syncSnapReplMaxWaitN | |内部参数,用于同步模块调试|
+|syncSnapReplMaxWaitN | |内部参数,用于同步模块调试|
+|arbHeartBeatIntervalSec | |内部参数,用于同步模块调试|
+|arbCheckSyncIntervalSec | |内部参数,用于同步模块调试|
+|arbSetAssignedTimeoutSec | |内部参数,用于同步模块调试|
+|mndSdbWriteDelta | |内部参数,用于 mnode 模块调试|
+|mndLogRetention | |内部参数,用于 mnode 模块调试|
+|skipGrant | |内部参数,用于授权检查|
+|trimVDbIntervalSec | |内部参数,用于删除过期数据|
+|ttlFlushThreshold | |内部参数,ttl 定时器的频率|
+|compactPullupInterval | |内部参数,数据重整定时器的频率|
+|walFsyncDataSizeLimit | |内部参数,WAL 进行 FSYNC 的阈值|
+|transPullupInterval | |内部参数,mnode 执行事务的重试间隔|
+|mqRebalanceInterval | |内部参数,消费者再平衡的时间间隔|
+|uptimeInterval | |内部参数,用于记录系统启动时间|
+|timeseriesThreshold | |内部参数,用于统计用量|
+|udf | |是否启动 UDF 服务;0:不启动,1:启动;默认值为 0 |
+|udfdResFuncs | |内部参数,用于 UDF 结果集设置|
+|udfdLdLibPath | |内部参数,表示 UDF 装载的库路径|
### 流计算参数
|参数名称|支持版本|参数含义|
-|-----------------------|-----------|-|
-|disableStream | |流计算的启动开关|
-|streamBufferSize | |控制内存中窗口状态缓存的大小,默认值为 128MB|
-|streamAggCnt | |内部参数,并发进行聚合计算的数目|
-|checkpointInterval | |内部参数,checkponit 同步间隔|
-|concurrentCheckpoint | |内部参数,是否并发检查 checkpoint|
-|maxStreamBackendCache | |内部参数,流计算使用的最大缓存|
-|streamSinkDataRate | |内部参数,用于控制流计算结果的写入速度|
+|-----------------------|----------|-|
+|disableStream | |流计算的启动开关|
+|streamBufferSize | |控制内存中窗口状态缓存的大小,默认值为 128MB|
+|streamAggCnt | |内部参数,并发进行聚合计算的数目|
+|checkpointInterval | |内部参数,checkponit 同步间隔|
+|concurrentCheckpoint | |内部参数,是否并发检查 checkpoint|
+|maxStreamBackendCache | |内部参数,流计算使用的最大缓存|
+|streamSinkDataRate | |内部参数,用于控制流计算结果的写入速度|
### 日志相关
|参数名称|支持版本|参数含义|
-|----------------|-----------|-|
-|logDir | |日志文件目录,运行日志将写入该目录,默认值 /var/log/taos|
-|minimalLogDirGB | |日志文件夹所在磁盘可用空间大小小于该值时,停止写日志,单位 GB,默认值 1|
-|numOfLogLines | |单个日志文件允许的最大行数,默认值 10,000,000|
-|asyncLog | |日志写入模式,0:同步,1:异步,默认值 1|
-|logKeepDays | |日志文件的最长保存时间,单位:天,默认值 0,意味着无限保存,日志文件不会被重命名,也不会有新的日志文件滚动产生,但日志文件的内容有可能会不断滚动,取决于日志文件大小的设置;当设置为大于 0 的值时,当日志文件大小达到设置的上限时会被重命名为 taosdlog.yyy,其中 yyy 为日志文件最后修改的时间戳,并滚动产生新的日志文件|
-|slowLogThreshold|3.3.3.0 之后|慢查询门限值,大于等于门限值认为是慢查询,单位秒,默认值 3 |
-|slowLogMaxLen |3.3.3.0 之后|慢查询日志最大长度,取值范围 1-16384,默认值 4096|
-|slowLogScope |3.3.3.0 之后|慢查询记录类型,取值范围 ALL/QUERY/INSERT/OTHERS/NONE,默认值 QUERY|
-|slowLogExceptDb |3.3.3.0 之后|指定的数据库不上报慢查询,仅支持配置换一个数据库|
-|debugFlag | |运行日志开关,131(输出错误和警告日志),135(输出错误、警告和调试日志),143(输出错误、警告、调试和跟踪日志);默认值 131 或 135 (取决于不同模块)|
-|tmrDebugFlag | |定时器模块的日志开关,取值范围同上|
-|uDebugFlag | |共用功能模块的日志开关,取值范围同上|
-|rpcDebugFlag | |rpc 模块的日志开关,取值范围同上|
-|qDebugFlag | |query 模块的日志开关,取值范围同上|
-|dDebugFlag | |dnode 模块的日志开关,取值范围同上|
-|vDebugFlag | |vnode 模块的日志开关,取值范围同上|
-|mDebugFlag | |mnode 模块的日志开关,取值范围同上|
-|azDebugFlag |3.3.4.3 之后|S3 模块的日志开关,取值范围同上|
-|sDebugFlag | |sync 模块的日志开关,取值范围同上|
-|tsdbDebugFlag | |tsdb 模块的日志开关,取值范围同上|
-|tqDebugFlag | |tq 模块的日志开关,取值范围同上|
-|fsDebugFlag | |fs 模块的日志开关,取值范围同上|
-|udfDebugFlag | |udf 模块的日志开关,取值范围同上|
-|smaDebugFlag | |sma 模块的日志开关,取值范围同上|
-|idxDebugFlag | |index 模块的日志开关,取值范围同上|
-|tdbDebugFlag | |tdb 模块的日志开关,取值范围同上|
-|metaDebugFlag | |meta 模块的日志开关,取值范围同上|
-|stDebugFlag | |stream 模块的日志开关,取值范围同上|
-|sndDebugFlag | |snode 模块的日志开关,取值范围同上|
+|----------------|----------|-|
+|logDir | |日志文件目录,运行日志将写入该目录,默认值 /var/log/taos|
+|minimalLogDirGB | |日志文件夹所在磁盘可用空间大小小于该值时,停止写日志,单位 GB,默认值 1|
+|numOfLogLines | |单个日志文件允许的最大行数,默认值 10,000,000|
+|asyncLog | |日志写入模式,0:同步,1:异步,默认值 1|
+|logKeepDays | |日志文件的最长保存时间,单位:天,默认值 0,意味着无限保存,日志文件不会被重命名,也不会有新的日志文件滚动产生,但日志文件的内容有可能会不断滚动,取决于日志文件大小的设置;当设置为大于 0 的值时,当日志文件大小达到设置的上限时会被重命名为 taosdlog.yyy,其中 yyy 为日志文件最后修改的时间戳,并滚动产生新的日志文件|
+|slowLogThreshold|3.3.3.0 后|慢查询门限值,大于等于门限值认为是慢查询,单位秒,默认值 3 |
+|slowLogMaxLen |3.3.3.0 后|慢查询日志最大长度,取值范围 1-16384,默认值 4096|
+|slowLogScope |3.3.3.0 后|慢查询记录类型,取值范围 ALL/QUERY/INSERT/OTHERS/NONE,默认值 QUERY|
+|slowLogExceptDb |3.3.3.0 后|指定的数据库不上报慢查询,仅支持配置换一个数据库|
+|debugFlag | |运行日志开关,131(输出错误和警告日志),135(输出错误、警告和调试日志),143(输出错误、警告、调试和跟踪日志);默认值 131 或 135 (取决于不同模块)|
+|tmrDebugFlag | |定时器模块的日志开关,取值范围同上|
+|uDebugFlag | |共用功能模块的日志开关,取值范围同上|
+|rpcDebugFlag | |rpc 模块的日志开关,取值范围同上|
+|qDebugFlag | |query 模块的日志开关,取值范围同上|
+|dDebugFlag | |dnode 模块的日志开关,取值范围同上|
+|vDebugFlag | |vnode 模块的日志开关,取值范围同上|
+|mDebugFlag | |mnode 模块的日志开关,取值范围同上|
+|azDebugFlag |3.3.4.3 后|S3 模块的日志开关,取值范围同上|
+|sDebugFlag | |sync 模块的日志开关,取值范围同上|
+|tsdbDebugFlag | |tsdb 模块的日志开关,取值范围同上|
+|tqDebugFlag | |tq 模块的日志开关,取值范围同上|
+|fsDebugFlag | |fs 模块的日志开关,取值范围同上|
+|udfDebugFlag | |udf 模块的日志开关,取值范围同上|
+|smaDebugFlag | |sma 模块的日志开关,取值范围同上|
+|idxDebugFlag | |index 模块的日志开关,取值范围同上|
+|tdbDebugFlag | |tdb 模块的日志开关,取值范围同上|
+|metaDebugFlag | |meta 模块的日志开关,取值范围同上|
+|stDebugFlag | |stream 模块的日志开关,取值范围同上|
+|sndDebugFlag | |snode 模块的日志开关,取值范围同上|
### 调试相关
|参数名称|支持版本|参数含义|
-|--------------------|-----------|-|
-|enableCoreFile | |crash 时是否生成 core 文件,0:不生成,1:生成;默认值 1|
-|configDir | |配置文件所在目录|
-|scriptDir | |内部测试工具的脚本目录|
-|assert | |断言控制开关,默认值 0|
-|randErrorChance | |内部参数,用于随机失败测试|
-|randErrorDivisor | |内部参数,用于随机失败测试|
-|randErrorScope | |内部参数,用于随机失败测试|
-|safetyCheckLevel | |内部参数,用于随机失败测试|
-|experimental | |内部参数,用于一些实验特性|
-|simdEnable |3.3.4.3 之后|内部参数,用于测试 SIMD 加速|
-|AVX512Enable |3.3.4.3 之后|内部参数,用于测试 AVX512 加速|
-|rsyncPort | |内部参数,用于调试流计算|
-|snodeAddress | |内部参数,用于调试流计算|
-|checkpointBackupDir | |内部参数,用于恢复 snode 数据|
-|enableAuditDelete | |内部参数,用于测试审计功能|
-|slowLogThresholdTest| |内部参数,用于测试慢日志|
+|--------------------|----------|-|
+|enableCoreFile | |crash 时是否生成 core 文件,0:不生成,1:生成;默认值 1|
+|configDir | |配置文件所在目录|
+|scriptDir | |内部测试工具的脚本目录|
+|assert | |断言控制开关,默认值 0|
+|randErrorChance | |内部参数,用于随机失败测试|
+|randErrorDivisor | |内部参数,用于随机失败测试|
+|randErrorScope | |内部参数,用于随机失败测试|
+|safetyCheckLevel | |内部参数,用于随机失败测试|
+|experimental | |内部参数,用于一些实验特性|
+|simdEnable |3.3.4.3 后|内部参数,用于测试 SIMD 加速|
+|AVX512Enable |3.3.4.3 后|内部参数,用于测试 AVX512 加速|
+|rsyncPort | |内部参数,用于调试流计算|
+|snodeAddress | |内部参数,用于调试流计算|
+|checkpointBackupDir | |内部参数,用于恢复 snode 数据|
+|enableAuditDelete | |内部参数,用于测试审计功能|
+|slowLogThresholdTest| |内部参数,用于测试慢日志|
### 压缩参数
|参数名称|支持版本|参数含义|
-|------------|-----------|-|
-|fPrecision | |设置 float 类型浮点数压缩精度 ,取值范围 0.1 ~ 0.00000001 ,默认值 0.00000001 , 小于此值的浮点数尾数部分将被截断|
-|dPrecision | |设置 double 类型浮点数压缩精度 , 取值范围 0.1 ~ 0.0000000000000001 , 默认值 0.0000000000000001 , 小于此值的浮点数尾数部分将被截取|
-|lossyColumn |3.3.0.0 之前|对 float 和/或 double 类型启用 TSZ 有损压缩;取值范围 float/double/none;默认值 none,表示关闭无损压缩|
-|ifAdtFse | |在启用 TSZ 有损压缩时,使用 FSE 算法替换 HUFFMAN 算法,FSE 算法压缩速度更快,但解压稍慢,追求压缩速度可选用此算法;0:关闭,1:打开;默认值为 0|
-|maxRange | |内部参数,用于有损压缩设置|
-|curRange | |内部参数,用于有损压缩设置|
-|compressor | |内部参数,用于有损压缩设置|
+|------------|----------|-|
+|fPrecision | |设置 float 类型浮点数压缩精度 ,取值范围 0.1 ~ 0.00000001 ,默认值 0.00000001 , 小于此值的浮点数尾数部分将被截断|
+|dPrecision | |设置 double 类型浮点数压缩精度 , 取值范围 0.1 ~ 0.0000000000000001 , 默认值 0.0000000000000001 , 小于此值的浮点数尾数部分将被截取|
+|lossyColumn |3.3.0.0 前|对 float 和/或 double 类型启用 TSZ 有损压缩;取值范围 float/double/none;默认值 none,表示关闭无损压缩|
+|ifAdtFse | |在启用 TSZ 有损压缩时,使用 FSE 算法替换 HUFFMAN 算法,FSE 算法压缩速度更快,但解压稍慢,追求压缩速度可选用此算法;0:关闭,1:打开;默认值为 0|
+|maxRange | |内部参数,用于有损压缩设置|
+|curRange | |内部参数,用于有损压缩设置|
+|compressor | |内部参数,用于有损压缩设置|
**补充说明**
1. 在 3.2.0.0 ~ 3.3.0.0(不包含)版本生效,启用该参数后不能回退到升级前的版本
diff --git a/docs/zh/14-reference/01-components/02-taosc.md b/docs/zh/14-reference/01-components/02-taosc.md
index 3efaddee26..09653ae3ef 100755
--- a/docs/zh/14-reference/01-components/02-taosc.md
+++ b/docs/zh/14-reference/01-components/02-taosc.md
@@ -10,99 +10,98 @@ TDengine 客户端驱动提供了应用编程所需要的全部 API,并且在
### 连接相关
|参数名称|支持版本|参数含义|
-|----------------------|-----------|-|
-|firstEp | |启动时,主动连接的集群中首个 dnode 的 endpoint,缺省值:hostname:6030,若无法获取该服务器的 hostname,则赋值为 localhost|
-|secondEp | |启动时,如果 firstEp 连接不上,尝试连接集群中第二个 dnode 的 endpoint,没有缺省值|
-|compressMsgSize | |是否对 RPC 消息进行压缩;-1:所有消息都不压缩;0:所有消息都压缩;N (N>0):只有大于 N 个字节的消息才压缩;缺省值 -1|
-|shellActivityTimer | |客户端向 mnode 发送心跳的时长,单位为秒,取值范围 1-120,默认值 3|
-|numOfRpcSessions | |RPC 支持的最大连接数,取值范围 100-100000,缺省值 30000|
-|numOfRpcThreads | |RPC 线程数目,默认值为 CPU 核数的一半|
-|timeToGetAvailableConn| |获得可用连接的最长等待时间,取值范围 10-50000000,单位为毫秒,缺省值 500000|
-|useAdapter | |内部参数,是否使用 taosadapter,影响 CSV 文件导入|
-|shareConnLimit |3.3.4.3 之后|内部参数,一个链接可以共享的查询数目,取值范围 1-256,默认值 10|
-|readTimeout |3.3.4.3 之后|内部参数,最小超时时间,取值范围 64-604800,单位为秒,默认值 900|
+|----------------------|----------|-|
+|firstEp | |启动时,主动连接的集群中首个 dnode 的 endpoint,缺省值:hostname:6030,若无法获取该服务器的 hostname,则赋值为 localhost|
+|secondEp | |启动时,如果 firstEp 连接不上,尝试连接集群中第二个 dnode 的 endpoint,没有缺省值|
+|compressMsgSize | |是否对 RPC 消息进行压缩;-1:所有消息都不压缩;0:所有消息都压缩;N (N>0):只有大于 N 个字节的消息才压缩;缺省值 -1|
+|shellActivityTimer | |客户端向 mnode 发送心跳的时长,单位为秒,取值范围 1-120,默认值 3|
+|numOfRpcSessions | |RPC 支持的最大连接数,取值范围 100-100000,缺省值 30000|
+|numOfRpcThreads | |RPC 线程数目,默认值为 CPU 核数的一半|
+|timeToGetAvailableConn| |获得可用连接的最长等待时间,取值范围 10-50000000,单位为毫秒,缺省值 500000|
+|useAdapter | |内部参数,是否使用 taosadapter,影响 CSV 文件导入|
+|shareConnLimit |3.3.4.3 后|内部参数,一个链接可以共享的查询数目,取值范围 1-256,默认值 10|
+|readTimeout |3.3.4.3 后|内部参数,最小超时时间,取值范围 64-604800,单位为秒,默认值 900|
### 查询相关
|参数名称|支持版本|参数含义|
-|---------------------------------|-----------|-|
-|countAlwaysReturnValue | |count/hyperloglog 函数在输入数据为空或者 NULL 的情况下是否返回值;0:返回空行,1:返回;默认值 1;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了 TSMA 时,且相应的组或窗口内数据为空或者 NULL,对应的组或窗口将不返回查询结果;注意此参数客户端和服务端值应保持一致|
-|keepColumnName | |Last、First、LastRow 函数查询且未指定别名时,自动设置别名为列名(不含函数名),因此 order by 子句如果引用了该列名将自动引用该列对应的函数;1:表示自动设置别名为列名(不包含函数名),0:表示不自动设置别名;缺省值:0|
-|multiResultFunctionStarReturnTags|3.3.3.0 以后|查询超级表时,last(\*)/last_row(\*)/first(\*) 是否返回标签列;查询普通表、子表时,不受该参数影响;0:不返回标签列,1:返回标签列;缺省值:0;该参数设置为 0 时,last(\*)/last_row(\*)/first(\*) 只返回超级表的普通列;为 1 时,返回超级表的普通列和标签列|
-|
- | |指定单个客户端元数据缓存大小的最大值,单位 MB;缺省值 -1,表示无限制|
-|maxTsmaCalcDelay | |查询时客户端可允许的 tsma 计算延迟,若 tsma 的计算延迟大于配置值,则该 TSMA 将不会被使用;取值范围 600s - 86400s,即 10 分钟 - 1 小时;缺省值:600 秒|
-|tsmaDataDeleteMark | |TSMA 计算的历史数据中间结果保存时间,单位为毫秒;取值范围 >= 3600000,即大于等于1h;缺省值:86400000,即 1d |
-|queryPolicy | |查询语句的执行策略,1:只使用 vnode,不使用 qnode;2:没有扫描算子的子任务在 qnode 执行,带扫描算子的子任务在 vnode 执行;3:vnode 只运行扫描算子,其余算子均在 qnode 执行;缺省值:1|
-|queryTableNotExistAsEmpty | |查询表不存在时是否返回空结果集;false:返回错误;true:返回空结果集;缺省值 false|
-|querySmaOptimize | |sma index 的优化策略,0:表示不使用 sma index,永远从原始数据进行查询;1:表示使用 sma index,对符合的语句,直接从预计算的结果进行查询;缺省值:0|
-|queryPlannerTrace | |内部参数,查询计划是否输出详细日志|
-|queryNodeChunkSize | |内部参数,查询计划的块大小|
-|queryUseNodeAllocator | |内部参数,查询计划的分配方法|
-|queryMaxConcurrentTables | |内部参数,查询计划的并发数目|
-|enableQueryHb | |内部参数,是否发送查询心跳消息|
-|minSlidingTime | |内部参数,sliding 的最小允许值|
-|minIntervalTime | |内部参数,interval 的最小允许值|
+|---------------------------------|---------|-|
+|countAlwaysReturnValue | |count/hyperloglog 函数在输入数据为空或者 NULL 的情况下是否返回值;0:返回空行,1:返回;默认值 1;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了 TSMA 时,且相应的组或窗口内数据为空或者 NULL,对应的组或窗口将不返回查询结果;注意此参数客户端和服务端值应保持一致|
+|keepColumnName | |Last、First、LastRow 函数查询且未指定别名时,自动设置别名为列名(不含函数名),因此 order by 子句如果引用了该列名将自动引用该列对应的函数;1:表示自动设置别名为列名(不包含函数名),0:表示不自动设置别名;缺省值:0|
+|multiResultFunctionStarReturnTags|3.3.3.0 后|查询超级表时,last(\*)/last_row(\*)/first(\*) 是否返回标签列;查询普通表、子表时,不受该参数影响;0:不返回标签列,1:返回标签列;缺省值:0;该参数设置为 0 时,last(\*)/last_row(\*)/first(\*) 只返回超级表的普通列;为 1 时,返回超级表的普通列和标签列|
+|metaCacheMaxSize | |指定单个客户端元数据缓存大小的最大值,单位 MB;缺省值 -1,表示无限制|
+|maxTsmaCalcDelay | |查询时客户端可允许的 tsma 计算延迟,若 tsma 的计算延迟大于配置值,则该 TSMA 将不会被使用;取值范围 600s - 86400s,即 10 分钟 - 1 小时;缺省值:600 秒|
+|tsmaDataDeleteMark | |TSMA 计算的历史数据中间结果保存时间,单位为毫秒;取值范围 >= 3600000,即大于等于1h;缺省值:86400000,即 1d |
+|queryPolicy | |查询语句的执行策略,1:只使用 vnode,不使用 qnode;2:没有扫描算子的子任务在 qnode 执行,带扫描算子的子任务在 vnode 执行;3:vnode 只运行扫描算子,其余算子均在 qnode 执行;缺省值:1|
+|queryTableNotExistAsEmpty | |查询表不存在时是否返回空结果集;false:返回错误;true:返回空结果集;缺省值 false|
+|querySmaOptimize | |sma index 的优化策略,0:表示不使用 sma index,永远从原始数据进行查询;1:表示使用 sma index,对符合的语句,直接从预计算的结果进行查询;缺省值:0|
+|queryPlannerTrace | |内部参数,查询计划是否输出详细日志|
+|queryNodeChunkSize | |内部参数,查询计划的块大小|
+|queryUseNodeAllocator | |内部参数,查询计划的分配方法|
+|queryMaxConcurrentTables | |内部参数,查询计划的并发数目|
+|enableQueryHb | |内部参数,是否发送查询心跳消息|
+|minSlidingTime | |内部参数,sliding 的最小允许值|
+|minIntervalTime | |内部参数,interval 的最小允许值|
### 写入相关
|参数名称|支持版本|参数含义|
-|------------------------------|-----------|-|
-|smlChildTableName | |schemaless 自定义的子表名的 key,无缺省值|
-|smlAutoChildTableNameDelimiter| |schemaless tag 之间的连接符,连起来作为子表名,无缺省值|
-|smlTagName | |schemaless tag 为空时默认的 tag 名字,缺省值 "_tag_null"|
-|smlTsDefaultName | |schemaless 自动建表的时间列名字通过该配置设置,缺省值 "_ts"|
-|smlDot2Underline | |schemaless 把超级表名中的 dot 转成下划线|
-|maxInsertBatchRows | |内部参数,一批写入的最大条数|
+|------------------------------|----------|-|
+|smlChildTableName | |schemaless 自定义的子表名的 key,无缺省值|
+|smlAutoChildTableNameDelimiter| |schemaless tag 之间的连接符,连起来作为子表名,无缺省值|
+|smlTagName | |schemaless tag 为空时默认的 tag 名字,缺省值 "_tag_null"|
+|smlTsDefaultName | |schemaless 自动建表的时间列名字通过该配置设置,缺省值 "_ts"|
+|smlDot2Underline | |schemaless 把超级表名中的 dot 转成下划线|
+|maxInsertBatchRows | |内部参数,一批写入的最大条数|
### 区域相关
|参数名称|支持版本|参数含义|
-|-----------------|-----------|-|
-|timezone | |时区;缺省从系统中动态获取当前的时区设置|
-|locale | |系统区位信息及编码格式,缺省从系统中获取|
-|charset | |字符集编码,缺省从系统中获取|
+|-----------------|----------|-|
+|timezone | |时区;缺省从系统中动态获取当前的时区设置|
+|locale | |系统区位信息及编码格式,缺省从系统中获取|
+|charset | |字符集编码,缺省从系统中获取|
### 存储相关
|参数名称|支持版本|参数含义|
-|-----------------|-----------|-|
-|tempDir | |指定所有运行过程中的临时文件生成的目录,Linux 平台默认值为 /tmp|
-|minimalTmpDirGB | |tempDir 所指定的临时文件目录所需要保留的最小空间,单位 GB,缺省值:1|
+|-----------------|----------|-|
+|tempDir | |指定所有运行过程中的临时文件生成的目录,Linux 平台默认值为 /tmp|
+|minimalTmpDirGB | |tempDir 所指定的临时文件目录所需要保留的最小空间,单位 GB,缺省值:1|
### 日志相关
|参数名称|支持版本|参数含义|
-|-----------------|-----------|-|
-|logDir | |日志文件目录,运行日志将写入该目录,缺省值:/var/log/taos|
-|minimalLogDirGB | |日志文件夹所在磁盘可用空间大小小于该值时,停止写日志,单位 GB,缺省值:1|
-|numOfLogLines | |单个日志文件允许的最大行数,缺省值:10,000,000|
-|asyncLog | |日志写入模式,0:同步,1:异步,缺省值:1|
-|logKeepDays | |日志文件的最长保存时间,单位:天,缺省值:0,意味着无限保存,日志文件不会被重命名,也不会有新的日志文件滚动产生,但日志文件的内容有可能会不断滚动,取决于日志文件大小的设置;当设置为大于 0 的值时,当日志文件大小达到设置的上限时会被重命名为 taoslogx.yyy,其中 yyy 为日志文件最后修改的时间戳,并滚动产生新的日志文件|
-|debugFlag | |运行日志开关,131(输出错误和警告日志),135(输出错误、警告和调试日志),143(输出错误、警告、调试和跟踪日志);默认值 131 或 135 (取决于不同模块)|
-|tmrDebugFlag | |定时器模块的日志开关,取值范围同上|
-|uDebugFlag | |共用功能模块的日志开关,取值范围同上|
-|rpcDebugFlag | |rpc 模块的日志开关,取值范围同上|
-|jniDebugFlag | |jni 模块的日志开关,取值范围同上|
-|qDebugFlag | |query 模块的日志开关,取值范围同上|
-|cDebugFlag | |客户端模块的日志开关,取值范围同上|
-|simDebugFlag | |内部参数,测试工具的日志开关,取值范围同上|
-|tqClientDebugFlag|3.3.4.3 之后|客户端模块的日志开关,取值范围同上|
+|-----------------|----------|-|
+|logDir | |日志文件目录,运行日志将写入该目录,缺省值:/var/log/taos|
+|minimalLogDirGB | |日志文件夹所在磁盘可用空间大小小于该值时,停止写日志,单位 GB,缺省值:1|
+|numOfLogLines | |单个日志文件允许的最大行数,缺省值:10,000,000|
+|asyncLog | |日志写入模式,0:同步,1:异步,缺省值:1|
+|logKeepDays | |日志文件的最长保存时间,单位:天,缺省值:0,意味着无限保存,日志文件不会被重命名,也不会有新的日志文件滚动产生,但日志文件的内容有可能会不断滚动,取决于日志文件大小的设置;当设置为大于 0 的值时,当日志文件大小达到设置的上限时会被重命名为 taoslogx.yyy,其中 yyy 为日志文件最后修改的时间戳,并滚动产生新的日志文件|
+|debugFlag | |运行日志开关,131(输出错误和警告日志),135(输出错误、警告和调试日志),143(输出错误、警告、调试和跟踪日志);默认值 131 或 135 (取决于不同模块)|
+|tmrDebugFlag | |定时器模块的日志开关,取值范围同上|
+|uDebugFlag | |共用功能模块的日志开关,取值范围同上|
+|rpcDebugFlag | |rpc 模块的日志开关,取值范围同上|
+|jniDebugFlag | |jni 模块的日志开关,取值范围同上|
+|qDebugFlag | |query 模块的日志开关,取值范围同上|
+|cDebugFlag | |客户端模块的日志开关,取值范围同上|
+|simDebugFlag | |内部参数,测试工具的日志开关,取值范围同上|
+|tqClientDebugFlag|3.3.4.3 后|客户端模块的日志开关,取值范围同上|
### 调试相关
|参数名称|支持版本|参数含义|
|-----------------|-----------|-|
-|crashReporting | |是否上传 crash 到 telemetry,0:不上传,1:上传;缺省值:1|
-|enableCoreFile | |crash 时是否生成 core 文件,0:不生成,1:生成;缺省值:1|
-|assert | |断言控制开关,缺省值:0|
-|configDir | |配置文件所在目录|
-|scriptDir | |内部参数,测试用例的目录|
-|randErrorChance |3.3.3.0 之后|内部参数,用于随机失败测试|
-|randErrorDivisor |3.3.3.0 之后|内部参数,用于随机失败测试|
-|randErrorScope |3.3.3.0 之后|内部参数,用于随机失败测试|
-|safetyCheckLevel |3.3.3.0 之后|内部参数,用于随机失败测试|
-|simdEnable |3.3.4.3 之后|内部参数,用于测试 SIMD 加速|
-|AVX512Enable |3.3.4.3 之后|内部参数,用于测试 AVX512 加速|
+|crashReporting | |是否上传 crash 到 telemetry,0:不上传,1:上传;缺省值:1|
+|enableCoreFile | |crash 时是否生成 core 文件,0:不生成,1:生成;缺省值:1|
+|assert | |断言控制开关,缺省值:0|
+|configDir | |配置文件所在目录|
+|scriptDir | |内部参数,测试用例的目录|
+|randErrorChance |3.3.3.0 后|内部参数,用于随机失败测试|
+|randErrorDivisor |3.3.3.0 后|内部参数,用于随机失败测试|
+|randErrorScope |3.3.3.0 后|内部参数,用于随机失败测试|
+|safetyCheckLevel |3.3.3.0 后|内部参数,用于随机失败测试|
+|simdEnable |3.3.4.3 后|内部参数,用于测试 SIMD 加速|
+|AVX512Enable |3.3.4.3 后|内部参数,用于测试 AVX512 加速|
### SHELL 相关
|参数名称|支持版本|参数含义|
-|-----------------|-----------|-|
-|enableScience | |是否开启科学计数法显示浮点数;0:不开始,1:开启;缺省值:1|
+|-----------------|----------|-|
+|enableScience | |是否开启科学计数法显示浮点数;0:不开始,1:开启;缺省值:1|
## API
diff --git a/docs/zh/14-reference/03-taos-sql/02-database.md b/docs/zh/14-reference/03-taos-sql/02-database.md
index 4f799bdde9..8ba04f686c 100644
--- a/docs/zh/14-reference/03-taos-sql/02-database.md
+++ b/docs/zh/14-reference/03-taos-sql/02-database.md
@@ -8,10 +8,10 @@ description: "创建、删除数据库,查看、修改数据库参数"
```sql
CREATE DATABASE [IF NOT EXISTS] db_name [database_options]
-
+
database_options:
database_option ...
-
+
database_option: {
VGROUPS value
| PRECISION {'ms' | 'us' | 'ns'}
@@ -26,6 +26,7 @@ database_option: {
| MAXROWS value
| MINROWS value
| KEEP value
+ | KEEP_TIME_OFFSET value
| STT_TRIGGER value
| SINGLE_STABLE {0 | 1}
| TABLE_PREFIX value
@@ -43,7 +44,7 @@ database_option: {
- VGROUPS:数据库中初始 vgroup 的数目。
- PRECISION:数据库的时间戳精度。ms 表示毫秒,us 表示微秒,ns 表示纳秒,默认 ms 毫秒。
-- REPLICA:表示数据库副本数,取值为 1、2 或 3,默认为 1; 2 仅在企业版 3.3.0.0 及以后版本中可用。在集群中使用,副本数必须小于或等于 DNODE 的数目。且使用时存在以下限制:
+- REPLICA:表示数据库副本数,取值为 1、2 或 3,默认为 1; 2 仅在企业版 3.3.0.0 及以后版本中可用。在集群中使用,副本数必须小于或等于 DNODE 的数目。且使用时存在以下限制:
- 暂不支持对双副本数据库相关 Vgroup 进行 SPLITE VGROUP 或 REDISTRIBUTE VGROUP 操作
- 单副本数据库可变更为双副本数据库,但不支持从双副本变更为其它副本数,也不支持从三副本变更为双副本
- BUFFER: 一个 VNODE 写入内存池大小,单位为 MB,默认为 256,最小为 3,最大为 16384。
@@ -63,7 +64,8 @@ database_option: {
- DURATION:数据文件存储数据的时间跨度。可以使用加单位的表示形式,如 DURATION 100h、DURATION 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。不加时间单位时默认单位为天,如 DURATION 50 表示 50 天。
- MAXROWS:文件块中记录的最大条数,默认为 4096 条。
- MINROWS:文件块中记录的最小条数,默认为 100 条。
-- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于3倍的 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。企业版支持[多级存储](https://docs.taosdata.com/tdinternal/arch/#%E5%A4%9A%E7%BA%A7%E5%AD%98%E5%82%A8)功能, 因此, 可以设置多个保存时间(多个以英文逗号分隔,最多 3 个,满足 keep 0 \<= keep 1 \<= keep 2,如 KEEP 100h,100d,3650d); 社区版不支持多级存储功能(即使配置了多个保存时间, 也不会生效, KEEP 会取最大的保存时间)。
+- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于3倍的 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据从而释放存储空间。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。企业版支持[多级存储](https://docs.taosdata.com/tdinternal/arch/#%E5%A4%9A%E7%BA%A7%E5%AD%98%E5%82%A8)功能, 因此, 可以设置多个保存时间(多个以英文逗号分隔,最多 3 个,满足 keep 0 \<= keep 1 \<= keep 2,如 KEEP 100h,100d,3650d); 社区版不支持多级存储功能(即使配置了多个保存时间, 也不会生效, KEEP 会取最大的保存时间)。
+- KEEP_TIME_OFFSET:自 3.2.0.0 版本生效。删除或迁移保存时间超过 KEEP 值的数据的延迟执行时间,默认值为 0 (小时)。在数据文件保存时间超过 KEEP 后,删除或迁移操作不会立即执行,而会额外等待本参数指定的时间间隔,以实现与业务高峰期错开的目的。
- STT_TRIGGER:表示落盘文件触发文件合并的个数。开源版本固定为 1,企业版本可设置范围为 1 到 16。对于少表高频写入场景,此参数建议使用默认配置;而对于多表低频写入场景,此参数建议配置较大的值。
- SINGLE_STABLE:表示此数据库中是否只可以创建一个超级表,用于超级表列非常多的情况。
- 0:表示可以创建多张超级表。
diff --git a/docs/zh/14-reference/03-taos-sql/03-table.md b/docs/zh/14-reference/03-taos-sql/03-table.md
index 81ad60e3d2..40e2802fcd 100644
--- a/docs/zh/14-reference/03-taos-sql/03-table.md
+++ b/docs/zh/14-reference/03-taos-sql/03-table.md
@@ -227,7 +227,7 @@ DROP TABLE [IF EXISTS] [db_name.]tb_name [, [IF EXISTS] [db_name.]tb_name] ...
如下 SQL 语句可以列出当前数据库中的所有表名。
```sql
-SHOW TABLES [LIKE tb_name_wildchar];
+SHOW TABLES [LIKE tb_name_wildcard];
```
### 显示表创建语句
diff --git a/docs/zh/14-reference/03-taos-sql/28-index.md b/docs/zh/14-reference/03-taos-sql/28-tsma.md
similarity index 100%
rename from docs/zh/14-reference/03-taos-sql/28-index.md
rename to docs/zh/14-reference/03-taos-sql/28-tsma.md
diff --git a/docs/zh/14-reference/05-connector/30-python.mdx b/docs/zh/14-reference/05-connector/30-python.mdx
index 8436c30249..3991477635 100644
--- a/docs/zh/14-reference/05-connector/30-python.mdx
+++ b/docs/zh/14-reference/05-connector/30-python.mdx
@@ -41,6 +41,7 @@ Python 连接器的源码托管在 [GitHub](https://github.com/taosdata/taos-con
|Python Connector 版本|主要变化|
|:-------------------:|:----:|
+|2.7.16|新增订阅配置 (session.timeout.ms, max.poll.interval.ms)|
|2.7.15|新增 VARBINARY 和 GEOMETRY 类型支持|
|2.7.14|修复已知问题|
|2.7.13|新增 tmq 同步提交 offset 接口|
@@ -50,6 +51,7 @@ Python 连接器的源码托管在 [GitHub](https://github.com/taosdata/taos-con
|Python WebSocket Connector 版本|主要变化|
|:----------------------------:|:-----:|
+|0.3.5|新增 VARBINARY 和 GEOMETRY 类型支持,修复已知问题|
|0.3.2|优化 WebSocket sql 查询和插入性能,修改 readme 和 文档,修复已知问题|
|0.2.9|已知问题修复|
|0.2.5|1. 数据订阅支持获取消费进度和重置消费进度
2. 支持 schemaless
3. 支持 STMT|
diff --git a/docs/zh/14-reference/05-connector/35-node.mdx b/docs/zh/14-reference/05-connector/35-node.mdx
index d9512eae78..df2abfab3d 100644
--- a/docs/zh/14-reference/05-connector/35-node.mdx
+++ b/docs/zh/14-reference/05-connector/35-node.mdx
@@ -26,6 +26,7 @@ Node.js 连接器目前仅支持 WebSocket 连接器, 其通过 taosAdapter
| Node.js 连接器 版本 | 主要变化 | TDengine 版本 |
| :------------------: | :----------------------: | :----------------: |
+| 3.1.2 | 对数据协议和解析进行了优化,性能得到大幅提升| 3.3.2.0 及更高版本 |
| 3.1.1 | 优化了数据传输性能 | 3.3.2.0 及更高版本 |
| 3.1.0 | 新版本发布,支持 WebSocket 连接 | 3.2.0.0 及更高版本 |
diff --git a/docs/zh/28-releases/03-notes/3.3.4.3.md b/docs/zh/28-releases/03-notes/3.3.4.3.md
index 9ded536872..8ffd5802ed 100644
--- a/docs/zh/28-releases/03-notes/3.3.4.3.md
+++ b/docs/zh/28-releases/03-notes/3.3.4.3.md
@@ -3,6 +3,12 @@ title: 3.3.4.3 版本说明
sidebar_label: 3.3.4.3
description: 3.3.4.3 版本说明
---
+
+### 行为变更及兼容性
+1. 多副本流计算中必须使用 snode
+1. 增加了流计算的兼容性保证机制,避免后续函数变更产生新的兼容性问题,但之前版本的流计算必须重建,具体参见 https://docs.taosdata.com/advanced/stream/#流计算升级故障恢复
+1. 调整 case when 语句结果类型的判断方法
+
### 新特性
1. 新功能:流计算的 TWA 函数支持时间驱动的结果推送模式
1. 新功能:流计算的 Interp 函数支持时间驱动的结果推送模式
diff --git a/docs/zh/28-releases/03-notes/index.md b/docs/zh/28-releases/03-notes/index.md
index 3268c088b2..d1a48ab9a8 100644
--- a/docs/zh/28-releases/03-notes/index.md
+++ b/docs/zh/28-releases/03-notes/index.md
@@ -3,6 +3,7 @@ title: 版本说明
sidebar_label: 版本说明
description: 各版本版本说明
---
-[3.3.4.3](./3.3.4.3)
+
+[3.3.4.3](./3.3.4.3)
[3.3.3.0](./3.3.3.0)
[3.3.2.0](./3.3.2.0)
diff --git a/include/common/tcommon.h b/include/common/tcommon.h
index 1d9a9bcc61..4189d1ebdb 100644
--- a/include/common/tcommon.h
+++ b/include/common/tcommon.h
@@ -251,6 +251,7 @@ typedef struct SQueryTableDataCond {
int32_t type; // data block load type:
bool skipRollup;
STimeWindow twindows;
+ STimeWindow extTwindows[2];
int64_t startVersion;
int64_t endVersion;
bool notLoadData; // response the actual data, not only the rows in the attribute of info.row of ssdatablock
diff --git a/include/common/tmsg.h b/include/common/tmsg.h
index bdf333b635..acf1d5e182 100644
--- a/include/common/tmsg.h
+++ b/include/common/tmsg.h
@@ -2187,8 +2187,9 @@ int32_t tSerializeSShowVariablesReq(void* buf, int32_t bufLen, SShowVariablesReq
typedef struct {
char name[TSDB_CONFIG_OPTION_LEN + 1];
- char value[TSDB_CONFIG_VALUE_LEN + 1];
+ char value[TSDB_CONFIG_PATH_LEN + 1];
char scope[TSDB_CONFIG_SCOPE_LEN + 1];
+ char info[TSDB_CONFIG_INFO_LEN + 1];
} SVariablesInfo;
typedef struct {
diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h
index df3f87973f..7c6f02513e 100644
--- a/include/libs/catalog/catalog.h
+++ b/include/libs/catalog/catalog.h
@@ -102,6 +102,7 @@ typedef struct SCatalogReq {
bool svrVerRequired;
bool forceUpdate;
bool cloned;
+ bool forceFetchViewMeta;
} SCatalogReq;
typedef struct SMetaRes {
diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h
index 514eddbc24..0b617c7ce3 100644
--- a/include/libs/nodes/cmdnodes.h
+++ b/include/libs/nodes/cmdnodes.h
@@ -42,10 +42,11 @@ extern "C" {
#define SHOW_CREATE_VIEW_RESULT_FIELD1_LEN (TSDB_VIEW_FNAME_LEN + 4 + VARSTR_HEADER_SIZE)
#define SHOW_CREATE_VIEW_RESULT_FIELD2_LEN (TSDB_MAX_ALLOWED_SQL_LEN + VARSTR_HEADER_SIZE)
-#define SHOW_LOCAL_VARIABLES_RESULT_COLS 3
+#define SHOW_LOCAL_VARIABLES_RESULT_COLS 4
#define SHOW_LOCAL_VARIABLES_RESULT_FIELD1_LEN (TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE)
-#define SHOW_LOCAL_VARIABLES_RESULT_FIELD2_LEN (TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE)
+#define SHOW_LOCAL_VARIABLES_RESULT_FIELD2_LEN (TSDB_CONFIG_PATH_LEN + VARSTR_HEADER_SIZE)
#define SHOW_LOCAL_VARIABLES_RESULT_FIELD3_LEN (TSDB_CONFIG_SCOPE_LEN + VARSTR_HEADER_SIZE)
+#define SHOW_LOCAL_VARIABLES_RESULT_FIELD4_LEN (TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE)
#define COMPACT_DB_RESULT_COLS 3
#define COMPACT_DB_RESULT_FIELD1_LEN 32
diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h
index 72dd3ef3e0..6384c536ce 100644
--- a/include/libs/nodes/nodes.h
+++ b/include/libs/nodes/nodes.h
@@ -174,6 +174,7 @@ char* nodesGetNameFromColumnNode(SNode* pNode);
int32_t nodesGetOutputNumFromSlotList(SNodeList* pSlots);
void nodesSortList(SNodeList** pList, int32_t (*)(SNode* pNode1, SNode* pNode2));
void destroyFuncParam(void* pFuncStruct);
+int32_t nodesListDeduplicate(SNodeList** pList);
#ifdef __cplusplus
}
diff --git a/include/util/taoserror.h b/include/util/taoserror.h
index 2c811495fd..e33af33d0e 100644
--- a/include/util/taoserror.h
+++ b/include/util/taoserror.h
@@ -1011,6 +1011,7 @@ int32_t taosGetErrSize();
#define TSDB_CODE_STREAM_CONFLICT_EVENT TAOS_DEF_ERROR_CODE(0, 0x4106)
#define TSDB_CODE_STREAM_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x4107)
#define TSDB_CODE_STREAM_INPUTQ_FULL TAOS_DEF_ERROR_CODE(0, 0x4108)
+#define TSDB_CODE_STREAM_INVLD_CHKPT TAOS_DEF_ERROR_CODE(0, 0x4109)
// TDLite
#define TSDB_CODE_TDLITE_IVLD_OPEN_FLAGS TAOS_DEF_ERROR_CODE(0, 0x5100)
diff --git a/include/util/tbuffer.inc b/include/util/tbuffer.inc
index 39090fb7fa..633517ca58 100644
--- a/include/util/tbuffer.inc
+++ b/include/util/tbuffer.inc
@@ -186,11 +186,25 @@ static int32_t tBufferGetI16(SBufferReader *reader, int16_t *value) {
}
static int32_t tBufferGetI32(SBufferReader *reader, int32_t *value) {
- return tBufferGet(reader, sizeof(*value), value);
+ if (reader->offset + sizeof(int32_t) > reader->buffer->size) {
+ return TSDB_CODE_OUT_OF_RANGE;
+ }
+ if (value) {
+ *value = *(int32_t*)BR_PTR(reader);
+ }
+ reader->offset += sizeof(int32_t);
+ return 0;
}
static int32_t tBufferGetI64(SBufferReader *reader, int64_t *value) {
- return tBufferGet(reader, sizeof(*value), value);
+ if (reader->offset + sizeof(int64_t) > reader->buffer->size) {
+ return TSDB_CODE_OUT_OF_RANGE;
+ }
+ if (value) {
+ *value = *(int64_t*)BR_PTR(reader);
+ }
+ reader->offset += sizeof(int64_t);
+ return 0;
}
static int32_t tBufferGetU8(SBufferReader *reader, uint8_t *value) { return tBufferGet(reader, sizeof(*value), value); }
diff --git a/include/util/tdef.h b/include/util/tdef.h
index ba30e78c59..4e1fb21838 100644
--- a/include/util/tdef.h
+++ b/include/util/tdef.h
@@ -195,9 +195,9 @@ static const EOperatorType OPERATOR_ARRAY[] = {
OP_TYPE_MULTI,
OP_TYPE_DIV,
OP_TYPE_REM,
-
+
OP_TYPE_MINUS,
-
+
OP_TYPE_BIT_AND,
OP_TYPE_BIT_OR,
@@ -213,7 +213,7 @@ static const EOperatorType OPERATOR_ARRAY[] = {
OP_TYPE_NOT_LIKE,
OP_TYPE_MATCH,
OP_TYPE_NMATCH,
-
+
OP_TYPE_IS_NULL,
OP_TYPE_IS_NOT_NULL,
OP_TYPE_IS_TRUE,
@@ -222,7 +222,7 @@ static const EOperatorType OPERATOR_ARRAY[] = {
OP_TYPE_IS_NOT_TRUE,
OP_TYPE_IS_NOT_FALSE,
OP_TYPE_IS_NOT_UNKNOWN,
- //OP_TYPE_COMPARE_MAX_VALUE,
+ //OP_TYPE_COMPARE_MAX_VALUE,
OP_TYPE_JSON_GET_VALUE,
OP_TYPE_JSON_CONTAINS,
@@ -631,6 +631,8 @@ enum { RAND_ERR_MEMORY = 1, RAND_ERR_FILE = 2, RAND_ERR_NETWORK = 4 };
#define TSDB_CONFIG_VALUE_LEN 64
#define TSDB_CONFIG_SCOPE_LEN 8
#define TSDB_CONFIG_NUMBER 16
+#define TSDB_CONFIG_PATH_LEN 4096
+#define TSDB_CONFIG_INFO_LEN 64
#define QUERY_ID_SIZE 20
#define QUERY_OBJ_ID_SIZE 18
diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h
index 90505ed25a..da56dcf75e 100644
--- a/source/client/inc/clientInt.h
+++ b/source/client/inc/clientInt.h
@@ -47,10 +47,11 @@ enum {
RES_TYPE__TMQ_BATCH_META,
};
-#define SHOW_VARIABLES_RESULT_COLS 3
+#define SHOW_VARIABLES_RESULT_COLS 4
#define SHOW_VARIABLES_RESULT_FIELD1_LEN (TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE)
#define SHOW_VARIABLES_RESULT_FIELD2_LEN (TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE)
#define SHOW_VARIABLES_RESULT_FIELD3_LEN (TSDB_CONFIG_SCOPE_LEN + VARSTR_HEADER_SIZE)
+#define SHOW_VARIABLES_RESULT_FIELD4_LEN (TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE)
#define TD_RES_QUERY(res) (*(int8_t*)(res) == RES_TYPE__QUERY)
#define TD_RES_TMQ(res) (*(int8_t*)(res) == RES_TYPE__TMQ)
diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c
index 8a0b1ddaab..94d06166f2 100644
--- a/source/client/src/clientImpl.c
+++ b/source/client/src/clientImpl.c
@@ -3032,13 +3032,13 @@ static void fetchCallback(void* pResult, void* param, int32_t code) {
if (code != TSDB_CODE_SUCCESS) {
pRequest->code = code;
taosMemoryFreeClear(pResultInfo->pData);
- pRequest->body.fetchFp(((SSyncQueryParam*)pRequest->body.interParam)->userParam, pRequest, 0);
+ pRequest->body.fetchFp(((SSyncQueryParam*)pRequest->body.interParam)->userParam, pRequest, code);
return;
}
if (pRequest->code != TSDB_CODE_SUCCESS) {
taosMemoryFreeClear(pResultInfo->pData);
- pRequest->body.fetchFp(((SSyncQueryParam*)pRequest->body.interParam)->userParam, pRequest, 0);
+ pRequest->body.fetchFp(((SSyncQueryParam*)pRequest->body.interParam)->userParam, pRequest, pRequest->code);
return;
}
diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c
index 9a723218ff..e182cd97ee 100644
--- a/source/client/src/clientMsgHandler.c
+++ b/source/client/src/clientMsgHandler.c
@@ -541,6 +541,10 @@ static int32_t buildShowVariablesBlock(SArray* pVars, SSDataBlock** block) {
infoData.info.bytes = SHOW_VARIABLES_RESULT_FIELD3_LEN;
TSDB_CHECK_NULL(taosArrayPush(pBlock->pDataBlock, &infoData), code, line, END, terrno);
+ infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
+ infoData.info.bytes = SHOW_VARIABLES_RESULT_FIELD4_LEN;
+ TSDB_CHECK_NULL(taosArrayPush(pBlock->pDataBlock, &infoData), code, line, END, terrno);
+
int32_t numOfCfg = taosArrayGetSize(pVars);
code = blockDataEnsureCapacity(pBlock, numOfCfg);
TSDB_CHECK_CODE(code, line, END);
@@ -569,6 +573,13 @@ static int32_t buildShowVariablesBlock(SArray* pVars, SSDataBlock** block) {
TSDB_CHECK_NULL(pColInfo, code, line, END, terrno);
code = colDataSetVal(pColInfo, i, scope, false);
TSDB_CHECK_CODE(code, line, END);
+
+ char info[TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(info, pInfo->info, TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE);
+ pColInfo = taosArrayGet(pBlock->pDataBlock, c++);
+ TSDB_CHECK_NULL(pColInfo, code, line, END, terrno);
+ code = colDataSetVal(pColInfo, i, info, false);
+ TSDB_CHECK_CODE(code, line, END);
}
pBlock->info.rows = numOfCfg;
@@ -825,7 +836,7 @@ int32_t processCompactDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
tscError("failed to post semaphore");
}
}
- return code;
+ return code;
}
__async_send_cb_fn_t getMsgRspHandle(int32_t msgType) {
@@ -845,7 +856,7 @@ __async_send_cb_fn_t getMsgRspHandle(int32_t msgType) {
case TDMT_MND_SHOW_VARIABLES:
return processShowVariablesRsp;
case TDMT_MND_COMPACT_DB:
- return processCompactDbRsp;
+ return processCompactDbRsp;
default:
return genericRspCallback;
}
diff --git a/source/common/src/systable.c b/source/common/src/systable.c
index 4993ece7c1..12b789f14e 100644
--- a/source/common/src/systable.c
+++ b/source/common/src/systable.c
@@ -327,8 +327,9 @@ static const SSysDbTableSchema configSchema[] = {
static const SSysDbTableSchema variablesSchema[] = {
{.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
{.name = "name", .bytes = TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
- {.name = "value", .bytes = TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
+ {.name = "value", .bytes = TSDB_CONFIG_PATH_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
{.name = "scope", .bytes = TSDB_CONFIG_SCOPE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
+ {.name = "info", .bytes = TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
};
static const SSysDbTableSchema topicSchema[] = {
diff --git a/source/common/src/tmisce.c b/source/common/src/tmisce.c
index 4df458c2bb..8988fab56a 100644
--- a/source/common/src/tmisce.c
+++ b/source/common/src/tmisce.c
@@ -267,7 +267,14 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
int8_t locked = 0;
- TAOS_CHECK_GOTO(blockDataEnsureCapacity(pBlock, cfgGetSize(pConf)), NULL, _exit);
+ size_t exSize = 0;
+ size_t index = 0;
+ SConfigItem* pDataDirItem = cfgGetItem(pConf, "dataDir");
+ if (pDataDirItem) {
+ exSize = TMAX(taosArrayGetSize(pDataDirItem->array), 1) - 1;
+ }
+
+ TAOS_CHECK_GOTO(blockDataEnsureCapacity(pBlock, cfgGetSize(pConf) + exSize), NULL, _exit);
TAOS_CHECK_GOTO(cfgCreateIter(pConf, &pIter), NULL, _exit);
@@ -275,6 +282,7 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
locked = 1;
while ((pItem = cfgNextIter(pIter)) != NULL) {
+_start:
col = startCol;
// GRANT_CFG_SKIP;
@@ -289,9 +297,18 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, name, false), NULL, _exit);
- char value[TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE] = {0};
+ char value[TSDB_CONFIG_PATH_LEN + VARSTR_HEADER_SIZE] = {0};
int32_t valueLen = 0;
- TAOS_CHECK_GOTO(cfgDumpItemValue(pItem, &value[VARSTR_HEADER_SIZE], TSDB_CONFIG_VALUE_LEN, &valueLen), NULL, _exit);
+ SDiskCfg* pDiskCfg = NULL;
+ if (strcasecmp(pItem->name, "dataDir") == 0 && exSize > 0) {
+ char* buf = &value[VARSTR_HEADER_SIZE];
+ pDiskCfg = taosArrayGet(pItem->array, index);
+ valueLen = tsnprintf(buf, TSDB_CONFIG_PATH_LEN, "%s", pDiskCfg->dir);
+ index++;
+ } else {
+ TAOS_CHECK_GOTO(cfgDumpItemValue(pItem, &value[VARSTR_HEADER_SIZE], TSDB_CONFIG_PATH_LEN, &valueLen), NULL,
+ _exit);
+ }
varDataSetLen(value, valueLen);
pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
@@ -313,8 +330,28 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
}
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, scope, false), NULL, _exit);
+ char info[TSDB_CONFIG_INFO_LEN + VARSTR_HEADER_SIZE] = {0};
+ if (strcasecmp(pItem->name, "dataDir") == 0 && pDiskCfg) {
+ char* buf = &info[VARSTR_HEADER_SIZE];
+ valueLen = tsnprintf(buf, TSDB_CONFIG_INFO_LEN, "level %d primary %d disabled %" PRIi8, pDiskCfg->level,
+ pDiskCfg->primary, pDiskCfg->disable);
+ } else {
+ valueLen = 0;
+ }
+ varDataSetLen(info, valueLen);
+
+ pColInfo = taosArrayGet(pBlock->pDataBlock, col++);
+ if (pColInfo == NULL) {
+ code = terrno;
+ TAOS_CHECK_GOTO(code, NULL, _exit);
+ }
+ TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, info, false), NULL, _exit);
+
numOfRows++;
- }
+ if (index > 0 && index <= exSize) {
+ goto _start;
+ }
+}
pBlock->info.rows = numOfRows;
_exit:
if (locked) cfgUnLock(pConf);
diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c
index ca5af34e15..23b8c499b8 100644
--- a/source/common/src/tmsg.c
+++ b/source/common/src/tmsg.c
@@ -5642,6 +5642,12 @@ int32_t tSerializeSShowVariablesRsp(void *buf, int32_t bufLen, SShowVariablesRsp
SVariablesInfo *pInfo = taosArrayGet(pRsp->variables, i);
TAOS_CHECK_EXIT(tEncodeSVariablesInfo(&encoder, pInfo));
}
+
+ for (int32_t i = 0; i < varNum; ++i) {
+ SVariablesInfo *pInfo = taosArrayGet(pRsp->variables, i);
+ TAOS_CHECK_RETURN(tEncodeCStr(&encoder, pInfo->info));
+ }
+
tEndEncode(&encoder);
_exit:
@@ -5675,6 +5681,13 @@ int32_t tDeserializeSShowVariablesRsp(void *buf, int32_t bufLen, SShowVariablesR
TAOS_CHECK_EXIT(terrno);
}
}
+
+ if (!tDecodeIsEnd(&decoder)) {
+ for (int32_t i = 0; i < varNum; ++i) {
+ SVariablesInfo *pInfo = taosArrayGet(pRsp->variables, i);
+ TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pInfo->info));
+ }
+ }
}
tEndDecode(&decoder);
diff --git a/source/dnode/mgmt/mgmt_snode/src/smWorker.c b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
index 8c33c5bb4b..1e882fc656 100644
--- a/source/dnode/mgmt/mgmt_snode/src/smWorker.c
+++ b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
@@ -36,14 +36,15 @@ static void smProcessWriteQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numO
dTrace("msg:%p, get from snode-write queue", pMsg);
int32_t code = sndProcessWriteMsg(pMgmt->pSnode, pMsg, NULL);
- if (code < 0) {
- dGError("snd, msg:%p failed to process write since %s", pMsg, tstrerror(code));
- if (pMsg->info.handle != NULL) {
- tmsgSendRsp(pMsg);
- }
- } else {
- smSendRsp(pMsg, 0);
- }
+ // if (code < 0) {
+ // dGError("snd, msg:%p failed to process write since %s", pMsg, tstrerror(code));
+ // if (pMsg->info.handle != NULL) {
+ // tmsgSendRsp(pMsg);
+ // }
+ // } else {
+ // smSendRsp(pMsg, 0);
+ // }
+ smSendRsp(pMsg, code);
dTrace("msg:%p, is freed", pMsg);
rpcFreeCont(pMsg->pCont);
diff --git a/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h b/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
index 989adf84ac..7842077d88 100644
--- a/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
+++ b/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
@@ -37,7 +37,9 @@ typedef struct SVnodeMgmt {
SSingleWorker mgmtMultiWorker;
SHashObj *hash;
SHashObj *closedHash;
+ SHashObj *creatingHash;
TdThreadRwlock lock;
+ TdThreadMutex mutex;
SVnodesStat state;
STfs *pTfs;
TdThread thread;
@@ -96,6 +98,7 @@ SVnodeObj *vmAcquireVnodeImpl(SVnodeMgmt *pMgmt, int32_t vgId, bool strict);
void vmReleaseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode);
int32_t vmOpenVnode(SVnodeMgmt *pMgmt, SWrapperCfg *pCfg, SVnode *pImpl);
void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal, bool keepClosed);
+void vmRemoveFromCreatingHash(SVnodeMgmt *pMgmt, int32_t vgId);
// vmHandle.c
SArray *vmGetMsgHandles();
@@ -113,6 +116,7 @@ int32_t vmGetVnodeListFromFile(SVnodeMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t
int32_t vmWriteVnodeListToFile(SVnodeMgmt *pMgmt);
int32_t vmGetVnodeListFromHash(SVnodeMgmt *pMgmt, int32_t *numOfVnodes, SVnodeObj ***ppVnodes);
int32_t vmGetAllVnodeListFromHash(SVnodeMgmt *pMgmt, int32_t *numOfVnodes, SVnodeObj ***ppVnodes);
+int32_t vmGetAllVnodeListFromHashWithCreating(SVnodeMgmt *pMgmt, int32_t *numOfVnodes, SVnodeObj ***ppVnodes);
// vmWorker.c
int32_t vmStartWorker(SVnodeMgmt *pMgmt);
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmFile.c b/source/dnode/mgmt/mgmt_vnode/src/vmFile.c
index 7566b69c02..b4453ad6fc 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmFile.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmFile.c
@@ -67,6 +67,54 @@ int32_t vmGetAllVnodeListFromHash(SVnodeMgmt *pMgmt, int32_t *numOfVnodes, SVnod
return 0;
}
+int32_t vmGetAllVnodeListFromHashWithCreating(SVnodeMgmt *pMgmt, int32_t *numOfVnodes, SVnodeObj ***ppVnodes) {
+ (void)taosThreadRwlockRdlock(&pMgmt->lock);
+
+ int32_t num = 0;
+ int32_t size = taosHashGetSize(pMgmt->hash);
+ int32_t creatingSize = taosHashGetSize(pMgmt->creatingHash);
+ size += creatingSize;
+ SVnodeObj **pVnodes = taosMemoryCalloc(size, sizeof(SVnodeObj *));
+ if (pVnodes == NULL) {
+ (void)taosThreadRwlockUnlock(&pMgmt->lock);
+ return terrno;
+ }
+
+ void *pIter = taosHashIterate(pMgmt->hash, NULL);
+ while (pIter) {
+ SVnodeObj **ppVnode = pIter;
+ SVnodeObj *pVnode = *ppVnode;
+ if (pVnode && num < size) {
+ int32_t refCount = atomic_add_fetch_32(&pVnode->refCount, 1);
+ dTrace("vgId:%d,acquire vnode, vnode:%p, ref:%d", pVnode->vgId, pVnode, refCount);
+ pVnodes[num++] = (*ppVnode);
+ pIter = taosHashIterate(pMgmt->hash, pIter);
+ } else {
+ taosHashCancelIterate(pMgmt->hash, pIter);
+ }
+ }
+
+ pIter = taosHashIterate(pMgmt->creatingHash, NULL);
+ while (pIter) {
+ SVnodeObj **ppVnode = pIter;
+ SVnodeObj *pVnode = *ppVnode;
+ if (pVnode && num < size) {
+ int32_t refCount = atomic_add_fetch_32(&pVnode->refCount, 1);
+ dTrace("vgId:%d, acquire vnode, vnode:%p, ref:%d", pVnode->vgId, pVnode, refCount);
+ pVnodes[num++] = (*ppVnode);
+ pIter = taosHashIterate(pMgmt->creatingHash, pIter);
+ } else {
+ taosHashCancelIterate(pMgmt->creatingHash, pIter);
+ }
+ }
+ (void)taosThreadRwlockUnlock(&pMgmt->lock);
+
+ *numOfVnodes = num;
+ *ppVnodes = pVnodes;
+
+ return 0;
+}
+
int32_t vmGetVnodeListFromHash(SVnodeMgmt *pMgmt, int32_t *numOfVnodes, SVnodeObj ***ppVnodes) {
(void)taosThreadRwlockRdlock(&pMgmt->lock);
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
index 006f44b349..90b3f0025d 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
@@ -381,6 +381,7 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
if (vnodeCreate(path, &vnodeCfg, diskPrimary, pMgmt->pTfs) < 0) {
dError("vgId:%d, failed to create vnode since %s", req.vgId, terrstr());
vmReleaseVnode(pMgmt, pVnode);
+ vmRemoveFromCreatingHash(pMgmt, req.vgId);
(void)tFreeSCreateVnodeReq(&req);
code = terrno != 0 ? terrno : -1;
return code;
@@ -422,6 +423,8 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
}
_OVER:
+ vmRemoveFromCreatingHash(pMgmt, req.vgId);
+
if (code != 0) {
int32_t r = 0;
r = taosThreadRwlockWrlock(&pMgmt->lock);
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c
index 682c179270..17a99c1806 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c
@@ -16,6 +16,7 @@
#define _DEFAULT_SOURCE
#include "vmInt.h"
#include "libs/function/tudf.h"
+#include "osMemory.h"
#include "tfs.h"
#include "vnd.h"
@@ -62,10 +63,20 @@ int32_t vmAllocPrimaryDisk(SVnodeMgmt *pMgmt, int32_t vgId) {
int32_t numOfVnodes = 0;
SVnodeObj **ppVnodes = NULL;
- code = vmGetVnodeListFromHash(pMgmt, &numOfVnodes, &ppVnodes);
+ code = taosThreadMutexLock(&pMgmt->mutex);
if (code != 0) {
return code;
}
+
+ code = vmGetAllVnodeListFromHashWithCreating(pMgmt, &numOfVnodes, &ppVnodes);
+ if (code != 0) {
+ int32_t r = taosThreadMutexUnlock(&pMgmt->mutex);
+ if (r != 0) {
+ dError("vgId:%d, failed to unlock mutex since %s", vgId, tstrerror(r));
+ }
+ return code;
+ }
+
for (int32_t v = 0; v < numOfVnodes; v++) {
SVnodeObj *pVnode = ppVnodes[v];
disks[pVnode->diskPrimary] += 1;
@@ -81,6 +92,51 @@ int32_t vmAllocPrimaryDisk(SVnodeMgmt *pMgmt, int32_t vgId) {
}
}
+ SVnodeObj *pCreatingVnode = taosMemoryCalloc(1, sizeof(SVnodeObj));
+ if (pCreatingVnode == NULL) {
+ code = -1;
+ if (terrno != 0) code = terrno;
+ dError("failed to alloc vnode since %s", tstrerror(code));
+ int32_t r = taosThreadMutexUnlock(&pMgmt->mutex);
+ if (r != 0) {
+ dError("vgId:%d, failed to unlock mutex since %s", vgId, tstrerror(r));
+ }
+ goto _OVER;
+ }
+ (void)memset(pCreatingVnode, 0, sizeof(SVnodeObj));
+
+ pCreatingVnode->vgId = vgId;
+ pCreatingVnode->diskPrimary = diskId;
+
+ code = taosThreadRwlockWrlock(&pMgmt->lock);
+ if (code != 0) {
+ int32_t r = taosThreadMutexUnlock(&pMgmt->mutex);
+ if (r != 0) {
+ dError("vgId:%d, failed to unlock mutex since %s", vgId, tstrerror(r));
+ }
+ taosMemoryFree(pCreatingVnode);
+ goto _OVER;
+ }
+
+ dTrace("vgId:%d, put vnode into creating hash, pCreatingVnode:%p", vgId, pCreatingVnode);
+ code = taosHashPut(pMgmt->creatingHash, &vgId, sizeof(int32_t), &pCreatingVnode, sizeof(SVnodeObj *));
+ if (code != 0) {
+ dError("vgId:%d, failed to put vnode to creatingHash", vgId);
+ taosMemoryFree(pCreatingVnode);
+ }
+
+ int32_t r = taosThreadRwlockUnlock(&pMgmt->lock);
+ if (r != 0) {
+ dError("vgId:%d, failed to unlock since %s", vgId, tstrerror(r));
+ }
+
+ code = taosThreadMutexUnlock(&pMgmt->mutex);
+ if (code != 0) {
+ goto _OVER;
+ }
+
+_OVER:
+
for (int32_t i = 0; i < numOfVnodes; ++i) {
if (ppVnodes == NULL || ppVnodes[i] == NULL) continue;
vmReleaseVnode(pMgmt, ppVnodes[i]);
@@ -89,8 +145,13 @@ int32_t vmAllocPrimaryDisk(SVnodeMgmt *pMgmt, int32_t vgId) {
taosMemoryFree(ppVnodes);
}
- dInfo("vgId:%d, alloc disk:%d of level 0. ndisk:%d, vnodes: %d", vgId, diskId, ndisk, numOfVnodes);
- return diskId;
+ if (code != 0) {
+ dError("vgId:%d, failed to alloc disk since %s", vgId, tstrerror(code));
+ return code;
+ } else {
+ dInfo("vgId:%d, alloc disk:%d of level 0. ndisk:%d, vnodes: %d", vgId, diskId, ndisk, numOfVnodes);
+ return diskId;
+ }
}
SVnodeObj *vmAcquireVnodeImpl(SVnodeMgmt *pMgmt, int32_t vgId, bool strict) {
@@ -216,12 +277,12 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal,
}
if (keepClosed) {
SVnodeObj *pClosedVnode = taosMemoryCalloc(1, sizeof(SVnodeObj));
- (void)memset(pClosedVnode, 0, sizeof(SVnodeObj));
- if (pVnode == NULL) {
- dError("vgId:%d, failed to alloc vnode since %s", pVnode->vgId, terrstr());
+ if (pClosedVnode == NULL) {
+ dError("failed to alloc vnode since %s", terrstr());
(void)taosThreadRwlockUnlock(&pMgmt->lock);
return;
}
+ (void)memset(pClosedVnode, 0, sizeof(SVnodeObj));
pClosedVnode->vgId = pVnode->vgId;
pClosedVnode->dropped = pVnode->dropped;
@@ -427,11 +488,18 @@ static int32_t vmOpenVnodes(SVnodeMgmt *pMgmt) {
pMgmt->closedHash =
taosHashInit(TSDB_MIN_VNODES, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK);
- if (pMgmt->hash == NULL) {
+ if (pMgmt->closedHash == NULL) {
dError("failed to init vnode closed hash since %s", terrstr());
return TSDB_CODE_OUT_OF_MEMORY;
}
+ pMgmt->creatingHash =
+ taosHashInit(TSDB_MIN_VNODES, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK);
+ if (pMgmt->creatingHash == NULL) {
+ dError("failed to init vnode creatingHash hash since %s", terrstr());
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
SWrapperCfg *pCfgs = NULL;
int32_t numOfVnodes = 0;
if (vmGetVnodeListFromFile(pMgmt, &pCfgs, &numOfVnodes) != 0) {
@@ -509,6 +577,32 @@ static int32_t vmOpenVnodes(SVnodeMgmt *pMgmt) {
return 0;
}
+void vmRemoveFromCreatingHash(SVnodeMgmt *pMgmt, int32_t vgId) {
+ SVnodeObj *pOld = NULL;
+
+ (void)taosThreadRwlockWrlock(&pMgmt->lock);
+ int32_t r = taosHashGetDup(pMgmt->creatingHash, &vgId, sizeof(int32_t), (void *)&pOld);
+ if (r != 0) {
+ dError("vgId:%d, failed to get vnode from creating Hash", vgId);
+ }
+ dTrace("vgId:%d, remove from creating Hash", vgId);
+ r = taosHashRemove(pMgmt->creatingHash, &vgId, sizeof(int32_t));
+ if (r != 0) {
+ dError("vgId:%d, failed to remove vnode from hash", vgId);
+ }
+ (void)taosThreadRwlockUnlock(&pMgmt->lock);
+
+ if (pOld) {
+ dTrace("vgId:%d, free vnode pOld:%p", vgId, &pOld);
+ vmFreeVnodeObj(&pOld);
+ }
+
+_OVER:
+ if (r != 0) {
+ dError("vgId:%d, failed to remove vnode from creatingHash since %s", vgId, tstrerror(r));
+ }
+}
+
static void *vmCloseVnodeInThread(void *param) {
SVnodeThread *pThread = param;
SVnodeMgmt *pMgmt = pThread->pMgmt;
@@ -614,6 +708,18 @@ static void vmCloseVnodes(SVnodeMgmt *pMgmt) {
pMgmt->closedHash = NULL;
}
+ pIter = taosHashIterate(pMgmt->creatingHash, NULL);
+ while (pIter) {
+ SVnodeObj **ppVnode = pIter;
+ vmFreeVnodeObj(ppVnode);
+ pIter = taosHashIterate(pMgmt->creatingHash, pIter);
+ }
+
+ if (pMgmt->creatingHash != NULL) {
+ taosHashCleanup(pMgmt->creatingHash);
+ pMgmt->creatingHash = NULL;
+ }
+
dInfo("total vnodes:%d are all closed", numOfVnodes);
}
@@ -622,6 +728,7 @@ static void vmCleanup(SVnodeMgmt *pMgmt) {
vmStopWorker(pMgmt);
vnodeCleanup();
(void)taosThreadRwlockDestroy(&pMgmt->lock);
+ (void)taosThreadMutexDestroy(&pMgmt->mutex);
(void)taosThreadMutexDestroy(&pMgmt->fileLock);
taosMemoryFree(pMgmt);
}
@@ -714,6 +821,12 @@ static int32_t vmInit(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) {
goto _OVER;
}
+ code = taosThreadMutexInit(&pMgmt->mutex, NULL);
+ if (code != 0) {
+ code = TAOS_SYSTEM_ERROR(errno);
+ goto _OVER;
+ }
+
code = taosThreadMutexInit(&pMgmt->fileLock, NULL);
if (code != 0) {
code = TAOS_SYSTEM_ERROR(errno);
diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c
index 406128e232..0011c11b0a 100644
--- a/source/dnode/mnode/impl/src/mndDnode.c
+++ b/source/dnode/mnode/impl/src/mndDnode.c
@@ -1103,6 +1103,7 @@ static int32_t mndProcessShowVariablesReq(SRpcMsg *pReq) {
(void)strcpy(info.name, "statusInterval");
(void)snprintf(info.value, TSDB_CONFIG_VALUE_LEN, "%d", tsStatusInterval);
(void)strcpy(info.scope, "server");
+ // fill info.info
if (taosArrayPush(rsp.variables, &info) == NULL) {
code = terrno;
goto _OVER;
diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c
index 6c30193ea7..9dd43225b1 100644
--- a/source/dnode/mnode/impl/src/mndMain.c
+++ b/source/dnode/mnode/impl/src/mndMain.c
@@ -53,7 +53,7 @@ static inline int32_t mndAcquireRpc(SMnode *pMnode) {
if (pMnode->stopped) {
code = TSDB_CODE_APP_IS_STOPPING;
} else if (!mndIsLeader(pMnode)) {
- code = -1;
+ code = 1;
} else {
#if 1
(void)atomic_add_fetch_32(&pMnode->rpcRef, 1);
@@ -1002,8 +1002,12 @@ int64_t mndGenerateUid(const char *name, int32_t len) {
int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgroupInfo *pVgroupInfo,
SMonStbInfo *pStbInfo, SMonGrantInfo *pGrantInfo) {
- int32_t code = 0;
- TAOS_CHECK_RETURN(mndAcquireRpc(pMnode));
+ int32_t code = mndAcquireRpc(pMnode);
+ if (code < 0) {
+ TAOS_RETURN(code);
+ } else if (code == 1) {
+ TAOS_RETURN(TSDB_CODE_SUCCESS);
+ }
SSdb *pSdb = pMnode->pSdb;
int64_t ms = taosGetTimestampMs();
diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c
index 81db427afd..6336cd6e49 100644
--- a/source/dnode/mnode/impl/src/mndStream.c
+++ b/source/dnode/mnode/impl/src/mndStream.c
@@ -2434,7 +2434,12 @@ static void doAddReportStreamTask(SArray *pList, int64_t reportChkptId, const SC
mDebug("s-task:0x%x expired checkpoint-report msg in checkpoint-report list update from %" PRId64 "->%" PRId64,
pReport->taskId, p->checkpointId, pReport->checkpointId);
- memcpy(p, pReport, sizeof(STaskChkptInfo));
+ // update the checkpoint report info
+ p->checkpointId = pReport->checkpointId;
+ p->ts = pReport->checkpointTs;
+ p->version = pReport->checkpointVer;
+ p->transId = pReport->transId;
+ p->dropHTask = pReport->dropHTask;
} else {
mWarn("taskId:0x%x already in checkpoint-report list", pReport->taskId);
}
diff --git a/source/dnode/vnode/src/meta/metaOpen.c b/source/dnode/vnode/src/meta/metaOpen.c
index 659ba3f777..9a5bea33e3 100644
--- a/source/dnode/vnode/src/meta/metaOpen.c
+++ b/source/dnode/vnode/src/meta/metaOpen.c
@@ -324,7 +324,11 @@ static int32_t metaGenerateNewMeta(SMeta **ppMeta) {
SMetaEntry me = {0};
tDecoderInit(&dc, value, valueSize);
if (metaDecodeEntry(&dc, &me) == 0) {
- if (metaHandleEntry(pNewMeta, &me) != 0) {
+ if (me.type == TSDB_CHILD_TABLE &&
+ tdbTbGet(pMeta->pUidIdx, &me.ctbEntry.suid, sizeof(me.ctbEntry.suid), NULL, NULL) != 0) {
+ metaError("vgId:%d failed to get super table uid:%" PRId64 " for child table uid:%" PRId64,
+ TD_VID(pVnode), me.ctbEntry.suid, uid);
+ } else if (metaHandleEntry(pNewMeta, &me) != 0) {
metaError("vgId:%d failed to handle entry, uid:%" PRId64, TD_VID(pVnode), uid);
}
}
diff --git a/source/dnode/vnode/src/tqCommon/tqCommon.c b/source/dnode/vnode/src/tqCommon/tqCommon.c
index f31dd28847..326e8d4ada 100644
--- a/source/dnode/vnode/src/tqCommon/tqCommon.c
+++ b/source/dnode/vnode/src/tqCommon/tqCommon.c
@@ -1186,10 +1186,12 @@ int32_t tqStreamTaskProcessTaskResumeReq(void* handle, int64_t sversion, char* m
streamMutexUnlock(&pHTask->lock);
code = tqProcessTaskResumeImpl(handle, pHTask, sversion, pReq->igUntreated, fromVnode);
+ tqDebug("s-task:%s resume complete, code:%s", pHTask->id.idStr, tstrerror(code));
+
streamMetaReleaseTask(pMeta, pHTask);
}
- return code;
+ return TSDB_CODE_SUCCESS;
}
int32_t tqStreamTasksGetTotalNum(SStreamMeta* pMeta) { return taosArrayGetSize(pMeta->pTaskList); }
diff --git a/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c b/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c
index 720ba68414..f51ffe0c83 100644
--- a/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c
+++ b/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c
@@ -972,7 +972,7 @@ static int32_t tsdbDataFileWriteBrinRecord(SDataFileWriter *writer, const SBrinR
break;
}
- if ((writer->brinBlock->numOfRecords) >= writer->config->maxRow) {
+ if ((writer->brinBlock->numOfRecords) >= 256) {
TAOS_CHECK_GOTO(tsdbDataFileWriteBrinBlock(writer), &lino, _exit);
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbRead2.c b/source/dnode/vnode/src/tsdb/tsdbRead2.c
index f30f7eb310..ac8e8505e4 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRead2.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRead2.c
@@ -836,6 +836,7 @@ static int32_t doLoadBlockIndex(STsdbReader* pReader, SDataFileReader* pFileRead
pList = &pReader->status.uidList;
int32_t i = 0;
+ int32_t j = 0;
while (i < TARRAY2_SIZE(pBlkArray)) {
pBrinBlk = &pBlkArray->data[i];
if (pBrinBlk->maxTbid.suid < pReader->info.suid) {
@@ -851,7 +852,7 @@ static int32_t doLoadBlockIndex(STsdbReader* pReader, SDataFileReader* pFileRead
(pBrinBlk->minTbid.suid <= pReader->info.suid) && (pBrinBlk->maxTbid.suid >= pReader->info.suid), code, lino,
_end, TSDB_CODE_INTERNAL_ERROR);
- if (pBrinBlk->maxTbid.suid == pReader->info.suid && pBrinBlk->maxTbid.uid < pList->tableUidList[0]) {
+ if (pBrinBlk->maxTbid.suid == pReader->info.suid && pBrinBlk->maxTbid.uid < pList->tableUidList[j]) {
i += 1;
continue;
}
@@ -864,6 +865,14 @@ static int32_t doLoadBlockIndex(STsdbReader* pReader, SDataFileReader* pFileRead
TSDB_CHECK_NULL(p1, code, lino, _end, terrno);
i += 1;
+ if (pBrinBlk->maxTbid.suid == pReader->info.suid) {
+ while (j < numOfTables && pList->tableUidList[j] < pBrinBlk->maxTbid.uid) {
+ j++;
+ }
+ if (j >= numOfTables) {
+ break;
+ }
+ }
}
et2 = taosGetTimestampUs();
@@ -1134,7 +1143,12 @@ static int32_t getCurrentBlockInfo(SDataBlockIter* pBlockIter, SFileDataBlockInf
*pInfo = NULL;
size_t num = TARRAY_SIZE(pBlockIter->blockList);
- TSDB_CHECK_CONDITION(num != 0, code, lino, _end, TSDB_CODE_INVALID_PARA);
+ if (num == 0) {
+ // Some callers would attempt to call this function. Filter out certain normal cases and return directly to avoid
+ // generating excessive unnecessary error logs.
+ TSDB_CHECK_CONDITION(num == pBlockIter->numOfBlocks, code, lino, _end, TSDB_CODE_INVALID_PARA);
+ return TSDB_CODE_INVALID_PARA;
+ }
*pInfo = taosArrayGet(pBlockIter->blockList, pBlockIter->index);
TSDB_CHECK_NULL(*pInfo, code, lino, _end, TSDB_CODE_INVALID_PARA);
@@ -4807,7 +4821,7 @@ static int32_t checkForNeighborFileBlock(STsdbReader* pReader, STableBlockScanIn
pBlockData = &pReader->status.fileBlockData;
asc = ASCENDING_TRAVERSE(pReader->info.order);
pVerRange = &pReader->info.verRange;
- ASCENDING_TRAVERSE(pReader->info.order) ? 1 : -1;
+ step = ASCENDING_TRAVERSE(pReader->info.order) ? 1 : -1;
*state = CHECK_FILEBLOCK_QUIT;
code = loadNeighborIfOverlap(pFBlock, pScanInfo, pReader, &loadNeighbor);
@@ -5530,12 +5544,10 @@ int32_t tsdbReaderOpen2(void* pVnode, SQueryTableDataCond* pCond, void* pTableLi
// update the SQueryTableDataCond to create inner reader
int32_t order = pCond->order;
if (order == TSDB_ORDER_ASC) {
- pCond->twindows.ekey = window.skey - 1;
- pCond->twindows.skey = INT64_MIN;
+ pCond->twindows = pCond->extTwindows[0];
pCond->order = TSDB_ORDER_DESC;
} else {
- pCond->twindows.skey = window.ekey + 1;
- pCond->twindows.ekey = INT64_MAX;
+ pCond->twindows = pCond->extTwindows[1];
pCond->order = TSDB_ORDER_ASC;
}
@@ -5544,11 +5556,9 @@ int32_t tsdbReaderOpen2(void* pVnode, SQueryTableDataCond* pCond, void* pTableLi
TSDB_CHECK_CODE(code, lino, _end);
if (order == TSDB_ORDER_ASC) {
- pCond->twindows.skey = window.ekey + 1;
- pCond->twindows.ekey = INT64_MAX;
+ pCond->twindows = pCond->extTwindows[1];
} else {
- pCond->twindows.skey = INT64_MIN;
- pCond->twindows.ekey = window.ekey - 1;
+ pCond->twindows = pCond->extTwindows[0];
}
pCond->order = order;
@@ -6115,7 +6125,7 @@ int32_t tsdbNextDataBlock2(STsdbReader* pReader, bool* hasNext) {
TSDB_CHECK_CODE(code, lino, _end);
}
- goto _end;
+ return code;
}
}
@@ -6142,7 +6152,7 @@ int32_t tsdbNextDataBlock2(STsdbReader* pReader, bool* hasNext) {
acquired = false;
TSDB_CHECK_CODE(code, lino, _end);
}
- goto _end;
+ return code;
}
if (pReader->step == EXTERNAL_ROWS_MAIN && pReader->innerReader[1] != NULL) {
@@ -6168,7 +6178,7 @@ int32_t tsdbNextDataBlock2(STsdbReader* pReader, bool* hasNext) {
TSDB_CHECK_CODE(code, lino, _end);
}
- goto _end;
+ return code;
}
}
diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h
index e757163ba8..bfc5ca9142 100644
--- a/source/libs/catalog/inc/catalogInt.h
+++ b/source/libs/catalog/inc/catalogInt.h
@@ -271,6 +271,7 @@ typedef struct SCtgViewsCtx {
SArray* pNames;
SArray* pResList;
SArray* pFetchs;
+ bool forceFetch;
} SCtgViewsCtx;
typedef enum {
diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c
index c1dcdf2741..9bfb4102aa 100644
--- a/source/libs/catalog/src/ctgAsync.c
+++ b/source/libs/catalog/src/ctgAsync.c
@@ -20,6 +20,11 @@
#include "tref.h"
#include "trpc.h"
+typedef struct SCtgViewTaskParam {
+ bool forceFetch;
+ SArray* pTableReqs;
+} SCtgViewTaskParam;
+
void ctgIsTaskDone(SCtgJob* pJob, CTG_TASK_TYPE type, bool* done) {
SCtgTask* pTask = NULL;
@@ -500,7 +505,7 @@ int32_t ctgInitGetTbTagTask(SCtgJob* pJob, int32_t taskIdx, void* param) {
int32_t ctgInitGetViewsTask(SCtgJob* pJob, int32_t taskIdx, void* param) {
SCtgTask task = {0};
-
+ SCtgViewTaskParam* p = param;
task.type = CTG_TASK_GET_VIEW;
task.taskId = taskIdx;
task.pJob = pJob;
@@ -511,7 +516,8 @@ int32_t ctgInitGetViewsTask(SCtgJob* pJob, int32_t taskIdx, void* param) {
}
SCtgViewsCtx* ctx = task.taskCtx;
- ctx->pNames = param;
+ ctx->pNames = p->pTableReqs;
+ ctx->forceFetch = p->forceFetch;
ctx->pResList = taosArrayInit(pJob->viewNum, sizeof(SMetaRes));
if (NULL == ctx->pResList) {
qError("QID:0x%" PRIx64 " taosArrayInit %d SMetaRes %d failed", pJob->queryId, pJob->viewNum,
@@ -849,13 +855,12 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const
int32_t tbCfgNum = (int32_t)taosArrayGetSize(pReq->pTableCfg);
int32_t tbTagNum = (int32_t)taosArrayGetSize(pReq->pTableTag);
int32_t viewNum = (int32_t)ctgGetTablesReqNum(pReq->pView);
- int32_t tbTsmaNum = (int32_t)taosArrayGetSize(pReq->pTableTSMAs);
+ int32_t tbTsmaNum = tsQuerySmaOptimize ? (int32_t)taosArrayGetSize(pReq->pTableTSMAs) : 0;
int32_t tsmaNum = (int32_t)taosArrayGetSize(pReq->pTSMAs);
int32_t tbNameNum = (int32_t)ctgGetTablesReqNum(pReq->pTableName);
int32_t taskNum = tbMetaNum + dbVgNum + udfNum + tbHashNum + qnodeNum + dnodeNum + svrVerNum + dbCfgNum + indexNum +
userNum + dbInfoNum + tbIndexNum + tbCfgNum + tbTagNum + viewNum + tbTsmaNum + tbNameNum;
-
*job = taosMemoryCalloc(1, sizeof(SCtgJob));
if (NULL == *job) {
ctgError("failed to calloc, size:%d,QID:0x%" PRIx64, (int32_t)sizeof(SCtgJob), pConn->requestId);
@@ -1014,7 +1019,8 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const
}
if (viewNum > 0) {
- CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_VIEW, pReq->pView, NULL));
+ SCtgViewTaskParam param = {.forceFetch = pReq->forceFetchViewMeta, .pTableReqs = pReq->pView};
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_VIEW, ¶m, NULL));
}
if (tbTsmaNum > 0) {
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_TSMA, pReq->pTableTSMAs, NULL));
@@ -3712,16 +3718,14 @@ int32_t ctgLaunchGetViewsTask(SCtgTask* pTask) {
bool tbMetaDone = false;
SName* pName = NULL;
- /*
- ctgIsTaskDone(pJob, CTG_TASK_GET_TB_META_BATCH, &tbMetaDone);
- if (tbMetaDone) {
- CTG_ERR_RET(ctgBuildViewNullRes(pTask, pCtx));
- TSWAP(pTask->res, pCtx->pResList);
+ ctgIsTaskDone(pJob, CTG_TASK_GET_TB_META_BATCH, &tbMetaDone);
+ if (tbMetaDone && !pCtx->forceFetch) {
+ CTG_ERR_RET(ctgBuildViewNullRes(pTask, pCtx));
+ TSWAP(pTask->res, pCtx->pResList);
- CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0));
- return TSDB_CODE_SUCCESS;
- }
- */
+ CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0));
+ return TSDB_CODE_SUCCESS;
+ }
int32_t dbNum = taosArrayGetSize(pCtx->pNames);
int32_t fetchIdx = 0;
diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c
index 3c332a6b06..353bc1fa18 100644
--- a/source/libs/command/src/command.c
+++ b/source/libs/command/src/command.c
@@ -954,6 +954,12 @@ static int32_t buildLocalVariablesResultDataBlock(SSDataBlock** pOutput) {
goto _exit;
}
+ infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
+ infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD4_LEN;
+ if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
+ goto _exit;
+ }
+
*pOutput = pBlock;
_exit:
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index 84dde6a579..19a579698b 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -3040,7 +3040,6 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock
pBlockInfo->rows, pTaskInfo, &pTableScanInfo->base.metaCache);
// ignore the table not exists error, since this table may have been dropped during the scan procedure.
if (code) {
- blockDataFreeRes((SSDataBlock*)pBlock);
QUERY_CHECK_CODE(code, lino, _end);
}
@@ -3465,11 +3464,6 @@ void streamScanOperatorDecode(void* pBuff, int32_t len, SStreamScanInfo* pInfo)
goto _end;
}
- void* pUpInfo = taosMemoryCalloc(1, sizeof(SUpdateInfo));
- if (!pUpInfo) {
- lino = __LINE__;
- goto _end;
- }
SDecoder decoder = {0};
pDeCoder = &decoder;
tDecoderInit(pDeCoder, buf, tlen);
@@ -3478,14 +3472,21 @@ void streamScanOperatorDecode(void* pBuff, int32_t len, SStreamScanInfo* pInfo)
goto _end;
}
- code = pInfo->stateStore.updateInfoDeserialize(pDeCoder, pUpInfo);
- if (code == TSDB_CODE_SUCCESS) {
- pInfo->stateStore.updateInfoDestroy(pInfo->pUpdateInfo);
- pInfo->pUpdateInfo = pUpInfo;
- } else {
- taosMemoryFree(pUpInfo);
- lino = __LINE__;
- goto _end;
+ if (pInfo->pUpdateInfo != NULL) {
+ void* pUpInfo = taosMemoryCalloc(1, sizeof(SUpdateInfo));
+ if (!pUpInfo) {
+ lino = __LINE__;
+ goto _end;
+ }
+ code = pInfo->stateStore.updateInfoDeserialize(pDeCoder, pUpInfo);
+ if (code == TSDB_CODE_SUCCESS) {
+ pInfo->stateStore.updateInfoDestroy(pInfo->pUpdateInfo);
+ pInfo->pUpdateInfo = pUpInfo;
+ } else {
+ taosMemoryFree(pUpInfo);
+ lino = __LINE__;
+ goto _end;
+ }
}
if (tDecodeIsEnd(pDeCoder)) {
diff --git a/source/libs/executor/src/timesliceoperator.c b/source/libs/executor/src/timesliceoperator.c
index f77aa8f34a..50deba932f 100644
--- a/source/libs/executor/src/timesliceoperator.c
+++ b/source/libs/executor/src/timesliceoperator.c
@@ -1131,6 +1131,47 @@ static int32_t extractPkColumnFromFuncs(SNodeList* pFuncs, bool* pHasPk, SColumn
return TSDB_CODE_SUCCESS;
}
+/**
+ * @brief Determine the actual time range for reading data based on the RANGE clause and the WHERE conditions.
+ * @param[in] cond The range specified by WHERE condition.
+ * @param[in] range The range specified by RANGE clause.
+ * @param[out] twindow The range to be read in DESC order, and only one record is needed.
+ * @param[out] extTwindow The external range to read for only one record, which is used for FILL clause.
+ * @note `cond` and `twindow` may be the same address.
+ */
+static int32_t getQueryExtWindow(const STimeWindow* cond, const STimeWindow* range, STimeWindow* twindow,
+ STimeWindow* extTwindows) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ int32_t lino = 0;
+ STimeWindow tempWindow;
+
+ if (cond->skey > cond->ekey || range->skey > range->ekey) {
+ *twindow = extTwindows[0] = extTwindows[1] = TSWINDOW_DESC_INITIALIZER;
+ return code;
+ }
+
+ if (range->ekey < cond->skey) {
+ extTwindows[1] = *cond;
+ *twindow = extTwindows[0] = TSWINDOW_DESC_INITIALIZER;
+ return code;
+ }
+
+ if (cond->ekey < range->skey) {
+ extTwindows[0] = *cond;
+ *twindow = extTwindows[1] = TSWINDOW_DESC_INITIALIZER;
+ return code;
+ }
+
+ // Only scan data in the time range intersecion.
+ extTwindows[0] = extTwindows[1] = *cond;
+ twindow->skey = TMAX(cond->skey, range->skey);
+ twindow->ekey = TMIN(cond->ekey, range->ekey);
+ extTwindows[0].ekey = twindow->skey - 1;
+ extTwindows[1].skey = twindow->ekey + 1;
+
+ return code;
+}
+
int32_t createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) {
QRY_PARAM_CHECK(pOptrInfo);
@@ -1206,8 +1247,10 @@ int32_t createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyN
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
STableScanInfo* pScanInfo = (STableScanInfo*)downstream->info;
- pScanInfo->base.cond.twindows = pInfo->win;
- pScanInfo->base.cond.type = TIMEWINDOW_RANGE_EXTERNAL;
+ SQueryTableDataCond *cond = &pScanInfo->base.cond;
+ cond->type = TIMEWINDOW_RANGE_EXTERNAL;
+ code = getQueryExtWindow(&cond->twindows, &pInfo->win, &cond->twindows, cond->extTwindows);
+ QUERY_CHECK_CODE(code, lino, _error);
}
setOperatorInfo(pOperator, "TimeSliceOperator", QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC, false, OP_NOT_OPENED, pInfo,
diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c
index c2e2e9c17c..83227dea9e 100644
--- a/source/libs/function/src/builtinsimpl.c
+++ b/source/libs/function/src/builtinsimpl.c
@@ -3037,61 +3037,60 @@ int32_t lastRowFunction(SqlFunctionCtx* pCtx) {
TSKEY startKey = getRowPTs(pInput->pPTS, 0);
TSKEY endKey = getRowPTs(pInput->pPTS, pInput->totalRows - 1);
-#if 0
- int32_t blockDataOrder = (startKey <= endKey) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
-
- // the optimized version only valid if all tuples in one block are monotonious increasing or descreasing.
- // this assumption is NOT always works if project operator exists in downstream.
- if (blockDataOrder == TSDB_ORDER_ASC) {
+ if (pCtx->order == TSDB_ORDER_ASC && !pCtx->hasPrimaryKey) {
for (int32_t i = pInput->numOfRows + pInput->startRowIndex - 1; i >= pInput->startRowIndex; --i) {
- char* data = colDataGetData(pInputCol, i);
+ bool isNull = colDataIsNull(pInputCol, pInput->numOfRows, i, NULL);
+ char* data = isNull ? NULL : colDataGetData(pInputCol, i);
TSKEY cts = getRowPTs(pInput->pPTS, i);
numOfElems++;
if (pResInfo->numOfRes == 0 || pInfo->ts < cts) {
- doSaveLastrow(pCtx, data, i, cts, pInfo);
+ int32_t code = doSaveLastrow(pCtx, data, i, cts, pInfo);
+ if (code != TSDB_CODE_SUCCESS) return code;
}
break;
}
- } else { // descending order
+ } else if (!pCtx->hasPrimaryKey && pCtx->order == TSDB_ORDER_DESC) {
+ // the optimized version only valid if all tuples in one block are monotonious increasing or descreasing.
+ // this assumption is NOT always works if project operator exists in downstream.
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
- char* data = colDataGetData(pInputCol, i);
+ bool isNull = colDataIsNull(pInputCol, pInput->numOfRows, i, NULL);
+ char* data = isNull ? NULL : colDataGetData(pInputCol, i);
TSKEY cts = getRowPTs(pInput->pPTS, i);
numOfElems++;
if (pResInfo->numOfRes == 0 || pInfo->ts < cts) {
- doSaveLastrow(pCtx, data, i, cts, pInfo);
+ int32_t code = doSaveLastrow(pCtx, data, i, cts, pInfo);
+ if (code != TSDB_CODE_SUCCESS) return code;
}
break;
}
- }
-#else
+ } else {
+ int64_t* pts = (int64_t*)pInput->pPTS->pData;
+ int from = -1;
+ int32_t i = -1;
+ while (funcInputGetNextRowIndex(pInput, from, false, &i, &from)) {
+ bool isNull = colDataIsNull(pInputCol, pInput->numOfRows, i, NULL);
+ char* data = isNull ? NULL : colDataGetData(pInputCol, i);
+ TSKEY cts = pts[i];
- int64_t* pts = (int64_t*)pInput->pPTS->pData;
- int from = -1;
- int32_t i = -1;
- while (funcInputGetNextRowIndex(pInput, from, false, &i, &from)) {
- bool isNull = colDataIsNull(pInputCol, pInput->numOfRows, i, NULL);
- char* data = isNull ? NULL : colDataGetData(pInputCol, i);
- TSKEY cts = pts[i];
-
- numOfElems++;
- char* pkData = NULL;
- if (pCtx->hasPrimaryKey) {
- pkData = colDataGetData(pkCol, i);
- }
- if (pResInfo->numOfRes == 0 || pInfo->ts < cts ||
- (pInfo->ts == pts[i] && pkCompareFn && pkCompareFn(pkData, pInfo->pkData) < 0)) {
- int32_t code = doSaveLastrow(pCtx, data, i, cts, pInfo);
- if (code != TSDB_CODE_SUCCESS) {
- return code;
+ numOfElems++;
+ char* pkData = NULL;
+ if (pCtx->hasPrimaryKey) {
+ pkData = colDataGetData(pkCol, i);
+ }
+ if (pResInfo->numOfRes == 0 || pInfo->ts < cts ||
+ (pInfo->ts == pts[i] && pkCompareFn && pkCompareFn(pkData, pInfo->pkData) < 0)) {
+ int32_t code = doSaveLastrow(pCtx, data, i, cts, pInfo);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+ pResInfo->numOfRes = 1;
}
- pResInfo->numOfRes = 1;
}
- }
-#endif
+ }
SET_VAL(pResInfo, numOfElems, 1);
return TSDB_CODE_SUCCESS;
diff --git a/source/libs/nodes/src/nodesEqualFuncs.c b/source/libs/nodes/src/nodesEqualFuncs.c
index 241da85267..891843761a 100644
--- a/source/libs/nodes/src/nodesEqualFuncs.c
+++ b/source/libs/nodes/src/nodesEqualFuncs.c
@@ -153,6 +153,12 @@ static bool caseWhenNodeEqual(const SCaseWhenNode* a, const SCaseWhenNode* b) {
return true;
}
+static bool groupingSetNodeEqual(const SGroupingSetNode* a, const SGroupingSetNode* b) {
+ COMPARE_SCALAR_FIELD(groupingSetType);
+ COMPARE_NODE_LIST_FIELD(pParameterList);
+ return true;
+}
+
bool nodesEqualNode(const SNode* a, const SNode* b) {
if (a == b) {
return true;
@@ -181,10 +187,11 @@ bool nodesEqualNode(const SNode* a, const SNode* b) {
return whenThenNodeEqual((const SWhenThenNode*)a, (const SWhenThenNode*)b);
case QUERY_NODE_CASE_WHEN:
return caseWhenNodeEqual((const SCaseWhenNode*)a, (const SCaseWhenNode*)b);
+ case QUERY_NODE_GROUPING_SET:
+ return groupingSetNodeEqual((const SGroupingSetNode*)a, (const SGroupingSetNode*)b);
case QUERY_NODE_REAL_TABLE:
case QUERY_NODE_TEMP_TABLE:
case QUERY_NODE_JOIN_TABLE:
- case QUERY_NODE_GROUPING_SET:
case QUERY_NODE_ORDER_BY_EXPR:
case QUERY_NODE_LIMIT:
return false;
diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c
index a9d0aa2924..30cc552761 100644
--- a/source/libs/nodes/src/nodesUtilFuncs.c
+++ b/source/libs/nodes/src/nodesUtilFuncs.c
@@ -2948,3 +2948,46 @@ void nodesSortList(SNodeList** pList, int32_t (*comp)(SNode* pNode1, SNode* pNod
inSize *= 2;
}
}
+
+static SNode* nodesListFindNode(SNodeList* pList, SNode* pNode) {
+ SNode* pFound = NULL;
+ FOREACH(pFound, pList) {
+ if (nodesEqualNode(pFound, pNode)) {
+ break;
+ }
+ }
+ return pFound;
+}
+
+int32_t nodesListDeduplicate(SNodeList** ppList) {
+ if (!ppList || LIST_LENGTH(*ppList) <= 1) return TSDB_CODE_SUCCESS;
+ if (LIST_LENGTH(*ppList) == 2) {
+ SNode* pNode1 = nodesListGetNode(*ppList, 0);
+ SNode* pNode2 = nodesListGetNode(*ppList, 1);
+ if (nodesEqualNode(pNode1, pNode2)) {
+ SListCell* pCell = nodesListGetCell(*ppList, 1);
+ (void)nodesListErase(*ppList, pCell);
+ }
+ return TSDB_CODE_SUCCESS;
+ }
+ SNodeList* pTmp = NULL;
+ int32_t code = nodesMakeList(&pTmp);
+ if (TSDB_CODE_SUCCESS == code) {
+ SNode* pNode = NULL;
+ FOREACH(pNode, *ppList) {
+ SNode* pFound = nodesListFindNode(pTmp, pNode);
+ if (NULL == pFound) {
+ code = nodesCloneNode(pNode, &pFound);
+ if (TSDB_CODE_SUCCESS == code) code = nodesListStrictAppend(pTmp, pFound);
+ if (TSDB_CODE_SUCCESS != code) break;
+ }
+ }
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ nodesDestroyList(*ppList);
+ *ppList = pTmp;
+ } else {
+ nodesDestroyList(pTmp);
+ }
+ return code;
+}
diff --git a/source/libs/parser/inc/parUtil.h b/source/libs/parser/inc/parUtil.h
index 857c7604a9..7298b04eb0 100644
--- a/source/libs/parser/inc/parUtil.h
+++ b/source/libs/parser/inc/parUtil.h
@@ -115,6 +115,7 @@ typedef struct SParseMetaCache {
SHashObj* pTableName; // key is tbFUid, elements is STableMeta*(append with tbName)
SArray* pDnodes; // element is SEpSet
bool dnodeRequired;
+ bool forceFetchViewMeta;
} SParseMetaCache;
int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...);
diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c
index eecc04658b..b78e10768f 100644
--- a/source/libs/parser/src/parAstParser.c
+++ b/source/libs/parser/src/parAstParser.c
@@ -810,7 +810,7 @@ static int32_t collectMetaKeyFromShowCreateView(SCollectMetaKeyCxt* pCxt, SShowC
if (TSDB_CODE_SUCCESS == code) {
code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
}
-
+ pCxt->pMetaCache->forceFetchViewMeta = true;
return code;
}
@@ -888,6 +888,7 @@ static int32_t collectMetaKeyFromCreateViewStmt(SCollectMetaKeyCxt* pCxt, SCreat
static int32_t collectMetaKeyFromDropViewStmt(SCollectMetaKeyCxt* pCxt, SDropViewStmt* pStmt) {
int32_t code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName,
pStmt->viewName, AUTH_TYPE_ALTER, pCxt->pMetaCache);
+ pCxt->pMetaCache->forceFetchViewMeta = true;
return code;
}
diff --git a/source/libs/parser/src/parCalcConst.c b/source/libs/parser/src/parCalcConst.c
index e757ec8b24..9702c2e760 100644
--- a/source/libs/parser/src/parCalcConst.c
+++ b/source/libs/parser/src/parCalcConst.c
@@ -336,7 +336,10 @@ static int32_t calcConstGroupBy(SCalcConstContext* pCxt, SSelectStmt* pSelect) {
}
}
}
- NODES_DESTORY_LIST(pSelect->pGroupByList);
+ FOREACH(pNode, pSelect->pGroupByList) {
+ if (!cell->pPrev) continue;
+ ERASE_NODE(pSelect->pGroupByList);
+ }
}
return code;
}
diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c
index 99c03c412c..9bea3491c3 100755
--- a/source/libs/parser/src/parTranslater.c
+++ b/source/libs/parser/src/parTranslater.c
@@ -3311,11 +3311,11 @@ static int32_t selectCommonType(SDataType* commonType, const SDataType* newType)
} else {
resultType = gDisplyTypes[type2][type1];
}
-
+
if (resultType == -1) {
return TSDB_CODE_SCALAR_CONVERT_ERROR;
}
-
+
if (commonType->type == newType->type) {
commonType->bytes = TMAX(commonType->bytes, newType->bytes);
return TSDB_CODE_SUCCESS;
@@ -3328,9 +3328,9 @@ static int32_t selectCommonType(SDataType* commonType, const SDataType* newType)
} else {
commonType->bytes = TMAX(TMAX(commonType->bytes, newType->bytes), TYPE_BYTES[resultType]);
}
-
+
commonType->type = resultType;
-
+
return TSDB_CODE_SUCCESS;
}
@@ -13127,7 +13127,7 @@ static int32_t extractShowCreateViewResultSchema(int32_t* numOfCols, SSchema** p
}
static int32_t extractShowVariablesResultSchema(int32_t* numOfCols, SSchema** pSchema) {
- *numOfCols = 3;
+ *numOfCols = SHOW_LOCAL_VARIABLES_RESULT_COLS; // SHOW_VARIABLES_RESULT_COLS
*pSchema = taosMemoryCalloc((*numOfCols), sizeof(SSchema));
if (NULL == (*pSchema)) {
return terrno;
@@ -13138,13 +13138,17 @@ static int32_t extractShowVariablesResultSchema(int32_t* numOfCols, SSchema** pS
strcpy((*pSchema)[0].name, "name");
(*pSchema)[1].type = TSDB_DATA_TYPE_BINARY;
- (*pSchema)[1].bytes = TSDB_CONFIG_VALUE_LEN;
+ (*pSchema)[1].bytes = TSDB_CONFIG_PATH_LEN;
strcpy((*pSchema)[1].name, "value");
(*pSchema)[2].type = TSDB_DATA_TYPE_BINARY;
(*pSchema)[2].bytes = TSDB_CONFIG_SCOPE_LEN;
strcpy((*pSchema)[2].name, "scope");
+ (*pSchema)[3].type = TSDB_DATA_TYPE_BINARY;
+ (*pSchema)[3].bytes = TSDB_CONFIG_INFO_LEN;
+ strcpy((*pSchema)[3].name, "info");
+
return TSDB_CODE_SUCCESS;
}
diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c
index e35eea9e72..44e44982a3 100644
--- a/source/libs/parser/src/parUtil.c
+++ b/source/libs/parser/src/parUtil.c
@@ -817,6 +817,7 @@ int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalog
}
#endif
pCatalogReq->dNodeRequired = pMetaCache->dnodeRequired;
+ pCatalogReq->forceFetchViewMeta = pMetaCache->forceFetchViewMeta;
return code;
}
diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c
index 09a4b9c593..fd4e42f256 100644
--- a/source/libs/planner/src/planLogicCreater.c
+++ b/source/libs/planner/src/planLogicCreater.c
@@ -838,8 +838,11 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
}
if (NULL != pSelect->pGroupByList) {
- pAgg->pGroupKeys = NULL;
- code = nodesCloneList(pSelect->pGroupByList, &pAgg->pGroupKeys);
+ code = nodesListDeduplicate(&pSelect->pGroupByList);
+ if (TSDB_CODE_SUCCESS == code) {
+ pAgg->pGroupKeys = NULL;
+ code = nodesCloneList(pSelect->pGroupByList, &pAgg->pGroupKeys);
+ }
}
// rewrite the expression in subsequent clauses
diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c
index 885faa5461..a1809ff137 100644
--- a/source/libs/planner/src/planOptimizer.c
+++ b/source/libs/planner/src/planOptimizer.c
@@ -204,6 +204,7 @@ static void optSetParentOrder(SLogicNode* pNode, EOrder order, SLogicNode* pNode
// case QUERY_NODE_LOGIC_PLAN_WINDOW:
case QUERY_NODE_LOGIC_PLAN_AGG:
case QUERY_NODE_LOGIC_PLAN_SORT:
+ case QUERY_NODE_LOGIC_PLAN_FILL:
if (pNode == pNodeForcePropagate) {
pNode->outputTsOrder = order;
break;
@@ -3491,37 +3492,77 @@ static void eliminateProjPushdownProjIdx(SNodeList* pParentProjects, SNodeList*
}
}
+static int32_t eliminateProjOptFindProjPrefixWithOrderCheck(SProjectLogicNode* pProj, SProjectLogicNode* pChild, SNodeList** pNewChildTargets, bool *orderMatch) {
+ int32_t code = 0;
+ SNode* pProjection = NULL, *pChildTarget = NULL;
+ *orderMatch = true;
+ FORBOTH(pProjection, pProj->pProjections, pChildTarget, pChild->node.pTargets) {
+ if (!pProjection) break;
+ if (0 != strcmp(((SColumnNode*)pProjection)->colName, ((SColumnNode*)pChildTarget)->colName)) {
+ *orderMatch = false;
+ break;
+ }
+ if (pNewChildTargets) {
+ SNode* pNew = NULL;
+ code = nodesCloneNode(pChildTarget, &pNew);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = nodesListMakeStrictAppend(pNewChildTargets, pNew);
+ }
+ if (TSDB_CODE_SUCCESS != code && pNewChildTargets) {
+ nodesDestroyList(*pNewChildTargets);
+ *pNewChildTargets = NULL;
+ break;
+ }
+ }
+ }
+ return code;
+}
+
+static int32_t eliminateProjOptPushTargetsToSetOpChildren(SProjectLogicNode* pSetOp) {
+ SNode* pChildProj = NULL;
+ int32_t code = 0;
+ bool orderMatch = false;
+ FOREACH(pChildProj, pSetOp->node.pChildren) {
+ if (QUERY_NODE_LOGIC_PLAN_PROJECT == nodeType(pChildProj)) {
+ SProjectLogicNode* pChildLogic = (SProjectLogicNode*)pChildProj;
+ SNodeList* pNewChildTargetsForChild = NULL;
+ code = eliminateProjOptFindProjPrefixWithOrderCheck(pSetOp, pChildLogic, &pNewChildTargetsForChild, &orderMatch);
+ if (TSDB_CODE_SUCCESS != code) break;
+ nodesDestroyList(pChildLogic->node.pTargets);
+ pChildLogic->node.pTargets = pNewChildTargetsForChild;
+ alignProjectionWithTarget((SLogicNode*)pChildLogic);
+ if (pChildLogic->isSetOpProj) {
+ code = eliminateProjOptPushTargetsToSetOpChildren(pChildLogic);
+ if (TSDB_CODE_SUCCESS != code) break;
+ }
+ }
+ }
+ return code;
+}
+
static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan,
SProjectLogicNode* pProjectNode) {
SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProjectNode->node.pChildren, 0);
int32_t code = 0;
+ bool isSetOpProj = false;
+ bool orderMatch = false;
+ bool sizeMatch = LIST_LENGTH(pProjectNode->pProjections) == LIST_LENGTH(pChild->pTargets);
+ bool needReplaceTargets = true;
if (NULL == pProjectNode->node.pParent) {
SNodeList* pNewChildTargets = NULL;
- code = nodesMakeList(&pNewChildTargets);
- if (TSDB_CODE_SUCCESS != code) {
- return code;
- }
SNode * pProjection = NULL, *pChildTarget = NULL;
- bool orderMatch = true;
- bool needOrderMatch =
+ isSetOpProj =
QUERY_NODE_LOGIC_PLAN_PROJECT == nodeType(pChild) && ((SProjectLogicNode*)pChild)->isSetOpProj;
- if (needOrderMatch) {
+ if (isSetOpProj) {
// For sql: select ... from (select ... union all select ...);
// When eliminating the outer proj (the outer select), we have to make sure that the outer proj projections and
// union all project targets have same columns in the same order. See detail in TD-30188
- FORBOTH(pProjection, pProjectNode->pProjections, pChildTarget, pChild->pTargets) {
- if (!pProjection) break;
- if (0 != strcmp(((SColumnNode*)pProjection)->colName, ((SColumnNode*)pChildTarget)->colName)) {
- orderMatch = false;
- break;
- }
- SNode* pNew = NULL;
- code = nodesCloneNode(pChildTarget, &pNew);
- if (TSDB_CODE_SUCCESS == code) {
- code = nodesListStrictAppend(pNewChildTargets, pNew);
- }
- if (TSDB_CODE_SUCCESS != code) break;
+ code = eliminateProjOptFindProjPrefixWithOrderCheck(pProjectNode, (SProjectLogicNode*)pChild,
+ sizeMatch ? NULL : &pNewChildTargets, &orderMatch);
+ if (TSDB_CODE_SUCCESS == code && sizeMatch && orderMatch) {
+ pNewChildTargets = pChild->pTargets;
+ needReplaceTargets = false;
}
} else {
FOREACH(pProjection, pProjectNode->pProjections) {
@@ -3530,7 +3571,7 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan*
SNode* pNew = NULL;
code = nodesCloneNode(pChildTarget, &pNew);
if (TSDB_CODE_SUCCESS == code) {
- code = nodesListStrictAppend(pNewChildTargets, pNew);
+ code = nodesListMakeStrictAppend(&pNewChildTargets, pNew);
}
break;
}
@@ -3545,12 +3586,13 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan*
return code;
}
- if (eliminateProjOptCanChildConditionUseChildTargets(pChild, pNewChildTargets) &&
- (!needOrderMatch || (needOrderMatch && orderMatch))) {
- nodesDestroyList(pChild->pTargets);
- pChild->pTargets = pNewChildTargets;
+ if (eliminateProjOptCanChildConditionUseChildTargets(pChild, pNewChildTargets) && (!isSetOpProj || orderMatch)) {
+ if (needReplaceTargets) {
+ nodesDestroyList(pChild->pTargets);
+ pChild->pTargets = pNewChildTargets;
+ }
} else {
- nodesDestroyList(pNewChildTargets);
+ if (needReplaceTargets) nodesDestroyList(pNewChildTargets);
OPTIMIZE_FLAG_SET_MASK(pProjectNode->node.optimizedFlag, OPTIMIZE_FLAG_ELIMINATE_PROJ);
pCxt->optimized = true;
return TSDB_CODE_SUCCESS;
@@ -3573,7 +3615,11 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan*
NODES_CLEAR_LIST(pProjectNode->node.pChildren);
nodesDestroyNode((SNode*)pProjectNode);
// if pChild is a project logic node, remove its projection which is not reference by its target.
- alignProjectionWithTarget(pChild);
+ if (needReplaceTargets) {
+ alignProjectionWithTarget(pChild);
+ // Since we have eliminated the outer proj, we need to push down the new targets to the children of the set operation.
+ if (isSetOpProj && orderMatch && !sizeMatch) code = eliminateProjOptPushTargetsToSetOpChildren((SProjectLogicNode*)pChild);
+ }
}
pCxt->optimized = true;
return code;
diff --git a/source/libs/stream/src/streamCheckpoint.c b/source/libs/stream/src/streamCheckpoint.c
index 7724d1c5ff..2280b7f06f 100644
--- a/source/libs/stream/src/streamCheckpoint.c
+++ b/source/libs/stream/src/streamCheckpoint.c
@@ -222,14 +222,14 @@ static int32_t doCheckBeforeHandleChkptTrigger(SStreamTask* pTask, int64_t check
stError("s-task:%s vgId:%d current checkpointId:%" PRId64
" recv expired checkpoint-trigger block, checkpointId:%" PRId64 " transId:%d, discard",
id, vgId, pTask->chkInfo.checkpointId, checkpointId, transId);
- return code;
+ return TSDB_CODE_STREAM_TASK_NOT_EXIST;
}
if (pActiveInfo->failedId >= checkpointId) {
stError("s-task:%s vgId:%d checkpointId:%" PRId64 " transId:%d, has been marked failed, failedId:%" PRId64
" discard the checkpoint-trigger block",
id, vgId, checkpointId, transId, pActiveInfo->failedId);
- return code;
+ return TSDB_CODE_STREAM_TASK_NOT_EXIST;
}
if (pTask->chkInfo.checkpointId == checkpointId) {
@@ -255,8 +255,7 @@ static int32_t doCheckBeforeHandleChkptTrigger(SStreamTask* pTask, int64_t check
"the interrupted checkpoint",
id, vgId, pBlock->srcTaskId);
- streamTaskOpenUpstreamInput(pTask, pBlock->srcTaskId);
- return code;
+ return TSDB_CODE_STREAM_INVLD_CHKPT;
}
if (streamTaskGetStatus(pTask).state == TASK_STATUS__CK) {
@@ -264,14 +263,14 @@ static int32_t doCheckBeforeHandleChkptTrigger(SStreamTask* pTask, int64_t check
stError("s-task:%s vgId:%d active checkpointId:%" PRId64 ", recv invalid checkpoint-trigger checkpointId:%" PRId64
" discard",
id, vgId, pActiveInfo->activeId, checkpointId);
- return code;
+ return TSDB_CODE_STREAM_INVLD_CHKPT;
} else { // checkpointId == pActiveInfo->activeId
if (pActiveInfo->allUpstreamTriggerRecv == 1) {
stDebug(
"s-task:%s vgId:%d all upstream checkpoint-trigger recv, discard this checkpoint-trigger, "
"checkpointId:%" PRId64 " transId:%d",
id, vgId, checkpointId, transId);
- return code;
+ return TSDB_CODE_STREAM_INVLD_CHKPT;
}
if (taskLevel == TASK_LEVEL__SINK || taskLevel == TASK_LEVEL__AGG) {
@@ -286,14 +285,14 @@ static int32_t doCheckBeforeHandleChkptTrigger(SStreamTask* pTask, int64_t check
stWarn("s-task:%s repeatly recv checkpoint-source msg from task:0x%x vgId:%d, checkpointId:%" PRId64
", prev recvTs:%" PRId64 " discard",
pTask->id.idStr, p->upstreamTaskId, p->upstreamNodeId, p->checkpointId, p->recvTs);
- return code;
+ return TSDB_CODE_STREAM_INVLD_CHKPT;
}
}
}
}
}
- return 0;
+ return TSDB_CODE_SUCCESS;
}
int32_t streamProcessCheckpointTriggerBlock(SStreamTask* pTask, SStreamDataBlock* pBlock) {
@@ -317,6 +316,10 @@ int32_t streamProcessCheckpointTriggerBlock(SStreamTask* pTask, SStreamDataBlock
code = doCheckBeforeHandleChkptTrigger(pTask, checkpointId, pBlock, transId);
streamMutexUnlock(&pTask->lock);
if (code) {
+ if (taskLevel != TASK_LEVEL__SOURCE) { // the checkpoint-trigger is discard, open the inputQ for upstream tasks
+ streamTaskOpenUpstreamInput(pTask, pBlock->srcTaskId);
+ }
+
streamFreeQitem((SStreamQueueItem*)pBlock);
return code;
}
@@ -359,6 +362,10 @@ int32_t streamProcessCheckpointTriggerBlock(SStreamTask* pTask, SStreamDataBlock
}
}
+#if 0
+ taosMsleep(20*1000);
+#endif
+
if (taskLevel == TASK_LEVEL__SOURCE) {
int8_t type = pTask->outputInfo.type;
pActiveInfo->allUpstreamTriggerRecv = 1;
diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c
index e0fa199199..5807240f5e 100644
--- a/source/libs/stream/src/streamDispatch.c
+++ b/source/libs/stream/src/streamDispatch.c
@@ -1170,6 +1170,7 @@ int32_t streamTaskSendCheckpointReadyMsg(SStreamTask* pTask) {
if (taosArrayGetSize(pTask->upstreamInfo.pList) != num) {
stError("s-task:%s invalid number of sent readyMsg:%d to upstream:%d", id, num,
(int32_t)taosArrayGetSize(pTask->upstreamInfo.pList));
+ streamMutexUnlock(&pActiveInfo->lock);
return TSDB_CODE_STREAM_INTERNAL_ERROR;
}
@@ -1412,6 +1413,7 @@ int32_t streamAddCheckpointSourceRspMsg(SStreamCheckpointSourceReq* pReq, SRpcHa
if (size > 0) {
STaskCheckpointReadyInfo* pReady = taosArrayGet(pActiveInfo->pReadyMsgList, 0);
if (pReady == NULL) {
+ streamMutexUnlock(&pActiveInfo->lock);
return terrno;
}
diff --git a/source/libs/stream/src/streamStartTask.c b/source/libs/stream/src/streamStartTask.c
index ed12687e41..9c16ff036e 100644
--- a/source/libs/stream/src/streamStartTask.c
+++ b/source/libs/stream/src/streamStartTask.c
@@ -433,6 +433,7 @@ int32_t streamMetaStopAllTasks(SStreamMeta* pMeta) {
// send hb msg to mnode before closing all tasks.
int32_t code = streamMetaSendMsgBeforeCloseTasks(pMeta, &pTaskList);
if (code != TSDB_CODE_SUCCESS) {
+ streamMetaRUnLock(pMeta);
return code;
}
diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c
index 1a9652b3bb..66ead2fd26 100644
--- a/source/libs/wal/src/walWrite.c
+++ b/source/libs/wal/src/walWrite.c
@@ -376,6 +376,10 @@ static FORCE_INLINE int32_t walCheckAndRoll(SWal *pWal) {
int32_t walBeginSnapshot(SWal *pWal, int64_t ver, int64_t logRetention) {
int32_t code = 0;
+ if (pWal->cfg.level == TAOS_WAL_SKIP) {
+ TAOS_RETURN(TSDB_CODE_SUCCESS);
+ }
+
if (logRetention < 0) {
TAOS_RETURN(TSDB_CODE_FAILED);
}
@@ -404,6 +408,10 @@ _exit:
int32_t walEndSnapshot(SWal *pWal) {
int32_t code = 0, lino = 0;
+ if (pWal->cfg.level == TAOS_WAL_SKIP) {
+ TAOS_RETURN(TSDB_CODE_SUCCESS);
+ }
+
TAOS_UNUSED(taosThreadRwlockWrlock(&pWal->mutex));
int64_t ver = pWal->vers.verInSnapshotting;
diff --git a/source/libs/wal/test/walMetaTest.cpp b/source/libs/wal/test/walMetaTest.cpp
index 3e6fab116f..a958ad74e0 100644
--- a/source/libs/wal/test/walMetaTest.cpp
+++ b/source/libs/wal/test/walMetaTest.cpp
@@ -510,4 +510,27 @@ TEST_F(WalSkipLevel, restart) {
TearDown();
SetUp();
+}
+
+TEST_F(WalSkipLevel, roll) {
+ int code;
+ int i;
+ for (i = 0; i < 100; i++) {
+ code = walAppendLog(pWal, i, 0, syncMeta, (void*)ranStr, ranStrLen);
+ ASSERT_EQ(code, 0);
+ code = walCommit(pWal, i);
+ }
+ walBeginSnapshot(pWal, i - 1, 0);
+ walEndSnapshot(pWal);
+ code = walAppendLog(pWal, 5, 0, syncMeta, (void*)ranStr, ranStrLen);
+ ASSERT_NE(code, 0);
+ for (; i < 200; i++) {
+ code = walAppendLog(pWal, i, 0, syncMeta, (void*)ranStr, ranStrLen);
+ ASSERT_EQ(code, 0);
+ code = walCommit(pWal, i);
+ }
+ code = walBeginSnapshot(pWal, i - 1, 0);
+ ASSERT_EQ(code, 0);
+ code = walEndSnapshot(pWal);
+ ASSERT_EQ(code, 0);
}
\ No newline at end of file
diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c
index f9bd41a400..d2a2b1fb9a 100644
--- a/source/util/src/tconfig.c
+++ b/source/util/src/tconfig.c
@@ -881,11 +881,26 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) {
case CFG_DTYPE_CHARSET:
case CFG_DTYPE_TIMEZONE:
case CFG_DTYPE_NONE:
+ if (strcasecmp(pItem->name, "dataDir") == 0) {
+ size_t sz = taosArrayGetSize(pItem->array);
+ if (sz > 1) {
+ for (size_t j = 0; j < sz; ++j) {
+ SDiskCfg *pCfg = taosArrayGet(pItem->array, j);
+ if (dump) {
+ (void)printf("%s %s %s l:%d p:%d d:%"PRIi8"\n", src, name, pCfg->dir, pCfg->level, pCfg->primary, pCfg->disable);
+ } else {
+ uInfo("%s %s %s l:%d p:%d d:%"PRIi8, src, name, pCfg->dir, pCfg->level, pCfg->primary, pCfg->disable);
+ }
+ }
+ break;
+ }
+ }
if (dump) {
(void)printf("%s %s %s\n", src, name, pItem->str);
} else {
uInfo("%s %s %s", src, name, pItem->str);
}
+
break;
}
}
diff --git a/source/util/src/terror.c b/source/util/src/terror.c
index 0d8a85155a..00f72123dc 100644
--- a/source/util/src/terror.c
+++ b/source/util/src/terror.c
@@ -853,7 +853,8 @@ TAOS_DEFINE_ERROR(TSDB_CODE_STREAM_TASK_IVLD_STATUS, "Invalid task status
TAOS_DEFINE_ERROR(TSDB_CODE_STREAM_CONFLICT_EVENT, "Stream conflict event")
TAOS_DEFINE_ERROR(TSDB_CODE_STREAM_INTERNAL_ERROR, "Stream internal error")
TAOS_DEFINE_ERROR(TSDB_CODE_STREAM_NOT_LEADER, "Stream task not on leader vnode")
-TAOS_DEFINE_ERROR(TSDB_CODE_STREAM_INPUTQ_FULL, "Task input queue is full")
+TAOS_DEFINE_ERROR(TSDB_CODE_STREAM_INPUTQ_FULL, "Task input queue is full")
+TAOS_DEFINE_ERROR(TSDB_CODE_STREAM_INVLD_CHKPT, "Invalid checkpoint trigger msg")
// TDLite
TAOS_DEFINE_ERROR(TSDB_CODE_TDLITE_IVLD_OPEN_FLAGS, "Invalid TDLite open flags")
diff --git a/tests/army/query/function/ans/interp.csv b/tests/army/query/function/ans/interp.csv
index e1ba236aa1..3eaccd887a 100644
--- a/tests/army/query/function/ans/interp.csv
+++ b/tests/army/query/function/ans/interp.csv
@@ -366,3 +366,652 @@ taos> select _irowts as irowts ,tbname as table_name, c2 as c_c2, c3 as c_c3, _i
2020-02-01 00:00:16.000 | td32727 | 10 | 10 | true | 1 |
2020-02-01 00:00:16.000 | td32727 | 15 | 15 | true | 1 |
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(null);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(prev);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(next);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(linear);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(null);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(value, 1);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(prev);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(next);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(linear);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(null);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(prev);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(next);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(linear);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(null);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | NULL |
+ 2020-01-01 00:00:23.000 | true | NULL |
+ 2020-01-01 00:00:24.000 | true | NULL |
+ 2020-01-01 00:00:25.000 | true | NULL |
+ 2020-01-01 00:00:26.000 | true | NULL |
+ 2020-01-01 00:00:27.000 | true | NULL |
+ 2020-01-01 00:00:28.000 | true | NULL |
+ 2020-01-01 00:00:29.000 | true | NULL |
+ 2020-01-01 00:00:30.000 | true | NULL |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | 1 |
+ 2020-01-01 00:00:23.000 | true | 1 |
+ 2020-01-01 00:00:24.000 | true | 1 |
+ 2020-01-01 00:00:25.000 | true | 1 |
+ 2020-01-01 00:00:26.000 | true | 1 |
+ 2020-01-01 00:00:27.000 | true | 1 |
+ 2020-01-01 00:00:28.000 | true | 1 |
+ 2020-01-01 00:00:29.000 | true | 1 |
+ 2020-01-01 00:00:30.000 | true | 1 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(prev);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | 21 |
+ 2020-01-01 00:00:23.000 | true | 21 |
+ 2020-01-01 00:00:24.000 | true | 21 |
+ 2020-01-01 00:00:25.000 | true | 21 |
+ 2020-01-01 00:00:26.000 | true | 21 |
+ 2020-01-01 00:00:27.000 | true | 21 |
+ 2020-01-01 00:00:28.000 | true | 21 |
+ 2020-01-01 00:00:29.000 | true | 21 |
+ 2020-01-01 00:00:30.000 | true | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(next);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(linear);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(null);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | NULL |
+ 2020-01-01 00:00:17.000 | true | NULL |
+ 2020-01-01 00:00:18.000 | true | NULL |
+ 2020-01-01 00:00:19.000 | true | NULL |
+ 2020-01-01 00:00:20.000 | true | NULL |
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | NULL |
+ 2020-01-01 00:00:23.000 | true | NULL |
+ 2020-01-01 00:00:24.000 | true | NULL |
+ 2020-01-01 00:00:25.000 | true | NULL |
+ 2020-01-01 00:00:26.000 | true | NULL |
+ 2020-01-01 00:00:27.000 | true | NULL |
+ 2020-01-01 00:00:28.000 | true | NULL |
+ 2020-01-01 00:00:29.000 | true | NULL |
+ 2020-01-01 00:00:30.000 | true | NULL |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 1 |
+ 2020-01-01 00:00:17.000 | true | 1 |
+ 2020-01-01 00:00:18.000 | true | 1 |
+ 2020-01-01 00:00:19.000 | true | 1 |
+ 2020-01-01 00:00:20.000 | true | 1 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | 1 |
+ 2020-01-01 00:00:23.000 | true | 1 |
+ 2020-01-01 00:00:24.000 | true | 1 |
+ 2020-01-01 00:00:25.000 | true | 1 |
+ 2020-01-01 00:00:26.000 | true | 1 |
+ 2020-01-01 00:00:27.000 | true | 1 |
+ 2020-01-01 00:00:28.000 | true | 1 |
+ 2020-01-01 00:00:29.000 | true | 1 |
+ 2020-01-01 00:00:30.000 | true | 1 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(prev);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 15 |
+ 2020-01-01 00:00:17.000 | true | 15 |
+ 2020-01-01 00:00:18.000 | true | 15 |
+ 2020-01-01 00:00:19.000 | true | 15 |
+ 2020-01-01 00:00:20.000 | true | 15 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | 21 |
+ 2020-01-01 00:00:23.000 | true | 21 |
+ 2020-01-01 00:00:24.000 | true | 21 |
+ 2020-01-01 00:00:25.000 | true | 21 |
+ 2020-01-01 00:00:26.000 | true | 21 |
+ 2020-01-01 00:00:27.000 | true | 21 |
+ 2020-01-01 00:00:28.000 | true | 21 |
+ 2020-01-01 00:00:29.000 | true | 21 |
+ 2020-01-01 00:00:30.000 | true | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(next);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 21 |
+ 2020-01-01 00:00:17.000 | true | 21 |
+ 2020-01-01 00:00:18.000 | true | 21 |
+ 2020-01-01 00:00:19.000 | true | 21 |
+ 2020-01-01 00:00:20.000 | true | 21 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(linear);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 16 |
+ 2020-01-01 00:00:17.000 | true | 17 |
+ 2020-01-01 00:00:18.000 | true | 18 |
+ 2020-01-01 00:00:19.000 | true | 19 |
+ 2020-01-01 00:00:20.000 | true | 20 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(null);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | NULL |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | NULL |
+ 2020-01-01 00:00:05.000 | true | NULL |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | NULL |
+ 2020-01-01 00:00:08.000 | true | NULL |
+ 2020-01-01 00:00:09.000 | true | NULL |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | NULL |
+ 2020-01-01 00:00:12.000 | true | NULL |
+ 2020-01-01 00:00:13.000 | true | NULL |
+ 2020-01-01 00:00:14.000 | true | NULL |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | NULL |
+ 2020-01-01 00:00:17.000 | true | NULL |
+ 2020-01-01 00:00:18.000 | true | NULL |
+ 2020-01-01 00:00:19.000 | true | NULL |
+ 2020-01-01 00:00:20.000 | true | NULL |
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | NULL |
+ 2020-01-01 00:00:23.000 | true | NULL |
+ 2020-01-01 00:00:24.000 | true | NULL |
+ 2020-01-01 00:00:25.000 | true | NULL |
+ 2020-01-01 00:00:26.000 | true | NULL |
+ 2020-01-01 00:00:27.000 | true | NULL |
+ 2020-01-01 00:00:28.000 | true | NULL |
+ 2020-01-01 00:00:29.000 | true | NULL |
+ 2020-01-01 00:00:30.000 | true | NULL |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 1 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 1 |
+ 2020-01-01 00:00:05.000 | true | 1 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 1 |
+ 2020-01-01 00:00:08.000 | true | 1 |
+ 2020-01-01 00:00:09.000 | true | 1 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 1 |
+ 2020-01-01 00:00:12.000 | true | 1 |
+ 2020-01-01 00:00:13.000 | true | 1 |
+ 2020-01-01 00:00:14.000 | true | 1 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 1 |
+ 2020-01-01 00:00:17.000 | true | 1 |
+ 2020-01-01 00:00:18.000 | true | 1 |
+ 2020-01-01 00:00:19.000 | true | 1 |
+ 2020-01-01 00:00:20.000 | true | 1 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | 1 |
+ 2020-01-01 00:00:23.000 | true | 1 |
+ 2020-01-01 00:00:24.000 | true | 1 |
+ 2020-01-01 00:00:25.000 | true | 1 |
+ 2020-01-01 00:00:26.000 | true | 1 |
+ 2020-01-01 00:00:27.000 | true | 1 |
+ 2020-01-01 00:00:28.000 | true | 1 |
+ 2020-01-01 00:00:29.000 | true | 1 |
+ 2020-01-01 00:00:30.000 | true | 1 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(prev);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 1 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 3 |
+ 2020-01-01 00:00:05.000 | true | 3 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 6 |
+ 2020-01-01 00:00:08.000 | true | 6 |
+ 2020-01-01 00:00:09.000 | true | 6 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 10 |
+ 2020-01-01 00:00:12.000 | true | 10 |
+ 2020-01-01 00:00:13.000 | true | 10 |
+ 2020-01-01 00:00:14.000 | true | 10 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 15 |
+ 2020-01-01 00:00:17.000 | true | 15 |
+ 2020-01-01 00:00:18.000 | true | 15 |
+ 2020-01-01 00:00:19.000 | true | 15 |
+ 2020-01-01 00:00:20.000 | true | 15 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+ 2020-01-01 00:00:22.000 | true | 21 |
+ 2020-01-01 00:00:23.000 | true | 21 |
+ 2020-01-01 00:00:24.000 | true | 21 |
+ 2020-01-01 00:00:25.000 | true | 21 |
+ 2020-01-01 00:00:26.000 | true | 21 |
+ 2020-01-01 00:00:27.000 | true | 21 |
+ 2020-01-01 00:00:28.000 | true | 21 |
+ 2020-01-01 00:00:29.000 | true | 21 |
+ 2020-01-01 00:00:30.000 | true | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(next);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 3 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 6 |
+ 2020-01-01 00:00:05.000 | true | 6 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 10 |
+ 2020-01-01 00:00:08.000 | true | 10 |
+ 2020-01-01 00:00:09.000 | true | 10 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 15 |
+ 2020-01-01 00:00:12.000 | true | 15 |
+ 2020-01-01 00:00:13.000 | true | 15 |
+ 2020-01-01 00:00:14.000 | true | 15 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 21 |
+ 2020-01-01 00:00:17.000 | true | 21 |
+ 2020-01-01 00:00:18.000 | true | 21 |
+ 2020-01-01 00:00:19.000 | true | 21 |
+ 2020-01-01 00:00:20.000 | true | 21 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(linear);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 2 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 4 |
+ 2020-01-01 00:00:05.000 | true | 5 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 7 |
+ 2020-01-01 00:00:08.000 | true | 8 |
+ 2020-01-01 00:00:09.000 | true | 9 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 11 |
+ 2020-01-01 00:00:12.000 | true | 12 |
+ 2020-01-01 00:00:13.000 | true | 13 |
+ 2020-01-01 00:00:14.000 | true | 14 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 16 |
+ 2020-01-01 00:00:17.000 | true | 17 |
+ 2020-01-01 00:00:18.000 | true | 18 |
+ 2020-01-01 00:00:19.000 | true | 19 |
+ 2020-01-01 00:00:20.000 | true | 20 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | NULL |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | NULL |
+ 2020-01-01 00:00:05.000 | true | NULL |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | NULL |
+ 2020-01-01 00:00:08.000 | true | NULL |
+ 2020-01-01 00:00:09.000 | true | NULL |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | NULL |
+ 2020-01-01 00:00:12.000 | true | NULL |
+ 2020-01-01 00:00:13.000 | true | NULL |
+ 2020-01-01 00:00:14.000 | true | NULL |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | NULL |
+ 2020-01-01 00:00:17.000 | true | NULL |
+ 2020-01-01 00:00:18.000 | true | NULL |
+ 2020-01-01 00:00:19.000 | true | NULL |
+ 2020-01-01 00:00:20.000 | true | NULL |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 1 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 1 |
+ 2020-01-01 00:00:05.000 | true | 1 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 1 |
+ 2020-01-01 00:00:08.000 | true | 1 |
+ 2020-01-01 00:00:09.000 | true | 1 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 1 |
+ 2020-01-01 00:00:12.000 | true | 1 |
+ 2020-01-01 00:00:13.000 | true | 1 |
+ 2020-01-01 00:00:14.000 | true | 1 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 1 |
+ 2020-01-01 00:00:17.000 | true | 1 |
+ 2020-01-01 00:00:18.000 | true | 1 |
+ 2020-01-01 00:00:19.000 | true | 1 |
+ 2020-01-01 00:00:20.000 | true | 1 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 1 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 3 |
+ 2020-01-01 00:00:05.000 | true | 3 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 6 |
+ 2020-01-01 00:00:08.000 | true | 6 |
+ 2020-01-01 00:00:09.000 | true | 6 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 10 |
+ 2020-01-01 00:00:12.000 | true | 10 |
+ 2020-01-01 00:00:13.000 | true | 10 |
+ 2020-01-01 00:00:14.000 | true | 10 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 15 |
+ 2020-01-01 00:00:17.000 | true | 15 |
+ 2020-01-01 00:00:18.000 | true | 15 |
+ 2020-01-01 00:00:19.000 | true | 15 |
+ 2020-01-01 00:00:20.000 | true | 15 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 3 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 6 |
+ 2020-01-01 00:00:05.000 | true | 6 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 10 |
+ 2020-01-01 00:00:08.000 | true | 10 |
+ 2020-01-01 00:00:09.000 | true | 10 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 15 |
+ 2020-01-01 00:00:12.000 | true | 15 |
+ 2020-01-01 00:00:13.000 | true | 15 |
+ 2020-01-01 00:00:14.000 | true | 15 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 21 |
+ 2020-01-01 00:00:17.000 | true | 21 |
+ 2020-01-01 00:00:18.000 | true | 21 |
+ 2020-01-01 00:00:19.000 | true | 21 |
+ 2020-01-01 00:00:20.000 | true | 21 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | false | 0 |
+ 2020-01-01 00:00:01.000 | false | 1 |
+ 2020-01-01 00:00:02.000 | true | 2 |
+ 2020-01-01 00:00:03.000 | false | 3 |
+ 2020-01-01 00:00:04.000 | true | 4 |
+ 2020-01-01 00:00:05.000 | true | 5 |
+ 2020-01-01 00:00:06.000 | false | 6 |
+ 2020-01-01 00:00:07.000 | true | 7 |
+ 2020-01-01 00:00:08.000 | true | 8 |
+ 2020-01-01 00:00:09.000 | true | 9 |
+ 2020-01-01 00:00:10.000 | false | 10 |
+ 2020-01-01 00:00:11.000 | true | 11 |
+ 2020-01-01 00:00:12.000 | true | 12 |
+ 2020-01-01 00:00:13.000 | true | 13 |
+ 2020-01-01 00:00:14.000 | true | 14 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 16 |
+ 2020-01-01 00:00:17.000 | true | 17 |
+ 2020-01-01 00:00:18.000 | true | 18 |
+ 2020-01-01 00:00:19.000 | true | 19 |
+ 2020-01-01 00:00:20.000 | true | 20 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | true | NULL |
+ 2020-01-01 00:00:01.000 | true | NULL |
+ 2020-01-01 00:00:02.000 | true | NULL |
+ 2020-01-01 00:00:03.000 | true | NULL |
+ 2020-01-01 00:00:04.000 | true | NULL |
+ 2020-01-01 00:00:05.000 | true | NULL |
+ 2020-01-01 00:00:06.000 | true | NULL |
+ 2020-01-01 00:00:07.000 | true | NULL |
+ 2020-01-01 00:00:08.000 | true | NULL |
+ 2020-01-01 00:00:09.000 | true | NULL |
+ 2020-01-01 00:00:10.000 | true | NULL |
+ 2020-01-01 00:00:11.000 | true | NULL |
+ 2020-01-01 00:00:12.000 | true | NULL |
+ 2020-01-01 00:00:13.000 | true | NULL |
+ 2020-01-01 00:00:14.000 | true | NULL |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | NULL |
+ 2020-01-01 00:00:17.000 | true | NULL |
+ 2020-01-01 00:00:18.000 | true | NULL |
+ 2020-01-01 00:00:19.000 | true | NULL |
+ 2020-01-01 00:00:20.000 | true | NULL |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | true | 1 |
+ 2020-01-01 00:00:01.000 | true | 1 |
+ 2020-01-01 00:00:02.000 | true | 1 |
+ 2020-01-01 00:00:03.000 | true | 1 |
+ 2020-01-01 00:00:04.000 | true | 1 |
+ 2020-01-01 00:00:05.000 | true | 1 |
+ 2020-01-01 00:00:06.000 | true | 1 |
+ 2020-01-01 00:00:07.000 | true | 1 |
+ 2020-01-01 00:00:08.000 | true | 1 |
+ 2020-01-01 00:00:09.000 | true | 1 |
+ 2020-01-01 00:00:10.000 | true | 1 |
+ 2020-01-01 00:00:11.000 | true | 1 |
+ 2020-01-01 00:00:12.000 | true | 1 |
+ 2020-01-01 00:00:13.000 | true | 1 |
+ 2020-01-01 00:00:14.000 | true | 1 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 1 |
+ 2020-01-01 00:00:17.000 | true | 1 |
+ 2020-01-01 00:00:18.000 | true | 1 |
+ 2020-01-01 00:00:19.000 | true | 1 |
+ 2020-01-01 00:00:20.000 | true | 1 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 15 |
+ 2020-01-01 00:00:17.000 | true | 15 |
+ 2020-01-01 00:00:18.000 | true | 15 |
+ 2020-01-01 00:00:19.000 | true | 15 |
+ 2020-01-01 00:00:20.000 | true | 15 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | true | 15 |
+ 2020-01-01 00:00:01.000 | true | 15 |
+ 2020-01-01 00:00:02.000 | true | 15 |
+ 2020-01-01 00:00:03.000 | true | 15 |
+ 2020-01-01 00:00:04.000 | true | 15 |
+ 2020-01-01 00:00:05.000 | true | 15 |
+ 2020-01-01 00:00:06.000 | true | 15 |
+ 2020-01-01 00:00:07.000 | true | 15 |
+ 2020-01-01 00:00:08.000 | true | 15 |
+ 2020-01-01 00:00:09.000 | true | 15 |
+ 2020-01-01 00:00:10.000 | true | 15 |
+ 2020-01-01 00:00:11.000 | true | 15 |
+ 2020-01-01 00:00:12.000 | true | 15 |
+ 2020-01-01 00:00:13.000 | true | 15 |
+ 2020-01-01 00:00:14.000 | true | 15 |
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 21 |
+ 2020-01-01 00:00:17.000 | true | 21 |
+ 2020-01-01 00:00:18.000 | true | 21 |
+ 2020-01-01 00:00:19.000 | true | 21 |
+ 2020-01-01 00:00:20.000 | true | 21 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:15.000 | false | 15 |
+ 2020-01-01 00:00:16.000 | true | 16 |
+ 2020-01-01 00:00:17.000 | true | 17 |
+ 2020-01-01 00:00:18.000 | true | 18 |
+ 2020-01-01 00:00:19.000 | true | 19 |
+ 2020-01-01 00:00:20.000 | true | 20 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | true | NULL |
+ 2020-01-01 00:00:01.000 | true | NULL |
+ 2020-01-01 00:00:02.000 | true | NULL |
+ 2020-01-01 00:00:03.000 | true | NULL |
+ 2020-01-01 00:00:04.000 | true | NULL |
+ 2020-01-01 00:00:05.000 | true | NULL |
+ 2020-01-01 00:00:06.000 | true | NULL |
+ 2020-01-01 00:00:07.000 | true | NULL |
+ 2020-01-01 00:00:08.000 | true | NULL |
+ 2020-01-01 00:00:09.000 | true | NULL |
+ 2020-01-01 00:00:10.000 | true | NULL |
+ 2020-01-01 00:00:11.000 | true | NULL |
+ 2020-01-01 00:00:12.000 | true | NULL |
+ 2020-01-01 00:00:13.000 | true | NULL |
+ 2020-01-01 00:00:14.000 | true | NULL |
+ 2020-01-01 00:00:15.000 | true | NULL |
+ 2020-01-01 00:00:16.000 | true | NULL |
+ 2020-01-01 00:00:17.000 | true | NULL |
+ 2020-01-01 00:00:18.000 | true | NULL |
+ 2020-01-01 00:00:19.000 | true | NULL |
+ 2020-01-01 00:00:20.000 | true | NULL |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | true | 1 |
+ 2020-01-01 00:00:01.000 | true | 1 |
+ 2020-01-01 00:00:02.000 | true | 1 |
+ 2020-01-01 00:00:03.000 | true | 1 |
+ 2020-01-01 00:00:04.000 | true | 1 |
+ 2020-01-01 00:00:05.000 | true | 1 |
+ 2020-01-01 00:00:06.000 | true | 1 |
+ 2020-01-01 00:00:07.000 | true | 1 |
+ 2020-01-01 00:00:08.000 | true | 1 |
+ 2020-01-01 00:00:09.000 | true | 1 |
+ 2020-01-01 00:00:10.000 | true | 1 |
+ 2020-01-01 00:00:11.000 | true | 1 |
+ 2020-01-01 00:00:12.000 | true | 1 |
+ 2020-01-01 00:00:13.000 | true | 1 |
+ 2020-01-01 00:00:14.000 | true | 1 |
+ 2020-01-01 00:00:15.000 | true | 1 |
+ 2020-01-01 00:00:16.000 | true | 1 |
+ 2020-01-01 00:00:17.000 | true | 1 |
+ 2020-01-01 00:00:18.000 | true | 1 |
+ 2020-01-01 00:00:19.000 | true | 1 |
+ 2020-01-01 00:00:20.000 | true | 1 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:00.000 | true | 21 |
+ 2020-01-01 00:00:01.000 | true | 21 |
+ 2020-01-01 00:00:02.000 | true | 21 |
+ 2020-01-01 00:00:03.000 | true | 21 |
+ 2020-01-01 00:00:04.000 | true | 21 |
+ 2020-01-01 00:00:05.000 | true | 21 |
+ 2020-01-01 00:00:06.000 | true | 21 |
+ 2020-01-01 00:00:07.000 | true | 21 |
+ 2020-01-01 00:00:08.000 | true | 21 |
+ 2020-01-01 00:00:09.000 | true | 21 |
+ 2020-01-01 00:00:10.000 | true | 21 |
+ 2020-01-01 00:00:11.000 | true | 21 |
+ 2020-01-01 00:00:12.000 | true | 21 |
+ 2020-01-01 00:00:13.000 | true | 21 |
+ 2020-01-01 00:00:14.000 | true | 21 |
+ 2020-01-01 00:00:15.000 | true | 21 |
+ 2020-01-01 00:00:16.000 | true | 21 |
+ 2020-01-01 00:00:17.000 | true | 21 |
+ 2020-01-01 00:00:18.000 | true | 21 |
+ 2020-01-01 00:00:19.000 | true | 21 |
+ 2020-01-01 00:00:20.000 | true | 21 |
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
+ _irowts | _isfilled | interp(c1) |
+====================================================
+ 2020-01-01 00:00:21.000 | false | 21 |
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+
+taos> select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
+
diff --git a/tests/army/query/function/in/interp.in b/tests/army/query/function/in/interp.in
index 4825ab46b1..97a9936b8d 100644
--- a/tests/army/query/function/in/interp.in
+++ b/tests/army/query/function/in/interp.in
@@ -13,3 +13,53 @@ select _irowts as irowts ,tbname as table_name, c2 as c_c2, c3 as c_c3, _isfille
select _irowts as irowts ,tbname as table_name, c2 as c_c2, c3 as c_c3, _isfilled as isfilled , interp(c1) as intp_c1 from test.td32727 partition by tbname,c2,c3 range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill (prev) order by irowts, c2, c3;
select _irowts as irowts ,tbname as table_name, c2 as c_c2, c3 as c_c3, _isfilled as isfilled , interp(c1) as intp_c1 from test.td32727 partition by tbname,c2,c3 range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill (linear) order by irowts, c2, c3;
select _irowts as irowts ,tbname as table_name, c2 as c_c2, c3 as c_c3, _isfilled as isfilled , interp(c1) as intp_c1 from test.td32727 partition by tbname,c2,c3 range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill (value, 1) order by irowts, c2, c3;
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-02 00:00:00' and '2020-01-01 00:00:00' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-02 00:00:00' range('2020-01-01 00:00:30', '2020-01-01 00:00:00') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:20' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:21', '2020-01-01 00:00:30') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:15', '2020-01-01 00:00:30') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:21' range('2020-01-01 00:00:00', '2020-01-01 00:00:30') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:00' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:15' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:21' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(null);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(value, 1);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(prev);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(next);
+select _irowts, _isfilled, interp(c1) from test.td32861 where ts between '2020-01-01 00:00:22' and '2020-01-01 00:00:30' range('2020-01-01 00:00:00', '2020-01-01 00:00:21') every(1s) fill(linear);
diff --git a/tests/army/query/function/test_interp.py b/tests/army/query/function/test_interp.py
index f903e7be73..106ef1e58e 100644
--- a/tests/army/query/function/test_interp.py
+++ b/tests/army/query/function/test_interp.py
@@ -38,6 +38,7 @@ class TDTestCase(TBase):
(ts timestamp, c0 tinyint, c1 smallint, c2 int, c3 bigint, c4 double, c5 float, c6 bool, c7 varchar(10), c8 nchar(10), c9 tinyint unsigned, c10 smallint unsigned, c11 int unsigned, c12 bigint unsigned)
'''
)
+ tdSql.execute("create table if not exists test.td32861(ts timestamp, c1 int);")
tdLog.printNoPrefix("==========step2:insert data")
@@ -45,6 +46,16 @@ class TDTestCase(TBase):
tdSql.execute(f"insert into test.td32727 values ('2020-02-01 00:00:10', 10, 10, 10, 10, 10.0, 10.0, true, 'varchar', 'nchar', 10, 10, 10, 10)")
tdSql.execute(f"insert into test.td32727 values ('2020-02-01 00:00:15', 15, 15, 15, 15, 15.0, 15.0, true, 'varchar', 'nchar', 15, 15, 15, 15)")
+ tdSql.execute(
+ """insert into test.td32861 values
+ ('2020-01-01 00:00:00', 0),
+ ('2020-01-01 00:00:01', 1),
+ ('2020-01-01 00:00:03', 3),
+ ('2020-01-01 00:00:06', 6),
+ ('2020-01-01 00:00:10', 10),
+ ('2020-01-01 00:00:15', 15),
+ ('2020-01-01 00:00:21', 21);"""
+ )
def test_normal_query_new(self, testCase):
# read sql from .sql file and execute
diff --git a/tests/ci/Dockerfile b/tests/ci/Dockerfile
index d3d574b484..1caa6fea9e 100644
--- a/tests/ci/Dockerfile
+++ b/tests/ci/Dockerfile
@@ -7,7 +7,7 @@ RUN apt-get install -y locales psmisc sudo tree libgeos-dev libgflags2.2 libgfl
RUN sed -i 's/# en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen && locale-gen
RUN pip3 config set global.index-url http://admin:123456@192.168.0.212:3141/admin/dev/+simple/
RUN pip3 config set global.trusted-host 192.168.0.212
-RUN pip3 install taospy==2.7.16 taos-ws-py==0.3.3 pandas psutil fabric2 requests faker simplejson toml pexpect tzlocal distro decorator loguru hyperloglog
+RUN pip3 install taospy==2.7.16 taos-ws-py==0.3.5 pandas psutil fabric2 requests faker simplejson toml pexpect tzlocal distro decorator loguru hyperloglog
ENV LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8 LC_ALL=en_US.UTF-8
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
RUN add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/'
diff --git a/tests/docs-examples-test/python.sh b/tests/docs-examples-test/python.sh
index 6a25683b58..3a9812637c 100644
--- a/tests/docs-examples-test/python.sh
+++ b/tests/docs-examples-test/python.sh
@@ -130,7 +130,7 @@ pip3 install kafka-python
python3 kafka_example_consumer.py
# 21
-pip3 install taos-ws-py==0.3.3
+pip3 install taos-ws-py==0.3.5
python3 conn_websocket_pandas.py
# 22
diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task
index d52a32adc7..ab44102c98 100644
--- a/tests/parallel_test/cases.task
+++ b/tests/parallel_test/cases.task
@@ -232,6 +232,14 @@
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 4
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-32548.py
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stddev_test.py
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stddev_test.py -Q 2
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stddev_test.py -Q 3
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stddev_test.py -Q 4
+,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/checkpoint_info.py -N 4
+,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/checkpoint_info2.py -N 4
+,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_multi_insert.py
+
,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreDnode.py -N 5 -M 3 -i False
,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreVnode.py -N 5 -M 3 -i False
,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreMnode.py -N 5 -M 3 -i False
@@ -353,6 +361,7 @@
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege_all.py
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/fsync.py
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/multilevel.py
+,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/multilevel_createdb.py
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttl.py
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttlChangeOnWrite.py
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz1.py
diff --git a/tests/parallel_test/run_case.sh b/tests/parallel_test/run_case.sh
index 5b0d34fc0a..a78d0aa4a4 100755
--- a/tests/parallel_test/run_case.sh
+++ b/tests/parallel_test/run_case.sh
@@ -76,9 +76,9 @@ ulimit -c unlimited
md5sum /usr/lib/libtaos.so.1
md5sum /home/TDinternal/debug/build/lib/libtaos.so
-#get python connector and update: taospy 2.7.16 taos-ws-py 0.3.3
+#get python connector and update: taospy 2.7.16 taos-ws-py 0.3.5
pip3 install taospy==2.7.16
-pip3 install taos-ws-py==0.3.3
+pip3 install taos-ws-py==0.3.5
$TIMEOUT_CMD $cmd
RET=$?
echo "cmd exit code: $RET"
diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py
index 1d3333264a..46b7e1f795 100644
--- a/tests/pytest/util/sql.py
+++ b/tests/pytest/util/sql.py
@@ -843,9 +843,10 @@ class TDSql:
tdSql.query("select * from information_schema.ins_vnodes")
#result: dnode_id|vgroup_id|db_name|status|role_time|start_time|restored|
+ results = list(tdSql.queryResult)
for vnode_group_id in db_vgroups_list:
- print(tdSql.queryResult)
- for result in tdSql.queryResult:
+ for result in results:
+ print(f'result[2] is {result[2]}, db_name is {db_name}, result[1] is {result[1]}, vnode_group_id is {vnode_group_id}')
if result[2] == db_name and result[1] == vnode_group_id:
tdLog.debug(f"dbname: {db_name}, vgroup :{vnode_group_id}, dnode is {result[0]}")
print(useful_trans_dnodes_list)
diff --git a/tests/requirements.txt b/tests/requirements.txt
index c6dd044c86..a036c2b3d0 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -9,4 +9,5 @@ requests
pexpect
faker
pyopenssl
-hyperloglog
\ No newline at end of file
+hyperloglog
+tzlocal
\ No newline at end of file
diff --git a/tests/system-test/0-others/information_schema.py b/tests/system-test/0-others/information_schema.py
index c1a3942db6..538aa1ad63 100644
--- a/tests/system-test/0-others/information_schema.py
+++ b/tests/system-test/0-others/information_schema.py
@@ -222,7 +222,7 @@ class TDTestCase:
tdSql.query("select * from information_schema.ins_columns where db_name ='information_schema'")
tdLog.info(len(tdSql.queryResult))
- tdSql.checkEqual(True, len(tdSql.queryResult) in range(281, 282))
+ tdSql.checkEqual(True, len(tdSql.queryResult) in range(282, 283))
tdSql.query("select * from information_schema.ins_columns where db_name ='performance_schema'")
tdSql.checkEqual(56, len(tdSql.queryResult))
diff --git a/tests/system-test/0-others/multilevel_createdb.py b/tests/system-test/0-others/multilevel_createdb.py
new file mode 100644
index 0000000000..70131a760b
--- /dev/null
+++ b/tests/system-test/0-others/multilevel_createdb.py
@@ -0,0 +1,89 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+
+from util.log import *
+from util.cases import *
+from util.sql import *
+from util.common import *
+from util.sqlset import *
+import glob
+
+def scanFiles(pattern):
+ res = []
+ for f in glob.iglob(pattern):
+ res += [f]
+ return res
+
+def checkFiles(pattern, state):
+ res = scanFiles(pattern)
+ tdLog.info(res)
+ num = len(res)
+ if num:
+ if state:
+ tdLog.info("%s: %d files exist. expect: files exist" % (pattern, num))
+ else:
+ tdLog.exit("%s: %d files exist. expect: files not exist." % (pattern, num))
+ else:
+ if state:
+ tdLog.exit("%s: %d files exist. expect: files exist" % (pattern, num))
+ else:
+ tdLog.info("%s: %d files exist. expect: files not exist." % (pattern, num))
+
+class TDTestCase:
+ def init(self, conn, logSql, replicaVar=1):
+
+ self.replicaVar = int(replicaVar)
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor())
+ self.setsql = TDSetSql()
+
+ def basic(self):
+ tdLog.info("============== basic test ===============")
+ cfg={
+ '/mnt/data1 0 1 0' : 'dataDir',
+ '/mnt/data2 0 0 0' : 'dataDir',
+ '/mnt/data3 0 0 0' : 'dataDir',
+ '/mnt/data4 0 0 0' : 'dataDir'
+ }
+ tdSql.createDir('/mnt/data1')
+ tdSql.createDir('/mnt/data2')
+ tdSql.createDir('/mnt/data3')
+ tdSql.createDir('/mnt/data4')
+
+ tdDnodes.stop(1)
+ tdDnodes.deploy(1,cfg)
+ tdDnodes.start(1)
+
+ checkFiles(r'/mnt/data1/*/*',1)
+ checkFiles(r'/mnt/data2/*/*',0)
+
+ tdSql.execute('create database nws vgroups 20 stt_trigger 1 wal_level 1 wal_retention_period 0')
+
+ checkFiles(r'/mnt/data1/vnode/*/wal',5)
+ checkFiles(r'/mnt/data2/vnode/*/wal',5)
+ checkFiles(r'/mnt/data3/vnode/*/wal',5)
+ checkFiles(r'/mnt/data4/vnode/*/wal',5)
+
+ def run(self):
+ self.basic()
+
+
+
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
\ No newline at end of file
diff --git a/tests/system-test/1-insert/test_multi_insert.py b/tests/system-test/1-insert/test_multi_insert.py
new file mode 100644
index 0000000000..d1b6d28ffd
--- /dev/null
+++ b/tests/system-test/1-insert/test_multi_insert.py
@@ -0,0 +1,32 @@
+from util.sql import *
+from util.common import *
+import taos
+taos.taos_connect
+class TDTestCase:
+ def init(self, conn, logSql, replicaVar = 1):
+ self.replicaVar = int(replicaVar)
+ tdLog.debug(f"start to excute {__file__}")
+ self.conn = conn
+ tdSql.init(conn.cursor(), logSql)
+ def initdb(self):
+ tdSql.execute("drop database if exists d0")
+ tdSql.execute("create database d0")
+ tdSql.execute("use d0")
+ tdSql.execute("create stable stb0 (ts timestamp, w_ts timestamp, opc nchar(100), quality int) tags(t0 int)")
+ tdSql.execute("create table t0 using stb0 tags(1)")
+ tdSql.execute("create table t1 using stb0 tags(2)")
+ def multi_insert(self):
+ for i in range(5):
+ tdSql.execute(f"insert into t1 values(1721265436000, now() + {i + 1}s, '0', 12) t1(opc, quality, ts) values ('opc2', 192, now()+ {i + 2}s) t1(ts, opc, quality) values(now() + {i + 3}s, 'opc4', 10) t1 values(1721265436000, now() + {i + 4}s, '1', 191) t1(opc, quality, ts) values('opc5', 192, now() + {i + 5}s) t1 values(now(), now() + {i + 6}s, '2', 192)")
+ tdSql.execute("insert into t0 values(1721265436000,now(),'0',192) t0(quality,w_ts,ts) values(192,now(),1721265326000) t0(quality,w_t\
+s,ts) values(190,now()+1s,1721265326000) t0 values(1721265436000,now()+2s,'1',191) t0(quality,w_ts,ts) values(192,now()+3s,\
+1721265326002) t0(ts,w_ts,opc,quality) values(1721265436003,now()+4s,'3',193) t0 values(now(), now() + 4s , '2', 192)")
+ def run(self):
+ self.initdb()
+ self.multi_insert()
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
\ No newline at end of file
diff --git a/tests/system-test/2-query/group_partition.py b/tests/system-test/2-query/group_partition.py
index 7ee528841c..74f5e86267 100644
--- a/tests/system-test/2-query/group_partition.py
+++ b/tests/system-test/2-query/group_partition.py
@@ -422,21 +422,36 @@ class TDTestCase:
def test_TS5567(self):
tdSql.query(f"select const_col from (select 1 as const_col from {self.dbname}.{self.stable}) t group by const_col")
- tdSql.checkRows(50)
+ tdSql.checkRows(1)
tdSql.query(f"select const_col from (select 1 as const_col from {self.dbname}.{self.stable}) t partition by const_col")
tdSql.checkRows(50)
tdSql.query(f"select const_col from (select 1 as const_col, count(c1) from {self.dbname}.{self.stable} t group by c1) group by const_col")
- tdSql.checkRows(10)
+ tdSql.checkRows(1)
tdSql.query(f"select const_col from (select 1 as const_col, count(c1) from {self.dbname}.{self.stable} t group by c1) partition by const_col")
tdSql.checkRows(10)
tdSql.query(f"select const_col as c_c from (select 1 as const_col from {self.dbname}.{self.stable}) t group by c_c")
- tdSql.checkRows(50)
+ tdSql.checkRows(1)
tdSql.query(f"select const_col as c_c from (select 1 as const_col from {self.dbname}.{self.stable}) t partition by c_c")
tdSql.checkRows(50)
tdSql.query(f"select const_col from (select 1 as const_col, count(c1) from {self.dbname}.{self.stable} t group by c1) group by 1")
- tdSql.checkRows(10)
+ tdSql.checkRows(1)
tdSql.query(f"select const_col from (select 1 as const_col, count(c1) from {self.dbname}.{self.stable} t group by c1) partition by 1")
tdSql.checkRows(10)
+
+ def test_TD_32883(self):
+ sql = "select avg(c1), t9 from db.stb group by t9,t9, tbname"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkRows(5)
+ sql = "select avg(c1), t10 from db.stb group by t10,t10, tbname"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkRows(5)
+ sql = "select avg(c1), t10 from db.stb partition by t10,t10, tbname"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkRows(5)
+ sql = "select avg(c1), concat(t9,t10) from db.stb group by concat(t9,t10), concat(t9,t10),tbname"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkRows(5)
+
def run(self):
tdSql.prepare()
self.prepare_db()
@@ -470,6 +485,7 @@ class TDTestCase:
self.test_event_window(nonempty_tb_num)
self.test_TS5567()
+ self.test_TD_32883()
## test old version before changed
# self.test_groupby('group', 0, 0)
diff --git a/tests/system-test/2-query/partition_by_col.py b/tests/system-test/2-query/partition_by_col.py
index ef88e88cbd..da7fe78124 100644
--- a/tests/system-test/2-query/partition_by_col.py
+++ b/tests/system-test/2-query/partition_by_col.py
@@ -313,7 +313,21 @@ class TDTestCase:
order_by_list = 'ts,c1,c2,c3,c4,c5,c6,c7,c8,c9,t1,t2,t3,t4,t5,t6'
self.prepare_and_query_and_compare(sqls, order_by_list, compare_what=COMPARE_LEN)
+
+ def test_tsdb_read(self):
+ tdSql.execute('delete from t0')
+ tdSql.execute('flush database test')
+ for i in range(0, 4096):
+ tdSql.execute(f"insert into test.t0 values({1537146000000 + i}, 1,1,1,1,1,1,1,'a','1')")
+ tdSql.execute("flush database test")
+ tdSql.execute(f"insert into t0 values({1537146000000 + 4095}, 1,1,1,1,1,1,1,'a','1')")
+ for i in range(4095, 4096*2 + 100):
+ tdSql.execute(f"insert into test.t0 values({1537146000000 + i}, 1,1,1,1,1,1,1,'a','1')")
+ tdSql.execute("flush database test")
+ time.sleep(5)
+ tdSql.query('select first(ts), last(ts) from t0', queryTimes=1)
+ tdSql.checkRows(1)
def run(self):
self.prepareTestEnv()
@@ -323,6 +337,8 @@ class TDTestCase:
self.test_sort_for_partition_res()
self.test_sort_for_partition_interval()
self.test_sort_for_partition_no_agg_limit()
+ self.test_tsdb_read()
+
def stop(self):
tdSql.close()
diff --git a/tests/system-test/2-query/stddev_test.py b/tests/system-test/2-query/stddev_test.py
new file mode 100644
index 0000000000..c0cb51fe57
--- /dev/null
+++ b/tests/system-test/2-query/stddev_test.py
@@ -0,0 +1,54 @@
+import numpy as np
+from util.log import *
+from util.cases import *
+from util.sql import *
+from util.common import *
+from util.sqlset import *
+
+'''
+Test case for TS-5150
+'''
+class TDTestCase:
+ def init(self, conn, logSql, replicaVar=1):
+ self.replicaVar = int(replicaVar)
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor())
+ self.ts = 1537146000000
+ def initdabase(self):
+ tdSql.execute('create database if not exists db_test vgroups 2 buffer 10')
+ tdSql.execute('use db_test')
+ tdSql.execute('create stable stb(ts timestamp, delay int) tags(groupid int)')
+ tdSql.execute('create table t1 using stb tags(1)')
+ tdSql.execute('create table t2 using stb tags(2)')
+ tdSql.execute('create table t3 using stb tags(3)')
+ tdSql.execute('create table t4 using stb tags(4)')
+ tdSql.execute('create table t5 using stb tags(5)')
+ tdSql.execute('create table t6 using stb tags(6)')
+ def insert_data(self):
+ for i in range(5000):
+ tdSql.execute(f"insert into t1 values({self.ts + i * 1000}, {i%5})")
+ tdSql.execute(f"insert into t2 values({self.ts + i * 1000}, {i%5})")
+ tdSql.execute(f"insert into t3 values({self.ts + i * 1000}, {i%5})")
+
+ def verify_stddev(self):
+ for i in range(20):
+ tdSql.query(f'SELECT MAX(CASE WHEN delay != 0 THEN delay ELSE NULL END) AS maxDelay,\
+ MIN(CASE WHEN delay != 0 THEN delay ELSE NULL END) AS minDelay,\
+ AVG(CASE WHEN delay != 0 THEN delay ELSE NULL END) AS avgDelay,\
+ STDDEV(CASE WHEN delay != 0 THEN delay ELSE NULL END) AS jitter,\
+ COUNT(CASE WHEN delay = 0 THEN 1 ELSE NULL END) AS timeoutCount,\
+ COUNT(*) AS totalCount from stb where ts between {1537146000000 + i * 1000} and {1537146000000 + (i+10) * 1000}')
+ res = tdSql.queryResult[0][3]
+ assert res > 0.8
+ def run(self):
+ self.initdabase()
+ self.insert_data()
+ self.verify_stddev()
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
+
diff --git a/tests/system-test/2-query/union.py b/tests/system-test/2-query/union.py
index 2aa01f2c02..5104489592 100644
--- a/tests/system-test/2-query/union.py
+++ b/tests/system-test/2-query/union.py
@@ -369,8 +369,46 @@ class TDTestCase:
'''
)
+ def test_TS_5630(self):
+ sql = "CREATE DATABASE `ep_iot` BUFFER 256 CACHESIZE 20 CACHEMODEL 'both' COMP 2 DURATION 14400m WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 5256000m,5256000m,5256000m PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 3 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0"
+ tdSql.execute(sql, queryTimes=1)
+ tdLog.info("database ep_iot created")
+ sql = "CREATE STABLE `ep_iot`.`sldc_dp` (`ts` TIMESTAMP, `data_write_time` TIMESTAMP, `jz1fdgl` DOUBLE, `jz1ssfdfh` DOUBLE, `jz1fdmh` DOUBLE, `jz1gdmh` DOUBLE, `jz1qjrhl` DOUBLE, `jz1zhcydl` DOUBLE, `jz1zkby` DOUBLE, `jz1zzqyl` DOUBLE, `jz1zzqwda` DOUBLE, `jz1zzqwdb` DOUBLE, `jz1zzqll` DOUBLE, `jz1gswd` DOUBLE, `jz1gsll` DOUBLE, `jz1glxl` DOUBLE, `jz1qjrh` DOUBLE, `jz1zhrxl` DOUBLE, `jz1gmjassllfk` DOUBLE, `jz1gmjasslllj` DOUBLE, `jz1gmjbssllfk` DOUBLE, `jz1gmjbsslllj` DOUBLE, `jz1gmjcssllfk` DOUBLE, `jz1gmjcsslllj` DOUBLE, `jz1gmjdssllfk` DOUBLE, `jz1gmjdsslllj` DOUBLE, `jz1gmjessllfk` DOUBLE, `jz1gmjesslllj` DOUBLE, `jz1gmjfssllfk` DOUBLE, `jz1gmjfsslllj` DOUBLE, `jz1zrqwda` DOUBLE, `jz1zrqwdb` DOUBLE, `jz1zrzqyl` DOUBLE, `jz1mmjadl` DOUBLE, `jz1mmjbdl` DOUBLE, `jz1mmjcdl` DOUBLE, `jz1mmjddl` DOUBLE, `jz1mmjedl` DOUBLE, `jz1mmjfdl` DOUBLE, `jz1cyqckwda` DOUBLE, `jz1cyqckwdb` DOUBLE, `jz1njswd` DOUBLE, `jz1nqqxhsckawd` DOUBLE, `jz1nqqxhsckbwd` DOUBLE, `jz1nqqxhsrkawd` DOUBLE, `jz1nqqxhsrkbwd` DOUBLE, `jz1kyqackyqwdsel` DOUBLE, `jz1kyqbckyqwdsel` DOUBLE, `jz1yfjackyqwd` DOUBLE, `jz1yfjbckyqwd` DOUBLE, `jz1trkyqwd` DOUBLE, `jz1trkyqwd1` DOUBLE, `jz1trkyqwd2` DOUBLE, `jz1trkyqwd3` DOUBLE, `jz1tckjyqwd1` DOUBLE, `jz1tckjyqwd2` DOUBLE, `jz1tckyqwd1` DOUBLE, `jz1bya` DOUBLE, `jz1byb` DOUBLE, `jz1pqwda` DOUBLE, `jz1pqwdb` DOUBLE, `jz1gmjadl` DOUBLE, `jz1gmjbdl` DOUBLE, `jz1gmjcdl` DOUBLE, `jz1gmjddl` DOUBLE, `jz1gmjedl` DOUBLE, `jz1gmjfdl` DOUBLE, `jz1yfjadl` DOUBLE, `jz1yfjbdl` DOUBLE, `jz1ycfjadl` DOUBLE, `jz1ycfjbdl` DOUBLE, `jz1sfjadl` DOUBLE, `jz1sfjbdl` DOUBLE, `jz1fdjyggl` DOUBLE, `jz1fdjwggl` DOUBLE, `jz1sjzs` DOUBLE, `jz1zfl` DOUBLE, `jz1ltyl` DOUBLE, `jz1smb` DOUBLE, `jz1rll` DOUBLE, `jz1grd` DOUBLE, `jz1zjwd` DOUBLE, `jz1yl` DOUBLE, `jz1kyqckwd` DOUBLE, `jz1abmfsybrkcy` DOUBLE, `jz1bbmfsybrkcy` DOUBLE, `jz1abjcsdmfytwdzdz` DOUBLE, `jz1bbjcsdmfytwdzdz` DOUBLE, `jz2fdgl` DOUBLE, `jz2ssfdfh` DOUBLE, `jz2fdmh` DOUBLE, `jz2gdmh` DOUBLE, `jz2qjrhl` DOUBLE, `jz2zhcydl` DOUBLE, `jz2zkby` DOUBLE, `jz2zzqyl` DOUBLE, `jz2zzqwda` DOUBLE, `jz2zzqwdb` DOUBLE, `jz2zzqll` DOUBLE, `jz2gswd` DOUBLE, `jz2gsll` DOUBLE, `jz2glxl` DOUBLE, `jz2qjrh` DOUBLE, `jz2zhrxl` DOUBLE, `jz2gmjassllfk` DOUBLE, `jz2gmjasslllj` DOUBLE, `jz2gmjbssllfk` DOUBLE, `jz2gmjbsslllj` DOUBLE, `jz2gmjcssllfk` DOUBLE, `jz2gmjcsslllj` DOUBLE, `jz2gmjdssllfk` DOUBLE, `jz2gmjdsslllj` DOUBLE, `jz2gmjessllfk` DOUBLE, `jz2gmjesslllj` DOUBLE, `jz2gmjfssllfk` DOUBLE, `jz2gmjfsslllj` DOUBLE, `jz2zrqwda` DOUBLE, `jz2zrqwdb` DOUBLE, `jz2zrzqyl` DOUBLE, `jz2mmjadl` DOUBLE, `jz2mmjbdl` DOUBLE, `jz2mmjcdl` DOUBLE, `jz2mmjddl` DOUBLE, `jz2mmjedl` DOUBLE, `jz2mmjfdl` DOUBLE, `jz2cyqckwda` DOUBLE, `jz2cyqckwdb` DOUBLE, `jz2njswd` DOUBLE, `jz2nqqxhsckawd` DOUBLE, `jz2nqqxhsckbwd` DOUBLE, `jz2nqqxhsrkawd` DOUBLE, `jz2nqqxhsrkbwd` DOUBLE, `jz2kyqackyqwdsel` DOUBLE, `jz2kyqbckyqwdsel` DOUBLE, `jz2yfjackyqwd` DOUBLE, `jz2yfjbckyqwd` DOUBLE, `jz2trkyqwd` DOUBLE, `jz2trkyqwd1` DOUBLE, `jz2trkyqwd2` DOUBLE, `jz2trkyqwd3` DOUBLE, `jz2tckjyqwd1` DOUBLE, `jz2tckjyqwd2` DOUBLE, `jz2tckyqwd1` DOUBLE, `jz2bya` DOUBLE, `jz2byb` DOUBLE, `jz2pqwda` DOUBLE, `jz2pqwdb` DOUBLE, `jz2gmjadl` DOUBLE, `jz2gmjbdl` DOUBLE, `jz2gmjcdl` DOUBLE, `jz2gmjddl` DOUBLE, `jz2gmjedl` DOUBLE, `jz2gmjfdl` DOUBLE, `jz2yfjadl` DOUBLE, `jz2yfjbdl` DOUBLE, `jz2ycfjadl` DOUBLE, `jz2ycfjbdl` DOUBLE, `jz2sfjadl` DOUBLE, `jz2sfjbdl` DOUBLE, `jz2fdjyggl` DOUBLE, `jz2fdjwggl` DOUBLE, `jz2sjzs` DOUBLE, `jz2zfl` DOUBLE, `jz2ltyl` DOUBLE, `jz2smb` DOUBLE, `jz2rll` DOUBLE, `jz2grd` DOUBLE, `jz2zjwd` DOUBLE, `jz2yl` DOUBLE, `jz2kyqckwd` DOUBLE, `jz2abmfsybrkcy` DOUBLE, `jz2bbmfsybrkcy` DOUBLE, `jz2abjcsdmfytwdzdz` DOUBLE, `jz2bbjcsdmfytwdzdz` DOUBLE) TAGS (`iot_hub_id` VARCHAR(100), `device_group_code` VARCHAR(100), `device_code` VARCHAR(100))"
+ tdLog.info("stable ep_iot.sldc_dp created")
+ tdSql.execute(sql, queryTimes=1)
+ sql = "insert into ep_iot.sldc_dp_t1 using ep_iot.sldc_dp tags('a','a','a') values(now, now, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9,0,1);"
+ tdSql.execute(sql, queryTimes=1)
+ sql = "insert into ep_iot.sldc_dp_t1 using ep_iot.sldc_dp tags('b','b','b') values(now, now, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9,0,1);"
+ tdSql.execute(sql, queryTimes=1)
+ sql = "insert into ep_iot.sldc_dp_t1 using ep_iot.sldc_dp tags('c','c','c') values(now, now, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9,0,1);"
+ tdSql.execute(sql, queryTimes=1)
+ sql = "insert into ep_iot.sldc_dp_t1 using ep_iot.sldc_dp tags('d','d','d') values(now, now, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9,0,1);"
+ tdSql.execute(sql, queryTimes=1)
+ sql = "insert into ep_iot.sldc_dp_t1 using ep_iot.sldc_dp tags('e','e','e') values(now, now, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9,0,1);"
+ tdSql.execute(sql, queryTimes=1)
+ sql = "select scdw_code, scdw_name, jzmc, fdgl, jzzt from ((select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组1' as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组2' as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp)) where scdw_code like '%%';"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkCols(5)
+ tdSql.checkRows(6)
+
+ sql = "select scdw_name, scdw_code, jzmc, fdgl, jzzt from ((select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组1' as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组2' as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp)) where scdw_code like '%%';"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkCols(5)
+ tdSql.checkRows(6)
+ sql = "select scdw_name, scdw_code, jzzt from ((select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组1' as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组2' as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp)) where scdw_code like '%%';"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkRows(6)
+ tdSql.checkCols(3)
+
+ sql = "select scdw_code, scdw_name, jzmc, fdgl, jzzt,ts from ((select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组1' as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01072016' as scdw_code, '盛鲁电厂' as scdw_name, '机组2' as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '00103673' as scdw_code, '鲁西电厂' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt, last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组1'as jzmc, last(jz1fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp) union all ( select '01061584' as scdw_code, '富源热电' as scdw_name, '机组2'as jzmc, last(jz2fdjyggl) as fdgl, '填报' as jzzt ,last(ts) as ts from ep_iot.sldc_dp)) where scdw_code like '%%';"
+ tdSql.query(sql, queryTimes=1)
+ tdSql.checkCols(6)
+ tdSql.checkRows(6)
+ ##tdSql.execute("drop database ep_iot")
+
def run(self):
tdSql.prepare()
+ self.test_TS_5630()
tdLog.printNoPrefix("==========step1:create table")
self.__create_tb()
diff --git a/tests/system-test/8-stream/checkpoint_info.py b/tests/system-test/8-stream/checkpoint_info.py
new file mode 100644
index 0000000000..522017a702
--- /dev/null
+++ b/tests/system-test/8-stream/checkpoint_info.py
@@ -0,0 +1,140 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+
+from util.log import *
+from util.cases import *
+from util.sql import *
+from util.common import *
+from util.sqlset import *
+from util.cluster import *
+import threading
+# should be used by -N option
+class TDTestCase:
+
+ #updatecfgDict = {'checkpointInterval': 60 ,}
+ def init(self, conn, logSql, replicaVar=1):
+ print("========init========")
+
+ self.replicaVar = int(replicaVar)
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor(), logSql)
+ def find_checkpoint_info_file(self, dirpath, checkpointid, task_id):
+ for root, dirs, files in os.walk(dirpath):
+ if f'checkpoint{checkpointid}' in dirs:
+ info_path = os.path.join(root, f'checkpoint{checkpointid}', 'info')
+ if os.path.exists(info_path):
+ if task_id in info_path:
+ return info_path
+ else:
+ continue
+ else:
+ return None
+ def get_dnode_info(self):
+ '''
+ get a dict from vnode to dnode
+ '''
+ self.vnode_dict = {}
+ sql = 'select dnode_id, vgroup_id from information_schema.ins_vnodes'
+ result = tdSql.getResult(sql)
+ for (dnode,vnode) in result:
+ self.vnode_dict[vnode] = dnode
+ def print_time_info(self):
+ '''
+ sometimes, we need to wait for a while to check the info (for example, the checkpoint info file won't be created immediately after the redistribute)
+ '''
+ times= 0
+ while(True):
+ if(self.check_info()):
+ tdLog.success(f'Time to finish is {times}')
+ return
+ else:
+ if times > 200:
+ tdLog.exit("time out")
+ times += 10
+ time.sleep(10)
+ def check_info(self):
+ '''
+ first, check if the vnode is restored
+ '''
+ while(True):
+ if(self.check_vnodestate()):
+ break
+ sql = 'select task_id, node_id, checkpoint_id, checkpoint_ver from information_schema.ins_stream_tasks where `level` = "source" or `level` = "agg" and node_type == "vnode"'
+ for task_id, vnode, checkpoint_id, checkpoint_ver in tdSql.getResult(sql):
+ dirpath = f"{cluster.dnodes[self.vnode_dict[vnode]-1].dataDir}/vnode/vnode{vnode}/"
+ info_path = self.find_checkpoint_info_file(dirpath, checkpoint_id, task_id)
+ if info_path is None:
+ return False
+ with open(info_path, 'r') as f:
+ info_id, info_ver = f.read().split()
+ if int(info_id) != int(checkpoint_id) or int(info_ver) != int(checkpoint_ver):
+ return False
+ return True
+
+ def restart_stream(self):
+ tdLog.debug("========restart stream========")
+ time.sleep(10)
+ for i in range(5):
+ tdSql.execute("pause stream s1")
+ time.sleep(2)
+ tdSql.execute("resume stream s1")
+ def initstream(self):
+ tdLog.debug("========case1 start========")
+ os.system("nohup taosBenchmark -y -B 1 -t 4 -S 500 -n 1000 -v 3 > /dev/null 2>&1 &")
+ time.sleep(5)
+ tdSql.execute("create snode on dnode 1")
+ tdSql.execute("use test")
+ tdSql.execute("create stream if not exists s1 trigger at_once ignore expired 0 ignore update 0 fill_history 1 into st1 as select _wstart,sum(voltage),groupid from meters partition by groupid interval(1s)")
+ tdLog.debug("========create stream using snode and insert data ok========")
+ self.get_dnode_info()
+ def redistribute_vnode(self):
+ tdLog.debug("========redistribute vnode========")
+ tdSql.redistribute_db_all_vgroups()
+ self.get_dnode_info()
+ def replicate_db(self):
+ tdLog.debug("========replicate db========")
+ while True:
+ res = tdSql.getResult("SHOW TRANSACTIONS")
+ if res == []:
+ tdLog.debug("========== no transaction, begin to replicate db =========")
+ tdSql.execute("alter database test replica 3")
+ return
+ else:
+ time.sleep(5)
+ continue
+ def check_vnodestate(self):
+ sql = 'select distinct restored from information_schema.ins_vnodes'
+ if tdSql.getResult(sql) != [(True,)]:
+ tdLog.debug(f"vnode not restored, wait 5s")
+ time.sleep(5)
+ return False
+ else:
+ return True
+ def run(self):
+ print("========run========")
+ self.initstream()
+ self.restart_stream()
+ time.sleep(60)
+ self.print_time_info()
+ self.redistribute_vnode()
+ self.restart_stream()
+ time.sleep(60)
+ self.print_time_info()
+
+ def stop(self):
+ print("========stop========")
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
diff --git a/tests/system-test/8-stream/checkpoint_info2.py b/tests/system-test/8-stream/checkpoint_info2.py
new file mode 100644
index 0000000000..3dc57477f7
--- /dev/null
+++ b/tests/system-test/8-stream/checkpoint_info2.py
@@ -0,0 +1,141 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+
+from util.log import *
+from util.cases import *
+from util.sql import *
+from util.common import *
+from util.sqlset import *
+from util.cluster import *
+
+# should be used by -N option
+class TDTestCase:
+ updatecfgDict = {'checkpointInterval': 60 ,
+ }
+ def init(self, conn, logSql, replicaVar=1):
+ self.replicaVar = int(replicaVar)
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor(), True)
+ def find_checkpoint_info_file(self, dirpath, checkpointid, task_id):
+ for root, dirs, files in os.walk(dirpath):
+ if f'checkpoint{checkpointid}' in dirs:
+ info_path = os.path.join(root, f'checkpoint{checkpointid}', 'info')
+ if os.path.exists(info_path):
+ if task_id in info_path:
+ tdLog.info(f"info file found in {info_path}")
+ return info_path
+ else:
+ continue
+ else:
+ tdLog.info(f"info file not found in {info_path}")
+ return None
+ else:
+ tdLog.info(f"no checkpoint{checkpointid} in {dirpath}")
+ def get_dnode_info(self):
+ '''
+ get a dict from vnode to dnode
+ '''
+ self.vnode_dict = {}
+ sql = 'select dnode_id, vgroup_id from information_schema.ins_vnodes where status = "leader"'
+ result = tdSql.getResult(sql)
+ for (dnode,vnode) in result:
+ self.vnode_dict[vnode] = dnode
+ def print_time_info(self):
+ '''
+ sometimes, we need to wait for a while to check the info (for example, the checkpoint info file won't be created immediately after the redistribute)
+ '''
+ times= 0
+ while(True):
+ if(self.check_info()):
+ tdLog.success(f'Time to finish is {times}')
+ return
+ else:
+ if times > 400:
+ tdLog.exit("time out")
+ times += 10
+ time.sleep(10)
+ def check_info(self):
+ '''
+ first, check if the vnode is restored
+ '''
+ while(True):
+ if(self.check_vnodestate()):
+ break
+ self.get_dnode_info()
+ sql = 'select task_id, node_id, checkpoint_id, checkpoint_ver from information_schema.ins_stream_tasks where `level` = "source" or `level` = "agg" and node_type == "vnode"'
+ for task_id, vnode, checkpoint_id, checkpoint_ver in tdSql.getResult(sql):
+ dirpath = f"{cluster.dnodes[self.vnode_dict[vnode]-1].dataDir}/vnode/vnode{vnode}/"
+ info_path = self.find_checkpoint_info_file(dirpath, checkpoint_id, task_id)
+ if info_path is None:
+ tdLog.info(f"info path: {dirpath} is null")
+ return False
+ with open(info_path, 'r') as f:
+ info_id, info_ver = f.read().split()
+ if int(info_id) != int(checkpoint_id) or int(info_ver) != int(checkpoint_ver):
+ tdLog.info(f"infoId: {info_id}, checkpointId: {checkpoint_id}, infoVer: {info_ver}, checkpointVer: {checkpoint_ver}")
+ return False
+ return True
+
+ def restart_stream(self):
+ tdLog.debug("========restart stream========")
+ for i in range(5):
+ tdSql.execute("pause stream s1")
+ time.sleep(2)
+ tdSql.execute("resume stream s1")
+ def initstream(self):
+ tdLog.debug("========case1 start========")
+ os.system("nohup taosBenchmark -y -B 1 -t 4 -S 500 -n 1000 -v 3 > /dev/null 2>&1 &")
+ time.sleep(5)
+ tdSql.execute("create snode on dnode 1")
+ tdSql.execute("use test")
+ tdSql.execute("create stream if not exists s1 trigger at_once ignore expired 0 ignore update 0 fill_history 1 into st1 as select _wstart,sum(voltage),groupid from meters partition by groupid interval(1s)")
+ tdLog.debug("========create stream using snode and insert data ok========")
+ self.get_dnode_info()
+ def redistribute_vnode(self):
+ tdLog.debug("========redistribute vnode========")
+ tdSql.redistribute_db_all_vgroups()
+ self.get_dnode_info()
+ def replicate_db(self):
+ tdLog.debug("========replicate db========")
+ while True:
+ res = tdSql.getResult("SHOW TRANSACTIONS")
+ if res == []:
+ tdLog.debug("========== no transaction, begin to replicate db =========")
+ tdSql.execute("alter database test replica 3")
+ return
+ else:
+ time.sleep(5)
+ continue
+ def check_vnodestate(self):
+ sql = 'select distinct restored from information_schema.ins_vnodes'
+ if tdSql.getResult(sql) != [(True,)]:
+ tdLog.debug(f"vnode not restored, wait 5s")
+ time.sleep(5)
+ return False
+ else:
+ return True
+ def run(self):
+ self.initstream()
+ self.replicate_db()
+ self.print_time_info()
+ self.restart_stream()
+ time.sleep(60)
+ self.print_time_info()
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())