Merge branch '3.0' of github.com:taosdata/TDengine into test/chr/TD-14699
This commit is contained in:
commit
8a7ae7548c
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# zlib
|
||||||
|
ExternalProject_Add(taosadapter
|
||||||
|
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
||||||
|
GIT_TAG df8678f
|
||||||
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# zlib
|
||||||
|
ExternalProject_Add(taos-tools
|
||||||
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
|
GIT_TAG 817cb6a
|
||||||
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# zlib
|
||||||
|
ExternalProject_Add(taosws-rs
|
||||||
|
GIT_REPOSITORY https://github.com/taosdata/taosws-rs.git
|
||||||
|
GIT_TAG 9de599d
|
||||||
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -9,6 +9,24 @@ endfunction(cat IN_FILE OUT_FILE)
|
||||||
set(CONTRIB_TMP_FILE "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in")
|
set(CONTRIB_TMP_FILE "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in")
|
||||||
configure_file("${TD_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
configure_file("${TD_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
|
||||||
|
# taos-tools
|
||||||
|
if(${BUILD_TOOLS})
|
||||||
|
cat("${TD_SUPPORT_DIR}/taostools_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# taosws-rs
|
||||||
|
if(${WEBSOCKET})
|
||||||
|
cat("${TD_SUPPORT_DIR}/taosws_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# taosadapter
|
||||||
|
if(${BUILD_HTTP})
|
||||||
|
MESSAGE("BUILD_HTTP is on")
|
||||||
|
else ()
|
||||||
|
MESSAGE("BUILD_HTTP is off, use taosAdapter")
|
||||||
|
cat("${TD_SUPPORT_DIR}/taosadapter_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
endif()
|
||||||
|
|
||||||
# pthread
|
# pthread
|
||||||
if(${BUILD_PTHREAD})
|
if(${BUILD_PTHREAD})
|
||||||
cat("${TD_SUPPORT_DIR}/pthread_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
cat("${TD_SUPPORT_DIR}/pthread_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
|
|
@ -8,10 +8,10 @@ description: "创建、删除数据库,查看、修改数据库参数"
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
CREATE DATABASE [IF NOT EXISTS] db_name [database_options]
|
CREATE DATABASE [IF NOT EXISTS] db_name [database_options]
|
||||||
|
|
||||||
database_options:
|
database_options:
|
||||||
database_option ...
|
database_option ...
|
||||||
|
|
||||||
database_option: {
|
database_option: {
|
||||||
BUFFER value
|
BUFFER value
|
||||||
| CACHEMODEL {'none' | 'last_row' | 'last_value' | 'both'}
|
| CACHEMODEL {'none' | 'last_row' | 'last_value' | 'both'}
|
||||||
|
@ -39,41 +39,42 @@ database_option: {
|
||||||
```
|
```
|
||||||
|
|
||||||
### 参数说明
|
### 参数说明
|
||||||
- buffer: 一个 VNODE 写入内存池大小,单位为MB,默认为96,最小为3,最大为16384。
|
|
||||||
- CACHEMODEL:表示是否在内存中缓存子表的最近数据。默认为none。
|
- BUFFER: 一个 VNODE 写入内存池大小,单位为 MB,默认为 96,最小为 3,最大为 16384。
|
||||||
- none:表示不缓存。
|
- CACHEMODEL:表示是否在内存中缓存子表的最近数据。默认为 none。
|
||||||
- last_row:表示缓存子表最近一行数据。这将显著改善 LAST_ROW 函数的性能表现。
|
- none:表示不缓存。
|
||||||
- last_value:表示缓存子表每一列的最近的非 NULL 值。这将显著改善无特殊影响(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函数的性能表现。
|
- last_row:表示缓存子表最近一行数据。这将显著改善 LAST_ROW 函数的性能表现。
|
||||||
- both:表示同时打开缓存最近行和列功能。
|
- last_value:表示缓存子表每一列的最近的非 NULL 值。这将显著改善无特殊影响(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函数的性能表现。
|
||||||
|
- both:表示同时打开缓存最近行和列功能。
|
||||||
- CACHESIZE:表示缓存子表最近数据的内存大小。默认为 1 ,范围是[1, 65536],单位是 MB。
|
- CACHESIZE:表示缓存子表最近数据的内存大小。默认为 1 ,范围是[1, 65536],单位是 MB。
|
||||||
- COMP:表示数据库文件压缩标志位,缺省值为 2,取值范围为 [0, 2]。
|
- COMP:表示数据库文件压缩标志位,缺省值为 2,取值范围为 [0, 2]。
|
||||||
- 0:表示不压缩。
|
- 0:表示不压缩。
|
||||||
- 1:表示一阶段压缩。
|
- 1:表示一阶段压缩。
|
||||||
- 2:表示两阶段压缩。
|
- 2:表示两阶段压缩。
|
||||||
- DURATION:数据文件存储数据的时间跨度。可以使用加单位的表示形式,如 DURATION 100h、DURATION 10d等,支持 m(分钟)、h(小时)和 d(天)三个单位。不加时间单位时默认单位为天,如 DURATION 50 表示 50 天。
|
- DURATION:数据文件存储数据的时间跨度。可以使用加单位的表示形式,如 DURATION 100h、DURATION 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。不加时间单位时默认单位为天,如 DURATION 50 表示 50 天。
|
||||||
- FSYNC:当 WAL 参数设置为2时,落盘的周期。默认为3000,单位毫秒。最小为0,表示每次写入立即落盘;最大为180000,即三分钟。
|
- WAL_FSYNC_PERIOD:当 WAL 参数设置为 2 时,落盘的周期。默认为 3000,单位毫秒。最小为 0,表示每次写入立即落盘;最大为 180000,即三分钟。
|
||||||
- MAXROWS:文件块中记录的最大条数,默认为4096条。
|
- MAXROWS:文件块中记录的最大条数,默认为 4096 条。
|
||||||
- MINROWS:文件块中记录的最小条数,默认为100条。
|
- MINROWS:文件块中记录的最小条数,默认为 100 条。
|
||||||
- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于 DURATION 参数值。数据库会自动删除保存时间超过KEEP值的数据。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。
|
- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。
|
||||||
- PAGES:一个 VNODE 中元数据存储引擎的缓存页个数,默认为256,最小64。一个 VNODE 元数据存储占用 PAGESIZE * PAGES,默认情况下为1MB内存。
|
- PAGES:一个 VNODE 中元数据存储引擎的缓存页个数,默认为 256,最小 64。一个 VNODE 元数据存储占用 PAGESIZE \* PAGES,默认情况下为 1MB 内存。
|
||||||
- PAGESIZE:一个 VNODE 中元数据存储引擎的页大小,单位为KB,默认为4 KB。范围为1到16384,即1 KB到16 MB。
|
- PAGESIZE:一个 VNODE 中元数据存储引擎的页大小,单位为 KB,默认为 4 KB。范围为 1 到 16384,即 1 KB 到 16 MB。
|
||||||
- PRECISION:数据库的时间戳精度。ms表示毫秒,us表示微秒,ns表示纳秒,默认ms毫秒。
|
- PRECISION:数据库的时间戳精度。ms 表示毫秒,us 表示微秒,ns 表示纳秒,默认 ms 毫秒。
|
||||||
- REPLICA:表示数据库副本数,取值为1或3,默认为1。在集群中使用,副本数必须小于或等于 DNODE 的数目。
|
- REPLICA:表示数据库副本数,取值为 1 或 3,默认为 1。在集群中使用,副本数必须小于或等于 DNODE 的数目。
|
||||||
- RETENTIONS:表示数据的聚合周期和保存时长,如RETENTIONS 15s:7d,1m:21d,15m:50d表示数据原始采集周期为15秒,原始数据保存7天;按1分钟聚合的数据保存21天;按15分钟聚合的数据保存50天。目前支持且只支持三级存储周期。
|
- RETENTIONS:表示数据的聚合周期和保存时长,如 RETENTIONS 15s:7d,1m:21d,15m:50d 表示数据原始采集周期为 15 秒,原始数据保存 7 天;按 1 分钟聚合的数据保存 21 天;按 15 分钟聚合的数据保存 50 天。目前支持且只支持三级存储周期。
|
||||||
- STRICT:表示数据同步的一致性要求,默认为off。
|
- STRICT:表示数据同步的一致性要求,默认为 off。
|
||||||
- on 表示强一致,即运行标准的 raft 协议,半数提交返回成功。
|
- on 表示强一致,即运行标准的 raft 协议,半数提交返回成功。
|
||||||
- off表示弱一致,本地提交即返回成功。
|
- off 表示弱一致,本地提交即返回成功。
|
||||||
- WAL:WAL级别,默认为1。
|
- WAL_LEVEL:WAL 级别,默认为 1。
|
||||||
- 1:写WAL,但不执行fsync。
|
- 1:写 WAL,但不执行 fsync。
|
||||||
- 2:写WAL,而且执行fsync。
|
- 2:写 WAL,而且执行 fsync。
|
||||||
- VGROUPS:数据库中初始vgroup的数目。
|
- VGROUPS:数据库中初始 vgroup 的数目。
|
||||||
- SINGLE_STABLE:表示此数据库中是否只可以创建一个超级表,用于超级表列非常多的情况。
|
- SINGLE_STABLE:表示此数据库中是否只可以创建一个超级表,用于超级表列非常多的情况。
|
||||||
- 0:表示可以创建多张超级表。
|
- 0:表示可以创建多张超级表。
|
||||||
- 1:表示只可以创建一张超级表。
|
- 1:表示只可以创建一张超级表。
|
||||||
- WAL_RETENTION_PERIOD:wal文件的额外保留策略,用于数据订阅。wal的保存时长,单位为s。默认为0,即落盘后立即删除。-1表示不删除。
|
- WAL_RETENTION_PERIOD:wal 文件的额外保留策略,用于数据订阅。wal 的保存时长,单位为 s。默认为 0,即落盘后立即删除。-1 表示不删除。
|
||||||
- WAL_RETENTION_SIZE:wal文件的额外保留策略,用于数据订阅。wal的保存的最大上限,单位为KB。默认为0,即落盘后立即删除。-1表示不删除。
|
- WAL_RETENTION_SIZE:wal 文件的额外保留策略,用于数据订阅。wal 的保存的最大上限,单位为 KB。默认为 0,即落盘后立即删除。-1 表示不删除。
|
||||||
- WAL_ROLL_PERIOD:wal文件切换时长,单位为s。当wal文件创建并写入后,经过该时间,会自动创建一个新的wal文件。默认为0,即仅在落盘时创建新文件。
|
- WAL_ROLL_PERIOD:wal 文件切换时长,单位为 s。当 wal 文件创建并写入后,经过该时间,会自动创建一个新的 wal 文件。默认为 0,即仅在落盘时创建新文件。
|
||||||
- WAL_SEGMENT_SIZE:wal单个文件大小,单位为KB。当前写入文件大小超过上限后会自动创建一个新的wal文件。默认为0,即仅在落盘时创建新文件。
|
- WAL_SEGMENT_SIZE:wal 单个文件大小,单位为 KB。当前写入文件大小超过上限后会自动创建一个新的 wal 文件。默认为 0,即仅在落盘时创建新文件。
|
||||||
|
|
||||||
### 创建数据库示例
|
### 创建数据库示例
|
||||||
|
|
||||||
|
@ -104,10 +105,10 @@ DROP DATABASE [IF EXISTS] db_name
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
ALTER DATABASE db_name [alter_database_options]
|
ALTER DATABASE db_name [alter_database_options]
|
||||||
|
|
||||||
alter_database_options:
|
alter_database_options:
|
||||||
alter_database_option ...
|
alter_database_option ...
|
||||||
|
|
||||||
alter_database_option: {
|
alter_database_option: {
|
||||||
CACHEMODEL {'none' | 'last_row' | 'last_value' | 'both'}
|
CACHEMODEL {'none' | 'last_row' | 'last_value' | 'both'}
|
||||||
| CACHESIZE value
|
| CACHESIZE value
|
||||||
|
@ -118,7 +119,7 @@ alter_database_option: {
|
||||||
```
|
```
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
其它参数在3.0.0.0中暂不支持修改
|
其它参数在 3.0.0.0 中暂不支持修改
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -139,3 +140,17 @@ SHOW CREATE DATABASE db_name;
|
||||||
常用于数据库迁移。对一个已经存在的数据库,返回其创建语句;在另一个集群中执行该语句,就能得到一个设置完全相同的 Database。
|
常用于数据库迁移。对一个已经存在的数据库,返回其创建语句;在另一个集群中执行该语句,就能得到一个设置完全相同的 Database。
|
||||||
|
|
||||||
### 查看数据库参数
|
### 查看数据库参数
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW DATABASES \G;
|
||||||
|
```
|
||||||
|
|
||||||
|
会列出系统中所有数据库的配置参数,并且每行只显示一个参数。
|
||||||
|
|
||||||
|
## 删除过期数据
|
||||||
|
|
||||||
|
```sql
|
||||||
|
TRIM DATABASE db_name;
|
||||||
|
```
|
||||||
|
|
||||||
|
删除过期数据,并根据多级存储的配置归整数据。
|
||||||
|
|
|
@ -139,6 +139,7 @@ ALTER TABLE tb_name RENAME COLUMN old_col_name new_col_name
|
||||||
|
|
||||||
## 修改子表
|
## 修改子表
|
||||||
|
|
||||||
|
```sql
|
||||||
ALTER TABLE [db_name.]tb_name alter_table_clause
|
ALTER TABLE [db_name.]tb_name alter_table_clause
|
||||||
|
|
||||||
alter_table_clause: {
|
alter_table_clause: {
|
||||||
|
@ -153,6 +154,7 @@ alter_table_option: {
|
||||||
TTL value
|
TTL value
|
||||||
| COMMENT 'string_value'
|
| COMMENT 'string_value'
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
**使用说明**
|
**使用说明**
|
||||||
1. 对子表的列和标签的修改,除了更改标签值以外,都要通过超级表才能进行。
|
1. 对子表的列和标签的修改,除了更改标签值以外,都要通过超级表才能进行。
|
||||||
|
@ -192,5 +194,5 @@ SHOW CREATE TABLE tb_name;
|
||||||
### 获取表结构信息
|
### 获取表结构信息
|
||||||
|
|
||||||
```
|
```
|
||||||
DESCRIBE tb_name;
|
DESCRIBE [db_name.]tb_name;
|
||||||
```
|
```
|
|
@ -46,7 +46,7 @@ SHOW CREATE STABLE stb_name;
|
||||||
### 获取超级表的结构信息
|
### 获取超级表的结构信息
|
||||||
|
|
||||||
```
|
```
|
||||||
DESCRIBE stb_name;
|
DESCRIBE [db_name.]stb_name;
|
||||||
```
|
```
|
||||||
|
|
||||||
## 删除超级表
|
## 删除超级表
|
||||||
|
|
|
@ -175,7 +175,7 @@ SELECT COUNT(*) FROM (SELECT DISTINCT TBNAME FROM meters);
|
||||||
|
|
||||||
这三个伪列只能用于时间窗口的窗口切分查询之中,且要在窗口切分子句之后出现。
|
这三个伪列只能用于时间窗口的窗口切分查询之中,且要在窗口切分子句之后出现。
|
||||||
|
|
||||||
### \_c0/\_ROWTS
|
**\_c0/\_ROWTS**
|
||||||
|
|
||||||
TDengine 中,所有表的第一列都必须是时间戳类型,且为其主键,\_rowts 伪列和\_c0 伪列均代表了此列的值。相比实际的主键时间戳列,使用伪列更加灵活,语义也更加标准。例如,可以和 max\min 等函数一起使用。
|
TDengine 中,所有表的第一列都必须是时间戳类型,且为其主键,\_rowts 伪列和\_c0 伪列均代表了此列的值。相比实际的主键时间戳列,使用伪列更加灵活,语义也更加标准。例如,可以和 max\min 等函数一起使用。
|
||||||
|
|
||||||
|
@ -183,21 +183,6 @@ TDengine 中,所有表的第一列都必须是时间戳类型,且为其主
|
||||||
select _rowts, max(current) from meters;
|
select _rowts, max(current) from meters;
|
||||||
```
|
```
|
||||||
|
|
||||||
## GROUP BY
|
|
||||||
|
|
||||||
如果在语句中同时指定了 GROUP BY 子句,那么 SELECT 列表只能包含如下表达式:
|
|
||||||
|
|
||||||
1. 常量
|
|
||||||
2. 聚集函数
|
|
||||||
3. 与 GROUP BY 后表达式相同的表达式。
|
|
||||||
4. 包含前面表达式的表达式
|
|
||||||
|
|
||||||
GROUP BY 子句对每行数据按 GROUP BY 后的表达式的值进行分组,并为每个组返回一行汇总信息。
|
|
||||||
|
|
||||||
GROUP BY 子句中的表达式可以包含表或视图中的任何列,这些列不需要出现在 SELECT 列表中。
|
|
||||||
|
|
||||||
该子句对行进行分组,但不保证结果集的顺序。若要对分组进行排序,请使用 ORDER BY 子句
|
|
||||||
|
|
||||||
## 查询对象
|
## 查询对象
|
||||||
|
|
||||||
FROM 关键字后面可以是若干个表(超级表)列表,也可以是子查询的结果。
|
FROM 关键字后面可以是若干个表(超级表)列表,也可以是子查询的结果。
|
||||||
|
@ -213,11 +198,27 @@ TDengine 支持基于时间戳主键的 INNER JOIN,规则如下:
|
||||||
6. 参与 JOIN 的表个数上限为 10 个。
|
6. 参与 JOIN 的表个数上限为 10 个。
|
||||||
7. 不支持与 FILL 子句混合使用。
|
7. 不支持与 FILL 子句混合使用。
|
||||||
|
|
||||||
|
## GROUP BY
|
||||||
|
|
||||||
|
如果在语句中同时指定了 GROUP BY 子句,那么 SELECT 列表只能包含如下表达式:
|
||||||
|
|
||||||
|
1. 常量
|
||||||
|
2. 聚集函数
|
||||||
|
3. 与 GROUP BY 后表达式相同的表达式。
|
||||||
|
4. 包含前面表达式的表达式
|
||||||
|
|
||||||
|
GROUP BY 子句对每行数据按 GROUP BY 后的表达式的值进行分组,并为每个组返回一行汇总信息。
|
||||||
|
|
||||||
|
GROUP BY 子句中的表达式可以包含表或视图中的任何列,这些列不需要出现在 SELECT 列表中。
|
||||||
|
|
||||||
|
该子句对行进行分组,但不保证结果集的顺序。若要对分组进行排序,请使用 ORDER BY 子句
|
||||||
|
|
||||||
|
|
||||||
## PARTITON BY
|
## PARTITON BY
|
||||||
|
|
||||||
PARTITION BY 子句是 TDengine 特色语法,按 part_list 对数据进行切分,在每个切分的分片中进行计算。
|
PARTITION BY 子句是 TDengine 特色语法,按 part_list 对数据进行切分,在每个切分的分片中进行计算。
|
||||||
|
|
||||||
详见 [TDengine 特色查询](taos-sql/distinguished)
|
详见 [TDengine 特色查询](./distinguished)
|
||||||
|
|
||||||
## ORDER BY
|
## ORDER BY
|
||||||
|
|
||||||
|
@ -286,23 +287,6 @@ SELECT TODAY();
|
||||||
SELECT TIMEZONE();
|
SELECT TIMEZONE();
|
||||||
```
|
```
|
||||||
|
|
||||||
## TAOS SQL 中特殊关键词
|
|
||||||
|
|
||||||
- `TBNAME`: 在超级表查询中可视为一个特殊的标签,代表查询涉及的子表名
|
|
||||||
- `_c0`: 表示表(超级表)的第一列
|
|
||||||
|
|
||||||
获取一个超级表所有的子表名及相关的标签信息:
|
|
||||||
|
|
||||||
```sql
|
|
||||||
SELECT TBNAME, location FROM meters;
|
|
||||||
```
|
|
||||||
|
|
||||||
统计超级表下辖子表数量:
|
|
||||||
|
|
||||||
```sql
|
|
||||||
SELECT COUNT(*) FROM (SELECT DISTINCT TBNAMEFROM meters);
|
|
||||||
```
|
|
||||||
|
|
||||||
## 正则表达式过滤
|
## 正则表达式过滤
|
||||||
|
|
||||||
### 语法
|
### 语法
|
||||||
|
@ -394,7 +378,7 @@ UNION ALL SELECT ...
|
||||||
|
|
||||||
TDengine 支持 UNION ALL 操作符。也就是说,如果多个 SELECT 子句返回结果集的结构完全相同(列名、列类型、列数、顺序),那么可以通过 UNION ALL 把这些结果集合并到一起。目前只支持 UNION ALL 模式,也即在结果集的合并过程中是不去重的。在同一个 sql 语句中,UNION ALL 最多支持 100 个。
|
TDengine 支持 UNION ALL 操作符。也就是说,如果多个 SELECT 子句返回结果集的结构完全相同(列名、列类型、列数、顺序),那么可以通过 UNION ALL 把这些结果集合并到一起。目前只支持 UNION ALL 模式,也即在结果集的合并过程中是不去重的。在同一个 sql 语句中,UNION ALL 最多支持 100 个。
|
||||||
|
|
||||||
### SQL 示例
|
## SQL 示例
|
||||||
|
|
||||||
对于下面的例子,表 tb1 用以下语句创建:
|
对于下面的例子,表 tb1 用以下语句创建:
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ toc_max_heading_level: 4
|
||||||
#### ABS
|
#### ABS
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT ABS(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT ABS(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的绝对值
|
**功能说明**:获得指定列的绝对值
|
||||||
|
@ -31,7 +31,7 @@ toc_max_heading_level: 4
|
||||||
#### ACOS
|
#### ACOS
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT ACOS(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT ACOS(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的反余弦结果
|
**功能说明**:获得指定列的反余弦结果
|
||||||
|
@ -49,7 +49,7 @@ toc_max_heading_level: 4
|
||||||
#### ASIN
|
#### ASIN
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT ASIN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT ASIN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的反正弦结果
|
**功能说明**:获得指定列的反正弦结果
|
||||||
|
@ -68,7 +68,7 @@ toc_max_heading_level: 4
|
||||||
#### ATAN
|
#### ATAN
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT ATAN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT ATAN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的反正切结果
|
**功能说明**:获得指定列的反正切结果
|
||||||
|
@ -86,7 +86,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
#### CEIL
|
#### CEIL
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### COS
|
#### COS
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT COS(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT COS(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的余弦结果
|
**功能说明**:获得指定列的余弦结果
|
||||||
|
@ -125,7 +125,7 @@ SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### FLOOR
|
#### FLOOR
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### LOG
|
#### LOG
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT LOG(field_name, base) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT LOG(field_name, base) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列对于底数 base 的对数
|
**功能说明**:获得指定列对于底数 base 的对数
|
||||||
|
@ -154,7 +154,7 @@ SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### POW
|
#### POW
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT POW(field_name, power) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT POW(field_name, power) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的指数为 power 的幂
|
**功能说明**:获得指定列的指数为 power 的幂
|
||||||
|
@ -172,7 +172,7 @@ SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### ROUND
|
#### ROUND
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### SIN
|
#### SIN
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT SIN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT SIN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的正弦结果
|
**功能说明**:获得指定列的正弦结果
|
||||||
|
@ -201,7 +201,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### SQRT
|
#### SQRT
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT SQRT(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT SQRT(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的平方根
|
**功能说明**:获得指定列的平方根
|
||||||
|
@ -219,7 +219,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### TAN
|
#### TAN
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT TAN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT TAN(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:获得指定列的正切结果
|
**功能说明**:获得指定列的正切结果
|
||||||
|
@ -240,8 +240,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### CHAR_LENGTH
|
#### CHAR_LENGTH
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT CHAR_LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT CHAR_LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:以字符计数的字符串长度。
|
**功能说明**:以字符计数的字符串长度。
|
||||||
|
@ -257,7 +257,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### CONCAT
|
#### CONCAT
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT CONCAT(str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT CONCAT(str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:字符串连接函数。
|
**功能说明**:字符串连接函数。
|
||||||
|
@ -273,8 +273,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### CONCAT_WS
|
#### CONCAT_WS
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT CONCAT_WS(separator, str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT CONCAT_WS(separator, str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:带分隔符的字符串连接函数。
|
**功能说明**:带分隔符的字符串连接函数。
|
||||||
|
@ -290,8 +290,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### LENGTH
|
#### LENGTH
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:以字节计数的字符串长度。
|
**功能说明**:以字节计数的字符串长度。
|
||||||
|
@ -307,8 +307,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### LOWER
|
#### LOWER
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT LOWER(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT LOWER(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:将字符串参数值转换为全小写字母。
|
**功能说明**:将字符串参数值转换为全小写字母。
|
||||||
|
@ -324,8 +324,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### LTRIM
|
#### LTRIM
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT LTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT LTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:返回清除左边空格后的字符串。
|
**功能说明**:返回清除左边空格后的字符串。
|
||||||
|
@ -341,8 +341,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### RTRIM
|
#### RTRIM
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT LTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT LTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:返回清除右边空格后的字符串。
|
**功能说明**:返回清除右边空格后的字符串。
|
||||||
|
@ -358,8 +358,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### SUBSTR
|
#### SUBSTR
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT SUBSTR(str,pos[,len]) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT SUBSTR(str,pos[,len]) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:从源字符串 str 中的指定位置 pos 开始取一个长度为 len 的子串并返回。
|
**功能说明**:从源字符串 str 中的指定位置 pos 开始取一个长度为 len 的子串并返回。
|
||||||
|
@ -375,8 +375,8 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
#### UPPER
|
#### UPPER
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT UPPER(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT UPPER(str|column) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:将字符串参数值转换为全大写字母。
|
**功能说明**:将字符串参数值转换为全大写字母。
|
||||||
|
@ -397,7 +397,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
#### CAST
|
#### CAST
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT CAST(expression AS type_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT CAST(expression AS type_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:数据类型转换函数,输入参数 expression 支持普通列、常量、标量函数及它们之间的四则运算,只适用于 select 子句中。
|
**功能说明**:数据类型转换函数,输入参数 expression 支持普通列、常量、标量函数及它们之间的四则运算,只适用于 select 子句中。
|
||||||
|
@ -587,7 +587,7 @@ TDengine 支持针对数据的聚合查询。提供如下聚合函数。
|
||||||
|
|
||||||
### AVG
|
### AVG
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT AVG(field_name) FROM tb_name [WHERE clause];
|
SELECT AVG(field_name) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -602,7 +602,7 @@ SELECT AVG(field_name) FROM tb_name [WHERE clause];
|
||||||
|
|
||||||
### COUNT
|
### COUNT
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];
|
SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -623,7 +623,7 @@ SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];
|
||||||
|
|
||||||
### ELAPSED
|
### ELAPSED
|
||||||
|
|
||||||
```mysql
|
```sql
|
||||||
SELECT ELAPSED(ts_primary_key [, time_unit]) FROM { tb_name | stb_name } [WHERE clause] [INTERVAL(interval [, offset]) [SLIDING sliding]];
|
SELECT ELAPSED(ts_primary_key [, time_unit]) FROM { tb_name | stb_name } [WHERE clause] [INTERVAL(interval [, offset]) [SLIDING sliding]];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -649,7 +649,7 @@ SELECT ELAPSED(ts_primary_key [, time_unit]) FROM { tb_name | stb_name } [WHERE
|
||||||
|
|
||||||
### LEASTSQUARES
|
### LEASTSQUARES
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause];
|
SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -664,7 +664,7 @@ SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause]
|
||||||
|
|
||||||
### MODE
|
### MODE
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT MODE(field_name) FROM tb_name [WHERE clause];
|
SELECT MODE(field_name) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -679,7 +679,7 @@ SELECT MODE(field_name) FROM tb_name [WHERE clause];
|
||||||
|
|
||||||
### SPREAD
|
### SPREAD
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT SPREAD(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT SPREAD(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -694,7 +694,7 @@ SELECT SPREAD(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
### STDDEV
|
### STDDEV
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT STDDEV(field_name) FROM tb_name [WHERE clause];
|
SELECT STDDEV(field_name) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -709,7 +709,7 @@ SELECT STDDEV(field_name) FROM tb_name [WHERE clause];
|
||||||
|
|
||||||
### SUM
|
### SUM
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT SUM(field_name) FROM tb_name [WHERE clause];
|
SELECT SUM(field_name) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -724,7 +724,7 @@ SELECT SUM(field_name) FROM tb_name [WHERE clause];
|
||||||
|
|
||||||
### HYPERLOGLOG
|
### HYPERLOGLOG
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT HYPERLOGLOG(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT HYPERLOGLOG(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -741,7 +741,7 @@ SELECT HYPERLOGLOG(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
### HISTOGRAM
|
### HISTOGRAM
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT HISTOGRAM(field_name,bin_type, bin_description, normalized) FROM tb_name [WHERE clause];
|
SELECT HISTOGRAM(field_name,bin_type, bin_description, normalized) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -775,7 +775,7 @@ SELECT HISTOGRAM(field_name,bin_type, bin_description, normalized) FROM tb_nam
|
||||||
|
|
||||||
### APERCENTILE
|
### APERCENTILE
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT APERCENTILE(field_name, P[, algo_type])
|
SELECT APERCENTILE(field_name, P[, algo_type])
|
||||||
FROM { tb_name | stb_name } [WHERE clause]
|
FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
@ -790,7 +790,7 @@ FROM { tb_name | stb_name } [WHERE clause]
|
||||||
|
|
||||||
### BOTTOM
|
### BOTTOM
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -810,7 +810,7 @@ SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
### FIRST
|
### FIRST
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -830,7 +830,7 @@ SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
### INTERP
|
### INTERP
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [ RANGE(timestamp1,timestamp2) ] [EVERY(interval)] [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
|
SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [ RANGE(timestamp1,timestamp2) ] [EVERY(interval)] [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -854,7 +854,7 @@ SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [
|
||||||
|
|
||||||
### LAST
|
### LAST
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -875,7 +875,7 @@ SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
### LAST_ROW
|
### LAST_ROW
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };
|
SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -894,7 +894,7 @@ SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };
|
||||||
|
|
||||||
### MAX
|
### MAX
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -909,7 +909,7 @@ SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
### MIN
|
### MIN
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -924,7 +924,7 @@ SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
|
|
||||||
### PERCENTILE
|
### PERCENTILE
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];
|
SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -941,7 +941,7 @@ SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];
|
||||||
|
|
||||||
### TAIL
|
### TAIL
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT TAIL(field_name, k, offset_val) FROM {tb_name | stb_name} [WHERE clause];
|
SELECT TAIL(field_name, k, offset_val) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -958,7 +958,7 @@ SELECT TAIL(field_name, k, offset_val) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
|
|
||||||
### TOP
|
### TOP
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT TOP(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT TOP(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -978,7 +978,7 @@ SELECT TOP(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
### UNIQUE
|
### UNIQUE
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT UNIQUE(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
SELECT UNIQUE(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -998,7 +998,7 @@ SELECT UNIQUE(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
### CSUM
|
### CSUM
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT CSUM(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT CSUM(field_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:累加和(Cumulative sum),输出行与输入行数相同。
|
**功能说明**:累加和(Cumulative sum),输出行与输入行数相同。
|
||||||
|
@ -1020,7 +1020,7 @@ SELECT UNIQUE(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
|
|
||||||
### DERIVATIVE
|
### DERIVATIVE
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT DERIVATIVE(field_name, time_interval, ignore_negative) FROM tb_name [WHERE clause];
|
SELECT DERIVATIVE(field_name, time_interval, ignore_negative) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1037,9 +1037,9 @@ SELECT DERIVATIVE(field_name, time_interval, ignore_negative) FROM tb_name [WHER
|
||||||
|
|
||||||
### DIFF
|
### DIFF
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT {DIFF(field_name, ignore_negative) | DIFF(field_name)} FROM tb_name [WHERE clause];
|
SELECT {DIFF(field_name, ignore_negative) | DIFF(field_name)} FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:统计表中某列的值与前一行对应值的差。 ignore_negative 取值为 0|1 , 可以不填,默认值为 0. 不忽略负值。ignore_negative 为 1 时表示忽略负数。
|
**功能说明**:统计表中某列的值与前一行对应值的差。 ignore_negative 取值为 0|1 , 可以不填,默认值为 0. 不忽略负值。ignore_negative 为 1 时表示忽略负数。
|
||||||
|
|
||||||
|
@ -1054,7 +1054,7 @@ SELECT DERIVATIVE(field_name, time_interval, ignore_negative) FROM tb_name [WHER
|
||||||
|
|
||||||
### IRATE
|
### IRATE
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT IRATE(field_name) FROM tb_name WHERE clause;
|
SELECT IRATE(field_name) FROM tb_name WHERE clause;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1069,7 +1069,7 @@ SELECT IRATE(field_name) FROM tb_name WHERE clause;
|
||||||
### MAVG
|
### MAVG
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT MAVG(field_name, K) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT MAVG(field_name, K) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**: 计算连续 k 个值的移动平均数(moving average)。如果输入行数小于 k,则无结果输出。参数 k 的合法输入范围是 1≤ k ≤ 1000。
|
**功能说明**: 计算连续 k 个值的移动平均数(moving average)。如果输入行数小于 k,则无结果输出。参数 k 的合法输入范围是 1≤ k ≤ 1000。
|
||||||
|
@ -1091,7 +1091,7 @@ SELECT IRATE(field_name) FROM tb_name WHERE clause;
|
||||||
### SAMPLE
|
### SAMPLE
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT SAMPLE(field_name, K) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT SAMPLE(field_name, K) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**: 获取数据的 k 个采样值。参数 k 的合法输入范围是 1≤ k ≤ 1000。
|
**功能说明**: 获取数据的 k 个采样值。参数 k 的合法输入范围是 1≤ k ≤ 1000。
|
||||||
|
@ -1111,7 +1111,7 @@ SELECT IRATE(field_name) FROM tb_name WHERE clause;
|
||||||
|
|
||||||
### STATECOUNT
|
### STATECOUNT
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT STATECOUNT(field_name, oper, val) FROM { tb_name | stb_name } [WHERE clause];
|
SELECT STATECOUNT(field_name, oper, val) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1166,7 +1166,7 @@ SELECT stateDuration(field_name, oper, val, unit) FROM { tb_name | stb_name } [W
|
||||||
|
|
||||||
### TWA
|
### TWA
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT TWA(field_name) FROM tb_name WHERE clause;
|
SELECT TWA(field_name) FROM tb_name WHERE clause;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1185,7 +1185,7 @@ SELECT TWA(field_name) FROM tb_name WHERE clause;
|
||||||
|
|
||||||
### DATABASE
|
### DATABASE
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT DATABASE();
|
SELECT DATABASE();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1194,7 +1194,7 @@ SELECT DATABASE();
|
||||||
|
|
||||||
### CLIENT_VERSION
|
### CLIENT_VERSION
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT CLIENT_VERSION();
|
SELECT CLIENT_VERSION();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1202,7 +1202,7 @@ SELECT CLIENT_VERSION();
|
||||||
|
|
||||||
### SERVER_VERSION
|
### SERVER_VERSION
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT SERVER_VERSION();
|
SELECT SERVER_VERSION();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1210,7 +1210,7 @@ SELECT SERVER_VERSION();
|
||||||
|
|
||||||
### SERVER_STATUS
|
### SERVER_STATUS
|
||||||
|
|
||||||
```
|
```sql
|
||||||
SELECT SERVER_VERSION();
|
SELECT SERVER_VERSION();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
---
|
||||||
|
sidebar_label: 消息队列
|
||||||
|
title: 消息队列
|
||||||
|
---
|
||||||
|
|
||||||
|
TDengine 3.0.0.0 开始对消息队列做了大幅的优化和增强以简化用户的解决方案。
|
||||||
|
|
||||||
|
## 创建订阅主题
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TOPIC [IF NOT EXISTS] topic_name AS {subquery | DATABASE db_name | STABLE stb_name };
|
||||||
|
```
|
||||||
|
|
||||||
|
订阅主题包括三种:列订阅、超级表订阅和数据库订阅。
|
||||||
|
|
||||||
|
**列订阅是**用 subquery 描述,支持过滤和标量函数和 UDF 标量函数,不支持 JOIN、GROUP BY、窗口切分子句、聚合函数和 UDF 聚合函数。列订阅规则如下:
|
||||||
|
|
||||||
|
1. TOPIC 一旦创建则返回结果的字段确定
|
||||||
|
2. 被订阅或用于计算的列不可被删除、修改
|
||||||
|
3. 列可以新增,但新增的列不出现在订阅结果字段中
|
||||||
|
4. 对于 select \*,则订阅展开为创建时所有的列(子表、普通表为数据列,超级表为数据列加标签列)
|
||||||
|
|
||||||
|
**超级表订阅和数据库订阅**规则如下:
|
||||||
|
|
||||||
|
1. 被订阅主体的 schema 变更不受限
|
||||||
|
2. 返回消息中 schema 是块级别的,每块的 schema 可能不一样
|
||||||
|
3. 列变更后写入的数据若未落盘,将以写入时的 schema 返回
|
||||||
|
4. 列变更后写入的数据若未已落盘,将以落盘时的 schema 返回
|
||||||
|
|
||||||
|
## 删除订阅主题
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP TOPIC [IF EXISTS] topic_name;
|
||||||
|
```
|
||||||
|
|
||||||
|
此时如果该订阅主题上存在 consumer,则此 consumer 会收到一个错误。
|
||||||
|
|
||||||
|
## 查看订阅主题
|
||||||
|
|
||||||
|
## SHOW TOPICS
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW TOPICS;
|
||||||
|
```
|
||||||
|
|
||||||
|
显示当前数据库下的所有主题的信息。
|
||||||
|
|
||||||
|
## 创建消费组
|
||||||
|
|
||||||
|
消费组的创建只能通过 TDengine 客户端驱动或者连接器所提供的 API 创建。
|
||||||
|
|
||||||
|
## 删除消费组
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP CONSUMER GROUP [IF EXISTS] cgroup_name ON topic_name;
|
||||||
|
```
|
||||||
|
|
||||||
|
删除主题 topic_name 上的消费组 cgroup_name。
|
||||||
|
|
||||||
|
## 查看消费组
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW CONSUMERS;
|
||||||
|
```
|
||||||
|
|
||||||
|
显示当前数据库下所有活跃的消费者的信息。
|
|
@ -9,8 +9,8 @@ title: 命名与边界限制
|
||||||
2. 允许英文字符或下划线开头,不允许以数字开头
|
2. 允许英文字符或下划线开头,不允许以数字开头
|
||||||
3. 不区分大小写
|
3. 不区分大小写
|
||||||
4. 转义后表(列)名规则:
|
4. 转义后表(列)名规则:
|
||||||
为了兼容支持更多形式的表(列)名,TDengine 引入新的转义符 "`"。可用让表名与关键词不冲突,同时不受限于上述表名称合法性约束检查。
|
为了兼容支持更多形式的表(列)名,TDengine 引入新的转义符 "`"。可用让表名与关键词不冲突,同时不受限于上述表名称合法性约束检查
|
||||||
转义后的表(列)名同样受到长度限制要求,且长度计算的时候不计算转义符。使用转义字符以后,不再对转义字符中的内容进行大小写统一。
|
转义后的表(列)名同样受到长度限制要求,且长度计算的时候不计算转义符。使用转义字符以后,不再对转义字符中的内容进行大小写统一
|
||||||
|
|
||||||
例如:\`aBc\` 和 \`abc\` 是不同的表(列)名,但是 abc 和 aBc 是相同的表(列)名。
|
例如:\`aBc\` 和 \`abc\` 是不同的表(列)名,但是 abc 和 aBc 是相同的表(列)名。
|
||||||
需要注意的是转义字符中的内容必须是可打印字符。
|
需要注意的是转义字符中的内容必须是可打印字符。
|
||||||
|
@ -23,28 +23,30 @@ title: 命名与边界限制
|
||||||
|
|
||||||
## 一般限制
|
## 一般限制
|
||||||
|
|
||||||
- 数据库名最大长度为 32。
|
- 数据库名最大长度为 32
|
||||||
- 表名最大长度为 192,不包括数据库名前缀和分隔符
|
- 表名最大长度为 192,不包括数据库名前缀和分隔符
|
||||||
- 每行数据最大长度 48KB (注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)。
|
- 每行数据最大长度 48KB (注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
|
||||||
- 列名最大长度为 64
|
- 列名最大长度为 64
|
||||||
- 最多允许 4096 列,最少需要 2 列,第一列必须是时间戳。
|
- 最多允许 4096 列,最少需要 2 列,第一列必须是时间戳。
|
||||||
- 标签名最大长度为 64
|
- 标签名最大长度为 64
|
||||||
- 最多允许 128 个,至少要有 1 个标签,一个表中标签值的总长度不超过 16KB 。
|
- 最多允许 128 个,至少要有 1 个标签,一个表中标签值的总长度不超过 16KB
|
||||||
- SQL 语句最大长度 1048576 个字符,也可通过客户端配置参数 maxSQLLength 修改,取值范围 65480 ~ 1048576。
|
- SQL 语句最大长度 1048576 个字符,也可通过客户端配置参数 maxSQLLength 修改,取值范围 65480 ~ 1048576
|
||||||
- SELECT 语句的查询结果,最多允许返回 4096 列(语句中的函数调用可能也会占用一些列空间),超限时需要显式指定较少的返回数据列,以避免语句执行报错。
|
- SELECT 语句的查询结果,最多允许返回 4096 列(语句中的函数调用可能也会占用一些列空间),超限时需要显式指定较少的返回数据列,以避免语句执行报错
|
||||||
- 库的数目,超级表的数目、表的数目,系统不做限制,仅受系统资源限制。
|
- 库的数目,超级表的数目、表的数目,系统不做限制,仅受系统资源限制
|
||||||
- 数据库的副本数只能设置为 1 或 3
|
- 数据库的副本数只能设置为 1 或 3
|
||||||
- 用户名的最大长度是 23 个字节
|
- 用户名的最大长度是 23 个字节
|
||||||
- 用户密码的最大长度是 15 个字节
|
- 用户密码的最大长度是 15 个字节
|
||||||
- 总数据行数取决于可用资源
|
- 总数据行数取决于可用资源
|
||||||
- 单个数据库的虚拟结点数上限为 1024
|
- 单个数据库的虚拟结点数上限为 1024
|
||||||
|
|
||||||
## 表(列)名合法性说明
|
## 表(列)名合法性说明
|
||||||
|
|
||||||
### TDengine 中的表(列)名命名规则如下:
|
### TDengine 中的表(列)名命名规则如下:
|
||||||
|
|
||||||
只能由字母、数字、下划线构成,数字不能在首位,长度不能超过 192 字节,不区分大小写。这里表名称不包括数据库名的前缀和分隔符。
|
只能由字母、数字、下划线构成,数字不能在首位,长度不能超过 192 字节,不区分大小写。这里表名称不包括数据库名的前缀和分隔符。
|
||||||
|
|
||||||
### 转义后表(列)名规则:
|
### 转义后表(列)名规则:
|
||||||
|
|
||||||
为了兼容支持更多形式的表(列)名,TDengine 引入新的转义符 "`",可以避免表名与关键词的冲突,同时不受限于上述表名合法性约束检查,转义符不计入表名的长度。
|
为了兼容支持更多形式的表(列)名,TDengine 引入新的转义符 "`",可以避免表名与关键词的冲突,同时不受限于上述表名合法性约束检查,转义符不计入表名的长度。
|
||||||
转义后的表(列)名同样受到长度限制要求,且长度计算的时候不计算转义符。使用转义字符以后,不再对转义字符中的内容进行大小写统一。
|
转义后的表(列)名同样受到长度限制要求,且长度计算的时候不计算转义符。使用转义字符以后,不再对转义字符中的内容进行大小写统一。
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,155 @@
|
||||||
|
---
|
||||||
|
sidebar_label: 集群管理
|
||||||
|
title: 集群管理
|
||||||
|
---
|
||||||
|
|
||||||
|
组成 TDengine 集群的物理实体是 dnode (data node 的缩写),它是一个运行在操作系统之上的进程。在 dnode 中可以建立负责时序数据存储的 vnode (virtual node),在多节点集群环境下当某个数据库的 replica 为 3 时,该数据库中的每个 vgroup 由 3 个 vnode 组成;当数据库的 replica 为 1 时,该数据库中的每个 vgroup 由 1 个 vnode 组成。如果要想配置某个数据库为多副本,则集群中的 dnode 数量至少为 3。在 dnode 还可以创建 mnode (management node),单个集群中最多可以创建三个 mnode。在 TDengine 3.0.0.0 中为了支持存算分离,引入了一种新的逻辑节点 qnode (query node),qnode 和 vnode 既可以共存在一个 dnode 中,也可以完全分离在不同的 dnode 上。
|
||||||
|
|
||||||
|
## 创建数据节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE DNODE {dnode_endpoint | dnode_host_name PORT port_val}
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `dnode_endpoint` 是形成 `hostname:port`的格式。也可以分开指定 hostname 和 port。
|
||||||
|
|
||||||
|
实际操作中推荐先创建 dnode,再启动相应的 dnode 进程,这样该 dnode 就可以立即根据其配置文件中的 firstEP 加入集群。每个 dnode 在加入成功后都会被分配一个 ID。
|
||||||
|
|
||||||
|
## 查看数据节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW DNODES;
|
||||||
|
```
|
||||||
|
|
||||||
|
可以列出集群中所有的数据节点,所列出的字段有 dnode 的 ID, endpoint, status。
|
||||||
|
|
||||||
|
## 删除数据节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP DNODE {dnode_id | dnode_endpoint}
|
||||||
|
```
|
||||||
|
|
||||||
|
可以用 dnoe_id 或 endpoint 两种方式从集群中删除一个 dnode。注意删除 dnode 不等于停止相应的进程。实际中推荐先将一个 dnode 删除之后再停止其所对应的进程。
|
||||||
|
|
||||||
|
## 修改数据节点配置
|
||||||
|
|
||||||
|
```sql
|
||||||
|
ALTER DNODE dnode_id dnode_option
|
||||||
|
|
||||||
|
ALTER ALL DNODES dnode_option
|
||||||
|
|
||||||
|
dnode_option: {
|
||||||
|
'resetLog'
|
||||||
|
| 'resetQueryCache'
|
||||||
|
| 'balance' value
|
||||||
|
| 'monitor' value
|
||||||
|
| 'debugFlag' value
|
||||||
|
| 'monDebugFlag' value
|
||||||
|
| 'vDebugFlag' value
|
||||||
|
| 'mDebugFlag' value
|
||||||
|
| 'cDebugFlag' value
|
||||||
|
| 'httpDebugFlag' value
|
||||||
|
| 'qDebugflag' value
|
||||||
|
| 'sdbDebugFlag' value
|
||||||
|
| 'uDebugFlag' value
|
||||||
|
| 'tsdbDebugFlag' value
|
||||||
|
| 'sDebugflag' value
|
||||||
|
| 'rpcDebugFlag' value
|
||||||
|
| 'dDebugFlag' value
|
||||||
|
| 'mqttDebugFlag' value
|
||||||
|
| 'wDebugFlag' value
|
||||||
|
| 'tmrDebugFlag' value
|
||||||
|
| 'cqDebugFlag' value
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
上面语法中的这些可修改配置项其配置方式与 dnode 配置文件中的配置方式相同,区别是修改是动态的立即生效,且不需要重启 dnode。
|
||||||
|
|
||||||
|
## 添加管理节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE MNODE ON DNODE dnode_id
|
||||||
|
```
|
||||||
|
|
||||||
|
系统启动默认在 firstEP 节点上创建一个 MNODE,用户可以使用此语句创建更多的 MNODE 来提高系统可用性。一个集群最多存在三个 MNODE,一个 DNODE 上只能创建一个 MNODE。
|
||||||
|
|
||||||
|
## 查看管理节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW MNODES;
|
||||||
|
```
|
||||||
|
|
||||||
|
列出集群中所有的管理节点,包括其 ID,所在 DNODE 以及状态。
|
||||||
|
|
||||||
|
## 删除管理节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP MNODE ON DNODE dnode_id;
|
||||||
|
```
|
||||||
|
|
||||||
|
删除 dnode_id 所指定的 DNODE 上的 MNODE。
|
||||||
|
|
||||||
|
## 创建查询节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE QNODE ON DNODE dnode_id;
|
||||||
|
```
|
||||||
|
|
||||||
|
系统启动默认没有 QNODE,用户可以创建 QNODE 来实现计算和存储的分离。一个 DNODE 上只能创建一个 QNODE。一个 DNODE 的 `supportVnodes` 参数如果不为 0,同时又在其上创建上 QNODE,则在该 dnode 中既有负责存储管理的 vnode 又有负责查询计算的 qnode,如果还在该 dnode 上创建了 mnode,则一个 dnode 上最多三种逻辑节点都可以存在。但通过配置也可以使其彻底分离。将一个 dnode 的`supportVnodes`配置为 0,可以选择在其上创建 mnode 或者 qnode 中的一种,这样可以实现三种逻辑节点在物理上的彻底分离。
|
||||||
|
|
||||||
|
## 查看查询节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW QNODES;
|
||||||
|
```
|
||||||
|
|
||||||
|
列出集群中所有查询节点,包括 ID,及所在 DNODE。
|
||||||
|
|
||||||
|
## 删除查询节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP QNODE ON DNODE dnode_id;
|
||||||
|
```
|
||||||
|
|
||||||
|
删除 ID 为 dnode_id 的 DNODE 上的 QNODE,但并不会影响该 dnode 的状态。
|
||||||
|
|
||||||
|
## 修改客户端配置
|
||||||
|
|
||||||
|
如果将客户端也看作广义的集群的一部分,可以通过如下命令动态修改客户端配置参数。
|
||||||
|
|
||||||
|
```sql
|
||||||
|
ALTER LOCAL local_option
|
||||||
|
|
||||||
|
local_option: {
|
||||||
|
'resetLog'
|
||||||
|
| 'rpcDebugFlag' value
|
||||||
|
| 'tmrDebugFlag' value
|
||||||
|
| 'cDebugFlag' value
|
||||||
|
| 'uDebugFlag' value
|
||||||
|
| 'debugFlag' value
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
上面语法中的参数与在配置文件中配置客户端的用法相同,但不需要重启客户端,修改后立即生效。
|
||||||
|
|
||||||
|
## 查看客户端配置
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW LOCAL VARIABLES;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 合并 vgroup
|
||||||
|
|
||||||
|
```sql
|
||||||
|
MERGE VGROUP vgroup_no1 vgroup_no2;
|
||||||
|
```
|
||||||
|
|
||||||
|
如果在系统实际运行一段时间后,因为不同时间线的数据特征不同导致在 vgroups 之间的数据和负载分布不均衡,可以通过合并或拆分 vgroups 的方式逐步实现负载均衡。
|
||||||
|
|
||||||
|
## 拆分 vgroup
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SPLIT VGROUP vgroup_no;
|
||||||
|
```
|
||||||
|
|
||||||
|
会创建一个新的 vgroup,并将指定 vgroup 中的数据按照一致性 HASH 迁移一部分到新的 vgroup 中。此过程中,原 vgroup 可以正常提供读写服务。
|
|
@ -3,22 +3,15 @@ sidebar_label: 元数据库
|
||||||
title: 元数据库
|
title: 元数据库
|
||||||
---
|
---
|
||||||
|
|
||||||
TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数据库元数据、数据库系统信息和状态的访问,例如数据库或表的名称,当前执行的 SQL 语句等。
|
TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数据库元数据、数据库系统信息和状态的访问,例如数据库或表的名称,当前执行的 SQL 语句等。该数据库存储有关 TDengine 维护的所有其他数据库的信息。它包含多个只读表。实际上,这些表都是视图,而不是基表,因此没有与它们关联的文件。所以对这些表只能查询,不能进行 INSERT 等写入操作。`INFORMATION_SCHEMA` 数据库旨在以一种更一致的方式来提供对 TDengine 支持的各种 SHOW 语句(如 SHOW TABLES、SHOW DATABASES)所提供的信息的访问。与 SHOW 语句相比,使用 SELECT ... FROM INFORMATION_SCHEMA.tablename 具有以下优点:
|
||||||
|
|
||||||
`INFORMATION_SCHEMA` 是 TDengine 启动时自动创建的数据库,该数据库存储有关 TDengine 维护的所有其他数据库的信息。它包含多个只读表。实际上,这些表都是视图,而不是基表,因此没有与它们关联的文件。所以对这些表只能查询,不能进行 INSERT 等写入操作。
|
1. 可以使用 USE 语句将 INFORMATION_SCHEMA 设为默认数据库
|
||||||
|
2. 可以使用 SELECT 语句熟悉的语法,只需要学习一些表名和列名
|
||||||
|
3. 可以对查询结果进行筛选、排序等操作。事实上,可以使用任意 TDengine 支持的 SELECT 语句对 INFORMATION_SCHEMA 中的表进行查询
|
||||||
|
4. TDengine 在后续演进中可以灵活的添加已有 INFORMATION_SCHEMA 中表的列,而不用担心对既有业务系统造成影响
|
||||||
|
5. 与其他数据库系统更具互操作性。例如,Oracle 数据库用户熟悉查询 Oracle 数据字典中的表
|
||||||
|
|
||||||
可以使用 USE 语句将 INFORMATION_SCHEMA 设为默认数据库。
|
Note: 由于 SHOW 语句已经被开发者熟悉和广泛使用,所以它们仍然被保留。
|
||||||
|
|
||||||
INFORMATION_SCHEMA 旨在以一种更一致的方式来提供对 TDengine 支持的各种 SHOW 语句(如 SHOW TABLES、SHOW DATABASES)提供的信息的访问。与 SHOW 语句相比,使用 SELECT ... FROM INFORMATION_SCHEMA.tablename 具有以下优点:
|
|
||||||
|
|
||||||
您可以使用 SELECT 语句熟悉的语法,只需要学习一些表名和列名。
|
|
||||||
|
|
||||||
您可以对查询结果进行筛选、排序等操作,事实上,您可以使用任意 TDengine 支持的 SELECT 语句对 INFORMATION_SCHEMA 中的表进行查询。
|
|
||||||
TDengine 在后续演进中可以灵活的添加已有 INFORMATION_SCHEMA 中表的列,而不用担心对既有业务系统造成影响。
|
|
||||||
|
|
||||||
此技术与其他数据库系统更具互操作性。例如,Oracle 数据库用户熟悉查询 Oracle 数据字典中的表。
|
|
||||||
|
|
||||||
由于 SHOW 语句已经被开发者熟悉的和广泛使用,所以它们仍然是可用的。
|
|
||||||
|
|
||||||
本章将详细介绍 `INFORMATION_SCHEMA` 这个内置元数据库中的表和表结构。
|
本章将详细介绍 `INFORMATION_SCHEMA` 这个内置元数据库中的表和表结构。
|
||||||
|
|
||||||
|
@ -87,8 +80,8 @@ TODO
|
||||||
| 9 | buffer | INT | 每个 vnode 写缓存的内存块大小,单位 MB |
|
| 9 | buffer | INT | 每个 vnode 写缓存的内存块大小,单位 MB |
|
||||||
| 10 | minrows | INT | 文件块中记录的最大条数 |
|
| 10 | minrows | INT | 文件块中记录的最大条数 |
|
||||||
| 11 | maxrows | INT | 文件块中记录的最小条数 |
|
| 11 | maxrows | INT | 文件块中记录的最小条数 |
|
||||||
| 12 | wallevel | INT | WAL 级别 |
|
| 12 | wal_level | INT | WAL 级别 |
|
||||||
| 13 | fsync | INT | 数据落盘周期 |
|
| 13 | walfsync_period | INT | 数据落盘周期 |
|
||||||
| 14 | comp | INT | 数据压缩方式 |
|
| 14 | comp | INT | 数据压缩方式 |
|
||||||
| 15 | precision | BINARY(2) | 时间分辨率 |
|
| 15 | precision | BINARY(2) | 时间分辨率 |
|
||||||
| 16 | status | BINARY(10) | 数据库状态 |
|
| 16 | status | BINARY(10) | 数据库状态 |
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
---
|
||||||
|
sidebar_label: 权限管理
|
||||||
|
title: 权限管理
|
||||||
|
---
|
||||||
|
|
||||||
|
本节讲述如何在 TDengine 中进行权限管理的相关操作。
|
||||||
|
|
||||||
|
## 创建用户
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE USER use_name PASS password;
|
||||||
|
```
|
||||||
|
|
||||||
|
创建用户。
|
||||||
|
|
||||||
|
use_name最长为23字节。
|
||||||
|
|
||||||
|
password最长为128字节,合法字符包括"a-zA-Z0-9!?$%^&*()_–+={[}]:;@~#|<,>.?/",不可以出现单双引号、撇号、反斜杠和空格,且不可以为空。
|
||||||
|
|
||||||
|
## 删除用户
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP USER user_name;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 修改用户信息
|
||||||
|
|
||||||
|
```sql
|
||||||
|
ALTER USER user_name alter_user_clause
|
||||||
|
|
||||||
|
alter_user_clause: {
|
||||||
|
PASS 'literal'
|
||||||
|
| ENABLE value
|
||||||
|
| SYSINFO value
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- PASS:修改用户密码。
|
||||||
|
- ENABLE:修改用户是否启用。1表示启用此用户,0表示禁用此用户。
|
||||||
|
- SYSINFO:修改用户是否可查看系统信息。1表示可以查看系统信息,0表示不可以查看系统信息。
|
||||||
|
|
||||||
|
|
||||||
|
## 授权
|
||||||
|
|
||||||
|
```sql
|
||||||
|
GRANT privileges ON priv_level TO user_name
|
||||||
|
|
||||||
|
privileges : {
|
||||||
|
ALL
|
||||||
|
| priv_type [, priv_type] ...
|
||||||
|
}
|
||||||
|
|
||||||
|
priv_type : {
|
||||||
|
READ
|
||||||
|
| WRITE
|
||||||
|
}
|
||||||
|
|
||||||
|
priv_level : {
|
||||||
|
dbname.*
|
||||||
|
| *.*
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
对用户授权。
|
||||||
|
|
||||||
|
授权级别支持到DATABASE,权限有READ和WRITE两种。
|
||||||
|
|
||||||
|
TDengine 有超级用户和普通用户两类用户。超级用户缺省创建为root,拥有所有权限。使用超级用户创建出来的用户为普通用户。在未授权的情况下,普通用户可以创建DATABASE,并拥有自己创建的DATABASE的所有权限,包括删除数据库、修改数据库、查询时序数据和写入时序数据。超级用户可以给普通用户授予其他DATABASE的读写权限,使其可以在此DATABASE上读写数据,但不能对其进行删除和修改数据库的操作。
|
||||||
|
|
||||||
|
对于非DATABASE的对象,如USER、DNODE、UDF、QNODE等,普通用户只有读权限(一般为SHOW命令),不能创建和修改。
|
||||||
|
|
||||||
|
## 撤销授权
|
||||||
|
|
||||||
|
```sql
|
||||||
|
REVOKE privileges ON priv_level FROM user_name
|
||||||
|
|
||||||
|
privileges : {
|
||||||
|
ALL
|
||||||
|
| priv_type [, priv_type] ...
|
||||||
|
}
|
||||||
|
|
||||||
|
priv_type : {
|
||||||
|
READ
|
||||||
|
| WRITE
|
||||||
|
}
|
||||||
|
|
||||||
|
priv_level : {
|
||||||
|
dbname.*
|
||||||
|
| *.*
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
收回对用户的授权。
|
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
sidebar_label: 自定义函数
|
||||||
|
title: 用户自定义函数
|
||||||
|
---
|
||||||
|
|
||||||
|
除了 TDengine 的内置函数以外,用户还可以编写自己的函数逻辑并加入TDengine系统中。
|
||||||
|
|
||||||
|
## 创建函数
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE [AGGREGATE] FUNCTION func_name AS library_path OUTPUTTYPE type_name [BUFSIZE value]
|
||||||
|
```
|
||||||
|
|
||||||
|
语法说明:
|
||||||
|
|
||||||
|
AGGREGATE:标识此函数是标量函数还是聚集函数。
|
||||||
|
func_name:函数名,必须与函数实现中udfNormalFunc的实际名称一致。
|
||||||
|
library_path:包含UDF函数实现的动态链接库的绝对路径,是在客户端侧主机上的绝对路径。
|
||||||
|
OUTPUTTYPE:标识此函数的返回类型。
|
||||||
|
BUFSIZE:中间结果的缓冲区大小,单位是字节。不设置则默认为0。最大不可超过512字节。
|
||||||
|
|
||||||
|
关于如何开发自定义函数,请参考 [UDF使用说明](../develop/udf)。
|
||||||
|
|
||||||
|
## 删除自定义函数
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP FUNCTION func_name
|
||||||
|
```
|
|
@ -0,0 +1,47 @@
|
||||||
|
---
|
||||||
|
sidebar_label: 索引
|
||||||
|
title: 使用索引
|
||||||
|
---
|
||||||
|
|
||||||
|
TDengine 从 3.0.0.0 版本开始引入了索引功能,支持 SMA 索引和 FULLTEXT 索引。
|
||||||
|
|
||||||
|
## 创建索引
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE FULLTEXT INDEX index_name ON tb_name (col_name [, col_name] ...)
|
||||||
|
|
||||||
|
CREATE SMA INDEX index_name ON tb_name index_option
|
||||||
|
|
||||||
|
index_option:
|
||||||
|
FUNCTION(functions) INTERVAL(interval_val [, interval_offset]) [SLIDING(sliding_val)] [WATERMARK(watermark_val)] [MAX_DELAY(max_delay_val)]
|
||||||
|
|
||||||
|
functions:
|
||||||
|
function [, function] ...
|
||||||
|
```
|
||||||
|
|
||||||
|
### SMA 索引
|
||||||
|
|
||||||
|
对指定列按 INTERVAL 子句定义的时间窗口创建进行预聚合计算,预聚合计算类型由 functions_string 指定。SMA 索引能提升指定时间段的聚合查询的性能。目前,限制一个超级表只能创建一个 SMA INDEX。
|
||||||
|
|
||||||
|
- 支持的函数包括 MAX、MIN 和 SUM。
|
||||||
|
- WATERMARK: 最小单位毫秒,取值范围 [0ms, 900000ms],默认值为 5 秒,只可用于超级表。
|
||||||
|
- MAX_DELAY: 最小单位毫秒,取值范围 [1ms, 900000ms],默认值为 interval 的值(但不能超过最大值),只可用于超级表。注:不建议 MAX_DELAY 设置太小,否则会过于频繁的推送结果,影响存储和查询性能,如无特殊需求,取默认值即可。
|
||||||
|
|
||||||
|
### FULLTEXT 索引
|
||||||
|
|
||||||
|
对指定列建立文本索引,可以提升含有文本过滤的查询的性能。FULLTEXT 索引不支持 index_option 语法。现阶段只支持对 JSON 类型的标签列创建 FULLTEXT 索引。不支持多列联合索引,但可以为每个列分布创建 FULLTEXT 索引。
|
||||||
|
|
||||||
|
## 删除索引
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP INDEX index_name;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 查看索引
|
||||||
|
|
||||||
|
````sql
|
||||||
|
```sql
|
||||||
|
SHOW INDEXES FROM tbl_name [FROM db_name];
|
||||||
|
````
|
||||||
|
|
||||||
|
显示在所指定的数据库或表上已创建的索引。
|
|
@ -0,0 +1,38 @@
|
||||||
|
---
|
||||||
|
sidebar_label: 异常恢复
|
||||||
|
title: 异常恢复
|
||||||
|
---
|
||||||
|
|
||||||
|
在一个复杂的应用场景中,连接和查询任务等有可能进入一种错误状态或者耗时过长迟迟无法结束,此时需要有能够终止这些连接或任务的方法。
|
||||||
|
|
||||||
|
## 终止连接
|
||||||
|
|
||||||
|
```sql
|
||||||
|
KILL CONNECTION conn_id;
|
||||||
|
```
|
||||||
|
|
||||||
|
conn_id 可以通过 `SHOW CONNECTIONS` 获取。
|
||||||
|
|
||||||
|
## 终止查询
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW QUERY query_id;
|
||||||
|
```
|
||||||
|
|
||||||
|
query_id 可以通过 `SHOW QUERIES` 获取。
|
||||||
|
|
||||||
|
## 终止事务
|
||||||
|
|
||||||
|
```sql
|
||||||
|
KILL TRANSACTION trans_id
|
||||||
|
```
|
||||||
|
|
||||||
|
trans_id 可以通过 `SHOW TRANSACTIONS` 获取。
|
||||||
|
|
||||||
|
## 重置客户端缓存
|
||||||
|
|
||||||
|
```sql
|
||||||
|
RESET QUERY CACHE;
|
||||||
|
```
|
||||||
|
|
||||||
|
如果在多客户端情况下出现元数据不同步的情况,可以用这条命令强制清空客户端缓存,随后客户端会从服务端拉取最新的元数据。
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
title: 参考指南
|
title: 参考手册
|
||||||
---
|
---
|
||||||
|
|
||||||
参考指南是对 TDengine 本身、 TDengine 各语言连接器及自带的工具最详细的介绍。
|
参考手册是对 TDengine 本身、 TDengine 各语言连接器及自带的工具最详细的介绍。
|
||||||
|
|
||||||
```mdx-code-block
|
```mdx-code-block
|
||||||
import DocCardList from '@theme/DocCardList';
|
import DocCardList from '@theme/DocCardList';
|
||||||
|
|
|
@ -29,7 +29,7 @@ static void msg_process(TAOS_RES* msg) {
|
||||||
printf("vg: %d\n", tmq_get_vgroup_id(msg));
|
printf("vg: %d\n", tmq_get_vgroup_id(msg));
|
||||||
if (tmq_get_res_type(msg) == TMQ_RES_TABLE_META) {
|
if (tmq_get_res_type(msg) == TMQ_RES_TABLE_META) {
|
||||||
tmq_raw_data raw = {0};
|
tmq_raw_data raw = {0};
|
||||||
int32_t code = tmq_get_raw_meta(msg, &raw);
|
int32_t code = tmq_get_raw(msg, &raw);
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
TAOS* pConn = taos_connect("192.168.1.86", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("192.168.1.86", "root", "taosdata", NULL, 0);
|
||||||
if (pConn == NULL) {
|
if (pConn == NULL) {
|
||||||
|
@ -50,7 +50,7 @@ static void msg_process(TAOS_RES* msg) {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
int32_t ret = taos_write_raw_meta(pConn, raw);
|
int32_t ret = tmq_write_raw(pConn, raw);
|
||||||
printf("write raw data: %s\n", tmq_err2str(ret));
|
printf("write raw data: %s\n", tmq_err2str(ret));
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,18 +49,25 @@ static void msg_process(TAOS_RES* msg) {
|
||||||
printf("meta result: %s\n", result);
|
printf("meta result: %s\n", result);
|
||||||
}
|
}
|
||||||
tmq_free_json_meta(result);
|
tmq_free_json_meta(result);
|
||||||
|
|
||||||
|
|
||||||
tmq_raw_data raw = {0};
|
|
||||||
tmq_get_raw_meta(msg, &raw);
|
|
||||||
int32_t ret = taos_write_raw_meta(pConn, raw);
|
|
||||||
printf("write raw meta: %s\n", tmq_err2str(ret));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tmq_get_res_type(msg) == TMQ_RES_DATA){
|
tmq_raw_data raw = {0};
|
||||||
int32_t ret =taos_write_raw_data(pConn, msg);
|
tmq_get_raw(msg, &raw);
|
||||||
printf("write raw data: %s\n", tmq_err2str(ret));
|
int32_t ret = tmq_write_raw(pConn, raw);
|
||||||
}
|
printf("write raw data: %s\n", tmq_err2str(ret));
|
||||||
|
|
||||||
|
// else{
|
||||||
|
// while(1){
|
||||||
|
// int numOfRows = 0;
|
||||||
|
// void *pData = NULL;
|
||||||
|
// taos_fetch_raw_block(msg, &numOfRows, &pData);
|
||||||
|
// if(numOfRows == 0) break;
|
||||||
|
// printf("write data: tbname:%s, numOfRows:%d\n", tmq_get_table_name(msg), numOfRows);
|
||||||
|
// int ret = taos_write_raw_block(pConn, numOfRows, pData, tmq_get_table_name(msg));
|
||||||
|
// printf("write raw data: %s\n", tmq_err2str(ret));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +128,7 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "insert into ct0 values(now, 1, 2, 'a')");
|
pRes = taos_query(pConn, "insert into ct0 values(1626006833600, 1, 2, 'a')");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to insert into ct0, reason:%s\n", taos_errstr(pRes));
|
printf("failed to insert into ct0, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -142,7 +149,7 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "insert into ct1 values(now, 3, 4, 'b')");
|
pRes = taos_query(pConn, "insert into ct1 values(1626006833600, 3, 4, 'b')");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to insert into ct1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to insert into ct1, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -156,7 +163,7 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "insert into ct3 values(now, 5, 6, 'c') ct1 values(now+1s, 2, 3, 'sds') (now+2s, 4, 5, 'ddd') ct0 values(now+1s, 4, 3, 'hwj') ct1 values(now+5s, 23, 32, 's21ds')");
|
pRes = taos_query(pConn, "insert into ct3 values(1626006833600, 5, 6, 'c') ct1 values(1626006833601, 2, 3, 'sds') (1626006833602, 4, 5, 'ddd') ct0 values(1626006833602, 4, 3, 'hwj') ct1 values(now+5s, 23, 32, 's21ds')");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -177,7 +184,14 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "insert into ct3 values(now+7s, 53, 63, 'cffffffffffffffffffffffffffff', 8989898899999) (now+9s, 51, 62, 'c333', 940)");
|
pRes = taos_query(pConn, "insert into ct3 values(1626006833605, 53, 63, 'cffffffffffffffffffffffffffff', 8989898899999) (1626006833609, 51, 62, 'c333', 940)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into ct3 select * from ct1");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -198,19 +212,26 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
// pRes = taos_query(pConn, "drop table ct3 ct1");
|
pRes = taos_query(pConn, "delete from abc1 .ct3 where ts < 1626006833606");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to drop child table ct3, reason:%s\n", taos_errstr(pRes));
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
// return -1;
|
return -1;
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "drop table st1");
|
pRes = taos_query(pConn, "drop table ct3 ct1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to drop super table st1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to drop child table ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
// return -1;
|
return -1;
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "drop table st1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to drop super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table if not exists n1(ts timestamp, c1 int, c2 nchar(4))");
|
pRes = taos_query(pConn, "create table if not exists n1(ts timestamp, c1 int, c2 nchar(4))");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
|
@ -261,12 +282,12 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
// pRes = taos_query(pConn, "drop table n1");
|
pRes = taos_query(pConn, "drop table n1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to drop normal table n1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to drop normal table n1, reason:%s\n", taos_errstr(pRes));
|
||||||
// return -1;
|
return -1;
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table jt(ts timestamp, i int) tags(t json)");
|
pRes = taos_query(pConn, "create table jt(ts timestamp, i int) tags(t json)");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
|
@ -289,21 +310,21 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
// pRes = taos_query(pConn,
|
pRes = taos_query(pConn,
|
||||||
// "create stable if not exists st1 (ts timestamp, c1 int, c2 float, c3 binary(16)) tags(t1 int, t3 "
|
"create stable if not exists st1 (ts timestamp, c1 int, c2 float, c3 binary(16)) tags(t1 int, t3 "
|
||||||
// "nchar(8), t4 bool)");
|
"nchar(8), t4 bool)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
// return -1;
|
return -1;
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "drop table st1");
|
pRes = taos_query(pConn, "drop table st1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to drop super table st1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to drop super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
// return -1;
|
return -1;
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -260,17 +260,20 @@ enum tmq_res_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct tmq_raw_data{
|
typedef struct tmq_raw_data{
|
||||||
void* raw_meta;
|
void* raw;
|
||||||
uint32_t raw_meta_len;
|
uint32_t raw_len;
|
||||||
uint16_t raw_meta_type;
|
uint16_t raw_type;
|
||||||
} tmq_raw_data;
|
} tmq_raw_data;
|
||||||
|
|
||||||
typedef enum tmq_res_t tmq_res_t;
|
typedef enum tmq_res_t tmq_res_t;
|
||||||
|
|
||||||
DLL_EXPORT tmq_res_t tmq_get_res_type(TAOS_RES *res);
|
DLL_EXPORT tmq_res_t tmq_get_res_type(TAOS_RES *res);
|
||||||
DLL_EXPORT int32_t tmq_get_raw_meta(TAOS_RES *res, tmq_raw_data *raw_meta);
|
DLL_EXPORT int32_t tmq_get_raw(TAOS_RES *res, tmq_raw_data *raw);
|
||||||
DLL_EXPORT int32_t taos_write_raw_meta(TAOS *taos, tmq_raw_data raw_meta);
|
DLL_EXPORT int32_t tmq_write_raw(TAOS *taos, tmq_raw_data raw);
|
||||||
DLL_EXPORT int32_t taos_write_raw_data(TAOS *taos, TAOS_RES *res);
|
DLL_EXPORT int taos_write_raw_block(TAOS *taos, int numOfRows, char *pData, const char* tbname);
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORT void tmq_free_raw(tmq_raw_data raw);
|
||||||
DLL_EXPORT char *tmq_get_json_meta(TAOS_RES *res); // Returning null means error. Returned result need to be freed by tmq_free_json_meta
|
DLL_EXPORT char *tmq_get_json_meta(TAOS_RES *res); // Returning null means error. Returned result need to be freed by tmq_free_json_meta
|
||||||
DLL_EXPORT void tmq_free_json_meta(char* jsonMeta);
|
DLL_EXPORT void tmq_free_json_meta(char* jsonMeta);
|
||||||
DLL_EXPORT const char *tmq_get_topic_name(TAOS_RES *res);
|
DLL_EXPORT const char *tmq_get_topic_name(TAOS_RES *res);
|
||||||
|
|
|
@ -40,6 +40,7 @@ enum {
|
||||||
|| x == TDMT_VND_CREATE_TABLE \
|
|| x == TDMT_VND_CREATE_TABLE \
|
||||||
|| x == TDMT_VND_ALTER_TABLE \
|
|| x == TDMT_VND_ALTER_TABLE \
|
||||||
|| x == TDMT_VND_DROP_TABLE \
|
|| x == TDMT_VND_DROP_TABLE \
|
||||||
|
|| x == TDMT_VND_DELETE \
|
||||||
)
|
)
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -737,7 +737,7 @@ typedef struct {
|
||||||
int32_t daysToKeep2;
|
int32_t daysToKeep2;
|
||||||
int32_t minRows;
|
int32_t minRows;
|
||||||
int32_t maxRows;
|
int32_t maxRows;
|
||||||
int32_t fsyncPeriod;
|
int32_t walFsyncPeriod;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t precision; // time resolution
|
int8_t precision; // time resolution
|
||||||
int8_t compression;
|
int8_t compression;
|
||||||
|
@ -749,9 +749,9 @@ typedef struct {
|
||||||
int32_t numOfRetensions;
|
int32_t numOfRetensions;
|
||||||
SArray* pRetensions; // SRetention
|
SArray* pRetensions; // SRetention
|
||||||
int32_t walRetentionPeriod;
|
int32_t walRetentionPeriod;
|
||||||
int32_t walRetentionSize;
|
int64_t walRetentionSize;
|
||||||
int32_t walRollPeriod;
|
int32_t walRollPeriod;
|
||||||
int32_t walSegmentSize;
|
int64_t walSegmentSize;
|
||||||
} SCreateDbReq;
|
} SCreateDbReq;
|
||||||
|
|
||||||
int32_t tSerializeSCreateDbReq(void* buf, int32_t bufLen, SCreateDbReq* pReq);
|
int32_t tSerializeSCreateDbReq(void* buf, int32_t bufLen, SCreateDbReq* pReq);
|
||||||
|
@ -768,7 +768,7 @@ typedef struct {
|
||||||
int32_t daysToKeep0;
|
int32_t daysToKeep0;
|
||||||
int32_t daysToKeep1;
|
int32_t daysToKeep1;
|
||||||
int32_t daysToKeep2;
|
int32_t daysToKeep2;
|
||||||
int32_t fsyncPeriod;
|
int32_t walFsyncPeriod;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t strict;
|
int8_t strict;
|
||||||
int8_t cacheLast;
|
int8_t cacheLast;
|
||||||
|
@ -859,7 +859,7 @@ typedef struct {
|
||||||
int32_t daysToKeep2;
|
int32_t daysToKeep2;
|
||||||
int32_t minRows;
|
int32_t minRows;
|
||||||
int32_t maxRows;
|
int32_t maxRows;
|
||||||
int32_t fsyncPeriod;
|
int32_t walFsyncPeriod;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t precision;
|
int8_t precision;
|
||||||
int8_t compression;
|
int8_t compression;
|
||||||
|
@ -1137,7 +1137,7 @@ typedef struct {
|
||||||
int32_t daysToKeep2;
|
int32_t daysToKeep2;
|
||||||
int32_t minRows;
|
int32_t minRows;
|
||||||
int32_t maxRows;
|
int32_t maxRows;
|
||||||
int32_t fsyncPeriod;
|
int32_t walFsyncPeriod;
|
||||||
uint32_t hashBegin;
|
uint32_t hashBegin;
|
||||||
uint32_t hashEnd;
|
uint32_t hashEnd;
|
||||||
int8_t hashMethod;
|
int8_t hashMethod;
|
||||||
|
@ -1192,7 +1192,7 @@ typedef struct {
|
||||||
int32_t daysToKeep0;
|
int32_t daysToKeep0;
|
||||||
int32_t daysToKeep1;
|
int32_t daysToKeep1;
|
||||||
int32_t daysToKeep2;
|
int32_t daysToKeep2;
|
||||||
int32_t fsyncPeriod;
|
int32_t walFsyncPeriod;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t strict;
|
int8_t strict;
|
||||||
int8_t cacheLast;
|
int8_t cacheLast;
|
||||||
|
@ -3044,6 +3044,7 @@ typedef struct SDeleteRes {
|
||||||
int64_t skey;
|
int64_t skey;
|
||||||
int64_t ekey;
|
int64_t ekey;
|
||||||
int64_t affectedRows;
|
int64_t affectedRows;
|
||||||
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
} SDeleteRes;
|
} SDeleteRes;
|
||||||
|
|
||||||
int32_t tEncodeDeleteRes(SEncoder* pCoder, const SDeleteRes* pRes);
|
int32_t tEncodeDeleteRes(SEncoder* pCoder, const SDeleteRes* pRes);
|
||||||
|
|
|
@ -84,20 +84,20 @@
|
||||||
#define TK_COMP 66
|
#define TK_COMP 66
|
||||||
#define TK_DURATION 67
|
#define TK_DURATION 67
|
||||||
#define TK_NK_VARIABLE 68
|
#define TK_NK_VARIABLE 68
|
||||||
#define TK_FSYNC 69
|
#define TK_MAXROWS 69
|
||||||
#define TK_MAXROWS 70
|
#define TK_MINROWS 70
|
||||||
#define TK_MINROWS 71
|
#define TK_KEEP 71
|
||||||
#define TK_KEEP 72
|
#define TK_PAGES 72
|
||||||
#define TK_PAGES 73
|
#define TK_PAGESIZE 73
|
||||||
#define TK_PAGESIZE 74
|
#define TK_PRECISION 74
|
||||||
#define TK_PRECISION 75
|
#define TK_REPLICA 75
|
||||||
#define TK_REPLICA 76
|
#define TK_STRICT 76
|
||||||
#define TK_STRICT 77
|
#define TK_VGROUPS 77
|
||||||
#define TK_WAL 78
|
#define TK_SINGLE_STABLE 78
|
||||||
#define TK_VGROUPS 79
|
#define TK_RETENTIONS 79
|
||||||
#define TK_SINGLE_STABLE 80
|
#define TK_SCHEMALESS 80
|
||||||
#define TK_RETENTIONS 81
|
#define TK_WAL_LEVEL 81
|
||||||
#define TK_SCHEMALESS 82
|
#define TK_WAL_FSYNC_PERIOD 82
|
||||||
#define TK_WAL_RETENTION_PERIOD 83
|
#define TK_WAL_RETENTION_PERIOD 83
|
||||||
#define TK_WAL_RETENTION_SIZE 84
|
#define TK_WAL_RETENTION_SIZE 84
|
||||||
#define TK_WAL_ROLL_PERIOD 85
|
#define TK_WAL_ROLL_PERIOD 85
|
||||||
|
@ -188,93 +188,90 @@
|
||||||
#define TK_NK_BOOL 170
|
#define TK_NK_BOOL 170
|
||||||
#define TK_RATIO 171
|
#define TK_RATIO 171
|
||||||
#define TK_NK_FLOAT 172
|
#define TK_NK_FLOAT 172
|
||||||
#define TK_COMPACT 173
|
#define TK_OUTPUTTYPE 173
|
||||||
#define TK_VNODES 174
|
#define TK_AGGREGATE 174
|
||||||
#define TK_IN 175
|
#define TK_BUFSIZE 175
|
||||||
#define TK_OUTPUTTYPE 176
|
#define TK_STREAM 176
|
||||||
#define TK_AGGREGATE 177
|
#define TK_INTO 177
|
||||||
#define TK_BUFSIZE 178
|
#define TK_TRIGGER 178
|
||||||
#define TK_STREAM 179
|
#define TK_AT_ONCE 179
|
||||||
#define TK_INTO 180
|
#define TK_WINDOW_CLOSE 180
|
||||||
#define TK_TRIGGER 181
|
#define TK_IGNORE 181
|
||||||
#define TK_AT_ONCE 182
|
#define TK_EXPIRED 182
|
||||||
#define TK_WINDOW_CLOSE 183
|
#define TK_KILL 183
|
||||||
#define TK_IGNORE 184
|
#define TK_CONNECTION 184
|
||||||
#define TK_EXPIRED 185
|
#define TK_TRANSACTION 185
|
||||||
#define TK_KILL 186
|
#define TK_BALANCE 186
|
||||||
#define TK_CONNECTION 187
|
#define TK_VGROUP 187
|
||||||
#define TK_TRANSACTION 188
|
#define TK_MERGE 188
|
||||||
#define TK_BALANCE 189
|
#define TK_REDISTRIBUTE 189
|
||||||
#define TK_VGROUP 190
|
#define TK_SPLIT 190
|
||||||
#define TK_MERGE 191
|
#define TK_DELETE 191
|
||||||
#define TK_REDISTRIBUTE 192
|
#define TK_INSERT 192
|
||||||
#define TK_SPLIT 193
|
#define TK_NULL 193
|
||||||
#define TK_SYNCDB 194
|
#define TK_NK_QUESTION 194
|
||||||
#define TK_DELETE 195
|
#define TK_NK_ARROW 195
|
||||||
#define TK_INSERT 196
|
#define TK_ROWTS 196
|
||||||
#define TK_NULL 197
|
#define TK_TBNAME 197
|
||||||
#define TK_NK_QUESTION 198
|
#define TK_QSTART 198
|
||||||
#define TK_NK_ARROW 199
|
#define TK_QEND 199
|
||||||
#define TK_ROWTS 200
|
#define TK_QDURATION 200
|
||||||
#define TK_TBNAME 201
|
#define TK_WSTART 201
|
||||||
#define TK_QSTART 202
|
#define TK_WEND 202
|
||||||
#define TK_QEND 203
|
#define TK_WDURATION 203
|
||||||
#define TK_QDURATION 204
|
#define TK_CAST 204
|
||||||
#define TK_WSTART 205
|
#define TK_NOW 205
|
||||||
#define TK_WEND 206
|
#define TK_TODAY 206
|
||||||
#define TK_WDURATION 207
|
#define TK_TIMEZONE 207
|
||||||
#define TK_CAST 208
|
#define TK_CLIENT_VERSION 208
|
||||||
#define TK_NOW 209
|
#define TK_SERVER_VERSION 209
|
||||||
#define TK_TODAY 210
|
#define TK_SERVER_STATUS 210
|
||||||
#define TK_TIMEZONE 211
|
#define TK_CURRENT_USER 211
|
||||||
#define TK_CLIENT_VERSION 212
|
#define TK_COUNT 212
|
||||||
#define TK_SERVER_VERSION 213
|
#define TK_LAST_ROW 213
|
||||||
#define TK_SERVER_STATUS 214
|
#define TK_BETWEEN 214
|
||||||
#define TK_CURRENT_USER 215
|
#define TK_IS 215
|
||||||
#define TK_COUNT 216
|
#define TK_NK_LT 216
|
||||||
#define TK_LAST_ROW 217
|
#define TK_NK_GT 217
|
||||||
#define TK_BETWEEN 218
|
#define TK_NK_LE 218
|
||||||
#define TK_IS 219
|
#define TK_NK_GE 219
|
||||||
#define TK_NK_LT 220
|
#define TK_NK_NE 220
|
||||||
#define TK_NK_GT 221
|
#define TK_MATCH 221
|
||||||
#define TK_NK_LE 222
|
#define TK_NMATCH 222
|
||||||
#define TK_NK_GE 223
|
#define TK_CONTAINS 223
|
||||||
#define TK_NK_NE 224
|
#define TK_IN 224
|
||||||
#define TK_MATCH 225
|
#define TK_JOIN 225
|
||||||
#define TK_NMATCH 226
|
#define TK_INNER 226
|
||||||
#define TK_CONTAINS 227
|
#define TK_SELECT 227
|
||||||
#define TK_JOIN 228
|
#define TK_DISTINCT 228
|
||||||
#define TK_INNER 229
|
#define TK_WHERE 229
|
||||||
#define TK_SELECT 230
|
#define TK_PARTITION 230
|
||||||
#define TK_DISTINCT 231
|
#define TK_BY 231
|
||||||
#define TK_WHERE 232
|
#define TK_SESSION 232
|
||||||
#define TK_PARTITION 233
|
#define TK_STATE_WINDOW 233
|
||||||
#define TK_BY 234
|
#define TK_SLIDING 234
|
||||||
#define TK_SESSION 235
|
#define TK_FILL 235
|
||||||
#define TK_STATE_WINDOW 236
|
#define TK_VALUE 236
|
||||||
#define TK_SLIDING 237
|
#define TK_NONE 237
|
||||||
#define TK_FILL 238
|
#define TK_PREV 238
|
||||||
#define TK_VALUE 239
|
#define TK_LINEAR 239
|
||||||
#define TK_NONE 240
|
#define TK_NEXT 240
|
||||||
#define TK_PREV 241
|
#define TK_HAVING 241
|
||||||
#define TK_LINEAR 242
|
#define TK_RANGE 242
|
||||||
#define TK_NEXT 243
|
#define TK_EVERY 243
|
||||||
#define TK_HAVING 244
|
#define TK_ORDER 244
|
||||||
#define TK_RANGE 245
|
#define TK_SLIMIT 245
|
||||||
#define TK_EVERY 246
|
#define TK_SOFFSET 246
|
||||||
#define TK_ORDER 247
|
#define TK_LIMIT 247
|
||||||
#define TK_SLIMIT 248
|
#define TK_OFFSET 248
|
||||||
#define TK_SOFFSET 249
|
#define TK_ASC 249
|
||||||
#define TK_LIMIT 250
|
#define TK_NULLS 250
|
||||||
#define TK_OFFSET 251
|
#define TK_ID 251
|
||||||
#define TK_ASC 252
|
#define TK_NK_BITNOT 252
|
||||||
#define TK_NULLS 253
|
#define TK_VALUES 253
|
||||||
#define TK_ID 254
|
#define TK_IMPORT 254
|
||||||
#define TK_NK_BITNOT 255
|
#define TK_NK_SEMI 255
|
||||||
#define TK_VALUES 256
|
#define TK_FILE 256
|
||||||
#define TK_IMPORT 257
|
|
||||||
#define TK_NK_SEMI 258
|
|
||||||
#define TK_FILE 259
|
|
||||||
|
|
||||||
#define TK_NK_SPACE 300
|
#define TK_NK_SPACE 300
|
||||||
#define TK_NK_COMMENT 301
|
#define TK_NK_COMMENT 301
|
||||||
|
|
|
@ -38,6 +38,7 @@ typedef struct SDeleterRes {
|
||||||
int64_t skey;
|
int64_t skey;
|
||||||
int64_t ekey;
|
int64_t ekey;
|
||||||
int64_t affectedRows;
|
int64_t affectedRows;
|
||||||
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
} SDeleterRes;
|
} SDeleterRes;
|
||||||
|
|
||||||
typedef struct SDeleterParam {
|
typedef struct SDeleterParam {
|
||||||
|
|
|
@ -328,6 +328,7 @@ typedef struct STableScanPhysiNode {
|
||||||
int8_t triggerType;
|
int8_t triggerType;
|
||||||
int64_t watermark;
|
int64_t watermark;
|
||||||
int8_t igExpired;
|
int8_t igExpired;
|
||||||
|
bool assignBlockUid;
|
||||||
} STableScanPhysiNode;
|
} STableScanPhysiNode;
|
||||||
|
|
||||||
typedef STableScanPhysiNode STableSeqScanPhysiNode;
|
typedef STableScanPhysiNode STableSeqScanPhysiNode;
|
||||||
|
@ -503,6 +504,7 @@ typedef struct SDataDeleterNode {
|
||||||
uint64_t tableId;
|
uint64_t tableId;
|
||||||
int8_t tableType; // table type
|
int8_t tableType; // table type
|
||||||
char tableFName[TSDB_TABLE_FNAME_LEN];
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
char tsColName[TSDB_COL_NAME_LEN];
|
||||||
STimeWindow deleteTimeRange;
|
STimeWindow deleteTimeRange;
|
||||||
SNode* pAffectedRows;
|
SNode* pAffectedRows;
|
||||||
} SDataDeleterNode;
|
} SDataDeleterNode;
|
||||||
|
|
|
@ -375,6 +375,7 @@ typedef struct SQuery {
|
||||||
int8_t precision;
|
int8_t precision;
|
||||||
SCmdMsgInfo* pCmdMsg;
|
SCmdMsgInfo* pCmdMsg;
|
||||||
int32_t msgType;
|
int32_t msgType;
|
||||||
|
SArray* pTargetTableList;
|
||||||
SArray* pTableList;
|
SArray* pTableList;
|
||||||
SArray* pDbList;
|
SArray* pDbList;
|
||||||
bool showRewrite;
|
bool showRewrite;
|
||||||
|
|
|
@ -251,8 +251,8 @@ extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t
|
||||||
(_code) == TSDB_CODE_APP_NOT_READY || (_code) == TSDB_CODE_RPC_BROKEN_LINK)
|
(_code) == TSDB_CODE_APP_NOT_READY || (_code) == TSDB_CODE_RPC_BROKEN_LINK)
|
||||||
|
|
||||||
#define NEED_CLIENT_RM_TBLMETA_REQ(_type) \
|
#define NEED_CLIENT_RM_TBLMETA_REQ(_type) \
|
||||||
((_type) == TDMT_VND_CREATE_TABLE || (_type) == TDMT_VND_CREATE_STB || (_type) == TDMT_VND_DROP_TABLE || \
|
((_type) == TDMT_VND_CREATE_TABLE || (_type) == TDMT_MND_CREATE_STB || (_type) == TDMT_VND_DROP_TABLE || \
|
||||||
(_type) == TDMT_VND_DROP_STB)
|
(_type) == TDMT_MND_DROP_STB)
|
||||||
|
|
||||||
#define NEED_SCHEDULER_REDIRECT_ERROR(_code) \
|
#define NEED_SCHEDULER_REDIRECT_ERROR(_code) \
|
||||||
((_code) == TSDB_CODE_RPC_REDIRECT || (_code) == TSDB_CODE_NODE_NOT_DEPLOYED || \
|
((_code) == TSDB_CODE_RPC_REDIRECT || (_code) == TSDB_CODE_NODE_NOT_DEPLOYED || \
|
||||||
|
|
|
@ -171,8 +171,8 @@ typedef struct {
|
||||||
} STaskDispatcherFixedEp;
|
} STaskDispatcherFixedEp;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// int8_t hashMethod;
|
|
||||||
char stbFullName[TSDB_TABLE_FNAME_LEN];
|
char stbFullName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
int32_t waitingRspCnt;
|
||||||
SUseDbRsp dbInfo;
|
SUseDbRsp dbInfo;
|
||||||
} STaskDispatcherShuffle;
|
} STaskDispatcherShuffle;
|
||||||
|
|
||||||
|
|
|
@ -192,6 +192,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_MND_NO_USER_FROM_CONN TAOS_DEF_ERROR_CODE(0, 0x0354)
|
#define TSDB_CODE_MND_NO_USER_FROM_CONN TAOS_DEF_ERROR_CODE(0, 0x0354)
|
||||||
#define TSDB_CODE_MND_TOO_MANY_USERS TAOS_DEF_ERROR_CODE(0, 0x0355)
|
#define TSDB_CODE_MND_TOO_MANY_USERS TAOS_DEF_ERROR_CODE(0, 0x0355)
|
||||||
#define TSDB_CODE_MND_INVALID_ALTER_OPER TAOS_DEF_ERROR_CODE(0, 0x0356)
|
#define TSDB_CODE_MND_INVALID_ALTER_OPER TAOS_DEF_ERROR_CODE(0, 0x0356)
|
||||||
|
#define TSDB_CODE_MND_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0357)
|
||||||
|
|
||||||
// mnode-stable-part1
|
// mnode-stable-part1
|
||||||
#define TSDB_CODE_MND_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360)
|
#define TSDB_CODE_MND_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360)
|
||||||
|
@ -512,7 +513,6 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_PAR_ONLY_ONE_JSON_TAG TAOS_DEF_ERROR_CODE(0, 0x2633)
|
#define TSDB_CODE_PAR_ONLY_ONE_JSON_TAG TAOS_DEF_ERROR_CODE(0, 0x2633)
|
||||||
#define TSDB_CODE_PAR_INCORRECT_NUM_OF_COL TAOS_DEF_ERROR_CODE(0, 0x2634)
|
#define TSDB_CODE_PAR_INCORRECT_NUM_OF_COL TAOS_DEF_ERROR_CODE(0, 0x2634)
|
||||||
#define TSDB_CODE_PAR_INCORRECT_TIMESTAMP_VAL TAOS_DEF_ERROR_CODE(0, 0x2635)
|
#define TSDB_CODE_PAR_INCORRECT_TIMESTAMP_VAL TAOS_DEF_ERROR_CODE(0, 0x2635)
|
||||||
#define TSDB_CODE_PAR_INVALID_DAYS_VALUE TAOS_DEF_ERROR_CODE(0, 0x2636)
|
|
||||||
#define TSDB_CODE_PAR_OFFSET_LESS_ZERO TAOS_DEF_ERROR_CODE(0, 0x2637)
|
#define TSDB_CODE_PAR_OFFSET_LESS_ZERO TAOS_DEF_ERROR_CODE(0, 0x2637)
|
||||||
#define TSDB_CODE_PAR_SLIMIT_LEAK_PARTITION_BY TAOS_DEF_ERROR_CODE(0, 0x2638)
|
#define TSDB_CODE_PAR_SLIMIT_LEAK_PARTITION_BY TAOS_DEF_ERROR_CODE(0, 0x2638)
|
||||||
#define TSDB_CODE_PAR_INVALID_TOPIC_QUERY TAOS_DEF_ERROR_CODE(0, 0x2639)
|
#define TSDB_CODE_PAR_INVALID_TOPIC_QUERY TAOS_DEF_ERROR_CODE(0, 0x2639)
|
||||||
|
|
|
@ -222,6 +222,7 @@ typedef struct SRequestObj {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
SArray* dbList;
|
SArray* dbList;
|
||||||
SArray* tableList;
|
SArray* tableList;
|
||||||
|
SArray* targetTableList;
|
||||||
SQueryExecMetric metric;
|
SQueryExecMetric metric;
|
||||||
SRequestSendRecvBody body;
|
SRequestSendRecvBody body;
|
||||||
bool syncQuery; // todo refactor: async query object
|
bool syncQuery; // todo refactor: async query object
|
||||||
|
|
|
@ -235,6 +235,7 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtC
|
||||||
if (TSDB_CODE_SUCCESS == code || NEED_CLIENT_HANDLE_ERROR(code)) {
|
if (TSDB_CODE_SUCCESS == code || NEED_CLIENT_HANDLE_ERROR(code)) {
|
||||||
TSWAP(pRequest->dbList, (*pQuery)->pDbList);
|
TSWAP(pRequest->dbList, (*pQuery)->pDbList);
|
||||||
TSWAP(pRequest->tableList, (*pQuery)->pTableList);
|
TSWAP(pRequest->tableList, (*pQuery)->pTableList);
|
||||||
|
TSWAP(pRequest->targetTableList, (*pQuery)->pTargetTableList);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -851,7 +852,7 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) {
|
||||||
|
|
||||||
tscDebug("schedulerExecCb request type %s", TMSG_INFO(pRequest->type));
|
tscDebug("schedulerExecCb request type %s", TMSG_INFO(pRequest->type));
|
||||||
if (NEED_CLIENT_RM_TBLMETA_REQ(pRequest->type)) {
|
if (NEED_CLIENT_RM_TBLMETA_REQ(pRequest->type)) {
|
||||||
removeMeta(pTscObj, pRequest->tableList);
|
removeMeta(pTscObj, pRequest->targetTableList);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return to client
|
// return to client
|
||||||
|
@ -1094,7 +1095,7 @@ SRequestObj* execQuery(uint64_t connId, const char* sql, int sqlLen, bool valida
|
||||||
} while (retryNum++ < REQUEST_TOTAL_EXEC_TIMES);
|
} while (retryNum++ < REQUEST_TOTAL_EXEC_TIMES);
|
||||||
|
|
||||||
if (NEED_CLIENT_RM_TBLMETA_REQ(pRequest->type)) {
|
if (NEED_CLIENT_RM_TBLMETA_REQ(pRequest->type)) {
|
||||||
removeMeta(pRequest->pTscObj, pRequest->tableList);
|
removeMeta(pRequest->pTscObj, pRequest->targetTableList);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pRequest;
|
return pRequest;
|
||||||
|
|
|
@ -687,6 +687,7 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
|
||||||
|
|
||||||
TSWAP(pRequest->dbList, (pQuery)->pDbList);
|
TSWAP(pRequest->dbList, (pQuery)->pDbList);
|
||||||
TSWAP(pRequest->tableList, (pQuery)->pTableList);
|
TSWAP(pRequest->tableList, (pQuery)->pTableList);
|
||||||
|
TSWAP(pRequest->targetTableList, (pQuery)->pTargetTableList);
|
||||||
|
|
||||||
destorySqlParseWrapper(pWrapper);
|
destorySqlParseWrapper(pWrapper);
|
||||||
|
|
||||||
|
|
|
@ -693,6 +693,7 @@ int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) {
|
||||||
|
|
||||||
TSWAP(pStmt->exec.pRequest->dbList, pStmt->sql.pQuery->pDbList);
|
TSWAP(pStmt->exec.pRequest->dbList, pStmt->sql.pQuery->pDbList);
|
||||||
TSWAP(pStmt->exec.pRequest->tableList, pStmt->sql.pQuery->pTableList);
|
TSWAP(pStmt->exec.pRequest->tableList, pStmt->sql.pQuery->pTableList);
|
||||||
|
TSWAP(pStmt->exec.pRequest->targetTableList, pStmt->sql.pQuery->pTargetTableList);
|
||||||
|
|
||||||
// if (STMT_TYPE_QUERY == pStmt->sql.queryRes) {
|
// if (STMT_TYPE_QUERY == pStmt->sql.queryRes) {
|
||||||
// STMT_ERR_RET(stmtRestoreQueryFields(pStmt));
|
// STMT_ERR_RET(stmtRestoreQueryFields(pStmt));
|
||||||
|
|
|
@ -1206,6 +1206,7 @@ int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
SDecoder decoder;
|
SDecoder decoder;
|
||||||
tDecoderInit(&decoder, POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), pMsg->len - sizeof(SMqRspHead));
|
tDecoderInit(&decoder, POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), pMsg->len - sizeof(SMqRspHead));
|
||||||
tDecodeSMqDataRsp(&decoder, &pRspWrapper->dataRsp);
|
tDecodeSMqDataRsp(&decoder, &pRspWrapper->dataRsp);
|
||||||
|
tDecoderClear(&decoder);
|
||||||
memcpy(&pRspWrapper->dataRsp, pMsg->pData, sizeof(SMqRspHead));
|
memcpy(&pRspWrapper->dataRsp, pMsg->pData, sizeof(SMqRspHead));
|
||||||
} else {
|
} else {
|
||||||
ASSERT(rspType == TMQ_MSG_TYPE__POLL_META_RSP);
|
ASSERT(rspType == TMQ_MSG_TYPE__POLL_META_RSP);
|
||||||
|
@ -1859,6 +1860,10 @@ tmq_res_t tmq_get_res_type(TAOS_RES* res) {
|
||||||
if (TD_RES_TMQ(res)) {
|
if (TD_RES_TMQ(res)) {
|
||||||
return TMQ_RES_DATA;
|
return TMQ_RES_DATA;
|
||||||
} else if (TD_RES_TMQ_META(res)) {
|
} else if (TD_RES_TMQ_META(res)) {
|
||||||
|
SMqMetaRspObj* pMetaRspObj = (SMqMetaRspObj*)res;
|
||||||
|
if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_DELETE) {
|
||||||
|
return TMQ_RES_DATA;
|
||||||
|
}
|
||||||
return TMQ_RES_TABLE_META;
|
return TMQ_RES_TABLE_META;
|
||||||
} else {
|
} else {
|
||||||
return TMQ_RES_INVALID;
|
return TMQ_RES_INVALID;
|
||||||
|
@ -1913,17 +1918,6 @@ const char* tmq_get_table_name(TAOS_RES* res) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tmq_get_raw_meta(TAOS_RES* res, tmq_raw_data *raw) {
|
|
||||||
if (TD_RES_TMQ_META(res) && raw) {
|
|
||||||
SMqMetaRspObj* pMetaRspObj = (SMqMetaRspObj*)res;
|
|
||||||
raw->raw_meta = pMetaRspObj->metaRsp.metaRsp;
|
|
||||||
raw->raw_meta_len = pMetaRspObj->metaRsp.metaRspLen;
|
|
||||||
raw->raw_meta_type = pMetaRspObj->metaRsp.resMsgType;
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
return TSDB_CODE_INVALID_PARA;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char* buildCreateTableJson(SSchemaWrapper* schemaRow, SSchemaWrapper* schemaTag, char* name, int64_t id,
|
static char* buildCreateTableJson(SSchemaWrapper* schemaRow, SSchemaWrapper* schemaTag, char* name, int64_t id,
|
||||||
int8_t t) {
|
int8_t t) {
|
||||||
char* string = NULL;
|
char* string = NULL;
|
||||||
|
@ -2436,30 +2430,6 @@ _exit:
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* tmq_get_json_meta(TAOS_RES* res) {
|
|
||||||
if (!TD_RES_TMQ_META(res)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMqMetaRspObj* pMetaRspObj = (SMqMetaRspObj*)res;
|
|
||||||
if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_CREATE_STB) {
|
|
||||||
return processCreateStb(&pMetaRspObj->metaRsp);
|
|
||||||
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_ALTER_STB) {
|
|
||||||
return processAlterStb(&pMetaRspObj->metaRsp);
|
|
||||||
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_DROP_STB) {
|
|
||||||
return processDropSTable(&pMetaRspObj->metaRsp);
|
|
||||||
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_CREATE_TABLE) {
|
|
||||||
return processCreateTable(&pMetaRspObj->metaRsp);
|
|
||||||
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_ALTER_TABLE) {
|
|
||||||
return processAlterTable(&pMetaRspObj->metaRsp);
|
|
||||||
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_DROP_TABLE) {
|
|
||||||
return processDropTable(&pMetaRspObj->metaRsp);
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tmq_free_json_meta(char* jsonMeta) { taosMemoryFreeClear(jsonMeta); }
|
|
||||||
|
|
||||||
static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) {
|
static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
SVCreateStbReq req = {0};
|
SVCreateStbReq req = {0};
|
||||||
SDecoder coder;
|
SDecoder coder;
|
||||||
|
@ -2531,6 +2501,13 @@ static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
pQuery.stableQuery = true;
|
pQuery.stableQuery = true;
|
||||||
|
|
||||||
launchQueryImpl(pRequest, &pQuery, true, NULL);
|
launchQueryImpl(pRequest, &pQuery, true, NULL);
|
||||||
|
|
||||||
|
if(pRequest->code == TSDB_CODE_SUCCESS){
|
||||||
|
SCatalog* pCatalog = NULL;
|
||||||
|
catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCatalog);
|
||||||
|
catalogRemoveTableMeta(pCatalog, &tableName);
|
||||||
|
}
|
||||||
|
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
taosMemoryFree(pCmdMsg.pMsg);
|
taosMemoryFree(pCmdMsg.pMsg);
|
||||||
|
|
||||||
|
@ -2572,7 +2549,7 @@ static int32_t taosDropStb(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
pReq.suid = req.suid;
|
pReq.suid = req.suid;
|
||||||
|
|
||||||
STscObj* pTscObj = pRequest->pTscObj;
|
STscObj* pTscObj = pRequest->pTscObj;
|
||||||
SName tableName;
|
SName tableName = {0};
|
||||||
tNameExtractFullName(toName(pTscObj->acctId, pRequest->pDb, req.name, &tableName), pReq.name);
|
tNameExtractFullName(toName(pTscObj->acctId, pRequest->pDb, req.name, &tableName), pReq.name);
|
||||||
|
|
||||||
SCmdMsgInfo pCmdMsg = {0};
|
SCmdMsgInfo pCmdMsg = {0};
|
||||||
|
@ -2593,6 +2570,13 @@ static int32_t taosDropStb(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
pQuery.stableQuery = true;
|
pQuery.stableQuery = true;
|
||||||
|
|
||||||
launchQueryImpl(pRequest, &pQuery, true, NULL);
|
launchQueryImpl(pRequest, &pQuery, true, NULL);
|
||||||
|
|
||||||
|
if(pRequest->code == TSDB_CODE_SUCCESS){
|
||||||
|
SCatalog* pCatalog = NULL;
|
||||||
|
catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCatalog);
|
||||||
|
catalogRemoveTableMeta(pCatalog, &tableName);
|
||||||
|
}
|
||||||
|
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
taosMemoryFree(pCmdMsg.pMsg);
|
taosMemoryFree(pCmdMsg.pMsg);
|
||||||
|
|
||||||
|
@ -2659,17 +2643,20 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
.requestObjRefId = pRequest->self,
|
.requestObjRefId = pRequest->self,
|
||||||
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
||||||
|
|
||||||
|
pRequest->tableList = taosArrayInit(req.nReqs, sizeof(SName));
|
||||||
// loop to create table
|
// loop to create table
|
||||||
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
||||||
pCreateReq = req.pReqs + iReq;
|
pCreateReq = req.pReqs + iReq;
|
||||||
|
|
||||||
SVgroupInfo pInfo = {0};
|
SVgroupInfo pInfo = {0};
|
||||||
SName pName;
|
SName pName = {0};
|
||||||
toName(pTscObj->acctId, pRequest->pDb, pCreateReq->name, &pName);
|
toName(pTscObj->acctId, pRequest->pDb, pCreateReq->name, &pName);
|
||||||
code = catalogGetTableHashVgroup(pCatalog, &conn, &pName, &pInfo);
|
code = catalogGetTableHashVgroup(pCatalog, &conn, &pName, &pInfo);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
taosArrayPush(pRequest->tableList, &pName);
|
||||||
|
|
||||||
SVgroupCreateTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pInfo.vgId, sizeof(pInfo.vgId));
|
SVgroupCreateTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pInfo.vgId, sizeof(pInfo.vgId));
|
||||||
if (pTableBatch == NULL) {
|
if (pTableBatch == NULL) {
|
||||||
|
@ -2703,8 +2690,11 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
launchQueryImpl(pRequest, pQuery, false, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
pQuery = NULL; // no need to free in the end
|
if (pRequest->code == TSDB_CODE_SUCCESS){
|
||||||
|
removeMeta(pTscObj, pRequest->tableList);
|
||||||
|
}
|
||||||
|
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
@ -2772,19 +2762,21 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
.requestObjRefId = pRequest->self,
|
.requestObjRefId = pRequest->self,
|
||||||
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
||||||
|
pRequest->tableList = taosArrayInit(req.nReqs, sizeof(SName));
|
||||||
// loop to create table
|
// loop to create table
|
||||||
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
||||||
pDropReq = req.pReqs + iReq;
|
pDropReq = req.pReqs + iReq;
|
||||||
pDropReq->igNotExists = true;
|
pDropReq->igNotExists = true;
|
||||||
|
|
||||||
SVgroupInfo pInfo = {0};
|
SVgroupInfo pInfo = {0};
|
||||||
SName pName;
|
SName pName = {0};
|
||||||
toName(pTscObj->acctId, pRequest->pDb, pDropReq->name, &pName);
|
toName(pTscObj->acctId, pRequest->pDb, pDropReq->name, &pName);
|
||||||
code = catalogGetTableHashVgroup(pCatalog, &conn, &pName, &pInfo);
|
code = catalogGetTableHashVgroup(pCatalog, &conn, &pName, &pInfo);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosArrayPush(pRequest->tableList, &pName);
|
||||||
SVgroupDropTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pInfo.vgId, sizeof(pInfo.vgId));
|
SVgroupDropTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pInfo.vgId, sizeof(pInfo.vgId));
|
||||||
if (pTableBatch == NULL) {
|
if (pTableBatch == NULL) {
|
||||||
SVgroupDropTableBatch tBatch = {0};
|
SVgroupDropTableBatch tBatch = {0};
|
||||||
|
@ -2815,8 +2807,10 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
launchQueryImpl(pRequest, pQuery, false, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
pQuery = NULL; // no need to free in the end
|
if (pRequest->code == TSDB_CODE_SUCCESS){
|
||||||
|
removeMeta(pTscObj, pRequest->tableList);
|
||||||
|
}
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
@ -2827,6 +2821,70 @@ end:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// delete from db.tabl where .. -> delete from tabl where ..
|
||||||
|
// delete from db .tabl where .. -> delete from tabl where ..
|
||||||
|
static void getTbName(char *sql){
|
||||||
|
char *ch = sql;
|
||||||
|
|
||||||
|
bool inBackQuote = false;
|
||||||
|
int8_t dotIndex = 0;
|
||||||
|
while(*ch != '\0'){
|
||||||
|
if(!inBackQuote && *ch == '`'){
|
||||||
|
inBackQuote = true;
|
||||||
|
ch++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(inBackQuote && *ch == '`'){
|
||||||
|
inBackQuote = false;
|
||||||
|
ch++;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!inBackQuote && *ch == '.'){
|
||||||
|
dotIndex ++;
|
||||||
|
if(dotIndex == 2){
|
||||||
|
memmove(sql, ch + 1, strlen(ch + 1) + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ch++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t taosDeleteData(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
|
SDeleteRes req = {0};
|
||||||
|
SDecoder coder = {0};
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
// decode and process req
|
||||||
|
void* data = POINTER_SHIFT(meta, sizeof(SMsgHead));
|
||||||
|
int32_t len = metaLen - sizeof(SMsgHead);
|
||||||
|
tDecoderInit(&coder, data, len);
|
||||||
|
if (tDecodeDeleteRes(&coder, &req) < 0) {
|
||||||
|
code = TSDB_CODE_INVALID_PARA;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTbName(req.tableFName);
|
||||||
|
char sql[256] = {0};
|
||||||
|
sprintf(sql, "delete from `%s` where `%s` >= %" PRId64" and `%s` <= %" PRId64, req.tableFName, "ts", req.skey, "ts", req.ekey);
|
||||||
|
printf("delete sql:%s\n", sql);
|
||||||
|
|
||||||
|
TAOS_RES* res = taos_query(taos, sql);
|
||||||
|
SRequestObj *pRequest = (SRequestObj *)res;
|
||||||
|
code = pRequest->code;
|
||||||
|
if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST) {
|
||||||
|
code = TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
taos_free_result(res);
|
||||||
|
|
||||||
|
end:
|
||||||
|
tDecoderClear(&coder);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
|
static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
SVAlterTbReq req = {0};
|
SVAlterTbReq req = {0};
|
||||||
SDecoder coder = {0};
|
SDecoder coder = {0};
|
||||||
|
@ -2914,15 +2972,21 @@ static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
launchQueryImpl(pRequest, pQuery, false, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
pQuery = NULL; // no need to free in the end
|
|
||||||
pVgData = NULL;
|
pVgData = NULL;
|
||||||
pArray = NULL;
|
pArray = NULL;
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
if (code == TSDB_CODE_VND_TABLE_NOT_EXIST) {
|
if (code == TSDB_CODE_VND_TABLE_NOT_EXIST) {
|
||||||
code = 0;
|
code = TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(pRequest->code == TSDB_CODE_SUCCESS){
|
||||||
|
SExecResult* pRes = &pRequest->body.resInfo.execRes;
|
||||||
|
if(pRes->res != NULL){
|
||||||
|
code = handleAlterTbExecRes(pRes->res, pCatalog);
|
||||||
|
}
|
||||||
|
}
|
||||||
end:
|
end:
|
||||||
taosArrayDestroy(pArray);
|
taosArrayDestroy(pArray);
|
||||||
if (pVgData) taosMemoryFreeClear(pVgData->pData);
|
if (pVgData) taosMemoryFreeClear(pVgData->pData);
|
||||||
|
@ -2933,27 +2997,6 @@ end:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taos_write_raw_meta(TAOS *taos, tmq_raw_data raw_meta){
|
|
||||||
if (!taos) {
|
|
||||||
return TSDB_CODE_INVALID_PARA;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(raw_meta.raw_meta_type == TDMT_VND_CREATE_STB) {
|
|
||||||
return taosCreateStb(taos, raw_meta.raw_meta, raw_meta.raw_meta_len);
|
|
||||||
}else if(raw_meta.raw_meta_type == TDMT_VND_ALTER_STB){
|
|
||||||
return taosCreateStb(taos, raw_meta.raw_meta, raw_meta.raw_meta_len);
|
|
||||||
}else if(raw_meta.raw_meta_type == TDMT_VND_DROP_STB){
|
|
||||||
return taosDropStb(taos, raw_meta.raw_meta, raw_meta.raw_meta_len);
|
|
||||||
}else if(raw_meta.raw_meta_type == TDMT_VND_CREATE_TABLE){
|
|
||||||
return taosCreateTable(taos, raw_meta.raw_meta, raw_meta.raw_meta_len);
|
|
||||||
}else if(raw_meta.raw_meta_type == TDMT_VND_ALTER_TABLE){
|
|
||||||
return taosAlterTable(taos, raw_meta.raw_meta, raw_meta.raw_meta_len);
|
|
||||||
}else if(raw_meta.raw_meta_type == TDMT_VND_DROP_TABLE){
|
|
||||||
return taosDropTable(taos, raw_meta.raw_meta, raw_meta.raw_meta_len);
|
|
||||||
}
|
|
||||||
return TSDB_CODE_INVALID_PARA;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
SVgroupInfo vg;
|
SVgroupInfo vg;
|
||||||
void *data;
|
void *data;
|
||||||
|
@ -2964,15 +3007,196 @@ static void destroyVgHash(void* data) {
|
||||||
taosMemoryFreeClear(vgData->data);
|
taosMemoryFreeClear(vgData->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taos_write_raw_data(TAOS *taos, TAOS_RES *msg){
|
int taos_write_raw_block(TAOS *taos, int rows, char *pData, const char* tbname){
|
||||||
if (!TD_RES_TMQ(msg)) {
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
uError("WriteRaw:msg is not tmq : %d", *(int8_t*)msg);
|
STableMeta* pTableMeta = NULL;
|
||||||
return TSDB_CODE_TMQ_INVALID_MSG;
|
SQuery *pQuery = NULL;
|
||||||
|
|
||||||
|
SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
|
||||||
|
if(!pRequest){
|
||||||
|
uError("WriteRaw:createRequest error request is null");
|
||||||
|
code = terrno;
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pRequest->pDb) {
|
||||||
|
uError("WriteRaw:not use db");
|
||||||
|
code = TSDB_CODE_PAR_DB_NOT_SPECIFIED;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
SName pName = {TSDB_TABLE_NAME_T, pRequest->pTscObj->acctId, {0}, {0}};
|
||||||
|
strcpy(pName.dbname, pRequest->pDb);
|
||||||
|
strcpy(pName.tname, tbname);
|
||||||
|
|
||||||
|
struct SCatalog *pCatalog = NULL;
|
||||||
|
code = catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog);
|
||||||
|
if(code != TSDB_CODE_SUCCESS){
|
||||||
|
uError("WriteRaw: get gatlog error");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
SRequestConnInfo conn = {0};
|
||||||
|
conn.pTrans = pRequest->pTscObj->pAppInfo->pTransporter;
|
||||||
|
conn.requestId = pRequest->requestId;
|
||||||
|
conn.requestObjRefId = pRequest->self;
|
||||||
|
conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
|
SVgroupInfo vgData = {0};
|
||||||
|
code = catalogGetTableHashVgroup(pCatalog, &conn, &pName, &vgData);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("WriteRaw:catalogGetTableHashVgroup failed. table name: %s", tbname);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = catalogGetTableMeta(pCatalog, &conn, &pName, &pTableMeta);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("WriteRaw:catalogGetTableMeta failed. table name: %s", tbname);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
uint64_t suid = (TSDB_NORMAL_TABLE == pTableMeta->tableType ? 0 : pTableMeta->suid);
|
||||||
|
uint64_t uid = pTableMeta->uid;
|
||||||
|
int32_t numOfCols = pTableMeta->tableInfo.numOfColumns;
|
||||||
|
|
||||||
|
uint16_t fLen = 0;
|
||||||
|
int32_t rowSize = 0;
|
||||||
|
int16_t nVar = 0;
|
||||||
|
for (int i = 0; i < numOfCols; i++) {
|
||||||
|
SSchema *schema = pTableMeta->schema + i;
|
||||||
|
fLen += TYPE_BYTES[schema->type];
|
||||||
|
rowSize += schema->bytes;
|
||||||
|
if(IS_VAR_DATA_TYPE(schema->type)){
|
||||||
|
nVar ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
|
||||||
|
(int32_t)TD_BITMAP_BYTES(numOfCols - 1);
|
||||||
|
int32_t schemaLen = 0;
|
||||||
|
int32_t submitLen = sizeof(SSubmitBlk) + schemaLen + rows * extendedRowSize;
|
||||||
|
|
||||||
|
int32_t totalLen = sizeof(SSubmitReq) + submitLen;
|
||||||
|
SSubmitReq* subReq = taosMemoryCalloc(1, totalLen);
|
||||||
|
SSubmitBlk* blk = POINTER_SHIFT(subReq, sizeof(SSubmitReq));
|
||||||
|
void* blkSchema = POINTER_SHIFT(blk, sizeof(SSubmitBlk));
|
||||||
|
STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen);
|
||||||
|
|
||||||
|
SRowBuilder rb = {0};
|
||||||
|
tdSRowInit(&rb, pTableMeta->sversion);
|
||||||
|
tdSRowSetTpInfo(&rb, numOfCols, fLen);
|
||||||
|
int32_t dataLen = 0;
|
||||||
|
|
||||||
|
char* pStart = pData + sizeof(int32_t) + sizeof(uint64_t) + numOfCols * (sizeof(int16_t) + sizeof(int32_t));
|
||||||
|
int32_t* colLength = (int32_t*)pStart;
|
||||||
|
pStart += sizeof(int32_t) * numOfCols;
|
||||||
|
|
||||||
|
SResultColumn *pCol = taosMemoryCalloc(numOfCols, sizeof(SResultColumn));
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
if (IS_VAR_DATA_TYPE(pTableMeta->schema[i].type)) {
|
||||||
|
pCol[i].offset = (int32_t*)pStart;
|
||||||
|
pStart += rows * sizeof(int32_t);
|
||||||
|
} else {
|
||||||
|
pCol[i].nullbitmap = pStart;
|
||||||
|
pStart += BitmapLen(rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
pCol[i].pData = pStart;
|
||||||
|
pStart += colLength[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t j = 0; j < rows; j++) {
|
||||||
|
tdSRowResetBuf(&rb, rowData);
|
||||||
|
int32_t offset = 0;
|
||||||
|
for (int32_t k = 0; k < numOfCols; k++) {
|
||||||
|
const SSchema* pColumn = &pTableMeta->schema[k];
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pColumn->type)) {
|
||||||
|
if (pCol[k].offset[j] != -1) {
|
||||||
|
char* data = pCol[k].pData + pCol[k].offset[j];
|
||||||
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, data, true, offset, k);
|
||||||
|
} else {
|
||||||
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!colDataIsNull_f(pCol[k].nullbitmap, j)) {
|
||||||
|
char* data = pCol[k].pData + pColumn->bytes * j;
|
||||||
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, data, true, offset, k);
|
||||||
|
} else {
|
||||||
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += TYPE_BYTES[pColumn->type];
|
||||||
|
}
|
||||||
|
int32_t rowLen = TD_ROW_LEN(rowData);
|
||||||
|
rowData = POINTER_SHIFT(rowData, rowLen);
|
||||||
|
dataLen += rowLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(pCol);
|
||||||
|
|
||||||
|
blk->uid = htobe64(uid);
|
||||||
|
blk->suid = htobe64(suid);
|
||||||
|
blk->padding = htonl(blk->padding);
|
||||||
|
blk->sversion = htonl(pTableMeta->sversion);
|
||||||
|
blk->schemaLen = htonl(schemaLen);
|
||||||
|
blk->numOfRows = htons(rows);
|
||||||
|
blk->dataLen = htonl(dataLen);
|
||||||
|
subReq->length = sizeof(SSubmitReq) + sizeof(SSubmitBlk) + schemaLen + dataLen;
|
||||||
|
subReq->numOfBlocks = 1;
|
||||||
|
|
||||||
|
pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
|
||||||
|
if (NULL == pQuery) {
|
||||||
|
uError("create SQuery error");
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
||||||
|
pQuery->haveResultSet = false;
|
||||||
|
pQuery->msgType = TDMT_VND_SUBMIT;
|
||||||
|
pQuery->pRoot = (SNode *)nodesMakeNode(QUERY_NODE_VNODE_MODIF_STMT);
|
||||||
|
if (NULL == pQuery->pRoot) {
|
||||||
|
uError("create pQuery->pRoot error");
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
SVnodeModifOpStmt *nodeStmt = (SVnodeModifOpStmt *)(pQuery->pRoot);
|
||||||
|
nodeStmt->payloadType = PAYLOAD_TYPE_KV;
|
||||||
|
nodeStmt->pDataBlocks = taosArrayInit(1, POINTER_BYTES);
|
||||||
|
|
||||||
|
SVgDataBlocks *dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
|
||||||
|
if (NULL == dst) {
|
||||||
|
code = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
dst->vg = vgData;
|
||||||
|
dst->numOfTables = subReq->numOfBlocks;
|
||||||
|
dst->size = subReq->length;
|
||||||
|
dst->pData = (char*)subReq;
|
||||||
|
subReq->header.vgId = htonl(dst->vg.vgId);
|
||||||
|
subReq->version = htonl(1);
|
||||||
|
subReq->header.contLen = htonl(subReq->length);
|
||||||
|
subReq->length = htonl(subReq->length);
|
||||||
|
subReq->numOfBlocks = htonl(subReq->numOfBlocks);
|
||||||
|
subReq = NULL; // no need free
|
||||||
|
taosArrayPush(nodeStmt->pDataBlocks, &dst);
|
||||||
|
|
||||||
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
|
code = pRequest->code;
|
||||||
|
|
||||||
|
end:
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
|
qDestroyQuery(pQuery);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tmqWriteRaw(TAOS *taos, void* data, int32_t dataLen){
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SHashObj *pVgHash = NULL;
|
SHashObj *pVgHash = NULL;
|
||||||
SQuery *pQuery = NULL;
|
SQuery *pQuery = NULL;
|
||||||
|
SMqRspObj rspObj = {0};
|
||||||
|
SDecoder decoder = {0};
|
||||||
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
|
SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
|
||||||
|
@ -2981,6 +3205,17 @@ int32_t taos_write_raw_data(TAOS *taos, TAOS_RES *msg){
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rspObj.resIter = -1;
|
||||||
|
rspObj.resType = RES_TYPE__TMQ;
|
||||||
|
|
||||||
|
tDecoderInit(&decoder, data, dataLen);
|
||||||
|
code = tDecodeSMqDataRsp(&decoder, &rspObj.rsp);
|
||||||
|
if (code != 0){
|
||||||
|
uError("WriteRaw:decode smqDataRsp error");
|
||||||
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
if (!pRequest->pDb) {
|
if (!pRequest->pDb) {
|
||||||
uError("WriteRaw:not use db");
|
uError("WriteRaw:not use db");
|
||||||
code = TSDB_CODE_PAR_DB_NOT_SPECIFIED;
|
code = TSDB_CODE_PAR_DB_NOT_SPECIFIED;
|
||||||
|
@ -3001,18 +3236,18 @@ int32_t taos_write_raw_data(TAOS *taos, TAOS_RES *msg){
|
||||||
conn.requestId = pRequest->requestId;
|
conn.requestId = pRequest->requestId;
|
||||||
conn.requestObjRefId = pRequest->self;
|
conn.requestObjRefId = pRequest->self;
|
||||||
conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
||||||
SMqRspObj *rspObj = ((SMqRspObj*)msg);
|
|
||||||
printf("raw data block num:%d\n", rspObj->rsp.blockNum);
|
printf("raw data block num:%d\n", rspObj.rsp.blockNum);
|
||||||
while (++rspObj->resIter < rspObj->rsp.blockNum) {
|
while (++rspObj.resIter < rspObj.rsp.blockNum) {
|
||||||
SRetrieveTableRsp* pRetrieve = (SRetrieveTableRsp*)taosArrayGetP(rspObj->rsp.blockData, rspObj->resIter);
|
SRetrieveTableRsp* pRetrieve = (SRetrieveTableRsp*)taosArrayGetP(rspObj.rsp.blockData, rspObj.resIter);
|
||||||
if (!rspObj->rsp.withSchema) {
|
if (!rspObj.rsp.withSchema) {
|
||||||
uError("WriteRaw:no schema, iter:%d", rspObj->resIter);
|
uError("WriteRaw:no schema, iter:%d", rspObj.resIter);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
SSchemaWrapper* pSW = (SSchemaWrapper*)taosArrayGetP(rspObj->rsp.blockSchema, rspObj->resIter);
|
SSchemaWrapper* pSW = (SSchemaWrapper*)taosArrayGetP(rspObj.rsp.blockSchema, rspObj.resIter);
|
||||||
setResSchemaInfo(&rspObj->resInfo, pSW->pSchema, pSW->nCols);
|
setResSchemaInfo(&rspObj.resInfo, pSW->pSchema, pSW->nCols);
|
||||||
|
|
||||||
code = setQueryResultFromRsp(&rspObj->resInfo, pRetrieve, false, false);
|
code = setQueryResultFromRsp(&rspObj.resInfo, pRetrieve, false, false);
|
||||||
if(code != TSDB_CODE_SUCCESS){
|
if(code != TSDB_CODE_SUCCESS){
|
||||||
uError("WriteRaw: setQueryResultFromRsp error");
|
uError("WriteRaw: setQueryResultFromRsp error");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -3030,13 +3265,13 @@ int32_t taos_write_raw_data(TAOS *taos, TAOS_RES *msg){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rows = rspObj->resInfo.numOfRows;
|
int32_t rows = rspObj.resInfo.numOfRows;
|
||||||
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
|
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
|
||||||
(int32_t)TD_BITMAP_BYTES(pSW->nCols - 1);
|
(int32_t)TD_BITMAP_BYTES(pSW->nCols - 1);
|
||||||
int32_t schemaLen = 0;
|
int32_t schemaLen = 0;
|
||||||
int32_t submitLen = sizeof(SSubmitBlk) + schemaLen + rows * extendedRowSize;
|
int32_t submitLen = sizeof(SSubmitBlk) + schemaLen + rows * extendedRowSize;
|
||||||
|
|
||||||
const char* tbName = tmq_get_table_name(msg);
|
const char* tbName = (const char*)taosArrayGetP(rspObj.rsp.blockTbName, rspObj.resIter);
|
||||||
if(!tbName){
|
if(!tbName){
|
||||||
uError("WriteRaw: tbname is null");
|
uError("WriteRaw: tbname is null");
|
||||||
code = TSDB_CODE_TMQ_INVALID_MSG;
|
code = TSDB_CODE_TMQ_INVALID_MSG;
|
||||||
|
@ -3108,13 +3343,13 @@ int32_t taos_write_raw_data(TAOS *taos, TAOS_RES *msg){
|
||||||
for (int32_t j = 0; j < rows; j++) {
|
for (int32_t j = 0; j < rows; j++) {
|
||||||
tdSRowResetBuf(&rb, rowData);
|
tdSRowResetBuf(&rb, rowData);
|
||||||
|
|
||||||
doSetOneRowPtr(&rspObj->resInfo);
|
doSetOneRowPtr(&rspObj.resInfo);
|
||||||
rspObj->resInfo.current += 1;
|
rspObj.resInfo.current += 1;
|
||||||
|
|
||||||
int32_t offset = 0;
|
int32_t offset = 0;
|
||||||
for (int32_t k = 0; k < pSW->nCols; k++) {
|
for (int32_t k = 0; k < pSW->nCols; k++) {
|
||||||
const SSchema* pColumn = &pSW->pSchema[k];
|
const SSchema* pColumn = &pSW->pSchema[k];
|
||||||
char *data = rspObj->resInfo.row[k];
|
char *data = rspObj.resInfo.row[k];
|
||||||
if (!data) {
|
if (!data) {
|
||||||
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3186,13 +3421,105 @@ int32_t taos_write_raw_data(TAOS *taos, TAOS_RES *msg){
|
||||||
|
|
||||||
launchQueryImpl(pRequest, pQuery, true, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
tDecoderClear(&decoder);
|
||||||
|
taos_free_result(&rspObj);
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
taosHashCleanup(pVgHash);
|
taosHashCleanup(pVgHash);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* tmq_get_json_meta(TAOS_RES* res) {
|
||||||
|
if (!TD_RES_TMQ_META(res)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMqMetaRspObj* pMetaRspObj = (SMqMetaRspObj*)res;
|
||||||
|
if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_CREATE_STB) {
|
||||||
|
return processCreateStb(&pMetaRspObj->metaRsp);
|
||||||
|
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_ALTER_STB) {
|
||||||
|
return processAlterStb(&pMetaRspObj->metaRsp);
|
||||||
|
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_DROP_STB) {
|
||||||
|
return processDropSTable(&pMetaRspObj->metaRsp);
|
||||||
|
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_CREATE_TABLE) {
|
||||||
|
return processCreateTable(&pMetaRspObj->metaRsp);
|
||||||
|
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_ALTER_TABLE) {
|
||||||
|
return processAlterTable(&pMetaRspObj->metaRsp);
|
||||||
|
} else if (pMetaRspObj->metaRsp.resMsgType == TDMT_VND_DROP_TABLE) {
|
||||||
|
return processDropTable(&pMetaRspObj->metaRsp);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tmq_free_json_meta(char* jsonMeta) { taosMemoryFreeClear(jsonMeta); }
|
||||||
|
|
||||||
|
int32_t tmq_get_raw(TAOS_RES* res, tmq_raw_data *raw) {
|
||||||
|
if (!raw || !res){
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
|
if (TD_RES_TMQ_META(res)) {
|
||||||
|
SMqMetaRspObj* pMetaRspObj = (SMqMetaRspObj*)res;
|
||||||
|
raw->raw = pMetaRspObj->metaRsp.metaRsp;
|
||||||
|
raw->raw_len = pMetaRspObj->metaRsp.metaRspLen;
|
||||||
|
raw->raw_type = pMetaRspObj->metaRsp.resMsgType;
|
||||||
|
} else if(TD_RES_TMQ(res)){
|
||||||
|
SMqRspObj *rspObj = ((SMqRspObj*)res);
|
||||||
|
|
||||||
|
int32_t len = 0;
|
||||||
|
int32_t code = 0;
|
||||||
|
tEncodeSize(tEncodeSMqDataRsp, &rspObj->rsp, len, code);
|
||||||
|
if (code < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *buf = taosMemoryCalloc(1, len);
|
||||||
|
SEncoder encoder = {0};
|
||||||
|
tEncoderInit(&encoder, buf, len);
|
||||||
|
tEncodeSMqDataRsp(&encoder, &rspObj->rsp);
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
|
||||||
|
raw->raw = buf;
|
||||||
|
raw->raw_len = len;
|
||||||
|
raw->raw_type = RES_TYPE__TMQ;
|
||||||
|
} else {
|
||||||
|
return TSDB_CODE_TMQ_INVALID_MSG;
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tmq_free_raw(tmq_raw_data raw) {
|
||||||
|
if (raw.raw_type == RES_TYPE__TMQ){
|
||||||
|
taosMemoryFree(raw.raw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tmq_write_raw(TAOS *taos, tmq_raw_data raw){
|
||||||
|
if (!taos) {
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(raw.raw_type == TDMT_VND_CREATE_STB) {
|
||||||
|
return taosCreateStb(taos, raw.raw, raw.raw_len);
|
||||||
|
}else if(raw.raw_type == TDMT_VND_ALTER_STB){
|
||||||
|
return taosCreateStb(taos, raw.raw, raw.raw_len);
|
||||||
|
}else if(raw.raw_type == TDMT_VND_DROP_STB){
|
||||||
|
return taosDropStb(taos, raw.raw, raw.raw_len);
|
||||||
|
}else if(raw.raw_type == TDMT_VND_CREATE_TABLE){
|
||||||
|
return taosCreateTable(taos, raw.raw, raw.raw_len);
|
||||||
|
}else if(raw.raw_type == TDMT_VND_ALTER_TABLE){
|
||||||
|
return taosAlterTable(taos, raw.raw, raw.raw_len);
|
||||||
|
}else if(raw.raw_type == TDMT_VND_DROP_TABLE) {
|
||||||
|
return taosDropTable(taos, raw.raw, raw.raw_len);
|
||||||
|
}else if(raw.raw_type == TDMT_VND_DELETE){
|
||||||
|
return taosDeleteData(taos, raw.raw, raw.raw_len);
|
||||||
|
}else if(raw.raw_type == RES_TYPE__TMQ){
|
||||||
|
return tmqWriteRaw(taos, raw.raw, raw.raw_len);
|
||||||
|
}
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
|
|
||||||
void tmq_commit_async(tmq_t* tmq, const TAOS_RES* msg, tmq_commit_cb* cb, void* param) {
|
void tmq_commit_async(tmq_t* tmq, const TAOS_RES* msg, tmq_commit_cb* cb, void* param) {
|
||||||
//
|
//
|
||||||
tmqCommitInner2(tmq, msg, 0, 1, cb, param);
|
tmqCommitInner2(tmq, msg, 0, 1, cb, param);
|
||||||
|
|
|
@ -84,17 +84,19 @@ static const SSysDbTableSchema userDBSchema[] = {
|
||||||
{.name = "pages", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "pages", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "minrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "minrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "maxrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "maxrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "wal", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
|
||||||
{.name = "fsync", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
|
||||||
{.name = "comp", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
{.name = "comp", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
||||||
{.name = "cacheModel", .bytes = TSDB_CACHE_MODEL_STR_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
|
||||||
{.name = "precision", .bytes = 2 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "precision", .bytes = 2 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "single_stable", .bytes = 1, .type = TSDB_DATA_TYPE_BOOL},
|
|
||||||
{.name = "status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
// {.name = "schemaless", .bytes = 1, .type = TSDB_DATA_TYPE_BOOL},
|
|
||||||
{.name = "retention", .bytes = 60 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "retention", .bytes = 60 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
|
{.name = "single_stable", .bytes = 1, .type = TSDB_DATA_TYPE_BOOL},
|
||||||
// {.name = "update", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT}, // disable update
|
{.name = "cachemodel", .bytes = TSDB_CACHE_MODEL_STR_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
|
{.name = "cachesize", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "wal_level", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
||||||
|
{.name = "wal_fsync_period", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "wal_retention_period", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "wal_retention_size", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT},
|
||||||
|
{.name = "wal_roll_period", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "wal_seg_size", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysDbTableSchema userFuncSchema[] = {
|
static const SSysDbTableSchema userFuncSchema[] = {
|
||||||
|
|
|
@ -2010,7 +2010,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->minRows) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->minRows) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->maxRows) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->maxRows) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->precision) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->precision) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
||||||
|
@ -2019,9 +2019,9 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->schemaless) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->schemaless) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->walRetentionPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->walRetentionPeriod) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->walRetentionSize) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->walRetentionSize) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->walRollPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->walRollPeriod) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->walSegmentSize) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->walSegmentSize) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
||||||
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
||||||
|
@ -2056,7 +2056,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq)
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->minRows) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->minRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->maxRows) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->maxRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->precision) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->precision) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
||||||
|
@ -2065,9 +2065,9 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq)
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->schemaless) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->schemaless) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->walRetentionPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->walRetentionPeriod) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->walRetentionSize) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->walRetentionSize) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->walRollPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->walRollPeriod) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->walSegmentSize) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->walSegmentSize) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
||||||
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
||||||
|
@ -2113,7 +2113,7 @@ int32_t tSerializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) {
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
||||||
|
@ -2139,7 +2139,7 @@ int32_t tDeserializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) {
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
||||||
|
@ -2748,7 +2748,7 @@ int32_t tSerializeSDbCfgRsp(void *buf, int32_t bufLen, const SDbCfgRsp *pRsp) {
|
||||||
if (tEncodeI32(&encoder, pRsp->daysToKeep2) < 0) return -1;
|
if (tEncodeI32(&encoder, pRsp->daysToKeep2) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pRsp->minRows) < 0) return -1;
|
if (tEncodeI32(&encoder, pRsp->minRows) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pRsp->maxRows) < 0) return -1;
|
if (tEncodeI32(&encoder, pRsp->maxRows) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pRsp->fsyncPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pRsp->walFsyncPeriod) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pRsp->walLevel) < 0) return -1;
|
if (tEncodeI8(&encoder, pRsp->walLevel) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pRsp->precision) < 0) return -1;
|
if (tEncodeI8(&encoder, pRsp->precision) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pRsp->compression) < 0) return -1;
|
if (tEncodeI8(&encoder, pRsp->compression) < 0) return -1;
|
||||||
|
@ -2787,7 +2787,7 @@ int32_t tDeserializeSDbCfgRsp(void *buf, int32_t bufLen, SDbCfgRsp *pRsp) {
|
||||||
if (tDecodeI32(&decoder, &pRsp->daysToKeep2) < 0) return -1;
|
if (tDecodeI32(&decoder, &pRsp->daysToKeep2) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->minRows) < 0) return -1;
|
if (tDecodeI32(&decoder, &pRsp->minRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->maxRows) < 0) return -1;
|
if (tDecodeI32(&decoder, &pRsp->maxRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->fsyncPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pRsp->walFsyncPeriod) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->walLevel) < 0) return -1;
|
if (tDecodeI8(&decoder, &pRsp->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->precision) < 0) return -1;
|
if (tDecodeI8(&decoder, &pRsp->precision) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->compression) < 0) return -1;
|
if (tDecodeI8(&decoder, &pRsp->compression) < 0) return -1;
|
||||||
|
@ -3720,7 +3720,7 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->minRows) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->minRows) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->maxRows) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->maxRows) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tEncodeU32(&encoder, pReq->hashBegin) < 0) return -1;
|
if (tEncodeU32(&encoder, pReq->hashBegin) < 0) return -1;
|
||||||
if (tEncodeU32(&encoder, pReq->hashEnd) < 0) return -1;
|
if (tEncodeU32(&encoder, pReq->hashEnd) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->hashMethod) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->hashMethod) < 0) return -1;
|
||||||
|
@ -3782,7 +3782,7 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->minRows) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->minRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->maxRows) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->maxRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tDecodeU32(&decoder, &pReq->hashBegin) < 0) return -1;
|
if (tDecodeU32(&decoder, &pReq->hashBegin) < 0) return -1;
|
||||||
if (tDecodeU32(&decoder, &pReq->hashEnd) < 0) return -1;
|
if (tDecodeU32(&decoder, &pReq->hashEnd) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->hashMethod) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->hashMethod) < 0) return -1;
|
||||||
|
@ -3910,7 +3910,7 @@ int32_t tSerializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pReq
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep0) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep1) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
||||||
|
@ -3941,7 +3941,7 @@ int32_t tDeserializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pR
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep0) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep1) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->daysToKeep2) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->walFsyncPeriod) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
||||||
|
@ -5681,6 +5681,7 @@ int32_t tEncodeDeleteRes(SEncoder *pCoder, const SDeleteRes *pRes) {
|
||||||
if (tEncodeI64(pCoder, pRes->ekey) < 0) return -1;
|
if (tEncodeI64(pCoder, pRes->ekey) < 0) return -1;
|
||||||
if (tEncodeI64v(pCoder, pRes->affectedRows) < 0) return -1;
|
if (tEncodeI64v(pCoder, pRes->affectedRows) < 0) return -1;
|
||||||
|
|
||||||
|
if (tEncodeCStr(pCoder, pRes->tableFName) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5692,12 +5693,13 @@ int32_t tDecodeDeleteRes(SDecoder *pCoder, SDeleteRes *pRes) {
|
||||||
if (tDecodeI32v(pCoder, &nUid) < 0) return -1;
|
if (tDecodeI32v(pCoder, &nUid) < 0) return -1;
|
||||||
for (int32_t iUid = 0; iUid < nUid; iUid++) {
|
for (int32_t iUid = 0; iUid < nUid; iUid++) {
|
||||||
if (tDecodeU64(pCoder, &uid) < 0) return -1;
|
if (tDecodeU64(pCoder, &uid) < 0) return -1;
|
||||||
taosArrayPush(pRes->uidList, &uid);
|
if (pRes->uidList) taosArrayPush(pRes->uidList, &uid);
|
||||||
}
|
}
|
||||||
if (tDecodeI64(pCoder, &pRes->skey) < 0) return -1;
|
if (tDecodeI64(pCoder, &pRes->skey) < 0) return -1;
|
||||||
if (tDecodeI64(pCoder, &pRes->ekey) < 0) return -1;
|
if (tDecodeI64(pCoder, &pRes->ekey) < 0) return -1;
|
||||||
if (tDecodeI64v(pCoder, &pRes->affectedRows) < 0) return -1;
|
if (tDecodeI64v(pCoder, &pRes->affectedRows) < 0) return -1;
|
||||||
|
|
||||||
|
if (tDecodeCStrTo(pCoder, pRes->tableFName) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int32_t tEncodeSMqDataRsp(SEncoder *pEncoder, const SMqDataRsp *pRsp) {
|
int32_t tEncodeSMqDataRsp(SEncoder *pEncoder, const SMqDataRsp *pRsp) {
|
||||||
|
|
|
@ -160,7 +160,7 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pCfg->walCfg.vgId = pCreate->vgId;
|
pCfg->walCfg.vgId = pCreate->vgId;
|
||||||
pCfg->walCfg.fsyncPeriod = pCreate->fsyncPeriod;
|
pCfg->walCfg.fsyncPeriod = pCreate->walFsyncPeriod;
|
||||||
pCfg->walCfg.retentionPeriod = pCreate->walRetentionPeriod;
|
pCfg->walCfg.retentionPeriod = pCreate->walRetentionPeriod;
|
||||||
pCfg->walCfg.rollPeriod = pCreate->walRollPeriod;
|
pCfg->walCfg.rollPeriod = pCreate->walRollPeriod;
|
||||||
pCfg->walCfg.retentionSize = pCreate->walRetentionSize;
|
pCfg->walCfg.retentionSize = pCreate->walRetentionSize;
|
||||||
|
|
|
@ -294,7 +294,7 @@ typedef struct {
|
||||||
int32_t daysToKeep2;
|
int32_t daysToKeep2;
|
||||||
int32_t minRows;
|
int32_t minRows;
|
||||||
int32_t maxRows;
|
int32_t maxRows;
|
||||||
int32_t fsyncPeriod;
|
int32_t walFsyncPeriod;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t precision;
|
int8_t precision;
|
||||||
int8_t compression;
|
int8_t compression;
|
||||||
|
|
|
@ -102,7 +102,7 @@ static SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
|
||||||
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep2, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep2, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.minRows, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.minRows, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.maxRows, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.maxRows, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.fsyncPeriod, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walFsyncPeriod, _OVER)
|
||||||
SDB_SET_INT8(pRaw, dataPos, pDb->cfg.walLevel, _OVER)
|
SDB_SET_INT8(pRaw, dataPos, pDb->cfg.walLevel, _OVER)
|
||||||
SDB_SET_INT8(pRaw, dataPos, pDb->cfg.precision, _OVER)
|
SDB_SET_INT8(pRaw, dataPos, pDb->cfg.precision, _OVER)
|
||||||
SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compression, _OVER)
|
SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compression, _OVER)
|
||||||
|
@ -179,7 +179,7 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep2, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep2, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.minRows, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.minRows, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.maxRows, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.maxRows, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.fsyncPeriod, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walFsyncPeriod, _OVER)
|
||||||
SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.walLevel, _OVER)
|
SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.walLevel, _OVER)
|
||||||
SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.precision, _OVER)
|
SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.precision, _OVER)
|
||||||
SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER)
|
SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER)
|
||||||
|
@ -249,7 +249,7 @@ static int32_t mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew) {
|
||||||
pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0;
|
pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0;
|
||||||
pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1;
|
pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1;
|
||||||
pOld->cfg.daysToKeep2 = pNew->cfg.daysToKeep2;
|
pOld->cfg.daysToKeep2 = pNew->cfg.daysToKeep2;
|
||||||
pOld->cfg.fsyncPeriod = pNew->cfg.fsyncPeriod;
|
pOld->cfg.walFsyncPeriod = pNew->cfg.walFsyncPeriod;
|
||||||
pOld->cfg.walLevel = pNew->cfg.walLevel;
|
pOld->cfg.walLevel = pNew->cfg.walLevel;
|
||||||
pOld->cfg.strict = pNew->cfg.strict;
|
pOld->cfg.strict = pNew->cfg.strict;
|
||||||
pOld->cfg.cacheLast = pNew->cfg.cacheLast;
|
pOld->cfg.cacheLast = pNew->cfg.cacheLast;
|
||||||
|
@ -312,7 +312,7 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
|
||||||
if (pCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return -1;
|
if (pCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return -1;
|
||||||
if (pCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return -1;
|
if (pCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return -1;
|
||||||
if (pCfg->minRows > pCfg->maxRows) return -1;
|
if (pCfg->minRows > pCfg->maxRows) return -1;
|
||||||
if (pCfg->fsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->fsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return -1;
|
if (pCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return -1;
|
||||||
if (pCfg->walLevel < TSDB_MIN_WAL_LEVEL || pCfg->walLevel > TSDB_MAX_WAL_LEVEL) return -1;
|
if (pCfg->walLevel < TSDB_MIN_WAL_LEVEL || pCfg->walLevel > TSDB_MAX_WAL_LEVEL) return -1;
|
||||||
if (pCfg->precision < TSDB_MIN_PRECISION && pCfg->precision > TSDB_MAX_PRECISION) return -1;
|
if (pCfg->precision < TSDB_MIN_PRECISION && pCfg->precision > TSDB_MAX_PRECISION) return -1;
|
||||||
if (pCfg->compression < TSDB_MIN_COMP_LEVEL || pCfg->compression > TSDB_MAX_COMP_LEVEL) return -1;
|
if (pCfg->compression < TSDB_MIN_COMP_LEVEL || pCfg->compression > TSDB_MAX_COMP_LEVEL) return -1;
|
||||||
|
@ -347,7 +347,7 @@ static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
|
||||||
if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
|
if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
|
||||||
if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
|
if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
|
||||||
if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
|
if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
|
||||||
if (pCfg->fsyncPeriod < 0) pCfg->fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
|
if (pCfg->walFsyncPeriod < 0) pCfg->walFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
|
||||||
if (pCfg->walLevel < 0) pCfg->walLevel = TSDB_DEFAULT_WAL_LEVEL;
|
if (pCfg->walLevel < 0) pCfg->walLevel = TSDB_DEFAULT_WAL_LEVEL;
|
||||||
if (pCfg->precision < 0) pCfg->precision = TSDB_DEFAULT_PRECISION;
|
if (pCfg->precision < 0) pCfg->precision = TSDB_DEFAULT_PRECISION;
|
||||||
if (pCfg->compression < 0) pCfg->compression = TSDB_DEFAULT_COMP_LEVEL;
|
if (pCfg->compression < 0) pCfg->compression = TSDB_DEFAULT_COMP_LEVEL;
|
||||||
|
@ -466,7 +466,7 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate,
|
||||||
.daysToKeep2 = pCreate->daysToKeep2,
|
.daysToKeep2 = pCreate->daysToKeep2,
|
||||||
.minRows = pCreate->minRows,
|
.minRows = pCreate->minRows,
|
||||||
.maxRows = pCreate->maxRows,
|
.maxRows = pCreate->maxRows,
|
||||||
.fsyncPeriod = pCreate->fsyncPeriod,
|
.walFsyncPeriod = pCreate->walFsyncPeriod,
|
||||||
.walLevel = pCreate->walLevel,
|
.walLevel = pCreate->walLevel,
|
||||||
.precision = pCreate->precision,
|
.precision = pCreate->precision,
|
||||||
.compression = pCreate->compression,
|
.compression = pCreate->compression,
|
||||||
|
@ -642,8 +642,8 @@ static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
|
||||||
terrno = 0;
|
terrno = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pAlter->fsyncPeriod >= 0 && pAlter->fsyncPeriod != pDb->cfg.fsyncPeriod) {
|
if (pAlter->walFsyncPeriod >= 0 && pAlter->walFsyncPeriod != pDb->cfg.walFsyncPeriod) {
|
||||||
pDb->cfg.fsyncPeriod = pAlter->fsyncPeriod;
|
pDb->cfg.walFsyncPeriod = pAlter->walFsyncPeriod;
|
||||||
terrno = 0;
|
terrno = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -833,7 +833,7 @@ static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
|
||||||
cfgRsp.daysToKeep2 = pDb->cfg.daysToKeep2;
|
cfgRsp.daysToKeep2 = pDb->cfg.daysToKeep2;
|
||||||
cfgRsp.minRows = pDb->cfg.minRows;
|
cfgRsp.minRows = pDb->cfg.minRows;
|
||||||
cfgRsp.maxRows = pDb->cfg.maxRows;
|
cfgRsp.maxRows = pDb->cfg.maxRows;
|
||||||
cfgRsp.fsyncPeriod = pDb->cfg.fsyncPeriod;
|
cfgRsp.walFsyncPeriod = pDb->cfg.walFsyncPeriod;
|
||||||
cfgRsp.walLevel = pDb->cfg.walLevel;
|
cfgRsp.walLevel = pDb->cfg.walLevel;
|
||||||
cfgRsp.precision = pDb->cfg.precision;
|
cfgRsp.precision = pDb->cfg.precision;
|
||||||
cfgRsp.compression = pDb->cfg.compression;
|
cfgRsp.compression = pDb->cfg.compression;
|
||||||
|
@ -1521,7 +1521,7 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
colDataAppend(pColInfo, rows, buf, false);
|
colDataAppend(pColInfo, rows, buf, false);
|
||||||
} else if (i == 3) {
|
} else if (i == 3) {
|
||||||
colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
|
colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
|
||||||
} else if (i == 20) {
|
} else if (i == 15) {
|
||||||
colDataAppend(pColInfo, rows, statusVstr, false);
|
colDataAppend(pColInfo, rows, statusVstr, false);
|
||||||
} else {
|
} else {
|
||||||
colDataAppendNULL(pColInfo, rows);
|
colDataAppendNULL(pColInfo, rows);
|
||||||
|
@ -1582,21 +1582,9 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.maxRows, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.maxRows, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walLevel, false);
|
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.fsyncPeriod, false);
|
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.compression, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.compression, false);
|
||||||
|
|
||||||
const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast);
|
|
||||||
char cacheModelVstr[24] = {0};
|
|
||||||
STR_WITH_SIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, strlen(cacheModelStr));
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
|
||||||
colDataAppend(pColInfo, rows, (const char *)cacheModelVstr, false);
|
|
||||||
|
|
||||||
const char *precStr = NULL;
|
const char *precStr = NULL;
|
||||||
switch (pDb->cfg.precision) {
|
switch (pDb->cfg.precision) {
|
||||||
case TSDB_TIME_PRECISION_MILLI:
|
case TSDB_TIME_PRECISION_MILLI:
|
||||||
|
@ -1617,20 +1605,47 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)precVstr, false);
|
colDataAppend(pColInfo, rows, (const char *)precVstr, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false);
|
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)statusVstr, false);
|
colDataAppend(pColInfo, rows, (const char *)statusVstr, false);
|
||||||
|
|
||||||
char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
|
char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
if (rentensionVstr == NULL) {
|
if (rentensionVstr == NULL) {
|
||||||
colDataAppendNULL(pColInfo, rows);
|
colDataAppendNULL(pColInfo, rows);
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(pColInfo, rows, (const char *)rentensionVstr, false);
|
colDataAppend(pColInfo, rows, (const char *)rentensionVstr, false);
|
||||||
taosMemoryFree(rentensionVstr);
|
taosMemoryFree(rentensionVstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false);
|
||||||
|
|
||||||
|
const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast);
|
||||||
|
char cacheModelVstr[24] = {0};
|
||||||
|
STR_WITH_SIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, strlen(cacheModelStr));
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)cacheModelVstr, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.cacheLastSize, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walLevel, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walFsyncPeriod, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walRetentionPeriod, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walRollPeriod, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walRetentionSize, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walSegmentSize, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
|
|
|
@ -240,7 +240,7 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
if (strncmp(connReq.passwd, pUser->pass, TSDB_PASSWORD_LEN - 1) != 0) {
|
if (strncmp(connReq.passwd, pUser->pass, TSDB_PASSWORD_LEN - 1) != 0) {
|
||||||
mGError("user:%s, failed to login from %s since invalid pass, input:%s", pReq->info.conn.user, ip, connReq.passwd);
|
mGError("user:%s, failed to login from %s since invalid pass, input:%s", pReq->info.conn.user, ip, connReq.passwd);
|
||||||
code = TSDB_CODE_RPC_AUTH_FAILURE;
|
code = TSDB_CODE_MND_AUTH_FAILURE;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,18 +114,26 @@ int32_t mndAddSinkToTask(SMnode* pMnode, SStreamObj* pStream, SStreamTask* pTask
|
||||||
|
|
||||||
int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStreamTask* pTask) {
|
int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStreamTask* pTask) {
|
||||||
pTask->sinkType = TASK_SINK__NONE;
|
pTask->sinkType = TASK_SINK__NONE;
|
||||||
|
|
||||||
|
bool isShuffle = false;
|
||||||
|
|
||||||
if (pStream->fixedSinkVgId == 0) {
|
if (pStream->fixedSinkVgId == 0) {
|
||||||
pTask->dispatchType = TASK_DISPATCH__SHUFFLE;
|
|
||||||
pTask->dispatchMsgType = TDMT_STREAM_TASK_DISPATCH;
|
|
||||||
SDbObj* pDb = mndAcquireDb(pMnode, pStream->targetDb);
|
SDbObj* pDb = mndAcquireDb(pMnode, pStream->targetDb);
|
||||||
ASSERT(pDb);
|
ASSERT(pDb);
|
||||||
|
if (pDb->cfg.numOfVgroups > 1) {
|
||||||
if (mndExtractDbInfo(pMnode, pDb, &pTask->shuffleDispatcher.dbInfo, NULL) < 0) {
|
isShuffle = true;
|
||||||
ASSERT(0);
|
pTask->dispatchType = TASK_DISPATCH__SHUFFLE;
|
||||||
return -1;
|
pTask->dispatchMsgType = TDMT_STREAM_TASK_DISPATCH;
|
||||||
|
if (mndExtractDbInfo(pMnode, pDb, &pTask->shuffleDispatcher.dbInfo, NULL) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sdbRelease(pMnode->pSdb, pDb);
|
|
||||||
|
|
||||||
|
sdbRelease(pMnode->pSdb, pDb);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isShuffle) {
|
||||||
memcpy(pTask->shuffleDispatcher.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
memcpy(pTask->shuffleDispatcher.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
||||||
SArray* pVgs = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
SArray* pVgs = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
||||||
int32_t sz = taosArrayGetSize(pVgs);
|
int32_t sz = taosArrayGetSize(pVgs);
|
||||||
|
|
|
@ -214,7 +214,7 @@ void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVg
|
||||||
createReq.daysToKeep2 = pDb->cfg.daysToKeep2;
|
createReq.daysToKeep2 = pDb->cfg.daysToKeep2;
|
||||||
createReq.minRows = pDb->cfg.minRows;
|
createReq.minRows = pDb->cfg.minRows;
|
||||||
createReq.maxRows = pDb->cfg.maxRows;
|
createReq.maxRows = pDb->cfg.maxRows;
|
||||||
createReq.fsyncPeriod = pDb->cfg.fsyncPeriod;
|
createReq.walFsyncPeriod = pDb->cfg.walFsyncPeriod;
|
||||||
createReq.walLevel = pDb->cfg.walLevel;
|
createReq.walLevel = pDb->cfg.walLevel;
|
||||||
createReq.precision = pDb->cfg.precision;
|
createReq.precision = pDb->cfg.precision;
|
||||||
createReq.compression = pDb->cfg.compression;
|
createReq.compression = pDb->cfg.compression;
|
||||||
|
@ -286,7 +286,7 @@ void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_
|
||||||
alterReq.daysToKeep0 = pDb->cfg.daysToKeep0;
|
alterReq.daysToKeep0 = pDb->cfg.daysToKeep0;
|
||||||
alterReq.daysToKeep1 = pDb->cfg.daysToKeep1;
|
alterReq.daysToKeep1 = pDb->cfg.daysToKeep1;
|
||||||
alterReq.daysToKeep2 = pDb->cfg.daysToKeep2;
|
alterReq.daysToKeep2 = pDb->cfg.daysToKeep2;
|
||||||
alterReq.fsyncPeriod = pDb->cfg.fsyncPeriod;
|
alterReq.walFsyncPeriod = pDb->cfg.walFsyncPeriod;
|
||||||
alterReq.walLevel = pDb->cfg.walLevel;
|
alterReq.walLevel = pDb->cfg.walLevel;
|
||||||
alterReq.strict = pDb->cfg.strict;
|
alterReq.strict = pDb->cfg.strict;
|
||||||
alterReq.cacheLast = pDb->cfg.cacheLast;
|
alterReq.cacheLast = pDb->cfg.cacheLast;
|
||||||
|
|
|
@ -44,7 +44,7 @@ TEST_F(MndTestDb, 02_Create_Alter_Drop_Db) {
|
||||||
createReq.daysToKeep2 = 3650;
|
createReq.daysToKeep2 = 3650;
|
||||||
createReq.minRows = 100;
|
createReq.minRows = 100;
|
||||||
createReq.maxRows = 4096;
|
createReq.maxRows = 4096;
|
||||||
createReq.fsyncPeriod = 3000;
|
createReq.walFsyncPeriod = 3000;
|
||||||
createReq.walLevel = 1;
|
createReq.walLevel = 1;
|
||||||
createReq.precision = 0;
|
createReq.precision = 0;
|
||||||
createReq.compression = 2;
|
createReq.compression = 2;
|
||||||
|
@ -81,7 +81,7 @@ TEST_F(MndTestDb, 02_Create_Alter_Drop_Db) {
|
||||||
alterdbReq.daysToKeep0 = -1;
|
alterdbReq.daysToKeep0 = -1;
|
||||||
alterdbReq.daysToKeep1 = -1;
|
alterdbReq.daysToKeep1 = -1;
|
||||||
alterdbReq.daysToKeep2 = -1;
|
alterdbReq.daysToKeep2 = -1;
|
||||||
alterdbReq.fsyncPeriod = 4000;
|
alterdbReq.walFsyncPeriod = 4000;
|
||||||
alterdbReq.walLevel = 2;
|
alterdbReq.walLevel = 2;
|
||||||
alterdbReq.strict = 1;
|
alterdbReq.strict = 1;
|
||||||
alterdbReq.cacheLast = 1;
|
alterdbReq.cacheLast = 1;
|
||||||
|
@ -140,7 +140,7 @@ TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) {
|
||||||
createReq.daysToKeep2 = 3650;
|
createReq.daysToKeep2 = 3650;
|
||||||
createReq.minRows = 100;
|
createReq.minRows = 100;
|
||||||
createReq.maxRows = 4096;
|
createReq.maxRows = 4096;
|
||||||
createReq.fsyncPeriod = 3000;
|
createReq.walFsyncPeriod = 3000;
|
||||||
createReq.walLevel = 1;
|
createReq.walLevel = 1;
|
||||||
createReq.precision = 0;
|
createReq.precision = 0;
|
||||||
createReq.compression = 2;
|
createReq.compression = 2;
|
||||||
|
|
|
@ -49,7 +49,7 @@ void* MndTestSma::BuildCreateDbReq(const char* dbname, int32_t* pContLen) {
|
||||||
createReq.daysToKeep2 = 3650 * 1440;
|
createReq.daysToKeep2 = 3650 * 1440;
|
||||||
createReq.minRows = 100;
|
createReq.minRows = 100;
|
||||||
createReq.maxRows = 4096;
|
createReq.maxRows = 4096;
|
||||||
createReq.fsyncPeriod = 3000;
|
createReq.walFsyncPeriod = 3000;
|
||||||
createReq.walLevel = 1;
|
createReq.walLevel = 1;
|
||||||
createReq.precision = 0;
|
createReq.precision = 0;
|
||||||
createReq.compression = 2;
|
createReq.compression = 2;
|
||||||
|
|
|
@ -50,7 +50,7 @@ void* MndTestStb::BuildCreateDbReq(const char* dbname, int32_t* pContLen) {
|
||||||
createReq.daysToKeep2 = 3650;
|
createReq.daysToKeep2 = 3650;
|
||||||
createReq.minRows = 100;
|
createReq.minRows = 100;
|
||||||
createReq.maxRows = 4096;
|
createReq.maxRows = 4096;
|
||||||
createReq.fsyncPeriod = 3000;
|
createReq.walFsyncPeriod = 3000;
|
||||||
createReq.walLevel = 1;
|
createReq.walLevel = 1;
|
||||||
createReq.precision = 0;
|
createReq.precision = 0;
|
||||||
createReq.compression = 2;
|
createReq.compression = 2;
|
||||||
|
|
|
@ -42,7 +42,7 @@ void* MndTestTopic::BuildCreateDbReq(const char* dbname, int32_t* pContLen) {
|
||||||
createReq.daysToKeep2 = 3650 * 1440;
|
createReq.daysToKeep2 = 3650 * 1440;
|
||||||
createReq.minRows = 100;
|
createReq.minRows = 100;
|
||||||
createReq.maxRows = 4096;
|
createReq.maxRows = 4096;
|
||||||
createReq.fsyncPeriod = 3000;
|
createReq.walFsyncPeriod = 3000;
|
||||||
createReq.walLevel = 1;
|
createReq.walLevel = 1;
|
||||||
createReq.precision = 0;
|
createReq.precision = 0;
|
||||||
createReq.compression = 2;
|
createReq.compression = 2;
|
||||||
|
|
|
@ -309,7 +309,7 @@ TEST_F(MndTestUser, 03_Alter_User) {
|
||||||
createReq.daysToKeep2 = 3650 * 1440;
|
createReq.daysToKeep2 = 3650 * 1440;
|
||||||
createReq.minRows = 100;
|
createReq.minRows = 100;
|
||||||
createReq.maxRows = 4096;
|
createReq.maxRows = 4096;
|
||||||
createReq.fsyncPeriod = 3000;
|
createReq.walFsyncPeriod = 3000;
|
||||||
createReq.walLevel = 1;
|
createReq.walLevel = 1;
|
||||||
createReq.precision = 0;
|
createReq.precision = 0;
|
||||||
createReq.compression = 2;
|
createReq.compression = 2;
|
||||||
|
|
|
@ -146,8 +146,8 @@ int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, con
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t len;
|
int32_t len = 0;
|
||||||
int32_t code;
|
int32_t code = 0;
|
||||||
tEncodeSize(tEncodeSMqDataRsp, pRsp, len, code);
|
tEncodeSize(tEncodeSMqDataRsp, pRsp, len, code);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -164,9 +164,10 @@ int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, con
|
||||||
|
|
||||||
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
||||||
|
|
||||||
SEncoder encoder;
|
SEncoder encoder = {0};
|
||||||
tEncoderInit(&encoder, abuf, len);
|
tEncoderInit(&encoder, abuf, len);
|
||||||
tEncodeSMqDataRsp(&encoder, pRsp);
|
tEncodeSMqDataRsp(&encoder, pRsp);
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
|
||||||
SRpcMsg rsp = {
|
SRpcMsg rsp = {
|
||||||
.info = pMsg->info,
|
.info = pMsg->info,
|
||||||
|
@ -176,8 +177,8 @@ int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, con
|
||||||
};
|
};
|
||||||
tmsgSendRsp(&rsp);
|
tmsgSendRsp(&rsp);
|
||||||
|
|
||||||
char buf1[80];
|
char buf1[80] = {0};
|
||||||
char buf2[80];
|
char buf2[80] = {0};
|
||||||
tFormatOffset(buf1, 80, &pRsp->reqOffset);
|
tFormatOffset(buf1, 80, &pRsp->reqOffset);
|
||||||
tFormatOffset(buf2, 80, &pRsp->rspOffset);
|
tFormatOffset(buf2, 80, &pRsp->rspOffset);
|
||||||
tqDebug("vgId:%d from consumer:%" PRId64 ", (epoch %d) send rsp, block num: %d, reqOffset:%s, rspOffset:%s",
|
tqDebug("vgId:%d from consumer:%" PRId64 ", (epoch %d) send rsp, block num: %d, reqOffset:%s, rspOffset:%s",
|
||||||
|
|
|
@ -431,6 +431,12 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
|
||||||
|
|
||||||
pSup->tsColAgg.colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
pSup->tsColAgg.colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||||
|
|
||||||
|
code = tBlockDataInit(&pReader->status.fileBlockData);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
terrno = code;
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
|
||||||
pReader->pResBlock = createResBlock(pCond, pReader->capacity);
|
pReader->pResBlock = createResBlock(pCond, pReader->capacity);
|
||||||
if (pReader->pResBlock == NULL) {
|
if (pReader->pResBlock == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
@ -1200,8 +1206,9 @@ static int32_t buildDataBlockFromBuf(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, TSDBROW* pRow,
|
static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, TSDBROW* pRow,
|
||||||
STSRow* pTSRow, SIterInfo* pIter, int64_t key) {
|
SIterInfo* pIter, int64_t key) {
|
||||||
SRowMerger merge = {0};
|
SRowMerger merge = {0};
|
||||||
|
STSRow* pTSRow = NULL;
|
||||||
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
||||||
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
||||||
|
|
||||||
|
@ -1250,6 +1257,8 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
|
|
||||||
tRowMergerClear(&merge);
|
tRowMergerClear(&merge);
|
||||||
doAppendOneRow(pReader->pResBlock, pReader, pTSRow);
|
doAppendOneRow(pReader->pResBlock, pReader, pTSRow);
|
||||||
|
|
||||||
|
taosMemoryFree(pTSRow);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1411,8 +1420,6 @@ static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanI
|
||||||
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
||||||
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
||||||
|
|
||||||
STSRow* pTSRow = NULL;
|
|
||||||
|
|
||||||
int64_t key = pBlockData->aTSKEY[pDumpInfo->rowIndex];
|
int64_t key = pBlockData->aTSKEY[pDumpInfo->rowIndex];
|
||||||
TSDBROW* pRow = getValidRow(&pBlockScanInfo->iter, pBlockScanInfo->delSkyline, pReader);
|
TSDBROW* pRow = getValidRow(&pBlockScanInfo->iter, pBlockScanInfo->delSkyline, pReader);
|
||||||
TSDBROW* piRow = getValidRow(&pBlockScanInfo->iiter, pBlockScanInfo->delSkyline, pReader);
|
TSDBROW* piRow = getValidRow(&pBlockScanInfo->iiter, pBlockScanInfo->delSkyline, pReader);
|
||||||
|
@ -1422,23 +1429,27 @@ static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanI
|
||||||
} else {
|
} else {
|
||||||
// imem + file
|
// imem + file
|
||||||
if (pBlockScanInfo->iiter.hasVal) {
|
if (pBlockScanInfo->iiter.hasVal) {
|
||||||
return doMergeBufAndFileRows(pReader, pBlockScanInfo, piRow, pTSRow, &pBlockScanInfo->iiter, key);
|
return doMergeBufAndFileRows(pReader, pBlockScanInfo, piRow, &pBlockScanInfo->iiter, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// mem + file
|
// mem + file
|
||||||
if (pBlockScanInfo->iter.hasVal) {
|
if (pBlockScanInfo->iter.hasVal) {
|
||||||
return doMergeBufAndFileRows(pReader, pBlockScanInfo, pRow, pTSRow, &pBlockScanInfo->iter, key);
|
return doMergeBufAndFileRows(pReader, pBlockScanInfo, pRow, &pBlockScanInfo->iter, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// imem & mem are all empty, only file exist
|
// imem & mem are all empty, only file exist
|
||||||
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex);
|
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex);
|
||||||
|
|
||||||
|
STSRow* pTSRow = NULL;
|
||||||
SRowMerger merge = {0};
|
SRowMerger merge = {0};
|
||||||
|
|
||||||
tRowMergerInit(&merge, &fRow, pReader->pSchema);
|
tRowMergerInit(&merge, &fRow, pReader->pSchema);
|
||||||
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
||||||
tRowMergerGetRow(&merge, &pTSRow);
|
tRowMergerGetRow(&merge, &pTSRow);
|
||||||
doAppendOneRow(pReader->pResBlock, pReader, pTSRow);
|
doAppendOneRow(pReader->pResBlock, pReader, pTSRow);
|
||||||
|
|
||||||
|
taosMemoryFree(pTSRow);
|
||||||
|
tRowMergerClear(&merge);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1716,7 +1727,8 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
|
|
||||||
TSDBKEY key = getCurrentKeyInBuf(pBlockIter, pReader);
|
TSDBKEY key = getCurrentKeyInBuf(pBlockIter, pReader);
|
||||||
if (fileBlockShouldLoad(pReader, pFBlock, pBlock, pScanInfo, key)) {
|
if (fileBlockShouldLoad(pReader, pFBlock, pBlock, pScanInfo, key)) {
|
||||||
tBlockDataInit(&pStatus->fileBlockData);
|
tBlockDataReset(&pStatus->fileBlockData);
|
||||||
|
tBlockDataClearData(&pStatus->fileBlockData);
|
||||||
code = doLoadFileBlockData(pReader, pBlockIter, pScanInfo, &pStatus->fileBlockData);
|
code = doLoadFileBlockData(pReader, pBlockIter, pScanInfo, &pStatus->fileBlockData);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -2160,6 +2172,8 @@ static int32_t checkForNeighborFileBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
setFileBlockActiveInBlockIter(pBlockIter, neighborIndex, step);
|
setFileBlockActiveInBlockIter(pBlockIter, neighborIndex, step);
|
||||||
|
|
||||||
// 3. load the neighbor block, and set it to be the currently accessed file data block
|
// 3. load the neighbor block, and set it to be the currently accessed file data block
|
||||||
|
tBlockDataReset(&pStatus->fileBlockData);
|
||||||
|
tBlockDataClearData(&pStatus->fileBlockData);
|
||||||
int32_t code = doLoadFileBlockData(pReader, pBlockIter, pScanInfo, &pStatus->fileBlockData);
|
int32_t code = doLoadFileBlockData(pReader, pBlockIter, pScanInfo, &pStatus->fileBlockData);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -2563,6 +2577,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosMemoryFree(pSupInfo->buildBuf);
|
taosMemoryFree(pSupInfo->buildBuf);
|
||||||
|
tBlockDataClear(&pReader->status.fileBlockData, true);
|
||||||
|
|
||||||
cleanupDataBlockIterator(&pReader->status.blockIter);
|
cleanupDataBlockIterator(&pReader->status.blockIter);
|
||||||
|
|
||||||
|
@ -2760,13 +2775,9 @@ static SArray* doRetrieveDataBlock(STsdbReader* pReader) {
|
||||||
SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(&pStatus->blockIter);
|
SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(&pStatus->blockIter);
|
||||||
STableBlockScanInfo* pBlockScanInfo = taosHashGet(pStatus->pTableMap, &pFBlock->uid, sizeof(pFBlock->uid));
|
STableBlockScanInfo* pBlockScanInfo = taosHashGet(pStatus->pTableMap, &pFBlock->uid, sizeof(pFBlock->uid));
|
||||||
|
|
||||||
int32_t code = tBlockDataInit(&pStatus->fileBlockData);
|
tBlockDataReset(&pStatus->fileBlockData);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
tBlockDataClearData(&pStatus->fileBlockData);
|
||||||
terrno = code;
|
int32_t code = doLoadFileBlockData(pReader, &pStatus->blockIter, pBlockScanInfo, &pStatus->fileBlockData);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
code = doLoadFileBlockData(pReader, &pStatus->blockIter, pBlockScanInfo, &pStatus->fileBlockData);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tBlockDataClear(&pStatus->fileBlockData, 1);
|
tBlockDataClear(&pStatus->fileBlockData, 1);
|
||||||
|
|
||||||
|
@ -2775,7 +2786,6 @@ static SArray* doRetrieveDataBlock(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
copyBlockDataToSDataBlock(pReader, pBlockScanInfo);
|
copyBlockDataToSDataBlock(pReader, pBlockScanInfo);
|
||||||
tBlockDataClear(&pStatus->fileBlockData, 1);
|
|
||||||
return pReader->pResBlock->pDataBlock;
|
return pReader->pResBlock->pDataBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2872,9 +2882,7 @@ int32_t tsdbGetFileBlocksDistInfo(STsdbReader* pReader, STableBlockDistInfo* pTa
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (hasNext) {
|
if (hasNext) {
|
||||||
SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(pBlockIter);
|
SBlock* pBlock = getCurrentBlock(pBlockIter);
|
||||||
STableBlockScanInfo* pScanInfo = taosHashGet(pStatus->pTableMap, &pFBlock->uid, sizeof(pFBlock->uid));
|
|
||||||
SBlock* pBlock = taosArrayGet(pScanInfo->pBlockList, pFBlock->tbBlockIdx);
|
|
||||||
|
|
||||||
int32_t numOfRows = pBlock->nRow;
|
int32_t numOfRows = pBlock->nRow;
|
||||||
pTableBlockInfo->totalRows += numOfRows;
|
pTableBlockInfo->totalRows += numOfRows;
|
||||||
|
@ -2895,7 +2903,6 @@ int32_t tsdbGetFileBlocksDistInfo(STsdbReader* pReader, STableBlockDistInfo* pTa
|
||||||
pTableBlockInfo->blockRowsHisto[bucketIndex]++;
|
pTableBlockInfo->blockRowsHisto[bucketIndex]++;
|
||||||
|
|
||||||
hasNext = blockIteratorNext(&pStatus->blockIter);
|
hasNext = blockIteratorNext(&pStatus->blockIter);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
code = initForFirstBlockInFile(pReader, pBlockIter);
|
code = initForFirstBlockInFile(pReader, pBlockIter);
|
||||||
if ((code != TSDB_CODE_SUCCESS) || (pReader->status.loadFromFile == false)) {
|
if ((code != TSDB_CODE_SUCCESS) || (pReader->status.loadFromFile == false)) {
|
||||||
|
|
|
@ -1022,6 +1022,10 @@ void tBlockDataClear(SBlockData *pBlockData, int8_t deepClear) {
|
||||||
tFree((uint8_t *)pBlockData->aTSKEY);
|
tFree((uint8_t *)pBlockData->aTSKEY);
|
||||||
taosArrayDestroy(pBlockData->aIdx);
|
taosArrayDestroy(pBlockData->aIdx);
|
||||||
taosArrayDestroyEx(pBlockData->aColData, deepClear ? tColDataClear : NULL);
|
taosArrayDestroyEx(pBlockData->aColData, deepClear ? tColDataClear : NULL);
|
||||||
|
pBlockData->aColData = NULL;
|
||||||
|
pBlockData->aIdx = NULL;
|
||||||
|
pBlockData->aTSKEY = NULL;
|
||||||
|
pBlockData->aVersion = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBlockDataSetSchema(SBlockData *pBlockData, STSchema *pTSchema) {
|
int32_t tBlockDataSetSchema(SBlockData *pBlockData, STSchema *pTSchema) {
|
||||||
|
|
|
@ -106,7 +106,9 @@ int32_t vnodePreProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
.meta = pVnode->pMeta, .config = &pVnode->config, .vnode = pVnode, .pMsgCb = &pVnode->msgCb};
|
.meta = pVnode->pMeta, .config = &pVnode->config, .vnode = pVnode, .pMsgCb = &pVnode->msgCb};
|
||||||
|
|
||||||
code = qWorkerProcessDeleteMsg(&handle, pVnode->pQuery, pMsg, &res);
|
code = qWorkerProcessDeleteMsg(&handle, pVnode->pQuery, pMsg, &res);
|
||||||
if (code) goto _err;
|
if (code) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
// malloc and encode
|
// malloc and encode
|
||||||
tEncodeSize(tEncodeDeleteRes, &res, size, ret);
|
tEncodeSize(tEncodeDeleteRes, &res, size, ret);
|
||||||
|
@ -993,6 +995,11 @@ static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t version, void *pReq
|
||||||
SDecoder *pCoder = &(SDecoder){0};
|
SDecoder *pCoder = &(SDecoder){0};
|
||||||
SDeleteRes *pRes = &(SDeleteRes){0};
|
SDeleteRes *pRes = &(SDeleteRes){0};
|
||||||
|
|
||||||
|
pRsp->msgType = TDMT_VND_DELETE_RSP;
|
||||||
|
pRsp->pCont = NULL;
|
||||||
|
pRsp->contLen = 0;
|
||||||
|
pRsp->code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
pRes->uidList = taosArrayInit(0, sizeof(tb_uid_t));
|
pRes->uidList = taosArrayInit(0, sizeof(tb_uid_t));
|
||||||
if (pRes->uidList == NULL) {
|
if (pRes->uidList == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -1010,6 +1017,15 @@ static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t version, void *pReq
|
||||||
|
|
||||||
tDecoderClear(pCoder);
|
tDecoderClear(pCoder);
|
||||||
taosArrayDestroy(pRes->uidList);
|
taosArrayDestroy(pRes->uidList);
|
||||||
|
|
||||||
|
SVDeleteRsp rsp = {.affectedRows = pRes->affectedRows};
|
||||||
|
int32_t ret = 0;
|
||||||
|
tEncodeSize(tEncodeSVDeleteRsp, &rsp, pRsp->contLen, ret);
|
||||||
|
pRsp->pCont = rpcMallocCont(pRsp->contLen);
|
||||||
|
SEncoder ec = {0};
|
||||||
|
tEncoderInit(&ec, pRsp->pCont, pRsp->contLen);
|
||||||
|
tEncodeSVDeleteRsp(&ec, &rsp);
|
||||||
|
tEncoderClear(&ec);
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
|
|
|
@ -501,49 +501,54 @@ static void vnodeSyncReconfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReCon
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vnodeSyncCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) {
|
static void vnodeSyncCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) {
|
||||||
SVnode *pVnode = pFsm->data;
|
if (cbMeta.isWeak == 0) {
|
||||||
vTrace("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, msgtype:%d %s",
|
SVnode *pVnode = pFsm->data;
|
||||||
syncGetVgId(pVnode->sync), pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state,
|
vTrace("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, msgtype:%d %s",
|
||||||
syncUtilState2String(cbMeta.state), pMsg->msgType, TMSG_INFO(pMsg->msgType));
|
syncGetVgId(pVnode->sync), pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state,
|
||||||
|
syncUtilState2String(cbMeta.state), pMsg->msgType, TMSG_INFO(pMsg->msgType));
|
||||||
|
|
||||||
if (cbMeta.code == 0 && cbMeta.isWeak == 0) {
|
if (cbMeta.code == 0) {
|
||||||
SRpcMsg rpcMsg = {.msgType = pMsg->msgType, .contLen = pMsg->contLen};
|
SRpcMsg rpcMsg = {.msgType = pMsg->msgType, .contLen = pMsg->contLen};
|
||||||
rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
|
rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
|
||||||
memcpy(rpcMsg.pCont, pMsg->pCont, pMsg->contLen);
|
memcpy(rpcMsg.pCont, pMsg->pCont, pMsg->contLen);
|
||||||
syncGetAndDelRespRpc(pVnode->sync, cbMeta.seqNum, &rpcMsg.info);
|
syncGetAndDelRespRpc(pVnode->sync, cbMeta.seqNum, &rpcMsg.info);
|
||||||
rpcMsg.info.conn.applyIndex = cbMeta.index;
|
rpcMsg.info.conn.applyIndex = cbMeta.index;
|
||||||
rpcMsg.info.conn.applyTerm = cbMeta.term;
|
rpcMsg.info.conn.applyTerm = cbMeta.term;
|
||||||
tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg);
|
tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg);
|
||||||
} else {
|
} else {
|
||||||
SRpcMsg rsp = {.code = cbMeta.code, .info = pMsg->info};
|
SRpcMsg rsp = {.code = cbMeta.code, .info = pMsg->info};
|
||||||
vError("vgId:%d, sync commit error, msgtype:%d,%s, error:0x%X, errmsg:%s", syncGetVgId(pVnode->sync), pMsg->msgType,
|
vError("vgId:%d, sync commit error, msgtype:%d,%s, error:0x%X, errmsg:%s", syncGetVgId(pVnode->sync),
|
||||||
TMSG_INFO(pMsg->msgType), cbMeta.code, tstrerror(cbMeta.code));
|
pMsg->msgType, TMSG_INFO(pMsg->msgType), cbMeta.code, tstrerror(cbMeta.code));
|
||||||
if (rsp.info.handle != NULL) {
|
if (rsp.info.handle != NULL) {
|
||||||
tmsgSendRsp(&rsp);
|
tmsgSendRsp(&rsp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vnodeSyncPreCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) {
|
static void vnodeSyncPreCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) {
|
||||||
SVnode *pVnode = pFsm->data;
|
if (cbMeta.isWeak == 1) {
|
||||||
vTrace("vgId:%d, pre-commit-cb is excuted, fsm:%p, index:%" PRId64 ", isWeak:%d, code:%d, state:%d %s, msgtype:%d %s",
|
SVnode *pVnode = pFsm->data;
|
||||||
syncGetVgId(pVnode->sync), pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state,
|
vTrace("vgId:%d, pre-commit-cb is excuted, fsm:%p, index:%" PRId64
|
||||||
syncUtilState2String(cbMeta.state), pMsg->msgType, TMSG_INFO(pMsg->msgType));
|
", isWeak:%d, code:%d, state:%d %s, msgtype:%d %s",
|
||||||
|
syncGetVgId(pVnode->sync), pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state,
|
||||||
|
syncUtilState2String(cbMeta.state), pMsg->msgType, TMSG_INFO(pMsg->msgType));
|
||||||
|
|
||||||
if (cbMeta.code == 0 && cbMeta.isWeak == 1) {
|
if (cbMeta.code == 0) {
|
||||||
SRpcMsg rpcMsg = {.msgType = pMsg->msgType, .contLen = pMsg->contLen};
|
SRpcMsg rpcMsg = {.msgType = pMsg->msgType, .contLen = pMsg->contLen};
|
||||||
rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
|
rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
|
||||||
memcpy(rpcMsg.pCont, pMsg->pCont, pMsg->contLen);
|
memcpy(rpcMsg.pCont, pMsg->pCont, pMsg->contLen);
|
||||||
syncGetAndDelRespRpc(pVnode->sync, cbMeta.seqNum, &rpcMsg.info);
|
syncGetAndDelRespRpc(pVnode->sync, cbMeta.seqNum, &rpcMsg.info);
|
||||||
rpcMsg.info.conn.applyIndex = cbMeta.index;
|
rpcMsg.info.conn.applyIndex = cbMeta.index;
|
||||||
rpcMsg.info.conn.applyTerm = cbMeta.term;
|
rpcMsg.info.conn.applyTerm = cbMeta.term;
|
||||||
tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg);
|
tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg);
|
||||||
} else {
|
} else {
|
||||||
SRpcMsg rsp = {.code = cbMeta.code, .info = pMsg->info};
|
SRpcMsg rsp = {.code = cbMeta.code, .info = pMsg->info};
|
||||||
vError("vgId:%d, sync pre-commit error, msgtype:%d,%s, error:0x%X, errmsg:%s", syncGetVgId(pVnode->sync),
|
vError("vgId:%d, sync pre-commit error, msgtype:%d,%s, error:0x%X, errmsg:%s", syncGetVgId(pVnode->sync),
|
||||||
pMsg->msgType, TMSG_INFO(pMsg->msgType), cbMeta.code, tstrerror(cbMeta.code));
|
pMsg->msgType, TMSG_INFO(pMsg->msgType), cbMeta.code, tstrerror(cbMeta.code));
|
||||||
if (rsp.info.handle != NULL) {
|
if (rsp.info.handle != NULL) {
|
||||||
tmsgSendRsp(&rsp);
|
tmsgSendRsp(&rsp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,7 +103,7 @@ void sendCreateDbMsg(void *shandle, SEpSet *pEpSet) {
|
||||||
createReq.daysToKeep2 = 3650;
|
createReq.daysToKeep2 = 3650;
|
||||||
createReq.minRows = 100;
|
createReq.minRows = 100;
|
||||||
createReq.maxRows = 4096;
|
createReq.maxRows = 4096;
|
||||||
createReq.fsyncPeriod = 3000;
|
createReq.walFsyncPeriod = 3000;
|
||||||
createReq.walLevel = 1;
|
createReq.walLevel = 1;
|
||||||
createReq.precision = 0;
|
createReq.precision = 0;
|
||||||
createReq.compression = 2;
|
createReq.compression = 2;
|
||||||
|
|
|
@ -225,7 +225,7 @@ static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbFName, S
|
||||||
"CREATE DATABASE `%s` BUFFER %d CACHEMODEL %d COMP %d DURATION %dm "
|
"CREATE DATABASE `%s` BUFFER %d CACHEMODEL %d COMP %d DURATION %dm "
|
||||||
"FSYNC %d MAXROWS %d MINROWS %d KEEP %dm,%dm,%dm PAGES %d PAGESIZE %d PRECISION '%s' REPLICA %d "
|
"FSYNC %d MAXROWS %d MINROWS %d KEEP %dm,%dm,%dm PAGES %d PAGESIZE %d PRECISION '%s' REPLICA %d "
|
||||||
"STRICT %d WAL %d VGROUPS %d SINGLE_STABLE %d",
|
"STRICT %d WAL %d VGROUPS %d SINGLE_STABLE %d",
|
||||||
dbFName, pCfg->buffer, pCfg->cacheLast, pCfg->compression, pCfg->daysPerFile, pCfg->fsyncPeriod,
|
dbFName, pCfg->buffer, pCfg->cacheLast, pCfg->compression, pCfg->daysPerFile, pCfg->walFsyncPeriod,
|
||||||
pCfg->maxRows, pCfg->minRows, pCfg->daysToKeep0, pCfg->daysToKeep1, pCfg->daysToKeep2, pCfg->pages,
|
pCfg->maxRows, pCfg->minRows, pCfg->daysToKeep0, pCfg->daysToKeep1, pCfg->daysToKeep2, pCfg->pages,
|
||||||
pCfg->pageSize, prec, pCfg->replications, pCfg->strict, pCfg->walLevel, pCfg->numOfVgroups,
|
pCfg->pageSize, prec, pCfg->replications, pCfg->strict, pCfg->walLevel, pCfg->numOfVgroups,
|
||||||
1 == pCfg->numOfStables);
|
1 == pCfg->numOfStables);
|
||||||
|
|
|
@ -468,7 +468,6 @@ typedef struct SStreamScanInfo {
|
||||||
SSDataBlock* pUpdateDataRes;
|
SSDataBlock* pUpdateDataRes;
|
||||||
// status for tmq
|
// status for tmq
|
||||||
// SSchemaWrapper schema;
|
// SSchemaWrapper schema;
|
||||||
STqOffset offset;
|
|
||||||
SNodeList* pGroupTags;
|
SNodeList* pGroupTags;
|
||||||
SNode* pTagCond;
|
SNode* pTagCond;
|
||||||
SNode* pTagIndexCond;
|
SNode* pTagIndexCond;
|
||||||
|
@ -804,6 +803,7 @@ typedef struct STagFilterOperatorInfo {
|
||||||
typedef struct SJoinOperatorInfo {
|
typedef struct SJoinOperatorInfo {
|
||||||
SSDataBlock *pRes;
|
SSDataBlock *pRes;
|
||||||
int32_t joinType;
|
int32_t joinType;
|
||||||
|
int32_t inputTsOrder;
|
||||||
|
|
||||||
SSDataBlock *pLeft;
|
SSDataBlock *pLeft;
|
||||||
int32_t leftPos;
|
int32_t leftPos;
|
||||||
|
@ -1020,6 +1020,7 @@ void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsCol
|
||||||
|
|
||||||
int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* groupKey);
|
int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* groupKey);
|
||||||
SSDataBlock* createSpecialDataBlock(EStreamType type);
|
SSDataBlock* createSpecialDataBlock(EStreamType type);
|
||||||
|
void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,7 @@ static void toDataCacheEntry(SDataDeleterHandle* pHandle, const SInputData* pInp
|
||||||
pRes->uidList = pHandle->pParam->pUidList;
|
pRes->uidList = pHandle->pParam->pUidList;
|
||||||
pRes->skey = pHandle->pDeleter->deleteTimeRange.skey;
|
pRes->skey = pHandle->pDeleter->deleteTimeRange.skey;
|
||||||
pRes->ekey = pHandle->pDeleter->deleteTimeRange.ekey;
|
pRes->ekey = pHandle->pDeleter->deleteTimeRange.ekey;
|
||||||
|
strcpy(pRes->tableFName, pHandle->pDeleter->tableFName);
|
||||||
pRes->affectedRows = *(int64_t*)pColRes->pData;
|
pRes->affectedRows = *(int64_t*)pColRes->pData;
|
||||||
|
|
||||||
pBuf->useSize += pEntry->dataLen;
|
pBuf->useSize += pEntry->dataLen;
|
||||||
|
|
|
@ -193,7 +193,7 @@ SSDataBlock* createResDataBlock(SDataBlockDescNode* pNode) {
|
||||||
pBlock->info.calWin = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
|
pBlock->info.calWin = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SSlotDescNode* pDescNode = (SSlotDescNode*)nodesListGetNode(pNode->pSlots, i);
|
SSlotDescNode* pDescNode = (SSlotDescNode*)nodesListGetNode(pNode->pSlots, i);
|
||||||
SColumnInfoData idata =
|
SColumnInfoData idata =
|
||||||
createColumnInfoData(pDescNode->dataType.type, pDescNode->dataType.bytes, pDescNode->slotId);
|
createColumnInfoData(pDescNode->dataType.type, pDescNode->dataType.bytes, pDescNode->slotId);
|
||||||
idata.info.scale = pDescNode->dataType.scale;
|
idata.info.scale = pDescNode->dataType.scale;
|
||||||
|
@ -267,8 +267,9 @@ int32_t isQualifiedTable(STableKeyInfo* info, SNode* pTagCond, void* metaHandle,
|
||||||
code = metaGetTableEntryByUid(&mr, info->uid);
|
code = metaGetTableEntryByUid(&mr, info->uid);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
|
*pQualified = false;
|
||||||
|
|
||||||
return terrno;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* pTagCondTmp = nodesCloneNode(pTagCond);
|
SNode* pTagCondTmp = nodesCloneNode(pTagCond);
|
||||||
|
@ -387,7 +388,7 @@ size_t getTableTagsBufLen(const SNodeList* pGroups) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode, char* keyBuf, uint64_t* pGroupId) {
|
int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode, char* keyBuf, uint64_t* pGroupId) {
|
||||||
SMetaReader mr = {0};
|
SMetaReader mr = {0};
|
||||||
metaReaderInit(&mr, pMeta, 0);
|
metaReaderInit(&mr, pMeta, 0);
|
||||||
metaGetTableEntryByUid(&mr, uid);
|
metaGetTableEntryByUid(&mr, uid);
|
||||||
|
|
||||||
|
@ -395,7 +396,7 @@ int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode,
|
||||||
|
|
||||||
nodesRewriteExprsPostOrder(groupNew, doTranslateTagExpr, &mr);
|
nodesRewriteExprsPostOrder(groupNew, doTranslateTagExpr, &mr);
|
||||||
char* isNull = (char*)keyBuf;
|
char* isNull = (char*)keyBuf;
|
||||||
char* pStart = (char*)keyBuf + sizeof(int8_t)*LIST_LENGTH(pGroupNode);
|
char* pStart = (char*)keyBuf + sizeof(int8_t) * LIST_LENGTH(pGroupNode);
|
||||||
|
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
|
@ -441,7 +442,7 @@ int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t len = (int32_t)(pStart - (char*)keyBuf);
|
int32_t len = (int32_t)(pStart - (char*)keyBuf);
|
||||||
*pGroupId = calcGroupId(keyBuf, len);
|
*pGroupId = calcGroupId(keyBuf, len);
|
||||||
|
|
||||||
nodesDestroyList(groupNew);
|
nodesDestroyList(groupNew);
|
||||||
|
|
|
@ -14,12 +14,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "executor.h"
|
#include "executor.h"
|
||||||
#include "tref.h"
|
|
||||||
#include "executorimpl.h"
|
#include "executorimpl.h"
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
#include "vnode.h"
|
#include "tref.h"
|
||||||
#include "tudf.h"
|
#include "tudf.h"
|
||||||
|
#include "vnode.h"
|
||||||
|
|
||||||
static TdThreadOnce initPoolOnce = PTHREAD_ONCE_INIT;
|
static TdThreadOnce initPoolOnce = PTHREAD_ONCE_INIT;
|
||||||
int32_t exchangeObjRefPool = -1;
|
int32_t exchangeObjRefPool = -1;
|
||||||
|
@ -95,16 +95,6 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
int32_t qStreamScanSnapshot(qTaskInfo_t tinfo) {
|
|
||||||
if (tinfo == NULL) {
|
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
|
||||||
}
|
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
|
||||||
return doSetStreamBlock(pTaskInfo->pRoot, NULL, 0, STREAM_INPUT__TABLE_SCAN, 0, NULL);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t qSetStreamInput(qTaskInfo_t tinfo, const void* input, int32_t type, bool assignUid) {
|
int32_t qSetStreamInput(qTaskInfo_t tinfo, const void* input, int32_t type, bool assignUid) {
|
||||||
return qSetMultiStreamInput(tinfo, input, 1, type, assignUid);
|
return qSetMultiStreamInput(tinfo, input, 1, type, assignUid);
|
||||||
}
|
}
|
||||||
|
@ -258,8 +248,8 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo refactor STableList
|
// todo refactor STableList
|
||||||
size_t bufLen = (pScanInfo->pGroupTags != NULL)? getTableTagsBufLen(pScanInfo->pGroupTags):0;
|
size_t bufLen = (pScanInfo->pGroupTags != NULL) ? getTableTagsBufLen(pScanInfo->pGroupTags) : 0;
|
||||||
char* keyBuf = NULL;
|
char* keyBuf = NULL;
|
||||||
if (bufLen > 0) {
|
if (bufLen > 0) {
|
||||||
keyBuf = taosMemoryMalloc(bufLen);
|
keyBuf = taosMemoryMalloc(bufLen);
|
||||||
if (keyBuf == NULL) {
|
if (keyBuf == NULL) {
|
||||||
|
@ -267,13 +257,13 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int32_t i = 0; i < taosArrayGetSize(qa); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(qa); ++i) {
|
||||||
uint64_t* uid = taosArrayGet(qa, i);
|
uint64_t* uid = taosArrayGet(qa, i);
|
||||||
STableKeyInfo keyInfo = {.uid = *uid, .groupId = 0};
|
STableKeyInfo keyInfo = {.uid = *uid, .groupId = 0};
|
||||||
|
|
||||||
if (bufLen > 0) {
|
if (bufLen > 0) {
|
||||||
code = getGroupIdFromTagsVal(pScanInfo->readHandle.meta, keyInfo.uid, pScanInfo->pGroupTags, keyBuf,
|
code = getGroupIdFromTagsVal(pScanInfo->readHandle.meta, keyInfo.uid, pScanInfo->pGroupTags, keyBuf,
|
||||||
&keyInfo.groupId);
|
&keyInfo.groupId);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -347,9 +337,12 @@ int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId,
|
||||||
}
|
}
|
||||||
|
|
||||||
code = dsCreateDataSinker(pSubplan->pDataSink, handle, pSinkParam);
|
code = dsCreateDataSinker(pSubplan->pDataSink, handle, pSinkParam);
|
||||||
|
if(code != TSDB_CODE_SUCCESS){
|
||||||
|
taosMemoryFreeClear(pSinkParam);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
// if failed to add ref for all tables in this query, abort current query
|
// if failed to add ref for all tables in this query, abort current query
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -573,11 +566,6 @@ const SSchemaWrapper* qExtractSchemaFromStreamScanner(void* scanner) {
|
||||||
return pInfo->tqReader->pSchemaWrapper;
|
return pInfo->tqReader->pSchemaWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
const STqOffset* qExtractStatusFromStreamScanner(void* scanner) {
|
|
||||||
SStreamScanInfo* pInfo = scanner;
|
|
||||||
return &pInfo->offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* qStreamExtractMetaMsg(qTaskInfo_t tinfo) {
|
void* qStreamExtractMetaMsg(qTaskInfo_t tinfo) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE);
|
ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE);
|
||||||
|
@ -600,12 +588,17 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, const STqOffsetVal* pOffset) {
|
||||||
while (1) {
|
while (1) {
|
||||||
uint8_t type = pOperator->operatorType;
|
uint8_t type = pOperator->operatorType;
|
||||||
pOperator->status = OP_OPENED;
|
pOperator->status = OP_OPENED;
|
||||||
if (type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
// TODO add more check
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
if (type != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
if (pOffset->type == TMQ_OFFSET__LOG) {
|
ASSERT(pOperator->numOfDownstream == 1);
|
||||||
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
pOperator = pOperator->pDownstream[0];
|
||||||
tsdbReaderClose(pTSInfo->dataReader);
|
}
|
||||||
pTSInfo->dataReader = NULL;
|
|
||||||
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
|
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
||||||
|
tsdbReaderClose(pTSInfo->dataReader);
|
||||||
|
pTSInfo->dataReader = NULL;
|
||||||
#if 0
|
#if 0
|
||||||
if (tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus) &&
|
if (tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus) &&
|
||||||
pInfo->tqReader->pWalReader->curVersion != pOffset->version) {
|
pInfo->tqReader->pWalReader->curVersion != pOffset->version) {
|
||||||
|
@ -614,102 +607,74 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, const STqOffsetVal* pOffset) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (tqSeekVer(pInfo->tqReader, pOffset->version + 1) < 0) {
|
if (tqSeekVer(pInfo->tqReader, pOffset->version + 1) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ASSERT(pInfo->tqReader->pWalReader->curVersion == pOffset->version + 1);
|
||||||
|
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
|
/*pInfo->blockType = STREAM_INPUT__TABLE_SCAN;*/
|
||||||
|
int64_t uid = pOffset->uid;
|
||||||
|
int64_t ts = pOffset->ts;
|
||||||
|
|
||||||
|
if (uid == 0) {
|
||||||
|
if (taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList) != 0) {
|
||||||
|
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, 0);
|
||||||
|
uid = pTableInfo->uid;
|
||||||
|
ts = INT64_MIN;
|
||||||
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ASSERT(pInfo->tqReader->pWalReader->curVersion == pOffset->version + 1);
|
}
|
||||||
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
|
||||||
/*pInfo->blockType = STREAM_INPUT__TABLE_SCAN;*/
|
|
||||||
int64_t uid = pOffset->uid;
|
|
||||||
int64_t ts = pOffset->ts;
|
|
||||||
|
|
||||||
if (uid == 0) {
|
/*if (pTaskInfo->streamInfo.lastStatus.type != TMQ_OFFSET__SNAPSHOT_DATA ||*/
|
||||||
if (taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList) != 0) {
|
/*pTaskInfo->streamInfo.lastStatus.uid != uid || pTaskInfo->streamInfo.lastStatus.ts != ts) {*/
|
||||||
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, 0);
|
STableScanInfo* pTableScanInfo = pInfo->pTableScanOp->info;
|
||||||
uid = pTableInfo->uid;
|
int32_t tableSz = taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList);
|
||||||
ts = INT64_MIN;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if (pTaskInfo->streamInfo.lastStatus.type != TMQ_OFFSET__SNAPSHOT_DATA ||*/
|
|
||||||
/*pTaskInfo->streamInfo.lastStatus.uid != uid || pTaskInfo->streamInfo.lastStatus.ts != ts) {*/
|
|
||||||
STableScanInfo* pTableScanInfo = pInfo->pTableScanOp->info;
|
|
||||||
int32_t tableSz = taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList);
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
|
||||||
qDebug("switch to next table %ld (cursor %d), %ld rows returned", uid, pTableScanInfo->currentTable,
|
qDebug("switch to next table %ld (cursor %d), %ld rows returned", uid, pTableScanInfo->currentTable,
|
||||||
pInfo->pTableScanOp->resultInfo.totalRows);
|
pInfo->pTableScanOp->resultInfo.totalRows);
|
||||||
pInfo->pTableScanOp->resultInfo.totalRows = 0;
|
pInfo->pTableScanOp->resultInfo.totalRows = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int32_t i = 0; i < tableSz; i++) {
|
for (int32_t i = 0; i < tableSz; i++) {
|
||||||
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, i);
|
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, i);
|
||||||
if (pTableInfo->uid == uid) {
|
if (pTableInfo->uid == uid) {
|
||||||
found = true;
|
found = true;
|
||||||
pTableScanInfo->currentTable = i;
|
pTableScanInfo->currentTable = i;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO after dropping table, table may be not found
|
|
||||||
ASSERT(found);
|
|
||||||
|
|
||||||
if (pTableScanInfo->dataReader == NULL) {
|
|
||||||
if (tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &pTableScanInfo->cond,
|
|
||||||
pTaskInfo->tableqinfoList.pTableList, &pTableScanInfo->dataReader, NULL) < 0 ||
|
|
||||||
pTableScanInfo->dataReader == NULL) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tsdbSetTableId(pTableScanInfo->dataReader, uid);
|
|
||||||
int64_t oldSkey = pTableScanInfo->cond.twindows.skey;
|
|
||||||
pTableScanInfo->cond.twindows.skey = ts + 1;
|
|
||||||
tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
|
|
||||||
pTableScanInfo->cond.twindows.skey = oldSkey;
|
|
||||||
pTableScanInfo->scanTimes = 0;
|
|
||||||
|
|
||||||
qDebug("tsdb reader offset seek to uid %ld ts %ld, table cur set to %d , all table num %d", uid, ts,
|
|
||||||
pTableScanInfo->currentTable, tableSz);
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
// TODO after dropping table, table may be not found
|
||||||
|
ASSERT(found);
|
||||||
|
|
||||||
|
if (pTableScanInfo->dataReader == NULL) {
|
||||||
|
if (tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &pTableScanInfo->cond,
|
||||||
|
pTaskInfo->tableqinfoList.pTableList, &pTableScanInfo->dataReader, NULL) < 0 ||
|
||||||
|
pTableScanInfo->dataReader == NULL) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbSetTableId(pTableScanInfo->dataReader, uid);
|
||||||
|
int64_t oldSkey = pTableScanInfo->cond.twindows.skey;
|
||||||
|
pTableScanInfo->cond.twindows.skey = ts + 1;
|
||||||
|
tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
|
||||||
|
pTableScanInfo->cond.twindows.skey = oldSkey;
|
||||||
|
pTableScanInfo->scanTimes = 0;
|
||||||
|
|
||||||
|
qDebug("tsdb reader offset seek to uid %ld ts %ld, table cur set to %d , all table num %d", uid, ts,
|
||||||
|
pTableScanInfo->currentTable, tableSz);
|
||||||
|
/*}*/
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ASSERT(pOperator->numOfDownstream == 1);
|
ASSERT(0);
|
||||||
pOperator = pOperator->pDownstream[0];
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
int32_t qStreamPrepareTsdbScan(qTaskInfo_t tinfo, uint64_t uid, int64_t ts) {
|
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
|
||||||
|
|
||||||
if (uid == 0) {
|
|
||||||
if (taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList) != 0) {
|
|
||||||
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, 0);
|
|
||||||
uid = pTableInfo->uid;
|
|
||||||
ts = INT64_MIN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return doPrepareScan(pTaskInfo->pRoot, uid, ts);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t qGetStreamScanStatus(qTaskInfo_t tinfo, uint64_t* uid, int64_t* ts) {
|
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
|
||||||
|
|
||||||
return doGetScanStatus(pTaskInfo->pRoot, uid, ts);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ static void setBlockStatisInfo(SqlFunctionCtx* pCtx, SExprInfo* pExpr, SSDataBlo
|
||||||
|
|
||||||
static void releaseQueryBuf(size_t numOfTables);
|
static void releaseQueryBuf(size_t numOfTables);
|
||||||
|
|
||||||
static void destroySFillOperatorInfo(void* param, int32_t numOfOutput);
|
static void destroyFillOperatorInfo(void* param, int32_t numOfOutput);
|
||||||
static void destroyProjectOperatorInfo(void* param, int32_t numOfOutput);
|
static void destroyProjectOperatorInfo(void* param, int32_t numOfOutput);
|
||||||
static void destroyOrderOperatorInfo(void* param, int32_t numOfOutput);
|
static void destroyOrderOperatorInfo(void* param, int32_t numOfOutput);
|
||||||
static void destroyAggOperatorInfo(void* param, int32_t numOfOutput);
|
static void destroyAggOperatorInfo(void* param, int32_t numOfOutput);
|
||||||
|
@ -3209,9 +3209,8 @@ static void doHandleRemainBlockFromNewGroup(SFillOperatorInfo* pInfo, SResultInf
|
||||||
if (taosFillHasMoreResults(pInfo->pFillInfo)) {
|
if (taosFillHasMoreResults(pInfo->pFillInfo)) {
|
||||||
int32_t numOfResultRows = pResultInfo->capacity - pInfo->pRes->info.rows;
|
int32_t numOfResultRows = pResultInfo->capacity - pInfo->pRes->info.rows;
|
||||||
taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pRes, numOfResultRows);
|
taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pRes, numOfResultRows);
|
||||||
if (pInfo->pRes->info.rows > pResultInfo->threshold) {
|
pInfo->pRes->info.groupId = pInfo->curGroupId;
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle the cached new group data block
|
// handle the cached new group data block
|
||||||
|
@ -3230,7 +3229,7 @@ static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
|
||||||
blockDataCleanup(pResBlock);
|
blockDataCleanup(pResBlock);
|
||||||
|
|
||||||
doHandleRemainBlockFromNewGroup(pInfo, pResultInfo, pTaskInfo);
|
doHandleRemainBlockFromNewGroup(pInfo, pResultInfo, pTaskInfo);
|
||||||
if (pResBlock->info.rows > pResultInfo->threshold || pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
pResBlock->info.groupId = pInfo->curGroupId;
|
pResBlock->info.groupId = pInfo->curGroupId;
|
||||||
return pResBlock;
|
return pResBlock;
|
||||||
}
|
}
|
||||||
|
@ -3436,7 +3435,7 @@ void initBasicInfo(SOptrBasicInfo* pInfo, SSDataBlock* pBlock) {
|
||||||
initResultRowInfo(&pInfo->resultRowInfo);
|
initResultRowInfo(&pInfo->resultRowInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput) {
|
void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||||
if (pCtx == NULL) {
|
if (pCtx == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -3553,16 +3552,17 @@ void destroyAggOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
cleanupBasicInfo(&pInfo->binfo);
|
cleanupBasicInfo(&pInfo->binfo);
|
||||||
|
|
||||||
cleanupAggSup(&pInfo->aggSup);
|
cleanupAggSup(&pInfo->aggSup);
|
||||||
|
cleanupExprSupp(&pInfo->scalarExprSup);
|
||||||
cleanupGroupResInfo(&pInfo->groupResInfo);
|
cleanupGroupResInfo(&pInfo->groupResInfo);
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroySFillOperatorInfo(void* param, int32_t numOfOutput) {
|
void destroyFillOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
SFillOperatorInfo* pInfo = (SFillOperatorInfo*)param;
|
SFillOperatorInfo* pInfo = (SFillOperatorInfo*)param;
|
||||||
pInfo->pFillInfo = taosDestroyFillInfo(pInfo->pFillInfo);
|
pInfo->pFillInfo = taosDestroyFillInfo(pInfo->pFillInfo);
|
||||||
pInfo->pRes = blockDataDestroy(pInfo->pRes);
|
pInfo->pRes = blockDataDestroy(pInfo->pRes);
|
||||||
taosMemoryFreeClear(pInfo->p);
|
taosMemoryFreeClear(pInfo->p);
|
||||||
|
taosArrayDestroy(pInfo->pColMatchColInfo);
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3653,7 +3653,7 @@ SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode*
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
|
||||||
pOperator->fpSet =
|
pOperator->fpSet =
|
||||||
createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, NULL, destroySFillOperatorInfo, NULL, NULL, NULL);
|
createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, NULL, destroyFillOperatorInfo, NULL, NULL, NULL);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
|
|
@ -77,6 +77,13 @@ SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t
|
||||||
pInfo->pCondAfterMerge = NULL;
|
pInfo->pCondAfterMerge = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pInfo->inputTsOrder = TSDB_ORDER_ASC;
|
||||||
|
if (pJoinNode->inputTsOrder == ORDER_ASC) {
|
||||||
|
pInfo->inputTsOrder = TSDB_ORDER_ASC;
|
||||||
|
} else if (pJoinNode->inputTsOrder == ORDER_DESC) {
|
||||||
|
pInfo->inputTsOrder = TSDB_ORDER_DESC;
|
||||||
|
}
|
||||||
|
|
||||||
pOperator->fpSet =
|
pOperator->fpSet =
|
||||||
createOperatorFpSet(operatorDummyOpenFn, doMergeJoin, NULL, NULL, destroyMergeJoinOperator, NULL, NULL, NULL);
|
createOperatorFpSet(operatorDummyOpenFn, doMergeJoin, NULL, NULL, destroyMergeJoinOperator, NULL, NULL, NULL);
|
||||||
int32_t code = appendDownstream(pOperator, pDownstream, numOfDownstream);
|
int32_t code = appendDownstream(pOperator, pDownstream, numOfDownstream);
|
||||||
|
@ -108,81 +115,105 @@ void destroyMergeJoinOperator(void* param, int32_t numOfOutput) {
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mergeJoinJoinLeftRight(struct SOperatorInfo* pOperator, SSDataBlock* pRes, int32_t currRow,
|
||||||
|
SSDataBlock* pLeftBlock, int32_t leftPos, SSDataBlock* pRightBlock, int32_t rightPos) {
|
||||||
|
SJoinOperatorInfo* pJoinInfo = pOperator->info;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pOperator->exprSupp.numOfExprs; ++i) {
|
||||||
|
SColumnInfoData* pDst = taosArrayGet(pRes->pDataBlock, i);
|
||||||
|
|
||||||
|
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[i];
|
||||||
|
|
||||||
|
int32_t blockId = pExprInfo->base.pParam[0].pCol->dataBlockId;
|
||||||
|
int32_t slotId = pExprInfo->base.pParam[0].pCol->slotId;
|
||||||
|
int32_t rowIndex = -1;
|
||||||
|
|
||||||
|
SColumnInfoData* pSrc = NULL;
|
||||||
|
if (pJoinInfo->pLeft->info.blockId == blockId) {
|
||||||
|
pSrc = taosArrayGet(pLeftBlock->pDataBlock, slotId);
|
||||||
|
rowIndex = leftPos;
|
||||||
|
} else {
|
||||||
|
pSrc = taosArrayGet(pRightBlock->pDataBlock, slotId);
|
||||||
|
rowIndex = rightPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colDataIsNull_s(pSrc, rowIndex)) {
|
||||||
|
colDataAppendNULL(pDst, currRow);
|
||||||
|
} else {
|
||||||
|
char* p = colDataGetData(pSrc, rowIndex);
|
||||||
|
colDataAppend(pDst, currRow, p, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool mergeJoinGetNextTimestamp(SOperatorInfo* pOperator, int64_t* pLeftTs, int64_t* pRightTs) {
|
||||||
|
SJoinOperatorInfo* pJoinInfo = pOperator->info;
|
||||||
|
|
||||||
|
if (pJoinInfo->pLeft == NULL || pJoinInfo->leftPos >= pJoinInfo->pLeft->info.rows) {
|
||||||
|
SOperatorInfo* ds1 = pOperator->pDownstream[0];
|
||||||
|
pJoinInfo->pLeft = ds1->fpSet.getNextFn(ds1);
|
||||||
|
|
||||||
|
pJoinInfo->leftPos = 0;
|
||||||
|
if (pJoinInfo->pLeft == NULL) {
|
||||||
|
setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pJoinInfo->pRight == NULL || pJoinInfo->rightPos >= pJoinInfo->pRight->info.rows) {
|
||||||
|
SOperatorInfo* ds2 = pOperator->pDownstream[1];
|
||||||
|
pJoinInfo->pRight = ds2->fpSet.getNextFn(ds2);
|
||||||
|
|
||||||
|
pJoinInfo->rightPos = 0;
|
||||||
|
if (pJoinInfo->pRight == NULL) {
|
||||||
|
setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// only the timestamp match support for ordinary table
|
||||||
|
SColumnInfoData* pLeftCol = taosArrayGet(pJoinInfo->pLeft->pDataBlock, pJoinInfo->leftCol.slotId);
|
||||||
|
char* pLeftVal = colDataGetData(pLeftCol, pJoinInfo->leftPos);
|
||||||
|
*pLeftTs = *(int64_t*)pLeftVal;
|
||||||
|
|
||||||
|
SColumnInfoData* pRightCol = taosArrayGet(pJoinInfo->pRight->pDataBlock, pJoinInfo->rightCol.slotId);
|
||||||
|
char* pRightVal = colDataGetData(pRightCol, pJoinInfo->rightPos);
|
||||||
|
*pRightTs = *(int64_t*)pRightVal;
|
||||||
|
|
||||||
|
ASSERT(pLeftCol->info.type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
|
ASSERT(pRightCol->info.type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void doMergeJoinImpl(struct SOperatorInfo* pOperator, SSDataBlock* pRes) {
|
static void doMergeJoinImpl(struct SOperatorInfo* pOperator, SSDataBlock* pRes) {
|
||||||
SJoinOperatorInfo* pJoinInfo = pOperator->info;
|
SJoinOperatorInfo* pJoinInfo = pOperator->info;
|
||||||
|
|
||||||
int32_t nrows = 0;
|
int32_t nrows = pRes->info.rows;
|
||||||
|
|
||||||
|
bool asc = (pJoinInfo->inputTsOrder == TSDB_ORDER_ASC) ? true : false;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
// todo extract method
|
int64_t leftTs = 0;
|
||||||
if (pJoinInfo->pLeft == NULL || pJoinInfo->leftPos >= pJoinInfo->pLeft->info.rows) {
|
int64_t rightTs = 0;
|
||||||
SOperatorInfo* ds1 = pOperator->pDownstream[0];
|
bool hasNextTs = mergeJoinGetNextTimestamp(pOperator, &leftTs, &rightTs);
|
||||||
pJoinInfo->pLeft = ds1->fpSet.getNextFn(ds1);
|
if (!hasNextTs) {
|
||||||
|
break;
|
||||||
pJoinInfo->leftPos = 0;
|
|
||||||
if (pJoinInfo->pLeft == NULL) {
|
|
||||||
setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pJoinInfo->pRight == NULL || pJoinInfo->rightPos >= pJoinInfo->pRight->info.rows) {
|
if (leftTs == rightTs) {
|
||||||
SOperatorInfo* ds2 = pOperator->pDownstream[1];
|
mergeJoinJoinLeftRight(pOperator, pRes, nrows,
|
||||||
pJoinInfo->pRight = ds2->fpSet.getNextFn(ds2);
|
pJoinInfo->pLeft, pJoinInfo->leftPos, pJoinInfo->pRight, pJoinInfo->rightPos);
|
||||||
|
|
||||||
pJoinInfo->rightPos = 0;
|
|
||||||
if (pJoinInfo->pRight == NULL) {
|
|
||||||
setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SColumnInfoData* pLeftCol = taosArrayGet(pJoinInfo->pLeft->pDataBlock, pJoinInfo->leftCol.slotId);
|
|
||||||
char* pLeftVal = colDataGetData(pLeftCol, pJoinInfo->leftPos);
|
|
||||||
|
|
||||||
SColumnInfoData* pRightCol = taosArrayGet(pJoinInfo->pRight->pDataBlock, pJoinInfo->rightCol.slotId);
|
|
||||||
char* pRightVal = colDataGetData(pRightCol, pJoinInfo->rightPos);
|
|
||||||
|
|
||||||
// only the timestamp match support for ordinary table
|
|
||||||
ASSERT(pLeftCol->info.type == TSDB_DATA_TYPE_TIMESTAMP);
|
|
||||||
if (*(int64_t*)pLeftVal == *(int64_t*)pRightVal) {
|
|
||||||
for (int32_t i = 0; i < pOperator->exprSupp.numOfExprs; ++i) {
|
|
||||||
SColumnInfoData* pDst = taosArrayGet(pRes->pDataBlock, i);
|
|
||||||
|
|
||||||
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[i];
|
|
||||||
|
|
||||||
int32_t blockId = pExprInfo->base.pParam[0].pCol->dataBlockId;
|
|
||||||
int32_t slotId = pExprInfo->base.pParam[0].pCol->slotId;
|
|
||||||
int32_t rowIndex = -1;
|
|
||||||
|
|
||||||
SColumnInfoData* pSrc = NULL;
|
|
||||||
if (pJoinInfo->pLeft->info.blockId == blockId) {
|
|
||||||
pSrc = taosArrayGet(pJoinInfo->pLeft->pDataBlock, slotId);
|
|
||||||
rowIndex = pJoinInfo->leftPos;
|
|
||||||
} else {
|
|
||||||
pSrc = taosArrayGet(pJoinInfo->pRight->pDataBlock, slotId);
|
|
||||||
rowIndex = pJoinInfo->rightPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (colDataIsNull_s(pSrc, rowIndex)) {
|
|
||||||
colDataAppendNULL(pDst, nrows);
|
|
||||||
} else {
|
|
||||||
char* p = colDataGetData(pSrc, rowIndex);
|
|
||||||
colDataAppend(pDst, nrows, p, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pJoinInfo->leftPos += 1;
|
pJoinInfo->leftPos += 1;
|
||||||
pJoinInfo->rightPos += 1;
|
pJoinInfo->rightPos += 1;
|
||||||
|
|
||||||
nrows += 1;
|
nrows += 1;
|
||||||
} else if (*(int64_t*)pLeftVal < *(int64_t*)pRightVal) {
|
} else if (asc && leftTs < rightTs || !asc && leftTs > rightTs) {
|
||||||
pJoinInfo->leftPos += 1;
|
pJoinInfo->leftPos += 1;
|
||||||
|
|
||||||
if (pJoinInfo->leftPos >= pJoinInfo->pLeft->info.rows) {
|
if (pJoinInfo->leftPos >= pJoinInfo->pLeft->info.rows) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (*(int64_t*)pLeftVal > *(int64_t*)pRightVal) {
|
} else if (asc && leftTs > rightTs || !asc && leftTs < rightTs) {
|
||||||
pJoinInfo->rightPos += 1;
|
pJoinInfo->rightPos += 1;
|
||||||
if (pJoinInfo->rightPos >= pJoinInfo->pRight->info.rows) {
|
if (pJoinInfo->rightPos >= pJoinInfo->pRight->info.rows) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -292,7 +292,9 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
// do apply filter
|
// do apply filter
|
||||||
doFilter(pProjectInfo->pFilterNode, pFinalRes, NULL);
|
doFilter(pProjectInfo->pFilterNode, pFinalRes, NULL);
|
||||||
if (pFinalRes->info.rows > 0 || pRes->info.rows == 0) {
|
|
||||||
|
// when apply the limit/offset for each group, pRes->info.rows may be 0, due to limit constraint.
|
||||||
|
if (pFinalRes->info.rows > 0 || (pOperator->status == OP_EXEC_DONE)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1396,13 +1396,11 @@ SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNo
|
||||||
|
|
||||||
static void destroyStreamScanOperatorInfo(void* param, int32_t numOfOutput) {
|
static void destroyStreamScanOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
SStreamScanInfo* pStreamScan = (SStreamScanInfo*)param;
|
SStreamScanInfo* pStreamScan = (SStreamScanInfo*)param;
|
||||||
#if 1
|
|
||||||
if (pStreamScan->pTableScanOp && pStreamScan->pTableScanOp->info) {
|
if (pStreamScan->pTableScanOp && pStreamScan->pTableScanOp->info) {
|
||||||
STableScanInfo* pTableScanInfo = pStreamScan->pTableScanOp->info;
|
STableScanInfo* pTableScanInfo = pStreamScan->pTableScanOp->info;
|
||||||
destroyTableScanOperatorInfo(pTableScanInfo, numOfOutput);
|
destroyTableScanOperatorInfo(pTableScanInfo, numOfOutput);
|
||||||
taosMemoryFreeClear(pStreamScan->pTableScanOp);
|
taosMemoryFreeClear(pStreamScan->pTableScanOp);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (pStreamScan->tqReader) {
|
if (pStreamScan->tqReader) {
|
||||||
tqCloseReader(pStreamScan->tqReader);
|
tqCloseReader(pStreamScan->tqReader);
|
||||||
}
|
}
|
||||||
|
@ -1528,6 +1526,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
|
||||||
pInfo->pDeleteDataRes = createSpecialDataBlock(STREAM_DELETE_DATA);
|
pInfo->pDeleteDataRes = createSpecialDataBlock(STREAM_DELETE_DATA);
|
||||||
pInfo->updateWin = (STimeWindow){.skey = INT64_MAX, .ekey = INT64_MAX};
|
pInfo->updateWin = (STimeWindow){.skey = INT64_MAX, .ekey = INT64_MAX};
|
||||||
pInfo->pUpdateDataRes = createSpecialDataBlock(STREAM_CLEAR);
|
pInfo->pUpdateDataRes = createSpecialDataBlock(STREAM_CLEAR);
|
||||||
|
pInfo->assignBlockUid = pTableScanNode->assignBlockUid;
|
||||||
|
|
||||||
pOperator->name = "StreamScanOperator";
|
pOperator->name = "StreamScanOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN;
|
||||||
|
@ -2855,7 +2854,8 @@ int32_t stopGroupTableMergeScan(SOperatorInfo* pOperator) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* getSortedTableMergeScanBlockData(SSortHandle* pHandle, SSDataBlock* pResBlock, int32_t capacity, SOperatorInfo* pOperator) {
|
SSDataBlock* getSortedTableMergeScanBlockData(SSortHandle* pHandle, SSDataBlock* pResBlock, int32_t capacity,
|
||||||
|
SOperatorInfo* pOperator) {
|
||||||
STableMergeScanInfo* pInfo = pOperator->info;
|
STableMergeScanInfo* pInfo = pOperator->info;
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
|
|
||||||
|
@ -2874,7 +2874,6 @@ SSDataBlock* getSortedTableMergeScanBlockData(SSortHandle* pHandle, SSDataBlock*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
qDebug("%s get sorted row blocks, rows:%d", GET_TASKID(pTaskInfo), pResBlock->info.rows);
|
qDebug("%s get sorted row blocks, rows:%d", GET_TASKID(pTaskInfo), pResBlock->info.rows);
|
||||||
return (pResBlock->info.rows > 0) ? pResBlock : NULL;
|
return (pResBlock->info.rows > 0) ? pResBlock : NULL;
|
||||||
}
|
}
|
||||||
|
@ -2905,7 +2904,8 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
SSDataBlock* pBlock = NULL;
|
SSDataBlock* pBlock = NULL;
|
||||||
while (pInfo->tableStartIndex < tableListSize) {
|
while (pInfo->tableStartIndex < tableListSize) {
|
||||||
pBlock = getSortedTableMergeScanBlockData(pInfo->pSortHandle, pInfo->pResBlock, pOperator->resultInfo.capacity, pOperator);
|
pBlock = getSortedTableMergeScanBlockData(pInfo->pSortHandle, pInfo->pResBlock, pOperator->resultInfo.capacity,
|
||||||
|
pOperator);
|
||||||
if (pBlock != NULL) {
|
if (pBlock != NULL) {
|
||||||
pBlock->info.groupId = pInfo->groupId;
|
pBlock->info.groupId = pInfo->groupId;
|
||||||
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
||||||
|
|
|
@ -514,8 +514,15 @@ void* taosDestroyFillInfo(SFillInfo* pFillInfo) {
|
||||||
if (pFillInfo == NULL) {
|
if (pFillInfo == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pFillInfo->prev); ++i) {
|
||||||
|
SGroupKeys* pKey = taosArrayGet(pFillInfo->prev, i);
|
||||||
|
taosMemoryFree(pKey->pData);
|
||||||
|
}
|
||||||
taosArrayDestroy(pFillInfo->prev);
|
taosArrayDestroy(pFillInfo->prev);
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pFillInfo->next); ++i) {
|
||||||
|
SGroupKeys* pKey = taosArrayGet(pFillInfo->next, i);
|
||||||
|
taosMemoryFree(pKey->pData);
|
||||||
|
}
|
||||||
taosArrayDestroy(pFillInfo->next);
|
taosArrayDestroy(pFillInfo->next);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pFillInfo->numOfTags; ++i) {
|
for (int32_t i = 0; i < pFillInfo->numOfTags; ++i) {
|
||||||
|
|
|
@ -773,9 +773,9 @@ int32_t binarySearch(void* keyList, int num, TSKEY key, int order, __get_value_f
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t comparePullWinKey(void* pKey, void* data, int32_t index) {
|
int32_t comparePullWinKey(void* pKey, void* data, int32_t index) {
|
||||||
SArray* res = (SArray*)data;
|
SArray* res = (SArray*)data;
|
||||||
SPullWindowInfo* pos = taosArrayGet(res, index);
|
SPullWindowInfo* pos = taosArrayGet(res, index);
|
||||||
SPullWindowInfo* pData = (SPullWindowInfo*) pKey;
|
SPullWindowInfo* pData = (SPullWindowInfo*)pKey;
|
||||||
if (pData->window.skey == pos->window.skey) {
|
if (pData->window.skey == pos->window.skey) {
|
||||||
if (pData->groupId > pos->groupId) {
|
if (pData->groupId > pos->groupId) {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -810,7 +810,7 @@ static int32_t savePullWindow(SPullWindowInfo* pPullInfo, SArray* pPullWins) {
|
||||||
int32_t compareResKey(void* pKey, void* data, int32_t index) {
|
int32_t compareResKey(void* pKey, void* data, int32_t index) {
|
||||||
SArray* res = (SArray*)data;
|
SArray* res = (SArray*)data;
|
||||||
SResKeyPos* pos = taosArrayGetP(res, index);
|
SResKeyPos* pos = taosArrayGetP(res, index);
|
||||||
SWinRes* pData = (SWinRes*) pKey;
|
SWinRes* pData = (SWinRes*)pKey;
|
||||||
if (pData->ts == *(int64_t*)pos->key) {
|
if (pData->ts == *(int64_t*)pos->key) {
|
||||||
if (pData->groupId > pos->groupId) {
|
if (pData->groupId > pos->groupId) {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -880,7 +880,7 @@ int64_t getWinReskey(void* data, int32_t index) {
|
||||||
int32_t compareWinRes(void* pKey, void* data, int32_t index) {
|
int32_t compareWinRes(void* pKey, void* data, int32_t index) {
|
||||||
SArray* res = (SArray*)data;
|
SArray* res = (SArray*)data;
|
||||||
SWinRes* pos = taosArrayGetP(res, index);
|
SWinRes* pos = taosArrayGetP(res, index);
|
||||||
SResKeyPos* pData = (SResKeyPos*) pKey;
|
SResKeyPos* pData = (SResKeyPos*)pKey;
|
||||||
if (*(int64_t*)pData->key == pos->ts) {
|
if (*(int64_t*)pData->key == pos->ts) {
|
||||||
if (pData->groupId > pos->groupId) {
|
if (pData->groupId > pos->groupId) {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1417,15 +1417,15 @@ static void doClearWindows(SAggSupporter* pAggSup, SExprSupp* pSup1, SInterval*
|
||||||
SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
|
SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
|
||||||
pGpDatas = (uint64_t*)pGpCol->pData;
|
pGpDatas = (uint64_t*)pGpCol->pData;
|
||||||
}
|
}
|
||||||
int32_t step = 0;
|
int32_t step = 0;
|
||||||
int32_t startPos = 0;
|
int32_t startPos = 0;
|
||||||
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
||||||
SResultRowInfo dumyInfo;
|
SResultRowInfo dumyInfo;
|
||||||
dumyInfo.cur.pageId = -1;
|
dumyInfo.cur.pageId = -1;
|
||||||
STimeWindow win = getActiveTimeWindow(NULL, &dumyInfo, startTsCols[i], pInterval, TSDB_ORDER_ASC);
|
STimeWindow win = getActiveTimeWindow(NULL, &dumyInfo, startTsCols[i], pInterval, TSDB_ORDER_ASC);
|
||||||
while (win.ekey <= endTsCols[i]) {
|
while (win.ekey <= endTsCols[i]) {
|
||||||
uint64_t winGpId = pGpDatas ? pGpDatas[startPos] : pBlock->info.groupId;
|
uint64_t winGpId = pGpDatas ? pGpDatas[startPos] : pBlock->info.groupId;
|
||||||
bool res = doClearWindow(pAggSup, pSup1, (char*)&win.skey, sizeof(TSKEY), winGpId, numOfOutput);
|
bool res = doClearWindow(pAggSup, pSup1, (char*)&win.skey, sizeof(TSKEY), winGpId, numOfOutput);
|
||||||
if (pUpWins && res) {
|
if (pUpWins && res) {
|
||||||
SWinRes winRes = {.ts = win.skey, .groupId = winGpId};
|
SWinRes winRes = {.ts = win.skey, .groupId = winGpId};
|
||||||
taosArrayPush(pUpWins, &winRes);
|
taosArrayPush(pUpWins, &winRes);
|
||||||
|
@ -1596,7 +1596,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_NORMAL) {
|
if (pBlock->info.type == STREAM_NORMAL) {
|
||||||
//set input version
|
// set input version
|
||||||
pTaskInfo->version = pBlock->info.version;
|
pTaskInfo->version = pBlock->info.version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1644,7 +1644,7 @@ static void destroyStateWindowOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeItem(void* param) {
|
static void freeItem(void* param) {
|
||||||
SGroupKeys *pKey = (SGroupKeys*) param;
|
SGroupKeys* pKey = (SGroupKeys*)param;
|
||||||
taosMemoryFree(pKey->pData);
|
taosMemoryFree(pKey->pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2347,10 +2347,10 @@ SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode
|
||||||
initResultSizeInfo(&pOperator->resultInfo, 4096);
|
initResultSizeInfo(&pOperator->resultInfo, 4096);
|
||||||
|
|
||||||
pInfo->pFillColInfo = createFillColInfo(pExprInfo, numOfExprs, (SNodeListNode*)pInterpPhyNode->pFillValues);
|
pInfo->pFillColInfo = createFillColInfo(pExprInfo, numOfExprs, (SNodeListNode*)pInterpPhyNode->pFillValues);
|
||||||
pInfo->pRes = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
|
pInfo->pRes = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
|
||||||
pInfo->win = pInterpPhyNode->timeRange;
|
pInfo->win = pInterpPhyNode->timeRange;
|
||||||
pInfo->interval.interval = pInterpPhyNode->interval;
|
pInfo->interval.interval = pInterpPhyNode->interval;
|
||||||
pInfo->current = pInfo->win.skey;
|
pInfo->current = pInfo->win.skey;
|
||||||
|
|
||||||
pOperator->name = "TimeSliceOperator";
|
pOperator->name = "TimeSliceOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC;
|
||||||
|
@ -2970,8 +2970,8 @@ SSDataBlock* createSpecialDataBlock(EStreamType type) {
|
||||||
pBlock->info.groupId = 0;
|
pBlock->info.groupId = 0;
|
||||||
pBlock->info.rows = 0;
|
pBlock->info.rows = 0;
|
||||||
pBlock->info.type = type;
|
pBlock->info.type = type;
|
||||||
pBlock->info.rowSize = sizeof(TSKEY) + sizeof(TSKEY) + sizeof(uint64_t) +
|
pBlock->info.rowSize =
|
||||||
sizeof(uint64_t) + sizeof(TSKEY) + sizeof(TSKEY);
|
sizeof(TSKEY) + sizeof(TSKEY) + sizeof(uint64_t) + sizeof(uint64_t) + sizeof(TSKEY) + sizeof(TSKEY);
|
||||||
|
|
||||||
pBlock->pDataBlock = taosArrayInit(6, sizeof(SColumnInfoData));
|
pBlock->pDataBlock = taosArrayInit(6, sizeof(SColumnInfoData));
|
||||||
SColumnInfoData infoData = {0};
|
SColumnInfoData infoData = {0};
|
||||||
|
@ -3147,6 +3147,8 @@ void destroyStreamSessionAggOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
blockDataDestroy(pInfo->pDelRes);
|
blockDataDestroy(pInfo->pDelRes);
|
||||||
blockDataDestroy(pInfo->pWinBlock);
|
blockDataDestroy(pInfo->pWinBlock);
|
||||||
blockDataDestroy(pInfo->pUpdateRes);
|
blockDataDestroy(pInfo->pUpdateRes);
|
||||||
|
destroySqlFunctionCtx(pInfo->pDummyCtx, 0);
|
||||||
|
taosHashCleanup(pInfo->pStDeleted);
|
||||||
|
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
@ -4323,10 +4325,10 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
|
SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
|
||||||
blockDataEnsureCapacity(pAggSup->pScanBlock, pSDataBlock->info.rows);
|
blockDataEnsureCapacity(pAggSup->pScanBlock, pSDataBlock->info.rows);
|
||||||
SColumnInfoData* pKeyColInfo = taosArrayGet(pSDataBlock->pDataBlock, pInfo->stateCol.slotId);
|
SColumnInfoData* pKeyColInfo = taosArrayGet(pSDataBlock->pDataBlock, pInfo->stateCol.slotId);
|
||||||
for (int32_t i = 0; i < pSDataBlock->info.rows; i += winRows) {
|
for (int32_t i = 0; i < pSDataBlock->info.rows; i += winRows) {
|
||||||
if (pInfo->ignoreExpiredData && isOverdue(tsCols[i], &pInfo->twAggSup)) {
|
if (pInfo->ignoreExpiredData && isOverdue(tsCols[i], &pInfo->twAggSup)) {
|
||||||
i++;
|
i++;
|
||||||
|
@ -4341,7 +4343,7 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
&allEqual, pInfo->pSeDeleted);
|
&allEqual, pInfo->pSeDeleted);
|
||||||
if (!allEqual) {
|
if (!allEqual) {
|
||||||
appendOneRow(pAggSup->pScanBlock, &pCurWin->winInfo.win.skey, &pCurWin->winInfo.win.ekey,
|
appendOneRow(pAggSup->pScanBlock, &pCurWin->winInfo.win.skey, &pCurWin->winInfo.win.ekey,
|
||||||
&pSDataBlock->info.groupId);
|
&pSDataBlock->info.groupId);
|
||||||
taosHashRemove(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition));
|
taosHashRemove(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition));
|
||||||
deleteWindow(pAggSup->pCurWins, winIndex);
|
deleteWindow(pAggSup->pCurWins, winIndex);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -1712,6 +1712,7 @@ static int32_t jsonToPhysiProjectNode(const SJson* pJson, void* pObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* jkJoinPhysiPlanJoinType = "JoinType";
|
static const char* jkJoinPhysiPlanJoinType = "JoinType";
|
||||||
|
static const char* jkJoinPhysiPlanInputTsOrder = "InputTsOrder";
|
||||||
static const char* jkJoinPhysiPlanMergeCondition = "MergeCondition";
|
static const char* jkJoinPhysiPlanMergeCondition = "MergeCondition";
|
||||||
static const char* jkJoinPhysiPlanOnConditions = "OnConditions";
|
static const char* jkJoinPhysiPlanOnConditions = "OnConditions";
|
||||||
static const char* jkJoinPhysiPlanTargets = "Targets";
|
static const char* jkJoinPhysiPlanTargets = "Targets";
|
||||||
|
@ -1723,6 +1724,9 @@ static int32_t physiJoinNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonAddIntegerToObject(pJson, jkJoinPhysiPlanJoinType, pNode->joinType);
|
code = tjsonAddIntegerToObject(pJson, jkJoinPhysiPlanJoinType, pNode->joinType);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkJoinPhysiPlanInputTsOrder, pNode->inputTsOrder);
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonAddObject(pJson, jkJoinPhysiPlanMergeCondition, nodeToJson, pNode->pMergeCondition);
|
code = tjsonAddObject(pJson, jkJoinPhysiPlanMergeCondition, nodeToJson, pNode->pMergeCondition);
|
||||||
}
|
}
|
||||||
|
@ -1742,7 +1746,9 @@ static int32_t jsonToPhysiJoinNode(const SJson* pJson, void* pObj) {
|
||||||
int32_t code = jsonToPhysicPlanNode(pJson, pObj);
|
int32_t code = jsonToPhysicPlanNode(pJson, pObj);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
tjsonGetNumberValue(pJson, jkJoinPhysiPlanJoinType, pNode->joinType, code);
|
tjsonGetNumberValue(pJson, jkJoinPhysiPlanJoinType, pNode->joinType, code);
|
||||||
;
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
tjsonGetNumberValue(pJson, jkJoinPhysiPlanInputTsOrder, pNode->inputTsOrder, code);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = jsonToNodeObject(pJson, jkJoinPhysiPlanOnConditions, &pNode->pOnConditions);
|
code = jsonToNodeObject(pJson, jkJoinPhysiPlanOnConditions, &pNode->pOnConditions);
|
||||||
|
|
|
@ -176,7 +176,6 @@ db_options(A) ::= db_options(B) CACHESIZE NK_INTEGER(C).
|
||||||
db_options(A) ::= db_options(B) COMP NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_COMP, &C); }
|
db_options(A) ::= db_options(B) COMP NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_COMP, &C); }
|
||||||
db_options(A) ::= db_options(B) DURATION NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_DAYS, &C); }
|
db_options(A) ::= db_options(B) DURATION NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_DAYS, &C); }
|
||||||
db_options(A) ::= db_options(B) DURATION NK_VARIABLE(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_DAYS, &C); }
|
db_options(A) ::= db_options(B) DURATION NK_VARIABLE(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_DAYS, &C); }
|
||||||
db_options(A) ::= db_options(B) FSYNC NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_FSYNC, &C); }
|
|
||||||
db_options(A) ::= db_options(B) MAXROWS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_MAXROWS, &C); }
|
db_options(A) ::= db_options(B) MAXROWS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_MAXROWS, &C); }
|
||||||
db_options(A) ::= db_options(B) MINROWS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_MINROWS, &C); }
|
db_options(A) ::= db_options(B) MINROWS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_MINROWS, &C); }
|
||||||
db_options(A) ::= db_options(B) KEEP integer_list(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_KEEP, C); }
|
db_options(A) ::= db_options(B) KEEP integer_list(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_KEEP, C); }
|
||||||
|
@ -186,11 +185,12 @@ db_options(A) ::= db_options(B) PAGESIZE NK_INTEGER(C).
|
||||||
db_options(A) ::= db_options(B) PRECISION NK_STRING(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_PRECISION, &C); }
|
db_options(A) ::= db_options(B) PRECISION NK_STRING(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_PRECISION, &C); }
|
||||||
db_options(A) ::= db_options(B) REPLICA NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_REPLICA, &C); }
|
db_options(A) ::= db_options(B) REPLICA NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_REPLICA, &C); }
|
||||||
db_options(A) ::= db_options(B) STRICT NK_STRING(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STRICT, &C); }
|
db_options(A) ::= db_options(B) STRICT NK_STRING(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STRICT, &C); }
|
||||||
db_options(A) ::= db_options(B) WAL NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL, &C); }
|
|
||||||
db_options(A) ::= db_options(B) VGROUPS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_VGROUPS, &C); }
|
db_options(A) ::= db_options(B) VGROUPS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_VGROUPS, &C); }
|
||||||
db_options(A) ::= db_options(B) SINGLE_STABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLE_STABLE, &C); }
|
db_options(A) ::= db_options(B) SINGLE_STABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLE_STABLE, &C); }
|
||||||
db_options(A) ::= db_options(B) RETENTIONS retention_list(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_RETENTIONS, C); }
|
db_options(A) ::= db_options(B) RETENTIONS retention_list(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_RETENTIONS, C); }
|
||||||
db_options(A) ::= db_options(B) SCHEMALESS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SCHEMALESS, &C); }
|
db_options(A) ::= db_options(B) SCHEMALESS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SCHEMALESS, &C); }
|
||||||
|
db_options(A) ::= db_options(B) WAL_LEVEL NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL, &C); }
|
||||||
|
db_options(A) ::= db_options(B) WAL_FSYNC_PERIOD NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_FSYNC, &C); }
|
||||||
db_options(A) ::= db_options(B) WAL_RETENTION_PERIOD NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_RETENTION_PERIOD, &C); }
|
db_options(A) ::= db_options(B) WAL_RETENTION_PERIOD NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_RETENTION_PERIOD, &C); }
|
||||||
db_options(A) ::= db_options(B) WAL_RETENTION_PERIOD NK_MINUS(D) NK_INTEGER(C). {
|
db_options(A) ::= db_options(B) WAL_RETENTION_PERIOD NK_MINUS(D) NK_INTEGER(C). {
|
||||||
SToken t = D;
|
SToken t = D;
|
||||||
|
@ -214,13 +214,13 @@ alter_db_options(A) ::= alter_db_options(B) alter_db_option(C).
|
||||||
//alter_db_option(A) ::= BUFFER NK_INTEGER(B). { A.type = DB_OPTION_BUFFER; A.val = B; }
|
//alter_db_option(A) ::= BUFFER NK_INTEGER(B). { A.type = DB_OPTION_BUFFER; A.val = B; }
|
||||||
alter_db_option(A) ::= CACHEMODEL NK_STRING(B). { A.type = DB_OPTION_CACHEMODEL; A.val = B; }
|
alter_db_option(A) ::= CACHEMODEL NK_STRING(B). { A.type = DB_OPTION_CACHEMODEL; A.val = B; }
|
||||||
alter_db_option(A) ::= CACHESIZE NK_INTEGER(B). { A.type = DB_OPTION_CACHESIZE; A.val = B; }
|
alter_db_option(A) ::= CACHESIZE NK_INTEGER(B). { A.type = DB_OPTION_CACHESIZE; A.val = B; }
|
||||||
alter_db_option(A) ::= FSYNC NK_INTEGER(B). { A.type = DB_OPTION_FSYNC; A.val = B; }
|
alter_db_option(A) ::= WAL_FSYNC_PERIOD NK_INTEGER(B). { A.type = DB_OPTION_FSYNC; A.val = B; }
|
||||||
alter_db_option(A) ::= KEEP integer_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; }
|
alter_db_option(A) ::= KEEP integer_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; }
|
||||||
alter_db_option(A) ::= KEEP variable_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; }
|
alter_db_option(A) ::= KEEP variable_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; }
|
||||||
//alter_db_option(A) ::= PAGES NK_INTEGER(B). { A.type = DB_OPTION_PAGES; A.val = B; }
|
//alter_db_option(A) ::= PAGES NK_INTEGER(B). { A.type = DB_OPTION_PAGES; A.val = B; }
|
||||||
//alter_db_option(A) ::= REPLICA NK_INTEGER(B). { A.type = DB_OPTION_REPLICA; A.val = B; }
|
//alter_db_option(A) ::= REPLICA NK_INTEGER(B). { A.type = DB_OPTION_REPLICA; A.val = B; }
|
||||||
//alter_db_option(A) ::= STRICT NK_STRING(B). { A.type = DB_OPTION_STRICT; A.val = B; }
|
//alter_db_option(A) ::= STRICT NK_STRING(B). { A.type = DB_OPTION_STRICT; A.val = B; }
|
||||||
alter_db_option(A) ::= WAL NK_INTEGER(B). { A.type = DB_OPTION_WAL; A.val = B; }
|
alter_db_option(A) ::= WAL_LEVEL NK_INTEGER(B). { A.type = DB_OPTION_WAL; A.val = B; }
|
||||||
|
|
||||||
%type integer_list { SNodeList* }
|
%type integer_list { SNodeList* }
|
||||||
%destructor integer_list { nodesDestroyList($$); }
|
%destructor integer_list { nodesDestroyList($$); }
|
||||||
|
@ -476,7 +476,7 @@ explain_options(A) ::= explain_options(B) VERBOSE NK_BOOL(C).
|
||||||
explain_options(A) ::= explain_options(B) RATIO NK_FLOAT(C). { A = setExplainRatio(pCxt, B, &C); }
|
explain_options(A) ::= explain_options(B) RATIO NK_FLOAT(C). { A = setExplainRatio(pCxt, B, &C); }
|
||||||
|
|
||||||
/************************************************ compact *************************************************************/
|
/************************************************ compact *************************************************************/
|
||||||
cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP. { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
|
//cmd ::= COMPACT VNODES IN NK_LP integer_list NK_RP. { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
|
||||||
|
|
||||||
/************************************************ create/drop function ************************************************/
|
/************************************************ create/drop function ************************************************/
|
||||||
cmd ::= CREATE agg_func_opt(A) FUNCTION not_exists_opt(F) function_name(B)
|
cmd ::= CREATE agg_func_opt(A) FUNCTION not_exists_opt(F) function_name(B)
|
||||||
|
@ -525,7 +525,7 @@ dnode_list(A) ::= DNODE NK_INTEGER(B).
|
||||||
dnode_list(A) ::= dnode_list(B) DNODE NK_INTEGER(C). { A = addNodeToList(pCxt, B, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &C)); }
|
dnode_list(A) ::= dnode_list(B) DNODE NK_INTEGER(C). { A = addNodeToList(pCxt, B, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &C)); }
|
||||||
|
|
||||||
/************************************************ syncdb **************************************************************/
|
/************************************************ syncdb **************************************************************/
|
||||||
cmd ::= SYNCDB db_name(A) REPLICA. { pCxt->pRootNode = createSyncdbStmt(pCxt, &A); }
|
//cmd ::= SYNCDB db_name(A) REPLICA. { pCxt->pRootNode = createSyncdbStmt(pCxt, &A); }
|
||||||
|
|
||||||
/************************************************ syncdb **************************************************************/
|
/************************************************ syncdb **************************************************************/
|
||||||
cmd ::= DELETE FROM full_table_name(A) where_clause_opt(B). { pCxt->pRootNode = createDeleteStmt(pCxt, A, B); }
|
cmd ::= DELETE FROM full_table_name(A) where_clause_opt(B). { pCxt->pRootNode = createDeleteStmt(pCxt, A, B); }
|
||||||
|
|
|
@ -29,291 +29,224 @@ typedef struct SKeyword {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
// keywords in sql string
|
// keywords in sql string
|
||||||
static SKeyword keywordTable[] = {
|
static SKeyword keywordTable[] = {
|
||||||
{"ACCOUNT", TK_ACCOUNT},
|
{"ACCOUNT", TK_ACCOUNT},
|
||||||
{"ACCOUNTS", TK_ACCOUNTS},
|
{"ACCOUNTS", TK_ACCOUNTS},
|
||||||
{"ADD", TK_ADD},
|
{"ADD", TK_ADD},
|
||||||
{"AGGREGATE", TK_AGGREGATE},
|
{"AGGREGATE", TK_AGGREGATE},
|
||||||
{"ALL", TK_ALL},
|
{"ALL", TK_ALL},
|
||||||
{"ALTER", TK_ALTER},
|
{"ALTER", TK_ALTER},
|
||||||
{"ANALYZE", TK_ANALYZE},
|
{"ANALYZE", TK_ANALYZE},
|
||||||
{"AND", TK_AND},
|
{"AND", TK_AND},
|
||||||
{"APPS", TK_APPS},
|
{"APPS", TK_APPS},
|
||||||
{"AS", TK_AS},
|
{"AS", TK_AS},
|
||||||
{"ASC", TK_ASC},
|
{"ASC", TK_ASC},
|
||||||
{"AT_ONCE", TK_AT_ONCE},
|
{"AT_ONCE", TK_AT_ONCE},
|
||||||
{"BALANCE", TK_BALANCE},
|
{"BALANCE", TK_BALANCE},
|
||||||
{"BETWEEN", TK_BETWEEN},
|
{"BETWEEN", TK_BETWEEN},
|
||||||
{"BINARY", TK_BINARY},
|
{"BINARY", TK_BINARY},
|
||||||
{"BIGINT", TK_BIGINT},
|
{"BIGINT", TK_BIGINT},
|
||||||
{"BNODE", TK_BNODE},
|
{"BNODE", TK_BNODE},
|
||||||
{"BNODES", TK_BNODES},
|
{"BNODES", TK_BNODES},
|
||||||
{"BOOL", TK_BOOL},
|
{"BOOL", TK_BOOL},
|
||||||
{"BUFFER", TK_BUFFER},
|
{"BUFFER", TK_BUFFER},
|
||||||
{"BUFSIZE", TK_BUFSIZE},
|
{"BUFSIZE", TK_BUFSIZE},
|
||||||
{"BY", TK_BY},
|
{"BY", TK_BY},
|
||||||
{"CACHE", TK_CACHE},
|
{"CACHE", TK_CACHE},
|
||||||
{"CACHEMODEL", TK_CACHEMODEL},
|
{"CACHEMODEL", TK_CACHEMODEL},
|
||||||
{"CACHESIZE", TK_CACHESIZE},
|
{"CACHESIZE", TK_CACHESIZE},
|
||||||
{"CAST", TK_CAST},
|
{"CAST", TK_CAST},
|
||||||
{"CLIENT_VERSION", TK_CLIENT_VERSION},
|
{"CLIENT_VERSION", TK_CLIENT_VERSION},
|
||||||
{"CLUSTER", TK_CLUSTER},
|
{"CLUSTER", TK_CLUSTER},
|
||||||
{"COLUMN", TK_COLUMN},
|
{"COLUMN", TK_COLUMN},
|
||||||
{"COMMENT", TK_COMMENT},
|
{"COMMENT", TK_COMMENT},
|
||||||
{"COMP", TK_COMP},
|
{"COMP", TK_COMP},
|
||||||
{"COMPACT", TK_COMPACT},
|
{"CONNS", TK_CONNS},
|
||||||
{"CONNS", TK_CONNS},
|
{"CONNECTION", TK_CONNECTION},
|
||||||
{"CONNECTION", TK_CONNECTION},
|
{"CONNECTIONS", TK_CONNECTIONS},
|
||||||
{"CONNECTIONS", TK_CONNECTIONS},
|
{"CONSUMER", TK_CONSUMER},
|
||||||
{"CONSUMER", TK_CONSUMER},
|
{"CONSUMERS", TK_CONSUMERS},
|
||||||
{"CONSUMERS", TK_CONSUMERS},
|
{"CONTAINS", TK_CONTAINS},
|
||||||
{"CONTAINS", TK_CONTAINS},
|
{"COUNT", TK_COUNT},
|
||||||
{"COUNT", TK_COUNT},
|
{"CREATE", TK_CREATE},
|
||||||
{"CREATE", TK_CREATE},
|
{"CURRENT_USER", TK_CURRENT_USER},
|
||||||
{"CURRENT_USER", TK_CURRENT_USER},
|
{"DATABASE", TK_DATABASE},
|
||||||
{"DATABASE", TK_DATABASE},
|
{"DATABASES", TK_DATABASES},
|
||||||
{"DATABASES", TK_DATABASES},
|
{"DBS", TK_DBS},
|
||||||
{"DBS", TK_DBS},
|
{"DELETE", TK_DELETE},
|
||||||
{"DELETE", TK_DELETE},
|
{"DESC", TK_DESC},
|
||||||
{"DESC", TK_DESC},
|
{"DESCRIBE", TK_DESCRIBE},
|
||||||
{"DESCRIBE", TK_DESCRIBE},
|
{"DISTINCT", TK_DISTINCT},
|
||||||
{"DISTINCT", TK_DISTINCT},
|
{"DISTRIBUTED", TK_DISTRIBUTED},
|
||||||
{"DISTRIBUTED", TK_DISTRIBUTED},
|
{"DNODE", TK_DNODE},
|
||||||
{"DNODE", TK_DNODE},
|
{"DNODES", TK_DNODES},
|
||||||
{"DNODES", TK_DNODES},
|
{"DOUBLE", TK_DOUBLE},
|
||||||
{"DOUBLE", TK_DOUBLE},
|
{"DROP", TK_DROP},
|
||||||
{"DROP", TK_DROP},
|
{"DURATION", TK_DURATION},
|
||||||
{"DURATION", TK_DURATION},
|
{"ENABLE", TK_ENABLE},
|
||||||
{"ENABLE", TK_ENABLE},
|
{"EXISTS", TK_EXISTS},
|
||||||
{"EXISTS", TK_EXISTS},
|
{"EXPIRED", TK_EXPIRED},
|
||||||
{"EXPIRED", TK_EXPIRED},
|
{"EXPLAIN", TK_EXPLAIN},
|
||||||
{"EXPLAIN", TK_EXPLAIN},
|
{"EVERY", TK_EVERY},
|
||||||
{"EVERY", TK_EVERY},
|
{"FILE", TK_FILE},
|
||||||
{"FILE", TK_FILE},
|
{"FILL", TK_FILL},
|
||||||
{"FILL", TK_FILL},
|
{"FIRST", TK_FIRST},
|
||||||
{"FIRST", TK_FIRST},
|
{"FLOAT", TK_FLOAT},
|
||||||
{"FLOAT", TK_FLOAT},
|
{"FLUSH", TK_FLUSH},
|
||||||
{"FLUSH", TK_FLUSH},
|
{"FROM", TK_FROM},
|
||||||
{"FROM", TK_FROM},
|
{"FUNCTION", TK_FUNCTION},
|
||||||
{"FSYNC", TK_FSYNC},
|
{"FUNCTIONS", TK_FUNCTIONS},
|
||||||
{"FUNCTION", TK_FUNCTION},
|
{"GRANT", TK_GRANT},
|
||||||
{"FUNCTIONS", TK_FUNCTIONS},
|
{"GRANTS", TK_GRANTS},
|
||||||
{"GRANT", TK_GRANT},
|
{"GROUP", TK_GROUP},
|
||||||
{"GRANTS", TK_GRANTS},
|
{"HAVING", TK_HAVING},
|
||||||
{"GROUP", TK_GROUP},
|
{"IF", TK_IF},
|
||||||
{"HAVING", TK_HAVING},
|
{"IGNORE", TK_IGNORE},
|
||||||
{"IF", TK_IF},
|
{"IMPORT", TK_IMPORT},
|
||||||
{"IGNORE", TK_IGNORE},
|
{"IN", TK_IN},
|
||||||
{"IMPORT", TK_IMPORT},
|
{"INDEX", TK_INDEX},
|
||||||
{"IN", TK_IN},
|
{"INDEXES", TK_INDEXES},
|
||||||
{"INDEX", TK_INDEX},
|
{"INNER", TK_INNER},
|
||||||
{"INDEXES", TK_INDEXES},
|
{"INT", TK_INT},
|
||||||
{"INNER", TK_INNER},
|
{"INSERT", TK_INSERT},
|
||||||
{"INT", TK_INT},
|
{"INTEGER", TK_INTEGER},
|
||||||
{"INSERT", TK_INSERT},
|
{"INTERVAL", TK_INTERVAL},
|
||||||
{"INTEGER", TK_INTEGER},
|
{"INTO", TK_INTO},
|
||||||
{"INTERVAL", TK_INTERVAL},
|
{"IS", TK_IS},
|
||||||
{"INTO", TK_INTO},
|
{"JOIN", TK_JOIN},
|
||||||
{"IS", TK_IS},
|
{"JSON", TK_JSON},
|
||||||
{"JOIN", TK_JOIN},
|
{"KEEP", TK_KEEP},
|
||||||
{"JSON", TK_JSON},
|
{"KILL", TK_KILL},
|
||||||
{"KEEP", TK_KEEP},
|
{"LAST", TK_LAST},
|
||||||
{"KILL", TK_KILL},
|
{"LAST_ROW", TK_LAST_ROW},
|
||||||
{"LAST", TK_LAST},
|
{"LICENCE", TK_LICENCE},
|
||||||
{"LAST_ROW", TK_LAST_ROW},
|
{"LIKE", TK_LIKE},
|
||||||
{"LICENCE", TK_LICENCE},
|
{"LIMIT", TK_LIMIT},
|
||||||
{"LIKE", TK_LIKE},
|
{"LINEAR", TK_LINEAR},
|
||||||
{"LIMIT", TK_LIMIT},
|
{"LOCAL", TK_LOCAL},
|
||||||
{"LINEAR", TK_LINEAR},
|
{"MATCH", TK_MATCH},
|
||||||
{"LOCAL", TK_LOCAL},
|
{"MAXROWS", TK_MAXROWS},
|
||||||
{"MATCH", TK_MATCH},
|
{"MAX_DELAY", TK_MAX_DELAY},
|
||||||
{"MAXROWS", TK_MAXROWS},
|
{"MERGE", TK_MERGE},
|
||||||
{"MAX_DELAY", TK_MAX_DELAY},
|
{"META", TK_META},
|
||||||
{"MERGE", TK_MERGE},
|
{"MINROWS", TK_MINROWS},
|
||||||
{"META", TK_META},
|
{"MINUS", TK_MINUS},
|
||||||
{"MINROWS", TK_MINROWS},
|
{"MNODE", TK_MNODE},
|
||||||
{"MINUS", TK_MINUS},
|
{"MNODES", TK_MNODES},
|
||||||
{"MNODE", TK_MNODE},
|
{"MODIFY", TK_MODIFY},
|
||||||
{"MNODES", TK_MNODES},
|
{"MODULES", TK_MODULES},
|
||||||
{"MODIFY", TK_MODIFY},
|
{"NCHAR", TK_NCHAR},
|
||||||
{"MODULES", TK_MODULES},
|
{"NEXT", TK_NEXT},
|
||||||
{"NCHAR", TK_NCHAR},
|
{"NMATCH", TK_NMATCH},
|
||||||
{"NEXT", TK_NEXT},
|
{"NONE", TK_NONE},
|
||||||
{"NMATCH", TK_NMATCH},
|
{"NOT", TK_NOT},
|
||||||
{"NONE", TK_NONE},
|
{"NOW", TK_NOW},
|
||||||
{"NOT", TK_NOT},
|
{"NULL", TK_NULL},
|
||||||
{"NOW", TK_NOW},
|
{"NULLS", TK_NULLS},
|
||||||
{"NULL", TK_NULL},
|
{"OFFSET", TK_OFFSET},
|
||||||
{"NULLS", TK_NULLS},
|
{"ON", TK_ON},
|
||||||
{"OFFSET", TK_OFFSET},
|
{"OR", TK_OR},
|
||||||
{"ON", TK_ON},
|
{"ORDER", TK_ORDER},
|
||||||
{"OR", TK_OR},
|
{"OUTPUTTYPE", TK_OUTPUTTYPE},
|
||||||
{"ORDER", TK_ORDER},
|
{"PARTITION", TK_PARTITION},
|
||||||
{"OUTPUTTYPE", TK_OUTPUTTYPE},
|
{"PASS", TK_PASS},
|
||||||
{"PARTITION", TK_PARTITION},
|
{"PAGES", TK_PAGES},
|
||||||
{"PASS", TK_PASS},
|
{"PAGESIZE", TK_PAGESIZE},
|
||||||
{"PAGES", TK_PAGES},
|
{"PORT", TK_PORT},
|
||||||
{"PAGESIZE", TK_PAGESIZE},
|
{"PPS", TK_PPS},
|
||||||
{"PORT", TK_PORT},
|
{"PRECISION", TK_PRECISION},
|
||||||
{"PPS", TK_PPS},
|
{"PREV", TK_PREV},
|
||||||
{"PRECISION", TK_PRECISION},
|
{"QNODE", TK_QNODE},
|
||||||
// {"PRIVILEGE", TK_PRIVILEGE},
|
{"QNODES", TK_QNODES},
|
||||||
{"PREV", TK_PREV},
|
{"QTIME", TK_QTIME},
|
||||||
{"QNODE", TK_QNODE},
|
{"QUERIES", TK_QUERIES},
|
||||||
{"QNODES", TK_QNODES},
|
{"QUERY", TK_QUERY},
|
||||||
{"QTIME", TK_QTIME},
|
{"RANGE", TK_RANGE},
|
||||||
{"QUERIES", TK_QUERIES},
|
{"RATIO", TK_RATIO},
|
||||||
{"QUERY", TK_QUERY},
|
{"READ", TK_READ},
|
||||||
{"RANGE", TK_RANGE},
|
{"REDISTRIBUTE", TK_REDISTRIBUTE},
|
||||||
{"RATIO", TK_RATIO},
|
{"RENAME", TK_RENAME},
|
||||||
{"READ", TK_READ},
|
{"REPLICA", TK_REPLICA},
|
||||||
{"REDISTRIBUTE", TK_REDISTRIBUTE},
|
{"RESET", TK_RESET},
|
||||||
{"RENAME", TK_RENAME},
|
{"RETENTIONS", TK_RETENTIONS},
|
||||||
{"REPLICA", TK_REPLICA},
|
{"REVOKE", TK_REVOKE},
|
||||||
{"RESET", TK_RESET},
|
{"ROLLUP", TK_ROLLUP},
|
||||||
{"RETENTIONS", TK_RETENTIONS},
|
{"SCHEMALESS", TK_SCHEMALESS},
|
||||||
{"REVOKE", TK_REVOKE},
|
{"SCORES", TK_SCORES},
|
||||||
{"ROLLUP", TK_ROLLUP},
|
{"SELECT", TK_SELECT},
|
||||||
{"SCHEMALESS", TK_SCHEMALESS},
|
{"SERVER_STATUS", TK_SERVER_STATUS},
|
||||||
{"SCORES", TK_SCORES},
|
{"SERVER_VERSION", TK_SERVER_VERSION},
|
||||||
{"SELECT", TK_SELECT},
|
{"SESSION", TK_SESSION},
|
||||||
{"SERVER_STATUS", TK_SERVER_STATUS},
|
{"SET", TK_SET},
|
||||||
{"SERVER_VERSION", TK_SERVER_VERSION},
|
{"SHOW", TK_SHOW},
|
||||||
{"SESSION", TK_SESSION},
|
{"SINGLE_STABLE", TK_SINGLE_STABLE},
|
||||||
{"SET", TK_SET},
|
{"SLIDING", TK_SLIDING},
|
||||||
{"SHOW", TK_SHOW},
|
{"SLIMIT", TK_SLIMIT},
|
||||||
{"SINGLE_STABLE", TK_SINGLE_STABLE},
|
{"SMA", TK_SMA},
|
||||||
{"SLIDING", TK_SLIDING},
|
{"SMALLINT", TK_SMALLINT},
|
||||||
{"SLIMIT", TK_SLIMIT},
|
{"SNODE", TK_SNODE},
|
||||||
{"SMA", TK_SMA},
|
{"SNODES", TK_SNODES},
|
||||||
{"SMALLINT", TK_SMALLINT},
|
{"SOFFSET", TK_SOFFSET},
|
||||||
{"SNODE", TK_SNODE},
|
{"SPLIT", TK_SPLIT},
|
||||||
{"SNODES", TK_SNODES},
|
{"STABLE", TK_STABLE},
|
||||||
{"SOFFSET", TK_SOFFSET},
|
{"STABLES", TK_STABLES},
|
||||||
{"SPLIT", TK_SPLIT},
|
{"STATE", TK_STATE},
|
||||||
{"STABLE", TK_STABLE},
|
{"STATE_WINDOW", TK_STATE_WINDOW},
|
||||||
{"STABLES", TK_STABLES},
|
{"STORAGE", TK_STORAGE},
|
||||||
{"STATE", TK_STATE},
|
{"STREAM", TK_STREAM},
|
||||||
{"STATE_WINDOW", TK_STATE_WINDOW},
|
{"STREAMS", TK_STREAMS},
|
||||||
{"STORAGE", TK_STORAGE},
|
{"STRICT", TK_STRICT},
|
||||||
{"STREAM", TK_STREAM},
|
{"SUBSCRIPTIONS", TK_SUBSCRIPTIONS},
|
||||||
{"STREAMS", TK_STREAMS},
|
{"SYSINFO", TK_SYSINFO},
|
||||||
{"STRICT", TK_STRICT},
|
{"TABLE", TK_TABLE},
|
||||||
{"SUBSCRIPTIONS", TK_SUBSCRIPTIONS},
|
{"TABLES", TK_TABLES},
|
||||||
{"SYNCDB", TK_SYNCDB},
|
{"TAG", TK_TAG},
|
||||||
{"SYSINFO", TK_SYSINFO},
|
{"TAGS", TK_TAGS},
|
||||||
{"TABLE", TK_TABLE},
|
{"TBNAME", TK_TBNAME},
|
||||||
{"TABLES", TK_TABLES},
|
{"TIMESTAMP", TK_TIMESTAMP},
|
||||||
{"TAG", TK_TAG},
|
{"TIMEZONE", TK_TIMEZONE},
|
||||||
{"TAGS", TK_TAGS},
|
{"TINYINT", TK_TINYINT},
|
||||||
{"TBNAME", TK_TBNAME},
|
{"TO", TK_TO},
|
||||||
{"TIMESTAMP", TK_TIMESTAMP},
|
{"TODAY", TK_TODAY},
|
||||||
{"TIMEZONE", TK_TIMEZONE},
|
{"TOPIC", TK_TOPIC},
|
||||||
{"TINYINT", TK_TINYINT},
|
{"TOPICS", TK_TOPICS},
|
||||||
{"TO", TK_TO},
|
{"TRANSACTION", TK_TRANSACTION},
|
||||||
{"TODAY", TK_TODAY},
|
{"TRANSACTIONS", TK_TRANSACTIONS},
|
||||||
{"TOPIC", TK_TOPIC},
|
{"TRIGGER", TK_TRIGGER},
|
||||||
{"TOPICS", TK_TOPICS},
|
{"TRIM", TK_TRIM},
|
||||||
{"TRANSACTION", TK_TRANSACTION},
|
{"TSERIES", TK_TSERIES},
|
||||||
{"TRANSACTIONS", TK_TRANSACTIONS},
|
{"TTL", TK_TTL},
|
||||||
{"TRIGGER", TK_TRIGGER},
|
{"UNION", TK_UNION},
|
||||||
{"TRIM", TK_TRIM},
|
{"UNSIGNED", TK_UNSIGNED},
|
||||||
{"TSERIES", TK_TSERIES},
|
{"USE", TK_USE},
|
||||||
{"TTL", TK_TTL},
|
{"USER", TK_USER},
|
||||||
{"UNION", TK_UNION},
|
{"USERS", TK_USERS},
|
||||||
{"UNSIGNED", TK_UNSIGNED},
|
{"USING", TK_USING},
|
||||||
{"USE", TK_USE},
|
{"VALUE", TK_VALUE},
|
||||||
{"USER", TK_USER},
|
{"VALUES", TK_VALUES},
|
||||||
{"USERS", TK_USERS},
|
{"VARCHAR", TK_VARCHAR},
|
||||||
{"USING", TK_USING},
|
{"VARIABLES", TK_VARIABLES},
|
||||||
{"VALUE", TK_VALUE},
|
{"VERBOSE", TK_VERBOSE},
|
||||||
{"VALUES", TK_VALUES},
|
{"VGROUP", TK_VGROUP},
|
||||||
{"VARCHAR", TK_VARCHAR},
|
{"VGROUPS", TK_VGROUPS},
|
||||||
{"VARIABLES", TK_VARIABLES},
|
{"WAL_FSYNC_PERIOD", TK_WAL_FSYNC_PERIOD},
|
||||||
{"VERBOSE", TK_VERBOSE},
|
{"WAL_LEVEL", TK_WAL_LEVEL},
|
||||||
{"VGROUP", TK_VGROUP},
|
|
||||||
{"VGROUPS", TK_VGROUPS},
|
|
||||||
{"VNODES", TK_VNODES},
|
|
||||||
{"WAL", TK_WAL},
|
|
||||||
{"WAL_RETENTION_PERIOD", TK_WAL_RETENTION_PERIOD},
|
{"WAL_RETENTION_PERIOD", TK_WAL_RETENTION_PERIOD},
|
||||||
{"WAL_RETENTION_SIZE", TK_WAL_RETENTION_SIZE},
|
{"WAL_RETENTION_SIZE", TK_WAL_RETENTION_SIZE},
|
||||||
{"WAL_ROLL_PERIOD", TK_WAL_ROLL_PERIOD},
|
{"WAL_ROLL_PERIOD", TK_WAL_ROLL_PERIOD},
|
||||||
{"WAL_SEGMENT_SIZE", TK_WAL_SEGMENT_SIZE},
|
{"WAL_SEGMENT_SIZE", TK_WAL_SEGMENT_SIZE},
|
||||||
{"WATERMARK", TK_WATERMARK},
|
{"WATERMARK", TK_WATERMARK},
|
||||||
{"WHERE", TK_WHERE},
|
{"WHERE", TK_WHERE},
|
||||||
{"WINDOW_CLOSE", TK_WINDOW_CLOSE},
|
{"WINDOW_CLOSE", TK_WINDOW_CLOSE},
|
||||||
{"WITH", TK_WITH},
|
{"WITH", TK_WITH},
|
||||||
{"WRITE", TK_WRITE},
|
{"WRITE", TK_WRITE},
|
||||||
{"_C0", TK_ROWTS},
|
{"_C0", TK_ROWTS},
|
||||||
{"_QDURATION", TK_QDURATION},
|
{"_QDURATION", TK_QDURATION},
|
||||||
{"_QEND", TK_QEND},
|
{"_QEND", TK_QEND},
|
||||||
{"_QSTART", TK_QSTART},
|
{"_QSTART", TK_QSTART},
|
||||||
{"_ROWTS", TK_ROWTS},
|
{"_ROWTS", TK_ROWTS},
|
||||||
{"_WDURATION", TK_WDURATION},
|
{"_WDURATION", TK_WDURATION},
|
||||||
{"_WEND", TK_WEND},
|
{"_WEND", TK_WEND},
|
||||||
{"_WSTART", TK_WSTART},
|
{"_WSTART", TK_WSTART},
|
||||||
// {"ID", TK_ID},
|
|
||||||
// {"STRING", TK_STRING},
|
|
||||||
// {"EQ", TK_EQ},
|
|
||||||
// {"NE", TK_NE},
|
|
||||||
// {"ISNULL", TK_ISNULL},
|
|
||||||
// {"NOTNULL", TK_NOTNULL},
|
|
||||||
// {"GLOB", TK_GLOB},
|
|
||||||
// {"GT", TK_GT},
|
|
||||||
// {"GE", TK_GE},
|
|
||||||
// {"LT", TK_LT},
|
|
||||||
// {"LE", TK_LE},
|
|
||||||
// {"BITAND", TK_BITAND},
|
|
||||||
// {"BITOR", TK_BITOR},
|
|
||||||
// {"LSHIFT", TK_LSHIFT},
|
|
||||||
// {"RSHIFT", TK_RSHIFT},
|
|
||||||
// {"PLUS", TK_PLUS},
|
|
||||||
// {"DIVIDE", TK_DIVIDE},
|
|
||||||
// {"TIMES", TK_TIMES},
|
|
||||||
// {"STAR", TK_STAR},
|
|
||||||
// {"SLASH", TK_SLASH},
|
|
||||||
// {"REM ", TK_REM},
|
|
||||||
// {"||", TK_CONCAT},
|
|
||||||
// {"UMINUS", TK_UMINUS},
|
|
||||||
// {"UPLUS", TK_UPLUS},
|
|
||||||
// {"BITNOT", TK_BITNOT},
|
|
||||||
// {"DOT", TK_DOT},
|
|
||||||
// {"CTIME", TK_CTIME},
|
|
||||||
// {"LP", TK_LP},
|
|
||||||
// {"RP", TK_RP},
|
|
||||||
// {"COMMA", TK_COMMA},
|
|
||||||
// {"VARIABLE", TK_VARIABLE},
|
|
||||||
// {"UPDATE", TK_UPDATE},
|
|
||||||
// {"CHANGE", TK_CHANGE},
|
|
||||||
// {"COLON", TK_COLON},
|
|
||||||
// {"ABORT", TK_ABORT},
|
|
||||||
// {"AFTER", TK_AFTER},
|
|
||||||
// {"ATTACH", TK_ATTACH},
|
|
||||||
// {"BEFORE", TK_BEFORE},
|
|
||||||
// {"BEGIN", TK_BEGIN},
|
|
||||||
// {"CASCADE", TK_CASCADE},
|
|
||||||
// {"CONFLICT", TK_CONFLICT},
|
|
||||||
// {"COPY", TK_COPY},
|
|
||||||
// {"DEFERRED", TK_DEFERRED},
|
|
||||||
// {"DELIMITERS", TK_DELIMITERS},
|
|
||||||
// {"DETACH", TK_DETACH},
|
|
||||||
// {"EACH", TK_EACH},
|
|
||||||
// {"END", TK_END},
|
|
||||||
// {"FAIL", TK_FAIL},
|
|
||||||
// {"FOR", TK_FOR},
|
|
||||||
// {"IMMEDIATE", TK_IMMEDIATE},
|
|
||||||
// {"INITIALLY", TK_INITIALLY},
|
|
||||||
// {"INSTEAD", TK_INSTEAD},
|
|
||||||
// {"KEY", TK_KEY},
|
|
||||||
// {"OF", TK_OF},
|
|
||||||
// {"RAISE", TK_RAISE},
|
|
||||||
// {"REPLACE", TK_REPLACE},
|
|
||||||
// {"RESTRICT", TK_RESTRICT},
|
|
||||||
// {"ROW", TK_ROW},
|
|
||||||
// {"STATEMENT", TK_STATEMENT},
|
|
||||||
// {"VIEW", TK_VIEW},
|
|
||||||
// {"SEMI", TK_SEMI},
|
|
||||||
// {"PARTITIONS", TK_PARTITIONS},
|
|
||||||
// {"MODE", TK_MODE},
|
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ typedef struct STranslateContext {
|
||||||
SCmdMsgInfo* pCmdMsg;
|
SCmdMsgInfo* pCmdMsg;
|
||||||
SHashObj* pDbs;
|
SHashObj* pDbs;
|
||||||
SHashObj* pTables;
|
SHashObj* pTables;
|
||||||
|
SHashObj* pTargetTables;
|
||||||
SExplainOptions* pExplainOpt;
|
SExplainOptions* pExplainOpt;
|
||||||
SParseMetaCache* pMetaCache;
|
SParseMetaCache* pMetaCache;
|
||||||
bool createStream;
|
bool createStream;
|
||||||
|
@ -89,10 +90,10 @@ static int32_t collectUseDatabase(const SName* pName, SHashObj* pDbs) {
|
||||||
return collectUseDatabaseImpl(dbFName, pDbs);
|
return collectUseDatabaseImpl(dbFName, pDbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t collectUseTable(const SName* pName, SHashObj* pDbs) {
|
static int32_t collectUseTable(const SName* pName, SHashObj* pTable) {
|
||||||
char fullName[TSDB_TABLE_FNAME_LEN];
|
char fullName[TSDB_TABLE_FNAME_LEN];
|
||||||
tNameExtractFullName(pName, fullName);
|
tNameExtractFullName(pName, fullName);
|
||||||
return taosHashPut(pDbs, fullName, strlen(fullName), pName, sizeof(SName));
|
return taosHashPut(pTable, fullName, strlen(fullName), pName, sizeof(SName));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getTableMetaImpl(STranslateContext* pCxt, const SName* pName, STableMeta** pMeta) {
|
static int32_t getTableMetaImpl(STranslateContext* pCxt, const SName* pName, STableMeta** pMeta) {
|
||||||
|
@ -357,7 +358,8 @@ static int32_t initTranslateContext(SParseContext* pParseCxt, SParseMetaCache* p
|
||||||
pCxt->pMetaCache = pMetaCache;
|
pCxt->pMetaCache = pMetaCache;
|
||||||
pCxt->pDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
pCxt->pDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
pCxt->pTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
pCxt->pTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
if (NULL == pCxt->pNsLevel || NULL == pCxt->pDbs || NULL == pCxt->pTables) {
|
pCxt->pTargetTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
|
if (NULL == pCxt->pNsLevel || NULL == pCxt->pDbs || NULL == pCxt->pTables || NULL == pCxt->pTargetTables) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -2975,7 +2977,7 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS
|
||||||
pReq->daysToKeep2 = pStmt->pOptions->keep[2];
|
pReq->daysToKeep2 = pStmt->pOptions->keep[2];
|
||||||
pReq->minRows = pStmt->pOptions->minRowsPerBlock;
|
pReq->minRows = pStmt->pOptions->minRowsPerBlock;
|
||||||
pReq->maxRows = pStmt->pOptions->maxRowsPerBlock;
|
pReq->maxRows = pStmt->pOptions->maxRowsPerBlock;
|
||||||
pReq->fsyncPeriod = pStmt->pOptions->fsyncPeriod;
|
pReq->walFsyncPeriod = pStmt->pOptions->fsyncPeriod;
|
||||||
pReq->walLevel = pStmt->pOptions->walLevel;
|
pReq->walLevel = pStmt->pOptions->walLevel;
|
||||||
pReq->precision = pStmt->pOptions->precision;
|
pReq->precision = pStmt->pOptions->precision;
|
||||||
pReq->compression = pStmt->pOptions->compressionLevel;
|
pReq->compression = pStmt->pOptions->compressionLevel;
|
||||||
|
@ -3188,7 +3190,8 @@ static int32_t checkOptionsDependency(STranslateContext* pCxt, const char* pDbNa
|
||||||
daysToKeep0 = (-1 == daysToKeep0 ? dbCfg.daysToKeep0 : daysToKeep0);
|
daysToKeep0 = (-1 == daysToKeep0 ? dbCfg.daysToKeep0 : daysToKeep0);
|
||||||
}
|
}
|
||||||
if (daysPerFile > daysToKeep0) {
|
if (daysPerFile > daysToKeep0) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DAYS_VALUE);
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION,
|
||||||
|
"Invalid duration value, should be keep2 >= keep1 >= keep0 >= duration");
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -3334,7 +3337,7 @@ static void buildAlterDbReq(STranslateContext* pCxt, SAlterDatabaseStmt* pStmt,
|
||||||
pReq->daysToKeep0 = pStmt->pOptions->keep[0];
|
pReq->daysToKeep0 = pStmt->pOptions->keep[0];
|
||||||
pReq->daysToKeep1 = pStmt->pOptions->keep[1];
|
pReq->daysToKeep1 = pStmt->pOptions->keep[1];
|
||||||
pReq->daysToKeep2 = pStmt->pOptions->keep[2];
|
pReq->daysToKeep2 = pStmt->pOptions->keep[2];
|
||||||
pReq->fsyncPeriod = pStmt->pOptions->fsyncPeriod;
|
pReq->walFsyncPeriod = pStmt->pOptions->fsyncPeriod;
|
||||||
pReq->walLevel = pStmt->pOptions->walLevel;
|
pReq->walLevel = pStmt->pOptions->walLevel;
|
||||||
pReq->strict = pStmt->pOptions->strict;
|
pReq->strict = pStmt->pOptions->strict;
|
||||||
pReq->cacheLast = pStmt->pOptions->cacheModel;
|
pReq->cacheLast = pStmt->pOptions->cacheModel;
|
||||||
|
@ -3933,6 +3936,9 @@ static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStm
|
||||||
SName tableName;
|
SName tableName;
|
||||||
tNameExtractFullName(toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &tableName), pReq->name);
|
tNameExtractFullName(toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &tableName), pReq->name);
|
||||||
int32_t code = collectUseTable(&tableName, pCxt->pTables);
|
int32_t code = collectUseTable(&tableName, pCxt->pTables);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = collectUseTable(&tableName, pCxt->pTargetTables);
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = buildRollupAst(pCxt, pStmt, pReq);
|
code = buildRollupAst(pCxt, pStmt, pReq);
|
||||||
}
|
}
|
||||||
|
@ -3953,11 +3959,14 @@ static int32_t translateCreateSuperTable(STranslateContext* pCxt, SCreateTableSt
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doTranslateDropSuperTable(STranslateContext* pCxt, const SName* pTableName, bool ignoreNotExists) {
|
static int32_t doTranslateDropSuperTable(STranslateContext* pCxt, const SName* pTableName, bool ignoreNotExists) {
|
||||||
SMDropStbReq dropReq = {0};
|
int32_t code = collectUseTable(pTableName, pCxt->pTargetTables);
|
||||||
tNameExtractFullName(pTableName, dropReq.name);
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
dropReq.igNotExists = ignoreNotExists;
|
SMDropStbReq dropReq = {0};
|
||||||
|
tNameExtractFullName(pTableName, dropReq.name);
|
||||||
return buildCmdMsg(pCxt, TDMT_MND_DROP_STB, (FSerializeFunc)tSerializeSMDropStbReq, &dropReq);
|
dropReq.igNotExists = ignoreNotExists;
|
||||||
|
code = buildCmdMsg(pCxt, TDMT_MND_DROP_STB, (FSerializeFunc)tSerializeSMDropStbReq, &dropReq);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateDropTable(STranslateContext* pCxt, SDropTableStmt* pStmt) {
|
static int32_t translateDropTable(STranslateContext* pCxt, SDropTableStmt* pStmt) {
|
||||||
|
@ -5559,8 +5568,13 @@ static int32_t rewriteCreateTable(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
|
|
||||||
int32_t code = checkCreateTable(pCxt, pStmt, false);
|
int32_t code = checkCreateTable(pCxt, pStmt, false);
|
||||||
SVgroupInfo info = {0};
|
SVgroupInfo info = {0};
|
||||||
|
SName name;
|
||||||
|
toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &name);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = getTableHashVgroup(pCxt, pStmt->dbName, pStmt->tableName, &info);
|
code = getTableHashVgroupImpl(pCxt, &name, &info);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = collectUseTable(&name, pCxt->pTargetTables);
|
||||||
}
|
}
|
||||||
SArray* pBufArray = NULL;
|
SArray* pBufArray = NULL;
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
@ -5829,6 +5843,11 @@ static int32_t rewriteCreateSubTable(STranslateContext* pCxt, SCreateSubTableCla
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = getTableMeta(pCxt, pStmt->useDbName, pStmt->useTableName, &pSuperTableMeta);
|
code = getTableMeta(pCxt, pStmt->useDbName, pStmt->useTableName, &pSuperTableMeta);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
SName name;
|
||||||
|
toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &name);
|
||||||
|
code = collectUseTable(&name, pCxt->pTargetTables);
|
||||||
|
}
|
||||||
|
|
||||||
STag* pTag = NULL;
|
STag* pTag = NULL;
|
||||||
SArray* tagName = taosArrayInit(8, TSDB_COL_NAME_LEN);
|
SArray* tagName = taosArrayInit(8, TSDB_COL_NAME_LEN);
|
||||||
|
@ -5927,8 +5946,13 @@ static void addDropTbReqIntoVgroup(SHashObj* pVgroupHashmap, SDropTableClause* p
|
||||||
|
|
||||||
static int32_t buildDropTableVgroupHashmap(STranslateContext* pCxt, SDropTableClause* pClause, bool* pIsSuperTable,
|
static int32_t buildDropTableVgroupHashmap(STranslateContext* pCxt, SDropTableClause* pClause, bool* pIsSuperTable,
|
||||||
SHashObj* pVgroupHashmap) {
|
SHashObj* pVgroupHashmap) {
|
||||||
|
SName name;
|
||||||
|
toName(pCxt->pParseCxt->acctId, pClause->dbName, pClause->tableName, &name);
|
||||||
STableMeta* pTableMeta = NULL;
|
STableMeta* pTableMeta = NULL;
|
||||||
int32_t code = getTableMeta(pCxt, pClause->dbName, pClause->tableName, &pTableMeta);
|
int32_t code = getTableMetaImpl(pCxt, &name, &pTableMeta);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = collectUseTable(&name, pCxt->pTargetTables);
|
||||||
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && TSDB_SUPER_TABLE == pTableMeta->tableType) {
|
if (TSDB_CODE_SUCCESS == code && TSDB_SUPER_TABLE == pTableMeta->tableType) {
|
||||||
*pIsSuperTable = true;
|
*pIsSuperTable = true;
|
||||||
|
@ -6509,6 +6533,20 @@ static int32_t setRefreshMate(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
pTable = taosHashIterate(pCxt->pTables, pTable);
|
pTable = taosHashIterate(pCxt->pTables, pTable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NULL != pCxt->pTargetTables) {
|
||||||
|
taosArrayDestroy(pQuery->pTargetTableList);
|
||||||
|
pQuery->pTargetTableList = taosArrayInit(taosHashGetSize(pCxt->pTargetTables), sizeof(SName));
|
||||||
|
if (NULL == pQuery->pTargetTableList) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
SName* pTable = taosHashIterate(pCxt->pTargetTables, NULL);
|
||||||
|
while (NULL != pTable) {
|
||||||
|
taosArrayPush(pQuery->pTargetTableList, pTable);
|
||||||
|
pTable = taosHashIterate(pCxt->pTargetTables, pTable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,8 +99,6 @@ static char* getSyntaxErrFormat(int32_t errCode) {
|
||||||
return "Query block has incorrect number of result columns";
|
return "Query block has incorrect number of result columns";
|
||||||
case TSDB_CODE_PAR_INCORRECT_TIMESTAMP_VAL:
|
case TSDB_CODE_PAR_INCORRECT_TIMESTAMP_VAL:
|
||||||
return "Incorrect TIMESTAMP value: %s";
|
return "Incorrect TIMESTAMP value: %s";
|
||||||
case TSDB_CODE_PAR_INVALID_DAYS_VALUE:
|
|
||||||
return "Invalid days value, should be keep2 >= keep1 >= keep0 >= days";
|
|
||||||
case TSDB_CODE_PAR_OFFSET_LESS_ZERO:
|
case TSDB_CODE_PAR_OFFSET_LESS_ZERO:
|
||||||
return "soffset/offset can not be less than 0";
|
return "soffset/offset can not be less than 0";
|
||||||
case TSDB_CODE_PAR_SLIMIT_LEAK_PARTITION_BY:
|
case TSDB_CODE_PAR_SLIMIT_LEAK_PARTITION_BY:
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -82,12 +82,12 @@ TEST_F(ParserInitialATest, alterDnode) {
|
||||||
* BUFFER int_value -- todo: range [3, 16384], default 96, unit MB
|
* BUFFER int_value -- todo: range [3, 16384], default 96, unit MB
|
||||||
* | CACHEMODEL {'none' | 'last_row' | 'last_value' | 'both'} -- default 'none'
|
* | CACHEMODEL {'none' | 'last_row' | 'last_value' | 'both'} -- default 'none'
|
||||||
* | CACHESIZE int_value -- range [1, 65536], default 1, unit MB
|
* | CACHESIZE int_value -- range [1, 65536], default 1, unit MB
|
||||||
* | FSYNC int_value -- rang [0, 180000], default 3000, unit ms
|
* | WAL_FSYNC_PERIOD int_value -- rang [0, 180000], default 3000, unit ms
|
||||||
* | KEEP {int_value | duration_value} -- rang [1, 365000], default 3650, unit day
|
* | KEEP {int_value | duration_value} -- rang [1, 365000], default 3650, unit day
|
||||||
* | PAGES int_value -- todo: rang [64, +oo), default 256, unit page
|
* | PAGES int_value -- todo: rang [64, +oo), default 256, unit page
|
||||||
* | REPLICA int_value -- todo: enum 1, 3, default 1, unit replica
|
* | REPLICA int_value -- todo: enum 1, 3, default 1, unit replica
|
||||||
* | STRICT {'off' | 'on'} -- todo: default 'off'
|
* | STRICT {'off' | 'on'} -- todo: default 'off'
|
||||||
* | WAL int_value -- enum 1, 2, default 1
|
* | WAL_LEVEL int_value -- enum 1, 2, default 1
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
TEST_F(ParserInitialATest, alterDatabase) {
|
TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
|
@ -106,7 +106,7 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
expect.daysToKeep0 = -1;
|
expect.daysToKeep0 = -1;
|
||||||
expect.daysToKeep1 = -1;
|
expect.daysToKeep1 = -1;
|
||||||
expect.daysToKeep2 = -1;
|
expect.daysToKeep2 = -1;
|
||||||
expect.fsyncPeriod = -1;
|
expect.walFsyncPeriod = -1;
|
||||||
expect.walLevel = -1;
|
expect.walLevel = -1;
|
||||||
expect.strict = -1;
|
expect.strict = -1;
|
||||||
expect.cacheLast = -1;
|
expect.cacheLast = -1;
|
||||||
|
@ -123,7 +123,7 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
expect.daysToKeep1 = (-1 == daysToKeep1 ? expect.daysToKeep0 : daysToKeep1);
|
expect.daysToKeep1 = (-1 == daysToKeep1 ? expect.daysToKeep0 : daysToKeep1);
|
||||||
expect.daysToKeep2 = (-1 == daysToKeep1 ? expect.daysToKeep1 : daysToKeep2);
|
expect.daysToKeep2 = (-1 == daysToKeep1 ? expect.daysToKeep1 : daysToKeep2);
|
||||||
};
|
};
|
||||||
auto setAlterDbFsync = [&](int32_t fsync) { expect.fsyncPeriod = fsync; };
|
auto setAlterDbFsync = [&](int32_t fsync) { expect.walFsyncPeriod = fsync; };
|
||||||
auto setAlterDbWal = [&](int8_t wal) { expect.walLevel = wal; };
|
auto setAlterDbWal = [&](int8_t wal) { expect.walLevel = wal; };
|
||||||
auto setAlterDbStrict = [&](int8_t strict) { expect.strict = strict; };
|
auto setAlterDbStrict = [&](int8_t strict) { expect.strict = strict; };
|
||||||
auto setAlterDbCacheModel = [&](int8_t cacheModel) { expect.cacheLast = cacheModel; };
|
auto setAlterDbCacheModel = [&](int8_t cacheModel) { expect.cacheLast = cacheModel; };
|
||||||
|
@ -141,7 +141,7 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
ASSERT_EQ(req.daysToKeep0, expect.daysToKeep0);
|
ASSERT_EQ(req.daysToKeep0, expect.daysToKeep0);
|
||||||
ASSERT_EQ(req.daysToKeep1, expect.daysToKeep1);
|
ASSERT_EQ(req.daysToKeep1, expect.daysToKeep1);
|
||||||
ASSERT_EQ(req.daysToKeep2, expect.daysToKeep2);
|
ASSERT_EQ(req.daysToKeep2, expect.daysToKeep2);
|
||||||
ASSERT_EQ(req.fsyncPeriod, expect.fsyncPeriod);
|
ASSERT_EQ(req.walFsyncPeriod, expect.walFsyncPeriod);
|
||||||
ASSERT_EQ(req.walLevel, expect.walLevel);
|
ASSERT_EQ(req.walLevel, expect.walLevel);
|
||||||
ASSERT_EQ(req.strict, expect.strict);
|
ASSERT_EQ(req.strict, expect.strict);
|
||||||
ASSERT_EQ(req.cacheLast, expect.cacheLast);
|
ASSERT_EQ(req.cacheLast, expect.cacheLast);
|
||||||
|
@ -157,7 +157,7 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
setAlterDbFsync(200);
|
setAlterDbFsync(200);
|
||||||
setAlterDbWal(1);
|
setAlterDbWal(1);
|
||||||
setAlterDbCacheModel(TSDB_CACHE_MODEL_LAST_ROW);
|
setAlterDbCacheModel(TSDB_CACHE_MODEL_LAST_ROW);
|
||||||
run("ALTER DATABASE test CACHEMODEL 'last_row' CACHESIZE 32 FSYNC 200 KEEP 10 WAL 1");
|
run("ALTER DATABASE test CACHEMODEL 'last_row' CACHESIZE 32 WAL_FSYNC_PERIOD 200 KEEP 10 WAL_LEVEL 1");
|
||||||
clearAlterDbReq();
|
clearAlterDbReq();
|
||||||
|
|
||||||
initAlterDb("test");
|
initAlterDb("test");
|
||||||
|
@ -182,11 +182,11 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
|
|
||||||
initAlterDb("test");
|
initAlterDb("test");
|
||||||
setAlterDbFsync(0);
|
setAlterDbFsync(0);
|
||||||
run("ALTER DATABASE test FSYNC 0");
|
run("ALTER DATABASE test WAL_FSYNC_PERIOD 0");
|
||||||
setAlterDbFsync(1000);
|
setAlterDbFsync(1000);
|
||||||
run("ALTER DATABASE test FSYNC 1000");
|
run("ALTER DATABASE test WAL_FSYNC_PERIOD 1000");
|
||||||
setAlterDbFsync(180000);
|
setAlterDbFsync(180000);
|
||||||
run("ALTER DATABASE test FSYNC 180000");
|
run("ALTER DATABASE test WAL_FSYNC_PERIOD 180000");
|
||||||
clearAlterDbReq();
|
clearAlterDbReq();
|
||||||
|
|
||||||
initAlterDb("test");
|
initAlterDb("test");
|
||||||
|
@ -210,9 +210,9 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
|
|
||||||
initAlterDb("test");
|
initAlterDb("test");
|
||||||
setAlterDbWal(1);
|
setAlterDbWal(1);
|
||||||
run("ALTER DATABASE test WAL 1");
|
run("ALTER DATABASE test WAL_LEVEL 1");
|
||||||
setAlterDbWal(2);
|
setAlterDbWal(2);
|
||||||
run("ALTER DATABASE test WAL 2");
|
run("ALTER DATABASE test WAL_LEVEL 2");
|
||||||
clearAlterDbReq();
|
clearAlterDbReq();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,16 +223,16 @@ TEST_F(ParserInitialATest, alterDatabaseSemanticCheck) {
|
||||||
run("ALTER DATABASE test CACHESIZE 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test CACHESIZE 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test CACHESIZE 65537", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test CACHESIZE 65537", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
// The syntax limits it to only positive numbers
|
// The syntax limits it to only positive numbers
|
||||||
run("ALTER DATABASE test FSYNC -1", TSDB_CODE_PAR_SYNTAX_ERROR, PARSER_STAGE_PARSE);
|
run("ALTER DATABASE test WAL_FSYNC_PERIOD -1", TSDB_CODE_PAR_SYNTAX_ERROR, PARSER_STAGE_PARSE);
|
||||||
run("ALTER DATABASE test FSYNC 180001", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test WAL_FSYNC_PERIOD 180001", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test KEEP 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test KEEP 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test KEEP 365001", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test KEEP 365001", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test KEEP 1000000000s", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test KEEP 1000000000s", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test KEEP 1w", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test KEEP 1w", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test WAL 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test WAL_LEVEL 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test WAL 3", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test WAL_LEVEL 3", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
// Regardless of the specific sentence
|
// Regardless of the specific sentence
|
||||||
run("ALTER DATABASE db WAL 0 # td-14436", TSDB_CODE_PAR_SYNTAX_ERROR, PARSER_STAGE_PARSE);
|
run("ALTER DATABASE db WAL_LEVEL 0 # td-14436", TSDB_CODE_PAR_SYNTAX_ERROR, PARSER_STAGE_PARSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -21,12 +21,6 @@ namespace ParserTest {
|
||||||
|
|
||||||
class ParserInitialCTest : public ParserDdlTest {};
|
class ParserInitialCTest : public ParserDdlTest {};
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, compact) {
|
|
||||||
useDb("root", "test");
|
|
||||||
|
|
||||||
run("COMPACT VNODES IN (1, 2)", TSDB_CODE_PAR_EXPRIE_STATEMENT, PARSER_STAGE_PARSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createAccount) {
|
TEST_F(ParserInitialCTest, createAccount) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
|
@ -64,7 +58,7 @@ TEST_F(ParserInitialCTest, createBnode) {
|
||||||
* | CACHESIZE value
|
* | CACHESIZE value
|
||||||
* | COMP {0 | 1 | 2}
|
* | COMP {0 | 1 | 2}
|
||||||
* | DURATION value
|
* | DURATION value
|
||||||
* | FSYNC value
|
* | WAL_FSYNC_PERIOD value
|
||||||
* | MAXROWS value
|
* | MAXROWS value
|
||||||
* | MINROWS value
|
* | MINROWS value
|
||||||
* | KEEP value
|
* | KEEP value
|
||||||
|
@ -74,7 +68,7 @@ TEST_F(ParserInitialCTest, createBnode) {
|
||||||
* | REPLICA value
|
* | REPLICA value
|
||||||
* | RETENTIONS ingestion_duration:keep_duration ...
|
* | RETENTIONS ingestion_duration:keep_duration ...
|
||||||
* | STRICT {'off' | 'on'}
|
* | STRICT {'off' | 'on'}
|
||||||
* | WAL value
|
* | WAL_LEVEL value
|
||||||
* | VGROUPS value
|
* | VGROUPS value
|
||||||
* | SINGLE_STABLE {0 | 1}
|
* | SINGLE_STABLE {0 | 1}
|
||||||
* | WAL_RETENTION_PERIOD value
|
* | WAL_RETENTION_PERIOD value
|
||||||
|
@ -102,7 +96,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
expect.cacheLastSize = TSDB_DEFAULT_CACHE_SIZE;
|
expect.cacheLastSize = TSDB_DEFAULT_CACHE_SIZE;
|
||||||
expect.compression = TSDB_DEFAULT_COMP_LEVEL;
|
expect.compression = TSDB_DEFAULT_COMP_LEVEL;
|
||||||
expect.daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE;
|
expect.daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE;
|
||||||
expect.fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
|
expect.walFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
|
||||||
expect.maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
|
expect.maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
|
||||||
expect.minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
|
expect.minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
|
||||||
expect.daysToKeep0 = TSDB_DEFAULT_KEEP;
|
expect.daysToKeep0 = TSDB_DEFAULT_KEEP;
|
||||||
|
@ -124,7 +118,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
auto setDbCachelastSize = [&](int8_t cachelastSize) { expect.cacheLastSize = cachelastSize; };
|
auto setDbCachelastSize = [&](int8_t cachelastSize) { expect.cacheLastSize = cachelastSize; };
|
||||||
auto setDbCompressionFunc = [&](int8_t compressionLevel) { expect.compression = compressionLevel; };
|
auto setDbCompressionFunc = [&](int8_t compressionLevel) { expect.compression = compressionLevel; };
|
||||||
auto setDbDaysFunc = [&](int32_t daysPerFile) { expect.daysPerFile = daysPerFile; };
|
auto setDbDaysFunc = [&](int32_t daysPerFile) { expect.daysPerFile = daysPerFile; };
|
||||||
auto setDbFsyncFunc = [&](int32_t fsyncPeriod) { expect.fsyncPeriod = fsyncPeriod; };
|
auto setDbFsyncFunc = [&](int32_t fsyncPeriod) { expect.walFsyncPeriod = fsyncPeriod; };
|
||||||
auto setDbMaxRowsFunc = [&](int32_t maxRowsPerBlock) { expect.maxRows = maxRowsPerBlock; };
|
auto setDbMaxRowsFunc = [&](int32_t maxRowsPerBlock) { expect.maxRows = maxRowsPerBlock; };
|
||||||
auto setDbMinRowsFunc = [&](int32_t minRowsPerBlock) { expect.minRows = minRowsPerBlock; };
|
auto setDbMinRowsFunc = [&](int32_t minRowsPerBlock) { expect.minRows = minRowsPerBlock; };
|
||||||
auto setDbKeepFunc = [&](int32_t keep0, int32_t keep1 = 0, int32_t keep2 = 0) {
|
auto setDbKeepFunc = [&](int32_t keep0, int32_t keep1 = 0, int32_t keep2 = 0) {
|
||||||
|
@ -175,7 +169,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
ASSERT_EQ(req.daysToKeep2, expect.daysToKeep2);
|
ASSERT_EQ(req.daysToKeep2, expect.daysToKeep2);
|
||||||
ASSERT_EQ(req.minRows, expect.minRows);
|
ASSERT_EQ(req.minRows, expect.minRows);
|
||||||
ASSERT_EQ(req.maxRows, expect.maxRows);
|
ASSERT_EQ(req.maxRows, expect.maxRows);
|
||||||
ASSERT_EQ(req.fsyncPeriod, expect.fsyncPeriod);
|
ASSERT_EQ(req.walFsyncPeriod, expect.walFsyncPeriod);
|
||||||
ASSERT_EQ(req.walLevel, expect.walLevel);
|
ASSERT_EQ(req.walLevel, expect.walLevel);
|
||||||
ASSERT_EQ(req.precision, expect.precision);
|
ASSERT_EQ(req.precision, expect.precision);
|
||||||
ASSERT_EQ(req.compression, expect.compression);
|
ASSERT_EQ(req.compression, expect.compression);
|
||||||
|
@ -241,7 +235,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
"CACHESIZE 20 "
|
"CACHESIZE 20 "
|
||||||
"COMP 1 "
|
"COMP 1 "
|
||||||
"DURATION 100 "
|
"DURATION 100 "
|
||||||
"FSYNC 100 "
|
"WAL_FSYNC_PERIOD 100 "
|
||||||
"MAXROWS 1000 "
|
"MAXROWS 1000 "
|
||||||
"MINROWS 100 "
|
"MINROWS 100 "
|
||||||
"KEEP 1440 "
|
"KEEP 1440 "
|
||||||
|
@ -251,7 +245,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
"REPLICA 3 "
|
"REPLICA 3 "
|
||||||
"RETENTIONS 15s:7d,1m:21d,15m:500d "
|
"RETENTIONS 15s:7d,1m:21d,15m:500d "
|
||||||
"STRICT 'on' "
|
"STRICT 'on' "
|
||||||
"WAL 2 "
|
"WAL_LEVEL 2 "
|
||||||
"VGROUPS 100 "
|
"VGROUPS 100 "
|
||||||
"SINGLE_STABLE 1 "
|
"SINGLE_STABLE 1 "
|
||||||
"SCHEMALESS 1 "
|
"SCHEMALESS 1 "
|
||||||
|
|
|
@ -553,6 +553,7 @@ static int32_t createTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubp
|
||||||
pTableScan->triggerType = pScanLogicNode->triggerType;
|
pTableScan->triggerType = pScanLogicNode->triggerType;
|
||||||
pTableScan->watermark = pScanLogicNode->watermark;
|
pTableScan->watermark = pScanLogicNode->watermark;
|
||||||
pTableScan->igExpired = pScanLogicNode->igExpired;
|
pTableScan->igExpired = pScanLogicNode->igExpired;
|
||||||
|
pTableScan->assignBlockUid = pCxt->pPlanCxt->rSmaQuery ? true : false;
|
||||||
|
|
||||||
return createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pTableScan, pPhyNode);
|
return createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pTableScan, pPhyNode);
|
||||||
}
|
}
|
||||||
|
@ -632,6 +633,7 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
pJoin->joinType = pJoinLogicNode->joinType;
|
pJoin->joinType = pJoinLogicNode->joinType;
|
||||||
|
pJoin->inputTsOrder = pJoinLogicNode->inputTsOrder;
|
||||||
setNodeSlotId(pCxt, pLeftDesc->dataBlockId, pRightDesc->dataBlockId, pJoinLogicNode->pMergeCondition,
|
setNodeSlotId(pCxt, pLeftDesc->dataBlockId, pRightDesc->dataBlockId, pJoinLogicNode->pMergeCondition,
|
||||||
&pJoin->pMergeCondition);
|
&pJoin->pMergeCondition);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
|
|
@ -283,7 +283,7 @@ int32_t qwGetDeleteResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, SDeleteRes *pRes
|
||||||
pRes->skey = pDelRes->skey;
|
pRes->skey = pDelRes->skey;
|
||||||
pRes->ekey = pDelRes->ekey;
|
pRes->ekey = pDelRes->ekey;
|
||||||
pRes->affectedRows = pDelRes->affectedRows;
|
pRes->affectedRows = pDelRes->affectedRows;
|
||||||
|
strcpy(pRes->tableFName, pDelRes->tableFName);
|
||||||
taosMemoryFree(output.pData);
|
taosMemoryFree(output.pData);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -230,6 +230,7 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDa
|
||||||
SVDeleteRsp rsp = {0};
|
SVDeleteRsp rsp = {0};
|
||||||
tDecoderInit(&coder, msg, msgSize);
|
tDecoderInit(&coder, msg, msgSize);
|
||||||
tDecodeSVDeleteRsp(&coder, &rsp);
|
tDecodeSVDeleteRsp(&coder, &rsp);
|
||||||
|
tDecoderClear(&coder);
|
||||||
|
|
||||||
atomic_add_fetch_32(&pJob->resNumOfRows, rsp.affectedRows);
|
atomic_add_fetch_32(&pJob->resNumOfRows, rsp.affectedRows);
|
||||||
SCH_TASK_DLOG("delete succeed, affectedRows:%" PRId64, rsp.affectedRows);
|
SCH_TASK_DLOG("delete succeed, affectedRows:%" PRId64, rsp.affectedRows);
|
||||||
|
|
|
@ -38,14 +38,14 @@ int32_t streamPipelineExec(SStreamTask* pTask, int32_t batchNum);
|
||||||
int32_t streamDispatch(SStreamTask* pTask, SMsgCb* pMsgCb);
|
int32_t streamDispatch(SStreamTask* pTask, SMsgCb* pMsgCb);
|
||||||
int32_t streamDispatchReqToData(const SStreamDispatchReq* pReq, SStreamDataBlock* pData);
|
int32_t streamDispatchReqToData(const SStreamDispatchReq* pReq, SStreamDataBlock* pData);
|
||||||
int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock* pData);
|
int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock* pData);
|
||||||
int32_t streamBuildDispatchMsg(SStreamTask* pTask, const SStreamDataBlock* data, SRpcMsg* pMsg, SEpSet** ppEpSet);
|
int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* data);
|
||||||
|
|
||||||
int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock);
|
int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock);
|
||||||
|
|
||||||
int32_t tEncodeStreamRetrieveReq(SEncoder* pEncoder, const SStreamRetrieveReq* pReq);
|
int32_t tEncodeStreamRetrieveReq(SEncoder* pEncoder, const SStreamRetrieveReq* pReq);
|
||||||
|
|
||||||
SStreamQueueItem* streamAppendQueueItem(SStreamQueueItem* dst, SStreamQueueItem* elem);
|
SStreamQueueItem* streamAppendQueueItem(SStreamQueueItem* dst, SStreamQueueItem* elem);
|
||||||
void streamFreeQitem(SStreamQueueItem* data);
|
void streamFreeQitem(SStreamQueueItem* data);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,6 +219,12 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp) {
|
||||||
|
|
||||||
qDebug("task %d receive dispatch rsp", pTask->taskId);
|
qDebug("task %d receive dispatch rsp", pTask->taskId);
|
||||||
|
|
||||||
|
if (pTask->dispatchType == TASK_DISPATCH__SHUFFLE) {
|
||||||
|
int32_t leftRsp = atomic_sub_fetch_32(&pTask->shuffleDispatcher.waitingRspCnt, 1);
|
||||||
|
qDebug("task %d is shuffle, left waiting rsp %d", pTask->taskId, leftRsp);
|
||||||
|
if (leftRsp > 0) return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int8_t old = atomic_exchange_8(&pTask->outputStatus, pRsp->inputStatus);
|
int8_t old = atomic_exchange_8(&pTask->outputStatus, pRsp->inputStatus);
|
||||||
ASSERT(old == TASK_OUTPUT_STATUS__WAIT);
|
ASSERT(old == TASK_OUTPUT_STATUS__WAIT);
|
||||||
if (pRsp->inputStatus == TASK_INPUT_STATUS__BLOCKED) {
|
if (pRsp->inputStatus == TASK_INPUT_STATUS__BLOCKED) {
|
||||||
|
|
|
@ -198,6 +198,158 @@ static int32_t streamAddBlockToDispatchMsg(const SSDataBlock* pBlock, SStreamDis
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t streamDispatchOneReq(SStreamTask* pTask, const SStreamDispatchReq* pReq, int32_t vgId, SEpSet* pEpSet) {
|
||||||
|
void* buf = NULL;
|
||||||
|
int32_t code = -1;
|
||||||
|
SRpcMsg msg = {0};
|
||||||
|
|
||||||
|
// serialize
|
||||||
|
int32_t tlen;
|
||||||
|
tEncodeSize(tEncodeStreamDispatchReq, pReq, tlen, code);
|
||||||
|
if (code < 0) goto FAIL;
|
||||||
|
code = -1;
|
||||||
|
buf = rpcMallocCont(sizeof(SMsgHead) + tlen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
goto FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
((SMsgHead*)buf)->vgId = htonl(vgId);
|
||||||
|
void* abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
||||||
|
|
||||||
|
SEncoder encoder;
|
||||||
|
tEncoderInit(&encoder, abuf, tlen);
|
||||||
|
if ((code = tEncodeStreamDispatchReq(&encoder, pReq)) < 0) {
|
||||||
|
goto FAIL;
|
||||||
|
}
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
|
||||||
|
msg.contLen = tlen + sizeof(SMsgHead);
|
||||||
|
msg.pCont = buf;
|
||||||
|
msg.msgType = pTask->dispatchMsgType;
|
||||||
|
|
||||||
|
tmsgSendReq(pEpSet, &msg);
|
||||||
|
|
||||||
|
code = 0;
|
||||||
|
FAIL:
|
||||||
|
if (code < 0 && buf) rpcFreeCont(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pData) {
|
||||||
|
int32_t code = -1;
|
||||||
|
int32_t blockNum = taosArrayGetSize(pData->blocks);
|
||||||
|
ASSERT(blockNum != 0);
|
||||||
|
|
||||||
|
if (pTask->dispatchType == TASK_DISPATCH__FIXED) {
|
||||||
|
SStreamDispatchReq req = {
|
||||||
|
.streamId = pTask->streamId,
|
||||||
|
.dataSrcVgId = pData->srcVgId,
|
||||||
|
.upstreamTaskId = pTask->taskId,
|
||||||
|
.upstreamChildId = pTask->selfChildId,
|
||||||
|
.upstreamNodeId = pTask->nodeId,
|
||||||
|
.blockNum = blockNum,
|
||||||
|
};
|
||||||
|
|
||||||
|
req.data = taosArrayInit(blockNum, sizeof(void*));
|
||||||
|
req.dataLen = taosArrayInit(blockNum, sizeof(int32_t));
|
||||||
|
if (req.data == NULL || req.dataLen == NULL) {
|
||||||
|
goto FAIL_FIXED_DISPATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < blockNum; i++) {
|
||||||
|
SSDataBlock* pDataBlock = taosArrayGet(pData->blocks, i);
|
||||||
|
if (streamAddBlockToDispatchMsg(pDataBlock, &req) < 0) {
|
||||||
|
goto FAIL_FIXED_DISPATCH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int32_t vgId = pTask->fixedEpDispatcher.nodeId;
|
||||||
|
SEpSet* pEpSet = &pTask->fixedEpDispatcher.epSet;
|
||||||
|
int32_t downstreamTaskId = pTask->fixedEpDispatcher.taskId;
|
||||||
|
|
||||||
|
req.taskId = downstreamTaskId;
|
||||||
|
|
||||||
|
qDebug("dispatch from task %d (child id %d) to down stream task %d in vnode %d", pTask->taskId, pTask->selfChildId,
|
||||||
|
downstreamTaskId, vgId);
|
||||||
|
|
||||||
|
if (streamDispatchOneReq(pTask, &req, vgId, pEpSet) < 0) {
|
||||||
|
goto FAIL_FIXED_DISPATCH;
|
||||||
|
}
|
||||||
|
code = 0;
|
||||||
|
FAIL_FIXED_DISPATCH:
|
||||||
|
taosArrayDestroy(req.data);
|
||||||
|
taosArrayDestroy(req.dataLen);
|
||||||
|
return code;
|
||||||
|
|
||||||
|
} else if (pTask->dispatchType == TASK_DISPATCH__SHUFFLE) {
|
||||||
|
SArray* vgInfo = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
||||||
|
ASSERT(pTask->shuffleDispatcher.waitingRspCnt == 0);
|
||||||
|
int32_t vgSz = taosArrayGetSize(vgInfo);
|
||||||
|
SStreamDispatchReq* pReqs = taosMemoryCalloc(vgSz, sizeof(SStreamDispatchReq));
|
||||||
|
if (pReqs == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < vgSz; i++) {
|
||||||
|
pReqs[i].streamId = pTask->streamId;
|
||||||
|
pReqs[i].dataSrcVgId = pData->srcVgId;
|
||||||
|
pReqs[i].upstreamTaskId = pTask->taskId;
|
||||||
|
pReqs[i].upstreamChildId = pTask->selfChildId;
|
||||||
|
pReqs[i].upstreamNodeId = pTask->nodeId;
|
||||||
|
pReqs[i].blockNum = 0;
|
||||||
|
pReqs[i].data = taosArrayInit(0, sizeof(void*));
|
||||||
|
pReqs[i].dataLen = taosArrayInit(0, sizeof(int32_t));
|
||||||
|
if (pReqs[i].data == NULL || pReqs[i].dataLen == NULL) {
|
||||||
|
goto FAIL_SHUFFLE_DISPATCH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < blockNum; i++) {
|
||||||
|
SSDataBlock* pDataBlock = taosArrayGet(pData->blocks, i);
|
||||||
|
char* ctbName = buildCtbNameByGroupId(pTask->shuffleDispatcher.stbFullName, pDataBlock->info.groupId);
|
||||||
|
|
||||||
|
// TODO: get hash function by hashMethod
|
||||||
|
uint32_t hashValue = MurmurHash3_32(ctbName, strlen(ctbName));
|
||||||
|
|
||||||
|
// TODO: optimize search
|
||||||
|
int32_t j;
|
||||||
|
for (j = 0; j < vgSz; j++) {
|
||||||
|
SVgroupInfo* pVgInfo = taosArrayGet(vgInfo, j);
|
||||||
|
ASSERT(pVgInfo->vgId > 0);
|
||||||
|
if (hashValue >= pVgInfo->hashBegin && hashValue <= pVgInfo->hashEnd) {
|
||||||
|
if (streamAddBlockToDispatchMsg(pDataBlock, &pReqs[j]) < 0) {
|
||||||
|
goto FAIL_SHUFFLE_DISPATCH;
|
||||||
|
}
|
||||||
|
pReqs[j].taskId = pVgInfo->taskId;
|
||||||
|
pReqs[j].blockNum++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < vgSz; i++) {
|
||||||
|
if (pReqs[i].blockNum > 0) {
|
||||||
|
// send
|
||||||
|
SVgroupInfo* pVgInfo = taosArrayGet(vgInfo, i);
|
||||||
|
if (streamDispatchOneReq(pTask, &pReqs[i], pVgInfo->vgId, &pVgInfo->epSet) < 0) {
|
||||||
|
goto FAIL_SHUFFLE_DISPATCH;
|
||||||
|
}
|
||||||
|
pTask->shuffleDispatcher.waitingRspCnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
code = 0;
|
||||||
|
FAIL_SHUFFLE_DISPATCH:
|
||||||
|
if (pReqs) {
|
||||||
|
for (int32_t i = 0; i < vgSz; i++) {
|
||||||
|
taosArrayDestroy(pReqs[i].data);
|
||||||
|
taosArrayDestroy(pReqs[i].dataLen);
|
||||||
|
}
|
||||||
|
taosMemoryFree(pReqs);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t streamBuildDispatchMsg(SStreamTask* pTask, const SStreamDataBlock* data, SRpcMsg* pMsg, SEpSet** ppEpSet) {
|
int32_t streamBuildDispatchMsg(SStreamTask* pTask, const SStreamDataBlock* data, SRpcMsg* pMsg, SEpSet** ppEpSet) {
|
||||||
void* buf = NULL;
|
void* buf = NULL;
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
|
@ -262,29 +414,7 @@ int32_t streamBuildDispatchMsg(SStreamTask* pTask, const SStreamDataBlock* data,
|
||||||
qDebug("dispatch from task %d (child id %d) to down stream task %d in vnode %d", pTask->taskId, pTask->selfChildId,
|
qDebug("dispatch from task %d (child id %d) to down stream task %d in vnode %d", pTask->taskId, pTask->selfChildId,
|
||||||
downstreamTaskId, vgId);
|
downstreamTaskId, vgId);
|
||||||
|
|
||||||
// serialize
|
streamDispatchOneReq(pTask, &req, vgId, *ppEpSet);
|
||||||
int32_t tlen;
|
|
||||||
tEncodeSize(tEncodeStreamDispatchReq, &req, tlen, code);
|
|
||||||
if (code < 0) goto FAIL;
|
|
||||||
code = -1;
|
|
||||||
buf = rpcMallocCont(sizeof(SMsgHead) + tlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
goto FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
((SMsgHead*)buf)->vgId = htonl(vgId);
|
|
||||||
void* abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
|
||||||
|
|
||||||
SEncoder encoder;
|
|
||||||
tEncoderInit(&encoder, abuf, tlen);
|
|
||||||
if ((code = tEncodeStreamDispatchReq(&encoder, &req)) < 0) {
|
|
||||||
goto FAIL;
|
|
||||||
}
|
|
||||||
tEncoderClear(&encoder);
|
|
||||||
|
|
||||||
pMsg->contLen = tlen + sizeof(SMsgHead);
|
|
||||||
pMsg->pCont = buf;
|
|
||||||
pMsg->msgType = pTask->dispatchMsgType;
|
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
FAIL:
|
FAIL:
|
||||||
|
@ -314,6 +444,18 @@ int32_t streamDispatch(SStreamTask* pTask, SMsgCb* pMsgCb) {
|
||||||
|
|
||||||
qDebug("stream continue dispatching: task %d", pTask->taskId);
|
qDebug("stream continue dispatching: task %d", pTask->taskId);
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
|
if (streamDispatchAllBlocks(pTask, pBlock) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
code = -1;
|
||||||
|
// TODO set status fail
|
||||||
|
goto FREE;
|
||||||
|
}
|
||||||
|
/*atomic_store_8(&pTask->outputStatus, TASK_OUTPUT_STATUS__NORMAL);*/
|
||||||
|
FREE:
|
||||||
|
taosArrayDestroyEx(pBlock->blocks, (FDelete)blockDataFreeRes);
|
||||||
|
taosFreeQitem(pBlock);
|
||||||
|
#if 0
|
||||||
SRpcMsg dispatchMsg = {0};
|
SRpcMsg dispatchMsg = {0};
|
||||||
SEpSet* pEpSet = NULL;
|
SEpSet* pEpSet = NULL;
|
||||||
if (streamBuildDispatchMsg(pTask, pBlock, &dispatchMsg, &pEpSet) < 0) {
|
if (streamBuildDispatchMsg(pTask, pBlock, &dispatchMsg, &pEpSet) < 0) {
|
||||||
|
@ -325,5 +467,6 @@ int32_t streamDispatch(SStreamTask* pTask, SMsgCb* pMsgCb) {
|
||||||
taosFreeQitem(pBlock);
|
taosFreeQitem(pBlock);
|
||||||
|
|
||||||
tmsgSendReq(pEpSet, &dispatchMsg);
|
tmsgSendReq(pEpSet, &dispatchMsg);
|
||||||
return 0;
|
#endif
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2501,19 +2501,15 @@ int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg, SyncI
|
||||||
// if mulit replica, start replicate right now
|
// if mulit replica, start replicate right now
|
||||||
if (ths->replicaNum > 1) {
|
if (ths->replicaNum > 1) {
|
||||||
syncNodeReplicate(ths);
|
syncNodeReplicate(ths);
|
||||||
}
|
|
||||||
|
|
||||||
// pre commit
|
// pre commit
|
||||||
syncNodePreCommit(ths, pEntry, 0);
|
syncNodePreCommit(ths, pEntry, 0);
|
||||||
|
}
|
||||||
|
|
||||||
// if only myself, maybe commit right now
|
// if only myself, maybe commit right now
|
||||||
if (ths->replicaNum == 1) {
|
if (ths->replicaNum == 1) {
|
||||||
syncMaybeAdvanceCommitIndex(ths);
|
syncMaybeAdvanceCommitIndex(ths);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
// pre commit
|
|
||||||
syncNodePreCommit(ths, pEntry, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRetIndex != NULL) {
|
if (pRetIndex != NULL) {
|
||||||
|
|
|
@ -7,8 +7,7 @@
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
* FITNESS FOR A PARTICULAR PURPOSE. *
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
@ -211,6 +210,7 @@ typedef struct SConnBuffer {
|
||||||
char* buf;
|
char* buf;
|
||||||
int len;
|
int len;
|
||||||
int cap;
|
int cap;
|
||||||
|
int left;
|
||||||
int total;
|
int total;
|
||||||
} SConnBuffer;
|
} SConnBuffer;
|
||||||
|
|
||||||
|
@ -282,6 +282,8 @@ int transClearBuffer(SConnBuffer* buf);
|
||||||
int transDestroyBuffer(SConnBuffer* buf);
|
int transDestroyBuffer(SConnBuffer* buf);
|
||||||
int transAllocBuffer(SConnBuffer* connBuf, uv_buf_t* uvBuf);
|
int transAllocBuffer(SConnBuffer* connBuf, uv_buf_t* uvBuf);
|
||||||
bool transReadComplete(SConnBuffer* connBuf);
|
bool transReadComplete(SConnBuffer* connBuf);
|
||||||
|
int transResetBuffer(SConnBuffer* connBuf);
|
||||||
|
int transDumpFromBuffer(SConnBuffer* connBuf, char** buf);
|
||||||
|
|
||||||
int transSetConnOption(uv_tcp_t* stream);
|
int transSetConnOption(uv_tcp_t* stream);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#ifdef USE_UV
|
#ifdef USE_UV
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
#endif
|
#endif
|
||||||
|
// clang-format off
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
#include "thttp.h"
|
#include "thttp.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
|
@ -174,7 +175,7 @@ int32_t taosSendHttpReport(const char* server, uint16_t port, char* pCont, int32
|
||||||
|
|
||||||
#else
|
#else
|
||||||
int32_t taosSendHttpReport(const char* server, uint16_t port, char* pCont, int32_t contLen, EHttpCompFlag flag) {
|
int32_t taosSendHttpReport(const char* server, uint16_t port, char* pCont, int32_t contLen, EHttpCompFlag flag) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
TdSocketPtr pSocket = NULL;
|
TdSocketPtr pSocket = NULL;
|
||||||
|
|
||||||
uint32_t ip = taosGetIpv4FromFqdn(server);
|
uint32_t ip = taosGetIpv4FromFqdn(server);
|
||||||
|
@ -231,4 +232,5 @@ SEND_OVER:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
// clang-format on
|
||||||
|
#endif
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct SCliThrd {
|
||||||
int64_t pid; // pid
|
int64_t pid; // pid
|
||||||
uv_loop_t* loop;
|
uv_loop_t* loop;
|
||||||
SAsyncPool* asyncPool;
|
SAsyncPool* asyncPool;
|
||||||
|
uv_idle_t* idle;
|
||||||
uv_timer_t timer;
|
uv_timer_t timer;
|
||||||
void* pool; // conn pool
|
void* pool; // conn pool
|
||||||
|
|
||||||
|
@ -116,6 +117,7 @@ static void cliSendCb(uv_write_t* req, int status);
|
||||||
// callback after conn to server
|
// callback after conn to server
|
||||||
static void cliConnCb(uv_connect_t* req, int status);
|
static void cliConnCb(uv_connect_t* req, int status);
|
||||||
static void cliAsyncCb(uv_async_t* handle);
|
static void cliAsyncCb(uv_async_t* handle);
|
||||||
|
static void cliIdleCb(uv_idle_t* handle);
|
||||||
|
|
||||||
static int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg);
|
static int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg);
|
||||||
|
|
||||||
|
@ -323,7 +325,8 @@ void cliHandleResp(SCliConn* conn) {
|
||||||
SCliThrd* pThrd = conn->hostThrd;
|
SCliThrd* pThrd = conn->hostThrd;
|
||||||
STrans* pTransInst = pThrd->pTransInst;
|
STrans* pTransInst = pThrd->pTransInst;
|
||||||
|
|
||||||
STransMsgHead* pHead = (STransMsgHead*)(conn->readBuf.buf);
|
STransMsgHead* pHead = NULL;
|
||||||
|
transDumpFromBuffer(&conn->readBuf, (char**)&pHead);
|
||||||
pHead->code = htonl(pHead->code);
|
pHead->code = htonl(pHead->code);
|
||||||
pHead->msgLen = htonl(pHead->msgLen);
|
pHead->msgLen = htonl(pHead->msgLen);
|
||||||
|
|
||||||
|
@ -366,7 +369,6 @@ void cliHandleResp(SCliConn* conn) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// buf's mem alread translated to transMsg.pCont
|
// buf's mem alread translated to transMsg.pCont
|
||||||
transClearBuffer(&conn->readBuf);
|
|
||||||
if (!CONN_NO_PERSIST_BY_APP(conn)) {
|
if (!CONN_NO_PERSIST_BY_APP(conn)) {
|
||||||
transMsg.info.handle = (void*)conn->refId;
|
transMsg.info.handle = (void*)conn->refId;
|
||||||
tDebug("%s conn %p ref by app", CONN_GET_INST_LABEL(conn), conn);
|
tDebug("%s conn %p ref by app", CONN_GET_INST_LABEL(conn), conn);
|
||||||
|
@ -636,6 +638,8 @@ static SCliConn* cliCreateConn(SCliThrd* pThrd) {
|
||||||
transReqQueueInit(&conn->wreqQueue);
|
transReqQueueInit(&conn->wreqQueue);
|
||||||
|
|
||||||
transQueueInit(&conn->cliMsgs, NULL);
|
transQueueInit(&conn->cliMsgs, NULL);
|
||||||
|
|
||||||
|
transInitBuffer(&conn->readBuf);
|
||||||
QUEUE_INIT(&conn->q);
|
QUEUE_INIT(&conn->q);
|
||||||
conn->hostThrd = pThrd;
|
conn->hostThrd = pThrd;
|
||||||
conn->status = ConnNormal;
|
conn->status = ConnNormal;
|
||||||
|
@ -651,8 +655,9 @@ static void cliDestroyConn(SCliConn* conn, bool clear) {
|
||||||
QUEUE_REMOVE(&conn->q);
|
QUEUE_REMOVE(&conn->q);
|
||||||
QUEUE_INIT(&conn->q);
|
QUEUE_INIT(&conn->q);
|
||||||
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
||||||
conn->refId = -1;
|
transDestroyBuffer(&conn->readBuf);
|
||||||
|
|
||||||
|
conn->refId = -1;
|
||||||
if (conn->task != NULL) transDQCancel(((SCliThrd*)conn->hostThrd)->timeoutQueue, conn->task);
|
if (conn->task != NULL) transDQCancel(((SCliThrd*)conn->hostThrd)->timeoutQueue, conn->task);
|
||||||
|
|
||||||
if (clear) {
|
if (clear) {
|
||||||
|
@ -678,7 +683,6 @@ static void cliDestroy(uv_handle_t* handle) {
|
||||||
tTrace("%s conn %p destroy successfully", CONN_GET_INST_LABEL(conn), conn);
|
tTrace("%s conn %p destroy successfully", CONN_GET_INST_LABEL(conn), conn);
|
||||||
transReqQueueClear(&conn->wreqQueue);
|
transReqQueueClear(&conn->wreqQueue);
|
||||||
|
|
||||||
transDestroyBuffer(&conn->readBuf);
|
|
||||||
taosMemoryFree(conn);
|
taosMemoryFree(conn);
|
||||||
}
|
}
|
||||||
static bool cliHandleNoResp(SCliConn* conn) {
|
static bool cliHandleNoResp(SCliConn* conn) {
|
||||||
|
@ -960,6 +964,10 @@ static void cliAsyncCb(uv_async_t* handle) {
|
||||||
}
|
}
|
||||||
if (pThrd->stopMsg != NULL) cliHandleQuit(pThrd->stopMsg, pThrd);
|
if (pThrd->stopMsg != NULL) cliHandleQuit(pThrd->stopMsg, pThrd);
|
||||||
}
|
}
|
||||||
|
static void cliIdleCb(uv_idle_t* handle) {
|
||||||
|
SCliThrd* thrd = handle->data;
|
||||||
|
tTrace("do idle work");
|
||||||
|
}
|
||||||
|
|
||||||
static void* cliWorkThread(void* arg) {
|
static void* cliWorkThread(void* arg) {
|
||||||
SCliThrd* pThrd = (SCliThrd*)arg;
|
SCliThrd* pThrd = (SCliThrd*)arg;
|
||||||
|
@ -1022,6 +1030,11 @@ static SCliThrd* createThrdObj() {
|
||||||
uv_timer_init(pThrd->loop, &pThrd->timer);
|
uv_timer_init(pThrd->loop, &pThrd->timer);
|
||||||
pThrd->timer.data = pThrd;
|
pThrd->timer.data = pThrd;
|
||||||
|
|
||||||
|
// pThrd->idle = taosMemoryCalloc(1, sizeof(uv_idle_t));
|
||||||
|
// uv_idle_init(pThrd->loop, pThrd->idle);
|
||||||
|
// pThrd->idle->data = pThrd;
|
||||||
|
// uv_idle_start(pThrd->idle, cliIdleCb);
|
||||||
|
|
||||||
pThrd->pool = createConnPool(4);
|
pThrd->pool = createConnPool(4);
|
||||||
transDQCreate(pThrd->loop, &pThrd->delayQueue);
|
transDQCreate(pThrd->loop, &pThrd->delayQueue);
|
||||||
|
|
||||||
|
@ -1043,6 +1056,8 @@ static void destroyThrdObj(SCliThrd* pThrd) {
|
||||||
|
|
||||||
transDQDestroy(pThrd->delayQueue, destroyCmsg);
|
transDQDestroy(pThrd->delayQueue, destroyCmsg);
|
||||||
transDQDestroy(pThrd->timeoutQueue, NULL);
|
transDQDestroy(pThrd->timeoutQueue, NULL);
|
||||||
|
|
||||||
|
taosMemoryFree(pThrd->idle);
|
||||||
taosMemoryFree(pThrd->loop);
|
taosMemoryFree(pThrd->loop);
|
||||||
taosMemoryFree(pThrd);
|
taosMemoryFree(pThrd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#include "transComm.h"
|
#include "transComm.h"
|
||||||
|
|
||||||
|
#define BUFFER_CAP 4096
|
||||||
|
|
||||||
static TdThreadOnce transModuleInit = PTHREAD_ONCE_INIT;
|
static TdThreadOnce transModuleInit = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
static int32_t refMgt;
|
static int32_t refMgt;
|
||||||
|
@ -111,12 +113,58 @@ int transGetSockDebugInfo(struct sockaddr* sockname, char* dst) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
int transInitBuffer(SConnBuffer* buf) {
|
int transInitBuffer(SConnBuffer* buf) {
|
||||||
transClearBuffer(buf);
|
buf->cap = BUFFER_CAP;
|
||||||
|
buf->buf = taosMemoryCalloc(1, BUFFER_CAP);
|
||||||
|
buf->left = -1;
|
||||||
|
buf->len = 0;
|
||||||
|
buf->total = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int transDestroyBuffer(SConnBuffer* buf) {
|
||||||
|
taosMemoryFree(buf->buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int transClearBuffer(SConnBuffer* buf) {
|
int transClearBuffer(SConnBuffer* buf) {
|
||||||
memset(buf, 0, sizeof(*buf));
|
SConnBuffer* p = buf;
|
||||||
buf->total = -1;
|
if (p->cap > BUFFER_CAP) {
|
||||||
|
p->cap = BUFFER_CAP;
|
||||||
|
p->buf = taosMemoryRealloc(p->buf, BUFFER_CAP);
|
||||||
|
}
|
||||||
|
p->left = -1;
|
||||||
|
p->len = 0;
|
||||||
|
p->total = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int transDumpFromBuffer(SConnBuffer* connBuf, char** buf) {
|
||||||
|
SConnBuffer* p = connBuf;
|
||||||
|
if (p->left != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int total = connBuf->total;
|
||||||
|
*buf = taosMemoryCalloc(1, total);
|
||||||
|
memcpy(*buf, p->buf, total);
|
||||||
|
|
||||||
|
transResetBuffer(connBuf);
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
int transResetBuffer(SConnBuffer* connBuf) {
|
||||||
|
SConnBuffer* p = connBuf;
|
||||||
|
if (p->total < p->len) {
|
||||||
|
int left = p->len - p->total;
|
||||||
|
memmove(p->buf, p->buf + p->total, left);
|
||||||
|
p->left = -1;
|
||||||
|
p->total = 0;
|
||||||
|
p->len = left;
|
||||||
|
} else if (p->total == p->len) {
|
||||||
|
p->left = -1;
|
||||||
|
p->total = 0;
|
||||||
|
p->len = 0;
|
||||||
|
} else {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int transAllocBuffer(SConnBuffer* connBuf, uv_buf_t* uvBuf) {
|
int transAllocBuffer(SConnBuffer* connBuf, uv_buf_t* uvBuf) {
|
||||||
|
@ -126,54 +174,39 @@ int transAllocBuffer(SConnBuffer* connBuf, uv_buf_t* uvBuf) {
|
||||||
* |<------STransMsgHead------->|<-------------------userdata--------------->|<-----auth data----->|<----user
|
* |<------STransMsgHead------->|<-------------------userdata--------------->|<-----auth data----->|<----user
|
||||||
* info--->|
|
* info--->|
|
||||||
*/
|
*/
|
||||||
static const int CAPACITY = sizeof(STransMsgHead);
|
|
||||||
|
|
||||||
SConnBuffer* p = connBuf;
|
SConnBuffer* p = connBuf;
|
||||||
if (p->cap == 0) {
|
|
||||||
p->buf = (char*)taosMemoryCalloc(CAPACITY, sizeof(char));
|
|
||||||
tTrace("internal malloc mem:%p, size:%d", p->buf, CAPACITY);
|
|
||||||
p->len = 0;
|
|
||||||
p->cap = CAPACITY;
|
|
||||||
p->total = -1;
|
|
||||||
|
|
||||||
uvBuf->base = p->buf;
|
uvBuf->base = p->buf + p->len;
|
||||||
uvBuf->len = CAPACITY;
|
if (p->left == -1) {
|
||||||
} else if (p->total == -1 && p->len < CAPACITY) {
|
|
||||||
uvBuf->base = p->buf + p->len;
|
|
||||||
uvBuf->len = CAPACITY - p->len;
|
|
||||||
} else {
|
|
||||||
p->cap = p->total;
|
|
||||||
p->buf = taosMemoryRealloc(p->buf, p->cap);
|
|
||||||
tTrace("internal realloc mem:%p, size:%d", p->buf, p->cap);
|
|
||||||
|
|
||||||
uvBuf->base = p->buf + p->len;
|
|
||||||
uvBuf->len = p->cap - p->len;
|
uvBuf->len = p->cap - p->len;
|
||||||
|
} else {
|
||||||
|
if (p->left < p->cap - p->len) {
|
||||||
|
uvBuf->len = p->left;
|
||||||
|
} else {
|
||||||
|
p->buf = taosMemoryRealloc(p->buf, p->left + p->len);
|
||||||
|
uvBuf->base = p->buf + p->len;
|
||||||
|
uvBuf->len = p->left;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// check whether already read complete
|
// check whether already read complete
|
||||||
bool transReadComplete(SConnBuffer* connBuf) {
|
bool transReadComplete(SConnBuffer* connBuf) {
|
||||||
if (connBuf->total == -1 && connBuf->len >= sizeof(STransMsgHead)) {
|
SConnBuffer* p = connBuf;
|
||||||
STransMsgHead head;
|
if (p->len >= sizeof(STransMsgHead)) {
|
||||||
memcpy((char*)&head, connBuf->buf, sizeof(head));
|
if (p->left == -1) {
|
||||||
int32_t msgLen = (int32_t)htonl(head.msgLen);
|
STransMsgHead head;
|
||||||
connBuf->total = msgLen;
|
memcpy((char*)&head, connBuf->buf, sizeof(head));
|
||||||
|
int32_t msgLen = (int32_t)htonl(head.msgLen);
|
||||||
|
p->total = msgLen;
|
||||||
|
}
|
||||||
|
if (p->total >= p->len) {
|
||||||
|
p->left = p->total - p->len;
|
||||||
|
} else {
|
||||||
|
p->left = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (connBuf->len == connBuf->cap && connBuf->total == connBuf->cap) {
|
return p->left == 0 ? true : false;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int transPackMsg(STransMsgHead* msgHead, bool sercured, bool auth) { return 0; }
|
|
||||||
|
|
||||||
int transUnpackMsg(STransMsgHead* msgHead) { return 0; }
|
|
||||||
int transDestroyBuffer(SConnBuffer* buf) {
|
|
||||||
if (buf->cap > 0) {
|
|
||||||
taosMemoryFreeClear(buf->buf);
|
|
||||||
}
|
|
||||||
transClearBuffer(buf);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int transSetConnOption(uv_tcp_t* stream) {
|
int transSetConnOption(uv_tcp_t* stream) {
|
||||||
|
|
|
@ -212,9 +212,10 @@ static void uvHandleActivityTimeout(uv_timer_t* handle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uvHandleReq(SSvrConn* pConn) {
|
static void uvHandleReq(SSvrConn* pConn) {
|
||||||
SConnBuffer* pBuf = &pConn->readBuf;
|
STransMsgHead* msg = NULL;
|
||||||
char* msg = pBuf->buf;
|
int msgLen = 0;
|
||||||
uint32_t msgLen = pBuf->len;
|
|
||||||
|
msgLen = transDumpFromBuffer(&pConn->readBuf, (char**)&msg);
|
||||||
|
|
||||||
STransMsgHead* pHead = (STransMsgHead*)msg;
|
STransMsgHead* pHead = (STransMsgHead*)msg;
|
||||||
pHead->code = htonl(pHead->code);
|
pHead->code = htonl(pHead->code);
|
||||||
|
@ -237,7 +238,7 @@ static void uvHandleReq(SSvrConn* pConn) {
|
||||||
transMsg.msgType = pHead->msgType;
|
transMsg.msgType = pHead->msgType;
|
||||||
transMsg.code = pHead->code;
|
transMsg.code = pHead->code;
|
||||||
|
|
||||||
transClearBuffer(&pConn->readBuf);
|
// transClearBuffer(&pConn->readBuf);
|
||||||
|
|
||||||
pConn->inType = pHead->msgType;
|
pConn->inType = pHead->msgType;
|
||||||
if (pConn->status == ConnNormal) {
|
if (pConn->status == ConnNormal) {
|
||||||
|
@ -761,6 +762,7 @@ static SSvrConn* createConn(void* hThrd) {
|
||||||
memset(&pConn->regArg, 0, sizeof(pConn->regArg));
|
memset(&pConn->regArg, 0, sizeof(pConn->regArg));
|
||||||
pConn->broken = false;
|
pConn->broken = false;
|
||||||
pConn->status = ConnNormal;
|
pConn->status = ConnNormal;
|
||||||
|
transInitBuffer(&pConn->readBuf);
|
||||||
|
|
||||||
SExHandle* exh = taosMemoryMalloc(sizeof(SExHandle));
|
SExHandle* exh = taosMemoryMalloc(sizeof(SExHandle));
|
||||||
exh->handle = pConn;
|
exh->handle = pConn;
|
||||||
|
|
|
@ -83,7 +83,16 @@ SWal *walOpen(const char *path, SWalCfg *pCfg) {
|
||||||
|
|
||||||
// set config
|
// set config
|
||||||
memcpy(&pWal->cfg, pCfg, sizeof(SWalCfg));
|
memcpy(&pWal->cfg, pCfg, sizeof(SWalCfg));
|
||||||
|
|
||||||
pWal->fsyncSeq = pCfg->fsyncPeriod / 1000;
|
pWal->fsyncSeq = pCfg->fsyncPeriod / 1000;
|
||||||
|
if (pWal->cfg.retentionSize > 0) {
|
||||||
|
pWal->cfg.retentionSize *= 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pWal->cfg.segSize > 0) {
|
||||||
|
pWal->cfg.segSize *= 1024;
|
||||||
|
}
|
||||||
|
|
||||||
if (pWal->fsyncSeq <= 0) pWal->fsyncSeq = 1;
|
if (pWal->fsyncSeq <= 0) pWal->fsyncSeq = 1;
|
||||||
|
|
||||||
tstrncpy(pWal->path, path, sizeof(pWal->path));
|
tstrncpy(pWal->path, path, sizeof(pWal->path));
|
||||||
|
|
|
@ -401,6 +401,7 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
|
||||||
pWal->writeHead.head.version = index;
|
pWal->writeHead.head.version = index;
|
||||||
pWal->writeHead.head.bodyLen = bodyLen;
|
pWal->writeHead.head.bodyLen = bodyLen;
|
||||||
pWal->writeHead.head.msgType = msgType;
|
pWal->writeHead.head.msgType = msgType;
|
||||||
|
pWal->writeHead.head.ingestTs = taosGetTimestampMs();
|
||||||
|
|
||||||
// sync info for sync module
|
// sync info for sync module
|
||||||
pWal->writeHead.head.syncMeta = syncMeta;
|
pWal->writeHead.head.syncMeta = syncMeta;
|
||||||
|
@ -457,14 +458,14 @@ int64_t walAppendLog(SWal *pWal, tmsg_t msgType, SWalSyncInfo syncMeta, const vo
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pWal->pIdxFile == NULL || pWal->pIdxFile == NULL || pWal->writeCur < 0) {
|
if (pWal->pLogFile == NULL || pWal->pIdxFile == NULL || pWal->writeCur < 0) {
|
||||||
if (walInitWriteFile(pWal) < 0) {
|
if (walInitWriteFile(pWal) < 0) {
|
||||||
taosThreadMutexUnlock(&pWal->mutex);
|
taosThreadMutexUnlock(&pWal->mutex);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(pWal->pIdxFile != NULL && pWal->pLogFile != NULL && pWal->writeCur >= 0);
|
ASSERT(pWal->pLogFile != NULL && pWal->pIdxFile != NULL && pWal->writeCur >= 0);
|
||||||
|
|
||||||
if (walWriteImpl(pWal, index, msgType, syncMeta, body, bodyLen) < 0) {
|
if (walWriteImpl(pWal, index, msgType, syncMeta, body, bodyLen) < 0) {
|
||||||
taosThreadMutexUnlock(&pWal->mutex);
|
taosThreadMutexUnlock(&pWal->mutex);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue