Merge branch 'feat/TS-5215-2' of https://github.com/taosdata/TDengine into feat/TS-5215-2
This commit is contained in:
commit
6d6568c18f
|
@ -15,7 +15,7 @@ TDengine Cloud 大幅减轻了用户在部署、运维等方面的人力负担
|
||||||
|
|
||||||
要在 TDengine Cloud 注册新用户,请遵循以下简易步骤完成注册流程:
|
要在 TDengine Cloud 注册新用户,请遵循以下简易步骤完成注册流程:
|
||||||
|
|
||||||
1. 打开浏览器,访问 TDengine Cloud 的首页:https://cloud.taosdata.com,在右边的“注册”部分,填入自己的姓名以及企业邮箱地址,点击“获取验证码”按钮。
|
1. 打开浏览器,访问 [TDengine Cloud](https://cloud.taosdata.com),在右边的“注册”部分,填入自己的姓名以及企业邮箱地址,点击“获取验证码”按钮。
|
||||||
|
|
||||||
2. 检查企业邮箱,找到主题为“你的 TDengine Cloud 注册账户验证码”的邮件。从邮件内容中复制 6 位验证码,并将其粘贴到注册页面上的“验证码”输入框中。接着,点击“注册 TDengine Cloud”按钮,进入客户信息补全页面。
|
2. 检查企业邮箱,找到主题为“你的 TDengine Cloud 注册账户验证码”的邮件。从邮件内容中复制 6 位验证码,并将其粘贴到注册页面上的“验证码”输入框中。接着,点击“注册 TDengine Cloud”按钮,进入客户信息补全页面。
|
||||||
|
|
||||||
|
|
|
@ -206,11 +206,11 @@ http {
|
||||||
|
|
||||||
### 部署 taosX
|
### 部署 taosX
|
||||||
|
|
||||||
如果想使用 TDengine 的数据接入能力,需要部署 taosX 服务,关于它的详细说明和部署请参考[taosX 参考手册](../../reference/components/taosx)。
|
如果想使用 TDengine 的数据接入能力,需要部署 taosX 服务,关于它的详细说明和部署请参考企业版参考手册。
|
||||||
|
|
||||||
### 部署 taosX-Agent
|
### 部署 taosX-Agent
|
||||||
|
|
||||||
有些数据源如 Pi, OPC 等,因为网络条件和数据源访问的限制,taosX 无法直接访问数据源,这种情况下需要部署一个代理服务 taosX-Agent,关于它的详细说明和部署请参考[taosX-Agent 参考手册](../../reference/components/taosx-agent)。
|
有些数据源如 Pi, OPC 等,因为网络条件和数据源访问的限制,taosX 无法直接访问数据源,这种情况下需要部署一个代理服务 taosX-Agent,关于它的详细说明和部署请参考企业版参考手册。
|
||||||
|
|
||||||
### 部署 taos-Explorer
|
### 部署 taos-Explorer
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ dataDir /mnt/data6 2 0
|
||||||
|
|
||||||
|参数名称 | 参数含义 |
|
|参数名称 | 参数含义 |
|
||||||
|:-------------|:-----------------------------------------------|
|
|:-------------|:-----------------------------------------------|
|
||||||
|s3EndPoint | 用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 的保持一致,否则无法访问。例如:http://cos.ap-beijing.myqcloud.com |
|
|s3EndPoint | 用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 的保持一致,否则无法访问。 |
|
||||||
|s3AccessKey |冒号分隔的用户 SecretId:SecretKey。例如:AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E |
|
|s3AccessKey |冒号分隔的用户 SecretId:SecretKey。例如:AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E |
|
||||||
|s3BucketName | 存储桶名称,减号后面是用户注册 COS 服务的 AppId。其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔。参数值均为字符串类型,但不需要引号。例如:test0711-1309024725 |
|
|s3BucketName | 存储桶名称,减号后面是用户注册 COS 服务的 AppId。其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔。参数值均为字符串类型,但不需要引号。例如:test0711-1309024725 |
|
||||||
|s3UploadDelaySec | data 文件持续多长时间不再变动后上传至 s3,单位:秒。最小值:1;最大值:2592000 (30天),默认值 60 秒 |
|
|s3UploadDelaySec | data 文件持续多长时间不再变动后上传至 s3,单位:秒。最小值:1;最大值:2592000 (30天),默认值 60 秒 |
|
||||||
|
|
|
@ -83,7 +83,7 @@ taosx replica start
|
||||||
```shell
|
```shell
|
||||||
taosx replica start -f td1:6030 -t td2:6030
|
taosx replica start -f td1:6030 -t td2:6030
|
||||||
```
|
```
|
||||||
该示例命令会自动创建除 information_schema、performance_schema、log、audit 库之外的同步任务。可以使用 http://td2:6041 指定该 endpoint 使用 websocket 接口(默认是原生接口)。也可以指定数据库同步:taosx replica start -f td1:6030 -t td2:6030 db1 仅创建指定的数据库同步任务。
|
该示例命令会自动创建除 information_schema、performance_schema、log、audit 库之外的同步任务。可以使用 `http://td2:6041` 指定该 endpoint 使用 websocket 接口(默认是原生接口)。也可以指定数据库同步:taosx replica start -f td1:6030 -t td2:6030 db1 仅创建指定的数据库同步任务。
|
||||||
|
|
||||||
2. 方法二
|
2. 方法二
|
||||||
|
|
||||||
|
|
|
@ -1458,7 +1458,7 @@ WEEKDAY(expr)
|
||||||
**适用于**: 表和超级表。
|
**适用于**: 表和超级表。
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
- 返回值 0 代表周日,1 代表周一 ... 6 代表周六。
|
- 返回值 0 代表周一,1 代表周二 ... 6 代表周日。
|
||||||
- 若 `expr` 为 NULL,返回 NULL。
|
- 若 `expr` 为 NULL,返回 NULL。
|
||||||
- 输入时间戳的精度由所查询表的精度确定, 若未指定表, 则精度为毫秒.
|
- 输入时间戳的精度由所查询表的精度确定, 若未指定表, 则精度为毫秒.
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ PARTITION 子句中,为 tbname 定义了一个别名 tname, 在PARTITION 子
|
||||||
|
|
||||||
## 流式计算读取历史数据
|
## 流式计算读取历史数据
|
||||||
|
|
||||||
正常情况下,流式计算不会处理创建前已经写入源表中的数据,若要处理已经写入的数据,可以在创建流时设置 fill_history 1 选项,这样创建的流式计算会自动处理创建前、创建中、创建后写入的数据。例如:
|
正常情况下,流式计算不会处理创建前已经写入源表中的数据,若要处理已经写入的数据,可以在创建流时设置 fill_history 1 选项,这样创建的流式计算会自动处理创建前、创建中、创建后写入的数据。流计算处理历史数据的最大窗口数是2000万,超过限制会报错。例如:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
create stream if not exists s1 fill_history 1 into st1 as select count(*) from t1 interval(10s)
|
create stream if not exists s1 fill_history 1 into st1 as select count(*) from t1 interval(10s)
|
||||||
|
|
|
@ -30,6 +30,16 @@ SHOW CLUSTER ALIVE;
|
||||||
|
|
||||||
查询当前集群的状态是否可用,返回值: 0:不可用 1:完全可用 2:部分可用(集群中部分节点下线,但其它节点仍可以正常使用)
|
查询当前集群的状态是否可用,返回值: 0:不可用 1:完全可用 2:部分可用(集群中部分节点下线,但其它节点仍可以正常使用)
|
||||||
|
|
||||||
|
## SHOW CLUSTER MACHINES
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW CLUSTER MACHINES; // 从 TDengine 3.2.3.0 版本开始支持
|
||||||
|
```
|
||||||
|
|
||||||
|
显示集群的机器码等信息。
|
||||||
|
|
||||||
|
注:企业版独有
|
||||||
|
|
||||||
## SHOW CONNECTIONS
|
## SHOW CONNECTIONS
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
|
@ -99,6 +109,7 @@ SHOW FUNCTIONS;
|
||||||
```sql
|
```sql
|
||||||
SHOW LICENCES;
|
SHOW LICENCES;
|
||||||
SHOW GRANTS;
|
SHOW GRANTS;
|
||||||
|
SHOW GRANTS FULL; // 从 TDengine 3.2.3.0 版本开始支持
|
||||||
```
|
```
|
||||||
|
|
||||||
显示企业版许可授权的信息。
|
显示企业版许可授权的信息。
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
---
|
||||||
|
title: 3.3.3.0 版本说明
|
||||||
|
sidebar_label: 3.3.3.0
|
||||||
|
description: 3.3.3.0 版本说明
|
||||||
|
---
|
||||||
|
### 新特性/优化
|
||||||
|
1. 增加函数支持:pi、truncate/tunc、exp、ln、mod、rand、sign、degress、radians、char、ascii、position、trim、replace、repeat、substring、substr、substring_index、week、weekday、weekofyear、dayofweek、stddev_pop、var_pop
|
||||||
|
2. 多级存储支持微软对象存储 Azure Blob [企业版]
|
||||||
|
3. 支持 MongoDB 数据源 [企业版]
|
||||||
|
4. TDengine支持macOS企业版客户端 [企业版]
|
||||||
|
5. taosX日志默认不写入syslog [企业版]
|
||||||
|
6. 服务端记录所有慢查询信息到log库
|
||||||
|
7. show cluster machines 查询结果中添加服务端版本号
|
||||||
|
8. 删除保留关键字LEVEL/ENCODE/COMPRESS, 可以作为列名/表名/数据库名等使用
|
||||||
|
9. 禁止动态修改临时目录
|
||||||
|
10. round 函数:支持四舍五入的精度
|
||||||
|
11. timediff 函数:返回时间戳 expr1 - expr2 的结果,支持负数结果,并近似到时间单位 time_unit 指定的精度
|
||||||
|
12. max/min 函数:支持字符串作为输入参数,当输入参数为字符串类型时,返回最大字符串值
|
||||||
|
13. 提升了 taosX 数据同步的性能 [企业版]
|
||||||
|
14. 统一慢查询和普通日志的保存策略
|
||||||
|
15. 优化订阅功能中offset文件过大且加载过慢的问题
|
||||||
|
16. 升级 JDBC driver 至 3.2.5
|
||||||
|
17. Kafka connector 提交改为同步方式
|
||||||
|
18. 新增参数:表查询不存在时是否报异常
|
||||||
|
19. 扩大 tsma 的 interval 的最大窗口到 1 年
|
||||||
|
20. 支持从 CSV 文件批量建表
|
||||||
|
### 修复问题
|
||||||
|
1. 服务器重启后 mqtt 写入任务未自动重新启动 [企业版]
|
||||||
|
2. 修复windows上agent和PI connector连接错误导致任务终止的问题 [企业版]
|
||||||
|
3. 重启taosadapter后,mqtt 任务异常,无法同步数据 [企业版]
|
||||||
|
4. Explorer 上 mqtt 写入任务状态不正确 [企业版]
|
||||||
|
5. 重启 taosx 后,运行中的任务没有被重新调度 [企业版]
|
||||||
|
6. 对于 taosx 的 MongoDB DataIn 任务,优化了日志的输出信息 [企业版]
|
||||||
|
7. 修复在 local.toml 文件为空时备份失败的问题 [企业版]
|
||||||
|
8. taosx replica 任务在网络断开恢复后数据同步异常的问题 [企业版]
|
||||||
|
9. 修复3.1版本同步到3.3版本meta数据不同步问题 [企业版]
|
||||||
|
10. taosadapter 异常重启后, mqtt任务无法自动恢复的问题[企业版]
|
||||||
|
11. Kafka DataIn 任务状态正常,但任务停止消费数据 [企业版]
|
||||||
|
12. 修复 last + interval 查询导致 crash 的问题
|
||||||
|
13. 在数据写入时热更stt_trigger导致taosd崩溃
|
||||||
|
14. 修改root密码后taoskeeper反复重启
|
||||||
|
15. 云服务中服务重启后流计算无法继续
|
||||||
|
16. tsdb加载缓存导致taosd死锁
|
||||||
|
17. 查询时fill值指定为0报错
|
||||||
|
18. last_row 查询结果与预期不符
|
||||||
|
19. 用户指定 information_schema 库登录时导致 taosd 崩溃
|
||||||
|
20. group by 语句支持位置参数和别名语法
|
||||||
|
21. 元数据克隆函数对象错误导致 crash
|
||||||
|
22. 缓存更新时数据填充的游标错误导致的 taosd 异常退出
|
||||||
|
23. STDDEV 函数计算结果随机不正确的问题
|
||||||
|
24. 多级存储以及加密场景下无法添加离线节点
|
||||||
|
25. taos CLI 无法输入大于20字节长度的密码
|
||||||
|
26. 拼接 sql 写入报错: int data overflow
|
||||||
|
27. 大量查询并发场景下元数据的一致性
|
||||||
|
28. 尝试解决手动点击停止按钮,任务无法停止的问题
|
||||||
|
29. 解决了列或者标签中包含逗号或引号时导出 CSV 文件错误的问题
|
||||||
|
30. 多线程并发的对同一张子表进行 describe 导致 crash
|
||||||
|
31. 数据浏览器的查询结果未按照配置的时区展示的问题
|
||||||
|
32. 创建 websocket 连接时 taosadapter 内存泄漏的问题
|
||||||
|
33. 社区版无法在 redhat 操作系统正常启动
|
||||||
|
34. 无效断言在两个 stt 分别位于数据块时间轴分布空洞场景引发的 crash
|
||||||
|
35. S3 长时间拉取数据会失败的问题
|
||||||
|
36. 使用结果集函数判断时间线的有序性
|
||||||
|
37. 解决超级表投影查询慢的问题
|
||||||
|
38. 修复: 多节点环境,事务返回码与事务状态不一致导致事务堆积
|
||||||
|
39. 修复:在stt_trigger = 1时,delete数据之后重新出现的错误
|
||||||
|
40. 节点恢复阶段taosd内存占用过高导致OOM
|
||||||
|
41. limit过小时的判断错误
|
||||||
|
42. AVEVA historian 数据源连通性及获取示例数据功能
|
||||||
|
43. taosd 服务无法正常停止的问题
|
||||||
|
44. last 函数查询全空列导致 crash
|
||||||
|
45. 查询 cid 不在当前版本的 schema 时触发 assert 导致 coredump
|
||||||
|
46. 写入消息体过大时 OOM 的问题,增加 syncLogBufferMemoryAllowed 参数控制
|
||||||
|
47. timezone 设置为 UTC 且数据包含“1970”时,查询报错
|
||||||
|
48. 取消mnode节点的消息同步的等待超时
|
||||||
|
49. 集群节点异常恢复后,集群授权状态失效
|
||||||
|
50. 查询空指针问题
|
||||||
|
51. 在restore vnode时,将vgroup暂时设置成单副本
|
||||||
|
52. 可以使用SQL保留字作为列名创建超级表,也可以使用SQL保留字作为标签名
|
||||||
|
53. 高并发查询期间内存持续增长的问题
|
||||||
|
54. 流计算在checkpoint处理过程中,由于断言失败导致的crash
|
||||||
|
55. 修复了 3.3.2.8.0820 版本中可以查询到 information_schema 中不存在的表perf_queries问题
|
||||||
|
56. 节点恢复阶段taosd内存占用过高导致OOM
|
||||||
|
57. 修复在schema变更情况下,通过taosx导入数据时,taosd出现crash的问题
|
||||||
|
58. 可能的内存泄漏
|
||||||
|
59. 客户端内存泄漏
|
||||||
|
60. 开源用户修改stt_trigger值升级后无法修改其他数据库选项
|
||||||
|
61. NOT IN (NULL) 查询结果不正确
|
||||||
|
62. taos shell和taosBenchmark不能成功连接云服务实例
|
|
@ -3,5 +3,5 @@ title: 版本说明
|
||||||
sidebar_label: 版本说明
|
sidebar_label: 版本说明
|
||||||
description: 各版本版本说明
|
description: 各版本版本说明
|
||||||
---
|
---
|
||||||
|
[3.3.3.0](./3.3.3.0)
|
||||||
[3.3.2.0](./3.3.2.0)
|
[3.3.2.0](./3.3.2.0)
|
||||||
|
|
|
@ -64,7 +64,7 @@ static FORCE_INLINE int64_t taosGetTimestampToday(int32_t precision) {
|
||||||
: 1000000000;
|
: 1000000000;
|
||||||
time_t t = taosTime(NULL);
|
time_t t = taosTime(NULL);
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
(void) taosLocalTime(&t, &tm, NULL);
|
(void) taosLocalTime(&t, &tm, NULL, 0);
|
||||||
tm.tm_hour = 0;
|
tm.tm_hour = 0;
|
||||||
tm.tm_min = 0;
|
tm.tm_min = 0;
|
||||||
tm.tm_sec = 0;
|
tm.tm_sec = 0;
|
||||||
|
|
|
@ -69,335 +69,341 @@
|
||||||
#define TK_NK_DOT 51
|
#define TK_NK_DOT 51
|
||||||
#define TK_WITH 52
|
#define TK_WITH 52
|
||||||
#define TK_ENCRYPT_KEY 53
|
#define TK_ENCRYPT_KEY 53
|
||||||
#define TK_DNODE 54
|
#define TK_ANODE 54
|
||||||
#define TK_PORT 55
|
#define TK_UPDATE 55
|
||||||
#define TK_DNODES 56
|
#define TK_ANODES 56
|
||||||
#define TK_RESTORE 57
|
#define TK_DNODE 57
|
||||||
#define TK_NK_IPTOKEN 58
|
#define TK_PORT 58
|
||||||
#define TK_FORCE 59
|
#define TK_DNODES 59
|
||||||
#define TK_UNSAFE 60
|
#define TK_RESTORE 60
|
||||||
#define TK_CLUSTER 61
|
#define TK_NK_IPTOKEN 61
|
||||||
#define TK_LOCAL 62
|
#define TK_FORCE 62
|
||||||
#define TK_QNODE 63
|
#define TK_UNSAFE 63
|
||||||
#define TK_BNODE 64
|
#define TK_CLUSTER 64
|
||||||
#define TK_SNODE 65
|
#define TK_LOCAL 65
|
||||||
#define TK_MNODE 66
|
#define TK_QNODE 66
|
||||||
#define TK_VNODE 67
|
#define TK_BNODE 67
|
||||||
#define TK_DATABASE 68
|
#define TK_SNODE 68
|
||||||
#define TK_USE 69
|
#define TK_MNODE 69
|
||||||
#define TK_FLUSH 70
|
#define TK_VNODE 70
|
||||||
#define TK_TRIM 71
|
#define TK_DATABASE 71
|
||||||
#define TK_S3MIGRATE 72
|
#define TK_USE 72
|
||||||
#define TK_COMPACT 73
|
#define TK_FLUSH 73
|
||||||
#define TK_IF 74
|
#define TK_TRIM 74
|
||||||
#define TK_NOT 75
|
#define TK_S3MIGRATE 75
|
||||||
#define TK_EXISTS 76
|
#define TK_COMPACT 76
|
||||||
#define TK_BUFFER 77
|
#define TK_IF 77
|
||||||
#define TK_CACHEMODEL 78
|
#define TK_NOT 78
|
||||||
#define TK_CACHESIZE 79
|
#define TK_EXISTS 79
|
||||||
#define TK_COMP 80
|
#define TK_BUFFER 80
|
||||||
#define TK_DURATION 81
|
#define TK_CACHEMODEL 81
|
||||||
#define TK_NK_VARIABLE 82
|
#define TK_CACHESIZE 82
|
||||||
#define TK_MAXROWS 83
|
#define TK_COMP 83
|
||||||
#define TK_MINROWS 84
|
#define TK_DURATION 84
|
||||||
#define TK_KEEP 85
|
#define TK_NK_VARIABLE 85
|
||||||
#define TK_PAGES 86
|
#define TK_MAXROWS 86
|
||||||
#define TK_PAGESIZE 87
|
#define TK_MINROWS 87
|
||||||
#define TK_TSDB_PAGESIZE 88
|
#define TK_KEEP 88
|
||||||
#define TK_PRECISION 89
|
#define TK_PAGES 89
|
||||||
#define TK_REPLICA 90
|
#define TK_PAGESIZE 90
|
||||||
#define TK_VGROUPS 91
|
#define TK_TSDB_PAGESIZE 91
|
||||||
#define TK_SINGLE_STABLE 92
|
#define TK_PRECISION 92
|
||||||
#define TK_RETENTIONS 93
|
#define TK_REPLICA 93
|
||||||
#define TK_SCHEMALESS 94
|
#define TK_VGROUPS 94
|
||||||
#define TK_WAL_LEVEL 95
|
#define TK_SINGLE_STABLE 95
|
||||||
#define TK_WAL_FSYNC_PERIOD 96
|
#define TK_RETENTIONS 96
|
||||||
#define TK_WAL_RETENTION_PERIOD 97
|
#define TK_SCHEMALESS 97
|
||||||
#define TK_WAL_RETENTION_SIZE 98
|
#define TK_WAL_LEVEL 98
|
||||||
#define TK_WAL_ROLL_PERIOD 99
|
#define TK_WAL_FSYNC_PERIOD 99
|
||||||
#define TK_WAL_SEGMENT_SIZE 100
|
#define TK_WAL_RETENTION_PERIOD 100
|
||||||
#define TK_STT_TRIGGER 101
|
#define TK_WAL_RETENTION_SIZE 101
|
||||||
#define TK_TABLE_PREFIX 102
|
#define TK_WAL_ROLL_PERIOD 102
|
||||||
#define TK_TABLE_SUFFIX 103
|
#define TK_WAL_SEGMENT_SIZE 103
|
||||||
#define TK_S3_CHUNKSIZE 104
|
#define TK_STT_TRIGGER 104
|
||||||
#define TK_S3_KEEPLOCAL 105
|
#define TK_TABLE_PREFIX 105
|
||||||
#define TK_S3_COMPACT 106
|
#define TK_TABLE_SUFFIX 106
|
||||||
#define TK_KEEP_TIME_OFFSET 107
|
#define TK_S3_CHUNKSIZE 107
|
||||||
#define TK_ENCRYPT_ALGORITHM 108
|
#define TK_S3_KEEPLOCAL 108
|
||||||
#define TK_NK_COLON 109
|
#define TK_S3_COMPACT 109
|
||||||
#define TK_BWLIMIT 110
|
#define TK_KEEP_TIME_OFFSET 110
|
||||||
#define TK_START 111
|
#define TK_ENCRYPT_ALGORITHM 111
|
||||||
#define TK_TIMESTAMP 112
|
#define TK_NK_COLON 112
|
||||||
#define TK_END 113
|
#define TK_BWLIMIT 113
|
||||||
#define TK_TABLE 114
|
#define TK_START 114
|
||||||
#define TK_NK_LP 115
|
#define TK_TIMESTAMP 115
|
||||||
#define TK_NK_RP 116
|
#define TK_END 116
|
||||||
#define TK_USING 117
|
#define TK_TABLE 117
|
||||||
#define TK_FILE 118
|
#define TK_NK_LP 118
|
||||||
#define TK_STABLE 119
|
#define TK_NK_RP 119
|
||||||
#define TK_COLUMN 120
|
#define TK_USING 120
|
||||||
#define TK_MODIFY 121
|
#define TK_FILE 121
|
||||||
#define TK_RENAME 122
|
#define TK_STABLE 122
|
||||||
#define TK_TAG 123
|
#define TK_COLUMN 123
|
||||||
#define TK_SET 124
|
#define TK_MODIFY 124
|
||||||
#define TK_NK_EQ 125
|
#define TK_RENAME 125
|
||||||
#define TK_TAGS 126
|
#define TK_TAG 126
|
||||||
#define TK_BOOL 127
|
#define TK_SET 127
|
||||||
#define TK_TINYINT 128
|
#define TK_NK_EQ 128
|
||||||
#define TK_SMALLINT 129
|
#define TK_TAGS 129
|
||||||
#define TK_INT 130
|
#define TK_BOOL 130
|
||||||
#define TK_INTEGER 131
|
#define TK_TINYINT 131
|
||||||
#define TK_BIGINT 132
|
#define TK_SMALLINT 132
|
||||||
#define TK_FLOAT 133
|
#define TK_INT 133
|
||||||
#define TK_DOUBLE 134
|
#define TK_INTEGER 134
|
||||||
#define TK_BINARY 135
|
#define TK_BIGINT 135
|
||||||
#define TK_NCHAR 136
|
#define TK_FLOAT 136
|
||||||
#define TK_UNSIGNED 137
|
#define TK_DOUBLE 137
|
||||||
#define TK_JSON 138
|
#define TK_BINARY 138
|
||||||
#define TK_VARCHAR 139
|
#define TK_NCHAR 139
|
||||||
#define TK_MEDIUMBLOB 140
|
#define TK_UNSIGNED 140
|
||||||
#define TK_BLOB 141
|
#define TK_JSON 141
|
||||||
#define TK_VARBINARY 142
|
#define TK_VARCHAR 142
|
||||||
#define TK_GEOMETRY 143
|
#define TK_MEDIUMBLOB 143
|
||||||
#define TK_DECIMAL 144
|
#define TK_BLOB 144
|
||||||
#define TK_COMMENT 145
|
#define TK_VARBINARY 145
|
||||||
#define TK_MAX_DELAY 146
|
#define TK_GEOMETRY 146
|
||||||
#define TK_WATERMARK 147
|
#define TK_DECIMAL 147
|
||||||
#define TK_ROLLUP 148
|
#define TK_COMMENT 148
|
||||||
#define TK_TTL 149
|
#define TK_MAX_DELAY 149
|
||||||
#define TK_SMA 150
|
#define TK_WATERMARK 150
|
||||||
#define TK_DELETE_MARK 151
|
#define TK_ROLLUP 151
|
||||||
#define TK_FIRST 152
|
#define TK_TTL 152
|
||||||
#define TK_LAST 153
|
#define TK_SMA 153
|
||||||
#define TK_SHOW 154
|
#define TK_DELETE_MARK 154
|
||||||
#define TK_FULL 155
|
#define TK_FIRST 155
|
||||||
#define TK_PRIVILEGES 156
|
#define TK_LAST 156
|
||||||
#define TK_DATABASES 157
|
#define TK_SHOW 157
|
||||||
#define TK_TABLES 158
|
#define TK_FULL 158
|
||||||
#define TK_STABLES 159
|
#define TK_PRIVILEGES 159
|
||||||
#define TK_MNODES 160
|
#define TK_DATABASES 160
|
||||||
#define TK_QNODES 161
|
#define TK_TABLES 161
|
||||||
#define TK_ARBGROUPS 162
|
#define TK_STABLES 162
|
||||||
#define TK_FUNCTIONS 163
|
#define TK_MNODES 163
|
||||||
#define TK_INDEXES 164
|
#define TK_QNODES 164
|
||||||
#define TK_ACCOUNTS 165
|
#define TK_ARBGROUPS 165
|
||||||
#define TK_APPS 166
|
#define TK_FUNCTIONS 166
|
||||||
#define TK_CONNECTIONS 167
|
#define TK_INDEXES 167
|
||||||
#define TK_LICENCES 168
|
#define TK_ACCOUNTS 168
|
||||||
#define TK_GRANTS 169
|
#define TK_APPS 169
|
||||||
#define TK_LOGS 170
|
#define TK_CONNECTIONS 170
|
||||||
#define TK_MACHINES 171
|
#define TK_LICENCES 171
|
||||||
#define TK_ENCRYPTIONS 172
|
#define TK_GRANTS 172
|
||||||
#define TK_QUERIES 173
|
#define TK_LOGS 173
|
||||||
#define TK_SCORES 174
|
#define TK_MACHINES 174
|
||||||
#define TK_TOPICS 175
|
#define TK_ENCRYPTIONS 175
|
||||||
#define TK_VARIABLES 176
|
#define TK_QUERIES 176
|
||||||
#define TK_BNODES 177
|
#define TK_SCORES 177
|
||||||
#define TK_SNODES 178
|
#define TK_TOPICS 178
|
||||||
#define TK_TRANSACTIONS 179
|
#define TK_VARIABLES 179
|
||||||
#define TK_DISTRIBUTED 180
|
#define TK_BNODES 180
|
||||||
#define TK_CONSUMERS 181
|
#define TK_SNODES 181
|
||||||
#define TK_SUBSCRIPTIONS 182
|
#define TK_TRANSACTIONS 182
|
||||||
#define TK_VNODES 183
|
#define TK_DISTRIBUTED 183
|
||||||
#define TK_ALIVE 184
|
#define TK_CONSUMERS 184
|
||||||
#define TK_VIEWS 185
|
#define TK_SUBSCRIPTIONS 185
|
||||||
#define TK_VIEW 186
|
#define TK_VNODES 186
|
||||||
#define TK_COMPACTS 187
|
#define TK_ALIVE 187
|
||||||
#define TK_NORMAL 188
|
#define TK_VIEWS 188
|
||||||
#define TK_CHILD 189
|
#define TK_VIEW 189
|
||||||
#define TK_LIKE 190
|
#define TK_COMPACTS 190
|
||||||
#define TK_TBNAME 191
|
#define TK_NORMAL 191
|
||||||
#define TK_QTAGS 192
|
#define TK_CHILD 192
|
||||||
#define TK_AS 193
|
#define TK_LIKE 193
|
||||||
#define TK_SYSTEM 194
|
#define TK_TBNAME 194
|
||||||
#define TK_TSMA 195
|
#define TK_QTAGS 195
|
||||||
#define TK_INTERVAL 196
|
#define TK_AS 196
|
||||||
#define TK_RECURSIVE 197
|
#define TK_SYSTEM 197
|
||||||
#define TK_TSMAS 198
|
#define TK_TSMA 198
|
||||||
#define TK_FUNCTION 199
|
#define TK_INTERVAL 199
|
||||||
#define TK_INDEX 200
|
#define TK_RECURSIVE 200
|
||||||
#define TK_COUNT 201
|
#define TK_TSMAS 201
|
||||||
#define TK_LAST_ROW 202
|
#define TK_FUNCTION 202
|
||||||
#define TK_META 203
|
#define TK_INDEX 203
|
||||||
#define TK_ONLY 204
|
#define TK_COUNT 204
|
||||||
#define TK_TOPIC 205
|
#define TK_LAST_ROW 205
|
||||||
#define TK_CONSUMER 206
|
#define TK_META 206
|
||||||
#define TK_GROUP 207
|
#define TK_ONLY 207
|
||||||
#define TK_DESC 208
|
#define TK_TOPIC 208
|
||||||
#define TK_DESCRIBE 209
|
#define TK_CONSUMER 209
|
||||||
#define TK_RESET 210
|
#define TK_GROUP 210
|
||||||
#define TK_QUERY 211
|
#define TK_DESC 211
|
||||||
#define TK_CACHE 212
|
#define TK_DESCRIBE 212
|
||||||
#define TK_EXPLAIN 213
|
#define TK_RESET 213
|
||||||
#define TK_ANALYZE 214
|
#define TK_QUERY 214
|
||||||
#define TK_VERBOSE 215
|
#define TK_CACHE 215
|
||||||
#define TK_NK_BOOL 216
|
#define TK_EXPLAIN 216
|
||||||
#define TK_RATIO 217
|
#define TK_ANALYZE 217
|
||||||
#define TK_NK_FLOAT 218
|
#define TK_VERBOSE 218
|
||||||
#define TK_OUTPUTTYPE 219
|
#define TK_NK_BOOL 219
|
||||||
#define TK_AGGREGATE 220
|
#define TK_RATIO 220
|
||||||
#define TK_BUFSIZE 221
|
#define TK_NK_FLOAT 221
|
||||||
#define TK_LANGUAGE 222
|
#define TK_OUTPUTTYPE 222
|
||||||
#define TK_REPLACE 223
|
#define TK_AGGREGATE 223
|
||||||
#define TK_STREAM 224
|
#define TK_BUFSIZE 224
|
||||||
#define TK_INTO 225
|
#define TK_LANGUAGE 225
|
||||||
#define TK_PAUSE 226
|
#define TK_REPLACE 226
|
||||||
#define TK_RESUME 227
|
#define TK_STREAM 227
|
||||||
#define TK_PRIMARY 228
|
#define TK_INTO 228
|
||||||
#define TK_KEY 229
|
#define TK_PAUSE 229
|
||||||
#define TK_TRIGGER 230
|
#define TK_RESUME 230
|
||||||
#define TK_AT_ONCE 231
|
#define TK_PRIMARY 231
|
||||||
#define TK_WINDOW_CLOSE 232
|
#define TK_KEY 232
|
||||||
#define TK_IGNORE 233
|
#define TK_TRIGGER 233
|
||||||
#define TK_EXPIRED 234
|
#define TK_AT_ONCE 234
|
||||||
#define TK_FILL_HISTORY 235
|
#define TK_WINDOW_CLOSE 235
|
||||||
#define TK_UPDATE 236
|
#define TK_IGNORE 236
|
||||||
#define TK_SUBTABLE 237
|
#define TK_EXPIRED 237
|
||||||
#define TK_UNTREATED 238
|
#define TK_FILL_HISTORY 238
|
||||||
#define TK_KILL 239
|
#define TK_SUBTABLE 239
|
||||||
#define TK_CONNECTION 240
|
#define TK_UNTREATED 240
|
||||||
#define TK_TRANSACTION 241
|
#define TK_KILL 241
|
||||||
#define TK_BALANCE 242
|
#define TK_CONNECTION 242
|
||||||
#define TK_VGROUP 243
|
#define TK_TRANSACTION 243
|
||||||
#define TK_LEADER 244
|
#define TK_BALANCE 244
|
||||||
#define TK_MERGE 245
|
#define TK_VGROUP 245
|
||||||
#define TK_REDISTRIBUTE 246
|
#define TK_LEADER 246
|
||||||
#define TK_SPLIT 247
|
#define TK_MERGE 247
|
||||||
#define TK_DELETE 248
|
#define TK_REDISTRIBUTE 248
|
||||||
#define TK_INSERT 249
|
#define TK_SPLIT 249
|
||||||
#define TK_NK_BIN 250
|
#define TK_DELETE 250
|
||||||
#define TK_NK_HEX 251
|
#define TK_INSERT 251
|
||||||
#define TK_NULL 252
|
#define TK_NK_BIN 252
|
||||||
#define TK_NK_QUESTION 253
|
#define TK_NK_HEX 253
|
||||||
#define TK_NK_ALIAS 254
|
#define TK_NULL 254
|
||||||
#define TK_NK_ARROW 255
|
#define TK_NK_QUESTION 255
|
||||||
#define TK_ROWTS 256
|
#define TK_NK_ALIAS 256
|
||||||
#define TK_QSTART 257
|
#define TK_NK_ARROW 257
|
||||||
#define TK_QEND 258
|
#define TK_ROWTS 258
|
||||||
#define TK_QDURATION 259
|
#define TK_QSTART 259
|
||||||
#define TK_WSTART 260
|
#define TK_QEND 260
|
||||||
#define TK_WEND 261
|
#define TK_QDURATION 261
|
||||||
#define TK_WDURATION 262
|
#define TK_WSTART 262
|
||||||
#define TK_IROWTS 263
|
#define TK_WEND 263
|
||||||
#define TK_ISFILLED 264
|
#define TK_WDURATION 264
|
||||||
#define TK_CAST 265
|
#define TK_IROWTS 265
|
||||||
#define TK_POSITION 266
|
#define TK_ISFILLED 266
|
||||||
#define TK_IN 267
|
#define TK_FLOW 267
|
||||||
#define TK_FOR 268
|
#define TK_FHIGH 268
|
||||||
#define TK_NOW 269
|
#define TK_FROWTS 269
|
||||||
#define TK_TODAY 270
|
#define TK_CAST 270
|
||||||
#define TK_RAND 271
|
#define TK_POSITION 271
|
||||||
#define TK_SUBSTR 272
|
#define TK_IN 272
|
||||||
#define TK_SUBSTRING 273
|
#define TK_FOR 273
|
||||||
#define TK_BOTH 274
|
#define TK_NOW 274
|
||||||
#define TK_TRAILING 275
|
#define TK_TODAY 275
|
||||||
#define TK_LEADING 276
|
#define TK_RAND 276
|
||||||
#define TK_TIMEZONE 277
|
#define TK_SUBSTR 277
|
||||||
#define TK_CLIENT_VERSION 278
|
#define TK_SUBSTRING 278
|
||||||
#define TK_SERVER_VERSION 279
|
#define TK_BOTH 279
|
||||||
#define TK_SERVER_STATUS 280
|
#define TK_TRAILING 280
|
||||||
#define TK_CURRENT_USER 281
|
#define TK_LEADING 281
|
||||||
#define TK_PI 282
|
#define TK_TIMEZONE 282
|
||||||
#define TK_CASE 283
|
#define TK_CLIENT_VERSION 283
|
||||||
#define TK_WHEN 284
|
#define TK_SERVER_VERSION 284
|
||||||
#define TK_THEN 285
|
#define TK_SERVER_STATUS 285
|
||||||
#define TK_ELSE 286
|
#define TK_CURRENT_USER 286
|
||||||
#define TK_BETWEEN 287
|
#define TK_PI 287
|
||||||
#define TK_IS 288
|
#define TK_CASE 288
|
||||||
#define TK_NK_LT 289
|
#define TK_WHEN 289
|
||||||
#define TK_NK_GT 290
|
#define TK_THEN 290
|
||||||
#define TK_NK_LE 291
|
#define TK_ELSE 291
|
||||||
#define TK_NK_GE 292
|
#define TK_BETWEEN 292
|
||||||
#define TK_NK_NE 293
|
#define TK_IS 293
|
||||||
#define TK_MATCH 294
|
#define TK_NK_LT 294
|
||||||
#define TK_NMATCH 295
|
#define TK_NK_GT 295
|
||||||
#define TK_CONTAINS 296
|
#define TK_NK_LE 296
|
||||||
#define TK_JOIN 297
|
#define TK_NK_GE 297
|
||||||
#define TK_INNER 298
|
#define TK_NK_NE 298
|
||||||
#define TK_LEFT 299
|
#define TK_MATCH 299
|
||||||
#define TK_RIGHT 300
|
#define TK_NMATCH 300
|
||||||
#define TK_OUTER 301
|
#define TK_CONTAINS 301
|
||||||
#define TK_SEMI 302
|
#define TK_JOIN 302
|
||||||
#define TK_ANTI 303
|
#define TK_INNER 303
|
||||||
#define TK_ASOF 304
|
#define TK_LEFT 304
|
||||||
#define TK_WINDOW 305
|
#define TK_RIGHT 305
|
||||||
#define TK_WINDOW_OFFSET 306
|
#define TK_OUTER 306
|
||||||
#define TK_JLIMIT 307
|
#define TK_SEMI 307
|
||||||
#define TK_SELECT 308
|
#define TK_ANTI 308
|
||||||
#define TK_NK_HINT 309
|
#define TK_ASOF 309
|
||||||
#define TK_DISTINCT 310
|
#define TK_WINDOW 310
|
||||||
#define TK_WHERE 311
|
#define TK_WINDOW_OFFSET 311
|
||||||
#define TK_PARTITION 312
|
#define TK_JLIMIT 312
|
||||||
#define TK_BY 313
|
#define TK_SELECT 313
|
||||||
#define TK_SESSION 314
|
#define TK_NK_HINT 314
|
||||||
#define TK_STATE_WINDOW 315
|
#define TK_DISTINCT 315
|
||||||
#define TK_EVENT_WINDOW 316
|
#define TK_WHERE 316
|
||||||
#define TK_COUNT_WINDOW 317
|
#define TK_PARTITION 317
|
||||||
#define TK_SLIDING 318
|
#define TK_BY 318
|
||||||
#define TK_FILL 319
|
#define TK_SESSION 319
|
||||||
#define TK_VALUE 320
|
#define TK_STATE_WINDOW 320
|
||||||
#define TK_VALUE_F 321
|
#define TK_EVENT_WINDOW 321
|
||||||
#define TK_NONE 322
|
#define TK_COUNT_WINDOW 322
|
||||||
#define TK_PREV 323
|
#define TK_ANOMALY_WINDOW 323
|
||||||
#define TK_NULL_F 324
|
#define TK_SLIDING 324
|
||||||
#define TK_LINEAR 325
|
#define TK_FILL 325
|
||||||
#define TK_NEXT 326
|
#define TK_VALUE 326
|
||||||
#define TK_HAVING 327
|
#define TK_VALUE_F 327
|
||||||
#define TK_RANGE 328
|
#define TK_NONE 328
|
||||||
#define TK_EVERY 329
|
#define TK_PREV 329
|
||||||
#define TK_ORDER 330
|
#define TK_NULL_F 330
|
||||||
#define TK_SLIMIT 331
|
#define TK_LINEAR 331
|
||||||
#define TK_SOFFSET 332
|
#define TK_NEXT 332
|
||||||
#define TK_LIMIT 333
|
#define TK_HAVING 333
|
||||||
#define TK_OFFSET 334
|
#define TK_RANGE 334
|
||||||
#define TK_ASC 335
|
#define TK_EVERY 335
|
||||||
#define TK_NULLS 336
|
#define TK_ORDER 336
|
||||||
#define TK_ABORT 337
|
#define TK_SLIMIT 337
|
||||||
#define TK_AFTER 338
|
#define TK_SOFFSET 338
|
||||||
#define TK_ATTACH 339
|
#define TK_LIMIT 339
|
||||||
#define TK_BEFORE 340
|
#define TK_OFFSET 340
|
||||||
#define TK_BEGIN 341
|
#define TK_ASC 341
|
||||||
#define TK_BITAND 342
|
#define TK_NULLS 342
|
||||||
#define TK_BITNOT 343
|
#define TK_ABORT 343
|
||||||
#define TK_BITOR 344
|
#define TK_AFTER 344
|
||||||
#define TK_BLOCKS 345
|
#define TK_ATTACH 345
|
||||||
#define TK_CHANGE 346
|
#define TK_BEFORE 346
|
||||||
#define TK_COMMA 347
|
#define TK_BEGIN 347
|
||||||
#define TK_CONCAT 348
|
#define TK_BITAND 348
|
||||||
#define TK_CONFLICT 349
|
#define TK_BITNOT 349
|
||||||
#define TK_COPY 350
|
#define TK_BITOR 350
|
||||||
#define TK_DEFERRED 351
|
#define TK_BLOCKS 351
|
||||||
#define TK_DELIMITERS 352
|
#define TK_CHANGE 352
|
||||||
#define TK_DETACH 353
|
#define TK_COMMA 353
|
||||||
#define TK_DIVIDE 354
|
#define TK_CONCAT 354
|
||||||
#define TK_DOT 355
|
#define TK_CONFLICT 355
|
||||||
#define TK_EACH 356
|
#define TK_COPY 356
|
||||||
#define TK_FAIL 357
|
#define TK_DEFERRED 357
|
||||||
#define TK_GLOB 358
|
#define TK_DELIMITERS 358
|
||||||
#define TK_ID 359
|
#define TK_DETACH 359
|
||||||
#define TK_IMMEDIATE 360
|
#define TK_DIVIDE 360
|
||||||
#define TK_IMPORT 361
|
#define TK_DOT 361
|
||||||
#define TK_INITIALLY 362
|
#define TK_EACH 362
|
||||||
#define TK_INSTEAD 363
|
#define TK_FAIL 363
|
||||||
#define TK_ISNULL 364
|
#define TK_GLOB 364
|
||||||
#define TK_MODULES 365
|
#define TK_ID 365
|
||||||
#define TK_NK_BITNOT 366
|
#define TK_IMMEDIATE 366
|
||||||
#define TK_NK_SEMI 367
|
#define TK_IMPORT 367
|
||||||
#define TK_NOTNULL 368
|
#define TK_INITIALLY 368
|
||||||
#define TK_OF 369
|
#define TK_INSTEAD 369
|
||||||
#define TK_PLUS 370
|
#define TK_ISNULL 370
|
||||||
#define TK_PRIVILEGE 371
|
#define TK_MODULES 371
|
||||||
#define TK_RAISE 372
|
#define TK_NK_BITNOT 372
|
||||||
#define TK_RESTRICT 373
|
#define TK_NK_SEMI 373
|
||||||
#define TK_ROW 374
|
#define TK_NOTNULL 374
|
||||||
#define TK_STAR 375
|
#define TK_OF 375
|
||||||
#define TK_STATEMENT 376
|
#define TK_PLUS 376
|
||||||
#define TK_STRICT 377
|
#define TK_PRIVILEGE 377
|
||||||
#define TK_STRING 378
|
#define TK_RAISE 378
|
||||||
#define TK_TIMES 379
|
#define TK_RESTRICT 379
|
||||||
#define TK_VALUES 380
|
#define TK_ROW 380
|
||||||
#define TK_VARIABLE 381
|
#define TK_STAR 381
|
||||||
#define TK_WAL 382
|
#define TK_STATEMENT 382
|
||||||
|
#define TK_STRICT 383
|
||||||
|
#define TK_STRING 384
|
||||||
|
#define TK_TIMES 385
|
||||||
|
#define TK_VALUES 386
|
||||||
|
#define TK_VARIABLE 387
|
||||||
|
#define TK_WAL 388
|
||||||
|
|
||||||
#define TK_NK_SPACE 600
|
#define TK_NK_SPACE 600
|
||||||
#define TK_NK_COMMENT 601
|
#define TK_NK_COMMENT 601
|
||||||
|
|
|
@ -247,9 +247,12 @@ void syslog(int unused, const char *format, ...);
|
||||||
#define TD_DIRSEP_CHAR '/'
|
#define TD_DIRSEP_CHAR '/'
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define TD_FQDN_LEN 128
|
||||||
#define TD_LOCALE_LEN 64
|
#define TD_LOCALE_LEN 64
|
||||||
#define TD_CHARSET_LEN 64
|
#define TD_CHARSET_LEN 64
|
||||||
#define TD_TIMEZONE_LEN 96
|
#define TD_TIMEZONE_LEN 96
|
||||||
|
#define TD_TIME_STR_LEN 128
|
||||||
|
#define TD_IP_LEN 64
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ bool taosMbsToUcs4(const char *mbs, size_t mbs_len, TdUcs4 *ucs4, int32_t ucs
|
||||||
int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes);
|
int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes);
|
||||||
int32_t tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4);
|
int32_t tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4);
|
||||||
bool taosValidateEncodec(const char *encodec);
|
bool taosValidateEncodec(const char *encodec);
|
||||||
int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len);
|
int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len, int32_t bufSize);
|
||||||
int32_t taosHexDecode(const char *src, char *dst, int32_t len);
|
int32_t taosHexDecode(const char *src, char *dst, int32_t len);
|
||||||
|
|
||||||
int32_t taosWcharWidth(TdWchar wchar);
|
int32_t taosWcharWidth(TdWchar wchar);
|
||||||
|
|
|
@ -91,7 +91,7 @@ static FORCE_INLINE int64_t taosGetMonoTimestampMs() {
|
||||||
}
|
}
|
||||||
|
|
||||||
char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm);
|
char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm);
|
||||||
struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf);
|
struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf, int32_t bufSize);
|
||||||
struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst);
|
struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst);
|
||||||
time_t taosTime(time_t *t);
|
time_t taosTime(time_t *t);
|
||||||
time_t taosMktime(struct tm *timep);
|
time_t taosMktime(struct tm *timep);
|
||||||
|
|
|
@ -284,7 +284,7 @@ typedef enum ELogicConditionType {
|
||||||
|
|
||||||
#define TSDB_CLUSTER_ID_LEN 40
|
#define TSDB_CLUSTER_ID_LEN 40
|
||||||
#define TSDB_MACHINE_ID_LEN 24
|
#define TSDB_MACHINE_ID_LEN 24
|
||||||
#define TSDB_FQDN_LEN 128
|
#define TSDB_FQDN_LEN TD_FQDN_LEN
|
||||||
#define TSDB_EP_LEN (TSDB_FQDN_LEN + 6)
|
#define TSDB_EP_LEN (TSDB_FQDN_LEN + 6)
|
||||||
#define TSDB_IPv4ADDR_LEN 16
|
#define TSDB_IPv4ADDR_LEN 16
|
||||||
#define TSDB_FILENAME_LEN 128
|
#define TSDB_FILENAME_LEN 128
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>com.tdengine.taos-explorer</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/usr/local/bin/taos-explorer</string>
|
||||||
|
</array>
|
||||||
|
<key>ProcessType</key>
|
||||||
|
<string>Interactive</string>
|
||||||
|
<key>Disabled</key>
|
||||||
|
<false/>
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<false/>
|
||||||
|
<key>LaunchOnlyOnce</key>
|
||||||
|
<false/>
|
||||||
|
<key>SessionCreate</key>
|
||||||
|
<true/>
|
||||||
|
<key>ExitTimeOut</key>
|
||||||
|
<integer>600</integer>
|
||||||
|
<key>KeepAlive</key>
|
||||||
|
<dict>
|
||||||
|
<key>SuccessfulExit</key>
|
||||||
|
<false/>
|
||||||
|
<key>AfterInitialDemand</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Program</key>
|
||||||
|
<string>/usr/local/bin/taos-explorer</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -206,10 +206,17 @@ function clean_log() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function clean_service_on_launchctl() {
|
function clean_service_on_launchctl() {
|
||||||
${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || :
|
${csudo}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosd.plist || :
|
||||||
${csudo}rm /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || :
|
${csudo}launchctl unload -w /Library/LaunchDaemons/com.taosdata.${PREFIX}adapter.plist || :
|
||||||
${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.${clientName2}adapter.plist > /dev/null 2>&1 || :
|
${csudo}launchctl unload -w /Library/LaunchDaemons/com.taosdata.${PREFIX}keeper.plist || :
|
||||||
${csudo}rm /Library/LaunchDaemons/com.taosdata.${clientName2}adapter.plist > /dev/null 2>&1 || :
|
${csudo}launchctl unload -w /Library/LaunchDaemons/com.taosdata.${PREFIX}-explorer.plist || :
|
||||||
|
|
||||||
|
${csudo}launchctl remove com.tdengine.taosd || :
|
||||||
|
${csudo}launchctl remove com.tdengine.${PREFIX}adapter || :
|
||||||
|
${csudo}launchctl remove com.tdengine.${PREFIX}keeper || :
|
||||||
|
${csudo}launchctl remove com.tdengine.${PREFIX}-explorer || :
|
||||||
|
|
||||||
|
${csudo}rm /Library/LaunchDaemons/com.taosdata.* > /dev/null 2>&1 || :
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove_data_and_config() {
|
function remove_data_and_config() {
|
||||||
|
@ -250,6 +257,12 @@ if [ -e ${install_main_dir}/uninstall_${PREFIX}x.sh ]; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$osType" = "Darwin" ]; then
|
||||||
|
clean_service_on_launchctl
|
||||||
|
${csudo}rm -rf /Applications/TDengine.app
|
||||||
|
fi
|
||||||
|
|
||||||
remove_bin
|
remove_bin
|
||||||
clean_header
|
clean_header
|
||||||
# Remove lib file
|
# Remove lib file
|
||||||
|
@ -282,10 +295,7 @@ elif echo $osinfo | grep -qwi "centos"; then
|
||||||
# echo "this is centos system"
|
# echo "this is centos system"
|
||||||
${csudo}rpm -e --noscripts tdengine >/dev/null 2>&1 || :
|
${csudo}rpm -e --noscripts tdengine >/dev/null 2>&1 || :
|
||||||
fi
|
fi
|
||||||
if [ "$osType" = "Darwin" ]; then
|
|
||||||
clean_service_on_launchctl
|
|
||||||
${csudo}rm -rf /Applications/TDengine.app
|
|
||||||
fi
|
|
||||||
|
|
||||||
command -v systemctl >/dev/null 2>&1 && ${csudo}systemctl daemon-reload >/dev/null 2>&1 || true
|
command -v systemctl >/dev/null 2>&1 && ${csudo}systemctl daemon-reload >/dev/null 2>&1 || true
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -71,8 +71,8 @@ Source: {#MyAppSourceDir}\taosdump.exe; DestDir: "{app}"; DestName: "{#CusPrompt
|
||||||
Filename: {sys}\sc.exe; Parameters: "create taosd start= DEMAND binPath= ""C:\\TDengine\\taosd.exe --win_service""" ; Flags: runhidden
|
Filename: {sys}\sc.exe; Parameters: "create taosd start= DEMAND binPath= ""C:\\TDengine\\taosd.exe --win_service""" ; Flags: runhidden
|
||||||
Filename: {sys}\sc.exe; Parameters: "create taosadapter start= DEMAND binPath= ""C:\\TDengine\\taosadapter.exe""" ; Flags: runhidden
|
Filename: {sys}\sc.exe; Parameters: "create taosadapter start= DEMAND binPath= ""C:\\TDengine\\taosadapter.exe""" ; Flags: runhidden
|
||||||
|
|
||||||
Filename: "C:\Windows\System32\odbcconf.exe"; Parameters: "/S /F win_odbcinst.ini"; WorkingDir: "{app}\taos_odbc\x64"; Flags: runhidden; StatusMsg: "Configuring ODBC x64"
|
Filename: "C:\Windows\System32\odbcconf.exe"; Parameters: "/S /F win_odbc_install.ini"; WorkingDir: "{app}\taos_odbc\x64"; Flags: runhidden; StatusMsg: "Configuring ODBC x64"
|
||||||
Filename: "C:\Windows\SysWOW64\odbcconf.exe"; Parameters: "/S /F win_odbcinst.ini"; WorkingDir: "{app}\taos_odbc\x86"; Flags: runhidden; StatusMsg: "Configuring ODBC x86"
|
Filename: "C:\Windows\SysWOW64\odbcconf.exe"; Parameters: "/S /F win_odbc_install.ini"; WorkingDir: "{app}\taos_odbc\x86"; Flags: runhidden; StatusMsg: "Configuring ODBC x86"
|
||||||
|
|
||||||
[UninstallRun]
|
[UninstallRun]
|
||||||
RunOnceId: "stoptaosd"; Filename: {sys}\sc.exe; Parameters: "stop taosd" ; Flags: runhidden
|
RunOnceId: "stoptaosd"; Filename: {sys}\sc.exe; Parameters: "stop taosd" ; Flags: runhidden
|
||||||
|
|
|
@ -134,6 +134,7 @@ struct tmq_t {
|
||||||
// poll info
|
// poll info
|
||||||
int64_t pollCnt;
|
int64_t pollCnt;
|
||||||
int64_t totalRows;
|
int64_t totalRows;
|
||||||
|
int8_t pollFlag;
|
||||||
|
|
||||||
// timer
|
// timer
|
||||||
tmr_h hbLiveTimer;
|
tmr_h hbLiveTimer;
|
||||||
|
@ -287,7 +288,6 @@ typedef struct {
|
||||||
static TdThreadOnce tmqInit = PTHREAD_ONCE_INIT; // initialize only once
|
static TdThreadOnce tmqInit = PTHREAD_ONCE_INIT; // initialize only once
|
||||||
volatile int32_t tmqInitRes = 0; // initialize rsp code
|
volatile int32_t tmqInitRes = 0; // initialize rsp code
|
||||||
static SMqMgmt tmqMgmt = {0};
|
static SMqMgmt tmqMgmt = {0};
|
||||||
static int8_t pollFlag = 0;
|
|
||||||
|
|
||||||
tmq_conf_t* tmq_conf_new() {
|
tmq_conf_t* tmq_conf_new() {
|
||||||
tmq_conf_t* conf = taosMemoryCalloc(1, sizeof(tmq_conf_t));
|
tmq_conf_t* conf = taosMemoryCalloc(1, sizeof(tmq_conf_t));
|
||||||
|
@ -977,7 +977,7 @@ void tmqSendHbReq(void* param, void* tmrId) {
|
||||||
SMqHbReq req = {0};
|
SMqHbReq req = {0};
|
||||||
req.consumerId = tmq->consumerId;
|
req.consumerId = tmq->consumerId;
|
||||||
req.epoch = tmq->epoch;
|
req.epoch = tmq->epoch;
|
||||||
req.pollFlag = atomic_load_8(&pollFlag);
|
req.pollFlag = atomic_load_8(&tmq->pollFlag);
|
||||||
req.topics = taosArrayInit(taosArrayGetSize(tmq->clientTopics), sizeof(TopicOffsetRows));
|
req.topics = taosArrayInit(taosArrayGetSize(tmq->clientTopics), sizeof(TopicOffsetRows));
|
||||||
if (req.topics == NULL) {
|
if (req.topics == NULL) {
|
||||||
goto END;
|
goto END;
|
||||||
|
@ -1057,7 +1057,7 @@ void tmqSendHbReq(void* param, void* tmrId) {
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
tqErrorC("tmqSendHbReq asyncSendMsgToServer failed");
|
tqErrorC("tmqSendHbReq asyncSendMsgToServer failed");
|
||||||
}
|
}
|
||||||
(void)atomic_val_compare_exchange_8(&pollFlag, 1, 0);
|
(void)atomic_val_compare_exchange_8(&tmq->pollFlag, 1, 0);
|
||||||
|
|
||||||
END:
|
END:
|
||||||
tDestroySMqHbReq(&req);
|
tDestroySMqHbReq(&req);
|
||||||
|
@ -1640,6 +1640,7 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
|
||||||
pTmq->status = TMQ_CONSUMER_STATUS__INIT;
|
pTmq->status = TMQ_CONSUMER_STATUS__INIT;
|
||||||
pTmq->pollCnt = 0;
|
pTmq->pollCnt = 0;
|
||||||
pTmq->epoch = 0;
|
pTmq->epoch = 0;
|
||||||
|
pTmq->pollFlag = 0;
|
||||||
|
|
||||||
// set conf
|
// set conf
|
||||||
tstrncpy(pTmq->clientId, conf->clientId, TSDB_CLIENT_ID_LEN);
|
tstrncpy(pTmq->clientId, conf->clientId, TSDB_CLIENT_ID_LEN);
|
||||||
|
@ -2441,7 +2442,7 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)atomic_val_compare_exchange_8(&pollFlag, 0, 1);
|
(void)atomic_val_compare_exchange_8(&tmq->pollFlag, 0, 1);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
tmqHandleAllDelayedTask(tmq);
|
tmqHandleAllDelayedTask(tmq);
|
||||||
|
|
|
@ -47,10 +47,6 @@ target_link_libraries(
|
||||||
INTERFACE api
|
INTERFACE api
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${BUILD_WITH_ANALYSIS})
|
|
||||||
add_definitions(-DUSE_ANAL)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(${BUILD_S3})
|
if(${BUILD_S3})
|
||||||
|
|
||||||
if(${BUILD_WITH_S3})
|
if(${BUILD_WITH_S3})
|
||||||
|
|
|
@ -94,7 +94,7 @@ static int32_t generateConfigFile(char* confDir) {
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
uDebug("[rsync] conf:%s", confContent);
|
uDebug("[rsync] conf:%s", confContent);
|
||||||
if (taosWriteFile(pFile, confContent, strlen(confContent)) != TSDB_CODE_SUCCESS) {
|
if (taosWriteFile(pFile, confContent, strlen(confContent)) <= 0) {
|
||||||
uError("[rsync] write conf file error," ERRNO_ERR_FORMAT, ERRNO_ERR_DATA);
|
uError("[rsync] write conf file error," ERRNO_ERR_FORMAT, ERRNO_ERR_DATA);
|
||||||
(void)taosCloseFile(&pFile);
|
(void)taosCloseFile(&pFile);
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
|
|
@ -2446,7 +2446,7 @@ _error:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* formatTimestamp(char* buf, int64_t val, int precision) {
|
static char* formatTimestamp(char* buf, int32_t bufSize, int64_t val, int precision) {
|
||||||
time_t tt;
|
time_t tt;
|
||||||
int32_t ms = 0;
|
int32_t ms = 0;
|
||||||
if (precision == TSDB_TIME_PRECISION_NANO) {
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
|
@ -2479,11 +2479,11 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
struct tm ptm = {0};
|
struct tm ptm = {0};
|
||||||
if (taosLocalTime(&tt, &ptm, buf) == NULL) {
|
if (taosLocalTime(&tt, &ptm, buf, bufSize) == NULL) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
|
size_t pos = strftime(buf, bufSize, "%Y-%m-%d %H:%M:%S", &ptm);
|
||||||
if (precision == TSDB_TIME_PRECISION_NANO) {
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
sprintf(buf + pos, ".%09d", ms);
|
sprintf(buf + pos, ".%09d", ms);
|
||||||
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
@ -2500,7 +2500,7 @@ int32_t dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf
|
||||||
int32_t size = 2048 * 1024;
|
int32_t size = 2048 * 1024;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
char* dumpBuf = NULL;
|
char* dumpBuf = NULL;
|
||||||
char pBuf[128] = {0};
|
char pBuf[TD_TIME_STR_LEN] = {0};
|
||||||
int32_t rows = pDataBlock->info.rows;
|
int32_t rows = pDataBlock->info.rows;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
|
|
||||||
|
@ -2543,7 +2543,7 @@ int32_t dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf
|
||||||
switch (pColInfoData->info.type) {
|
switch (pColInfoData->info.type) {
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
memset(pBuf, 0, sizeof(pBuf));
|
memset(pBuf, 0, sizeof(pBuf));
|
||||||
(void)formatTimestamp(pBuf, *(uint64_t*)var, pColInfoData->info.precision);
|
(void)formatTimestamp(pBuf, sizeof(pBuf), *(uint64_t*)var, pColInfoData->info.precision);
|
||||||
len += snprintf(dumpBuf + len, size - len, " %25s |", pBuf);
|
len += snprintf(dumpBuf + len, size - len, " %25s |", pBuf);
|
||||||
if (len >= size - 1) goto _exit;
|
if (len >= size - 1) goto _exit;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1730,6 +1730,7 @@ int32_t taosReadDataFolder(const char *cfgDir, const char **envCmd, const char *
|
||||||
TAOS_CHECK_RETURN(cfgInit(&pCfg));
|
TAOS_CHECK_RETURN(cfgInit(&pCfg));
|
||||||
|
|
||||||
TAOS_CHECK_GOTO(cfgAddDir(pCfg, "dataDir", tsDataDir, CFG_SCOPE_SERVER, CFG_DYN_NONE), NULL, _exit);
|
TAOS_CHECK_GOTO(cfgAddDir(pCfg, "dataDir", tsDataDir, CFG_SCOPE_SERVER, CFG_DYN_NONE), NULL, _exit);
|
||||||
|
TAOS_CHECK_GOTO(cfgAddInt32(pCfg, "debugFlag", dDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER), NULL, _exit);
|
||||||
TAOS_CHECK_GOTO(cfgAddInt32(pCfg, "dDebugFlag", dDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER) ,NULL, _exit);
|
TAOS_CHECK_GOTO(cfgAddInt32(pCfg, "dDebugFlag", dDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER) ,NULL, _exit);
|
||||||
|
|
||||||
if ((code = taosLoadCfg(pCfg, envCmd, cfgDir, envFile, apolloUrl)) != 0) {
|
if ((code = taosLoadCfg(pCfg, envCmd, cfgDir, envFile, apolloUrl)) != 0) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, in
|
||||||
}
|
}
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t t = (time_t)start;
|
time_t t = (time_t)start;
|
||||||
taosLocalTime(&t, &tm);
|
taosLocalTime(&t, &tm, NULL, 0);
|
||||||
tm.tm_sec = 0;
|
tm.tm_sec = 0;
|
||||||
tm.tm_min = 0;
|
tm.tm_min = 0;
|
||||||
tm.tm_hour = 0;
|
tm.tm_hour = 0;
|
||||||
|
|
|
@ -693,7 +693,7 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) {
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision));
|
time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision));
|
||||||
struct tm* ptm = taosLocalTime(&tt, &tm, NULL);
|
struct tm* ptm = taosLocalTime(&tt, &tm, NULL, 0);
|
||||||
int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)numOfMonth;
|
int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)numOfMonth;
|
||||||
tm.tm_year = mon / 12;
|
tm.tm_year = mon / 12;
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
|
@ -754,11 +754,11 @@ int32_t taosTimeCountIntervalForFill(int64_t skey, int64_t ekey, int64_t interva
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t t = (time_t)skey;
|
time_t t = (time_t)skey;
|
||||||
struct tm* ptm = taosLocalTime(&t, &tm, NULL);
|
struct tm* ptm = taosLocalTime(&t, &tm, NULL, 0);
|
||||||
int32_t smon = tm.tm_year * 12 + tm.tm_mon;
|
int32_t smon = tm.tm_year * 12 + tm.tm_mon;
|
||||||
|
|
||||||
t = (time_t)ekey;
|
t = (time_t)ekey;
|
||||||
ptm = taosLocalTime(&t, &tm, NULL);
|
ptm = taosLocalTime(&t, &tm, NULL, 0);
|
||||||
int32_t emon = tm.tm_year * 12 + tm.tm_mon;
|
int32_t emon = tm.tm_year * 12 + tm.tm_mon;
|
||||||
|
|
||||||
if (unit == 'y') {
|
if (unit == 'y') {
|
||||||
|
@ -782,7 +782,7 @@ int64_t taosTimeTruncate(int64_t ts, const SInterval* pInterval) {
|
||||||
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t tt = (time_t)start;
|
time_t tt = (time_t)start;
|
||||||
struct tm* ptm = taosLocalTime(&tt, &tm, NULL);
|
struct tm* ptm = taosLocalTime(&tt, &tm, NULL, 0);
|
||||||
tm.tm_sec = 0;
|
tm.tm_sec = 0;
|
||||||
tm.tm_min = 0;
|
tm.tm_min = 0;
|
||||||
tm.tm_hour = 0;
|
tm.tm_hour = 0;
|
||||||
|
@ -911,13 +911,13 @@ int64_t taosTimeGetIntervalEnd(int64_t intervalStart, const SInterval* pInterval
|
||||||
// 2020-07-03 17:48:42
|
// 2020-07-03 17:48:42
|
||||||
// and the parameter can also be a variable.
|
// and the parameter can also be a variable.
|
||||||
const char* fmtts(int64_t ts) {
|
const char* fmtts(int64_t ts) {
|
||||||
static char buf[96] = {0};
|
static char buf[TD_TIME_STR_LEN] = {0};
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
|
||||||
if (ts > -62135625943 && ts < 32503651200) {
|
if (ts > -62135625943 && ts < 32503651200) {
|
||||||
time_t t = (time_t)ts;
|
time_t t = (time_t)ts;
|
||||||
if (taosLocalTime(&t, &tm, buf) == NULL) {
|
if (taosLocalTime(&t, &tm, buf, sizeof(buf)) == NULL) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
pos += strftime(buf + pos, sizeof(buf), "s=%Y-%m-%d %H:%M:%S", &tm);
|
pos += strftime(buf + pos, sizeof(buf), "s=%Y-%m-%d %H:%M:%S", &tm);
|
||||||
|
@ -925,7 +925,7 @@ const char* fmtts(int64_t ts) {
|
||||||
|
|
||||||
if (ts > -62135625943000 && ts < 32503651200000) {
|
if (ts > -62135625943000 && ts < 32503651200000) {
|
||||||
time_t t = (time_t)(ts / 1000);
|
time_t t = (time_t)(ts / 1000);
|
||||||
if (taosLocalTime(&t, &tm, buf) == NULL) {
|
if (taosLocalTime(&t, &tm, buf, sizeof(buf)) == NULL) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
|
@ -939,7 +939,7 @@ const char* fmtts(int64_t ts) {
|
||||||
|
|
||||||
{
|
{
|
||||||
time_t t = (time_t)(ts / 1000000);
|
time_t t = (time_t)(ts / 1000000);
|
||||||
if (taosLocalTime(&t, &tm, buf) == NULL) {
|
if (taosLocalTime(&t, &tm, buf, sizeof(buf)) == NULL) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
|
@ -993,7 +993,7 @@ int32_t taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precisio
|
||||||
TAOS_RETURN(TSDB_CODE_INVALID_PARA);
|
TAOS_RETURN(TSDB_CODE_INVALID_PARA);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == taosLocalTime(", &ptm, buf)) {
|
if (NULL == taosLocalTime(", &ptm, buf, bufLen)) {
|
||||||
TAOS_RETURN(TAOS_SYSTEM_ERROR(errno));
|
TAOS_RETURN(TAOS_SYSTEM_ERROR(errno));
|
||||||
}
|
}
|
||||||
int32_t length = (int32_t)strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", &ptm);
|
int32_t length = (int32_t)strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", &ptm);
|
||||||
|
@ -1007,7 +1007,7 @@ int32_t taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precisio
|
||||||
int32_t taosTs2Tm(int64_t ts, int32_t precision, struct STm* tm) {
|
int32_t taosTs2Tm(int64_t ts, int32_t precision, struct STm* tm) {
|
||||||
tm->fsec = ts % TICK_PER_SECOND[precision] * (TICK_PER_SECOND[TSDB_TIME_PRECISION_NANO] / TICK_PER_SECOND[precision]);
|
tm->fsec = ts % TICK_PER_SECOND[precision] * (TICK_PER_SECOND[TSDB_TIME_PRECISION_NANO] / TICK_PER_SECOND[precision]);
|
||||||
time_t t = ts / TICK_PER_SECOND[precision];
|
time_t t = ts / TICK_PER_SECOND[precision];
|
||||||
if (NULL == taosLocalTime(&t, &tm->tm, NULL)) {
|
if (NULL == taosLocalTime(&t, &tm->tm, NULL, 0)) {
|
||||||
TAOS_RETURN(TAOS_SYSTEM_ERROR(errno));
|
TAOS_RETURN(TAOS_SYSTEM_ERROR(errno));
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -14,6 +14,10 @@ IF (TD_ENTERPRISE)
|
||||||
ELSEIF(${BUILD_WITH_COS})
|
ELSEIF(${BUILD_WITH_COS})
|
||||||
add_definitions(-DUSE_COS)
|
add_definitions(-DUSE_COS)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(${BUILD_WITH_ANALYSIS})
|
||||||
|
add_definitions(-DUSE_ANAL)
|
||||||
|
ENDIF()
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
add_library(mnode STATIC ${MNODE_SRC})
|
add_library(mnode STATIC ${MNODE_SRC})
|
||||||
|
|
|
@ -445,7 +445,7 @@ static int32_t mndProcessArbHbTimer(SRpcMsg *pReq) {
|
||||||
|
|
||||||
SDnodeObj *pDnode = mndAcquireDnode(pMnode, dnodeId);
|
SDnodeObj *pDnode = mndAcquireDnode(pMnode, dnodeId);
|
||||||
if (pDnode == NULL) {
|
if (pDnode == NULL) {
|
||||||
mError("dnodeId:%d, timer failed to send arb-hb request, failed find dnode", dnodeId);
|
mError("dnodeId:%d, timer failed to acquire dnode", dnodeId);
|
||||||
taosArrayDestroy(hbMembers);
|
taosArrayDestroy(hbMembers);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -453,7 +453,10 @@ static int32_t mndProcessArbHbTimer(SRpcMsg *pReq) {
|
||||||
int64_t mndTerm = mndGetTerm(pMnode);
|
int64_t mndTerm = mndGetTerm(pMnode);
|
||||||
|
|
||||||
if (mndIsDnodeOnline(pDnode, nowMs)) {
|
if (mndIsDnodeOnline(pDnode, nowMs)) {
|
||||||
TAOS_CHECK_RETURN(mndSendArbHeartBeatReq(pDnode, arbToken, mndTerm, hbMembers));
|
int32_t sendCode = mndSendArbHeartBeatReq(pDnode, arbToken, mndTerm, hbMembers);
|
||||||
|
if (TSDB_CODE_SUCCESS != sendCode) {
|
||||||
|
mError("dnodeId:%d, timer failed to send arb-hb request", dnodeId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mndReleaseDnode(pMnode, pDnode);
|
mndReleaseDnode(pMnode, pDnode);
|
||||||
|
|
|
@ -575,6 +575,8 @@ static int32_t mndOpenSdb(SMnode *pMnode) {
|
||||||
code = sdbReadFile(pMnode->pSdb);
|
code = sdbReadFile(pMnode->pSdb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mInfo("vgId:1, mnode sdb is opened, with applied index:%" PRId64, pMnode->pSdb->commitIndex);
|
||||||
|
|
||||||
atomic_store_64(&pMnode->applied, pMnode->pSdb->commitIndex);
|
atomic_store_64(&pMnode->applied, pMnode->pSdb->commitIndex);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -637,7 +637,7 @@ void mndSyncStop(SMnode *pMnode) {
|
||||||
|
|
||||||
(void)taosThreadMutexLock(&pMgmt->lock);
|
(void)taosThreadMutexLock(&pMgmt->lock);
|
||||||
if (pMgmt->transId != 0) {
|
if (pMgmt->transId != 0) {
|
||||||
mInfo("vgId:1, is stopped and post sem, trans:%d", pMgmt->transId);
|
mInfo("vgId:1, trans:%d, is stopped and post sem", pMgmt->transId);
|
||||||
pMgmt->transId = 0;
|
pMgmt->transId = 0;
|
||||||
pMgmt->transSec = 0;
|
pMgmt->transSec = 0;
|
||||||
pMgmt->errCode = TSDB_CODE_APP_IS_STOPPING;
|
pMgmt->errCode = TSDB_CODE_APP_IS_STOPPING;
|
||||||
|
|
|
@ -589,6 +589,7 @@ STrans *mndAcquireTrans(SMnode *pMnode, int32_t transId) {
|
||||||
|
|
||||||
void mndReleaseTrans(SMnode *pMnode, STrans *pTrans) {
|
void mndReleaseTrans(SMnode *pMnode, STrans *pTrans) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
if (pTrans != NULL) mInfo("vgId:1, trans:%d, release transaction", pTrans->id);
|
||||||
sdbRelease(pSdb, pTrans);
|
sdbRelease(pSdb, pTrans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1131,10 +1132,11 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
|
||||||
if (!sendRsp) {
|
if (!sendRsp) {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
mInfo("trans:%d, send rsp, stage:%s failedTimes:%d code:0x%x", pTrans->id, mndTransStr(pTrans->stage),
|
mInfo("vgId:1, trans:%d, start to send rsp, stage:%s failedTimes:%d code:0x%x", pTrans->id,
|
||||||
pTrans->failedTimes, code);
|
mndTransStr(pTrans->stage), pTrans->failedTimes, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mInfo("vgId:1, trans:%d, start to lock rpc array", pTrans->id);
|
||||||
taosWLockLatch(&pTrans->lockRpcArray);
|
taosWLockLatch(&pTrans->lockRpcArray);
|
||||||
int32_t size = taosArrayGetSize(pTrans->pRpcArray);
|
int32_t size = taosArrayGetSize(pTrans->pRpcArray);
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
|
@ -1155,8 +1157,8 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
|
||||||
if (i != 0 && code == 0) {
|
if (i != 0 && code == 0) {
|
||||||
code = TSDB_CODE_MNODE_NOT_FOUND;
|
code = TSDB_CODE_MNODE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
mInfo("trans:%d, client:%d send rsp, code:0x%x stage:%s app:%p", pTrans->id, i, code, mndTransStr(pTrans->stage),
|
mInfo("vgId:1, trans:%d, client:%d start to send rsp, code:0x%x stage:%s app:%p", pTrans->id, i, code,
|
||||||
pInfo->ahandle);
|
mndTransStr(pTrans->stage), pInfo->ahandle);
|
||||||
|
|
||||||
SRpcMsg rspMsg = {.code = code, .info = *pInfo};
|
SRpcMsg rspMsg = {.code = code, .info = *pInfo};
|
||||||
|
|
||||||
|
@ -1199,6 +1201,9 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tmsgSendRsp(&rspMsg);
|
tmsgSendRsp(&rspMsg);
|
||||||
|
|
||||||
|
mInfo("vgId:1, trans:%d, client:%d send rsp finished, code:0x%x stage:%s app:%p", pTrans->id, i, code,
|
||||||
|
mndTransStr(pTrans->stage), pInfo->ahandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosArrayClear(pTrans->pRpcArray);
|
taosArrayClear(pTrans->pRpcArray);
|
||||||
|
@ -1495,7 +1500,7 @@ static int32_t mndTransExecuteActionsSerial(SMnode *pMnode, STrans *pTrans, SArr
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
mInfo("trans:%d, execute %d actions serial, current redoAction:%d", pTrans->id, numOfActions, pTrans->actionPos);
|
mInfo("trans:%d, execute %d actions serial, current action:%d", pTrans->id, numOfActions, pTrans->actionPos);
|
||||||
|
|
||||||
for (int32_t action = pTrans->actionPos; action < numOfActions; ++action) {
|
for (int32_t action = pTrans->actionPos; action < numOfActions; ++action) {
|
||||||
STransAction *pAction = taosArrayGet(pActions, action);
|
STransAction *pAction = taosArrayGet(pActions, action);
|
||||||
|
@ -1768,7 +1773,8 @@ static bool mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans, bool to
|
||||||
|
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
pTrans->stage = TRN_STAGE_UNDO_ACTION;
|
pTrans->stage = TRN_STAGE_UNDO_ACTION;
|
||||||
mInfo("trans:%d, stage from rollback to undoAction", pTrans->id);
|
pTrans->actionPos = 0;
|
||||||
|
mInfo("trans:%d, stage from rollback to undoAction, actionPos:%d", pTrans->id, pTrans->actionPos);
|
||||||
continueExec = true;
|
continueExec = true;
|
||||||
} else {
|
} else {
|
||||||
pTrans->failedTimes++;
|
pTrans->failedTimes++;
|
||||||
|
|
|
@ -168,11 +168,10 @@ static int32_t sdbCreateDir(SSdb *pSdb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdbSetApplyInfo(SSdb *pSdb, int64_t index, int64_t term, int64_t config) {
|
void sdbSetApplyInfo(SSdb *pSdb, int64_t index, int64_t term, int64_t config) {
|
||||||
#if 1
|
mInfo("vgId:1, mnode apply info changed from index:%" PRId64 " term:%" PRId64 " config:%" PRId64 " to index:%" PRId64
|
||||||
mTrace("mnode apply info changed from index:%" PRId64 " term:%" PRId64 " config:%" PRId64 " to index:%" PRId64
|
|
||||||
" term:%" PRId64 " config:%" PRId64,
|
" term:%" PRId64 " config:%" PRId64,
|
||||||
pSdb->applyIndex, pSdb->applyTerm, pSdb->applyConfig, index, term, config);
|
pSdb->applyIndex, pSdb->applyTerm, pSdb->applyConfig, index, term, config);
|
||||||
#endif
|
|
||||||
pSdb->applyIndex = index;
|
pSdb->applyIndex = index;
|
||||||
pSdb->applyTerm = term;
|
pSdb->applyTerm = term;
|
||||||
pSdb->applyConfig = config;
|
pSdb->applyConfig = config;
|
||||||
|
|
|
@ -207,6 +207,8 @@ static int32_t sdbWriteFileHead(SSdb *pSdb, TdFilePtr pFile) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mInfo("vgId:1, write sdb file with sdb applyIndex:%" PRId64 " term:%" PRId64 " config:%" PRId64, pSdb->applyIndex,
|
||||||
|
pSdb->applyTerm, pSdb->applyConfig);
|
||||||
if (taosWriteFile(pFile, &pSdb->applyIndex, sizeof(int64_t)) != sizeof(int64_t)) {
|
if (taosWriteFile(pFile, &pSdb->applyIndex, sizeof(int64_t)) != sizeof(int64_t)) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
@ -607,6 +609,9 @@ int32_t sdbWriteFile(SSdb *pSdb, int32_t delta) {
|
||||||
}
|
}
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("failed to write sdb file since %s", tstrerror(code));
|
mError("failed to write sdb file since %s", tstrerror(code));
|
||||||
|
} else {
|
||||||
|
mInfo("write sdb file success, apply index:%" PRId64 " term:%" PRId64 " config:%" PRId64, pSdb->applyIndex,
|
||||||
|
pSdb->applyTerm, pSdb->applyConfig);
|
||||||
}
|
}
|
||||||
(void)taosThreadMutexUnlock(&pSdb->filelock);
|
(void)taosThreadMutexUnlock(&pSdb->filelock);
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -42,6 +42,7 @@ void sdbFreeRow(SSdb *pSdb, SSdbRow *pRow, bool callFunc) {
|
||||||
// remove attached object such as trans
|
// remove attached object such as trans
|
||||||
SdbDeleteFp deleteFp = pSdb->deleteFps[pRow->type];
|
SdbDeleteFp deleteFp = pSdb->deleteFps[pRow->type];
|
||||||
if (deleteFp != NULL) {
|
if (deleteFp != NULL) {
|
||||||
|
mInfo("vgId:1, deleteFp:%p, type:%s", deleteFp, sdbTableName(pRow->type));
|
||||||
(void)(*deleteFp)(pSdb, pRow->pObj, callFunc);
|
(void)(*deleteFp)(pSdb, pRow->pObj, callFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1767,10 +1767,14 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache
|
||||||
SLastCol *pLastCol = h ? (SLastCol *)taosLRUCacheValue(pCache, h) : NULL;
|
SLastCol *pLastCol = h ? (SLastCol *)taosLRUCacheValue(pCache, h) : NULL;
|
||||||
if (h && pLastCol->cacheStatus != TSDB_LAST_CACHE_NO_CACHE) {
|
if (h && pLastCol->cacheStatus != TSDB_LAST_CACHE_NO_CACHE) {
|
||||||
SLastCol lastCol = *pLastCol;
|
SLastCol lastCol = *pLastCol;
|
||||||
TAOS_CHECK_GOTO(tsdbCacheReallocSLastCol(&lastCol, NULL), NULL, _exit);
|
if (TSDB_CODE_SUCCESS != (code = tsdbCacheReallocSLastCol(&lastCol, NULL))) {
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _exit);
|
||||||
|
}
|
||||||
|
|
||||||
if (taosArrayPush(pLastArray, &lastCol) == NULL) {
|
if (taosArrayPush(pLastArray, &lastCol) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1780,28 +1784,33 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache
|
||||||
|
|
||||||
if (taosArrayPush(pLastArray, &noneCol) == NULL) {
|
if (taosArrayPush(pLastArray, &noneCol) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!remainCols) {
|
if (!remainCols) {
|
||||||
if ((remainCols = taosArrayInit(numKeys, sizeof(SIdxKey))) == NULL) {
|
if ((remainCols = taosArrayInit(numKeys, sizeof(SIdxKey))) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ignoreFromRocks) {
|
if (!ignoreFromRocks) {
|
||||||
if ((ignoreFromRocks = taosArrayInit(numKeys, sizeof(bool))) == NULL) {
|
if ((ignoreFromRocks = taosArrayInit(numKeys, sizeof(bool))) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (taosArrayPush(remainCols, &(SIdxKey){i, key}) == NULL) {
|
if (taosArrayPush(remainCols, &(SIdxKey){i, key}) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
bool ignoreRocks = pLastCol ? (pLastCol->cacheStatus == TSDB_LAST_CACHE_NO_CACHE) : false;
|
bool ignoreRocks = pLastCol ? (pLastCol->cacheStatus == TSDB_LAST_CACHE_NO_CACHE) : false;
|
||||||
if (taosArrayPush(ignoreFromRocks, &ignoreRocks) == NULL) {
|
if (taosArrayPush(ignoreFromRocks, &ignoreRocks) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1822,6 +1831,7 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache
|
||||||
SLastCol lastCol = *pLastCol;
|
SLastCol lastCol = *pLastCol;
|
||||||
code = tsdbCacheReallocSLastCol(&lastCol, NULL);
|
code = tsdbCacheReallocSLastCol(&lastCol, NULL);
|
||||||
if (code) {
|
if (code) {
|
||||||
|
tsdbLRUCacheRelease(pCache, h, false);
|
||||||
(void)taosThreadMutexUnlock(&pTsdb->lruMutex);
|
(void)taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
|
@ -623,6 +623,7 @@ static int32_t tsdbSnapWriteFileSetOpenReader(STsdbSnapWriter* writer) {
|
||||||
int32_t lino = 0;
|
int32_t lino = 0;
|
||||||
|
|
||||||
if (writer->ctx->fset) {
|
if (writer->ctx->fset) {
|
||||||
|
#if 0
|
||||||
// open data reader
|
// open data reader
|
||||||
SDataFileReaderConfig dataFileReaderConfig = {
|
SDataFileReaderConfig dataFileReaderConfig = {
|
||||||
.tsdb = writer->tsdb,
|
.tsdb = writer->tsdb,
|
||||||
|
@ -650,6 +651,7 @@ static int32_t tsdbSnapWriteFileSetOpenReader(STsdbSnapWriter* writer) {
|
||||||
|
|
||||||
code = tsdbDataFileReaderOpen(NULL, &dataFileReaderConfig, &writer->ctx->dataReader);
|
code = tsdbDataFileReaderOpen(NULL, &dataFileReaderConfig, &writer->ctx->dataReader);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
#endif
|
||||||
|
|
||||||
// open stt reader array
|
// open stt reader array
|
||||||
SSttLvl* lvl;
|
SSttLvl* lvl;
|
||||||
|
@ -791,6 +793,15 @@ static int32_t tsdbSnapWriteFileSetOpenWriter(STsdbSnapWriter* writer) {
|
||||||
.did = writer->ctx->did,
|
.did = writer->ctx->did,
|
||||||
.level = 0,
|
.level = 0,
|
||||||
};
|
};
|
||||||
|
// merge stt files to either data or a new stt file
|
||||||
|
if (writer->ctx->fset) {
|
||||||
|
for (int32_t ftype = 0; ftype < TSDB_FTYPE_MAX; ++ftype) {
|
||||||
|
if (writer->ctx->fset->farr[ftype] != NULL) {
|
||||||
|
config.files[ftype].exist = true;
|
||||||
|
config.files[ftype].file = writer->ctx->fset->farr[ftype]->f[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
code = tsdbFSetWriterOpen(&config, &writer->ctx->fsetWriter);
|
code = tsdbFSetWriterOpen(&config, &writer->ctx->fsetWriter);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
@ -842,6 +853,8 @@ static int32_t tsdbSnapWriteFileSetBegin(STsdbSnapWriter* writer, int32_t fid) {
|
||||||
_exit:
|
_exit:
|
||||||
if (code) {
|
if (code) {
|
||||||
TSDB_ERROR_LOG(TD_VID(writer->tsdb->pVnode), lino, code);
|
TSDB_ERROR_LOG(TD_VID(writer->tsdb->pVnode), lino, code);
|
||||||
|
} else {
|
||||||
|
tsdbInfo("vgId:%d %s succeeded, fid:%d", TD_VID(writer->tsdb->pVnode), __func__, fid);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -922,6 +935,8 @@ static int32_t tsdbSnapWriteFileSetEnd(STsdbSnapWriter* writer) {
|
||||||
_exit:
|
_exit:
|
||||||
if (code) {
|
if (code) {
|
||||||
TSDB_ERROR_LOG(TD_VID(writer->tsdb->pVnode), lino, code);
|
TSDB_ERROR_LOG(TD_VID(writer->tsdb->pVnode), lino, code);
|
||||||
|
} else {
|
||||||
|
tsdbInfo("vgId:%d %s succeeded, fid:%d", TD_VID(writer->tsdb->pVnode), __func__, writer->ctx->fid);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1175,7 +1190,7 @@ _exit:
|
||||||
if (code) {
|
if (code) {
|
||||||
TSDB_ERROR_LOG(TD_VID(tsdb->pVnode), lino, code);
|
TSDB_ERROR_LOG(TD_VID(tsdb->pVnode), lino, code);
|
||||||
} else {
|
} else {
|
||||||
tsdbInfo("vgId:%d %s done", TD_VID(tsdb->pVnode), __func__);
|
tsdbInfo("vgId:%d %s done, rollback:%d", TD_VID(tsdb->pVnode), __func__, rollback);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,9 +102,8 @@ static int32_t vnodeGetBufPoolToUse(SVnode *pVnode) {
|
||||||
ts.tv_sec = tv.tv_sec;
|
ts.tv_sec = tv.tv_sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rc = taosThreadCondTimedWait(&pVnode->poolNotEmpty, &pVnode->mutex, &ts);
|
code = taosThreadCondTimedWait(&pVnode->poolNotEmpty, &pVnode->mutex, &ts);
|
||||||
if (rc && rc != ETIMEDOUT) {
|
if (code && code != TSDB_CODE_TIMEOUT_ERROR) {
|
||||||
code = TAOS_SYSTEM_ERROR(rc);
|
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2916,7 +2916,7 @@ int32_t ctgHandleGetTbTSMARsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf
|
||||||
|
|
||||||
if (META_TYPE_BOTH_TABLE == pOut->metaType) {
|
if (META_TYPE_BOTH_TABLE == pOut->metaType) {
|
||||||
// rewrite tsma fetch table with it's super table name
|
// rewrite tsma fetch table with it's super table name
|
||||||
(void)sprintf(pFetch->tsmaSourceTbName.tname, "%s", pOut->tbName);
|
(void)snprintf(pFetch->tsmaSourceTbName.tname, sizeof(pFetch->tsmaSourceTbName.tname), "%s", pOut->tbName);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgGetTbTSMAFromMnode(pCtg, pConn, &pFetch->tsmaSourceTbName, NULL, tReq, TDMT_MND_GET_TABLE_TSMA));
|
CTG_ERR_JRET(ctgGetTbTSMAFromMnode(pCtg, pConn, &pFetch->tsmaSourceTbName, NULL, tReq, TDMT_MND_GET_TABLE_TSMA));
|
||||||
|
|
|
@ -176,22 +176,22 @@ int32_t ctgdLaunchAsyncCall(SCatalog *pCtg, SRequestConnInfo *pConn, uint64_t re
|
||||||
taosArrayPush(req.pTableMeta, &name);
|
taosArrayPush(req.pTableMeta, &name);
|
||||||
taosArrayPush(req.pTableHash, &name);
|
taosArrayPush(req.pTableHash, &name);
|
||||||
|
|
||||||
strcpy(dbFName, "1.db1");
|
tstrncpy(dbFName, "1.db1", sizeof(dbFName));
|
||||||
taosArrayPush(req.pDbVgroup, dbFName);
|
taosArrayPush(req.pDbVgroup, dbFName);
|
||||||
taosArrayPush(req.pDbCfg, dbFName);
|
taosArrayPush(req.pDbCfg, dbFName);
|
||||||
taosArrayPush(req.pDbInfo, dbFName);
|
taosArrayPush(req.pDbInfo, dbFName);
|
||||||
strcpy(dbFName, "1.db2");
|
tstrncpy(dbFName, "1.db2", sizeof(dbFName));
|
||||||
taosArrayPush(req.pDbVgroup, dbFName);
|
taosArrayPush(req.pDbVgroup, dbFName);
|
||||||
taosArrayPush(req.pDbCfg, dbFName);
|
taosArrayPush(req.pDbCfg, dbFName);
|
||||||
taosArrayPush(req.pDbInfo, dbFName);
|
taosArrayPush(req.pDbInfo, dbFName);
|
||||||
|
|
||||||
strcpy(funcName, "udf1");
|
tstrncpy(funcName, "udf1", sizeof(funcName));
|
||||||
taosArrayPush(req.pUdf, funcName);
|
taosArrayPush(req.pUdf, funcName);
|
||||||
strcpy(funcName, "udf2");
|
tstrncpy(funcName, "udf2", sizeof(funcName));
|
||||||
taosArrayPush(req.pUdf, funcName);
|
taosArrayPush(req.pUdf, funcName);
|
||||||
|
|
||||||
strcpy(user.user, "root");
|
tstrncpy(user.user, "root", sizeof(user.user));
|
||||||
strcpy(user.dbFName, "1.db1");
|
tstrncpy(user.dbFName, "1.db1", sizeof(user.dbFName));
|
||||||
user.type = AUTH_TYPE_READ;
|
user.type = AUTH_TYPE_READ;
|
||||||
taosArrayPush(req.pUser, &user);
|
taosArrayPush(req.pUser, &user);
|
||||||
user.type = AUTH_TYPE_WRITE;
|
user.type = AUTH_TYPE_WRITE;
|
||||||
|
@ -199,8 +199,8 @@ int32_t ctgdLaunchAsyncCall(SCatalog *pCtg, SRequestConnInfo *pConn, uint64_t re
|
||||||
user.type = AUTH_TYPE_OTHER;
|
user.type = AUTH_TYPE_OTHER;
|
||||||
taosArrayPush(req.pUser, &user);
|
taosArrayPush(req.pUser, &user);
|
||||||
|
|
||||||
strcpy(user.user, "user1");
|
tstrncpy(user.user, "user1", sizeof(user.user));
|
||||||
strcpy(user.dbFName, "1.db2");
|
tstrncpy(user.dbFName, "1.db2", sizeof(user.dbFName));
|
||||||
user.type = AUTH_TYPE_READ;
|
user.type = AUTH_TYPE_READ;
|
||||||
taosArrayPush(req.pUser, &user);
|
taosArrayPush(req.pUser, &user);
|
||||||
user.type = AUTH_TYPE_WRITE;
|
user.type = AUTH_TYPE_WRITE;
|
||||||
|
@ -335,7 +335,7 @@ int32_t ctgdHandleDbgCommand(char *command) {
|
||||||
CTG_RET(TSDB_CODE_INVALID_PARA);
|
CTG_RET(TSDB_CODE_INVALID_PARA);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool enable = atoi(param);
|
bool enable = taosStr2Int32(param, NULL, 10);
|
||||||
|
|
||||||
int32_t code = ctgdEnableDebug(option, enable);
|
int32_t code = ctgdEnableDebug(option, enable);
|
||||||
|
|
||||||
|
|
|
@ -1303,7 +1303,7 @@ int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo* pConn, const
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_TABLE_META;
|
int32_t reqType = TDMT_MND_TABLE_META;
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
(void)sprintf(tbFName, "%s.%s", dbFName, tbName);
|
(void)snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
|
||||||
void* (*mallocFp)(int64_t) = pTask ? (MallocType)taosMemoryMalloc : (MallocType)rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? (MallocType)taosMemoryMalloc : (MallocType)rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get table meta from mnode, tbFName:%s", tbFName);
|
ctgDebug("try to get table meta from mnode, tbFName:%s", tbFName);
|
||||||
|
@ -1369,7 +1369,7 @@ int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo* pConn, const SNa
|
||||||
(void)tNameGetFullDbName(pTableName, dbFName);
|
(void)tNameGetFullDbName(pTableName, dbFName);
|
||||||
int32_t reqType = (pTask && pTask->type == CTG_TASK_GET_TB_NAME ? TDMT_VND_TABLE_NAME : TDMT_VND_TABLE_META);
|
int32_t reqType = (pTask && pTask->type == CTG_TASK_GET_TB_NAME ? TDMT_VND_TABLE_NAME : TDMT_VND_TABLE_META);
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
(void)sprintf(tbFName, "%s.%s", dbFName, pTableName->tname);
|
(void)snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, pTableName->tname);
|
||||||
void* (*mallocFp)(int64_t) = pTask ? (MallocType)taosMemoryMalloc : (MallocType)rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? (MallocType)taosMemoryMalloc : (MallocType)rpcMallocCont;
|
||||||
|
|
||||||
SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
|
SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
|
||||||
|
|
|
@ -1386,7 +1386,7 @@ int32_t ctgGetVgInfosFromHashValue(SCatalog* pCtg, SEpSet* pMgmgEpSet, SCtgTaskR
|
||||||
}
|
}
|
||||||
|
|
||||||
char tbFullName[TSDB_TABLE_FNAME_LEN];
|
char tbFullName[TSDB_TABLE_FNAME_LEN];
|
||||||
(void)sprintf(tbFullName, "%s.", dbFName);
|
(void)snprintf(tbFullName, sizeof(tbFullName), "%s.", dbFName);
|
||||||
int32_t offset = strlen(tbFullName);
|
int32_t offset = strlen(tbFullName);
|
||||||
SName* pName = NULL;
|
SName* pName = NULL;
|
||||||
int32_t tbNameLen = 0;
|
int32_t tbNameLen = 0;
|
||||||
|
@ -2070,7 +2070,7 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)sprintf(tbFName, "%s.%s", dbFName, stbName);
|
(void)snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, stbName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,10 @@ if(${TD_DARWIN})
|
||||||
target_compile_options(executor PRIVATE -Wno-error=deprecated-non-prototype)
|
target_compile_options(executor PRIVATE -Wno-error=deprecated-non-prototype)
|
||||||
endif(${TD_DARWIN})
|
endif(${TD_DARWIN})
|
||||||
|
|
||||||
|
IF(${BUILD_WITH_ANALYSIS})
|
||||||
|
add_definitions(-DUSE_ANAL)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
target_link_libraries(executor
|
target_link_libraries(executor
|
||||||
PRIVATE os util common function parser planner qcom scalar nodes index wal tdb geometry
|
PRIVATE os util common function parser planner qcom scalar nodes index wal tdb geometry
|
||||||
)
|
)
|
||||||
|
|
|
@ -79,13 +79,14 @@ static void logGroupCacheExecInfo(SGroupCacheOperatorInfo* pGrpCacheOperator) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* buf = taosMemoryMalloc(pGrpCacheOperator->downstreamNum * 32 + 100);
|
int32_t bufSize = pGrpCacheOperator->downstreamNum * 32 + 100;
|
||||||
|
char* buf = taosMemoryMalloc(bufSize);
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int32_t offset = sprintf(buf, "groupCache exec info, downstreamBlkNum:");
|
int32_t offset = snprintf(buf, bufSize, "groupCache exec info, downstreamBlkNum:");
|
||||||
for (int32_t i = 0; i < pGrpCacheOperator->downstreamNum; ++i) {
|
for (int32_t i = 0; i < pGrpCacheOperator->downstreamNum; ++i) {
|
||||||
offset += sprintf(buf + offset, " %" PRId64 , pGrpCacheOperator->execInfo.pDownstreamBlkNum[i]);
|
offset += snprintf(buf + offset, bufSize, " %" PRId64 , pGrpCacheOperator->execInfo.pDownstreamBlkNum[i]);
|
||||||
}
|
}
|
||||||
qDebug("%s", buf);
|
qDebug("%s", buf);
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
|
@ -234,7 +235,7 @@ static int32_t acquireFdFromFileCtx(SGcFileCacheCtx* pFileCtx, int32_t fileId, S
|
||||||
|
|
||||||
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
||||||
if (NULL == pTmp) {
|
if (NULL == pTmp) {
|
||||||
(void)sprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], "_%d", fileId);
|
(void)snprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], sizeof(pFileCtx->baseFilename) - pFileCtx->baseNameLen, "_%d", fileId);
|
||||||
|
|
||||||
SGroupCacheFileInfo newFile = {0};
|
SGroupCacheFileInfo newFile = {0};
|
||||||
if (taosHashPut(pFileCtx->pCacheFile, &fileId, sizeof(fileId), &newFile, sizeof(newFile))) {
|
if (taosHashPut(pFileCtx->pCacheFile, &fileId, sizeof(fileId), &newFile, sizeof(newFile))) {
|
||||||
|
@ -439,7 +440,7 @@ static FORCE_INLINE void chkRemoveVgroupCurrFile(SGcFileCacheCtx* pFileCtx, int3
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* debug only */
|
/* debug only */
|
||||||
sprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], "_%d", pFileCtx->fileId);
|
snprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], sizeof(pFileCtx->baseFilename) - pFileCtx->baseNameLen, "_%d", pFileCtx->fileId);
|
||||||
taosRemoveFile(pFileCtx->baseFilename);
|
taosRemoveFile(pFileCtx->baseFilename);
|
||||||
/* debug only */
|
/* debug only */
|
||||||
#endif
|
#endif
|
||||||
|
@ -813,7 +814,7 @@ static int32_t addFileRefTableNum(SGcFileCacheCtx* pFileCtx, int32_t fileId, int
|
||||||
|
|
||||||
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
||||||
if (NULL == pTmp) {
|
if (NULL == pTmp) {
|
||||||
(void)sprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], "_%u", fileId);
|
(void)snprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], sizeof(pFileCtx->baseFilename) - pFileCtx->baseNameLen, "_%u", fileId);
|
||||||
|
|
||||||
SGroupCacheFileInfo newFile = {0};
|
SGroupCacheFileInfo newFile = {0};
|
||||||
newFile.groupNum = 1;
|
newFile.groupNum = 1;
|
||||||
|
@ -1377,7 +1378,7 @@ static void freeRemoveGroupCacheData(void* p) {
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* debug only */
|
/* debug only */
|
||||||
sprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], "_%d", pGroup->fileId);
|
snprintf(&pFileCtx->baseFilename[pFileCtx->baseNameLen], sizeof(pFileCtx->baseFilename) - pFileCtx->baseNameLen, "_%d", pGroup->fileId);
|
||||||
taosRemoveFile(pFileCtx->baseFilename);
|
taosRemoveFile(pFileCtx->baseFilename);
|
||||||
/* debug only */
|
/* debug only */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
#define STREAM_SESSION_OP_CHECKPOINT_NAME "StreamSessionOperator_Checkpoint"
|
#define STREAM_SESSION_OP_CHECKPOINT_NAME "StreamSessionOperator_Checkpoint"
|
||||||
#define STREAM_STATE_OP_CHECKPOINT_NAME "StreamStateOperator_Checkpoint"
|
#define STREAM_STATE_OP_CHECKPOINT_NAME "StreamStateOperator_Checkpoint"
|
||||||
|
|
||||||
#define MAX_STREAM_HISTORY_RESULT 100000000
|
#define MAX_STREAM_HISTORY_RESULT 20000000
|
||||||
|
|
||||||
typedef struct SStateWindowInfo {
|
typedef struct SStateWindowInfo {
|
||||||
SResultWindowInfo winInfo;
|
SResultWindowInfo winInfo;
|
||||||
|
|
|
@ -209,10 +209,10 @@ static int32_t countTrailingSpaces(const SValueNode* pVal, bool isLtrim) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t addTimezoneParam(SNodeList* pList) {
|
static int32_t addTimezoneParam(SNodeList* pList) {
|
||||||
char buf[6] = {0};
|
char buf[TD_TIME_STR_LEN] = {0};
|
||||||
time_t t = taosTime(NULL);
|
time_t t = taosTime(NULL);
|
||||||
struct tm tmInfo;
|
struct tm tmInfo;
|
||||||
if (taosLocalTime(&t, &tmInfo, buf) != NULL) {
|
if (taosLocalTime(&t, &tmInfo, buf, sizeof(buf)) != NULL) {
|
||||||
(void)strftime(buf, sizeof(buf), "%z", &tmInfo);
|
(void)strftime(buf, sizeof(buf), "%z", &tmInfo);
|
||||||
}
|
}
|
||||||
int32_t len = (int32_t)strlen(buf);
|
int32_t len = (int32_t)strlen(buf);
|
||||||
|
@ -4839,6 +4839,48 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.sprocessFunc = randFunction,
|
.sprocessFunc = randFunction,
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = NULL
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "forecast",
|
||||||
|
.type = FUNCTION_TYPE_FORECAST,
|
||||||
|
.classification = FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
|
FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
|
||||||
|
.translateFunc = translateForecast,
|
||||||
|
.getEnvFunc = getSelectivityFuncEnv,
|
||||||
|
.initFunc = functionSetup,
|
||||||
|
.processFunc = NULL,
|
||||||
|
.finalizeFunc = NULL,
|
||||||
|
.estimateReturnRowsFunc = forecastEstReturnRows,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "_frowts",
|
||||||
|
.type = FUNCTION_TYPE_FORECAST_ROWTS,
|
||||||
|
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_FORECAST_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
|
||||||
|
.translateFunc = translateTimePseudoColumn,
|
||||||
|
.getEnvFunc = getTimePseudoFuncEnv,
|
||||||
|
.initFunc = NULL,
|
||||||
|
.sprocessFunc = NULL,
|
||||||
|
.finalizeFunc = NULL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "_flow",
|
||||||
|
.type = FUNCTION_TYPE_FORECAST_LOW,
|
||||||
|
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_FORECAST_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
|
||||||
|
.translateFunc = translateForecastConf,
|
||||||
|
.getEnvFunc = getForecastConfEnv,
|
||||||
|
.initFunc = NULL,
|
||||||
|
.sprocessFunc = NULL,
|
||||||
|
.finalizeFunc = NULL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "_fhigh",
|
||||||
|
.type = FUNCTION_TYPE_FORECAST_HIGH,
|
||||||
|
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_FORECAST_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
|
||||||
|
.translateFunc = translateForecastConf,
|
||||||
|
.getEnvFunc = getForecastConfEnv,
|
||||||
|
.initFunc = NULL,
|
||||||
|
.sprocessFunc = NULL,
|
||||||
|
.finalizeFunc = NULL
|
||||||
|
},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -158,11 +158,12 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) {
|
||||||
char *taosFqdnEnvItem = NULL;
|
char *taosFqdnEnvItem = NULL;
|
||||||
char *taosFqdn = getenv("TAOS_FQDN");
|
char *taosFqdn = getenv("TAOS_FQDN");
|
||||||
if (taosFqdn != NULL) {
|
if (taosFqdn != NULL) {
|
||||||
int len = strlen("TAOS_FQDN=") + strlen(taosFqdn) + 1;
|
int subLen = strlen(taosFqdn);
|
||||||
|
int len = strlen("TAOS_FQDN=") + subLen + 1;
|
||||||
taosFqdnEnvItem = taosMemoryMalloc(len);
|
taosFqdnEnvItem = taosMemoryMalloc(len);
|
||||||
if (taosFqdnEnvItem != NULL) {
|
if (taosFqdnEnvItem != NULL) {
|
||||||
tstrncpy(taosFqdnEnvItem, "TAOS_FQDN=", len);
|
tstrncpy(taosFqdnEnvItem, "TAOS_FQDN=", len);
|
||||||
TAOS_STRNCAT(taosFqdnEnvItem, taosFqdn, strlen(taosFqdn));
|
TAOS_STRNCAT(taosFqdnEnvItem, taosFqdn, subLen);
|
||||||
fnInfo("[UDFD]Succsess to set TAOS_FQDN:%s", taosFqdn);
|
fnInfo("[UDFD]Succsess to set TAOS_FQDN:%s", taosFqdn);
|
||||||
} else {
|
} else {
|
||||||
fnError("[UDFD]Failed to allocate memory for TAOS_FQDN");
|
fnError("[UDFD]Failed to allocate memory for TAOS_FQDN");
|
||||||
|
|
|
@ -368,6 +368,13 @@ static int32_t countWindowNodeCopy(const SCountWindowNode* pSrc, SCountWindowNod
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t anomalyWindowNodeCopy(const SAnomalyWindowNode* pSrc, SAnomalyWindowNode* pDst) {
|
||||||
|
CLONE_NODE_FIELD(pCol);
|
||||||
|
CLONE_NODE_FIELD(pExpr);
|
||||||
|
COPY_CHAR_ARRAY_FIELD(anomalyOpt);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t sessionWindowNodeCopy(const SSessionWindowNode* pSrc, SSessionWindowNode* pDst) {
|
static int32_t sessionWindowNodeCopy(const SSessionWindowNode* pSrc, SSessionWindowNode* pDst) {
|
||||||
CLONE_NODE_FIELD_EX(pCol, SColumnNode*);
|
CLONE_NODE_FIELD_EX(pCol, SColumnNode*);
|
||||||
CLONE_NODE_FIELD_EX(pGap, SValueNode*);
|
CLONE_NODE_FIELD_EX(pGap, SValueNode*);
|
||||||
|
@ -622,6 +629,8 @@ static int32_t logicWindowCopy(const SWindowLogicNode* pSrc, SWindowLogicNode* p
|
||||||
COPY_SCALAR_FIELD(windowAlgo);
|
COPY_SCALAR_FIELD(windowAlgo);
|
||||||
COPY_SCALAR_FIELD(windowCount);
|
COPY_SCALAR_FIELD(windowCount);
|
||||||
COPY_SCALAR_FIELD(windowSliding);
|
COPY_SCALAR_FIELD(windowSliding);
|
||||||
|
CLONE_NODE_FIELD(pAnomalyExpr);
|
||||||
|
COPY_CHAR_ARRAY_FIELD(anomalyOpt);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -674,6 +683,12 @@ static int32_t logicInterpFuncCopy(const SInterpFuncLogicNode* pSrc, SInterpFunc
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t logicForecastFuncCopy(const SForecastFuncLogicNode* pSrc, SForecastFuncLogicNode* pDst) {
|
||||||
|
COPY_BASE_OBJECT_FIELD(node, logicNodeCopy);
|
||||||
|
CLONE_NODE_LIST_FIELD(pFuncs);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t logicGroupCacheCopy(const SGroupCacheLogicNode* pSrc, SGroupCacheLogicNode* pDst) {
|
static int32_t logicGroupCacheCopy(const SGroupCacheLogicNode* pSrc, SGroupCacheLogicNode* pDst) {
|
||||||
COPY_BASE_OBJECT_FIELD(node, logicNodeCopy);
|
COPY_BASE_OBJECT_FIELD(node, logicNodeCopy);
|
||||||
COPY_SCALAR_FIELD(grpColsMayBeNull);
|
COPY_SCALAR_FIELD(grpColsMayBeNull);
|
||||||
|
@ -937,6 +952,9 @@ int32_t nodesCloneNode(const SNode* pNode, SNode** ppNode) {
|
||||||
case QUERY_NODE_COUNT_WINDOW:
|
case QUERY_NODE_COUNT_WINDOW:
|
||||||
code = countWindowNodeCopy((const SCountWindowNode*)pNode, (SCountWindowNode*)pDst);
|
code = countWindowNodeCopy((const SCountWindowNode*)pNode, (SCountWindowNode*)pDst);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW:
|
||||||
|
code = anomalyWindowNodeCopy((const SAnomalyWindowNode*)pNode, (SAnomalyWindowNode*)pDst);
|
||||||
|
break;
|
||||||
case QUERY_NODE_SESSION_WINDOW:
|
case QUERY_NODE_SESSION_WINDOW:
|
||||||
code = sessionWindowNodeCopy((const SSessionWindowNode*)pNode, (SSessionWindowNode*)pDst);
|
code = sessionWindowNodeCopy((const SSessionWindowNode*)pNode, (SSessionWindowNode*)pDst);
|
||||||
break;
|
break;
|
||||||
|
@ -1021,6 +1039,9 @@ int32_t nodesCloneNode(const SNode* pNode, SNode** ppNode) {
|
||||||
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
||||||
code = logicInterpFuncCopy((const SInterpFuncLogicNode*)pNode, (SInterpFuncLogicNode*)pDst);
|
code = logicInterpFuncCopy((const SInterpFuncLogicNode*)pNode, (SInterpFuncLogicNode*)pDst);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
|
||||||
|
code = logicForecastFuncCopy((const SForecastFuncLogicNode*)pNode, (SForecastFuncLogicNode*)pDst);
|
||||||
|
break;
|
||||||
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
||||||
code = logicGroupCacheCopy((const SGroupCacheLogicNode*)pNode, (SGroupCacheLogicNode*)pDst);
|
code = logicGroupCacheCopy((const SGroupCacheLogicNode*)pNode, (SGroupCacheLogicNode*)pDst);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -97,6 +97,8 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "WindowOffset";
|
return "WindowOffset";
|
||||||
case QUERY_NODE_COUNT_WINDOW:
|
case QUERY_NODE_COUNT_WINDOW:
|
||||||
return "CountWindow";
|
return "CountWindow";
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW:
|
||||||
|
return "AnomalyWindow";
|
||||||
case QUERY_NODE_SET_OPERATOR:
|
case QUERY_NODE_SET_OPERATOR:
|
||||||
return "SetOperator";
|
return "SetOperator";
|
||||||
case QUERY_NODE_SELECT_STMT:
|
case QUERY_NODE_SELECT_STMT:
|
||||||
|
@ -153,6 +155,12 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "CreateQnodeStmt";
|
return "CreateQnodeStmt";
|
||||||
case QUERY_NODE_DROP_QNODE_STMT:
|
case QUERY_NODE_DROP_QNODE_STMT:
|
||||||
return "DropQnodeStmt";
|
return "DropQnodeStmt";
|
||||||
|
case QUERY_NODE_CREATE_ANODE_STMT:
|
||||||
|
return "CreateAnodeStmt";
|
||||||
|
case QUERY_NODE_DROP_ANODE_STMT:
|
||||||
|
return "DropAnodeStmt";
|
||||||
|
case QUERY_NODE_UPDATE_ANODE_STMT:
|
||||||
|
return "UpdateAnodeStmt";
|
||||||
case QUERY_NODE_CREATE_SNODE_STMT:
|
case QUERY_NODE_CREATE_SNODE_STMT:
|
||||||
return "CreateSnodeStmt";
|
return "CreateSnodeStmt";
|
||||||
case QUERY_NODE_DROP_SNODE_STMT:
|
case QUERY_NODE_DROP_SNODE_STMT:
|
||||||
|
@ -213,6 +221,10 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "ShowModulesStmt";
|
return "ShowModulesStmt";
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
return "ShowQnodesStmt";
|
return "ShowQnodesStmt";
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
return "ShowAnodesStmt";
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
|
return "ShowAnodesFullStmt";
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
return "ShowSnodesStmt";
|
return "ShowSnodesStmt";
|
||||||
case QUERY_NODE_SHOW_BNODES_STMT:
|
case QUERY_NODE_SHOW_BNODES_STMT:
|
||||||
|
@ -328,6 +340,8 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "LogicIndefRowsFunc";
|
return "LogicIndefRowsFunc";
|
||||||
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
||||||
return "LogicInterpFunc";
|
return "LogicInterpFunc";
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
|
||||||
|
return "LogicForecastFunc";
|
||||||
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
||||||
return "LogicGroupCache";
|
return "LogicGroupCache";
|
||||||
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
||||||
|
@ -362,6 +376,10 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "PhysiMergeCountWindow";
|
return "PhysiMergeCountWindow";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
||||||
return "PhysiStreamCountWindow";
|
return "PhysiStreamCountWindow";
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY:
|
||||||
|
return "PhysiMergeAnomalyWindow";
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_ANOMALY:
|
||||||
|
return "PhysiStreamAnomalyWindow";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
||||||
return "PhysiProject";
|
return "PhysiProject";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
|
||||||
|
@ -413,6 +431,8 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "PhysiIndefRowsFunc";
|
return "PhysiIndefRowsFunc";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
||||||
return "PhysiInterpFunc";
|
return "PhysiInterpFunc";
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
|
||||||
|
return "PhysiForecastFunc";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
return "PhysiDispatch";
|
return "PhysiDispatch";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
||||||
|
@ -1260,6 +1280,30 @@ static int32_t jsonToLogicInterpFuncNode(const SJson* pJson, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* jkForecastFuncLogicPlanFuncs = "Funcs";
|
||||||
|
|
||||||
|
static int32_t logicForecastFuncNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SForecastFuncLogicNode* pNode = (const SForecastFuncLogicNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = logicPlanNodeToJson(pObj, pJson);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodeListToJson(pJson, jkForecastFuncLogicPlanFuncs, pNode->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToLogicForecastFuncNode(const SJson* pJson, void* pObj) {
|
||||||
|
SForecastFuncLogicNode* pNode = (SForecastFuncLogicNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = jsonToLogicPlanNode(pJson, pObj);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = jsonToNodeList(pJson, jkForecastFuncLogicPlanFuncs, &pNode->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* jkGroupCacheLogicPlanGrpColsMayBeNull = "GroupColsMayBeNull";
|
static const char* jkGroupCacheLogicPlanGrpColsMayBeNull = "GroupColsMayBeNull";
|
||||||
static const char* jkGroupCacheLogicPlanGroupByUid = "GroupByUid";
|
static const char* jkGroupCacheLogicPlanGroupByUid = "GroupByUid";
|
||||||
static const char* jkGroupCacheLogicPlanGlobalGroup = "GlobalGroup";
|
static const char* jkGroupCacheLogicPlanGlobalGroup = "GlobalGroup";
|
||||||
|
@ -3011,6 +3055,36 @@ static int32_t jsonToPhysiCountWindowNode(const SJson* pJson, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* jkAnomalyWindowPhysiPlanAnomalyKey = "AnomalyKey";
|
||||||
|
static const char* jkAnomalyWindowPhysiPlanAnomalyOption = "AnomalyOpt";
|
||||||
|
|
||||||
|
static int32_t physiAnomalyWindowNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SAnomalyWindowPhysiNode* pNode = (const SAnomalyWindowPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = physiWindowNodeToJson(pObj, pJson);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddObject(pJson, jkAnomalyWindowPhysiPlanAnomalyKey, nodeToJson, pNode->pAnomalyKey);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddStringToObject(pJson, jkAnomalyWindowPhysiPlanAnomalyOption, pNode->anomalyOpt);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToPhysiAnomalyWindowNode(const SJson* pJson, void* pObj) {
|
||||||
|
SAnomalyWindowPhysiNode* pNode = (SAnomalyWindowPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = jsonToPhysiWindowNode(pJson, pObj);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = jsonToNodeObject(pJson, jkAnomalyWindowPhysiPlanAnomalyKey, &pNode->pAnomalyKey);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetStringValue(pJson, jkAnomalyWindowPhysiPlanAnomalyOption, pNode->anomalyOpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* jkPartitionPhysiPlanExprs = "Exprs";
|
static const char* jkPartitionPhysiPlanExprs = "Exprs";
|
||||||
static const char* jkPartitionPhysiPlanPartitionKeys = "PartitionKeys";
|
static const char* jkPartitionPhysiPlanPartitionKeys = "PartitionKeys";
|
||||||
static const char* jkPartitionPhysiPlanTargets = "Targets";
|
static const char* jkPartitionPhysiPlanTargets = "Targets";
|
||||||
|
@ -3198,6 +3272,37 @@ static int32_t jsonToPhysiInterpFuncNode(const SJson* pJson, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* jkForecastFuncPhysiPlanExprs = "Exprs";
|
||||||
|
static const char* jkForecastFuncPhysiPlanFuncs = "Funcs";
|
||||||
|
|
||||||
|
static int32_t physiForecastFuncNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SForecastFuncPhysiNode* pNode = (const SForecastFuncPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = physicPlanNodeToJson(pObj, pJson);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodeListToJson(pJson, jkForecastFuncPhysiPlanExprs, pNode->pExprs);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodeListToJson(pJson, jkForecastFuncPhysiPlanFuncs, pNode->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToPhysiForecastFuncNode(const SJson* pJson, void* pObj) {
|
||||||
|
SForecastFuncPhysiNode* pNode = (SForecastFuncPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = jsonToPhysicPlanNode(pJson, pObj);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = jsonToNodeList(pJson, jkForecastFuncPhysiPlanExprs, &pNode->pExprs);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = jsonToNodeList(pJson, jkForecastFuncPhysiPlanFuncs, &pNode->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* jkDataSinkInputDataBlockDesc = "InputDataBlockDesc";
|
static const char* jkDataSinkInputDataBlockDesc = "InputDataBlockDesc";
|
||||||
|
|
||||||
static int32_t physicDataSinkNodeToJson(const void* pObj, SJson* pJson) {
|
static int32_t physicDataSinkNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
@ -3953,9 +4058,10 @@ static int32_t datumToJson(const void* pObj, SJson* pJson) {
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
// cJSON only support utf-8 encoding. Convert memory content to hex string.
|
// cJSON only support utf-8 encoding. Convert memory content to hex string.
|
||||||
char* buf = taosMemoryCalloc(varDataLen(pNode->datum.p) * 2 + 1, sizeof(char));
|
int32_t bufSize = varDataLen(pNode->datum.p) * 2 + 1;
|
||||||
|
char* buf = taosMemoryCalloc(bufSize, sizeof(char));
|
||||||
if (!buf) return terrno;
|
if (!buf) return terrno;
|
||||||
code = taosHexEncode(varDataVal(pNode->datum.p), buf, varDataLen(pNode->datum.p));
|
code = taosHexEncode(varDataVal(pNode->datum.p), buf, varDataLen(pNode->datum.p), bufSize);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
|
@ -3971,9 +4077,10 @@ static int32_t datumToJson(const void* pObj, SJson* pJson) {
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_JSON: {
|
case TSDB_DATA_TYPE_JSON: {
|
||||||
int32_t len = getJsonValueLen(pNode->datum.p);
|
int32_t len = getJsonValueLen(pNode->datum.p);
|
||||||
char* buf = taosMemoryCalloc(len * 2 + 1, sizeof(char));
|
int32_t bufSize = len * 2 + 1;
|
||||||
|
char* buf = taosMemoryCalloc(bufSize, sizeof(char));
|
||||||
if (!buf) return terrno;
|
if (!buf) return terrno;
|
||||||
code = taosHexEncode(pNode->datum.p, buf, len);
|
code = taosHexEncode(pNode->datum.p, buf, len, bufSize);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
|
@ -4763,6 +4870,36 @@ static int32_t jsonToCountWindowNode(const SJson* pJson, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* jkAnomalyWindowTsPrimaryKey = "AnomalyTsPrimaryKey";
|
||||||
|
static const char* jkAnomalyWindowExpr = "AnomalyWindowExpr";
|
||||||
|
static const char* jkAnomalyWindowOption = "AnomalyWindowOpt";
|
||||||
|
|
||||||
|
static int32_t anomalyWindowNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SAnomalyWindowNode* pNode = (const SAnomalyWindowNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = tjsonAddObject(pJson, jkAnomalyWindowTsPrimaryKey, nodeToJson, pNode->pCol);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddObject(pJson, jkAnomalyWindowExpr, nodeToJson, pNode->pExpr);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddStringToObject(pJson, jkAnomalyWindowOption, pNode->anomalyOpt);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToAnomalyWindowNode(const SJson* pJson, void* pObj) {
|
||||||
|
SAnomalyWindowNode* pNode = (SAnomalyWindowNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = jsonToNodeObject(pJson, jkAnomalyWindowTsPrimaryKey, &pNode->pCol);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = jsonToNodeObject(pJson, jkAnomalyWindowExpr, (SNode**)&pNode->pExpr);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetStringValue(pJson, jkAnomalyWindowOption, pNode->anomalyOpt);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* jkIntervalWindowInterval = "Interval";
|
static const char* jkIntervalWindowInterval = "Interval";
|
||||||
static const char* jkIntervalWindowOffset = "Offset";
|
static const char* jkIntervalWindowOffset = "Offset";
|
||||||
static const char* jkIntervalWindowSliding = "Sliding";
|
static const char* jkIntervalWindowSliding = "Sliding";
|
||||||
|
@ -6449,6 +6586,39 @@ static int32_t dropQnodeStmtToJson(const void* pObj, SJson* pJson) { return drop
|
||||||
|
|
||||||
static int32_t jsonToDropQnodeStmt(const SJson* pJson, void* pObj) { return jsonToDropComponentNodeStmt(pJson, pObj); }
|
static int32_t jsonToDropQnodeStmt(const SJson* pJson, void* pObj) { return jsonToDropComponentNodeStmt(pJson, pObj); }
|
||||||
|
|
||||||
|
static const char* jkCreateAnodeStmtUrl = "Url";
|
||||||
|
static const char* jkUpdateDropANodeStmtId = "AnodeId";
|
||||||
|
|
||||||
|
static int32_t createAnodeStmtToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SCreateAnodeStmt* pNode = (const SCreateAnodeStmt*)pObj;
|
||||||
|
return tjsonAddStringToObject(pJson, jkCreateAnodeStmtUrl, pNode->url);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToCreateAnodeStmt(const SJson* pJson, void* pObj) {
|
||||||
|
SCreateAnodeStmt* pNode = (SCreateAnodeStmt*)pObj;
|
||||||
|
return tjsonGetStringValue(pJson, jkCreateAnodeStmtUrl, pNode->url);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t updateAnodeStmtToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SUpdateAnodeStmt* pNode = (const SUpdateAnodeStmt*)pObj;
|
||||||
|
return tjsonAddIntegerToObject(pJson, jkUpdateDropANodeStmtId, pNode->anodeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToUpdateAnodeStmt(const SJson* pJson, void* pObj) {
|
||||||
|
SUpdateAnodeStmt* pNode = (SUpdateAnodeStmt*)pObj;
|
||||||
|
return tjsonGetIntValue(pJson, jkUpdateDropANodeStmtId, &pNode->anodeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dropAnodeStmtToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SDropAnodeStmt* pNode = (const SDropAnodeStmt*)pObj;
|
||||||
|
return tjsonAddIntegerToObject(pJson, jkUpdateDropANodeStmtId, pNode->anodeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToDropAnodeStmt(const SJson* pJson, void* pObj) {
|
||||||
|
SDropAnodeStmt* pNode = (SDropAnodeStmt*)pObj;
|
||||||
|
return tjsonGetIntValue(pJson, jkUpdateDropANodeStmtId, &pNode->anodeId);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t createSnodeStmtToJson(const void* pObj, SJson* pJson) {
|
static int32_t createSnodeStmtToJson(const void* pObj, SJson* pJson) {
|
||||||
return createComponentNodeStmtToJson(pObj, pJson);
|
return createComponentNodeStmtToJson(pObj, pJson);
|
||||||
}
|
}
|
||||||
|
@ -7014,6 +7184,14 @@ static int32_t showQnodesStmtToJson(const void* pObj, SJson* pJson) { return sho
|
||||||
|
|
||||||
static int32_t jsonToShowQnodesStmt(const SJson* pJson, void* pObj) { return jsonToShowStmt(pJson, pObj); }
|
static int32_t jsonToShowQnodesStmt(const SJson* pJson, void* pObj) { return jsonToShowStmt(pJson, pObj); }
|
||||||
|
|
||||||
|
static int32_t showAnodesStmtToJson(const void* pObj, SJson* pJson) { return showStmtToJson(pObj, pJson); }
|
||||||
|
|
||||||
|
static int32_t jsonToShowAnodesStmt(const SJson* pJson, void* pObj) { return jsonToShowStmt(pJson, pObj); }
|
||||||
|
|
||||||
|
static int32_t showAnodesFullStmtToJson(const void* pObj, SJson* pJson) { return showStmtToJson(pObj, pJson); }
|
||||||
|
|
||||||
|
static int32_t jsonToShowAnodesFullStmt(const SJson* pJson, void* pObj) { return jsonToShowStmt(pJson, pObj); }
|
||||||
|
|
||||||
static int32_t showArbGroupsStmtToJson(const void* pObj, SJson* pJson) { return showStmtToJson(pObj, pJson); }
|
static int32_t showArbGroupsStmtToJson(const void* pObj, SJson* pJson) { return showStmtToJson(pObj, pJson); }
|
||||||
|
|
||||||
static int32_t jsonToShowArbGroupsStmt(const SJson* pJson, void* pObj) { return jsonToShowStmt(pJson, pObj); }
|
static int32_t jsonToShowArbGroupsStmt(const SJson* pJson, void* pObj) { return jsonToShowStmt(pJson, pObj); }
|
||||||
|
@ -7550,6 +7728,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return windowOffsetNodeToJson(pObj, pJson);
|
return windowOffsetNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_COUNT_WINDOW:
|
case QUERY_NODE_COUNT_WINDOW:
|
||||||
return countWindowNodeToJson(pObj, pJson);
|
return countWindowNodeToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW:
|
||||||
|
return anomalyWindowNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_SET_OPERATOR:
|
case QUERY_NODE_SET_OPERATOR:
|
||||||
return setOperatorToJson(pObj, pJson);
|
return setOperatorToJson(pObj, pJson);
|
||||||
case QUERY_NODE_SELECT_STMT:
|
case QUERY_NODE_SELECT_STMT:
|
||||||
|
@ -7602,6 +7782,12 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return createQnodeStmtToJson(pObj, pJson);
|
return createQnodeStmtToJson(pObj, pJson);
|
||||||
case QUERY_NODE_DROP_QNODE_STMT:
|
case QUERY_NODE_DROP_QNODE_STMT:
|
||||||
return dropQnodeStmtToJson(pObj, pJson);
|
return dropQnodeStmtToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_CREATE_ANODE_STMT:
|
||||||
|
return createAnodeStmtToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_DROP_ANODE_STMT:
|
||||||
|
return dropAnodeStmtToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_UPDATE_ANODE_STMT:
|
||||||
|
return updateAnodeStmtToJson(pObj, pJson);
|
||||||
case QUERY_NODE_CREATE_SNODE_STMT:
|
case QUERY_NODE_CREATE_SNODE_STMT:
|
||||||
return createSnodeStmtToJson(pObj, pJson);
|
return createSnodeStmtToJson(pObj, pJson);
|
||||||
case QUERY_NODE_DROP_SNODE_STMT:
|
case QUERY_NODE_DROP_SNODE_STMT:
|
||||||
|
@ -7652,6 +7838,10 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return showMnodesStmtToJson(pObj, pJson);
|
return showMnodesStmtToJson(pObj, pJson);
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
return showQnodesStmtToJson(pObj, pJson);
|
return showQnodesStmtToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
return showAnodesStmtToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
|
return showAnodesFullStmtToJson(pObj, pJson);
|
||||||
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
||||||
return showArbGroupsStmtToJson(pObj, pJson);
|
return showArbGroupsStmtToJson(pObj, pJson);
|
||||||
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
||||||
|
@ -7741,6 +7931,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return logicIndefRowsFuncNodeToJson(pObj, pJson);
|
return logicIndefRowsFuncNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
||||||
return logicInterpFuncNodeToJson(pObj, pJson);
|
return logicInterpFuncNodeToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
|
||||||
|
return logicForecastFuncNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
||||||
return logicGroupCacheNodeToJson(pObj, pJson);
|
return logicGroupCacheNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
||||||
|
@ -7801,6 +7993,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
||||||
return physiCountWindowNodeToJson(pObj, pJson);
|
return physiCountWindowNodeToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY:
|
||||||
|
return physiAnomalyWindowNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
return physiPartitionNodeToJson(pObj, pJson);
|
return physiPartitionNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION:
|
||||||
|
@ -7809,6 +8003,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return physiIndefRowsFuncNodeToJson(pObj, pJson);
|
return physiIndefRowsFuncNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
||||||
return physiInterpFuncNodeToJson(pObj, pJson);
|
return physiInterpFuncNodeToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
|
||||||
|
return physiForecastFuncNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
return physiDispatchNodeToJson(pObj, pJson);
|
return physiDispatchNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
||||||
|
@ -7900,6 +8096,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToWindowOffsetNode(pJson, pObj);
|
return jsonToWindowOffsetNode(pJson, pObj);
|
||||||
case QUERY_NODE_COUNT_WINDOW:
|
case QUERY_NODE_COUNT_WINDOW:
|
||||||
return jsonToCountWindowNode(pJson, pObj);
|
return jsonToCountWindowNode(pJson, pObj);
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW:
|
||||||
|
return jsonToAnomalyWindowNode(pJson, pObj);
|
||||||
case QUERY_NODE_SET_OPERATOR:
|
case QUERY_NODE_SET_OPERATOR:
|
||||||
return jsonToSetOperator(pJson, pObj);
|
return jsonToSetOperator(pJson, pObj);
|
||||||
case QUERY_NODE_SELECT_STMT:
|
case QUERY_NODE_SELECT_STMT:
|
||||||
|
@ -8002,6 +8200,10 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToShowMnodesStmt(pJson, pObj);
|
return jsonToShowMnodesStmt(pJson, pObj);
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
return jsonToShowQnodesStmt(pJson, pObj);
|
return jsonToShowQnodesStmt(pJson, pObj);
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
return jsonToShowAnodesStmt(pJson, pObj);
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
|
return jsonToShowAnodesFullStmt(pJson, pObj);
|
||||||
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
||||||
return jsonToShowArbGroupsStmt(pJson, pObj);
|
return jsonToShowArbGroupsStmt(pJson, pObj);
|
||||||
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
||||||
|
@ -8099,6 +8301,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToLogicIndefRowsFuncNode(pJson, pObj);
|
return jsonToLogicIndefRowsFuncNode(pJson, pObj);
|
||||||
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
||||||
return jsonToLogicInterpFuncNode(pJson, pObj);
|
return jsonToLogicInterpFuncNode(pJson, pObj);
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
|
||||||
|
return jsonToLogicForecastFuncNode(pJson, pObj);
|
||||||
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
||||||
return jsonToLogicGroupCacheNode(pJson, pObj);
|
return jsonToLogicGroupCacheNode(pJson, pObj);
|
||||||
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
||||||
|
@ -8159,6 +8363,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
||||||
return jsonToPhysiCountWindowNode(pJson, pObj);
|
return jsonToPhysiCountWindowNode(pJson, pObj);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY:
|
||||||
|
return jsonToPhysiAnomalyWindowNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
return jsonToPhysiPartitionNode(pJson, pObj);
|
return jsonToPhysiPartitionNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION:
|
||||||
|
@ -8167,6 +8373,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToPhysiIndefRowsFuncNode(pJson, pObj);
|
return jsonToPhysiIndefRowsFuncNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
||||||
return jsonToPhysiInterpFuncNode(pJson, pObj);
|
return jsonToPhysiInterpFuncNode(pJson, pObj);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
|
||||||
|
return jsonToPhysiForecastFuncNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
return jsonToPhysiDispatchNode(pJson, pObj);
|
return jsonToPhysiDispatchNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
|
||||||
|
|
|
@ -3539,6 +3539,46 @@ static int32_t msgToPhysiCountWindowNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum { PHY_ANOMALY_CODE_WINDOW = 1, PHY_ANOMALY_CODE_KEY, PHY_ANOMALY_CODE_WINDOW_OPTION };
|
||||||
|
|
||||||
|
static int32_t physiAnomalyWindowNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
||||||
|
const SAnomalyWindowPhysiNode* pNode = (const SAnomalyWindowPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = tlvEncodeObj(pEncoder, PHY_ANOMALY_CODE_WINDOW, physiWindowNodeToMsg, &pNode->window);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tlvEncodeObj(pEncoder, PHY_ANOMALY_CODE_KEY, nodeToMsg, pNode->pAnomalyKey);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tlvEncodeCStr(pEncoder, PHY_ANOMALY_CODE_WINDOW_OPTION, pNode->anomalyOpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t msgToPhysiAnomalyWindowNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
|
SAnomalyWindowPhysiNode* pNode = (SAnomalyWindowPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
STlv* pTlv = NULL;
|
||||||
|
tlvForEach(pDecoder, pTlv, code) {
|
||||||
|
switch (pTlv->type) {
|
||||||
|
case PHY_ANOMALY_CODE_WINDOW:
|
||||||
|
code = tlvDecodeObjFromTlv(pTlv, msgToPhysiWindowNode, &pNode->window);
|
||||||
|
break;
|
||||||
|
case PHY_ANOMALY_CODE_KEY:
|
||||||
|
code = msgToNodeFromTlv(pTlv, (void**)&pNode->pAnomalyKey);
|
||||||
|
break;
|
||||||
|
case PHY_ANOMALY_CODE_WINDOW_OPTION:
|
||||||
|
code = tlvDecodeCStr(pTlv, pNode->anomalyOpt, sizeof(pNode->anomalyOpt));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PHY_PARTITION_CODE_BASE_NODE = 1,
|
PHY_PARTITION_CODE_BASE_NODE = 1,
|
||||||
PHY_PARTITION_CODE_EXPR,
|
PHY_PARTITION_CODE_EXPR,
|
||||||
|
@ -3770,6 +3810,50 @@ static int32_t msgToPhysiInterpFuncNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PHY_FORECAST_FUNC_CODE_BASE_NODE = 1,
|
||||||
|
PHY_FORECAST_FUNC_CODE_EXPR,
|
||||||
|
PHY_FORECAST_FUNC_CODE_FUNCS,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int32_t physiForecastFuncNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
||||||
|
const SForecastFuncPhysiNode* pNode = (const SForecastFuncPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = tlvEncodeObj(pEncoder, PHY_FORECAST_FUNC_CODE_BASE_NODE, physiNodeToMsg, &pNode->node);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tlvEncodeObj(pEncoder, PHY_FORECAST_FUNC_CODE_EXPR, nodeListToMsg, pNode->pExprs);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tlvEncodeObj(pEncoder, PHY_FORECAST_FUNC_CODE_FUNCS, nodeListToMsg, pNode->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t msgToPhysiForecastFuncNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
|
SForecastFuncPhysiNode* pNode = (SForecastFuncPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
STlv* pTlv = NULL;
|
||||||
|
tlvForEach(pDecoder, pTlv, code) {
|
||||||
|
switch (pTlv->type) {
|
||||||
|
case PHY_FORECAST_FUNC_CODE_BASE_NODE:
|
||||||
|
code = tlvDecodeObjFromTlv(pTlv, msgToPhysiNode, &pNode->node);
|
||||||
|
break;
|
||||||
|
case PHY_FORECAST_FUNC_CODE_EXPR:
|
||||||
|
code = msgToNodeListFromTlv(pTlv, (void**)&pNode->pExprs);
|
||||||
|
break;
|
||||||
|
case PHY_FORECAST_FUNC_CODE_FUNCS:
|
||||||
|
code = msgToNodeListFromTlv(pTlv, (void**)&pNode->pFuncs);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
enum { PHY_DATA_SINK_CODE_INPUT_DESC = 1 };
|
enum { PHY_DATA_SINK_CODE_INPUT_DESC = 1 };
|
||||||
|
|
||||||
static int32_t physicDataSinkNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
static int32_t physicDataSinkNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
||||||
|
@ -4536,6 +4620,9 @@ static int32_t specificNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
||||||
code = physiCountWindowNodeToMsg(pObj, pEncoder);
|
code = physiCountWindowNodeToMsg(pObj, pEncoder);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY:
|
||||||
|
code = physiAnomalyWindowNodeToMsg(pObj, pEncoder);
|
||||||
|
break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
code = physiPartitionNodeToMsg(pObj, pEncoder);
|
code = physiPartitionNodeToMsg(pObj, pEncoder);
|
||||||
break;
|
break;
|
||||||
|
@ -4548,6 +4635,9 @@ static int32_t specificNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
||||||
code = physiInterpFuncNodeToMsg(pObj, pEncoder);
|
code = physiInterpFuncNodeToMsg(pObj, pEncoder);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
|
||||||
|
code = physiForecastFuncNodeToMsg(pObj, pEncoder);
|
||||||
|
break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
code = physiDispatchNodeToMsg(pObj, pEncoder);
|
code = physiDispatchNodeToMsg(pObj, pEncoder);
|
||||||
break;
|
break;
|
||||||
|
@ -4698,6 +4788,9 @@ static int32_t msgToSpecificNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
||||||
code = msgToPhysiCountWindowNode(pDecoder, pObj);
|
code = msgToPhysiCountWindowNode(pDecoder, pObj);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY:
|
||||||
|
code = msgToPhysiAnomalyWindowNode(pDecoder, pObj);
|
||||||
|
break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
code = msgToPhysiPartitionNode(pDecoder, pObj);
|
code = msgToPhysiPartitionNode(pDecoder, pObj);
|
||||||
break;
|
break;
|
||||||
|
@ -4710,6 +4803,9 @@ static int32_t msgToSpecificNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
||||||
code = msgToPhysiInterpFuncNode(pDecoder, pObj);
|
code = msgToPhysiInterpFuncNode(pDecoder, pObj);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
|
||||||
|
code = msgToPhysiForecastFuncNode(pDecoder, pObj);
|
||||||
|
break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
code = msgToPhysiDispatchNode(pDecoder, pObj);
|
code = msgToPhysiDispatchNode(pDecoder, pObj);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -181,6 +181,14 @@ static EDealRes dispatchExpr(SNode* pNode, ETraversalOrder order, FNodeWalker wa
|
||||||
res = walkExpr(pEvent->pCol, order, walker, pContext);
|
res = walkExpr(pEvent->pCol, order, walker, pContext);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW: {
|
||||||
|
SAnomalyWindowNode* pAnomaly = (SAnomalyWindowNode*)pNode;
|
||||||
|
res = walkExpr(pAnomaly->pExpr, order, walker, pContext);
|
||||||
|
if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
|
||||||
|
res = walkExpr(pAnomaly->pCol, order, walker, pContext);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -392,6 +400,14 @@ static EDealRes rewriteExpr(SNode** pRawNode, ETraversalOrder order, FNodeRewrit
|
||||||
res = rewriteExpr(&pEvent->pCol, order, rewriter, pContext);
|
res = rewriteExpr(&pEvent->pCol, order, rewriter, pContext);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW: {
|
||||||
|
SAnomalyWindowNode* pAnomaly = (SAnomalyWindowNode*)pNode;
|
||||||
|
res = rewriteExpr(&pAnomaly->pExpr, order, rewriter, pContext);
|
||||||
|
if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
|
||||||
|
res = rewriteExpr(&pAnomaly->pCol, order, rewriter, pContext);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -419,6 +419,8 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
|
||||||
code = makeNode(type, sizeof(SEventWindowNode), &pNode); break;
|
code = makeNode(type, sizeof(SEventWindowNode), &pNode); break;
|
||||||
case QUERY_NODE_COUNT_WINDOW:
|
case QUERY_NODE_COUNT_WINDOW:
|
||||||
code = makeNode(type, sizeof(SCountWindowNode), &pNode); break;
|
code = makeNode(type, sizeof(SCountWindowNode), &pNode); break;
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW:
|
||||||
|
code = makeNode(type, sizeof(SAnomalyWindowNode), &pNode); break;
|
||||||
case QUERY_NODE_HINT:
|
case QUERY_NODE_HINT:
|
||||||
code = makeNode(type, sizeof(SHintNode), &pNode); break;
|
code = makeNode(type, sizeof(SHintNode), &pNode); break;
|
||||||
case QUERY_NODE_VIEW:
|
case QUERY_NODE_VIEW:
|
||||||
|
@ -474,6 +476,12 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
|
||||||
code = makeNode(type, sizeof(SDropDnodeStmt), &pNode); break;
|
code = makeNode(type, sizeof(SDropDnodeStmt), &pNode); break;
|
||||||
case QUERY_NODE_ALTER_DNODE_STMT:
|
case QUERY_NODE_ALTER_DNODE_STMT:
|
||||||
code = makeNode(type, sizeof(SAlterDnodeStmt), &pNode); break;
|
code = makeNode(type, sizeof(SAlterDnodeStmt), &pNode); break;
|
||||||
|
case QUERY_NODE_CREATE_ANODE_STMT:
|
||||||
|
code = makeNode(type, sizeof(SCreateAnodeStmt), &pNode); break;
|
||||||
|
case QUERY_NODE_DROP_ANODE_STMT:
|
||||||
|
code = makeNode(type, sizeof(SDropAnodeStmt), &pNode); break;
|
||||||
|
case QUERY_NODE_UPDATE_ANODE_STMT:
|
||||||
|
code = makeNode(type, sizeof(SUpdateAnodeStmt), &pNode); break;
|
||||||
case QUERY_NODE_CREATE_INDEX_STMT:
|
case QUERY_NODE_CREATE_INDEX_STMT:
|
||||||
code = makeNode(type, sizeof(SCreateIndexStmt), &pNode); break;
|
code = makeNode(type, sizeof(SCreateIndexStmt), &pNode); break;
|
||||||
case QUERY_NODE_DROP_INDEX_STMT:
|
case QUERY_NODE_DROP_INDEX_STMT:
|
||||||
|
@ -540,6 +548,8 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
|
||||||
case QUERY_NODE_SHOW_MNODES_STMT:
|
case QUERY_NODE_SHOW_MNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_MODULES_STMT:
|
case QUERY_NODE_SHOW_MODULES_STMT:
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_BNODES_STMT:
|
case QUERY_NODE_SHOW_BNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
||||||
|
@ -647,6 +657,8 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
|
||||||
code = makeNode(type, sizeof(SIndefRowsFuncLogicNode), &pNode); break;
|
code = makeNode(type, sizeof(SIndefRowsFuncLogicNode), &pNode); break;
|
||||||
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
||||||
code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode); break;
|
code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode); break;
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
|
||||||
|
code = makeNode(type, sizeof(SForecastFuncLogicNode), &pNode); break;
|
||||||
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
||||||
code = makeNode(type, sizeof(SGroupCacheLogicNode), &pNode); break;
|
code = makeNode(type, sizeof(SGroupCacheLogicNode), &pNode); break;
|
||||||
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
|
||||||
|
@ -722,6 +734,8 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
|
||||||
code = makeNode(type, sizeof(SStreamEventWinodwPhysiNode), &pNode); break;
|
code = makeNode(type, sizeof(SStreamEventWinodwPhysiNode), &pNode); break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
|
||||||
code = makeNode(type, sizeof(SCountWinodwPhysiNode), &pNode); break;
|
code = makeNode(type, sizeof(SCountWinodwPhysiNode), &pNode); break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY:
|
||||||
|
code = makeNode(type, sizeof(SAnomalyWindowPhysiNode), &pNode); break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
|
||||||
code = makeNode(type, sizeof(SStreamCountWinodwPhysiNode), &pNode); break;
|
code = makeNode(type, sizeof(SStreamCountWinodwPhysiNode), &pNode); break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
|
@ -732,6 +746,8 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
|
||||||
code = makeNode(type, sizeof(SIndefRowsFuncPhysiNode), &pNode); break;
|
code = makeNode(type, sizeof(SIndefRowsFuncPhysiNode), &pNode); break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
|
||||||
code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode); break;
|
code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode); break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
|
||||||
|
code = makeNode(type, sizeof(SForecastFuncLogicNode), &pNode); break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
code = makeNode(type, sizeof(SDataDispatcherNode), &pNode); break;
|
code = makeNode(type, sizeof(SDataDispatcherNode), &pNode); break;
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
||||||
|
@ -1019,6 +1035,11 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
nodesDestroyNode(pEvent->pCol);
|
nodesDestroyNode(pEvent->pCol);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW: {
|
||||||
|
SAnomalyWindowNode* pAnomaly = (SAnomalyWindowNode*)pNode;
|
||||||
|
nodesDestroyNode(pAnomaly->pCol);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_HINT: {
|
case QUERY_NODE_HINT: {
|
||||||
SHintNode* pHint = (SHintNode*)pNode;
|
SHintNode* pHint = (SHintNode*)pNode;
|
||||||
destroyHintValue(pHint->option, pHint->value);
|
destroyHintValue(pHint->option, pHint->value);
|
||||||
|
@ -1167,6 +1188,9 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
case QUERY_NODE_CREATE_DNODE_STMT: // no pointer field
|
case QUERY_NODE_CREATE_DNODE_STMT: // no pointer field
|
||||||
case QUERY_NODE_DROP_DNODE_STMT: // no pointer field
|
case QUERY_NODE_DROP_DNODE_STMT: // no pointer field
|
||||||
case QUERY_NODE_ALTER_DNODE_STMT: // no pointer field
|
case QUERY_NODE_ALTER_DNODE_STMT: // no pointer field
|
||||||
|
case QUERY_NODE_CREATE_ANODE_STMT: // no pointer field
|
||||||
|
case QUERY_NODE_UPDATE_ANODE_STMT: // no pointer field
|
||||||
|
case QUERY_NODE_DROP_ANODE_STMT: // no pointer field
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_CREATE_INDEX_STMT: {
|
case QUERY_NODE_CREATE_INDEX_STMT: {
|
||||||
SCreateIndexStmt* pStmt = (SCreateIndexStmt*)pNode;
|
SCreateIndexStmt* pStmt = (SCreateIndexStmt*)pNode;
|
||||||
|
@ -1252,6 +1276,8 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
case QUERY_NODE_SHOW_MNODES_STMT:
|
case QUERY_NODE_SHOW_MNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_MODULES_STMT:
|
case QUERY_NODE_SHOW_MODULES_STMT:
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_BNODES_STMT:
|
case QUERY_NODE_SHOW_BNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
||||||
|
@ -1500,6 +1526,12 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
nodesDestroyNode(pLogicNode->pTimeSeries);
|
nodesDestroyNode(pLogicNode->pTimeSeries);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC: {
|
||||||
|
SForecastFuncLogicNode* pLogicNode = (SForecastFuncLogicNode*)pNode;
|
||||||
|
destroyLogicNode((SLogicNode*)pLogicNode);
|
||||||
|
nodesDestroyList(pLogicNode->pFuncs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE: {
|
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE: {
|
||||||
SGroupCacheLogicNode* pLogicNode = (SGroupCacheLogicNode*)pNode;
|
SGroupCacheLogicNode* pLogicNode = (SGroupCacheLogicNode*)pNode;
|
||||||
destroyLogicNode((SLogicNode*)pLogicNode);
|
destroyLogicNode((SLogicNode*)pLogicNode);
|
||||||
|
@ -1663,6 +1695,11 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
destroyWinodwPhysiNode((SWindowPhysiNode*)pPhyNode);
|
destroyWinodwPhysiNode((SWindowPhysiNode*)pPhyNode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY: {
|
||||||
|
SAnomalyWindowPhysiNode* pPhyNode = (SAnomalyWindowPhysiNode*)pNode;
|
||||||
|
destroyWinodwPhysiNode((SWindowPhysiNode*)pPhyNode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
|
||||||
destroyPartitionPhysiNode((SPartitionPhysiNode*)pNode);
|
destroyPartitionPhysiNode((SPartitionPhysiNode*)pNode);
|
||||||
break;
|
break;
|
||||||
|
@ -1690,6 +1727,13 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
nodesDestroyNode(pPhyNode->pTimeSeries);
|
nodesDestroyNode(pPhyNode->pTimeSeries);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC: {
|
||||||
|
SForecastFuncPhysiNode* pPhyNode = (SForecastFuncPhysiNode*)pNode;
|
||||||
|
destroyPhysiNode((SPhysiNode*)pPhyNode);
|
||||||
|
nodesDestroyList(pPhyNode->pExprs);
|
||||||
|
nodesDestroyList(pPhyNode->pFuncs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
destroyDataSinkNode((SDataSinkNode*)pNode);
|
destroyDataSinkNode((SDataSinkNode*)pNode);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -157,6 +157,12 @@ with_clause_opt(A) ::= WITH search_condition(B).
|
||||||
/************************************************ create encrypt_key *********************************************/
|
/************************************************ create encrypt_key *********************************************/
|
||||||
cmd ::= CREATE ENCRYPT_KEY NK_STRING(A). { pCxt->pRootNode = createEncryptKeyStmt(pCxt, &A); }
|
cmd ::= CREATE ENCRYPT_KEY NK_STRING(A). { pCxt->pRootNode = createEncryptKeyStmt(pCxt, &A); }
|
||||||
|
|
||||||
|
/************************************************ create drop update anode ***************************************/
|
||||||
|
cmd ::= CREATE ANODE NK_STRING(A). { pCxt->pRootNode = createCreateAnodeStmt(pCxt, &A); }
|
||||||
|
cmd ::= UPDATE ANODE NK_INTEGER(A). { pCxt->pRootNode = createUpdateAnodeStmt(pCxt, &A, false); }
|
||||||
|
cmd ::= UPDATE ALL ANODES. { pCxt->pRootNode = createUpdateAnodeStmt(pCxt, NULL, true); }
|
||||||
|
cmd ::= DROP ANODE NK_INTEGER(A). { pCxt->pRootNode = createDropAnodeStmt(pCxt, &A); }
|
||||||
|
|
||||||
/************************************************ create/drop/alter/restore dnode *********************************************/
|
/************************************************ create/drop/alter/restore dnode *********************************************/
|
||||||
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
|
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
|
||||||
cmd ::= CREATE DNODE dnode_endpoint(A) PORT NK_INTEGER(B). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, &B); }
|
cmd ::= CREATE DNODE dnode_endpoint(A) PORT NK_INTEGER(B). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, &B); }
|
||||||
|
@ -524,6 +530,8 @@ cmd ::= SHOW db_name_cond_opt(A) VGROUPS.
|
||||||
cmd ::= SHOW MNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); }
|
cmd ::= SHOW MNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); }
|
||||||
//cmd ::= SHOW MODULES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MODULES_STMT); }
|
//cmd ::= SHOW MODULES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MODULES_STMT); }
|
||||||
cmd ::= SHOW QNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); }
|
cmd ::= SHOW QNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); }
|
||||||
|
cmd ::= SHOW ANODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_ANODES_STMT); }
|
||||||
|
cmd ::= SHOW ANODES FULL. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_ANODES_FULL_STMT); }
|
||||||
cmd ::= SHOW ARBGROUPS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_ARBGROUPS_STMT); }
|
cmd ::= SHOW ARBGROUPS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_ARBGROUPS_STMT); }
|
||||||
cmd ::= SHOW FUNCTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); }
|
cmd ::= SHOW FUNCTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); }
|
||||||
cmd ::= SHOW INDEXES FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, B, A, OP_TYPE_EQUAL); }
|
cmd ::= SHOW INDEXES FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, B, A, OP_TYPE_EQUAL); }
|
||||||
|
@ -1187,6 +1195,9 @@ pseudo_column(A) ::= WDURATION(B).
|
||||||
pseudo_column(A) ::= IROWTS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
pseudo_column(A) ::= IROWTS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
||||||
pseudo_column(A) ::= ISFILLED(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
pseudo_column(A) ::= ISFILLED(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
||||||
pseudo_column(A) ::= QTAGS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
pseudo_column(A) ::= QTAGS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
||||||
|
pseudo_column(A) ::= FLOW(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
||||||
|
pseudo_column(A) ::= FHIGH(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
||||||
|
pseudo_column(A) ::= FROWTS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); }
|
||||||
|
|
||||||
function_expression(A) ::= function_name(B) NK_LP expression_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); }
|
function_expression(A) ::= function_name(B) NK_LP expression_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); }
|
||||||
function_expression(A) ::= star_func(B) NK_LP star_func_para_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); }
|
function_expression(A) ::= star_func(B) NK_LP star_func_para_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); }
|
||||||
|
@ -1505,6 +1516,10 @@ twindow_clause_opt(A) ::=
|
||||||
COUNT_WINDOW NK_LP NK_INTEGER(B) NK_RP. { A = createCountWindowNode(pCxt, &B, &B); }
|
COUNT_WINDOW NK_LP NK_INTEGER(B) NK_RP. { A = createCountWindowNode(pCxt, &B, &B); }
|
||||||
twindow_clause_opt(A) ::=
|
twindow_clause_opt(A) ::=
|
||||||
COUNT_WINDOW NK_LP NK_INTEGER(B) NK_COMMA NK_INTEGER(C) NK_RP. { A = createCountWindowNode(pCxt, &B, &C); }
|
COUNT_WINDOW NK_LP NK_INTEGER(B) NK_COMMA NK_INTEGER(C) NK_RP. { A = createCountWindowNode(pCxt, &B, &C); }
|
||||||
|
twindow_clause_opt(A) ::=
|
||||||
|
ANOMALY_WINDOW NK_LP expr_or_subquery(B) NK_RP. { A = createAnomalyWindowNode(pCxt, releaseRawExprNode(pCxt, B), NULL); }
|
||||||
|
twindow_clause_opt(A) ::=
|
||||||
|
ANOMALY_WINDOW NK_LP expr_or_subquery(B) NK_COMMA NK_STRING(C) NK_RP. { A = createAnomalyWindowNode(pCxt, releaseRawExprNode(pCxt, B), &C); }
|
||||||
|
|
||||||
sliding_opt(A) ::= . { A = NULL; }
|
sliding_opt(A) ::= . { A = NULL; }
|
||||||
sliding_opt(A) ::= SLIDING NK_LP interval_sliding_duration_literal(B) NK_RP. { A = releaseRawExprNode(pCxt, B); }
|
sliding_opt(A) ::= SLIDING NK_LP interval_sliding_duration_literal(B) NK_RP. { A = releaseRawExprNode(pCxt, B); }
|
||||||
|
|
|
@ -555,6 +555,22 @@ static int32_t collectMetaKeyFromShowSnodes(SCollectMetaKeyCxt* pCxt, SShowStmt*
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t collectMetaKeyFromShowAnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||||
|
if (pCxt->pParseCxt->enableSysInfo) {
|
||||||
|
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_ANODES,
|
||||||
|
pCxt->pMetaCache);
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t collectMetaKeyFromShowAnodesFull(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||||
|
if (pCxt->pParseCxt->enableSysInfo) {
|
||||||
|
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_ANODES_FULL,
|
||||||
|
pCxt->pMetaCache);
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromShowBnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
static int32_t collectMetaKeyFromShowBnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||||
if (pCxt->pParseCxt->enableSysInfo) {
|
if (pCxt->pParseCxt->enableSysInfo) {
|
||||||
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_BNODES,
|
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_BNODES,
|
||||||
|
@ -983,6 +999,10 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
||||||
return collectMetaKeyFromShowQnodes(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowQnodes(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
return collectMetaKeyFromShowSnodes(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowSnodes(pCxt, (SShowStmt*)pStmt);
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
return collectMetaKeyFromShowAnodes(pCxt, (SShowStmt*)pStmt);
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
|
return collectMetaKeyFromShowAnodesFull(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_BNODES_STMT:
|
case QUERY_NODE_SHOW_BNODES_STMT:
|
||||||
return collectMetaKeyFromShowBnodes(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowBnodes(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
case QUERY_NODE_SHOW_ARBGROUPS_STMT:
|
||||||
|
|
|
@ -358,6 +358,8 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
|
||||||
case QUERY_NODE_SHOW_MNODES_STMT:
|
case QUERY_NODE_SHOW_MNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_MODULES_STMT:
|
case QUERY_NODE_SHOW_MODULES_STMT:
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_BNODES_STMT:
|
case QUERY_NODE_SHOW_BNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
||||||
|
|
|
@ -38,6 +38,9 @@ static SKeyword keywordTable[] = {
|
||||||
{"ANALYZE", TK_ANALYZE},
|
{"ANALYZE", TK_ANALYZE},
|
||||||
{"AND", TK_AND},
|
{"AND", TK_AND},
|
||||||
{"ANTI", TK_ANTI},
|
{"ANTI", TK_ANTI},
|
||||||
|
{"ANODE", TK_ANODE},
|
||||||
|
{"ANODES", TK_ANODES},
|
||||||
|
{"ANOMALY_WINDOW", TK_ANOMALY_WINDOW},
|
||||||
// {"ANY", TK_ANY},
|
// {"ANY", TK_ANY},
|
||||||
{"APPS", TK_APPS},
|
{"APPS", TK_APPS},
|
||||||
{"AS", TK_AS},
|
{"AS", TK_AS},
|
||||||
|
@ -332,6 +335,9 @@ static SKeyword keywordTable[] = {
|
||||||
{"_WDURATION", TK_WDURATION},
|
{"_WDURATION", TK_WDURATION},
|
||||||
{"_WEND", TK_WEND},
|
{"_WEND", TK_WEND},
|
||||||
{"_WSTART", TK_WSTART},
|
{"_WSTART", TK_WSTART},
|
||||||
|
{"_FLOW", TK_FLOW},
|
||||||
|
{"_FHIGH", TK_FHIGH},
|
||||||
|
{"_FROWTS", TK_FROWTS},
|
||||||
{"ALIVE", TK_ALIVE},
|
{"ALIVE", TK_ALIVE},
|
||||||
{"VARBINARY", TK_VARBINARY},
|
{"VARBINARY", TK_VARBINARY},
|
||||||
{"S3_CHUNKSIZE", TK_S3_CHUNKSIZE},
|
{"S3_CHUNKSIZE", TK_S3_CHUNKSIZE},
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "parUtil.h"
|
#include "parUtil.h"
|
||||||
#include "scalar.h"
|
#include "scalar.h"
|
||||||
#include "systable.h"
|
#include "systable.h"
|
||||||
|
#include "tanal.h"
|
||||||
#include "tcol.h"
|
#include "tcol.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
@ -348,6 +349,20 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = {
|
||||||
.numOfShowCols = 1,
|
.numOfShowCols = 1,
|
||||||
.pShowCols = {"*"}
|
.pShowCols = {"*"}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.showType = QUERY_NODE_SHOW_ANODES_STMT,
|
||||||
|
.pDbName = TSDB_INFORMATION_SCHEMA_DB,
|
||||||
|
.pTableName = TSDB_INS_TABLE_ANODES,
|
||||||
|
.numOfShowCols = 1,
|
||||||
|
.pShowCols = {"*"}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.showType = QUERY_NODE_SHOW_ANODES_FULL_STMT,
|
||||||
|
.pDbName = TSDB_INFORMATION_SCHEMA_DB,
|
||||||
|
.pTableName = TSDB_INS_TABLE_ANODES_FULL,
|
||||||
|
.numOfShowCols = 1,
|
||||||
|
.pShowCols = {"*"}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
@ -1035,6 +1050,14 @@ static bool isInterpPseudoColumnFunc(const SNode* pNode) {
|
||||||
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsInterpPseudoColumnFunc(((SFunctionNode*)pNode)->funcId));
|
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsInterpPseudoColumnFunc(((SFunctionNode*)pNode)->funcId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isForecastFunc(const SNode* pNode) {
|
||||||
|
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsForecastFunc(((SFunctionNode*)pNode)->funcId));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isForecastPseudoColumnFunc(const SNode* pNode) {
|
||||||
|
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsForecastPseudoColumnFunc(((SFunctionNode*)pNode)->funcId));
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef BUILD_NO_CALL
|
#ifdef BUILD_NO_CALL
|
||||||
static bool isTimelineFunc(const SNode* pNode) {
|
static bool isTimelineFunc(const SNode* pNode) {
|
||||||
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsTimelineFunc(((SFunctionNode*)pNode)->funcId));
|
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsTimelineFunc(((SFunctionNode*)pNode)->funcId));
|
||||||
|
@ -1237,7 +1260,7 @@ bool isPrimaryKeyImpl(SNode* pExpr) {
|
||||||
FUNCTION_TYPE_LAST_ROW == pFunc->funcType || FUNCTION_TYPE_TIMETRUNCATE == pFunc->funcType) {
|
FUNCTION_TYPE_LAST_ROW == pFunc->funcType || FUNCTION_TYPE_TIMETRUNCATE == pFunc->funcType) {
|
||||||
return isPrimaryKeyImpl(nodesListGetNode(pFunc->pParameterList, 0));
|
return isPrimaryKeyImpl(nodesListGetNode(pFunc->pParameterList, 0));
|
||||||
} else if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType ||
|
} else if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType ||
|
||||||
FUNCTION_TYPE_IROWTS == pFunc->funcType) {
|
FUNCTION_TYPE_IROWTS == pFunc->funcType || FUNCTION_TYPE_FORECAST_ROWTS == pFunc->funcType) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (QUERY_NODE_OPERATOR == nodeType(pExpr)) {
|
} else if (QUERY_NODE_OPERATOR == nodeType(pExpr)) {
|
||||||
|
@ -2250,7 +2273,7 @@ static EDealRes translateOperator(STranslateContext* pCxt, SOperatorNode* pOp) {
|
||||||
|
|
||||||
static EDealRes haveVectorFunction(SNode* pNode, void* pContext) {
|
static EDealRes haveVectorFunction(SNode* pNode, void* pContext) {
|
||||||
if (isAggFunc(pNode) || isIndefiniteRowsFunc(pNode) || isWindowPseudoColumnFunc(pNode) ||
|
if (isAggFunc(pNode) || isIndefiniteRowsFunc(pNode) || isWindowPseudoColumnFunc(pNode) ||
|
||||||
isInterpPseudoColumnFunc(pNode)) {
|
isInterpPseudoColumnFunc(pNode) || isForecastPseudoColumnFunc(pNode)) {
|
||||||
*((bool*)pContext) = true;
|
*((bool*)pContext) = true;
|
||||||
return DEAL_RES_END;
|
return DEAL_RES_END;
|
||||||
}
|
}
|
||||||
|
@ -2553,6 +2576,72 @@ static int32_t translateInterpPseudoColumnFunc(STranslateContext* pCxt, SNode**
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t translateForecastFunc(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
|
if (!fmIsForecastFunc(pFunc->funcId)) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
if (!isSelectStmt(pCxt->pCurrStmt) || SQL_CLAUSE_SELECT != pCxt->currClause) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC);
|
||||||
|
}
|
||||||
|
SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt;
|
||||||
|
SNode* pTable = pSelect->pFromTable;
|
||||||
|
|
||||||
|
if (pSelect->hasAggFuncs || pSelect->hasMultiRowsFunc || pSelect->hasIndefiniteRowsFunc) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pSelect->hasForecastFunc &&
|
||||||
|
(FUNC_RETURN_ROWS_INDEFINITE == pSelect->returnRows || pSelect->returnRows != fmGetFuncReturnRows(pFunc))) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC,
|
||||||
|
"%s ignoring null value options cannot be used when applying to multiple columns",
|
||||||
|
pFunc->functionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL != pSelect->pWindow || NULL != pSelect->pGroupByList) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC,
|
||||||
|
"%s function is not supported in window query or group query", pFunc->functionName);
|
||||||
|
}
|
||||||
|
if (hasInvalidFuncNesting(pFunc->pParameterList)) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_AGG_FUNC_NESTING);
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateForecastPseudoColumnFunc(STranslateContext* pCxt, SNode** ppNode, bool* pRewriteToColumn) {
|
||||||
|
SFunctionNode* pFunc = (SFunctionNode*)(*ppNode);
|
||||||
|
if (!fmIsForecastPseudoColumnFunc(pFunc->funcId)) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
if (!isSelectStmt(pCxt->pCurrStmt)) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC,
|
||||||
|
"%s must be used in select statements", pFunc->functionName);
|
||||||
|
}
|
||||||
|
if (pCxt->currClause == SQL_CLAUSE_WHERE) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_INTERP_CLAUSE,
|
||||||
|
"%s is not allowed in where clause", pFunc->functionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt;
|
||||||
|
SNode* pNode = NULL;
|
||||||
|
bool bFound = false;
|
||||||
|
FOREACH(pNode, pSelect->pProjectionList) {
|
||||||
|
if (nodeType(pNode) == QUERY_NODE_FUNCTION && strcasecmp(((SFunctionNode*)pNode)->functionName, "forecast") == 0) {
|
||||||
|
bFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!bFound) {
|
||||||
|
*pRewriteToColumn = true;
|
||||||
|
int32_t code = replacePsedudoColumnFuncWithColumn(pCxt, ppNode);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
(void)translateColumn(pCxt, (SColumnNode**)ppNode);
|
||||||
|
return pCxt->errCode;
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t translateTimelineFunc(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
static int32_t translateTimelineFunc(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
if (!fmIsTimelineFunc(pFunc->funcId)) {
|
if (!fmIsTimelineFunc(pFunc->funcId)) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -2738,6 +2827,8 @@ static void setFuncClassification(STranslateContext* pCxt, SFunctionNode* pFunc)
|
||||||
pSelect->returnRows = fmGetFuncReturnRows(pFunc);
|
pSelect->returnRows = fmGetFuncReturnRows(pFunc);
|
||||||
} else if (fmIsInterpFunc(pFunc->funcId)) {
|
} else if (fmIsInterpFunc(pFunc->funcId)) {
|
||||||
pSelect->returnRows = fmGetFuncReturnRows(pFunc);
|
pSelect->returnRows = fmGetFuncReturnRows(pFunc);
|
||||||
|
} else if (fmIsForecastFunc(pFunc->funcId)) {
|
||||||
|
pSelect->returnRows = fmGetFuncReturnRows(pFunc);
|
||||||
}
|
}
|
||||||
if (fmIsProcessByRowFunc(pFunc->funcId)) {
|
if (fmIsProcessByRowFunc(pFunc->funcId)) {
|
||||||
pSelect->lastProcessByRowFuncId = pFunc->funcId;
|
pSelect->lastProcessByRowFuncId = pFunc->funcId;
|
||||||
|
@ -2755,6 +2846,9 @@ static void setFuncClassification(STranslateContext* pCxt, SFunctionNode* pFunc)
|
||||||
pSelect->hasInterpFunc = pSelect->hasInterpFunc ? true : (FUNCTION_TYPE_INTERP == pFunc->funcType);
|
pSelect->hasInterpFunc = pSelect->hasInterpFunc ? true : (FUNCTION_TYPE_INTERP == pFunc->funcType);
|
||||||
pSelect->hasInterpPseudoColFunc =
|
pSelect->hasInterpPseudoColFunc =
|
||||||
pSelect->hasInterpPseudoColFunc ? true : fmIsInterpPseudoColumnFunc(pFunc->funcId);
|
pSelect->hasInterpPseudoColFunc ? true : fmIsInterpPseudoColumnFunc(pFunc->funcId);
|
||||||
|
pSelect->hasForecastFunc = pSelect->hasForecastFunc ? true : (FUNCTION_TYPE_FORECAST == pFunc->funcType);
|
||||||
|
pSelect->hasForecastPseudoColFunc =
|
||||||
|
pSelect->hasForecastPseudoColFunc ? true : fmIsForecastPseudoColumnFunc(pFunc->funcId);
|
||||||
pSelect->hasLastRowFunc = pSelect->hasLastRowFunc ? true : (FUNCTION_TYPE_LAST_ROW == pFunc->funcType);
|
pSelect->hasLastRowFunc = pSelect->hasLastRowFunc ? true : (FUNCTION_TYPE_LAST_ROW == pFunc->funcType);
|
||||||
pSelect->hasLastFunc = pSelect->hasLastFunc ? true : (FUNCTION_TYPE_LAST == pFunc->funcType);
|
pSelect->hasLastFunc = pSelect->hasLastFunc ? true : (FUNCTION_TYPE_LAST == pFunc->funcType);
|
||||||
pSelect->hasTimeLineFunc = pSelect->hasTimeLineFunc ? true : fmIsTimelineFunc(pFunc->funcId);
|
pSelect->hasTimeLineFunc = pSelect->hasTimeLineFunc ? true : fmIsTimelineFunc(pFunc->funcId);
|
||||||
|
@ -2946,6 +3040,9 @@ static int32_t translateScanPseudoColumnFunc(STranslateContext* pCxt, SNode** pp
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
if (0 == LIST_LENGTH(pFunc->pParameterList)) {
|
if (0 == LIST_LENGTH(pFunc->pParameterList)) {
|
||||||
|
if (pFunc->funcType == FUNCTION_TYPE_FORECAST_LOW || pFunc->funcType == FUNCTION_TYPE_FORECAST_HIGH) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
if (!isSelectStmt(pCxt->pCurrStmt) || NULL == ((SSelectStmt*)pCxt->pCurrStmt)->pFromTable) {
|
if (!isSelectStmt(pCxt->pCurrStmt) || NULL == ((SSelectStmt*)pCxt->pCurrStmt)->pFromTable) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TBNAME);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TBNAME);
|
||||||
}
|
}
|
||||||
|
@ -3016,6 +3113,16 @@ static int32_t translateNormalFunction(STranslateContext* pCxt, SNode** ppNode)
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = translateForecastFunc(pCxt, pFunc);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
bool bRewriteToColumn = false;
|
||||||
|
code = translateForecastPseudoColumnFunc(pCxt, ppNode, &bRewriteToColumn);
|
||||||
|
if (bRewriteToColumn) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = translateTimelineFunc(pCxt, pFunc);
|
code = translateTimelineFunc(pCxt, pFunc);
|
||||||
}
|
}
|
||||||
|
@ -3759,7 +3866,8 @@ static int32_t resetSelectFuncNumWithoutDup(SSelectStmt* pSelect) {
|
||||||
|
|
||||||
static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
if (NULL != pSelect->pGroupByList || NULL != pSelect->pWindow || isWindowJoinStmt(pSelect) ||
|
if (NULL != pSelect->pGroupByList || NULL != pSelect->pWindow || isWindowJoinStmt(pSelect) ||
|
||||||
(!pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc && !pSelect->hasInterpFunc)) {
|
(!pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc && !pSelect->hasInterpFunc &&
|
||||||
|
!pSelect->hasForecastFunc)) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
if (!pSelect->onlyHasKeepOrderFunc) {
|
if (!pSelect->onlyHasKeepOrderFunc) {
|
||||||
|
@ -3781,8 +3889,8 @@ static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t checkWinJoinAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
static int32_t checkWinJoinAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
if (!isWindowJoinStmt(pSelect) ||
|
if (!isWindowJoinStmt(pSelect) || (!pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc &&
|
||||||
(!pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc && !pSelect->hasInterpFunc)) {
|
!pSelect->hasInterpFunc && !pSelect->hasForecastFunc)) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
if (!pSelect->onlyHasKeepOrderFunc) {
|
if (!pSelect->onlyHasKeepOrderFunc) {
|
||||||
|
@ -5795,6 +5903,40 @@ static int32_t translateCountWindow(STranslateContext* pCxt, SSelectStmt* pSelec
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t checkAnomalyExpr(STranslateContext* pCxt, SNode* pNode) {
|
||||||
|
int32_t type = ((SExprNode*)pNode)->resType.type;
|
||||||
|
if (!IS_MATHABLE_TYPE(type)) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ANOMALY_WIN_TYPE,
|
||||||
|
"ANOMALY_WINDOW only support mathable column");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QUERY_NODE_COLUMN == nodeType(pNode) && COLUMN_TYPE_TAG == ((SColumnNode*)pNode)->colType) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ANOMALY_WIN_COL,
|
||||||
|
"ANOMALY_WINDOW not support on tag column");
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateAnomalyWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
|
if (QUERY_NODE_TEMP_TABLE == nodeType(pSelect->pFromTable) &&
|
||||||
|
!isGlobalTimeLineQuery(((STempTableNode*)pSelect->pFromTable)->pSubquery)) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TIMELINE_QUERY,
|
||||||
|
"ANOMALY_WINDOW requires valid time series input");
|
||||||
|
}
|
||||||
|
|
||||||
|
SAnomalyWindowNode* pAnomaly = (SAnomalyWindowNode*)pSelect->pWindow;
|
||||||
|
int32_t code = checkAnomalyExpr(pCxt, pAnomaly->pExpr);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
if (!taosAnalGetOptStr(pAnomaly->anomalyOpt, "algo", NULL, 0) != 0) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ANOMALY_WIN_OPT,
|
||||||
|
"ANOMALY_WINDOW option should include algo field");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t translateSpecificWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
static int32_t translateSpecificWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
switch (nodeType(pSelect->pWindow)) {
|
switch (nodeType(pSelect->pWindow)) {
|
||||||
case QUERY_NODE_STATE_WINDOW:
|
case QUERY_NODE_STATE_WINDOW:
|
||||||
|
@ -5807,6 +5949,8 @@ static int32_t translateSpecificWindow(STranslateContext* pCxt, SSelectStmt* pSe
|
||||||
return translateEventWindow(pCxt, pSelect);
|
return translateEventWindow(pCxt, pSelect);
|
||||||
case QUERY_NODE_COUNT_WINDOW:
|
case QUERY_NODE_COUNT_WINDOW:
|
||||||
return translateCountWindow(pCxt, pSelect);
|
return translateCountWindow(pCxt, pSelect);
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW:
|
||||||
|
return translateAnomalyWindow(pCxt, pSelect);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6043,6 +6187,26 @@ static int32_t translateInterp(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t translateForecast(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
|
if (!pSelect->hasForecastFunc) {
|
||||||
|
if (pSelect->hasForecastPseudoColFunc) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC,
|
||||||
|
"Has Forecast pseudo column(s) but missing forcast function");
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((NULL != pSelect->pFromTable) && (QUERY_NODE_JOIN_TABLE == nodeType(pSelect->pFromTable))) {
|
||||||
|
SJoinTableNode* pJoinTable = (SJoinTableNode*)pSelect->pFromTable;
|
||||||
|
if (IS_WINDOW_JOIN(pJoinTable->subType)) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_FORECAST_CLAUSE,
|
||||||
|
"Forecast not supported to be used in WINDOW join");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t removeConstantValueFromList(SNodeList** pList) {
|
static int32_t removeConstantValueFromList(SNodeList** pList) {
|
||||||
SNode* pNode = NULL;
|
SNode* pNode = NULL;
|
||||||
WHERE_EACH(pNode, *pList) {
|
WHERE_EACH(pNode, *pList) {
|
||||||
|
@ -6884,6 +7048,9 @@ static int32_t translateSelectFrom(STranslateContext* pCxt, SSelectStmt* pSelect
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = translateInterp(pCxt, pSelect);
|
code = translateInterp(pCxt, pSelect);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = translateForecast(pCxt, pSelect);
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = appendTsForImplicitTsFunc(pCxt, pSelect);
|
code = appendTsForImplicitTsFunc(pCxt, pSelect);
|
||||||
}
|
}
|
||||||
|
@ -7895,6 +8062,19 @@ static int32_t fillCmdSql(STranslateContext* pCxt, int16_t msgType, void* pReq)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case TDMT_MND_CREATE_ANODE: {
|
||||||
|
FILL_CMD_SQL(sql, sqlLen, pCmdReq, SMCreateAnodeReq, pReq);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TDMT_MND_DROP_ANODE: {
|
||||||
|
FILL_CMD_SQL(sql, sqlLen, pCmdReq, SMDropAnodeReq, pReq);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TDMT_MND_UPDATE_ANODE: {
|
||||||
|
FILL_CMD_SQL(sql, sqlLen, pCmdReq, SMUpdateAnodeReq, pReq);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TDMT_MND_CREATE_MNODE: {
|
case TDMT_MND_CREATE_MNODE: {
|
||||||
FILL_CMD_SQL(sql, sqlLen, pCmdReq, SMCreateMnodeReq, pReq);
|
FILL_CMD_SQL(sql, sqlLen, pCmdReq, SMCreateMnodeReq, pReq);
|
||||||
break;
|
break;
|
||||||
|
@ -9398,6 +9578,39 @@ static int32_t translateDropUser(STranslateContext* pCxt, SDropUserStmt* pStmt)
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t translateCreateAnode(STranslateContext* pCxt, SCreateAnodeStmt* pStmt) {
|
||||||
|
SMCreateAnodeReq createReq = {0};
|
||||||
|
createReq.urlLen = strlen(pStmt->url) + 1;
|
||||||
|
createReq.url = taosMemoryCalloc(createReq.urlLen, 1);
|
||||||
|
if (createReq.url == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
tstrncpy(createReq.url, pStmt->url, createReq.urlLen);
|
||||||
|
|
||||||
|
int32_t code = buildCmdMsg(pCxt, TDMT_MND_CREATE_ANODE, (FSerializeFunc)tSerializeSMCreateAnodeReq, &createReq);
|
||||||
|
tFreeSMCreateAnodeReq(&createReq);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateDropAnode(STranslateContext* pCxt, SDropAnodeStmt* pStmt) {
|
||||||
|
SMDropAnodeReq dropReq = {0};
|
||||||
|
dropReq.anodeId = pStmt->anodeId;
|
||||||
|
|
||||||
|
int32_t code = buildCmdMsg(pCxt, TDMT_MND_DROP_ANODE, (FSerializeFunc)tSerializeSMDropAnodeReq, &dropReq);
|
||||||
|
tFreeSMDropAnodeReq(&dropReq);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateUpdateAnode(STranslateContext* pCxt, SUpdateAnodeStmt* pStmt) {
|
||||||
|
SMUpdateAnodeReq updateReq = {0};
|
||||||
|
updateReq.anodeId = pStmt->anodeId;
|
||||||
|
|
||||||
|
int32_t code = buildCmdMsg(pCxt, TDMT_MND_UPDATE_ANODE, (FSerializeFunc)tSerializeSMUpdateAnodeReq, &updateReq);
|
||||||
|
tFreeSMUpdateAnodeReq(&updateReq);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t translateCreateDnode(STranslateContext* pCxt, SCreateDnodeStmt* pStmt) {
|
static int32_t translateCreateDnode(STranslateContext* pCxt, SCreateDnodeStmt* pStmt) {
|
||||||
SCreateDnodeReq createReq = {0};
|
SCreateDnodeReq createReq = {0};
|
||||||
strcpy(createReq.fqdn, pStmt->fqdn);
|
strcpy(createReq.fqdn, pStmt->fqdn);
|
||||||
|
@ -9820,7 +10033,7 @@ static int32_t translateDropComponentNode(STranslateContext* pCxt, SDropComponen
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t checkTopicQuery(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
static int32_t checkTopicQuery(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
if (pSelect->hasAggFuncs || pSelect->hasInterpFunc || pSelect->hasIndefiniteRowsFunc) {
|
if (pSelect->hasAggFuncs || pSelect->hasForecastFunc || pSelect->hasInterpFunc || pSelect->hasIndefiniteRowsFunc) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TOPIC_QUERY);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TOPIC_QUERY);
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -10186,7 +10399,8 @@ static int32_t translateKillTransaction(STranslateContext* pCxt, SKillStmt* pStm
|
||||||
|
|
||||||
static bool crossTableWithoutAggOper(SSelectStmt* pSelect) {
|
static bool crossTableWithoutAggOper(SSelectStmt* pSelect) {
|
||||||
return NULL == pSelect->pWindow && !pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc &&
|
return NULL == pSelect->pWindow && !pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc &&
|
||||||
!pSelect->hasInterpFunc && TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
!pSelect->hasInterpFunc && !pSelect->hasForecastFunc &&
|
||||||
|
TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
||||||
!hasTbnameFunction(pSelect->pPartitionByList);
|
!hasTbnameFunction(pSelect->pPartitionByList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12389,6 +12603,15 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
||||||
case QUERY_NODE_ALTER_DNODE_STMT:
|
case QUERY_NODE_ALTER_DNODE_STMT:
|
||||||
code = translateAlterDnode(pCxt, (SAlterDnodeStmt*)pNode);
|
code = translateAlterDnode(pCxt, (SAlterDnodeStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_CREATE_ANODE_STMT:
|
||||||
|
code = translateCreateAnode(pCxt, (SCreateAnodeStmt*)pNode);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_DROP_ANODE_STMT:
|
||||||
|
code = translateDropAnode(pCxt, (SDropAnodeStmt*)pNode);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_UPDATE_ANODE_STMT:
|
||||||
|
code = translateUpdateAnode(pCxt, (SUpdateAnodeStmt*)pNode);
|
||||||
|
break;
|
||||||
case QUERY_NODE_CREATE_INDEX_STMT:
|
case QUERY_NODE_CREATE_INDEX_STMT:
|
||||||
code = translateCreateIndex(pCxt, (SCreateIndexStmt*)pNode);
|
code = translateCreateIndex(pCxt, (SCreateIndexStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
@ -15749,6 +15972,8 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
case QUERY_NODE_SHOW_MNODES_STMT:
|
case QUERY_NODE_SHOW_MNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_MODULES_STMT:
|
case QUERY_NODE_SHOW_MODULES_STMT:
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_ANODES_FULL_STMT:
|
||||||
case QUERY_NODE_SHOW_FUNCTIONS_STMT:
|
case QUERY_NODE_SHOW_FUNCTIONS_STMT:
|
||||||
case QUERY_NODE_SHOW_INDEXES_STMT:
|
case QUERY_NODE_SHOW_INDEXES_STMT:
|
||||||
case QUERY_NODE_SHOW_STREAMS_STMT:
|
case QUERY_NODE_SHOW_STREAMS_STMT:
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -973,6 +973,45 @@ static int32_t createInterpFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isForecastFunc(int32_t funcId) {
|
||||||
|
return fmIsForecastFunc(funcId) || fmIsForecastPseudoColumnFunc(funcId) || fmIsGroupKeyFunc(funcId) || fmisSelectGroupConstValueFunc(funcId);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t createForecastFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) {
|
||||||
|
if (!pSelect->hasForecastFunc) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SForecastFuncLogicNode* pForecastFunc = NULL;
|
||||||
|
int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC, (SNode**)&pForecastFunc);
|
||||||
|
if (NULL == pForecastFunc) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
pForecastFunc->node.groupAction = getGroupAction(pCxt, pSelect);
|
||||||
|
pForecastFunc->node.requireDataOrder = getRequireDataOrder(true, pSelect);
|
||||||
|
pForecastFunc->node.resultDataOrder = pForecastFunc->node.requireDataOrder;
|
||||||
|
|
||||||
|
// interp functions and _group_key functions
|
||||||
|
code = nodesCollectFuncs(pSelect, SQL_CLAUSE_SELECT, NULL, isForecastFunc, &pForecastFunc->pFuncs);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = rewriteExprsForSelect(pForecastFunc->pFuncs, pSelect, SQL_CLAUSE_SELECT, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the output
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = createColumnByRewriteExprs(pForecastFunc->pFuncs, &pForecastFunc->node.pTargets);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pLogicNode = (SLogicNode*)pForecastFunc;
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pForecastFunc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t createWindowLogicNodeFinalize(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SWindowLogicNode* pWindow,
|
static int32_t createWindowLogicNodeFinalize(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SWindowLogicNode* pWindow,
|
||||||
SLogicNode** pLogicNode) {
|
SLogicNode** pLogicNode) {
|
||||||
if (pCxt->pPlanCxt->streamQuery) {
|
if (pCxt->pPlanCxt->streamQuery) {
|
||||||
|
@ -1174,6 +1213,48 @@ static int32_t createWindowLogicNodeByCount(SLogicPlanContext* pCxt, SCountWindo
|
||||||
return createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode);
|
return createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t createWindowLogicNodeByAnomaly(SLogicPlanContext* pCxt, SAnomalyWindowNode* pAnomaly,
|
||||||
|
SSelectStmt* pSelect, SLogicNode** pLogicNode) {
|
||||||
|
SWindowLogicNode* pWindow = NULL;
|
||||||
|
int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW, (SNode**)&pWindow);
|
||||||
|
if (NULL == pWindow) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
pWindow->winType = WINDOW_TYPE_ANOMALY;
|
||||||
|
pWindow->node.groupAction = getGroupAction(pCxt, pSelect);
|
||||||
|
pWindow->node.requireDataOrder =
|
||||||
|
pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_IN_BLOCK : getRequireDataOrder(true, pSelect);
|
||||||
|
pWindow->node.resultDataOrder =
|
||||||
|
pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_GLOBAL : pWindow->node.requireDataOrder;
|
||||||
|
|
||||||
|
pWindow->pAnomalyExpr = NULL;
|
||||||
|
code = nodesCloneNode(pAnomaly->pExpr, &pWindow->pAnomalyExpr);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
nodesDestroyNode((SNode*)pWindow);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
tstrncpy(pWindow->anomalyOpt, pAnomaly->anomalyOpt, sizeof(pWindow->anomalyOpt));
|
||||||
|
|
||||||
|
pWindow->pTspk = NULL;
|
||||||
|
code = nodesCloneNode(pAnomaly->pCol, &pWindow->pTspk);
|
||||||
|
if (NULL == pWindow->pTspk) {
|
||||||
|
nodesDestroyNode((SNode*)pWindow);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// rewrite the expression in subsequent clauses
|
||||||
|
code = rewriteExprForSelect(pWindow->pAnomalyExpr, pSelect, SQL_CLAUSE_WINDOW);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode);
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) {
|
static int32_t createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) {
|
||||||
if (NULL == pSelect->pWindow) {
|
if (NULL == pSelect->pWindow) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1189,6 +1270,8 @@ static int32_t createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele
|
||||||
return createWindowLogicNodeByEvent(pCxt, (SEventWindowNode*)pSelect->pWindow, pSelect, pLogicNode);
|
return createWindowLogicNodeByEvent(pCxt, (SEventWindowNode*)pSelect->pWindow, pSelect, pLogicNode);
|
||||||
case QUERY_NODE_COUNT_WINDOW:
|
case QUERY_NODE_COUNT_WINDOW:
|
||||||
return createWindowLogicNodeByCount(pCxt, (SCountWindowNode*)pSelect->pWindow, pSelect, pLogicNode);
|
return createWindowLogicNodeByCount(pCxt, (SCountWindowNode*)pSelect->pWindow, pSelect, pLogicNode);
|
||||||
|
case QUERY_NODE_ANOMALY_WINDOW:
|
||||||
|
return createWindowLogicNodeByAnomaly(pCxt, (SAnomalyWindowNode*)pSelect->pWindow, pSelect, pLogicNode);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1600,6 +1683,9 @@ static int32_t createSelectFromLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = createSelectRootLogicNode(pCxt, pSelect, createInterpFuncLogicNode, &pRoot);
|
code = createSelectRootLogicNode(pCxt, pSelect, createInterpFuncLogicNode, &pRoot);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = createSelectRootLogicNode(pCxt, pSelect, createForecastFuncLogicNode, &pRoot);
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = createSelectRootLogicNode(pCxt, pSelect, createDistinctLogicNode, &pRoot);
|
code = createSelectRootLogicNode(pCxt, pSelect, createDistinctLogicNode, &pRoot);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1990,6 +1990,50 @@ static int32_t createInterpFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pCh
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t createForecastFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren,
|
||||||
|
SForecastFuncLogicNode* pFuncLogicNode, SPhysiNode** pPhyNode) {
|
||||||
|
SForecastFuncPhysiNode* pForecastFunc =
|
||||||
|
(SForecastFuncPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pFuncLogicNode, QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC);
|
||||||
|
if (NULL == pForecastFunc) {
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNodeList* pPrecalcExprs = NULL;
|
||||||
|
SNodeList* pFuncs = NULL;
|
||||||
|
int32_t code = rewritePrecalcExprs(pCxt, pFuncLogicNode->pFuncs, &pPrecalcExprs, &pFuncs);
|
||||||
|
|
||||||
|
SDataBlockDescNode* pChildTupe = (((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc);
|
||||||
|
// push down expression to pOutputDataBlockDesc of child node
|
||||||
|
if (TSDB_CODE_SUCCESS == code && NULL != pPrecalcExprs) {
|
||||||
|
code = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pPrecalcExprs, &pForecastFunc->pExprs);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = pushdownDataBlockSlots(pCxt, pForecastFunc->pExprs, pChildTupe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pFuncs, &pForecastFunc->pFuncs);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = addDataBlockSlots(pCxt, pForecastFunc->pFuncs, pForecastFunc->node.pOutputDataBlockDesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = setConditionsSlotId(pCxt, (const SLogicNode*)pFuncLogicNode, (SPhysiNode*)pForecastFunc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pPhyNode = (SPhysiNode*)pForecastFunc;
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pForecastFunc);
|
||||||
|
}
|
||||||
|
|
||||||
|
nodesDestroyList(pPrecalcExprs);
|
||||||
|
nodesDestroyList(pFuncs);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static bool projectCanMergeDataBlock(SProjectLogicNode* pProject) {
|
static bool projectCanMergeDataBlock(SProjectLogicNode* pProject) {
|
||||||
if (GROUP_ACTION_KEEP == pProject->node.groupAction) {
|
if (GROUP_ACTION_KEEP == pProject->node.groupAction) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -2325,6 +2369,53 @@ static int32_t createCountWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pC
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t createAnomalyWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren,
|
||||||
|
SWindowLogicNode* pWindowLogicNode, SPhysiNode** pPhyNode) {
|
||||||
|
SAnomalyWindowPhysiNode* pAnomaly = (SAnomalyWindowPhysiNode*)makePhysiNode(
|
||||||
|
pCxt, (SLogicNode*)pWindowLogicNode,
|
||||||
|
(pCxt->pPlanCxt->streamQuery ? QUERY_NODE_PHYSICAL_PLAN_STREAM_ANOMALY : QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY));
|
||||||
|
if (NULL == pAnomaly) {
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNodeList* pPrecalcExprs = NULL;
|
||||||
|
SNode* pAnomalyKey = NULL;
|
||||||
|
int32_t code = rewritePrecalcExpr(pCxt, pWindowLogicNode->pAnomalyExpr, &pPrecalcExprs, &pAnomalyKey);
|
||||||
|
|
||||||
|
SDataBlockDescNode* pChildTupe = (((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc);
|
||||||
|
// push down expression to pOutputDataBlockDesc of child node
|
||||||
|
if (TSDB_CODE_SUCCESS == code && NULL != pPrecalcExprs) {
|
||||||
|
code = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pPrecalcExprs, &pAnomaly->window.pExprs);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = addDataBlockSlots(pCxt, pAnomaly->window.pExprs, pChildTupe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = setNodeSlotId(pCxt, pChildTupe->dataBlockId, -1, pAnomalyKey, &pAnomaly->pAnomalyKey);
|
||||||
|
// if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
// code = addDataBlockSlot(pCxt, &pAnomaly->pAnomalyKey, pAnomaly->window.node.pOutputDataBlockDesc);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
tstrncpy(pAnomaly->anomalyOpt, pWindowLogicNode->anomalyOpt, sizeof(pAnomaly->anomalyOpt));
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = createWindowPhysiNodeFinalize(pCxt, pChildren, &pAnomaly->window, pWindowLogicNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pPhyNode = (SPhysiNode*)pAnomaly;
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pAnomaly);
|
||||||
|
}
|
||||||
|
|
||||||
|
nodesDestroyList(pPrecalcExprs);
|
||||||
|
nodesDestroyNode(pAnomalyKey);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t createWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren, SWindowLogicNode* pWindowLogicNode,
|
static int32_t createWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren, SWindowLogicNode* pWindowLogicNode,
|
||||||
SPhysiNode** pPhyNode) {
|
SPhysiNode** pPhyNode) {
|
||||||
switch (pWindowLogicNode->winType) {
|
switch (pWindowLogicNode->winType) {
|
||||||
|
@ -2338,6 +2429,8 @@ static int32_t createWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildr
|
||||||
return createEventWindowPhysiNode(pCxt, pChildren, pWindowLogicNode, pPhyNode);
|
return createEventWindowPhysiNode(pCxt, pChildren, pWindowLogicNode, pPhyNode);
|
||||||
case WINDOW_TYPE_COUNT:
|
case WINDOW_TYPE_COUNT:
|
||||||
return createCountWindowPhysiNode(pCxt, pChildren, pWindowLogicNode, pPhyNode);
|
return createCountWindowPhysiNode(pCxt, pChildren, pWindowLogicNode, pPhyNode);
|
||||||
|
case WINDOW_TYPE_ANOMALY:
|
||||||
|
return createAnomalyWindowPhysiNode(pCxt, pChildren, pWindowLogicNode, pPhyNode);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2652,6 +2745,8 @@ static int32_t doCreatePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode
|
||||||
return createIndefRowsFuncPhysiNode(pCxt, pChildren, (SIndefRowsFuncLogicNode*)pLogicNode, pPhyNode);
|
return createIndefRowsFuncPhysiNode(pCxt, pChildren, (SIndefRowsFuncLogicNode*)pLogicNode, pPhyNode);
|
||||||
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
||||||
return createInterpFuncPhysiNode(pCxt, pChildren, (SInterpFuncLogicNode*)pLogicNode, pPhyNode);
|
return createInterpFuncPhysiNode(pCxt, pChildren, (SInterpFuncLogicNode*)pLogicNode, pPhyNode);
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
|
||||||
|
return createForecastFuncPhysiNode(pCxt, pChildren, (SForecastFuncLogicNode*)pLogicNode, pPhyNode);
|
||||||
case QUERY_NODE_LOGIC_PLAN_MERGE:
|
case QUERY_NODE_LOGIC_PLAN_MERGE:
|
||||||
return createMergePhysiNode(pCxt, pChildren, (SMergeLogicNode*)pLogicNode, pPhyNode);
|
return createMergePhysiNode(pCxt, pChildren, (SMergeLogicNode*)pLogicNode, pPhyNode);
|
||||||
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
|
||||||
|
|
|
@ -256,6 +256,15 @@ static int32_t adjustCountDataRequirement(SWindowLogicNode* pWindow, EDataOrderL
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t adjustAnomalyDataRequirement(SWindowLogicNode* pWindow, EDataOrderLevel requirement) {
|
||||||
|
if (requirement <= pWindow->node.resultDataOrder) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
pWindow->node.resultDataOrder = requirement;
|
||||||
|
pWindow->node.requireDataOrder = requirement;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t adjustWindowDataRequirement(SWindowLogicNode* pWindow, EDataOrderLevel requirement) {
|
static int32_t adjustWindowDataRequirement(SWindowLogicNode* pWindow, EDataOrderLevel requirement) {
|
||||||
switch (pWindow->winType) {
|
switch (pWindow->winType) {
|
||||||
case WINDOW_TYPE_INTERVAL:
|
case WINDOW_TYPE_INTERVAL:
|
||||||
|
@ -268,6 +277,8 @@ static int32_t adjustWindowDataRequirement(SWindowLogicNode* pWindow, EDataOrder
|
||||||
return adjustEventDataRequirement(pWindow, requirement);
|
return adjustEventDataRequirement(pWindow, requirement);
|
||||||
case WINDOW_TYPE_COUNT:
|
case WINDOW_TYPE_COUNT:
|
||||||
return adjustCountDataRequirement(pWindow, requirement);
|
return adjustCountDataRequirement(pWindow, requirement);
|
||||||
|
case WINDOW_TYPE_ANOMALY:
|
||||||
|
return adjustAnomalyDataRequirement(pWindow, requirement);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -318,6 +329,15 @@ static int32_t adjustInterpDataRequirement(SInterpFuncLogicNode* pInterp, EDataO
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t adjustForecastDataRequirement(SForecastFuncLogicNode* pForecast, EDataOrderLevel requirement) {
|
||||||
|
if (requirement <= pForecast->node.requireDataOrder) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
pForecast->node.resultDataOrder = requirement;
|
||||||
|
pForecast->node.requireDataOrder = requirement;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t adjustLogicNodeDataRequirement(SLogicNode* pNode, EDataOrderLevel requirement) {
|
int32_t adjustLogicNodeDataRequirement(SLogicNode* pNode, EDataOrderLevel requirement) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
switch (nodeType(pNode)) {
|
switch (nodeType(pNode)) {
|
||||||
|
@ -355,6 +375,9 @@ int32_t adjustLogicNodeDataRequirement(SLogicNode* pNode, EDataOrderLevel requir
|
||||||
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
|
||||||
code = adjustInterpDataRequirement((SInterpFuncLogicNode*)pNode, requirement);
|
code = adjustInterpDataRequirement((SInterpFuncLogicNode*)pNode, requirement);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
|
||||||
|
code = adjustForecastDataRequirement((SForecastFuncLogicNode*)pNode, requirement);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -539,7 +539,7 @@ int32_t qwSaveTbVersionInfo(qTaskInfo_t pTaskInfo, SQWTaskCtx *ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dbFName[0] && tbName[0]) {
|
if (dbFName[0] && tbName[0]) {
|
||||||
(void)sprintf(tbInfo.tbFName, "%s.%s", dbFName, tbName);
|
(void)snprintf(tbInfo.tbFName, sizeof(tbInfo.tbFName), "%s.%s", dbFName, tbName);
|
||||||
} else {
|
} else {
|
||||||
tbInfo.tbFName[0] = 0;
|
tbInfo.tbFName[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2193,7 +2193,7 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
|
||||||
NUM_TO_STRING(type, input, sizeof(fraction), fraction);
|
NUM_TO_STRING(type, input, sizeof(fraction), fraction);
|
||||||
int32_t fractionLen;
|
int32_t fractionLen;
|
||||||
|
|
||||||
char buf[64] = {0};
|
char buf[TD_TIME_STR_LEN] = {0};
|
||||||
int64_t timeVal;
|
int64_t timeVal;
|
||||||
char* format = NULL;
|
char* format = NULL;
|
||||||
int64_t quot = 0;
|
int64_t quot = 0;
|
||||||
|
@ -2244,7 +2244,7 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
|
||||||
struct tm tmInfo;
|
struct tm tmInfo;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
|
|
||||||
if (taosLocalTime((const time_t *)", &tmInfo, buf) == NULL) {
|
if (taosLocalTime((const time_t *)", &tmInfo, buf, sizeof(buf)) == NULL) {
|
||||||
len = (int32_t)strlen(buf);
|
len = (int32_t)strlen(buf);
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
|
@ -729,7 +729,7 @@ int32_t schMakeHbCallbackParam(SSchJob *pJob, SSchTask *pTask, void **pParam) {
|
||||||
|
|
||||||
param->nodeEpId.nodeId = addr->nodeId;
|
param->nodeEpId.nodeId = addr->nodeId;
|
||||||
SEp* pEp = SCH_GET_CUR_EP(addr);
|
SEp* pEp = SCH_GET_CUR_EP(addr);
|
||||||
strcpy(param->nodeEpId.ep.fqdn, pEp->fqdn);
|
tstrncpy(param->nodeEpId.ep.fqdn, pEp->fqdn, sizeof(param->nodeEpId.ep.fqdn));
|
||||||
param->nodeEpId.ep.port = pEp->port;
|
param->nodeEpId.ep.port = pEp->port;
|
||||||
param->pTrans = pJob->pTrans;
|
param->pTrans = pJob->pTrans;
|
||||||
|
|
||||||
|
|
|
@ -288,7 +288,7 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (SCH_IS_DATA_SRC_TASK(task) && job->dataSrcEps.numOfEps < SCH_MAX_CANDIDATE_EP_NUM) {
|
if (SCH_IS_DATA_SRC_TASK(task) && job->dataSrcEps.numOfEps < SCH_MAX_CANDIDATE_EP_NUM) {
|
||||||
strncpy(job->dataSrcEps.fqdn[job->dataSrcEps.numOfEps], task->execAddr.fqdn, sizeof(task->execAddr.fqdn));
|
tstrncpy(job->dataSrcEps.fqdn[job->dataSrcEps.numOfEps], task->execAddr.fqdn, sizeof(task->execAddr.fqdn));
|
||||||
job->dataSrcEps.port[job->dataSrcEps.numOfEps] = task->execAddr.port;
|
job->dataSrcEps.port[job->dataSrcEps.numOfEps] = task->execAddr.port;
|
||||||
|
|
||||||
++job->dataSrcEps.numOfEps;
|
++job->dataSrcEps.numOfEps;
|
||||||
|
@ -840,7 +840,7 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
for (int32_t i = 0; i < job->dataSrcEps.numOfEps && addNum < SCH_MAX_CANDIDATE_EP_NUM; ++i) {
|
for (int32_t i = 0; i < job->dataSrcEps.numOfEps && addNum < SCH_MAX_CANDIDATE_EP_NUM; ++i) {
|
||||||
strncpy(epSet->fqdn[epSet->numOfEps], job->dataSrcEps.fqdn[i], sizeof(job->dataSrcEps.fqdn[i]));
|
tstrncpy(epSet->fqdn[epSet->numOfEps], job->dataSrcEps.fqdn[i], sizeof(job->dataSrcEps.fqdn[i]));
|
||||||
epSet->port[epSet->numOfEps] = job->dataSrcEps.port[i];
|
epSet->port[epSet->numOfEps] = job->dataSrcEps.port[i];
|
||||||
|
|
||||||
++epSet->numOfEps;
|
++epSet->numOfEps;
|
||||||
|
|
|
@ -60,7 +60,7 @@ bool syncUtilNodeInfo2RaftId(const SNodeInfo* pInfo, SyncGroupId vgId, SRaftId*
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char ipbuf[128] = {0};
|
char ipbuf[TD_IP_LEN] = {0};
|
||||||
tinet_ntoa(ipbuf, ipv4);
|
tinet_ntoa(ipbuf, ipv4);
|
||||||
raftId->addr = SYNC_ADDR(pInfo);
|
raftId->addr = SYNC_ADDR(pInfo);
|
||||||
raftId->vgId = vgId;
|
raftId->vgId = vgId;
|
||||||
|
|
|
@ -223,7 +223,7 @@ static FORCE_INLINE int32_t taosBuildDstAddr(const char* server, uint16_t port,
|
||||||
tError("http-report failed to resolving domain names %s, reason: %s", server, tstrerror(code));
|
tError("http-report failed to resolving domain names %s, reason: %s", server, tstrerror(code));
|
||||||
return TSDB_CODE_RPC_FQDN_ERROR;
|
return TSDB_CODE_RPC_FQDN_ERROR;
|
||||||
}
|
}
|
||||||
char buf[256] = {0};
|
char buf[TD_IP_LEN] = {0};
|
||||||
tinet_ntoa(buf, ip);
|
tinet_ntoa(buf, ip);
|
||||||
int ret = uv_ip4_addr(buf, port, dest);
|
int ret = uv_ip4_addr(buf, port, dest);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
|
|
@ -1790,7 +1790,7 @@ static FORCE_INLINE int32_t cliUpdateFqdnCache(SHashObj* cache, char* fqdn) {
|
||||||
size_t len = strlen(fqdn);
|
size_t len = strlen(fqdn);
|
||||||
uint32_t* v = taosHashGet(cache, fqdn, len);
|
uint32_t* v = taosHashGet(cache, fqdn, len);
|
||||||
if (addr != *v) {
|
if (addr != *v) {
|
||||||
char old[64] = {0}, new[64] = {0};
|
char old[TD_IP_LEN] = {0}, new[TD_IP_LEN] = {0};
|
||||||
tinet_ntoa(old, *v);
|
tinet_ntoa(old, *v);
|
||||||
tinet_ntoa(new, addr);
|
tinet_ntoa(new, addr);
|
||||||
tWarn("update ip of fqdn:%s, old: %s, new: %s", fqdn, old, new);
|
tWarn("update ip of fqdn:%s, old: %s, new: %s", fqdn, old, new);
|
||||||
|
|
|
@ -151,7 +151,7 @@ int32_t taosMulMkDir(const char *dirname) {
|
||||||
}
|
}
|
||||||
if (temp[1] == ':') pos += 3;
|
if (temp[1] == ':') pos += 3;
|
||||||
#else
|
#else
|
||||||
(void)strcpy(temp, dirname);
|
tstrncpy(temp, dirname, sizeof(temp));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (taosDirExist(temp)) return code;
|
if (taosDirExist(temp)) return code;
|
||||||
|
@ -216,7 +216,7 @@ int32_t taosMulModeMkDir(const char *dirname, int mode, bool checkAccess) {
|
||||||
}
|
}
|
||||||
if (temp[1] == ':') pos += 3;
|
if (temp[1] == ':') pos += 3;
|
||||||
#else
|
#else
|
||||||
(void)strcpy(temp, dirname);
|
tstrncpy(temp, dirname, sizeof(temp));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (taosDirExist(temp)) {
|
if (taosDirExist(temp)) {
|
||||||
|
@ -341,7 +341,7 @@ int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (full_path.we_wordv != NULL && full_path.we_wordv[0] != NULL) {
|
if (full_path.we_wordv != NULL && full_path.we_wordv[0] != NULL) {
|
||||||
(void)strncpy(outname, full_path.we_wordv[0], maxlen);
|
tstrncpy(outname, full_path.we_wordv[0], maxlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
wordfree(&full_path);
|
wordfree(&full_path);
|
||||||
|
@ -358,9 +358,9 @@ int32_t taosRealPath(char *dirname, char *realPath, int32_t maxlen) {
|
||||||
#endif
|
#endif
|
||||||
if (strlen(tmp) < maxlen) {
|
if (strlen(tmp) < maxlen) {
|
||||||
if (realPath == NULL) {
|
if (realPath == NULL) {
|
||||||
(void)strncpy(dirname, tmp, maxlen);
|
tstrncpy(dirname, tmp, maxlen);
|
||||||
} else {
|
} else {
|
||||||
(void)strncpy(realPath, tmp, maxlen);
|
tstrncpy(realPath, tmp, maxlen);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -440,8 +440,7 @@ TdDirPtr taosOpenDir(const char *dirname) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(szFind, dirname);
|
snprintf(szFind, sizeof(szFind), "%s%s", dirname, "\\*.*"); //利用通配符找这个目录下的所以文件,包括目录
|
||||||
strcat(szFind, "\\*.*"); //利用通配符找这个目录下的所以文件,包括目录
|
|
||||||
|
|
||||||
pDir->hFind = FindFirstFile(szFind, &(pDir->dirEntry.findFileData));
|
pDir->hFind = FindFirstFile(szFind, &(pDir->dirEntry.findFileData));
|
||||||
if (INVALID_HANDLE_VALUE == pDir->hFind) {
|
if (INVALID_HANDLE_VALUE == pDir->hFind) {
|
||||||
|
@ -560,6 +559,6 @@ void taosGetCwd(char *buf, int32_t len) {
|
||||||
char *unused __attribute__((unused));
|
char *unused __attribute__((unused));
|
||||||
unused = getcwd(buf, len - 1);
|
unused = getcwd(buf, len - 1);
|
||||||
#else
|
#else
|
||||||
strncpy(buf, "not implemented on windows", len - 1);
|
tstrncpy(buf, "not implemented on windows", len);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,21 +77,21 @@ int32_t osDefaultInit() {
|
||||||
tmpDir = getenv("temp");
|
tmpDir = getenv("temp");
|
||||||
}
|
}
|
||||||
if (tmpDir != NULL) {
|
if (tmpDir != NULL) {
|
||||||
(void)strcpy(tsTempDir, tmpDir);
|
tstrncpy(tsTempDir, tmpDir, sizeof(tsTempDir));
|
||||||
}
|
}
|
||||||
(void)strcpy(tsOsName, "Windows");
|
tstrncpy(tsOsName, "Windows", sizeof(tsOsName));
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
(void)strcpy(tsOsName, "Darwin");
|
tstrncpy(tsOsName, "Darwin", sizeof(tsOsName));
|
||||||
#else
|
#else
|
||||||
(void)strcpy(tsOsName, "Linux");
|
tstrncpy(tsOsName, "Linux", sizeof(tsOsName));
|
||||||
#endif
|
#endif
|
||||||
if (configDir[0] == 0) {
|
if (configDir[0] == 0) {
|
||||||
(void)strcpy(configDir, TD_CFG_DIR_PATH);
|
tstrncpy(configDir, TD_CFG_DIR_PATH, sizeof(configDir));
|
||||||
}
|
}
|
||||||
(void)strcpy(tsDataDir, TD_DATA_DIR_PATH);
|
tstrncpy(tsDataDir, TD_DATA_DIR_PATH, sizeof(tsDataDir));
|
||||||
(void)strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
tstrncpy(tsLogDir, TD_LOG_DIR_PATH, sizeof(tsLogDir));
|
||||||
if (strlen(tsTempDir) == 0){
|
if (strlen(tsTempDir) == 0){
|
||||||
(void)strcpy(tsTempDir, TD_TMP_DIR_PATH);
|
tstrncpy(tsTempDir, TD_TMP_DIR_PATH, sizeof(tsTempDir));
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -91,11 +91,7 @@ void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, cha
|
||||||
tmpPath[len++] = '\\';
|
tmpPath[len++] = '\\';
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(tmpPath + len, TD_TMP_FILE_PREFIX);
|
snprintf(tmpPath + len, sizeof(tmpPath) - len, "%s%s%s", TD_TMP_FILE_PREFIX, fileNamePrefix, "-%d-%s");
|
||||||
if (strlen(tmpPath) + strlen(fileNamePrefix) + strlen("-%d-%s") < PATH_MAX) {
|
|
||||||
strcat(tmpPath, fileNamePrefix);
|
|
||||||
strcat(tmpPath, "-%d-%s");
|
|
||||||
}
|
|
||||||
|
|
||||||
char rand[8] = {0};
|
char rand[8] = {0};
|
||||||
taosRandStr(rand, tListLen(rand) - 1);
|
taosRandStr(rand, tListLen(rand) - 1);
|
||||||
|
@ -112,15 +108,11 @@ void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, cha
|
||||||
tmpPath[len++] = '/';
|
tmpPath[len++] = '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)strcpy(tmpPath + len, TD_TMP_FILE_PREFIX);
|
snprintf(tmpPath + len, sizeof(tmpPath) - len, "%s%s%s", TD_TMP_FILE_PREFIX, fileNamePrefix, "-%d-%s");
|
||||||
if (strlen(tmpPath) + strlen(fileNamePrefix) + strlen("-%d-%s") < PATH_MAX) {
|
|
||||||
(void)strcat(tmpPath, fileNamePrefix);
|
|
||||||
(void)strcat(tmpPath, "-%d-%s");
|
|
||||||
}
|
|
||||||
|
|
||||||
char rand[32] = {0};
|
char rand[32] = {0};
|
||||||
|
|
||||||
(void)sprintf(rand, "%" PRIu64, atomic_add_fetch_64(&seqId, 1));
|
(void)snprintf(rand, sizeof(rand), "%" PRIu64, atomic_add_fetch_64(&seqId, 1));
|
||||||
|
|
||||||
(void)snprintf(dstPath, PATH_MAX, tmpPath, getpid(), rand);
|
(void)snprintf(dstPath, PATH_MAX, tmpPath, getpid(), rand);
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) {
|
||||||
if (locale != NULL) {
|
if (locale != NULL) {
|
||||||
tstrncpy(outLocale, locale, TD_LOCALE_LEN);
|
tstrncpy(outLocale, locale, TD_LOCALE_LEN);
|
||||||
}
|
}
|
||||||
strcpy(outCharset, "UTF-8");
|
tstrncpy(outCharset, "UTF-8", TD_CHARSET_LEN);
|
||||||
|
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
/*
|
/*
|
||||||
|
@ -123,7 +123,7 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) {
|
||||||
locale = setlocale(LC_CTYPE, "");
|
locale = setlocale(LC_CTYPE, "");
|
||||||
if (locale == NULL) {
|
if (locale == NULL) {
|
||||||
// printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
|
// printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
|
||||||
strcpy(outLocale, "en_US.UTF-8");
|
tstrncpy(outLocale, "en_US.UTF-8", TD_LOCALE_LEN);
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(outLocale, locale, TD_LOCALE_LEN);
|
tstrncpy(outLocale, locale, TD_LOCALE_LEN);
|
||||||
// printf("locale not configured, set to system default:%s", outLocale);
|
// printf("locale not configured, set to system default:%s", outLocale);
|
||||||
|
@ -137,7 +137,7 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) {
|
||||||
char *revisedCharset = taosCharsetReplace(str);
|
char *revisedCharset = taosCharsetReplace(str);
|
||||||
|
|
||||||
if (NULL == revisedCharset) {
|
if (NULL == revisedCharset) {
|
||||||
(void)strcpy(outCharset, "UTF-8");
|
tstrncpy(outCharset, "UTF-8", TD_CHARSET_LEN);
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(outCharset, revisedCharset, TD_CHARSET_LEN);
|
tstrncpy(outCharset, revisedCharset, TD_CHARSET_LEN);
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) {
|
||||||
}
|
}
|
||||||
// printf("charset not configured, set to system default:%s", outCharset);
|
// printf("charset not configured, set to system default:%s", outCharset);
|
||||||
} else {
|
} else {
|
||||||
strcpy(outCharset, "UTF-8");
|
tstrncpy(outCharset, "UTF-8", TD_CHARSET_LEN);
|
||||||
// printf("can't get locale and charset from system, set it to UTF-8");
|
// printf("can't get locale and charset from system, set it to UTF-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) {
|
||||||
locale = setlocale(LC_CTYPE, "");
|
locale = setlocale(LC_CTYPE, "");
|
||||||
if (locale == NULL) {
|
if (locale == NULL) {
|
||||||
// printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
|
// printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
|
||||||
(void)strcpy(outLocale, "en_US.UTF-8");
|
tstrncpy(outLocale, "en_US.UTF-8", TD_LOCALE_LEN);
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(outLocale, locale, TD_LOCALE_LEN);
|
tstrncpy(outLocale, locale, TD_LOCALE_LEN);
|
||||||
//printf("locale not configured, set to system default:%s\n", outLocale);
|
//printf("locale not configured, set to system default:%s\n", outLocale);
|
||||||
|
@ -186,15 +186,15 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) {
|
||||||
|
|
||||||
char *revisedCharset = taosCharsetReplace(str);
|
char *revisedCharset = taosCharsetReplace(str);
|
||||||
if (NULL == revisedCharset) {
|
if (NULL == revisedCharset) {
|
||||||
(void)strcpy(outCharset, "UTF-8");
|
tstrncpy(outCharset, "UTF-8", TD_CHARSET_LEN);
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(outCharset, revisedCharset, TD_LOCALE_LEN);
|
tstrncpy(outCharset, revisedCharset, TD_CHARSET_LEN);
|
||||||
|
|
||||||
taosMemoryFree(revisedCharset);
|
taosMemoryFree(revisedCharset);
|
||||||
}
|
}
|
||||||
// printf("charset not configured, set to system default:%s", outCharset);
|
// printf("charset not configured, set to system default:%s", outCharset);
|
||||||
} else {
|
} else {
|
||||||
(void)strcpy(outCharset, "UTF-8");
|
tstrncpy(outCharset, "UTF-8", TD_CHARSET_LEN);
|
||||||
// printf("can't get locale and charset from system, set it to UTF-8");
|
// printf("can't get locale and charset from system, set it to UTF-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -377,20 +377,20 @@ int32_t tsem2_wait(tsem2_t* sem) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsem2_timewait(tsem2_t* sem, int64_t ms) {
|
int32_t tsem2_timewait(tsem2_t* sem, int64_t ms) {
|
||||||
int ret = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
ret = taosThreadMutexLock(&sem->mutex);
|
code = taosThreadMutexLock(&sem->mutex);
|
||||||
if (ret) {
|
if (code) {
|
||||||
return ret;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sem->count <= 0) {
|
if (sem->count <= 0) {
|
||||||
struct timespec ts = {0};
|
struct timespec ts = {0};
|
||||||
if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1) {
|
if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1) {
|
||||||
ret = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
(void)taosThreadMutexUnlock(&sem->mutex);
|
(void)taosThreadMutexUnlock(&sem->mutex);
|
||||||
terrno = ret;
|
terrno = code;
|
||||||
return ret;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
ts.tv_sec += ms / 1000;
|
ts.tv_sec += ms / 1000;
|
||||||
|
@ -399,22 +399,18 @@ int32_t tsem2_timewait(tsem2_t* sem, int64_t ms) {
|
||||||
ts.tv_nsec %= 1000000000;
|
ts.tv_nsec %= 1000000000;
|
||||||
|
|
||||||
while (sem->count <= 0) {
|
while (sem->count <= 0) {
|
||||||
ret = taosThreadCondTimedWait(&sem->cond, &sem->mutex, &ts);
|
code = taosThreadCondTimedWait(&sem->cond, &sem->mutex, &ts);
|
||||||
if (ret != 0) {
|
if (code != 0) {
|
||||||
(void)taosThreadMutexUnlock(&sem->mutex);
|
(void)taosThreadMutexUnlock(&sem->mutex);
|
||||||
if (errno == ETIMEDOUT) {
|
return code;
|
||||||
return TSDB_CODE_TIMEOUT_ERROR;
|
|
||||||
} else {
|
|
||||||
return TAOS_SYSTEM_ERROR(errno);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sem->count--;
|
sem->count--;
|
||||||
|
|
||||||
ret = taosThreadMutexUnlock(&sem->mutex);
|
code = taosThreadMutexUnlock(&sem->mutex);
|
||||||
return ret;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -332,8 +332,8 @@ int32_t taosGetFqdn(char *fqdn) {
|
||||||
// thus, we choose AF_INET (ipv4 for the moment) to make getaddrinfo return
|
// thus, we choose AF_INET (ipv4 for the moment) to make getaddrinfo return
|
||||||
// immediately
|
// immediately
|
||||||
// hints.ai_family = AF_INET;
|
// hints.ai_family = AF_INET;
|
||||||
strcpy(fqdn, hostname);
|
tstrncpy(fqdn, hostname, TD_FQDN_LEN);
|
||||||
strcpy(fqdn + strlen(hostname), ".local");
|
tstrncpy(fqdn + strlen(hostname), ".local", TD_FQDN_LEN - strlen(hostname));
|
||||||
#else // linux
|
#else // linux
|
||||||
|
|
||||||
#endif // linux
|
#endif // linux
|
||||||
|
@ -361,7 +361,7 @@ int32_t taosGetFqdn(char *fqdn) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)strcpy(fqdn, result->ai_canonname);
|
tstrncpy(fqdn, result->ai_canonname, TD_FQDN_LEN);
|
||||||
|
|
||||||
freeaddrinfo(result);
|
freeaddrinfo(result);
|
||||||
|
|
||||||
|
@ -375,7 +375,7 @@ int32_t taosGetFqdn(char *fqdn) {
|
||||||
// fprintf(stderr, "failed to get fqdn, code:%d, hostname:%s, reason:%s\n", ret, hostname, gai_strerror(ret));
|
// fprintf(stderr, "failed to get fqdn, code:%d, hostname:%s, reason:%s\n", ret, hostname, gai_strerror(ret));
|
||||||
return TAOS_SYSTEM_WINSOCKET_ERROR(WSAGetLastError());
|
return TAOS_SYSTEM_WINSOCKET_ERROR(WSAGetLastError());
|
||||||
}
|
}
|
||||||
strcpy(fqdn, result->ai_canonname);
|
tstrncpy(fqdn, result->ai_canonname, TD_FQDN_LEN);
|
||||||
freeaddrinfo(result);
|
freeaddrinfo(result);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -384,7 +384,7 @@ int32_t taosGetFqdn(char *fqdn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void tinet_ntoa(char *ipstr, uint32_t ip) {
|
void tinet_ntoa(char *ipstr, uint32_t ip) {
|
||||||
(void)sprintf(ipstr, "%d.%d.%d.%d", ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24);
|
(void)snprintf(ipstr, TD_IP_LEN, "%d.%d.%d.%d", ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosIgnSIGPIPE() {
|
int32_t taosIgnSIGPIPE() {
|
||||||
|
|
|
@ -71,7 +71,7 @@ char *taosStrndup(const char *s, int size) {
|
||||||
if (l > size) l = size;
|
if (l > size) l = size;
|
||||||
s2 = malloc(l + 1);
|
s2 = malloc(l + 1);
|
||||||
if (s2) {
|
if (s2) {
|
||||||
strncpy(s2, s, l);
|
tstrncpy(s2, s, l + 1);
|
||||||
s2[l] = '\0';
|
s2[l] = '\0';
|
||||||
} else {
|
} else {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -442,14 +442,14 @@ int32_t taosUcs4len(TdUcs4 *ucs4) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// dst buffer size should be at least 2*len + 1
|
// dst buffer size should be at least 2*len + 1
|
||||||
int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len) {
|
int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len, int32_t bufSize) {
|
||||||
if (!dst) {
|
if (!dst) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < len; ++i) {
|
for (int32_t i = 0; i < len; ++i) {
|
||||||
(void)sprintf(dst + i * 2, "%02x", src[i]);
|
(void)snprintf(dst + i * 2, bufSize - i * 2, "%02x", src[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -389,10 +389,10 @@ int32_t taosGetOsReleaseName(char *releaseName, char* sName, char* ver, int32_t
|
||||||
}
|
}
|
||||||
if (major >= 20) {
|
if (major >= 20) {
|
||||||
major -= 9; // macOS 11 and newer
|
major -= 9; // macOS 11 and newer
|
||||||
sprintf(releaseName, "macOS %u.%u", major, minor);
|
snprintf(releaseName, maxLen, "macOS %u.%u", major, minor);
|
||||||
} else {
|
} else {
|
||||||
major -= 4; // macOS 10.1.1 and newer
|
major -= 4; // macOS 10.1.1 and newer
|
||||||
sprintf(releaseName, "macOS 10.%d.%d", major, minor);
|
snprintf(releaseName, maxLen, "macOS 10.%d.%d", major, minor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -474,7 +474,7 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) {
|
||||||
if (taosGetsCmd(pCmd, sizeof(buf) - 1, buf) > 0) {
|
if (taosGetsCmd(pCmd, sizeof(buf) - 1, buf) > 0) {
|
||||||
code = 0;
|
code = 0;
|
||||||
done |= 2;
|
done |= 2;
|
||||||
*numOfCores = atof(buf);
|
*numOfCores = taosStr2Float(buf, NULL);
|
||||||
}
|
}
|
||||||
taosCloseCmd(&pCmd);
|
taosCloseCmd(&pCmd);
|
||||||
|
|
||||||
|
@ -498,7 +498,7 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) {
|
||||||
done |= 1;
|
done |= 1;
|
||||||
} else if (((done & 2) == 0) && strncmp(line, "cpu cores", 9) == 0) {
|
} else if (((done & 2) == 0) && strncmp(line, "cpu cores", 9) == 0) {
|
||||||
const char *v = strchr(line, ':') + 2;
|
const char *v = strchr(line, ':') + 2;
|
||||||
*numOfCores = atof(v);
|
*numOfCores = taosStr2Float(v, NULL);
|
||||||
done |= 2;
|
done |= 2;
|
||||||
}
|
}
|
||||||
if (strncmp(line, "processor", 9) == 0) coreCount += 1;
|
if (strncmp(line, "processor", 9) == 0) coreCount += 1;
|
||||||
|
@ -1095,7 +1095,7 @@ char *taosGetCmdlineByPID(int pid) {
|
||||||
return cmdline;
|
return cmdline;
|
||||||
#else
|
#else
|
||||||
static char cmdline[1024];
|
static char cmdline[1024];
|
||||||
(void)sprintf(cmdline, "/proc/%d/cmdline", pid);
|
(void)snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid);
|
||||||
|
|
||||||
// int fd = open(cmdline, O_RDONLY);
|
// int fd = open(cmdline, O_RDONLY);
|
||||||
TdFilePtr pFile = taosOpenFile(cmdline, TD_FILE_READ);
|
TdFilePtr pFile = taosOpenFile(cmdline, TD_FILE_READ);
|
||||||
|
|
|
@ -235,19 +235,22 @@ int32_t taosThreadCondWait(TdThreadCond *cond, TdThreadMutex *mutex) {
|
||||||
|
|
||||||
int32_t taosThreadCondTimedWait(TdThreadCond *cond, TdThreadMutex *mutex, const struct timespec *abstime) {
|
int32_t taosThreadCondTimedWait(TdThreadCond *cond, TdThreadMutex *mutex, const struct timespec *abstime) {
|
||||||
#ifdef __USE_WIN_THREAD
|
#ifdef __USE_WIN_THREAD
|
||||||
if (!abstime) return EINVAL;
|
if (!abstime) return 0;
|
||||||
if (SleepConditionVariableCS(cond, mutex, (DWORD)(abstime->tv_sec * 1e3 + abstime->tv_nsec / 1e6))) return 0;
|
if (SleepConditionVariableCS(cond, mutex, (DWORD)(abstime->tv_sec * 1e3 + abstime->tv_nsec / 1e6))) return 0;
|
||||||
if (GetLastError() == ERROR_TIMEOUT) {
|
DWORD error = GetLastError();
|
||||||
return ETIMEDOUT;
|
if (error == ERROR_TIMEOUT) {
|
||||||
|
return TSDB_CODE_TIMEOUT_ERROR;
|
||||||
}
|
}
|
||||||
return EINVAL;
|
return TAOS_SYSTEM_WINAPI_ERROR(error);
|
||||||
#else
|
#else
|
||||||
int32_t code = pthread_cond_timedwait(cond, mutex, abstime);
|
int32_t code = pthread_cond_timedwait(cond, mutex, abstime);
|
||||||
if (code && code != ETIMEDOUT) {
|
if(code == ETIMEDOUT) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(code);
|
return TSDB_CODE_TIMEOUT_ERROR;
|
||||||
return terrno;
|
} else if (code) {
|
||||||
|
return TAOS_SYSTEM_ERROR(code);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return code;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -474,22 +474,15 @@ time_t taosMktime(struct tm *timep) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf) {
|
struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf, int32_t bufSize) {
|
||||||
struct tm *res = NULL;
|
struct tm *res = NULL;
|
||||||
if (timep == NULL) {
|
if (timep == NULL || result == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (result == NULL) {
|
|
||||||
res = localtime(timep);
|
|
||||||
if (res == NULL && buf != NULL) {
|
|
||||||
(void)sprintf(buf, "NaN");
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
if (*timep < -2208988800LL) {
|
if (*timep < -2208988800LL) {
|
||||||
if (buf != NULL) {
|
if (buf != NULL) {
|
||||||
sprintf(buf, "NaN");
|
snprintf(buf, bufSize, "NaN");
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (*timep < 0) {
|
} else if (*timep < 0) {
|
||||||
|
@ -501,7 +494,7 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf) {
|
||||||
time_t tt = 0;
|
time_t tt = 0;
|
||||||
if (localtime_s(&tm1, &tt) != 0) {
|
if (localtime_s(&tm1, &tt) != 0) {
|
||||||
if (buf != NULL) {
|
if (buf != NULL) {
|
||||||
sprintf(buf, "NaN");
|
snprintf(buf, bufSize, "NaN");
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -532,7 +525,7 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf) {
|
||||||
} else {
|
} else {
|
||||||
if (localtime_s(result, timep) != 0) {
|
if (localtime_s(result, timep) != 0) {
|
||||||
if (buf != NULL) {
|
if (buf != NULL) {
|
||||||
sprintf(buf, "NaN");
|
snprintf(buf, bufSize, "NaN");
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -540,7 +533,7 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf) {
|
||||||
#else
|
#else
|
||||||
res = localtime_r(timep, result);
|
res = localtime_r(timep, result);
|
||||||
if (res == NULL && buf != NULL) {
|
if (res == NULL && buf != NULL) {
|
||||||
(void)sprintf(buf, "NaN");
|
(void)snprintf(buf, bufSize, "NaN");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return result;
|
return result;
|
||||||
|
@ -559,7 +552,7 @@ static int isLeapYear(time_t year) {
|
||||||
|
|
||||||
struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst) {
|
struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst) {
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
return localtime(timep);
|
return NULL;
|
||||||
}
|
}
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
if (*timep < 0) {
|
if (*timep < 0) {
|
||||||
|
|
|
@ -783,15 +783,15 @@ int32_t taosSetSystemTimezone(const char *inTimezoneStr, char *outTimezoneStr, i
|
||||||
memset(winStr, 0, sizeof(winStr));
|
memset(winStr, 0, sizeof(winStr));
|
||||||
for (size_t i = 0; i < 554; i++) {
|
for (size_t i = 0; i < 554; i++) {
|
||||||
if (strcmp(tz_win[i][0], buf) == 0) {
|
if (strcmp(tz_win[i][0], buf) == 0) {
|
||||||
char keyPath[100];
|
char keyPath[256];
|
||||||
char keyValue[100];
|
char keyValue[100];
|
||||||
DWORD keyValueSize = sizeof(keyValue);
|
DWORD keyValueSize = sizeof(keyValue);
|
||||||
sprintf(keyPath, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%s", tz_win[i][1]);
|
snprintf(keyPath, sizeof(keyPath), "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%s", tz_win[i][1]);
|
||||||
RegGetValue(HKEY_LOCAL_MACHINE, keyPath, "Display", RRF_RT_ANY, NULL, (PVOID)&keyValue, &keyValueSize);
|
RegGetValue(HKEY_LOCAL_MACHINE, keyPath, "Display", RRF_RT_ANY, NULL, (PVOID)&keyValue, &keyValueSize);
|
||||||
if (keyValueSize > 0) {
|
if (keyValueSize > 0) {
|
||||||
keyValue[4] = (keyValue[4] == '+' ? '-' : '+');
|
keyValue[4] = (keyValue[4] == '+' ? '-' : '+');
|
||||||
keyValue[10] = 0;
|
keyValue[10] = 0;
|
||||||
sprintf(winStr, "TZ=%s:00", &(keyValue[1]));
|
snprintf(winStr, sizeof(winStr), "TZ=%s:00", &(keyValue[1]));
|
||||||
*tsTimezone = -taosStr2Int32(&keyValue[4], NULL, 10);
|
*tsTimezone = -taosStr2Int32(&keyValue[4], NULL, 10);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -805,7 +805,7 @@ int32_t taosSetSystemTimezone(const char *inTimezoneStr, char *outTimezoneStr, i
|
||||||
char *ppp = strchr(inTimezoneStr, ',');
|
char *ppp = strchr(inTimezoneStr, ',');
|
||||||
int indexStr;
|
int indexStr;
|
||||||
if (pp == NULL || ppp == NULL) {
|
if (pp == NULL || ppp == NULL) {
|
||||||
indexStr = sprintf(winStr, "TZ=UTC");
|
indexStr = snprintf(winStr, sizeof(winStr), "TZ=UTC");
|
||||||
} else {
|
} else {
|
||||||
memcpy(winStr, "TZ=", 3);
|
memcpy(winStr, "TZ=", 3);
|
||||||
pp++;
|
pp++;
|
||||||
|
@ -814,7 +814,7 @@ int32_t taosSetSystemTimezone(const char *inTimezoneStr, char *outTimezoneStr, i
|
||||||
}
|
}
|
||||||
char to[5];
|
char to[5];
|
||||||
parseTimeStr(p, to);
|
parseTimeStr(p, to);
|
||||||
sprintf(&winStr[indexStr], "%c%c%c:%c%c:00", (to[0] == '+' ? '+' : '-'), to[1], to[2], to[3], to[4]);
|
snprintf(&winStr[indexStr], sizeof(winStr) - indexStr, "%c%c%c:%c%c:00", (to[0] == '+' ? '+' : '-'), to[1], to[2], to[3], to[4]);
|
||||||
*tsTimezone = -taosStr2Int32(p, NULL, 10);
|
*tsTimezone = -taosStr2Int32(p, NULL, 10);
|
||||||
} else {
|
} else {
|
||||||
*tsTimezone = 0;
|
*tsTimezone = 0;
|
||||||
|
@ -823,7 +823,7 @@ int32_t taosSetSystemTimezone(const char *inTimezoneStr, char *outTimezoneStr, i
|
||||||
_putenv(winStr);
|
_putenv(winStr);
|
||||||
_tzset();
|
_tzset();
|
||||||
if (outTimezoneStr != inTimezoneStr) {
|
if (outTimezoneStr != inTimezoneStr) {
|
||||||
strcpy(outTimezoneStr, inTimezoneStr);
|
tstrncpy(outTimezoneStr, inTimezoneStr, TD_TIMEZONE_LEN);
|
||||||
}
|
}
|
||||||
*outDaylight = 0;
|
*outDaylight = 0;
|
||||||
|
|
||||||
|
@ -839,7 +839,7 @@ int32_t taosSetSystemTimezone(const char *inTimezoneStr, char *outTimezoneStr, i
|
||||||
*tsTimezone = tz;
|
*tsTimezone = tz;
|
||||||
tz += isdst_now;
|
tz += isdst_now;
|
||||||
|
|
||||||
sprintf(outTimezoneStr, "%s (%s, %s%02d00)", buf, tzname[isdst_now], tz >= 0 ? "+" : "-", abs(tz));
|
snprintf(outTimezoneStr, TD_TIMEZONE_LEN, "%s (%s, %s%02d00)", buf, tzname[isdst_now], tz >= 0 ? "+" : "-", abs(tz));
|
||||||
*outDaylight = isdst_now;
|
*outDaylight = isdst_now;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -853,7 +853,7 @@ int32_t taosSetSystemTimezone(const char *inTimezoneStr, char *outTimezoneStr, i
|
||||||
int32_t tz = (int32_t)((-timezone * MILLISECOND_PER_SECOND) / MILLISECOND_PER_HOUR);
|
int32_t tz = (int32_t)((-timezone * MILLISECOND_PER_SECOND) / MILLISECOND_PER_HOUR);
|
||||||
*tsTimezone = tz;
|
*tsTimezone = tz;
|
||||||
tz += isdst_now;
|
tz += isdst_now;
|
||||||
(void)sprintf(outTimezoneStr, "%s (%s, %s%02d00)", buf, tzname[isdst_now], tz >= 0 ? "+" : "-", abs(tz));
|
(void)snprintf(outTimezoneStr, TD_TIMEZONE_LEN, "%s (%s, %s%02d00)", buf, tzname[isdst_now], tz >= 0 ? "+" : "-", abs(tz));
|
||||||
*outDaylight = isdst_now;
|
*outDaylight = isdst_now;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -872,21 +872,21 @@ int32_t taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone)
|
||||||
if (result != ERROR_SUCCESS) {
|
if (result != ERROR_SUCCESS) {
|
||||||
return TAOS_SYSTEM_WINAPI_ERROR(result);
|
return TAOS_SYSTEM_WINAPI_ERROR(result);
|
||||||
}
|
}
|
||||||
strcpy(outTimezoneStr, "not configured");
|
tstrncpy(outTimezoneStr, "not configured", TD_TIMEZONE_LEN);
|
||||||
*tsTimezone = 0;
|
*tsTimezone = 0;
|
||||||
if (bufferSize > 0) {
|
if (bufferSize > 0) {
|
||||||
for (size_t i = 0; i < 139; i++) {
|
for (size_t i = 0; i < 139; i++) {
|
||||||
if (strcmp(win_tz[i][0], value) == 0) {
|
if (strcmp(win_tz[i][0], value) == 0) {
|
||||||
strcpy(outTimezoneStr, win_tz[i][1]);
|
tstrncpy(outTimezoneStr, win_tz[i][1], TD_TIMEZONE_LEN);
|
||||||
bufferSize = sizeof(value);
|
bufferSize = sizeof(value);
|
||||||
sprintf(keyPath, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%s", value);
|
snprintf(keyPath, sizeof(keyPath), "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%s", value);
|
||||||
result = RegGetValue(HKEY_LOCAL_MACHINE, keyPath, "Display", RRF_RT_ANY, NULL, (PVOID)&value, &bufferSize);
|
result = RegGetValue(HKEY_LOCAL_MACHINE, keyPath, "Display", RRF_RT_ANY, NULL, (PVOID)&value, &bufferSize);
|
||||||
if (result != ERROR_SUCCESS) {
|
if (result != ERROR_SUCCESS) {
|
||||||
return TAOS_SYSTEM_WINAPI_ERROR(result);
|
return TAOS_SYSTEM_WINAPI_ERROR(result);
|
||||||
}
|
}
|
||||||
if (bufferSize > 0) {
|
if (bufferSize > 0) {
|
||||||
// value[4] = (value[4] == '+' ? '-' : '+');
|
// value[4] = (value[4] == '+' ? '-' : '+');
|
||||||
sprintf(outTimezoneStr, "%s (UTC, %c%c%c%c%c)", outTimezoneStr, value[4], value[5], value[6], value[8],
|
snprintf(outTimezoneStr, TD_TIMEZONE_LEN, "%s (UTC, %c%c%c%c%c)", outTimezoneStr, value[4], value[5], value[6], value[8],
|
||||||
value[9]);
|
value[9]);
|
||||||
*tsTimezone = taosStr2Int32(&value[4], NULL, 10);
|
*tsTimezone = taosStr2Int32(&value[4], NULL, 10);
|
||||||
}
|
}
|
||||||
|
@ -926,7 +926,7 @@ int32_t taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone)
|
||||||
*/
|
*/
|
||||||
time_t tx1 = taosGetTimestampSec();
|
time_t tx1 = taosGetTimestampSec();
|
||||||
struct tm tm1;
|
struct tm tm1;
|
||||||
if (taosLocalTime(&tx1, &tm1, NULL) == NULL) {
|
if (taosLocalTime(&tx1, &tm1, NULL, 0) == NULL) {
|
||||||
return TSDB_CODE_TIME_ERROR;
|
return TSDB_CODE_TIME_ERROR;
|
||||||
}
|
}
|
||||||
daylight = tm1.tm_isdst;
|
daylight = tm1.tm_isdst;
|
||||||
|
@ -956,7 +956,7 @@ int32_t taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone)
|
||||||
*/
|
*/
|
||||||
time_t tx1 = taosGetTimestampSec();
|
time_t tx1 = taosGetTimestampSec();
|
||||||
struct tm tm1;
|
struct tm tm1;
|
||||||
if(taosLocalTime(&tx1, &tm1, NULL) == NULL) {
|
if(taosLocalTime(&tx1, &tm1, NULL, 0) == NULL) {
|
||||||
return TSDB_CODE_TIME_ERROR;
|
return TSDB_CODE_TIME_ERROR;
|
||||||
}
|
}
|
||||||
/* load time zone string from /etc/timezone */
|
/* load time zone string from /etc/timezone */
|
||||||
|
@ -1037,7 +1037,7 @@ int32_t taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone)
|
||||||
*/
|
*/
|
||||||
time_t tx1 = taosGetTimestampSec();
|
time_t tx1 = taosGetTimestampSec();
|
||||||
struct tm tm1;
|
struct tm tm1;
|
||||||
if(taosLocalTime(&tx1, &tm1, NULL) == NULL) {
|
if(taosLocalTime(&tx1, &tm1, NULL, 0) == NULL) {
|
||||||
return TSDB_CODE_TIME_ERROR;
|
return TSDB_CODE_TIME_ERROR;
|
||||||
}
|
}
|
||||||
isdst_now = tm1.tm_isdst;
|
isdst_now = tm1.tm_isdst;
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
TEST(osTest, osFQDNSuccess) {
|
TEST(osTest, osFQDNSuccess) {
|
||||||
char fqdn[1024];
|
char fqdn[TD_FQDN_LEN];
|
||||||
char ipString[INET_ADDRSTRLEN];
|
char ipString[INET_ADDRSTRLEN];
|
||||||
int code = taosGetFqdn(fqdn);
|
int code = taosGetFqdn(fqdn);
|
||||||
uint32_t ipv4 = 0;
|
uint32_t ipv4 = 0;
|
||||||
|
|
|
@ -31,11 +31,10 @@
|
||||||
|
|
||||||
TEST(osTimeTests, taosLocalTimeNolock) {
|
TEST(osTimeTests, taosLocalTimeNolock) {
|
||||||
time_t currentTime;
|
time_t currentTime;
|
||||||
// Test when result is NULL
|
|
||||||
struct tm* result = taosLocalTimeNolock(NULL, ¤tTime, 0);
|
|
||||||
// Test when result is not NULL
|
// Test when result is not NULL
|
||||||
struct tm expectedTime;
|
struct tm expectedTime;
|
||||||
result = taosLocalTimeNolock(&expectedTime, ¤tTime, 1);
|
struct tm* result = taosLocalTimeNolock(&expectedTime, ¤tTime, 1);
|
||||||
|
if (result) {
|
||||||
EXPECT_EQ(expectedTime.tm_year, result->tm_year);
|
EXPECT_EQ(expectedTime.tm_year, result->tm_year);
|
||||||
EXPECT_EQ(expectedTime.tm_mon, result->tm_mon);
|
EXPECT_EQ(expectedTime.tm_mon, result->tm_mon);
|
||||||
EXPECT_EQ(expectedTime.tm_mday, result->tm_mday);
|
EXPECT_EQ(expectedTime.tm_mday, result->tm_mday);
|
||||||
|
@ -46,13 +45,14 @@ TEST(osTimeTests, taosLocalTimeNolock) {
|
||||||
EXPECT_EQ(expectedTime.tm_yday, result->tm_yday);
|
EXPECT_EQ(expectedTime.tm_yday, result->tm_yday);
|
||||||
EXPECT_EQ(expectedTime.tm_isdst, result->tm_isdst);
|
EXPECT_EQ(expectedTime.tm_isdst, result->tm_isdst);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(osTimeTests, taosLocalTime) {
|
TEST(osTimeTests, taosLocalTime) {
|
||||||
// Test 1: Test when both timep and result are not NULL
|
// Test 1: Test when both timep and result are not NULL
|
||||||
time_t timep = 1617531000; // 2021-04-04 18:10:00
|
time_t timep = 1617531000; // 2021-04-04 18:10:00
|
||||||
struct tm result;
|
struct tm result;
|
||||||
struct tm* local_time = taosLocalTime(&timep, &result, NULL);
|
struct tm* local_time = taosLocalTime(&timep, &result, NULL, 0);
|
||||||
ASSERT_NE(local_time, nullptr);
|
ASSERT_NE(local_time, nullptr);
|
||||||
ASSERT_EQ(local_time->tm_year, 121);
|
ASSERT_EQ(local_time->tm_year, 121);
|
||||||
ASSERT_EQ(local_time->tm_mon, 3);
|
ASSERT_EQ(local_time->tm_mon, 3);
|
||||||
|
@ -62,20 +62,13 @@ TEST(osTimeTests, taosLocalTime) {
|
||||||
ASSERT_EQ(local_time->tm_sec, 00);
|
ASSERT_EQ(local_time->tm_sec, 00);
|
||||||
|
|
||||||
// Test 2: Test when timep is NULL
|
// Test 2: Test when timep is NULL
|
||||||
local_time = taosLocalTime(NULL, &result, NULL);
|
local_time = taosLocalTime(NULL, &result, NULL, 0);
|
||||||
ASSERT_EQ(local_time, nullptr);
|
ASSERT_EQ(local_time, nullptr);
|
||||||
|
|
||||||
// Test 3: Test when result is NULL
|
|
||||||
local_time = taosLocalTime(&timep, NULL, NULL);
|
|
||||||
ASSERT_NE(local_time, nullptr);
|
|
||||||
ASSERT_EQ(local_time->tm_year, 121);
|
|
||||||
ASSERT_EQ(local_time->tm_mon, 3);
|
|
||||||
ASSERT_EQ(local_time->tm_mday, 4);
|
|
||||||
|
|
||||||
// Test 4: Test when timep is negative on Windows
|
// Test 4: Test when timep is negative on Windows
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
time_t pos_timep = 1609459200; // 2021-01-01 08:00:00
|
time_t pos_timep = 1609459200; // 2021-01-01 08:00:00
|
||||||
local_time = taosLocalTime(&pos_timep, &result, NULL);
|
local_time = taosLocalTime(&pos_timep, &result, NULL, 0);
|
||||||
ASSERT_NE(local_time, nullptr);
|
ASSERT_NE(local_time, nullptr);
|
||||||
ASSERT_EQ(local_time->tm_year, 121);
|
ASSERT_EQ(local_time->tm_year, 121);
|
||||||
ASSERT_EQ(local_time->tm_mon, 0);
|
ASSERT_EQ(local_time->tm_mon, 0);
|
||||||
|
@ -85,7 +78,7 @@ TEST(osTimeTests, taosLocalTime) {
|
||||||
ASSERT_EQ(local_time->tm_sec, 0);
|
ASSERT_EQ(local_time->tm_sec, 0);
|
||||||
|
|
||||||
time_t neg_timep = -1617531000; // 1918-09-29 21:50:00
|
time_t neg_timep = -1617531000; // 1918-09-29 21:50:00
|
||||||
local_time = taosLocalTime(&neg_timep, &result, NULL);
|
local_time = taosLocalTime(&neg_timep, &result, NULL, 0);
|
||||||
ASSERT_NE(local_time, nullptr);
|
ASSERT_NE(local_time, nullptr);
|
||||||
ASSERT_EQ(local_time->tm_year, 18);
|
ASSERT_EQ(local_time->tm_year, 18);
|
||||||
ASSERT_EQ(local_time->tm_mon, 8);
|
ASSERT_EQ(local_time->tm_mon, 8);
|
||||||
|
@ -95,7 +88,7 @@ TEST(osTimeTests, taosLocalTime) {
|
||||||
ASSERT_EQ(local_time->tm_sec, 0);
|
ASSERT_EQ(local_time->tm_sec, 0);
|
||||||
|
|
||||||
time_t neg_timep2 = -315619200; // 1960-01-01 08:00:00
|
time_t neg_timep2 = -315619200; // 1960-01-01 08:00:00
|
||||||
local_time = taosLocalTime(&neg_timep2, &result, NULL);
|
local_time = taosLocalTime(&neg_timep2, &result, NULL, 0);
|
||||||
ASSERT_NE(local_time, nullptr);
|
ASSERT_NE(local_time, nullptr);
|
||||||
ASSERT_EQ(local_time->tm_year, 60);
|
ASSERT_EQ(local_time->tm_year, 60);
|
||||||
ASSERT_EQ(local_time->tm_mon, 0);
|
ASSERT_EQ(local_time->tm_mon, 0);
|
||||||
|
@ -105,7 +98,7 @@ TEST(osTimeTests, taosLocalTime) {
|
||||||
ASSERT_EQ(local_time->tm_sec, 0);
|
ASSERT_EQ(local_time->tm_sec, 0);
|
||||||
|
|
||||||
time_t zero_timep = 0; // 1970-01-01 08:00:00
|
time_t zero_timep = 0; // 1970-01-01 08:00:00
|
||||||
local_time = taosLocalTime(&zero_timep, &result, NULL);
|
local_time = taosLocalTime(&zero_timep, &result, NULL, 0);
|
||||||
ASSERT_NE(local_time, nullptr);
|
ASSERT_NE(local_time, nullptr);
|
||||||
ASSERT_EQ(local_time->tm_year, 70);
|
ASSERT_EQ(local_time->tm_year, 70);
|
||||||
ASSERT_EQ(local_time->tm_mon, 0);
|
ASSERT_EQ(local_time->tm_mon, 0);
|
||||||
|
@ -115,7 +108,7 @@ TEST(osTimeTests, taosLocalTime) {
|
||||||
ASSERT_EQ(local_time->tm_sec, 0);
|
ASSERT_EQ(local_time->tm_sec, 0);
|
||||||
|
|
||||||
time_t neg_timep3 = -78115158887;
|
time_t neg_timep3 = -78115158887;
|
||||||
local_time = taosLocalTime(&neg_timep3, &result, NULL);
|
local_time = taosLocalTime(&neg_timep3, &result, NULL, 0);
|
||||||
ASSERT_EQ(local_time, nullptr);
|
ASSERT_EQ(local_time, nullptr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
|
@ -12,6 +12,10 @@ ELSE ()
|
||||||
MESSAGE(STATUS "enable assert core")
|
MESSAGE(STATUS "enable assert core")
|
||||||
ENDIF (${ASSERT_NOT_CORE})
|
ENDIF (${ASSERT_NOT_CORE})
|
||||||
|
|
||||||
|
if(${BUILD_WITH_ANALYSIS})
|
||||||
|
add_definitions(-DUSE_ANAL)
|
||||||
|
endif()
|
||||||
|
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
util
|
util
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/util"
|
PUBLIC "${TD_SOURCE_DIR}/include/util"
|
||||||
|
|
|
@ -151,18 +151,18 @@ static int32_t taosStartLog() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getDay(char* buf){
|
static void getDay(char* buf, int32_t bufSize){
|
||||||
time_t t = taosTime(NULL);
|
time_t t = taosTime(NULL);
|
||||||
struct tm tmInfo;
|
struct tm tmInfo;
|
||||||
if (taosLocalTime(&t, &tmInfo, buf) != NULL) {
|
if (taosLocalTime(&t, &tmInfo, buf, bufSize) != NULL) {
|
||||||
TAOS_UNUSED(strftime(buf, LOG_FILE_DAY_LEN, "%Y-%m-%d", &tmInfo));
|
TAOS_UNUSED(strftime(buf, bufSize, "%Y-%m-%d", &tmInfo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t getTimestampToday() {
|
static int64_t getTimestampToday() {
|
||||||
time_t t = taosTime(NULL);
|
time_t t = taosTime(NULL);
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
if (taosLocalTime(&t, &tm, NULL) == NULL) {
|
if (taosLocalTime(&t, &tm, NULL, 0) == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
tm.tm_hour = 0;
|
tm.tm_hour = 0;
|
||||||
|
@ -198,10 +198,10 @@ int32_t taosInitSlowLog() {
|
||||||
|
|
||||||
getFullPathName(tsLogObj.slowLogName, logFileName);
|
getFullPathName(tsLogObj.slowLogName, logFileName);
|
||||||
|
|
||||||
char name[PATH_MAX + LOG_FILE_DAY_LEN] = {0};
|
char name[PATH_MAX + TD_TIME_STR_LEN] = {0};
|
||||||
char day[LOG_FILE_DAY_LEN] = {0};
|
char day[TD_TIME_STR_LEN] = {0};
|
||||||
getDay(day);
|
getDay(day, sizeof(day));
|
||||||
(void)snprintf(name, PATH_MAX + LOG_FILE_DAY_LEN, "%s.%s", tsLogObj.slowLogName, day);
|
(void)snprintf(name, PATH_MAX + TD_TIME_STR_LEN, "%s.%s", tsLogObj.slowLogName, day);
|
||||||
|
|
||||||
tsLogObj.timestampToday = getTimestampToday();
|
tsLogObj.timestampToday = getTimestampToday();
|
||||||
tsLogObj.slowHandle = taosLogBuffNew(LOG_SLOW_BUF_SIZE);
|
tsLogObj.slowHandle = taosLogBuffNew(LOG_SLOW_BUF_SIZE);
|
||||||
|
@ -430,11 +430,11 @@ static void taosOpenNewSlowLogFile() {
|
||||||
taosWriteLog(tsLogObj.slowHandle);
|
taosWriteLog(tsLogObj.slowHandle);
|
||||||
atomic_store_32(&tsLogObj.slowHandle->lock, 0);
|
atomic_store_32(&tsLogObj.slowHandle->lock, 0);
|
||||||
|
|
||||||
char day[LOG_FILE_DAY_LEN] = {0};
|
char day[TD_TIME_STR_LEN] = {0};
|
||||||
getDay(day);
|
getDay(day, sizeof(day));
|
||||||
TdFilePtr pFile = NULL;
|
TdFilePtr pFile = NULL;
|
||||||
char name[PATH_MAX + LOG_FILE_DAY_LEN] = {0};
|
char name[PATH_MAX + TD_TIME_STR_LEN] = {0};
|
||||||
(void)snprintf(name, PATH_MAX + LOG_FILE_DAY_LEN, "%s.%s", tsLogObj.slowLogName, day);
|
(void)snprintf(name, PATH_MAX + TD_TIME_STR_LEN, "%s.%s", tsLogObj.slowLogName, day);
|
||||||
pFile = taosOpenFile(name, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
pFile = taosOpenFile(name, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
uError("open new log file fail! reason:%s, reuse lastlog", strerror(errno));
|
uError("open new log file fail! reason:%s, reuse lastlog", strerror(errno));
|
||||||
|
@ -631,7 +631,7 @@ static inline int32_t taosBuildLogHead(char *buffer, const char *flags) {
|
||||||
|
|
||||||
TAOS_UNUSED(taosGetTimeOfDay(&timeSecs));
|
TAOS_UNUSED(taosGetTimeOfDay(&timeSecs));
|
||||||
time_t curTime = timeSecs.tv_sec;
|
time_t curTime = timeSecs.tv_sec;
|
||||||
ptm = taosLocalTime(&curTime, &Tm, NULL);
|
ptm = taosLocalTime(&curTime, &Tm, NULL, 0);
|
||||||
|
|
||||||
return sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " %s %s", ptm->tm_mon + 1, ptm->tm_mday,
|
return sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " %s %s", ptm->tm_mon + 1, ptm->tm_mday,
|
||||||
ptm->tm_hour, ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId(),
|
ptm->tm_hour, ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId(),
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
"childtable_offset": 0,
|
"childtable_offset": 0,
|
||||||
"insert_rows": 20,
|
"insert_rows": 20,
|
||||||
"insert_interval": 0,
|
"insert_interval": 0,
|
||||||
"interlace_rows": 5,
|
"interlace_rows": 0,
|
||||||
"disorder_ratio": 0,
|
"disorder_ratio": 0,
|
||||||
"disorder_range": 1000,
|
"disorder_range": 1000,
|
||||||
"timestamp_step": 1,
|
"timestamp_step": 1,
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
"childtable_offset": 0,
|
"childtable_offset": 0,
|
||||||
"insert_rows": 20,
|
"insert_rows": 20,
|
||||||
"insert_interval": 0,
|
"insert_interval": 0,
|
||||||
"interlace_rows": 5,
|
"interlace_rows": 0,
|
||||||
"disorder_ratio": 0,
|
"disorder_ratio": 0,
|
||||||
"disorder_range": 1000,
|
"disorder_range": 1000,
|
||||||
"timestamp_step": 1,
|
"timestamp_step": 1,
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
,,n,unit-test,bash test.sh
|
,,n,unit-test,bash test.sh
|
||||||
|
|
||||||
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/auto_create_table_json.py
|
||||||
|
|
||||||
#
|
#
|
||||||
# army-test
|
# army-test
|
||||||
|
@ -1542,7 +1543,6 @@
|
||||||
,,n,develop-test,python3 ./test.py -f 2-query/ts-range.py
|
,,n,develop-test,python3 ./test.py -f 2-query/ts-range.py
|
||||||
,,n,develop-test,python3 ./test.py -f 2-query/tag_scan.py
|
,,n,develop-test,python3 ./test.py -f 2-query/tag_scan.py
|
||||||
,,n,develop-test,python3 ./test.py -f 2-query/show_create_db.py
|
,,n,develop-test,python3 ./test.py -f 2-query/show_create_db.py
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/auto_create_table_json.py
|
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/custom_col_tag.py
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/custom_col_tag.py
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/default_json.py
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/default_json.py
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/demo.py
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/demo.py
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"filetype": "query",
|
||||||
|
"cfgdir": "/etc/taos",
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 6030,
|
||||||
|
"user": "root",
|
||||||
|
"password": "taosdata",
|
||||||
|
"confirm_parameter_prompt": "no",
|
||||||
|
"continue_if_fail": "yes",
|
||||||
|
"databases": "dbrate",
|
||||||
|
"query_times": 20,
|
||||||
|
"query_mode": "taosc",
|
||||||
|
"specified_table_query": {
|
||||||
|
"query_interval": 0,
|
||||||
|
"concurrent": 10,
|
||||||
|
"sqls": [
|
||||||
|
{
|
||||||
|
"sql": "select count(*) from meters",
|
||||||
|
"result": "./query_result.txt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
"filetype": "insert",
|
||||||
|
"cfgdir": "/etc/taos",
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 6030,
|
||||||
|
"user": "root",
|
||||||
|
"password": "taosdata",
|
||||||
|
"thread_count": 5,
|
||||||
|
"create_table_thread_count": 1,
|
||||||
|
"thread_bind_vgroup": "yes",
|
||||||
|
"confirm_parameter_prompt": "no",
|
||||||
|
"num_of_records_per_req": 2000,
|
||||||
|
"prepared_rand": 100000,
|
||||||
|
"escape_character": "yes",
|
||||||
|
"databases": [
|
||||||
|
{
|
||||||
|
"dbinfo": {
|
||||||
|
"name": "dbrate",
|
||||||
|
"drop": "yes",
|
||||||
|
"vgroups": 2
|
||||||
|
},
|
||||||
|
"super_tables": [
|
||||||
|
{
|
||||||
|
"name": "meters",
|
||||||
|
"child_table_exists": "no",
|
||||||
|
"childtable_count": 10,
|
||||||
|
"childtable_prefix": "d",
|
||||||
|
"insert_mode": "@STMT_MODE",
|
||||||
|
"interlace_rows": @INTERLACE_MODE,
|
||||||
|
"insert_rows": 100000,
|
||||||
|
"timestamp_step": 1,
|
||||||
|
"start_timestamp": "2020-10-01 00:00:00.000",
|
||||||
|
"auto_create_table": "no",
|
||||||
|
"columns": [
|
||||||
|
{ "type": "bool", "name": "bc"},
|
||||||
|
{ "type": "float", "name": "fc"},
|
||||||
|
{ "type": "double", "name": "dc"},
|
||||||
|
{ "type": "tinyint", "name": "ti"},
|
||||||
|
{ "type": "smallint", "name": "si"},
|
||||||
|
{ "type": "int", "name": "ic"},
|
||||||
|
{ "type": "bigint", "name": "bi"},
|
||||||
|
{ "type": "utinyint", "name": "uti"},
|
||||||
|
{ "type": "usmallint", "name": "usi"},
|
||||||
|
{ "type": "uint", "name": "ui"},
|
||||||
|
{ "type": "ubigint", "name": "ubi"},
|
||||||
|
{ "type": "binary", "name": "bin", "len": 32},
|
||||||
|
{ "type": "nchar", "name": "nch", "len": 64}
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
{"type": "TINYINT", "name": "groupid", "max": 10, "min": 1}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,356 @@
|
||||||
|
import taos
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
import random
|
||||||
|
import json
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
# 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 -*-
|
||||||
|
dataDir = "/var/lib/taos/"
|
||||||
|
templateFile = "json/template.json"
|
||||||
|
Number = 0
|
||||||
|
resultContext = ""
|
||||||
|
|
||||||
|
|
||||||
|
def showLog(str):
|
||||||
|
print(str)
|
||||||
|
|
||||||
|
def exec(command, show=True):
|
||||||
|
if(show):
|
||||||
|
print(f"exec {command}\n")
|
||||||
|
return os.system(command)
|
||||||
|
|
||||||
|
# run return output and error
|
||||||
|
def run(command, timeout = 60, show=True):
|
||||||
|
if(show):
|
||||||
|
print(f"run {command} timeout={timeout}s\n")
|
||||||
|
|
||||||
|
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
process.wait(timeout)
|
||||||
|
|
||||||
|
output = process.stdout.read().decode(encoding="gbk")
|
||||||
|
error = process.stderr.read().decode(encoding="gbk")
|
||||||
|
|
||||||
|
return output, error
|
||||||
|
|
||||||
|
# return list after run
|
||||||
|
def runRetList(command, timeout=10, first=True):
|
||||||
|
output,error = run(command, timeout)
|
||||||
|
if first:
|
||||||
|
return output.splitlines()
|
||||||
|
else:
|
||||||
|
return error.splitlines()
|
||||||
|
|
||||||
|
|
||||||
|
def readFileContext(filename):
|
||||||
|
file = open(filename)
|
||||||
|
context = file.read()
|
||||||
|
file.close()
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
def writeFileContext(filename, context):
|
||||||
|
file = open(filename, "w")
|
||||||
|
file.write(context)
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
def appendFileContext(filename, context):
|
||||||
|
global resultContext
|
||||||
|
resultContext += context
|
||||||
|
try:
|
||||||
|
file = open(filename, "a")
|
||||||
|
wsize = file.write(context)
|
||||||
|
file.close()
|
||||||
|
except:
|
||||||
|
print(f"appand file error context={context} .")
|
||||||
|
|
||||||
|
def getFolderSize(folder):
|
||||||
|
total_size = 0
|
||||||
|
for dirpath, dirnames, filenames in os.walk(folder):
|
||||||
|
for filename in filenames:
|
||||||
|
filepath = os.path.join(dirpath, filename)
|
||||||
|
total_size += os.path.getsize(filepath)
|
||||||
|
return total_size
|
||||||
|
|
||||||
|
def waitClusterAlive(loop):
|
||||||
|
for i in range(loop):
|
||||||
|
command = 'taos -s "show cluster alive\G;" '
|
||||||
|
out,err = run(command)
|
||||||
|
print(out)
|
||||||
|
if out.find("status: 1") >= 0:
|
||||||
|
showLog(f" i={i} wait cluster alive ok.\n")
|
||||||
|
return True
|
||||||
|
|
||||||
|
showLog(f" i={i} wait cluster alive ...\n")
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
showLog(f" i={i} wait cluster alive failed.\n")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def waitCompactFinish(loop):
|
||||||
|
for i in range(loop):
|
||||||
|
command = 'taos -s "show compacts;" '
|
||||||
|
out,err = run(command)
|
||||||
|
if out.find("Query OK, 0 row(s) in set") >= 0:
|
||||||
|
showLog(f" i={i} wait compact finish ok\n")
|
||||||
|
return True
|
||||||
|
|
||||||
|
showLog(f" i={i} wait compact ...\n")
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
showLog(f" i={i} wait compact failed.\n")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def getTypeName(datatype):
|
||||||
|
str1 = datatype.split(",")[0]
|
||||||
|
str2 = str1.split(":")[1]
|
||||||
|
str3 = str2.replace('"','').replace(' ','')
|
||||||
|
return str3
|
||||||
|
|
||||||
|
|
||||||
|
def getMatch(datatype, algo):
|
||||||
|
if algo == "tsz":
|
||||||
|
if datatype == "float" or datatype == "double":
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def generateJsonFile(stmt, interlace):
|
||||||
|
print(f"doTest stmt: {stmt} interlace_rows={interlace}\n")
|
||||||
|
|
||||||
|
# replace datatype
|
||||||
|
context = readFileContext(templateFile)
|
||||||
|
# replace compress
|
||||||
|
context = context.replace("@STMT_MODE", stmt)
|
||||||
|
context = context.replace("@INTERLACE_MODE", interlace)
|
||||||
|
|
||||||
|
# write to file
|
||||||
|
fileName = f"json/test_{stmt}_{interlace}.json"
|
||||||
|
if os.path.exists(fileName):
|
||||||
|
os.remove(fileName)
|
||||||
|
writeFileContext(fileName, context)
|
||||||
|
|
||||||
|
return fileName
|
||||||
|
|
||||||
|
def taosdStart():
|
||||||
|
cmd = "nohup /usr/bin/taosd 2>&1 & "
|
||||||
|
ret = exec(cmd)
|
||||||
|
print(f"exec taosd ret = {ret}\n")
|
||||||
|
time.sleep(3)
|
||||||
|
waitClusterAlive(10)
|
||||||
|
|
||||||
|
def taosdStop():
|
||||||
|
i = 1
|
||||||
|
toBeKilled = "taosd"
|
||||||
|
killCmd = "ps -ef|grep -w %s| grep -v grep | awk '{print $2}' | xargs kill -TERM > /dev/null 2>&1" % toBeKilled
|
||||||
|
psCmd = "ps -ef|grep -w %s| grep -v grep | awk '{print $2}'" % toBeKilled
|
||||||
|
processID = subprocess.check_output(psCmd, shell=True)
|
||||||
|
while(processID):
|
||||||
|
os.system(killCmd)
|
||||||
|
time.sleep(1)
|
||||||
|
processID = subprocess.check_output(psCmd, shell=True)
|
||||||
|
print(f"i={i} kill taosd pid={processID}")
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
def cleanAndStartTaosd():
|
||||||
|
|
||||||
|
# stop
|
||||||
|
taosdStop()
|
||||||
|
# clean
|
||||||
|
exec(f"rm -rf {dataDir}")
|
||||||
|
# start
|
||||||
|
taosdStart()
|
||||||
|
|
||||||
|
def findContextValue(context, label):
|
||||||
|
start = context.find(label)
|
||||||
|
if start == -1 :
|
||||||
|
return ""
|
||||||
|
start += len(label) + 2
|
||||||
|
# skip blank
|
||||||
|
while context[start] == ' ':
|
||||||
|
start += 1
|
||||||
|
|
||||||
|
# find end ','
|
||||||
|
end = start
|
||||||
|
ends = [',','}',']', 0]
|
||||||
|
while context[end] not in ends:
|
||||||
|
end += 1
|
||||||
|
return context[start:end]
|
||||||
|
|
||||||
|
|
||||||
|
def writeTemplateInfo(resultFile):
|
||||||
|
# create info
|
||||||
|
context = readFileContext(templateFile)
|
||||||
|
vgroups = findContextValue(context, "vgroups")
|
||||||
|
childCount = findContextValue(context, "childtable_count")
|
||||||
|
insertRows = findContextValue(context, "insert_rows")
|
||||||
|
line = f"vgroups = {vgroups}\nchildtable_count = {childCount}\ninsert_rows = {insertRows}\n\n"
|
||||||
|
print(line)
|
||||||
|
appendFileContext(resultFile, line)
|
||||||
|
|
||||||
|
|
||||||
|
def totalCompressRate(stmt, interlace, resultFile, writeSpeed, querySpeed):
|
||||||
|
global Number
|
||||||
|
# flush
|
||||||
|
command = 'taos -s "flush database dbrate;"'
|
||||||
|
rets = exec(command)
|
||||||
|
|
||||||
|
command = 'taos -s "compact database dbrate;"'
|
||||||
|
rets = exec(command)
|
||||||
|
waitCompactFinish(60)
|
||||||
|
|
||||||
|
# read compress rate
|
||||||
|
command = 'taos -s "show table distributed dbrate.meters\G;"'
|
||||||
|
rets = runRetList(command)
|
||||||
|
print(rets)
|
||||||
|
|
||||||
|
str1 = rets[5]
|
||||||
|
arr = str1.split(" ")
|
||||||
|
|
||||||
|
# Total_Size KB
|
||||||
|
str2 = arr[2]
|
||||||
|
pos = str2.find("=[")
|
||||||
|
totalSize = int(float(str2[pos+2:])/1024)
|
||||||
|
|
||||||
|
# Compression_Ratio
|
||||||
|
str2 = arr[6]
|
||||||
|
pos = str2.find("=[")
|
||||||
|
rate = str2[pos+2:]
|
||||||
|
print("rate =" + rate)
|
||||||
|
|
||||||
|
# total data file size
|
||||||
|
#dataSize = getFolderSize(f"{dataDir}/vnode/")
|
||||||
|
#dataSizeMB = int(dataSize/1024/1024)
|
||||||
|
|
||||||
|
# appand to file
|
||||||
|
|
||||||
|
Number += 1
|
||||||
|
context = "%10s %10s %15s %10s %10s %30s %15s\n"%( Number, stmt, interlace, str(totalSize)+" MB", rate+"%", writeSpeed + " Records/second", querySpeed)
|
||||||
|
showLog(context)
|
||||||
|
appendFileContext(resultFile, context)
|
||||||
|
|
||||||
|
def testWrite(jsonFile):
|
||||||
|
command = f"taosBenchmark -f {jsonFile}"
|
||||||
|
output, context = run(command, 60000)
|
||||||
|
# SUCC: Spent 0.960248 (real 0.947154) seconds to insert rows: 100000 with 1 thread(s) into dbrate 104139.76 (real 105579.45) records/second
|
||||||
|
|
||||||
|
# find second real
|
||||||
|
pos = context.find("(real ")
|
||||||
|
if pos == -1:
|
||||||
|
print(f"error, run command={command} output not found first \"(real\" keyword. error={context}")
|
||||||
|
exit(1)
|
||||||
|
pos = context.find("(real ", pos + 5)
|
||||||
|
if pos == -1:
|
||||||
|
print(f"error, run command={command} output not found second \"(real\" keyword. error={context}")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
pos += 5
|
||||||
|
length = len(context)
|
||||||
|
while pos < length and context[pos] == ' ':
|
||||||
|
pos += 1
|
||||||
|
end = context.find(".", pos)
|
||||||
|
if end == -1:
|
||||||
|
print(f"error, run command={command} output not found second \".\" keyword. error={context}")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
speed = context[pos: end]
|
||||||
|
#print(f"write pos ={pos} end={end} speed={speed}\n output={context} \n")
|
||||||
|
return speed
|
||||||
|
|
||||||
|
def testQuery():
|
||||||
|
command = f"taosBenchmark -f json/query.json"
|
||||||
|
lines = runRetList(command, 60000)
|
||||||
|
# INFO: Spend 6.7350 second completed total queries: 10, the QPS of all threads: 1.485
|
||||||
|
speed = None
|
||||||
|
|
||||||
|
for i in range(0, len(lines)):
|
||||||
|
# find second real
|
||||||
|
context = lines[i]
|
||||||
|
pos = context.find("the QPS of all threads:")
|
||||||
|
if pos == -1 :
|
||||||
|
continue
|
||||||
|
pos += 24
|
||||||
|
speed = context[pos:]
|
||||||
|
break
|
||||||
|
#print(f"query pos ={pos} speed={speed}\n output={context} \n")
|
||||||
|
|
||||||
|
if speed is None:
|
||||||
|
print(f"error, run command={command} output not found second \"the QPS of all threads:\" keyword. error={lines}")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
return speed
|
||||||
|
|
||||||
|
def doTest(stmt, interlace, resultFile):
|
||||||
|
print(f"doTest stmtMode: {stmt} interlaceRows={interlace}\n")
|
||||||
|
#cleanAndStartTaosd()
|
||||||
|
|
||||||
|
|
||||||
|
# json
|
||||||
|
jsonFile = generateJsonFile(stmt, interlace)
|
||||||
|
|
||||||
|
# run taosBenchmark
|
||||||
|
t1 = time.time()
|
||||||
|
writeSpeed = testWrite(jsonFile)
|
||||||
|
t2 = time.time()
|
||||||
|
# total write speed
|
||||||
|
querySpeed = testQuery()
|
||||||
|
|
||||||
|
# total compress rate
|
||||||
|
totalCompressRate(stmt, interlace, resultFile, writeSpeed, querySpeed)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# test compress method
|
||||||
|
stmtModes = ["stmt", "stmt2", "taosc"]
|
||||||
|
interlaceModes = ["0", "1"]
|
||||||
|
|
||||||
|
# record result
|
||||||
|
resultFile = "./result.txt"
|
||||||
|
timestamp = time.time()
|
||||||
|
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp))
|
||||||
|
context = f"\n---------------------- test rate ({now}) ---------------------------------\n"
|
||||||
|
|
||||||
|
appendFileContext(resultFile, context)
|
||||||
|
# json info
|
||||||
|
writeTemplateInfo(resultFile)
|
||||||
|
# head
|
||||||
|
context = "\n%10s %10s %15s %10s %10s %30s %15s\n"%("No", "stmtMode", "interlaceRows", "dataSize", "rate", "writeSpeed", "query-QPS")
|
||||||
|
appendFileContext(resultFile, context)
|
||||||
|
|
||||||
|
|
||||||
|
# loop for all compression
|
||||||
|
for stmt in stmtModes:
|
||||||
|
# do test
|
||||||
|
for interlace in interlaceModes:
|
||||||
|
doTest(stmt, interlace, resultFile)
|
||||||
|
appendFileContext(resultFile, " \n")
|
||||||
|
|
||||||
|
timestamp = time.time()
|
||||||
|
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp))
|
||||||
|
appendFileContext(resultFile, f"\n{now} finished test!\n")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("welcome use TDengine compress rate test tools.\n")
|
||||||
|
main()
|
||||||
|
# show result
|
||||||
|
print(resultContext)
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"filetype": "query",
|
||||||
|
"cfgdir": "/etc/taos",
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 6030,
|
||||||
|
"user": "root",
|
||||||
|
"password": "taosdata",
|
||||||
|
"confirm_parameter_prompt": "no",
|
||||||
|
"continue_if_fail": "yes",
|
||||||
|
"databases": "dbrate",
|
||||||
|
"query_times": 20,
|
||||||
|
"query_mode": "taosc",
|
||||||
|
"specified_table_query": {
|
||||||
|
"query_interval": 0,
|
||||||
|
"concurrent": 10,
|
||||||
|
"sqls": [
|
||||||
|
{
|
||||||
|
"sql": "select * from meters",
|
||||||
|
"result": "./query_res0.txt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,9 +48,13 @@ def run(command, timeout = 60, show=True):
|
||||||
return output, error
|
return output, error
|
||||||
|
|
||||||
# return list after run
|
# return list after run
|
||||||
def runRetList(command, timeout=10):
|
def runRetList(command, timeout=10, first=True):
|
||||||
output,error = run(command, timeout)
|
output,error = run(command, timeout)
|
||||||
|
if first:
|
||||||
return output.splitlines()
|
return output.splitlines()
|
||||||
|
else:
|
||||||
|
return error.splitlines()
|
||||||
|
|
||||||
|
|
||||||
def readFileContext(filename):
|
def readFileContext(filename):
|
||||||
file = open(filename)
|
file = open(filename)
|
||||||
|
@ -204,7 +208,7 @@ def writeTemplateInfo(resultFile):
|
||||||
appendFileContext(resultFile, line)
|
appendFileContext(resultFile, line)
|
||||||
|
|
||||||
|
|
||||||
def totalCompressRate(algo, resultFile, writeSecond):
|
def totalCompressRate(algo, resultFile, writeSpeed, querySpeed):
|
||||||
global Number
|
global Number
|
||||||
# flush
|
# flush
|
||||||
command = 'taos -s "flush database dbrate;"'
|
command = 'taos -s "flush database dbrate;"'
|
||||||
|
@ -239,10 +243,60 @@ def totalCompressRate(algo, resultFile, writeSecond):
|
||||||
# appand to file
|
# appand to file
|
||||||
|
|
||||||
Number += 1
|
Number += 1
|
||||||
context = "%10s %10s %10s %10s %10s\n"%( Number, algo, str(totalSize)+" MB", rate+"%", writeSecond + " s")
|
context = "%10s %10s %10s %10s %30s %15s\n"%( Number, algo, str(totalSize)+" MB", rate+"%", writeSpeed + " Records/second", querySpeed)
|
||||||
showLog(context)
|
showLog(context)
|
||||||
appendFileContext(resultFile, context)
|
appendFileContext(resultFile, context)
|
||||||
|
|
||||||
|
def testWrite(jsonFile):
|
||||||
|
command = f"taosBenchmark -f {jsonFile}"
|
||||||
|
output, context = run(command, 60000)
|
||||||
|
# SUCC: Spent 0.960248 (real 0.947154) seconds to insert rows: 100000 with 1 thread(s) into dbrate 104139.76 (real 105579.45) records/second
|
||||||
|
|
||||||
|
# find second real
|
||||||
|
pos = context.find("(real ")
|
||||||
|
if pos == -1:
|
||||||
|
print(f"error, run command={command} output not found first \"(real\" keyword. error={context}")
|
||||||
|
exit(1)
|
||||||
|
pos = context.find("(real ", pos + 5)
|
||||||
|
if pos == -1:
|
||||||
|
print(f"error, run command={command} output not found second \"(real\" keyword. error={context}")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
pos += 5
|
||||||
|
length = len(context)
|
||||||
|
while pos < length and context[pos] == ' ':
|
||||||
|
pos += 1
|
||||||
|
end = context.find(".", pos)
|
||||||
|
if end == -1:
|
||||||
|
print(f"error, run command={command} output not found second \".\" keyword. error={context}")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
speed = context[pos: end]
|
||||||
|
#print(f"write pos ={pos} end={end} speed={speed}\n output={context} \n")
|
||||||
|
return speed
|
||||||
|
|
||||||
|
def testQuery():
|
||||||
|
command = f"taosBenchmark -f json/query.json"
|
||||||
|
lines = runRetList(command, 60000)
|
||||||
|
# INFO: Spend 6.7350 second completed total queries: 10, the QPS of all threads: 1.485
|
||||||
|
speed = None
|
||||||
|
|
||||||
|
for i in range(20, len(lines)):
|
||||||
|
# find second real
|
||||||
|
pos = context.find("the QPS of all threads:")
|
||||||
|
context = lines[26]
|
||||||
|
if pos == -1 :
|
||||||
|
continue
|
||||||
|
pos += 24
|
||||||
|
speed = context[pos:]
|
||||||
|
break
|
||||||
|
#print(f"query pos ={pos} speed={speed}\n output={context} \n")
|
||||||
|
|
||||||
|
if speed is None:
|
||||||
|
print(f"error, run command={command} output not found second \"the QPS of all threads:\" keyword. error={lines}")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
return speed
|
||||||
|
|
||||||
def doTest(algo, resultFile):
|
def doTest(algo, resultFile):
|
||||||
print(f"doTest algo: {algo} \n")
|
print(f"doTest algo: {algo} \n")
|
||||||
|
@ -254,16 +308,20 @@ def doTest(algo, resultFile):
|
||||||
|
|
||||||
# run taosBenchmark
|
# run taosBenchmark
|
||||||
t1 = time.time()
|
t1 = time.time()
|
||||||
exec(f"taosBenchmark -f {jsonFile}")
|
writeSpeed = testWrite(jsonFile)
|
||||||
t2 = time.time()
|
t2 = time.time()
|
||||||
|
# total write speed
|
||||||
|
querySpeed = testQuery()
|
||||||
|
|
||||||
# total compress rate
|
# total compress rate
|
||||||
totalCompressRate(algo, resultFile, str(int(t2-t1)))
|
totalCompressRate(algo, resultFile, writeSpeed, querySpeed)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
# test compress method
|
# test compress method
|
||||||
algos = ["lz4", "zlib", "zstd", "xz", "disabled"]
|
algos = ["lz4", "zlib", "zstd", "xz", "disabled"]
|
||||||
|
#algos = ["lz4"]
|
||||||
|
|
||||||
# record result
|
# record result
|
||||||
resultFile = "./result.txt"
|
resultFile = "./result.txt"
|
||||||
|
@ -275,7 +333,7 @@ def main():
|
||||||
# json info
|
# json info
|
||||||
writeTemplateInfo(resultFile)
|
writeTemplateInfo(resultFile)
|
||||||
# head
|
# head
|
||||||
context = "\n%10s %10s %10s %10s %10s\n"%("No", "compress", "dataSize", "rate", "insertSeconds")
|
context = "\n%10s %10s %10s %10s %30s %15s\n"%("No", "compress", "dataSize", "rate", "writeSpeed", "query-QPS")
|
||||||
appendFileContext(resultFile, context)
|
appendFileContext(resultFile, context)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ static int32_t shellRunSingleCommand(char *command);
|
||||||
static void shellRecordCommandToHistory(char *command);
|
static void shellRecordCommandToHistory(char *command);
|
||||||
static int32_t shellRunCommand(char *command, bool recordHistory);
|
static int32_t shellRunCommand(char *command, bool recordHistory);
|
||||||
static void shellRunSingleCommandImp(char *command);
|
static void shellRunSingleCommandImp(char *command);
|
||||||
static char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision);
|
static char *shellFormatTimestamp(char *buf, int32_t bufSize, int64_t val, int32_t precision);
|
||||||
static int64_t shellDumpResultToFile(const char *fname, TAOS_RES *tres);
|
static int64_t shellDumpResultToFile(const char *fname, TAOS_RES *tres);
|
||||||
static void shellPrintNChar(const char *str, int32_t length, int32_t width);
|
static void shellPrintNChar(const char *str, int32_t length, int32_t width);
|
||||||
static void shellPrintGeometry(const unsigned char *str, int32_t length, int32_t width);
|
static void shellPrintGeometry(const unsigned char *str, int32_t length, int32_t width);
|
||||||
|
@ -304,7 +304,7 @@ void shellRunSingleCommandImp(char *command) {
|
||||||
printf("\r\n");
|
printf("\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision) {
|
char *shellFormatTimestamp(char *buf, int32_t bufSize, int64_t val, int32_t precision) {
|
||||||
if (shell.args.is_raw_time) {
|
if (shell.args.is_raw_time) {
|
||||||
sprintf(buf, "%" PRId64, val);
|
sprintf(buf, "%" PRId64, val);
|
||||||
return buf;
|
return buf;
|
||||||
|
@ -335,7 +335,7 @@ char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm ptm = {0};
|
struct tm ptm = {0};
|
||||||
if (taosLocalTime(&tt, &ptm, buf) == NULL) {
|
if (taosLocalTime(&tt, &ptm, buf, bufSize) == NULL) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
|
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
|
||||||
|
@ -465,7 +465,7 @@ void shellDumpFieldToFile(TdFilePtr pFile, const char *val, TAOS_FIELD *field, i
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
shellFormatTimestamp(buf, *(int64_t *)val, precision);
|
shellFormatTimestamp(buf, sizeof(buf), *(int64_t *)val, precision);
|
||||||
taosFprintfFile(pFile, "%s%s%s", quotationStr, buf, quotationStr);
|
taosFprintfFile(pFile, "%s%s%s", quotationStr, buf, quotationStr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -710,7 +710,7 @@ void shellPrintField(const char *val, TAOS_FIELD *field, int32_t width, int32_t
|
||||||
shellPrintGeometry(val, length, width);
|
shellPrintGeometry(val, length, width);
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
shellFormatTimestamp(buf, *(int64_t *)val, precision);
|
shellFormatTimestamp(buf, sizeof(buf), *(int64_t *)val, precision);
|
||||||
printf("%s", buf);
|
printf("%s", buf);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -597,7 +597,7 @@ void printParaIntoFile() {
|
||||||
|
|
||||||
time_t tTime = taosGetTimestampSec();
|
time_t tTime = taosGetTimestampSec();
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
taosLocalTime(&tTime, &tm, NULL);
|
taosLocalTime(&tTime, &tm, NULL, 0);
|
||||||
|
|
||||||
taosFprintfFile(pFile, "###################################################################\n");
|
taosFprintfFile(pFile, "###################################################################\n");
|
||||||
taosFprintfFile(pFile, "# configDir: %s\n", configDir);
|
taosFprintfFile(pFile, "# configDir: %s\n", configDir);
|
||||||
|
|
|
@ -166,7 +166,7 @@ static void printHelp() {
|
||||||
char* getCurrentTimeString(char* timeString) {
|
char* getCurrentTimeString(char* timeString) {
|
||||||
time_t tTime = taosGetTimestampSec();
|
time_t tTime = taosGetTimestampSec();
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
taosLocalTime(&tTime, &tm, NULL);
|
taosLocalTime(&tTime, &tm, NULL, 0);
|
||||||
sprintf(timeString, "%d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
|
sprintf(timeString, "%d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
|
||||||
tm.tm_min, tm.tm_sec);
|
tm.tm_min, tm.tm_sec);
|
||||||
|
|
||||||
|
@ -441,7 +441,7 @@ int32_t saveConsumeContentToTbl(SThreadInfo* pInfo, char* buf) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* shellFormatTimestamp(char* buf, int64_t val, int32_t precision) {
|
static char* shellFormatTimestamp(char* buf, int32_t bufSize, int64_t val, int32_t precision) {
|
||||||
// if (shell.args.is_raw_time) {
|
// if (shell.args.is_raw_time) {
|
||||||
// sprintf(buf, "%" PRId64, val);
|
// sprintf(buf, "%" PRId64, val);
|
||||||
// return buf;
|
// return buf;
|
||||||
|
@ -472,7 +472,7 @@ static char* shellFormatTimestamp(char* buf, int64_t val, int32_t precision) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm ptm;
|
struct tm ptm;
|
||||||
if (taosLocalTime(&tt, &ptm, buf) == NULL) {
|
if (taosLocalTime(&tt, &ptm, buf, bufSize) == NULL) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
|
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
|
||||||
|
@ -559,7 +559,7 @@ static void shellDumpFieldToFile(TdFilePtr pFile, const char* val, TAOS_FIELD* f
|
||||||
taosFprintfFile(pFile, "%s%s%s", quotationStr, buf, quotationStr);
|
taosFprintfFile(pFile, "%s%s%s", quotationStr, buf, quotationStr);
|
||||||
} break;
|
} break;
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
shellFormatTimestamp(buf, *(int64_t*)val, precision);
|
shellFormatTimestamp(buf, sizeof(buf), *(int64_t*)val, precision);
|
||||||
taosFprintfFile(pFile, "%s%s%s", quotationStr, buf, quotationStr);
|
taosFprintfFile(pFile, "%s%s%s", quotationStr, buf, quotationStr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -797,7 +797,7 @@ bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
|
||||||
tt = (*(int64_t *)row[i]) / 1000000000;
|
tt = (*(int64_t *)row[i]) / 1000000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosLocalTime(&tt, &tp, timeStr) == NULL) {
|
if (taosLocalTime(&tt, &tp, timeStr, sizeof(timeStr)) == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", &tp);
|
strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", &tp);
|
||||||
|
|
Loading…
Reference in New Issue