Merge branch 'develop' into feature/TD-4666
This commit is contained in:
commit
5a19bd96a0
|
@ -7,8 +7,9 @@ set -e
|
||||||
cpuType=amd64 # [armv6l | arm64 | amd64 | 386]
|
cpuType=amd64 # [armv6l | arm64 | amd64 | 386]
|
||||||
osType=linux # [linux | darwin | windows]
|
osType=linux # [linux | darwin | windows]
|
||||||
version=""
|
version=""
|
||||||
|
verType=stable # [stable, beta]
|
||||||
declare -A archMap=(["armv6l"]="arm" ["arm64"]="arm64" ["amd64"]="x64" ["386"]="x86")
|
declare -A archMap=(["armv6l"]="arm" ["arm64"]="arm64" ["amd64"]="x64" ["386"]="x86")
|
||||||
while getopts "h:c:o:n:" arg
|
while getopts "h:c:o:n:V:" arg
|
||||||
do
|
do
|
||||||
case $arg in
|
case $arg in
|
||||||
c)
|
c)
|
||||||
|
@ -23,6 +24,10 @@ do
|
||||||
#echo "version=$OPTARG"
|
#echo "version=$OPTARG"
|
||||||
version=$(echo $OPTARG)
|
version=$(echo $OPTARG)
|
||||||
;;
|
;;
|
||||||
|
V)
|
||||||
|
#echo "verType=$OPTARG"
|
||||||
|
verType=$(echo $OPTARG)
|
||||||
|
;;
|
||||||
h)
|
h)
|
||||||
echo "Usage: `basename $0` -c [armv6l | arm64 | amd64 | 386] -o [linux | darwin | windows]"
|
echo "Usage: `basename $0` -c [armv6l | arm64 | amd64 | 386] -o [linux | darwin | windows]"
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -55,6 +60,22 @@ cp alert alert.cfg install_driver.sh ./TDengine-alert/.
|
||||||
cp ../../../debug/build/lib/libtaos.so.${version} ./TDengine-alert/driver/.
|
cp ../../../debug/build/lib/libtaos.so.${version} ./TDengine-alert/driver/.
|
||||||
chmod 777 ./TDengine-alert/install_driver.sh
|
chmod 777 ./TDengine-alert/install_driver.sh
|
||||||
|
|
||||||
tar -I 'gzip -9' -cf ${startdir}/TDengine-alert-${version}-${osType^}-${archMap[${cpuType}]}.tar.gz TDengine-alert/
|
tar -I 'gzip -9' -cf ${scriptdir}/TDengine-alert-${version}-${osType^}-${archMap[${cpuType}]}.tar.gz TDengine-alert/
|
||||||
rm -rf ./TDengine-alert
|
rm -rf ./TDengine-alert
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# mv package to comminuty/release/
|
||||||
|
pkg_name=TDengine-alert-${version}-${osType^}-${archMap[${cpuType}]}
|
||||||
|
|
||||||
|
if [ "$verType" == "beta" ]; then
|
||||||
|
pkg_name=TDengine-alert-${version}-${verType}-${osType^}-${archMap[${cpuType}]}
|
||||||
|
elif [ "$verType" == "stable" ]; then
|
||||||
|
pkg_name=${pkg_name}
|
||||||
|
else
|
||||||
|
echo "unknow verType, nor stabel or beta"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd ${scriptdir}/../release/
|
||||||
|
mv ${scriptdir}/TDengine-alert-${version}-${osType^}-${archMap[${cpuType}]}.tar.gz ${pkg_name}.tar.gz
|
||||||
|
|
|
@ -4,7 +4,7 @@ PROJECT(TDengine)
|
||||||
IF (DEFINED VERNUMBER)
|
IF (DEFINED VERNUMBER)
|
||||||
SET(TD_VER_NUMBER ${VERNUMBER})
|
SET(TD_VER_NUMBER ${VERNUMBER})
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(TD_VER_NUMBER "2.1.3.0")
|
SET(TD_VER_NUMBER "2.1.4.1")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (DEFINED VERCOMPATIBLE)
|
IF (DEFINED VERCOMPATIBLE)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## <a class="anchor" id="install"></a>快捷安装
|
## <a class="anchor" id="install"></a>快捷安装
|
||||||
|
|
||||||
TDengine软件分为服务器、客户端和报警模块三部分,目前2.0版服务器仅能在Linux系统上安装和运行,后续会支持Windows、mac OS等系统。客户端可以在Windows或Linux上安装和运行。任何OS的应用也可以选择RESTful接口连接服务器taosd。CPU支持X64/ARM64/MIPS64/Alpha64,后续会支持ARM32、RISC-V等CPU架构。用户可根据需求选择通过[源码](https://www.taosdata.com/cn/getting-started/#通过源码安装)或者[安装包](https://www.taosdata.com/cn/getting-started/#通过安装包安装)来安装。
|
TDengine 软件分为服务器、客户端和报警模块三部分,目前 2.0 版服务器仅能在 Linux 系统上安装和运行,后续会支持 Windows、Mac OS 等系统。客户端可以在 Windows 或 Linux 上安装和运行。任何 OS 的应用也可以选择 RESTful 接口连接服务器 taosd。CPU 支持 X64/ARM64/MIPS64/Alpha64,后续会支持 ARM32、RISC-V 等 CPU 架构。用户可根据需求选择通过 [源码](https://www.taosdata.com/cn/getting-started/#通过源码安装) 或者 [安装包](https://www.taosdata.com/cn/getting-started/#通过安装包安装) 来安装。
|
||||||
|
|
||||||
### <a class="anchor" id="source-install"></a>通过源码安装
|
### <a class="anchor" id="source-install"></a>通过源码安装
|
||||||
|
|
||||||
|
@ -77,10 +77,10 @@ insert into t values ('2019-07-15 00:00:00', 10);
|
||||||
insert into t values ('2019-07-15 01:00:00', 20);
|
insert into t values ('2019-07-15 01:00:00', 20);
|
||||||
select * from t;
|
select * from t;
|
||||||
ts | speed |
|
ts | speed |
|
||||||
===================================
|
========================================
|
||||||
19-07-15 00:00:00.000| 10|
|
2019-07-15 00:00:00.000 | 10 |
|
||||||
19-07-15 01:00:00.000| 20|
|
2019-07-15 01:00:00.000 | 20 |
|
||||||
Query OK, 2 row(s) in set (0.001700s)
|
Query OK, 2 row(s) in set (0.003128s)
|
||||||
```
|
```
|
||||||
|
|
||||||
除执行 SQL 语句外,系统管理员还可以从 TDengine 终端检查系统运行状态,添加删除用户账号等。
|
除执行 SQL 语句外,系统管理员还可以从 TDengine 终端检查系统运行状态,添加删除用户账号等。
|
||||||
|
@ -90,7 +90,7 @@ Query OK, 2 row(s) in set (0.001700s)
|
||||||
您可通过配置命令行参数来改变 TDengine 终端的行为。以下为常用的几个命令行参数:
|
您可通过配置命令行参数来改变 TDengine 终端的行为。以下为常用的几个命令行参数:
|
||||||
|
|
||||||
- -c, --config-dir: 指定配置文件目录,默认为 _/etc/taos_
|
- -c, --config-dir: 指定配置文件目录,默认为 _/etc/taos_
|
||||||
- -h, --host: 指定服务的IP地址,默认为本地服务
|
- -h, --host: 指定服务的 FQDN 地址(也可以使用 IP),默认为连接本地服务
|
||||||
- -s, --commands: 在不进入终端的情况下运行 TDengine 命令
|
- -s, --commands: 在不进入终端的情况下运行 TDengine 命令
|
||||||
- -u, --user: 连接 TDengine 服务器的用户名,缺省为 root
|
- -u, --user: 连接 TDengine 服务器的用户名,缺省为 root
|
||||||
- -p, --password: 连接TDengine服务器的密码,缺省为 taosdata
|
- -p, --password: 连接TDengine服务器的密码,缺省为 taosdata
|
||||||
|
@ -113,7 +113,7 @@ taos> source <filename>;
|
||||||
### Shell 小技巧
|
### Shell 小技巧
|
||||||
|
|
||||||
- 可以使用上下光标键查看历史输入的指令
|
- 可以使用上下光标键查看历史输入的指令
|
||||||
- 修改用户密码。在 shell 中使用 alter user 指令
|
- 修改用户密码,在 shell 中使用 alter user 指令
|
||||||
- ctrl+c 中止正在进行中的查询
|
- ctrl+c 中止正在进行中的查询
|
||||||
- 执行 `RESET QUERY CACHE` 清空本地缓存的表 schema
|
- 执行 `RESET QUERY CACHE` 清空本地缓存的表 schema
|
||||||
|
|
||||||
|
@ -126,9 +126,9 @@ taos> source <filename>;
|
||||||
$ taosdemo
|
$ taosdemo
|
||||||
```
|
```
|
||||||
|
|
||||||
该命令将在数据库test下面自动创建一张超级表meters,该超级表下有1万张表,表名为"t0" 到"t9999",每张表有10万条记录,每条记录有 (f1, f2, f3)三个字段,时间戳从"2017-07-14 10:40:00 000" 到"2017-07-14 10:41:39 999",每张表带有标签areaid和loc, areaid被设置为1到10, loc被设置为"beijing"或者“shanghai"。
|
该命令将在数据库 test 下面自动创建一张超级表 meters,该超级表下有 1 万张表,表名为 "t0" 到 "t9999",每张表有 1 万条记录,每条记录有 (ts, current, voltage, phase) 四个字段,时间戳从 "2017-07-14 10:40:00 000" 到 "2017-07-14 10:40:09 999",每张表带有标签 location 和 groupdId,groupdId 被设置为 1 到 10, location 被设置为 "beijing" 或者 "shanghai"。
|
||||||
|
|
||||||
执行这条命令大概需要10分钟,最后共插入10亿条记录。
|
执行这条命令大概需要几分钟,最后共插入 1 亿条记录。
|
||||||
|
|
||||||
在 TDengine 客户端输入查询命令,体验查询速度。
|
在 TDengine 客户端输入查询命令,体验查询速度。
|
||||||
|
|
||||||
|
@ -138,28 +138,28 @@ $ taosdemo
|
||||||
taos> select count(*) from test.meters;
|
taos> select count(*) from test.meters;
|
||||||
```
|
```
|
||||||
|
|
||||||
- 查询10亿条记录的平均值、最大值、最小值等:
|
- 查询 1 亿条记录的平均值、最大值、最小值等:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
taos> select avg(f1), max(f2), min(f3) from test.meters;
|
taos> select avg(current), max(voltage), min(phase) from test.meters;
|
||||||
```
|
```
|
||||||
|
|
||||||
- 查询loc="beijing"的记录总条数:
|
- 查询 location="beijing" 的记录总条数:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
taos> select count(*) from test.meters where loc="beijing";
|
taos> select count(*) from test.meters where location="beijing";
|
||||||
```
|
```
|
||||||
|
|
||||||
- 查询areaid=10的所有记录的平均值、最大值、最小值等:
|
- 查询 groupdId=10 的所有记录的平均值、最大值、最小值等:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
taos> select avg(f1), max(f2), min(f3) from test.meters where areaid=10;
|
taos> select avg(current), max(voltage), min(phase) from test.meters where groupdId=10;
|
||||||
```
|
```
|
||||||
|
|
||||||
- 对表 t10 按 10s 进行平均值、最大值和最小值聚合统计:
|
- 对表 t10 按 10s 进行平均值、最大值和最小值聚合统计:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
taos> select avg(f1), max(f2), min(f3) from test.t10 interval(10s);
|
taos> select avg(current), max(voltage), min(phase) from test.t10 interval(10s);
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note:** taosdemo 命令本身带有很多选项,配置表的数目、记录条数等等,请执行 `taosdemo --help` 详细列出。您可以设置不同参数进行体验。
|
**Note:** taosdemo 命令本身带有很多选项,配置表的数目、记录条数等等,请执行 `taosdemo --help` 详细列出。您可以设置不同参数进行体验。
|
||||||
|
@ -167,15 +167,9 @@ taos> select avg(f1), max(f2), min(f3) from test.t10 interval(10s);
|
||||||
|
|
||||||
## 客户端和报警模块
|
## 客户端和报警模块
|
||||||
|
|
||||||
如果客户端和服务端运行在不同的电脑上,可以单独安装客户端。Linux和Windows安装包如下:
|
如果客户端和服务端运行在不同的电脑上,可以单独安装客户端。Linux 和 Windows 安装包可以在 [这里](https://www.taosdata.com/cn/getting-started/#客户端) 下载。
|
||||||
|
|
||||||
- TDengine-client-2.0.10.0-Linux-x64.tar.gz(3.0M)
|
报警模块的 Linux 和 Windows 安装包请在 [所有下载链接](https://www.taosdata.com/cn/all-downloads/) 页面搜索“TDengine Alert Linux”章节或“TDengine Alert Windows”章节进行下载。使用方法请参考 [报警模块的使用方法](https://github.com/taosdata/TDengine/blob/master/alert/README_cn.md)。
|
||||||
- TDengine-client-2.0.10.0-Windows-x64.exe(2.8M)
|
|
||||||
- TDengine-client-2.0.10.0-Windows-x86.exe(2.8M)
|
|
||||||
|
|
||||||
报警模块的Linux安装包如下(请参考[报警模块的使用方法](https://github.com/taosdata/TDengine/blob/master/alert/README_cn.md)):
|
|
||||||
|
|
||||||
- TDengine-alert-2.0.10.0-Linux-x64.tar.gz (8.1M)
|
|
||||||
|
|
||||||
|
|
||||||
## <a class="anchor" id="platforms"></a>支持平台列表
|
## <a class="anchor" id="platforms"></a>支持平台列表
|
||||||
|
|
|
@ -123,8 +123,8 @@ taosd -C
|
||||||
- minRows:文件块中记录的最小条数。单位为条,默认值:100。
|
- minRows:文件块中记录的最小条数。单位为条,默认值:100。
|
||||||
- maxRows:文件块中记录的最大条数。单位为条,默认值:4096。
|
- maxRows:文件块中记录的最大条数。单位为条,默认值:4096。
|
||||||
- comp:文件压缩标志位。0:关闭;1:一阶段压缩;2:两阶段压缩。默认值:2。(可通过 alter database 修改)
|
- comp:文件压缩标志位。0:关闭;1:一阶段压缩;2:两阶段压缩。默认值:2。(可通过 alter database 修改)
|
||||||
- wal:WAL级别。1:写wal,但不执行fsync;2:写wal, 而且执行fsync。默认值:1。(在 taos.cfg 中参数名需要写作 walLevel)(可通过 alter database 修改)
|
- wal:WAL级别。1:写wal,但不执行fsync;2:写wal, 而且执行fsync。默认值:1。(在 taos.cfg 中参数名需要写作 walLevel)
|
||||||
- fsync:当wal设置为2时,执行fsync的周期。设置为0,表示每次写入,立即执行fsync。单位为毫秒,默认值:3000。(可通过 alter database 修改)
|
- fsync:当wal设置为2时,执行fsync的周期。设置为0,表示每次写入,立即执行fsync。单位为毫秒,默认值:3000。
|
||||||
- cache:内存块的大小。单位为兆字节(MB),默认值:16。
|
- cache:内存块的大小。单位为兆字节(MB),默认值:16。
|
||||||
- blocks:每个VNODE(TSDB)中有多少cache大小的内存块。因此一个VNODE的用的内存大小粗略为(cache * blocks)。单位为块,默认值:4。(可通过 alter database 修改)
|
- blocks:每个VNODE(TSDB)中有多少cache大小的内存块。因此一个VNODE的用的内存大小粗略为(cache * blocks)。单位为块,默认值:4。(可通过 alter database 修改)
|
||||||
- replica:副本个数。取值范围:1-3,单位为个,默认值:1。(可通过 alter database 修改)
|
- replica:副本个数。取值范围:1-3,单位为个,默认值:1。(可通过 alter database 修改)
|
||||||
|
|
|
@ -129,16 +129,6 @@ TDengine 缺省的时间戳是毫秒精度,但通过在 CREATE DATABASE 时传
|
||||||
CACHELAST 参数控制是否在内存中缓存子表的最近数据。缺省值为 0,取值范围 [0, 1, 2, 3]。其中 0 表示不缓存,1 表示缓存子表最近一行数据,2 表示缓存子表每一列的最近的非 NULL 值,3 表示同时打开缓存最近行和列功能。(从 2.0.11.0 版本开始支持参数值 [0, 1],从 2.1.2.0 版本开始支持参数值 [0, 1, 2, 3]。)
|
CACHELAST 参数控制是否在内存中缓存子表的最近数据。缺省值为 0,取值范围 [0, 1, 2, 3]。其中 0 表示不缓存,1 表示缓存子表最近一行数据,2 表示缓存子表每一列的最近的非 NULL 值,3 表示同时打开缓存最近行和列功能。(从 2.0.11.0 版本开始支持参数值 [0, 1],从 2.1.2.0 版本开始支持参数值 [0, 1, 2, 3]。)
|
||||||
说明:缓存最近行,将显著改善 LAST_ROW 函数的性能表现;缓存每列的最近非 NULL 值,将显著改善无特殊影响(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函数的性能表现。
|
说明:缓存最近行,将显著改善 LAST_ROW 函数的性能表现;缓存每列的最近非 NULL 值,将显著改善无特殊影响(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函数的性能表现。
|
||||||
|
|
||||||
```mysql
|
|
||||||
ALTER DATABASE db_name WAL 1;
|
|
||||||
```
|
|
||||||
WAL 参数控制 WAL 日志的落盘方式。缺省值为 1,取值范围为 [1, 2]。1 表示写 WAL,但不执行 fsync;2 表示写 WAL,而且执行 fsync。
|
|
||||||
|
|
||||||
```mysql
|
|
||||||
ALTER DATABASE db_name FSYNC 3000;
|
|
||||||
```
|
|
||||||
FSYNC 参数控制执行 fsync 操作的周期。缺省值为 3000,单位是毫秒,取值范围为 [0, 180000]。如果设置为 0,表示每次写入,立即执行 fsync。该设置项主要用于调节 WAL 参数设为 2 时的系统行为。
|
|
||||||
|
|
||||||
**Tips**: 以上所有参数修改后都可以用show databases来确认是否修改成功。另外,从 2.1.3.0 版本开始,修改这些参数后无需重启服务器即可生效。
|
**Tips**: 以上所有参数修改后都可以用show databases来确认是否修改成功。另外,从 2.1.3.0 版本开始,修改这些参数后无需重启服务器即可生效。
|
||||||
|
|
||||||
- **显示系统所有数据库**
|
- **显示系统所有数据库**
|
||||||
|
@ -372,77 +362,82 @@ TDengine 缺省的时间戳是毫秒精度,但通过在 CREATE DATABASE 时传
|
||||||
|
|
||||||
## <a class="anchor" id="insert"></a>数据写入
|
## <a class="anchor" id="insert"></a>数据写入
|
||||||
|
|
||||||
- **插入一条记录**
|
### 写入语法:
|
||||||
```mysql
|
|
||||||
INSERT INTO tb_name VALUES (field_value, ...);
|
|
||||||
```
|
|
||||||
向表tb_name中插入一条记录。
|
|
||||||
|
|
||||||
- **插入一条记录,数据对应到指定的列**
|
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO tb_name (field1_name, ...) VALUES (field1_value1, ...);
|
INSERT INTO
|
||||||
|
tb_name
|
||||||
|
[USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
|
||||||
|
[(field1_name, ...)]
|
||||||
|
VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
|
||||||
|
[tb2_name
|
||||||
|
[USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
|
||||||
|
[(field1_name, ...)]
|
||||||
|
VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
|
||||||
|
...];
|
||||||
```
|
```
|
||||||
向表tb_name中插入一条记录,数据对应到指定的列。SQL语句中没有出现的列,数据库将自动填充为NULL。主键(时间戳)不能为NULL。
|
|
||||||
|
|
||||||
- **插入多条记录**
|
### 详细描述及示例:
|
||||||
|
|
||||||
|
- **插入一条或多条记录**
|
||||||
|
指定已经创建好的数据子表的表名,并通过 VALUES 关键字提供一行或多行数据,即可向数据库写入这些数据。例如,执行如下语句可以写入一行记录:
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO tb_name VALUES (field1_value1, ...) (field1_value2, ...) ...;
|
INSERT INTO d1001 VALUES (NOW, 10.2, 219, 0.32);
|
||||||
```
|
```
|
||||||
向表tb_name中插入多条记录。
|
或者,可以通过如下语句写入两行记录:
|
||||||
**注意**:在使用“插入多条记录”方式写入数据时,不能把第一列的时间戳取值都设为now,否则会导致语句中的多条记录使用相同的时间戳,于是就可能出现相互覆盖以致这些数据行无法全部被正确保存。
|
|
||||||
|
|
||||||
- **按指定的列插入多条记录**
|
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO tb_name (field1_name, ...) VALUES (field1_value1, ...) (field1_value2, ...) ...;
|
INSERT INTO d1001 VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32) (1626164208000, 10.15, 217, 0.33);
|
||||||
```
|
```
|
||||||
向表tb_name中按指定的列插入多条记录。
|
**注意:**
|
||||||
|
1)在第二个例子中,两行记录的首列时间戳使用了不同格式的写法。其中字符串格式的时间戳写法不受所在 DATABASE 的时间精度设置影响;而长整形格式的时间戳写法会受到所在 DATABASE 的时间精度设置影响——例子中的时间戳在毫秒精度下可以写作 1626164208000,而如果是在微秒精度设置下就需要写为 1626164208000000。
|
||||||
|
2)在使用“插入多条记录”方式写入数据时,不能把第一列的时间戳取值都设为 NOW,否则会导致语句中的多条记录使用相同的时间戳,于是就可能出现相互覆盖以致这些数据行无法全部被正确保存。其原因在于,NOW 函数在执行中会被解析为所在 SQL 语句的实际执行时间,出现在同一语句中的多个 NOW 标记也就会被替换为完全相同的时间戳取值。
|
||||||
|
3)允许插入的最老记录的时间戳,是相对于当前服务器时间,减去配置的 keep 值(数据保留的天数);允许插入的最新记录的时间戳,是相对于当前服务器时间,加上配置的 days 值(数据文件存储数据的时间跨度,单位为天)。keep 和 days 都是可以在创建数据库时指定的,缺省值分别是 3650 天和 10 天。
|
||||||
|
|
||||||
- **向多个表插入多条记录**
|
- **插入记录,数据对应到指定的列**
|
||||||
|
向数据子表中插入记录时,无论插入一行还是多行,都可以让数据对应到指定的列。对于 SQL 语句中没有出现的列,数据库将自动填充为 NULL。主键(时间戳)不能为 NULL。例如:
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO tb1_name VALUES (field1_value1, ...) (field1_value2, ...) ...
|
INSERT INTO d1001 (ts, current, phase) VALUES ('2021-07-13 14:06:33.196', 10.27, 0.31);
|
||||||
tb2_name VALUES (field1_value1, ...) (field1_value2, ...) ...;
|
|
||||||
```
|
```
|
||||||
同时向表tb1_name和tb2_name中分别插入多条记录。
|
**说明:**如果不指定列,也即使用全列模式——那么在 VALUES 部分提供的数据,必须为数据表的每个列都显式地提供数据。全列模式写入速度会远快于指定列,因此建议尽可能采用全列写入方式,此时空列可以填入 NULL。
|
||||||
|
|
||||||
- **同时向多个表按列插入多条记录**
|
- **向多个表插入记录**
|
||||||
|
可以在一条语句中,分别向多个表插入一条或多条记录,并且也可以在插入过程中指定列。例如:
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO tb1_name (tb1_field1_name, ...) VALUES (field1_value1, ...) (field1_value2, ...) ...
|
INSERT INTO d1001 VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
|
||||||
tb2_name (tb2_field1_name, ...) VALUES (field1_value1, ...) (field1_value2, ...) ...;
|
d1002 (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);
|
||||||
```
|
```
|
||||||
同时向表tb1_name和tb2_name中按列分别插入多条记录。
|
|
||||||
|
|
||||||
注意:
|
|
||||||
1) 如果时间戳为now,系统将自动使用客户端当前时间作为该记录的时间戳;
|
|
||||||
2) 允许插入的最老记录的时间戳,是相对于当前服务器时间,减去配置的keep值(数据保留的天数),允许插入的最新记录的时间戳,是相对于当前服务器时间,加上配置的days值(数据文件存储数据的时间跨度,单位为天)。keep和days都是可以在创建数据库时指定的,缺省值分别是3650天和10天。
|
|
||||||
|
|
||||||
- <a class="anchor" id="auto_create_table"></a>**插入记录时自动建表**
|
- <a class="anchor" id="auto_create_table"></a>**插入记录时自动建表**
|
||||||
|
如果用户在写数据时并不确定某个表是否存在,此时可以在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。自动建表时,要求必须以超级表为模板,并写明数据表的 TAGS 取值。例如:
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO tb_name USING stb_name TAGS (tag_value1, ...) VALUES (field_value1, ...);
|
INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32);
|
||||||
```
|
```
|
||||||
如果用户在写数据时并不确定某个表是否存在,此时可以在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。自动建表时,要求必须以超级表为模板,并写明数据表的 TAGS 取值。
|
也可以在自动建表时,只是指定部分 TAGS 列的取值,未被指定的 TAGS 列将置为 NULL。例如:
|
||||||
|
```mysql
|
||||||
|
INSERT INTO d21001 USING meters (groupdId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33);
|
||||||
|
```
|
||||||
|
自动建表语法也支持在一条语句中向多个表插入记录。例如:
|
||||||
|
```mysql
|
||||||
|
INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
|
||||||
|
d21002 USING meters (groupdId) TAGS (2) VALUES ('2021-07-13 14:06:34.255', 10.15, 217, 0.33)
|
||||||
|
d21003 USING meters (groupdId) TAGS (2) (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);
|
||||||
|
```
|
||||||
|
**说明:**在 2.0.20.5 版本之前,在使用自动建表语法并指定列时,子表的列名必须紧跟在子表名称后面,而不能如例子里那样放在 TAGS 和 VALUES 之间。从 2.0.20.5 版本开始,两种写法都可以,但不能在一条 SQL 语句中混用,否则会报语法错误。
|
||||||
|
|
||||||
- **插入记录时自动建表,并指定具体的 TAGS 列**
|
- **插入来自文件的数据记录**
|
||||||
```mysql
|
除了使用 VALUES 关键字插入一行或多行数据外,也可以把要写入的数据放在 CSV 文件中(英文逗号分隔、英文单引号括住每个值)供 SQL 指令读取。其中 CSV 文件无需表头。例如,如果 /tmp/csvfile.csv 文件的内容为:
|
||||||
INSERT INTO tb_name USING stb_name (tag_name1, ...) TAGS (tag_value1, ...) VALUES (field_value1, ...);
|
|
||||||
```
|
```
|
||||||
在自动建表时,可以只是指定部分 TAGS 列的取值,未被指定的 TAGS 列将取为空值。
|
'2021-07-13 14:07:34.630', '10.2', '219', '0.32'
|
||||||
|
'2021-07-13 14:07:35.779', '10.15', '217', '0.33'
|
||||||
- **同时向多个表按列插入多条记录,自动建表**
|
|
||||||
```mysql
|
|
||||||
INSERT INTO tb1_name (tb1_field1_name, ...) [USING stb1_name TAGS (tag_value1, ...)] VALUES (field1_value1, ...) (field1_value2, ...) ...
|
|
||||||
tb2_name (tb2_field1_name, ...) [USING stb2_name TAGS (tag_value2, ...)] VALUES (field1_value1, ...) (field1_value2, ...) ...;
|
|
||||||
```
|
```
|
||||||
以自动建表的方式,同时向表tb1_name和tb2_name中按列分别插入多条记录。
|
那么通过如下指令可以把这个文件中的数据写入子表中:
|
||||||
说明:`(tb1_field1_name, ...)`的部分可以省略掉,这样就是使用全列模式写入——也即在 VALUES 部分提供的数据,必须为数据表的每个列都显式地提供数据。全列写入速度会远快于指定列,因此建议尽可能采用全列写入方式,此时空列可以填入NULL。
|
|
||||||
从 2.0.20.5 版本开始,子表的列名可以不跟在子表名称后面,而是可以放在 TAGS 和 VALUES 之间,例如像下面这样写:
|
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO tb1_name [USING stb1_name TAGS (tag_value1, ...)] (tb1_field1_name, ...) VALUES (field1_value1, ...) (field1_value2, ...) ...;
|
INSERT INTO d1001 FILE '/tmp/csvfile.csv';
|
||||||
```
|
```
|
||||||
注意:虽然两种写法都可以,但并不能在一条 SQL 语句中混用,否则会报语法错误。
|
|
||||||
|
|
||||||
**历史记录写入**:可使用IMPORT或者INSERT命令,IMPORT的语法,功能与INSERT完全一样。
|
**历史记录写入**:可使用IMPORT或者INSERT命令,IMPORT的语法,功能与INSERT完全一样。
|
||||||
|
|
||||||
说明:针对 insert 类型的 SQL 语句,我们采用的流式解析策略,在发现后面的错误之前,前面正确的部分SQL仍会执行。下面的sql中,insert语句是无效的,但是d1001仍会被创建。
|
**说明:**针对 insert 类型的 SQL 语句,我们采用的流式解析策略,在发现后面的错误之前,前面正确的部分 SQL 仍会执行。下面的 SQL 中,INSERT 语句是无效的,但是 d1001 仍会被创建。
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
taos> CREATE TABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS(location BINARY(30), groupId INT);
|
taos> CREATE TABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS(location BINARY(30), groupId INT);
|
||||||
|
@ -1342,6 +1337,7 @@ SELECT function_list FROM stb_name
|
||||||
- 在聚合查询中,function_list 位置允许使用聚合和选择函数,并要求每个函数仅输出单个结果(例如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用具有多行输出结果的函数(例如:TOP、BOTTOM、DIFF 以及四则运算)。
|
- 在聚合查询中,function_list 位置允许使用聚合和选择函数,并要求每个函数仅输出单个结果(例如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用具有多行输出结果的函数(例如:TOP、BOTTOM、DIFF 以及四则运算)。
|
||||||
- 查询过滤、聚合等操作按照每个切分窗口为独立的单位执行。聚合查询目前支持三种窗口的划分方式:
|
- 查询过滤、聚合等操作按照每个切分窗口为独立的单位执行。聚合查询目前支持三种窗口的划分方式:
|
||||||
1. 时间窗口:聚合时间段的窗口宽度由关键词 INTERVAL 指定,最短时间间隔 10 毫秒(10a);并且支持偏移 offset(偏移必须小于间隔),也即时间窗口划分与“UTC 时刻 0”相比的偏移量。SLIDING 语句用于指定聚合时间段的前向增量,也即每次窗口向前滑动的时长。当 SLIDING 与 INTERVAL 取值相等的时候,滑动窗口即为翻转窗口。
|
1. 时间窗口:聚合时间段的窗口宽度由关键词 INTERVAL 指定,最短时间间隔 10 毫秒(10a);并且支持偏移 offset(偏移必须小于间隔),也即时间窗口划分与“UTC 时刻 0”相比的偏移量。SLIDING 语句用于指定聚合时间段的前向增量,也即每次窗口向前滑动的时长。当 SLIDING 与 INTERVAL 取值相等的时候,滑动窗口即为翻转窗口。
|
||||||
|
* 从 2.1.5.0 版本开始,INTERVAL 语句允许的最短时间间隔调整为 1 微秒(1u),当然如果所查询的 DATABASE 的时间精度设置为毫秒级,那么允许的最短时间间隔为 1 毫秒(1a)。
|
||||||
2. 状态窗口:使用整数(布尔值)或字符串来标识产生记录时设备的状态量,产生的记录如果具有相同的状态量取值则归属于同一个状态窗口,数值改变后该窗口关闭。状态量所对应的列作为 STATE_WINDOW 语句的参数来指定。
|
2. 状态窗口:使用整数(布尔值)或字符串来标识产生记录时设备的状态量,产生的记录如果具有相同的状态量取值则归属于同一个状态窗口,数值改变后该窗口关闭。状态量所对应的列作为 STATE_WINDOW 语句的参数来指定。
|
||||||
3. 会话窗口:时间戳所在的列由 SESSION 语句的 ts_col 参数指定,会话窗口根据相邻两条记录的时间戳差值来确定是否属于同一个会话——如果时间戳差异在 tol_val 以内,则认为记录仍属于同一个窗口;如果时间变化超过 tol_val,则自动开启下一个窗口。
|
3. 会话窗口:时间戳所在的列由 SESSION 语句的 ts_col 参数指定,会话窗口根据相邻两条记录的时间戳差值来确定是否属于同一个会话——如果时间戳差异在 tol_val 以内,则认为记录仍属于同一个窗口;如果时间变化超过 tol_val,则自动开启下一个窗口。
|
||||||
- WHERE 语句可以指定查询的起止时间和其他过滤条件。
|
- WHERE 语句可以指定查询的起止时间和其他过滤条件。
|
||||||
|
|
|
@ -149,6 +149,8 @@ keepColumnName 1
|
||||||
|
|
||||||
# system time zone
|
# system time zone
|
||||||
# timezone Asia/Shanghai (CST, +0800)
|
# timezone Asia/Shanghai (CST, +0800)
|
||||||
|
# system time zone (for windows 10)
|
||||||
|
# timezone UTC-8
|
||||||
|
|
||||||
# system locale
|
# system locale
|
||||||
# locale en_US.UTF-8
|
# locale en_US.UTF-8
|
||||||
|
|
|
@ -123,7 +123,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$verType" == "beta" ]; then
|
if [ "$verType" == "beta" ]; then
|
||||||
debname=${debname}-${verType}".deb"
|
debname="TDengine-server-"${tdengine_ver}-${verType}-${osType}-${cpuType}".deb"
|
||||||
elif [ "$verType" == "stable" ]; then
|
elif [ "$verType" == "stable" ]; then
|
||||||
debname=${debname}".deb"
|
debname=${debname}".deb"
|
||||||
else
|
else
|
||||||
|
@ -131,6 +131,8 @@ else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# make deb package
|
# make deb package
|
||||||
dpkg -b ${pkg_dir} $debname
|
dpkg -b ${pkg_dir} $debname
|
||||||
echo "make deb package success!"
|
echo "make deb package success!"
|
||||||
|
|
|
@ -5,22 +5,28 @@ set -e
|
||||||
# dockerbuild.sh
|
# dockerbuild.sh
|
||||||
# -n [version number]
|
# -n [version number]
|
||||||
# -p [xxxx]
|
# -p [xxxx]
|
||||||
|
# -V [stable | beta]
|
||||||
|
|
||||||
# set parameters by default value
|
# set parameters by default value
|
||||||
verNumber=""
|
version=""
|
||||||
passWord=""
|
passWord=""
|
||||||
|
verType=""
|
||||||
|
|
||||||
while getopts "hn:p:" arg
|
while getopts "hn:p:V:" arg
|
||||||
do
|
do
|
||||||
case $arg in
|
case $arg in
|
||||||
n)
|
n)
|
||||||
#echo "verNumber=$OPTARG"
|
#echo "version=$OPTARG"
|
||||||
verNumber=$(echo $OPTARG)
|
version=$(echo $OPTARG)
|
||||||
;;
|
;;
|
||||||
p)
|
p)
|
||||||
#echo "passWord=$OPTARG"
|
#echo "passWord=$OPTARG"
|
||||||
passWord=$(echo $OPTARG)
|
passWord=$(echo $OPTARG)
|
||||||
;;
|
;;
|
||||||
|
V)
|
||||||
|
#echo "verType=$OPTARG"
|
||||||
|
verType=$(echo $OPTARG)
|
||||||
|
;;
|
||||||
h)
|
h)
|
||||||
echo "Usage: `basename $0` -n [version number] "
|
echo "Usage: `basename $0` -n [version number] "
|
||||||
echo " -p [password for docker hub] "
|
echo " -p [password for docker hub] "
|
||||||
|
@ -33,13 +39,34 @@ do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "verNumber=${verNumber}"
|
echo "version=${version}"
|
||||||
|
|
||||||
#docker manifest create -a tdengine/tdengine:${verNumber} tdengine/tdengine-amd64:${verNumber} tdengine/tdengine-aarch64:${verNumber} tdengine/tdengine-aarch32:${verNumber}
|
|
||||||
docker manifest create -a tdengine/tdengine:latest tdengine/tdengine-amd64:latest tdengine/tdengine-aarch64:latest tdengine/tdengine-aarch32:latest
|
|
||||||
|
|
||||||
|
#docker manifest rm tdengine/tdengine
|
||||||
|
#docker manifest rm tdengine/tdengine:${version}
|
||||||
|
if [ "$verType" == "beta" ]; then
|
||||||
|
docker manifest create -a tdengine/tdengine-beta:${version} tdengine/tdengine-amd64-beta:${version} tdengine/tdengine-aarch64-beta:${version} tdengine/tdengine-aarch32-beta:${version}
|
||||||
|
docker manifest create -a tdengine/tdengine-beta:latest tdengine/tdengine-amd64-beta:latest tdengine/tdengine-aarch64-beta:latest tdengine/tdengine-aarch32-beta:latest
|
||||||
docker login -u tdengine -p ${passWord} #replace the docker registry username and password
|
docker login -u tdengine -p ${passWord} #replace the docker registry username and password
|
||||||
|
docker manifest push tdengine/tdengine-beta:latest
|
||||||
|
docker manifest push tdengine/tdengine-beta:${version}
|
||||||
|
|
||||||
|
elif [ "$verType" == "stable" ]; then
|
||||||
|
docker manifest create -a tdengine/tdengine:${version} tdengine/tdengine-amd64:${version} tdengine/tdengine-aarch64:${version} tdengine/tdengine-aarch32:${version}
|
||||||
|
docker manifest create -a tdengine/tdengine:latest tdengine/tdengine-amd64:latest tdengine/tdengine-aarch64:latest tdengine/tdengine-aarch32:latest
|
||||||
|
docker login -u tdengine -p ${passWord} #replace the docker registry username and password
|
||||||
docker manifest push tdengine/tdengine:latest
|
docker manifest push tdengine/tdengine:latest
|
||||||
|
docker manifest push tdengine/tdengine:${version}
|
||||||
|
|
||||||
# how set latest version ???
|
else
|
||||||
|
echo "unknow verType, nor stabel or beta"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# docker manifest create -a tdengine/${dockername}:${version} tdengine/tdengine-amd64:${version} tdengine/tdengine-aarch64:${version} tdengine/tdengine-aarch32:${version}
|
||||||
|
# docker manifest create -a tdengine/${dockername}:latest tdengine/tdengine-amd64:latest tdengine/tdengine-aarch64:latest tdengine/tdengine-aarch32:latest
|
||||||
|
|
||||||
|
# docker login -u tdengine -p ${passWord} #replace the docker registry username and password
|
||||||
|
|
||||||
|
# docker manifest push tdengine/tdengine:latest
|
||||||
|
|
||||||
|
# # how set latest version ???
|
||||||
|
|
|
@ -1,20 +1,24 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
#set -x
|
#set -x
|
||||||
|
|
||||||
# dockerbuild.sh
|
# dockerbuild.sh
|
||||||
# -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...]
|
# -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...]
|
||||||
# -f [pkg file]
|
|
||||||
# -n [version number]
|
# -n [version number]
|
||||||
# -p [password for docker hub]
|
# -p [password for docker hub]
|
||||||
|
# -V [stable | beta]
|
||||||
|
# -f [pkg file]
|
||||||
|
|
||||||
# set parameters by default value
|
# set parameters by default value
|
||||||
cpuType=amd64
|
cpuType=""
|
||||||
verNumber=""
|
version=""
|
||||||
passWord=""
|
passWord=""
|
||||||
pkgFile=""
|
pkgFile=""
|
||||||
|
verType="stable"
|
||||||
|
|
||||||
while getopts "hc:n:p:f:" arg
|
while getopts "hc:n:p:f:V:" arg
|
||||||
do
|
do
|
||||||
case $arg in
|
case $arg in
|
||||||
c)
|
c)
|
||||||
|
@ -22,8 +26,8 @@ do
|
||||||
cpuType=$(echo $OPTARG)
|
cpuType=$(echo $OPTARG)
|
||||||
;;
|
;;
|
||||||
n)
|
n)
|
||||||
#echo "verNumber=$OPTARG"
|
#echo "version=$OPTARG"
|
||||||
verNumber=$(echo $OPTARG)
|
version=$(echo $OPTARG)
|
||||||
;;
|
;;
|
||||||
p)
|
p)
|
||||||
#echo "passWord=$OPTARG"
|
#echo "passWord=$OPTARG"
|
||||||
|
@ -33,11 +37,17 @@ do
|
||||||
#echo "pkgFile=$OPTARG"
|
#echo "pkgFile=$OPTARG"
|
||||||
pkgFile=$(echo $OPTARG)
|
pkgFile=$(echo $OPTARG)
|
||||||
;;
|
;;
|
||||||
|
V)
|
||||||
|
#echo "verType=$OPTARG"
|
||||||
|
verType=$(echo $OPTARG)
|
||||||
|
;;
|
||||||
h)
|
h)
|
||||||
echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] "
|
echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] "
|
||||||
echo " -f [pkg file] "
|
|
||||||
echo " -n [version number] "
|
echo " -n [version number] "
|
||||||
echo " -p [password for docker hub] "
|
echo " -p [password for docker hub] "
|
||||||
|
echo " -V [stable | beta] "
|
||||||
|
echo " -f [pkg file] "
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
?) #unknow option
|
?) #unknow option
|
||||||
|
@ -47,17 +57,44 @@ do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "cpuType=${cpuType} verNumber=${verNumber} pkgFile=${pkgFile} "
|
# if [ "$verType" == "beta" ]; then
|
||||||
|
# pkgFile=TDengine-server-${version}-Linux-${cpuType}-${verType}.tar.gz
|
||||||
|
# elif [ "$verType" == "stable" ]; then
|
||||||
|
# pkgFile=TDengine-server-${version}-Linux-${cpuType}.tar.gz
|
||||||
|
# else
|
||||||
|
# echo "unknow verType, nor stabel or beta"
|
||||||
|
# exit 1
|
||||||
|
|
||||||
|
if [ "$verType" == "beta" ]; then
|
||||||
|
dockername=${cpuType}-${verType}
|
||||||
|
elif [ "$verType" == "stable" ]; then
|
||||||
|
dockername=${cpuType}
|
||||||
|
else
|
||||||
|
echo "unknow verType, nor stabel or beta"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "cpuType=${cpuType} version=${version} pkgFile=${pkgFile} verType=${verType} "
|
||||||
echo "$(pwd)"
|
echo "$(pwd)"
|
||||||
echo "====NOTES: ${pkgFile} must be in the same directory as dockerbuild.sh===="
|
echo "====NOTES: ${pkgFile} must be in the same directory as dockerbuild.sh===="
|
||||||
|
|
||||||
dirName=${pkgFile%-Linux*}
|
scriptDir=$(dirname $(readlink -f $0))
|
||||||
#echo "dirName=${dirName}"
|
comunityArchiveDir=/nas/TDengine/v$version/community # community version’package directory
|
||||||
|
cd ${scriptDir}
|
||||||
|
cp -f ${comunityArchiveDir}/${pkgFile} .
|
||||||
|
|
||||||
docker build --rm -f "Dockerfile" -t tdengine/tdengine-${cpuType}:${verNumber} "." --build-arg pkgFile=${pkgFile} --build-arg dirName=${dirName}
|
dirName=${pkgFile%-Linux*}
|
||||||
|
echo "dirName=${dirName}"
|
||||||
|
|
||||||
|
|
||||||
|
docker build --rm -f "Dockerfile" -t tdengine/tdengine-${dockername}:${version} "." --build-arg pkgFile=${pkgFile} --build-arg dirName=${dirName}
|
||||||
docker login -u tdengine -p ${passWord} #replace the docker registry username and password
|
docker login -u tdengine -p ${passWord} #replace the docker registry username and password
|
||||||
docker push tdengine/tdengine-${cpuType}:${verNumber}
|
docker push tdengine/tdengine-${dockername}:${version}
|
||||||
|
|
||||||
# set this version to latest version
|
# set this version to latest version
|
||||||
docker tag tdengine/tdengine-${cpuType}:${verNumber} tdengine/tdengine-${cpuType}:latest
|
docker tag tdengine/tdengine-${dockername}:${version} tdengine/tdengine-${dockername}:latest
|
||||||
docker push tdengine/tdengine-${cpuType}:latest
|
docker push tdengine/tdengine-${dockername}:latest
|
||||||
|
|
||||||
|
|
||||||
|
rm -f ${pkgFile}
|
|
@ -73,7 +73,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$verType" == "beta" ]; then
|
if [ "$verType" == "beta" ]; then
|
||||||
rpmname=${rpmname}-${verType}".rpm"
|
rpmname="TDengine-server-"${tdengine_ver}-${verType}-${osType}-${cpuType}".rpm"
|
||||||
elif [ "$verType" == "stable" ]; then
|
elif [ "$verType" == "stable" ]; then
|
||||||
rpmname=${rpmname}".rpm"
|
rpmname=${rpmname}".rpm"
|
||||||
else
|
else
|
||||||
|
|
|
@ -47,17 +47,20 @@ mkdir -p ${install_dir}/init.d && cp ${init_file_tarbitrator_rpm} ${install_dir}
|
||||||
|
|
||||||
cd ${release_dir}
|
cd ${release_dir}
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
# install_dir has been distinguishes cluster from edege, so comments this code
|
||||||
pkg_name=${install_dir}-${osType}-${cpuType}
|
pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
elif [ "$verMode" == "edge" ]; then
|
|
||||||
pkg_name=${install_dir}-${osType}-${cpuType}
|
# if [ "$verMode" == "cluster" ]; then
|
||||||
else
|
# pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
echo "unknow verMode, nor cluster or edge"
|
# elif [ "$verMode" == "edge" ]; then
|
||||||
exit 1
|
# pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
fi
|
# else
|
||||||
|
# echo "unknow verMode, nor cluster or edge"
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
|
||||||
if [ "$verType" == "beta" ]; then
|
if [ "$verType" == "beta" ]; then
|
||||||
pkg_name=${pkg_name}-${verType}
|
pkg_name=${install_dir}-${verType}-${osType}-${cpuType}
|
||||||
elif [ "$verType" == "stable" ]; then
|
elif [ "$verType" == "stable" ]; then
|
||||||
pkg_name=${pkg_name}
|
pkg_name=${pkg_name}
|
||||||
else
|
else
|
||||||
|
@ -65,6 +68,7 @@ else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
tar -zcv -f "$(basename ${pkg_name}).tar.gz" $(basename ${install_dir}) --remove-files || :
|
tar -zcv -f "$(basename ${pkg_name}).tar.gz" $(basename ${install_dir}) --remove-files || :
|
||||||
exitcode=$?
|
exitcode=$?
|
||||||
if [ "$exitcode" != "0" ]; then
|
if [ "$exitcode" != "0" ]; then
|
||||||
|
|
|
@ -170,12 +170,24 @@ fi
|
||||||
|
|
||||||
cd ${release_dir}
|
cd ${release_dir}
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
# install_dir has been distinguishes cluster from edege, so comments this code
|
||||||
pkg_name=${install_dir}-${osType}-${cpuType}
|
|
||||||
elif [ "$verMode" == "edge" ]; then
|
|
||||||
pkg_name=${install_dir}-${osType}-${cpuType}
|
pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
|
|
||||||
|
# if [ "$verMode" == "cluster" ]; then
|
||||||
|
# pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
|
# elif [ "$verMode" == "edge" ]; then
|
||||||
|
# pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
|
# else
|
||||||
|
# echo "unknow verMode, nor cluster or edge"
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
|
||||||
|
if [ "$verType" == "beta" ]; then
|
||||||
|
pkg_name=${install_dir}-${verType}-${osType}-${cpuType}
|
||||||
|
elif [ "$verType" == "stable" ]; then
|
||||||
|
pkg_name=${pkg_name}
|
||||||
else
|
else
|
||||||
echo "unknow verMode, nor cluster or edge"
|
echo "unknow verType, nor stabel or beta"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -183,15 +195,6 @@ if [ "$pagMode" == "lite" ]; then
|
||||||
pkg_name=${pkg_name}-Lite
|
pkg_name=${pkg_name}-Lite
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$verType" == "beta" ]; then
|
|
||||||
pkg_name=${pkg_name}-${verType}
|
|
||||||
elif [ "$verType" == "stable" ]; then
|
|
||||||
pkg_name=${pkg_name}
|
|
||||||
else
|
|
||||||
echo "unknow verType, nor stable or beta"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$osType" != "Darwin" ]; then
|
if [ "$osType" != "Darwin" ]; then
|
||||||
tar -zcv -f "$(basename ${pkg_name}).tar.gz" $(basename ${install_dir}) --remove-files || :
|
tar -zcv -f "$(basename ${pkg_name}).tar.gz" $(basename ${install_dir}) --remove-files || :
|
||||||
else
|
else
|
||||||
|
|
|
@ -203,21 +203,20 @@ fi
|
||||||
|
|
||||||
cd ${release_dir}
|
cd ${release_dir}
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
# install_dir has been distinguishes cluster from edege, so comments this code
|
||||||
pkg_name=${install_dir}-${osType}-${cpuType}
|
pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
elif [ "$verMode" == "edge" ]; then
|
|
||||||
pkg_name=${install_dir}-${osType}-${cpuType}
|
|
||||||
else
|
|
||||||
echo "unknow verMode, nor cluster or edge"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$pagMode" == "lite" ]; then
|
# if [ "$verMode" == "cluster" ]; then
|
||||||
pkg_name=${pkg_name}-Lite
|
# pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
fi
|
# elif [ "$verMode" == "edge" ]; then
|
||||||
|
# pkg_name=${install_dir}-${osType}-${cpuType}
|
||||||
|
# else
|
||||||
|
# echo "unknow verMode, nor cluster or edge"
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
|
||||||
if [ "$verType" == "beta" ]; then
|
if [ "$verType" == "beta" ]; then
|
||||||
pkg_name=${pkg_name}-${verType}
|
pkg_name=${install_dir}-${verType}-${osType}-${cpuType}
|
||||||
elif [ "$verType" == "stable" ]; then
|
elif [ "$verType" == "stable" ]; then
|
||||||
pkg_name=${pkg_name}
|
pkg_name=${pkg_name}
|
||||||
else
|
else
|
||||||
|
@ -225,6 +224,10 @@ else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$pagMode" == "lite" ]; then
|
||||||
|
pkg_name=${pkg_name}-Lite
|
||||||
|
fi
|
||||||
|
|
||||||
tar -zcv -f "$(basename ${pkg_name}).tar.gz" $(basename ${install_dir}) --remove-files || :
|
tar -zcv -f "$(basename ${pkg_name}).tar.gz" $(basename ${install_dir}) --remove-files || :
|
||||||
exitcode=$?
|
exitcode=$?
|
||||||
if [ "$exitcode" != "0" ]; then
|
if [ "$exitcode" != "0" ]; then
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: tdengine
|
name: tdengine
|
||||||
base: core18
|
base: core18
|
||||||
version: '2.1.3.0'
|
version: '2.1.4.1'
|
||||||
icon: snap/gui/t-dengine.svg
|
icon: snap/gui/t-dengine.svg
|
||||||
summary: an open-source big data platform designed and optimized for IoT.
|
summary: an open-source big data platform designed and optimized for IoT.
|
||||||
description: |
|
description: |
|
||||||
|
@ -72,7 +72,7 @@ parts:
|
||||||
- usr/bin/taosd
|
- usr/bin/taosd
|
||||||
- usr/bin/taos
|
- usr/bin/taos
|
||||||
- usr/bin/taosdemo
|
- usr/bin/taosdemo
|
||||||
- usr/lib/libtaos.so.2.1.3.0
|
- usr/lib/libtaos.so.2.1.4.1
|
||||||
- usr/lib/libtaos.so.1
|
- usr/lib/libtaos.so.1
|
||||||
- usr/lib/libtaos.so
|
- usr/lib/libtaos.so
|
||||||
|
|
||||||
|
|
|
@ -1660,6 +1660,7 @@ int tsParseInsertSql(SSqlObj *pSql) {
|
||||||
SSqlCmd *pCmd = &pSql->cmd;
|
SSqlCmd *pCmd = &pSql->cmd;
|
||||||
|
|
||||||
SInsertStatementParam* pInsertParam = &pCmd->insertParam;
|
SInsertStatementParam* pInsertParam = &pCmd->insertParam;
|
||||||
|
pInsertParam->objectId = pSql->self;
|
||||||
char* str = pInsertParam->sql;
|
char* str = pInsertParam->sql;
|
||||||
|
|
||||||
int32_t totalNum = 0;
|
int32_t totalNum = 0;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1412,9 +1412,11 @@ static int insertBatchStmtExecute(STscStmt* pStmt) {
|
||||||
// wait for the callback function to post the semaphore
|
// wait for the callback function to post the semaphore
|
||||||
tsem_wait(&pStmt->pSql->rspSem);
|
tsem_wait(&pStmt->pSql->rspSem);
|
||||||
|
|
||||||
|
code = pStmt->pSql->res.code;
|
||||||
|
|
||||||
insertBatchClean(pStmt);
|
insertBatchClean(pStmt);
|
||||||
|
|
||||||
return pStmt->pSql->res.code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stmtParseInsertTbTags(SSqlObj* pSql, STscStmt* pStmt) {
|
int stmtParseInsertTbTags(SSqlObj* pSql, STscStmt* pStmt) {
|
||||||
|
@ -1682,6 +1684,7 @@ int taos_stmt_prepare(TAOS_STMT* stmt, const char* sql, unsigned long length) {
|
||||||
pSql->fetchFp = waitForQueryRsp;
|
pSql->fetchFp = waitForQueryRsp;
|
||||||
|
|
||||||
pCmd->insertParam.insertType = TSDB_QUERY_TYPE_STMT_INSERT;
|
pCmd->insertParam.insertType = TSDB_QUERY_TYPE_STMT_INSERT;
|
||||||
|
pCmd->insertParam.objectId = pSql->self;
|
||||||
|
|
||||||
pSql->sqlstr = realloc(pSql->sqlstr, sqlLen + 1);
|
pSql->sqlstr = realloc(pSql->sqlstr, sqlLen + 1);
|
||||||
|
|
||||||
|
@ -1858,7 +1861,11 @@ int taos_stmt_close(TAOS_STMT* stmt) {
|
||||||
} else {
|
} else {
|
||||||
if (pStmt->multiTbInsert) {
|
if (pStmt->multiTbInsert) {
|
||||||
taosHashCleanup(pStmt->mtb.pTableHash);
|
taosHashCleanup(pStmt->mtb.pTableHash);
|
||||||
pStmt->mtb.pTableBlockHashList = tscDestroyBlockHashTable(pStmt->mtb.pTableBlockHashList, false);
|
bool rmMeta = false;
|
||||||
|
if (pStmt->pSql && pStmt->pSql->res.code != 0) {
|
||||||
|
rmMeta = true;
|
||||||
|
}
|
||||||
|
pStmt->mtb.pTableBlockHashList = tscDestroyBlockHashTable(pStmt->mtb.pTableBlockHashList, rmMeta);
|
||||||
taosHashCleanup(pStmt->pSql->cmd.insertParam.pTableBlockHashList);
|
taosHashCleanup(pStmt->pSql->cmd.insertParam.pTableBlockHashList);
|
||||||
pStmt->pSql->cmd.insertParam.pTableBlockHashList = NULL;
|
pStmt->pSql->cmd.insertParam.pTableBlockHashList = NULL;
|
||||||
taosArrayDestroy(pStmt->mtb.tags);
|
taosArrayDestroy(pStmt->mtb.tags);
|
||||||
|
|
|
@ -96,7 +96,7 @@ static int32_t parseIntervalOffset(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrTo
|
||||||
static int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSliding);
|
static int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSliding);
|
||||||
static int32_t validateStateWindowNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode, bool isStable);
|
static int32_t validateStateWindowNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode, bool isStable);
|
||||||
|
|
||||||
static int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExprItem* pItem);
|
static int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExprItem* pItem, bool outerQuery);
|
||||||
|
|
||||||
static int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSql);
|
static int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSql);
|
||||||
static int32_t validateFillNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode);
|
static int32_t validateFillNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode);
|
||||||
|
@ -1809,8 +1809,8 @@ static bool hasNoneUserDefineExpr(SQueryInfo* pQueryInfo) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelNodeList, bool isSTable, bool joinQuery,
|
int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelNodeList, bool joinQuery,
|
||||||
bool timeWindowQuery) {
|
bool timeWindowQuery, bool outerQuery) {
|
||||||
assert(pSelNodeList != NULL && pCmd != NULL);
|
assert(pSelNodeList != NULL && pCmd != NULL);
|
||||||
|
|
||||||
const char* msg1 = "too many items in selection clause";
|
const char* msg1 = "too many items in selection clause";
|
||||||
|
@ -1852,7 +1852,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS
|
||||||
} else if (type == SQL_NODE_TABLE_COLUMN || type == SQL_NODE_VALUE) {
|
} else if (type == SQL_NODE_TABLE_COLUMN || type == SQL_NODE_VALUE) {
|
||||||
// use the dynamic array list to decide if the function is valid or not
|
// use the dynamic array list to decide if the function is valid or not
|
||||||
// select table_name1.field_name1, table_name2.field_name2 from table_name1, table_name2
|
// select table_name1.field_name1, table_name2.field_name2 from table_name1, table_name2
|
||||||
if (addProjectionExprAndResultField(pCmd, pQueryInfo, pItem) != TSDB_CODE_SUCCESS) {
|
if (addProjectionExprAndResultField(pCmd, pQueryInfo, pItem, outerQuery) != TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
}
|
}
|
||||||
} else if (type == SQL_NODE_EXPR) {
|
} else if (type == SQL_NODE_EXPR) {
|
||||||
|
@ -1988,14 +1988,15 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum
|
||||||
return numOfTotalColumns;
|
return numOfTotalColumns;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExprItem* pItem) {
|
int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExprItem* pItem, bool outerQuery) {
|
||||||
const char* msg1 = "tag for normal table query is not allowed";
|
const char* msg1 = "tag for normal table query is not allowed";
|
||||||
const char* msg2 = "invalid column name";
|
const char* msg2 = "invalid column name";
|
||||||
|
const char* msg3 = "tbname not allowed in outer query";
|
||||||
|
|
||||||
int32_t startPos = (int32_t)tscNumOfExprs(pQueryInfo);
|
int32_t startPos = (int32_t)tscNumOfExprs(pQueryInfo);
|
||||||
int32_t optr = pItem->pNode->tokenId;
|
int32_t tokenId = pItem->pNode->tokenId;
|
||||||
|
|
||||||
if (optr == TK_ALL) { // project on all fields
|
if (tokenId == TK_ALL) { // project on all fields
|
||||||
TSDB_QUERY_SET_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_PROJECTION_QUERY);
|
TSDB_QUERY_SET_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_PROJECTION_QUERY);
|
||||||
|
|
||||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||||
|
@ -2019,7 +2020,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
||||||
if (pTableMeta->tableType != TSDB_TEMP_TABLE) {
|
if (pTableMeta->tableType != TSDB_TEMP_TABLE) {
|
||||||
tscInsertPrimaryTsSourceColumn(pQueryInfo, pTableMeta->id.uid);
|
tscInsertPrimaryTsSourceColumn(pQueryInfo, pTableMeta->id.uid);
|
||||||
}
|
}
|
||||||
} else if (optr == TK_STRING || optr == TK_INTEGER || optr == TK_FLOAT) { // simple column projection query
|
} else if (tokenId == TK_STRING || tokenId == TK_INTEGER || tokenId == TK_FLOAT) { // simple column projection query
|
||||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||||
|
|
||||||
// user-specified constant value as a new result column
|
// user-specified constant value as a new result column
|
||||||
|
@ -2027,13 +2028,13 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
||||||
index.tableIndex = 0;
|
index.tableIndex = 0;
|
||||||
|
|
||||||
SSchema colSchema = tGetUserSpecifiedColumnSchema(&pItem->pNode->value, &pItem->pNode->exprToken, pItem->aliasName);
|
SSchema colSchema = tGetUserSpecifiedColumnSchema(&pItem->pNode->value, &pItem->pNode->exprToken, pItem->aliasName);
|
||||||
SExprInfo* pExpr =
|
SExprInfo* pExpr = tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_PRJ, &index, &colSchema, TSDB_COL_UDC,
|
||||||
tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_PRJ, &index, &colSchema, TSDB_COL_UDC, getNewResColId(pCmd));
|
getNewResColId(pCmd));
|
||||||
|
|
||||||
// NOTE: the first parameter is reserved for the tag column id during join query process.
|
// NOTE: the first parameter is reserved for the tag column id during join query process.
|
||||||
pExpr->base.numOfParams = 2;
|
pExpr->base.numOfParams = 2;
|
||||||
tVariantAssign(&pExpr->base.param[1], &pItem->pNode->value);
|
tVariantAssign(&pExpr->base.param[1], &pItem->pNode->value);
|
||||||
} else if (optr == TK_ID) {
|
} else if (tokenId == TK_ID) {
|
||||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||||
|
|
||||||
if (getColumnIndexByName(&pItem->pNode->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
if (getColumnIndexByName(&pItem->pNode->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -2041,12 +2042,40 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
|
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
|
||||||
|
if (outerQuery) {
|
||||||
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||||
|
int32_t numOfCols = tscGetNumOfColumns(pTableMetaInfo->pTableMeta);
|
||||||
|
|
||||||
|
bool existed = false;
|
||||||
|
SSchema* pSchema = pTableMetaInfo->pTableMeta->schema;
|
||||||
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
if (strncasecmp(pSchema[i].name, TSQL_TBNAME_L, tListLen(pSchema[i].name)) == 0) {
|
||||||
|
existed = true;
|
||||||
|
index.columnIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!existed) {
|
||||||
|
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||||
|
}
|
||||||
|
|
||||||
|
SSchema colSchema = pSchema[index.columnIndex];
|
||||||
|
char name[TSDB_COL_NAME_LEN] = {0};
|
||||||
|
getColumnName(pItem, name, colSchema.name, sizeof(colSchema.name) - 1);
|
||||||
|
|
||||||
|
tstrncpy(colSchema.name, name, TSDB_COL_NAME_LEN);
|
||||||
|
/*SExprInfo* pExpr = */ tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_PRJ, &index, &colSchema,
|
||||||
|
TSDB_COL_NORMAL, getNewResColId(pCmd));
|
||||||
|
} else {
|
||||||
SSchema colSchema = *tGetTbnameColumnSchema();
|
SSchema colSchema = *tGetTbnameColumnSchema();
|
||||||
char name[TSDB_COL_NAME_LEN] = {0};
|
char name[TSDB_COL_NAME_LEN] = {0};
|
||||||
getColumnName(pItem, name, colSchema.name, sizeof(colSchema.name) - 1);
|
getColumnName(pItem, name, colSchema.name, sizeof(colSchema.name) - 1);
|
||||||
|
|
||||||
tstrncpy(colSchema.name, name, TSDB_COL_NAME_LEN);
|
tstrncpy(colSchema.name, name, TSDB_COL_NAME_LEN);
|
||||||
/*SExprInfo* pExpr = */tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema, TSDB_COL_TAG, getNewResColId(pCmd));
|
/*SExprInfo* pExpr = */ tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema,
|
||||||
|
TSDB_COL_TAG, getNewResColId(pCmd));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||||
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
|
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
|
||||||
|
@ -7156,8 +7185,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSTable = UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo);
|
if (validateSelectNodeList(&pSql->cmd, pQueryInfo, pSqlNode->pSelNodeList, false, false, false) != TSDB_CODE_SUCCESS) {
|
||||||
if (validateSelectNodeList(&pSql->cmd, pQueryInfo, pSqlNode->pSelNodeList, isSTable, false, false) != TSDB_CODE_SUCCESS) {
|
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7820,14 +7848,20 @@ static STableMeta* extractTempTableMetaFromSubquery(SQueryInfo* pUpstream) {
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
for(int32_t i = 0; i < numOfColumns; ++i) {
|
for(int32_t i = 0; i < numOfColumns; ++i) {
|
||||||
SInternalField* pField = tscFieldInfoGetInternalField(&pUpstream->fieldsInfo, i);
|
SInternalField* pField = tscFieldInfoGetInternalField(&pUpstream->fieldsInfo, i);
|
||||||
if (pField->visible) {
|
if (!pField->visible) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
meta->schema[n].bytes = pField->field.bytes;
|
meta->schema[n].bytes = pField->field.bytes;
|
||||||
meta->schema[n].type = pField->field.type;
|
meta->schema[n].type = pField->field.type;
|
||||||
meta->schema[n].colId = pField->pExpr->base.resColId;
|
|
||||||
|
SExprInfo* pExpr = pField->pExpr;
|
||||||
|
meta->schema[n].colId = pExpr->base.resColId;
|
||||||
tstrncpy(meta->schema[n].name, pField->pExpr->base.aliasName, TSDB_COL_NAME_LEN);
|
tstrncpy(meta->schema[n].name, pField->pExpr->base.aliasName, TSDB_COL_NAME_LEN);
|
||||||
|
info->rowSize += meta->schema[n].bytes;
|
||||||
|
|
||||||
n += 1;
|
n += 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
|
@ -7943,7 +7977,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (validateSelectNodeList(pCmd, pQueryInfo, pSqlNode->pSelNodeList, false, false, timeWindowQuery) !=
|
if (validateSelectNodeList(pCmd, pQueryInfo, pSqlNode->pSelNodeList, false, timeWindowQuery, true) !=
|
||||||
TSDB_CODE_SUCCESS) {
|
TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
}
|
}
|
||||||
|
@ -8083,7 +8117,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
||||||
int32_t timeWindowQuery =
|
int32_t timeWindowQuery =
|
||||||
(TPARSER_HAS_TOKEN(pSqlNode->interval.interval) || TPARSER_HAS_TOKEN(pSqlNode->sessionVal.gap));
|
(TPARSER_HAS_TOKEN(pSqlNode->interval.interval) || TPARSER_HAS_TOKEN(pSqlNode->sessionVal.gap));
|
||||||
|
|
||||||
if (validateSelectNodeList(pCmd, pQueryInfo, pSqlNode->pSelNodeList, isSTable, joinQuery, timeWindowQuery) !=
|
if (validateSelectNodeList(pCmd, pQueryInfo, pSqlNode->pSelNodeList, joinQuery, timeWindowQuery, false) !=
|
||||||
TSDB_CODE_SUCCESS) {
|
TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2542,7 +2542,7 @@ int32_t tscHandleMasterSTableQuery(SSqlObj *pSql) {
|
||||||
SSqlObj* pSub = pSql->pSubs[j];
|
SSqlObj* pSub = pSql->pSubs[j];
|
||||||
SRetrieveSupport* pSupport = pSub->param;
|
SRetrieveSupport* pSupport = pSub->param;
|
||||||
|
|
||||||
tscDebug("0x%"PRIx64" sub:%p launch subquery, orderOfSub:%d.", pSql->self, pSub, pSupport->subqueryIndex);
|
tscDebug("0x%"PRIx64" sub:0x%"PRIx64" launch subquery, orderOfSub:%d.", pSql->self, pSub->self, pSupport->subqueryIndex);
|
||||||
tscBuildAndSendRequest(pSub, NULL);
|
tscBuildAndSendRequest(pSub, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2861,8 +2861,8 @@ static void tscRetrieveFromDnodeCallBack(void *param, TAOS_RES *tres, int numOfR
|
||||||
assert(pRes->numOfRows == numOfRows);
|
assert(pRes->numOfRows == numOfRows);
|
||||||
int64_t num = atomic_add_fetch_64(&pState->numOfRetrievedRows, numOfRows);
|
int64_t num = atomic_add_fetch_64(&pState->numOfRetrievedRows, numOfRows);
|
||||||
|
|
||||||
tscDebug("0x%"PRIx64" sub:%p retrieve numOfRows:%d totalNumOfRows:%" PRIu64 " from ep:%s, orderOfSub:%d",
|
tscDebug("0x%"PRIx64" sub:0x%"PRIx64" retrieve numOfRows:%d totalNumOfRows:%" PRIu64 " from ep:%s, orderOfSub:%d",
|
||||||
pParentSql->self, pSql, pRes->numOfRows, pState->numOfRetrievedRows, pSql->epSet.fqdn[pSql->epSet.inUse], idx);
|
pParentSql->self, pSql->self, pRes->numOfRows, pState->numOfRetrievedRows, pSql->epSet.fqdn[pSql->epSet.inUse], idx);
|
||||||
|
|
||||||
if (num > tsMaxNumOfOrderedResults && tscIsProjectionQueryOnSTable(pQueryInfo, 0) && !(tscGetQueryInfo(&pParentSql->cmd)->distinctTag)) {
|
if (num > tsMaxNumOfOrderedResults && tscIsProjectionQueryOnSTable(pQueryInfo, 0) && !(tscGetQueryInfo(&pParentSql->cmd)->distinctTag)) {
|
||||||
tscError("0x%"PRIx64" sub:0x%"PRIx64" num of OrderedRes is too many, max allowed:%" PRId32 " , current:%" PRId64,
|
tscError("0x%"PRIx64" sub:0x%"PRIx64" num of OrderedRes is too many, max allowed:%" PRId32 " , current:%" PRId64,
|
||||||
|
|
|
@ -3453,6 +3453,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
|
||||||
pnCmd->insertParam.numOfTables = 0;
|
pnCmd->insertParam.numOfTables = 0;
|
||||||
pnCmd->insertParam.pTableNameList = NULL;
|
pnCmd->insertParam.pTableNameList = NULL;
|
||||||
pnCmd->insertParam.pTableBlockHashList = NULL;
|
pnCmd->insertParam.pTableBlockHashList = NULL;
|
||||||
|
pnCmd->insertParam.objectId = pNew->self;
|
||||||
|
|
||||||
memset(&pnCmd->insertParam.tagData, 0, sizeof(STagData));
|
memset(&pnCmd->insertParam.tagData, 0, sizeof(STagData));
|
||||||
|
|
||||||
|
@ -3719,6 +3720,7 @@ void executeQuery(SSqlObj* pSql, SQueryInfo* pQueryInfo) {
|
||||||
pNew->signature = pNew;
|
pNew->signature = pNew;
|
||||||
pNew->sqlstr = strdup(pSql->sqlstr); // todo refactor
|
pNew->sqlstr = strdup(pSql->sqlstr); // todo refactor
|
||||||
pNew->fp = tscSubqueryCompleteCallback;
|
pNew->fp = tscSubqueryCompleteCallback;
|
||||||
|
tsem_init(&pNew->rspSem, 0, 0);
|
||||||
|
|
||||||
SRetrieveSupport* ps = calloc(1, sizeof(SRetrieveSupport)); // todo use object id
|
SRetrieveSupport* ps = calloc(1, sizeof(SRetrieveSupport)); // todo use object id
|
||||||
ps->pParentSql = pSql;
|
ps->pParentSql = pSql;
|
||||||
|
|
|
@ -110,7 +110,7 @@ public class Utils {
|
||||||
return rawSql;
|
return rawSql;
|
||||||
// toLowerCase
|
// toLowerCase
|
||||||
String preparedSql = rawSql.trim().toLowerCase();
|
String preparedSql = rawSql.trim().toLowerCase();
|
||||||
String[] clause = new String[]{"values\\s*\\(.*?\\)", "tags\\s*\\(.*?\\)", "where\\s*.*"};
|
String[] clause = new String[]{"values\\s*\\([\\s\\S]*?\\)", "tags\\s*\\([\\s\\S]*?\\)", "where[\\s\\S]*"};
|
||||||
Map<Integer, Integer> placeholderPositions = new HashMap<>();
|
Map<Integer, Integer> placeholderPositions = new HashMap<>();
|
||||||
RangeSet<Integer> clauseRangeSet = TreeRangeSet.create();
|
RangeSet<Integer> clauseRangeSet = TreeRangeSet.create();
|
||||||
findPlaceholderPosition(preparedSql, placeholderPositions);
|
findPlaceholderPosition(preparedSql, placeholderPositions);
|
||||||
|
|
|
@ -169,6 +169,8 @@ DLL_EXPORT void taos_close_stream(TAOS_STREAM *tstr);
|
||||||
|
|
||||||
DLL_EXPORT int taos_load_table_info(TAOS *taos, const char* tableNameList);
|
DLL_EXPORT int taos_load_table_info(TAOS *taos, const char* tableNameList);
|
||||||
|
|
||||||
|
DLL_EXPORT int taos_insert_lines(TAOS* taos, char* lines[], int numLines);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -236,6 +236,7 @@ typedef struct SArguments_S {
|
||||||
char ** arg_list;
|
char ** arg_list;
|
||||||
uint64_t totalInsertRows;
|
uint64_t totalInsertRows;
|
||||||
uint64_t totalAffectedRows;
|
uint64_t totalAffectedRows;
|
||||||
|
bool demo_mode; // use default column name and semi-random data
|
||||||
} SArguments;
|
} SArguments;
|
||||||
|
|
||||||
typedef struct SColumn_S {
|
typedef struct SColumn_S {
|
||||||
|
@ -552,6 +553,8 @@ static int postProceSql(char *host, struct sockaddr_in *pServAddr,
|
||||||
uint16_t port, char* sqlstr, threadInfo *pThreadInfo);
|
uint16_t port, char* sqlstr, threadInfo *pThreadInfo);
|
||||||
static int64_t getTSRandTail(int64_t timeStampStep, int32_t seq,
|
static int64_t getTSRandTail(int64_t timeStampStep, int32_t seq,
|
||||||
int disorderRatio, int disorderRange);
|
int disorderRatio, int disorderRange);
|
||||||
|
static bool getInfoFromJsonFile(char* file);
|
||||||
|
static void init_rand_data();
|
||||||
|
|
||||||
/* ************ Global variables ************ */
|
/* ************ Global variables ************ */
|
||||||
|
|
||||||
|
@ -578,7 +581,7 @@ SArguments g_args = {
|
||||||
#endif
|
#endif
|
||||||
"test", // database
|
"test", // database
|
||||||
1, // replica
|
1, // replica
|
||||||
"t", // tb_prefix
|
"d", // tb_prefix
|
||||||
NULL, // sqlFile
|
NULL, // sqlFile
|
||||||
true, // use_metric
|
true, // use_metric
|
||||||
true, // drop_database
|
true, // drop_database
|
||||||
|
@ -590,10 +593,9 @@ SArguments g_args = {
|
||||||
"./output.txt", // output_file
|
"./output.txt", // output_file
|
||||||
0, // mode : sync or async
|
0, // mode : sync or async
|
||||||
{
|
{
|
||||||
|
"FLOAT", // datatype
|
||||||
"INT", // datatype
|
"INT", // datatype
|
||||||
"INT", // datatype
|
"FLOAT", // datatype
|
||||||
"INT", // datatype
|
|
||||||
"INT", // datatype
|
|
||||||
},
|
},
|
||||||
16, // len_of_binary
|
16, // len_of_binary
|
||||||
4, // num_of_CPR
|
4, // num_of_CPR
|
||||||
|
@ -609,7 +611,10 @@ SArguments g_args = {
|
||||||
0, // disorderRatio
|
0, // disorderRatio
|
||||||
1000, // disorderRange
|
1000, // disorderRange
|
||||||
1, // method_of_delete
|
1, // method_of_delete
|
||||||
NULL // arg_list
|
NULL, // arg_list
|
||||||
|
0, // totalInsertRows;
|
||||||
|
0, // totalAffectedRows;
|
||||||
|
true, // demo_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -709,7 +714,7 @@ static void printHelp() {
|
||||||
printf("%s%s%s%s\n", indent, "-a", indent,
|
printf("%s%s%s%s\n", indent, "-a", indent,
|
||||||
"Set the replica parameters of the database, Default 1, min: 1, max: 3.");
|
"Set the replica parameters of the database, Default 1, min: 1, max: 3.");
|
||||||
printf("%s%s%s%s\n", indent, "-m", indent,
|
printf("%s%s%s%s\n", indent, "-m", indent,
|
||||||
"Table prefix name. Default is 't'.");
|
"Table prefix name. Default is 'd'.");
|
||||||
printf("%s%s%s%s\n", indent, "-s", indent, "The select sql file.");
|
printf("%s%s%s%s\n", indent, "-s", indent, "The select sql file.");
|
||||||
printf("%s%s%s%s\n", indent, "-N", indent, "Use normal table flag.");
|
printf("%s%s%s%s\n", indent, "-N", indent, "Use normal table flag.");
|
||||||
printf("%s%s%s%s\n", indent, "-o", indent,
|
printf("%s%s%s%s\n", indent, "-o", indent,
|
||||||
|
@ -717,11 +722,11 @@ static void printHelp() {
|
||||||
printf("%s%s%s%s\n", indent, "-q", indent,
|
printf("%s%s%s%s\n", indent, "-q", indent,
|
||||||
"Query mode -- 0: SYNC, 1: ASYNC. Default is SYNC.");
|
"Query mode -- 0: SYNC, 1: ASYNC. Default is SYNC.");
|
||||||
printf("%s%s%s%s\n", indent, "-b", indent,
|
printf("%s%s%s%s\n", indent, "-b", indent,
|
||||||
"The data_type of columns, default: INT,INT,INT,INT.");
|
"The data_type of columns, default: FLOAT, INT, FLOAT.");
|
||||||
printf("%s%s%s%s\n", indent, "-w", indent,
|
printf("%s%s%s%s\n", indent, "-w", indent,
|
||||||
"The length of data_type 'BINARY' or 'NCHAR'. Default is 16");
|
"The length of data_type 'BINARY' or 'NCHAR'. Default is 16");
|
||||||
printf("%s%s%s%s%d\n", indent, "-l", indent,
|
printf("%s%s%s%s%d\n", indent, "-l", indent,
|
||||||
"The number of columns per record. Default is 4. Max values is ",
|
"The number of columns per record. Default is 3. Max values is ",
|
||||||
MAX_NUM_DATATYPE);
|
MAX_NUM_DATATYPE);
|
||||||
printf("%s%s%s%s\n", indent, "-T", indent,
|
printf("%s%s%s%s\n", indent, "-T", indent,
|
||||||
"The number of threads. Default is 10.");
|
"The number of threads. Default is 10.");
|
||||||
|
@ -733,6 +738,10 @@ static void printHelp() {
|
||||||
"The number of tables. Default is 10000.");
|
"The number of tables. Default is 10000.");
|
||||||
printf("%s%s%s%s\n", indent, "-n", indent,
|
printf("%s%s%s%s\n", indent, "-n", indent,
|
||||||
"The number of records per table. Default is 10000.");
|
"The number of records per table. Default is 10000.");
|
||||||
|
printf("%s%s%s%s\n", indent, "-M", indent,
|
||||||
|
"The value of records generated are totally random.");
|
||||||
|
printf("%s%s%s%s\n", indent, indent, indent,
|
||||||
|
" The default is to simulate power equipment senario.");
|
||||||
printf("%s%s%s%s\n", indent, "-x", indent, "Not insert only flag.");
|
printf("%s%s%s%s\n", indent, "-x", indent, "Not insert only flag.");
|
||||||
printf("%s%s%s%s\n", indent, "-y", indent, "Default input yes for prompt.");
|
printf("%s%s%s%s\n", indent, "-y", indent, "Default input yes for prompt.");
|
||||||
printf("%s%s%s%s\n", indent, "-O", indent,
|
printf("%s%s%s%s\n", indent, "-O", indent,
|
||||||
|
@ -746,7 +755,7 @@ static void printHelp() {
|
||||||
printf("%s%s%s%s\n", indent, "--help\t", indent,
|
printf("%s%s%s%s\n", indent, "--help\t", indent,
|
||||||
"Print command line arguments list info.");
|
"Print command line arguments list info.");
|
||||||
/* printf("%s%s%s%s\n", indent, "-D", indent,
|
/* printf("%s%s%s%s\n", indent, "-D", indent,
|
||||||
"if elete database if exists. 0: no, 1: yes, default is 1");
|
"Delete database if exists. 0: no, 1: yes, default is 1");
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,6 +778,7 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
if (strcmp(argv[i], "-f") == 0) {
|
if (strcmp(argv[i], "-f") == 0) {
|
||||||
|
arguments->demo_mode = false;
|
||||||
arguments->metaFile = argv[++i];
|
arguments->metaFile = argv[++i];
|
||||||
} else if (strcmp(argv[i], "-c") == 0) {
|
} else if (strcmp(argv[i], "-c") == 0) {
|
||||||
if (argc == i+1) {
|
if (argc == i+1) {
|
||||||
|
@ -911,6 +921,7 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
}
|
}
|
||||||
arguments->database = argv[++i];
|
arguments->database = argv[++i];
|
||||||
} else if (strcmp(argv[i], "-l") == 0) {
|
} else if (strcmp(argv[i], "-l") == 0) {
|
||||||
|
arguments->demo_mode = false;
|
||||||
if (argc == i+1) {
|
if (argc == i+1) {
|
||||||
if (!isStringNumber(argv[i+1])) {
|
if (!isStringNumber(argv[i+1])) {
|
||||||
printHelp();
|
printHelp();
|
||||||
|
@ -931,6 +942,7 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (strcmp(argv[i], "-b") == 0) {
|
} else if (strcmp(argv[i], "-b") == 0) {
|
||||||
|
arguments->demo_mode = false;
|
||||||
if (argc == i+1) {
|
if (argc == i+1) {
|
||||||
printHelp();
|
printHelp();
|
||||||
errorPrint("%s", "\n\t-b need valid string following!\n");
|
errorPrint("%s", "\n\t-b need valid string following!\n");
|
||||||
|
@ -1000,6 +1012,8 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
arguments->tb_prefix = argv[++i];
|
arguments->tb_prefix = argv[++i];
|
||||||
} else if (strcmp(argv[i], "-N") == 0) {
|
} else if (strcmp(argv[i], "-N") == 0) {
|
||||||
arguments->use_metric = false;
|
arguments->use_metric = false;
|
||||||
|
} else if (strcmp(argv[i], "-M") == 0) {
|
||||||
|
arguments->demo_mode = false;
|
||||||
} else if (strcmp(argv[i], "-x") == 0) {
|
} else if (strcmp(argv[i], "-x") == 0) {
|
||||||
arguments->insert_only = false;
|
arguments->insert_only = false;
|
||||||
} else if (strcmp(argv[i], "-y") == 0) {
|
} else if (strcmp(argv[i], "-y") == 0) {
|
||||||
|
@ -1133,8 +1147,6 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool getInfoFromJsonFile(char* file);
|
|
||||||
static void init_rand_data();
|
|
||||||
static void tmfclose(FILE *fp) {
|
static void tmfclose(FILE *fp) {
|
||||||
if (NULL != fp) {
|
if (NULL != fp) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
@ -1231,7 +1243,8 @@ static void fetchResult(TAOS_RES *res, threadInfo* pThreadInfo) {
|
||||||
//printf("query result:%s\n", temp);
|
//printf("query result:%s\n", temp);
|
||||||
memcpy(databuf + totalLen, temp, len);
|
memcpy(databuf + totalLen, temp, len);
|
||||||
totalLen += len;
|
totalLen += len;
|
||||||
verbosePrint("%s() LN%d, totalLen: %"PRId64"\n", __func__, __LINE__, totalLen);
|
verbosePrint("%s() LN%d, totalLen: %"PRId64"\n",
|
||||||
|
__func__, __LINE__, totalLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
verbosePrint("%s() LN%d, databuf=%s resultFile=%s\n",
|
verbosePrint("%s() LN%d, databuf=%s resultFile=%s\n",
|
||||||
|
@ -1314,6 +1327,27 @@ static float rand_float(){
|
||||||
return randfloat[cursor];
|
return randfloat[cursor];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static float demo_current_float(){
|
||||||
|
static int cursor;
|
||||||
|
cursor++;
|
||||||
|
cursor = cursor % MAX_PREPARED_RAND;
|
||||||
|
return (float)(9.8 + 0.04 * (randint[cursor] % 10) + randfloat[cursor]/1000000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t demo_voltage_int(){
|
||||||
|
static int cursor;
|
||||||
|
cursor++;
|
||||||
|
cursor = cursor % MAX_PREPARED_RAND;
|
||||||
|
return 215 + randint[cursor] % 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
static float demo_phase_float(){
|
||||||
|
static int cursor;
|
||||||
|
cursor++;
|
||||||
|
cursor = cursor % MAX_PREPARED_RAND;
|
||||||
|
return (float)((115 + randint[cursor] % 10 + randfloat[cursor]/1000000000)/360);
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static const char charNum[] = "0123456789";
|
static const char charNum[] = "0123456789";
|
||||||
|
|
||||||
|
@ -1351,7 +1385,6 @@ static double rand_double() {
|
||||||
cursor++;
|
cursor++;
|
||||||
cursor = cursor % MAX_PREPARED_RAND;
|
cursor = cursor % MAX_PREPARED_RAND;
|
||||||
return randdouble[cursor];
|
return randdouble[cursor];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_rand_data() {
|
static void init_rand_data() {
|
||||||
|
@ -1386,6 +1419,11 @@ static void init_rand_data() {
|
||||||
static int printfInsertMeta() {
|
static int printfInsertMeta() {
|
||||||
SHOW_PARSE_RESULT_START();
|
SHOW_PARSE_RESULT_START();
|
||||||
|
|
||||||
|
if (g_args.demo_mode)
|
||||||
|
printf("\ntaosdemo is simulating data generated by power equipments monitoring...\n\n");
|
||||||
|
else
|
||||||
|
printf("\ntaosdemo is simulating random data as you request..\n\n");
|
||||||
|
|
||||||
printf("interface: \033[33m%s\033[0m\n",
|
printf("interface: \033[33m%s\033[0m\n",
|
||||||
(g_args.iface==TAOSC_IFACE)?"taosc":(g_args.iface==REST_IFACE)?"rest":"stmt");
|
(g_args.iface==TAOSC_IFACE)?"taosc":(g_args.iface==REST_IFACE)?"rest":"stmt");
|
||||||
printf("host: \033[33m%s:%u\033[0m\n",
|
printf("host: \033[33m%s:%u\033[0m\n",
|
||||||
|
@ -1943,7 +1981,8 @@ static int xDumpResultToFile(const char* fname, TAOS_RES* tres) {
|
||||||
|
|
||||||
FILE* fp = fopen(fname, "at");
|
FILE* fp = fopen(fname, "at");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
errorPrint("%s() LN%d, failed to open file: %s\n", __func__, __LINE__, fname);
|
errorPrint("%s() LN%d, failed to open file: %s\n",
|
||||||
|
__func__, __LINE__, fname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1966,7 +2005,8 @@ static int xDumpResultToFile(const char* fname, TAOS_RES* tres) {
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
fputc(',', fp);
|
fputc(',', fp);
|
||||||
}
|
}
|
||||||
xDumpFieldToFile(fp, (const char*)row[i], fields +i, length[i], precision);
|
xDumpFieldToFile(fp,
|
||||||
|
(const char*)row[i], fields +i, length[i], precision);
|
||||||
}
|
}
|
||||||
fputc('\n', fp);
|
fputc('\n', fp);
|
||||||
|
|
||||||
|
@ -1988,7 +2028,8 @@ static int getDbFromServer(TAOS * taos, SDbInfo** dbInfos) {
|
||||||
int32_t code = taos_errno(res);
|
int32_t code = taos_errno(res);
|
||||||
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
errorPrint( "failed to run <show databases>, reason: %s\n", taos_errstr(res));
|
errorPrint( "failed to run <show databases>, reason: %s\n",
|
||||||
|
taos_errstr(res));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2318,8 +2359,10 @@ static char* generateTagVaulesForStb(SSuperTable* stbInfo, int32_t tableSeq) {
|
||||||
int dataLen = 0;
|
int dataLen = 0;
|
||||||
dataLen += snprintf(dataBuf + dataLen, TSDB_MAX_SQL_LEN - dataLen, "(");
|
dataLen += snprintf(dataBuf + dataLen, TSDB_MAX_SQL_LEN - dataLen, "(");
|
||||||
for (int i = 0; i < stbInfo->tagCount; i++) {
|
for (int i = 0; i < stbInfo->tagCount; i++) {
|
||||||
if ((0 == strncasecmp(stbInfo->tags[i].dataType, "binary", strlen("binary")))
|
if ((0 == strncasecmp(stbInfo->tags[i].dataType,
|
||||||
|| (0 == strncasecmp(stbInfo->tags[i].dataType, "nchar", strlen("nchar")))) {
|
"binary", strlen("binary")))
|
||||||
|
|| (0 == strncasecmp(stbInfo->tags[i].dataType,
|
||||||
|
"nchar", strlen("nchar")))) {
|
||||||
if (stbInfo->tags[i].dataLen > TSDB_MAX_BINARY_LEN) {
|
if (stbInfo->tags[i].dataLen > TSDB_MAX_BINARY_LEN) {
|
||||||
printf("binary or nchar length overflow, max size:%u\n",
|
printf("binary or nchar length overflow, max size:%u\n",
|
||||||
(uint32_t)TSDB_MAX_BINARY_LEN);
|
(uint32_t)TSDB_MAX_BINARY_LEN);
|
||||||
|
@ -2664,13 +2707,20 @@ static int createSuperTable(
|
||||||
superTbl->columns[colIndex].dataLen);
|
superTbl->columns[colIndex].dataLen);
|
||||||
lenOfOneRow += superTbl->columns[colIndex].dataLen + 3;
|
lenOfOneRow += superTbl->columns[colIndex].dataLen + 3;
|
||||||
} else if (strcasecmp(dataType, "INT") == 0) {
|
} else if (strcasecmp(dataType, "INT") == 0) {
|
||||||
|
if ((g_args.demo_mode) && (colIndex == 1)) {
|
||||||
|
len += snprintf(cols + len, STRING_LEN - len,
|
||||||
|
", VOLTAGE INT");
|
||||||
|
} else {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "INT");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "INT");
|
||||||
|
}
|
||||||
lenOfOneRow += 11;
|
lenOfOneRow += 11;
|
||||||
} else if (strcasecmp(dataType, "BIGINT") == 0) {
|
} else if (strcasecmp(dataType, "BIGINT") == 0) {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "BIGINT");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s",
|
||||||
|
colIndex, "BIGINT");
|
||||||
lenOfOneRow += 21;
|
lenOfOneRow += 21;
|
||||||
} else if (strcasecmp(dataType, "SMALLINT") == 0) {
|
} else if (strcasecmp(dataType, "SMALLINT") == 0) {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "SMALLINT");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s",
|
||||||
|
colIndex, "SMALLINT");
|
||||||
lenOfOneRow += 6;
|
lenOfOneRow += 6;
|
||||||
} else if (strcasecmp(dataType, "TINYINT") == 0) {
|
} else if (strcasecmp(dataType, "TINYINT") == 0) {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "TINYINT");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "TINYINT");
|
||||||
|
@ -2679,13 +2729,24 @@ static int createSuperTable(
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "BOOL");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "BOOL");
|
||||||
lenOfOneRow += 6;
|
lenOfOneRow += 6;
|
||||||
} else if (strcasecmp(dataType, "FLOAT") == 0) {
|
} else if (strcasecmp(dataType, "FLOAT") == 0) {
|
||||||
|
if (g_args.demo_mode) {
|
||||||
|
if (colIndex == 0) {
|
||||||
|
len += snprintf(cols + len, STRING_LEN - len, ", CURRENT FLOAT");
|
||||||
|
} else if (colIndex == 2) {
|
||||||
|
len += snprintf(cols + len, STRING_LEN - len, ", PHASE FLOAT");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "FLOAT");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "FLOAT");
|
||||||
|
}
|
||||||
|
|
||||||
lenOfOneRow += 22;
|
lenOfOneRow += 22;
|
||||||
} else if (strcasecmp(dataType, "DOUBLE") == 0) {
|
} else if (strcasecmp(dataType, "DOUBLE") == 0) {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "DOUBLE");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s",
|
||||||
|
colIndex, "DOUBLE");
|
||||||
lenOfOneRow += 42;
|
lenOfOneRow += 42;
|
||||||
} else if (strcasecmp(dataType, "TIMESTAMP") == 0) {
|
} else if (strcasecmp(dataType, "TIMESTAMP") == 0) {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s", colIndex, "TIMESTAMP");
|
len += snprintf(cols + len, STRING_LEN - len, ", col%d %s",
|
||||||
|
colIndex, "TIMESTAMP");
|
||||||
lenOfOneRow += 21;
|
lenOfOneRow += 21;
|
||||||
} else {
|
} else {
|
||||||
taos_close(taos);
|
taos_close(taos);
|
||||||
|
@ -2696,7 +2757,6 @@ static int createSuperTable(
|
||||||
}
|
}
|
||||||
|
|
||||||
superTbl->lenOfOneRow = lenOfOneRow + 20; // timestamp
|
superTbl->lenOfOneRow = lenOfOneRow + 20; // timestamp
|
||||||
//printf("%s.%s column count:%d, column length:%d\n\n", g_Dbs.db[i].dbName, g_Dbs.db[i].superTbl[j].sTblName, g_Dbs.db[i].superTbl[j].columnCount, lenOfOneRow);
|
|
||||||
|
|
||||||
// save for creating child table
|
// save for creating child table
|
||||||
superTbl->colsOfCreateChildTable = (char*)calloc(len+20, 1);
|
superTbl->colsOfCreateChildTable = (char*)calloc(len+20, 1);
|
||||||
|
@ -4746,7 +4806,8 @@ static void postFreeResource() {
|
||||||
|
|
||||||
static int getRowDataFromSample(
|
static int getRowDataFromSample(
|
||||||
char* dataBuf, int64_t maxLen, int64_t timestamp,
|
char* dataBuf, int64_t maxLen, int64_t timestamp,
|
||||||
SSuperTable* superTblInfo, int64_t* sampleUsePos) {
|
SSuperTable* superTblInfo, int64_t* sampleUsePos)
|
||||||
|
{
|
||||||
if ((*sampleUsePos) == MAX_SAMPLES_ONCE_FROM_FILE) {
|
if ((*sampleUsePos) == MAX_SAMPLES_ONCE_FROM_FILE) {
|
||||||
/* int ret = readSampleFromCsvFileToMem(superTblInfo);
|
/* int ret = readSampleFromCsvFileToMem(superTblInfo);
|
||||||
if (0 != ret) {
|
if (0 != ret) {
|
||||||
|
@ -4763,7 +4824,9 @@ static int getRowDataFromSample(
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
||||||
"(%" PRId64 ", ", timestamp);
|
"(%" PRId64 ", ", timestamp);
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
||||||
"%s", superTblInfo->sampleDataBuf + superTblInfo->lenOfOneRow * (*sampleUsePos));
|
"%s",
|
||||||
|
superTblInfo->sampleDataBuf
|
||||||
|
+ superTblInfo->lenOfOneRow * (*sampleUsePos));
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, ")");
|
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, ")");
|
||||||
|
|
||||||
(*sampleUsePos)++;
|
(*sampleUsePos)++;
|
||||||
|
@ -4803,16 +4866,31 @@ static int64_t generateStbRowData(
|
||||||
tmfree(buf);
|
tmfree(buf);
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"INT", strlen("INT"))) {
|
"INT", strlen("INT"))) {
|
||||||
|
if ((g_args.demo_mode) && (i == 1)) {
|
||||||
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
|
"%d,", demo_voltage_int());
|
||||||
|
} else {
|
||||||
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
"%d,", rand_int());
|
"%d,", rand_int());
|
||||||
|
}
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"BIGINT", strlen("BIGINT"))) {
|
"BIGINT", strlen("BIGINT"))) {
|
||||||
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
"%"PRId64",", rand_bigint());
|
"%"PRId64",", rand_bigint());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"FLOAT", strlen("FLOAT"))) {
|
"FLOAT", strlen("FLOAT"))) {
|
||||||
|
if (g_args.demo_mode) {
|
||||||
|
if (i == 0) {
|
||||||
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
|
"%f,", demo_current_float());
|
||||||
|
} else {
|
||||||
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
|
"%f,", demo_phase_float());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
"%f,", rand_float());
|
"%f,", rand_float());
|
||||||
|
}
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"DOUBLE", strlen("DOUBLE"))) {
|
"DOUBLE", strlen("DOUBLE"))) {
|
||||||
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
|
@ -6008,8 +6086,10 @@ static void* syncWriteInterlace(threadInfo *pThreadInfo) {
|
||||||
errorPrint("[%d] %s() LN%d Failed to insert records of batch %d\n",
|
errorPrint("[%d] %s() LN%d Failed to insert records of batch %d\n",
|
||||||
pThreadInfo->threadID, __func__, __LINE__,
|
pThreadInfo->threadID, __func__, __LINE__,
|
||||||
batchPerTbl);
|
batchPerTbl);
|
||||||
|
if (batchPerTbl > 0) {
|
||||||
errorPrint("\tIf the batch is %d, the length of the SQL to insert a row must be less then %"PRId64"\n",
|
errorPrint("\tIf the batch is %d, the length of the SQL to insert a row must be less then %"PRId64"\n",
|
||||||
batchPerTbl, maxSqlLen / batchPerTbl);
|
batchPerTbl, maxSqlLen / batchPerTbl);
|
||||||
|
}
|
||||||
errorPrint("\tPlease check if the buffer length(%"PRId64") or batch(%d) is set with proper value!\n",
|
errorPrint("\tPlease check if the buffer length(%"PRId64") or batch(%d) is set with proper value!\n",
|
||||||
maxSqlLen, batchPerTbl);
|
maxSqlLen, batchPerTbl);
|
||||||
goto free_of_interlace;
|
goto free_of_interlace;
|
||||||
|
|
|
@ -124,6 +124,9 @@ typedef struct {
|
||||||
|
|
||||||
extern char version[];
|
extern char version[];
|
||||||
|
|
||||||
|
#define DB_PRECISION_LEN 8
|
||||||
|
#define DB_STATUS_LEN 16
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char name[TSDB_DB_NAME_LEN];
|
char name[TSDB_DB_NAME_LEN];
|
||||||
char create_time[32];
|
char create_time[32];
|
||||||
|
@ -144,9 +147,9 @@ typedef struct {
|
||||||
int32_t fsync;
|
int32_t fsync;
|
||||||
int8_t comp;
|
int8_t comp;
|
||||||
int8_t cachelast;
|
int8_t cachelast;
|
||||||
char precision[8]; // time resolution
|
char precision[DB_PRECISION_LEN]; // time resolution
|
||||||
int8_t update;
|
int8_t update;
|
||||||
char status[16];
|
char status[DB_STATUS_LEN];
|
||||||
} SDbInfo;
|
} SDbInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -542,7 +545,8 @@ static void parse_precision_first(
|
||||||
free(tmp);
|
free(tmp);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
strncpy(g_args.precision, tmp, strlen(tmp));
|
strncpy(g_args.precision, tmp,
|
||||||
|
min(DB_PRECISION_LEN - 1, strlen(tmp)));
|
||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ typedef struct SResultRowInfo {
|
||||||
int16_t type:8; // data type for hash key
|
int16_t type:8; // data type for hash key
|
||||||
int32_t size:24; // number of result set
|
int32_t size:24; // number of result set
|
||||||
int32_t capacity; // max capacity
|
int32_t capacity; // max capacity
|
||||||
SResultRow* current; // current active result row
|
int32_t curPos; // current active result row index of pResult list
|
||||||
} SResultRowInfo;
|
} SResultRowInfo;
|
||||||
|
|
||||||
typedef struct SColumnFilterElem {
|
typedef struct SColumnFilterElem {
|
||||||
|
@ -423,7 +423,7 @@ typedef struct STagScanInfo {
|
||||||
SColumnInfo* pCols;
|
SColumnInfo* pCols;
|
||||||
SSDataBlock* pRes;
|
SSDataBlock* pRes;
|
||||||
int32_t totalTables;
|
int32_t totalTables;
|
||||||
int32_t currentIndex;
|
int32_t curPos;
|
||||||
} STagScanInfo;
|
} STagScanInfo;
|
||||||
|
|
||||||
typedef struct SOptrBasicInfo {
|
typedef struct SOptrBasicInfo {
|
||||||
|
|
|
@ -303,11 +303,13 @@ alter_db_optr(Y) ::= alter_db_optr(Z) quorum(X). { Y = Z; Y.quorum = strtol
|
||||||
alter_db_optr(Y) ::= alter_db_optr(Z) keep(X). { Y = Z; Y.keep = X; }
|
alter_db_optr(Y) ::= alter_db_optr(Z) keep(X). { Y = Z; Y.keep = X; }
|
||||||
alter_db_optr(Y) ::= alter_db_optr(Z) blocks(X). { Y = Z; Y.numOfBlocks = strtol(X.z, NULL, 10); }
|
alter_db_optr(Y) ::= alter_db_optr(Z) blocks(X). { Y = Z; Y.numOfBlocks = strtol(X.z, NULL, 10); }
|
||||||
alter_db_optr(Y) ::= alter_db_optr(Z) comp(X). { Y = Z; Y.compressionLevel = strtol(X.z, NULL, 10); }
|
alter_db_optr(Y) ::= alter_db_optr(Z) comp(X). { Y = Z; Y.compressionLevel = strtol(X.z, NULL, 10); }
|
||||||
alter_db_optr(Y) ::= alter_db_optr(Z) wal(X). { Y = Z; Y.walLevel = strtol(X.z, NULL, 10); }
|
|
||||||
alter_db_optr(Y) ::= alter_db_optr(Z) fsync(X). { Y = Z; Y.fsyncPeriod = strtol(X.z, NULL, 10); }
|
|
||||||
alter_db_optr(Y) ::= alter_db_optr(Z) update(X). { Y = Z; Y.update = strtol(X.z, NULL, 10); }
|
alter_db_optr(Y) ::= alter_db_optr(Z) update(X). { Y = Z; Y.update = strtol(X.z, NULL, 10); }
|
||||||
alter_db_optr(Y) ::= alter_db_optr(Z) cachelast(X). { Y = Z; Y.cachelast = strtol(X.z, NULL, 10); }
|
alter_db_optr(Y) ::= alter_db_optr(Z) cachelast(X). { Y = Z; Y.cachelast = strtol(X.z, NULL, 10); }
|
||||||
|
|
||||||
|
// dynamically update the following two parameters are not allowed.
|
||||||
|
//alter_db_optr(Y) ::= alter_db_optr(Z) fsync(X). { Y = Z; Y.fsyncPeriod = strtol(X.z, NULL, 10); }
|
||||||
|
//alter_db_optr(Y) ::= alter_db_optr(Z) wal(X). { Y = Z; Y.walLevel = strtol(X.z, NULL, 10); } not support yet
|
||||||
|
|
||||||
%type alter_topic_optr {SCreateDbInfo}
|
%type alter_topic_optr {SCreateDbInfo}
|
||||||
|
|
||||||
alter_topic_optr(Y) ::= alter_db_optr(Z). { Y = Z; Y.dbType = TSDB_DB_TYPE_TOPIC; }
|
alter_topic_optr(Y) ::= alter_db_optr(Z). { Y = Z; Y.dbType = TSDB_DB_TYPE_TOPIC; }
|
||||||
|
|
|
@ -1758,6 +1758,49 @@ static void valuePairAssign(tValuePair *dst, int16_t type, const char *val, int6
|
||||||
memcpy((dst)->pTags, (src)->pTags, (size_t)(__l)); \
|
memcpy((dst)->pTags, (src)->pTags, (size_t)(__l)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
static int32_t topBotComparFn(const void *p1, const void *p2, const void *param)
|
||||||
|
{
|
||||||
|
uint16_t type = *(uint16_t *) param;
|
||||||
|
tValuePair *val1 = *(tValuePair **) p1;
|
||||||
|
tValuePair *val2 = *(tValuePair **) p2;
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (val1->v.i64 == val2->v.i64) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val1->v.i64 > val2->v.i64) ? 1 : -1;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (val1->v.u64 == val2->v.u64) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val1->v.u64 > val2->v.u64) ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val1->v.dKey == val2->v.dKey) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val1->v.dKey > val2->v.dKey) ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void topBotSwapFn(void *dst, void *src, const void *param)
|
||||||
|
{
|
||||||
|
char tag[32768];
|
||||||
|
tValuePair temp;
|
||||||
|
uint16_t tagLen = *(uint16_t *) param;
|
||||||
|
tValuePair *vdst = *(tValuePair **) dst;
|
||||||
|
tValuePair *vsrc = *(tValuePair **) src;
|
||||||
|
|
||||||
|
memset(tag, 0, sizeof(tag));
|
||||||
|
temp.pTags = tag;
|
||||||
|
|
||||||
|
VALUEPAIRASSIGN(&temp, vdst, tagLen);
|
||||||
|
VALUEPAIRASSIGN(vdst, vsrc, tagLen);
|
||||||
|
VALUEPAIRASSIGN(vsrc, &temp, tagLen);
|
||||||
|
}
|
||||||
|
|
||||||
static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData, int64_t ts, uint16_t type,
|
static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData, int64_t ts, uint16_t type,
|
||||||
SExtTagsInfo *pTagInfo, char *pTags, int16_t stage) {
|
SExtTagsInfo *pTagInfo, char *pTags, int16_t stage) {
|
||||||
tVariant val = {0};
|
tVariant val = {0};
|
||||||
|
@ -1767,59 +1810,17 @@ static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData,
|
||||||
assert(pList != NULL);
|
assert(pList != NULL);
|
||||||
|
|
||||||
if (pInfo->num < maxLen) {
|
if (pInfo->num < maxLen) {
|
||||||
if (pInfo->num == 0 ||
|
|
||||||
(IS_SIGNED_NUMERIC_TYPE(type) && val.i64 >= pList[pInfo->num - 1]->v.i64) ||
|
|
||||||
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 >= pList[pInfo->num - 1]->v.u64) ||
|
|
||||||
(IS_FLOAT_TYPE(type) && val.dKey >= pList[pInfo->num - 1]->v.dKey)) {
|
|
||||||
valuePairAssign(pList[pInfo->num], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
valuePairAssign(pList[pInfo->num], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
||||||
} else {
|
|
||||||
int32_t i = pInfo->num - 1;
|
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
|
||||||
while (i >= 0 && pList[i]->v.i64 > val.i64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
|
||||||
i -= 1;
|
|
||||||
}
|
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
|
||||||
while (i >= 0 && pList[i]->v.u64 > val.u64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
|
||||||
i -= 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (i >= 0 && pList[i]->v.dKey > val.dKey) {
|
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
|
||||||
i -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
valuePairAssign(pList[i + 1], type, (const char*) &val.i64, ts, pTags, pTagInfo, stage);
|
taosheapsort((void *) pList, sizeof(tValuePair **), pInfo->num + 1, (const void *) &type, topBotComparFn, (const void *) &pTagInfo->tagsLen, topBotSwapFn, 0);
|
||||||
}
|
|
||||||
|
|
||||||
pInfo->num++;
|
pInfo->num++;
|
||||||
} else {
|
} else {
|
||||||
int32_t i = 0;
|
|
||||||
|
|
||||||
if ((IS_SIGNED_NUMERIC_TYPE(type) && val.i64 > pList[0]->v.i64) ||
|
if ((IS_SIGNED_NUMERIC_TYPE(type) && val.i64 > pList[0]->v.i64) ||
|
||||||
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 > pList[0]->v.u64) ||
|
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 > pList[0]->v.u64) ||
|
||||||
(IS_FLOAT_TYPE(type) && val.dKey > pList[0]->v.dKey)) {
|
(IS_FLOAT_TYPE(type) && val.dKey > pList[0]->v.dKey)) {
|
||||||
// find the appropriate the slot position
|
valuePairAssign(pList[0], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
taosheapadjust((void *) pList, sizeof(tValuePair **), 0, maxLen - 1, (const void *) &type, topBotComparFn, (const void *) &pTagInfo->tagsLen, topBotSwapFn, 0);
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.i64 < val.i64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
} if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.u64 < val.u64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.dKey < val.dKey) {
|
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
valuePairAssign(pList[i], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1833,57 +1834,17 @@ static void do_bottom_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pDa
|
||||||
assert(pList != NULL);
|
assert(pList != NULL);
|
||||||
|
|
||||||
if (pInfo->num < maxLen) {
|
if (pInfo->num < maxLen) {
|
||||||
if (pInfo->num == 0) {
|
|
||||||
valuePairAssign(pList[pInfo->num], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
valuePairAssign(pList[pInfo->num], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
||||||
} else {
|
|
||||||
int32_t i = pInfo->num - 1;
|
|
||||||
|
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
taosheapsort((void *) pList, sizeof(tValuePair **), pInfo->num + 1, (const void *) &type, topBotComparFn, (const void *) &pTagInfo->tagsLen, topBotSwapFn, 1);
|
||||||
while (i >= 0 && pList[i]->v.i64 < val.i64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
|
||||||
i -= 1;
|
|
||||||
}
|
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
|
||||||
while (i >= 0 && pList[i]->v.u64 < val.u64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
|
||||||
i -= 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (i >= 0 && pList[i]->v.dKey < val.dKey) {
|
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
|
||||||
i -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
valuePairAssign(pList[i + 1], type, (const char*)&val.i64, ts, pTags, pTagInfo, stage);
|
|
||||||
}
|
|
||||||
|
|
||||||
pInfo->num++;
|
pInfo->num++;
|
||||||
} else {
|
} else {
|
||||||
int32_t i = 0;
|
|
||||||
|
|
||||||
if ((IS_SIGNED_NUMERIC_TYPE(type) && val.i64 < pList[0]->v.i64) ||
|
if ((IS_SIGNED_NUMERIC_TYPE(type) && val.i64 < pList[0]->v.i64) ||
|
||||||
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 < pList[0]->v.u64) ||
|
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 < pList[0]->v.u64) ||
|
||||||
(IS_FLOAT_TYPE(type) && val.dKey < pList[0]->v.dKey)) {
|
(IS_FLOAT_TYPE(type) && val.dKey < pList[0]->v.dKey)) {
|
||||||
// find the appropriate the slot position
|
valuePairAssign(pList[0], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
taosheapadjust((void *) pList, sizeof(tValuePair **), 0, maxLen - 1, (const void *) &type, topBotComparFn, (const void *) &pTagInfo->tagsLen, topBotSwapFn, 1);
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.i64 > val.i64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
} if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.u64 > val.u64) {
|
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.dKey > val.dKey) {
|
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
valuePairAssign(pList[i], type, (const char*)&val.i64, ts, pTags, pTagInfo, stage);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -411,8 +411,8 @@ static void prepareResultListBuffer(SResultRowInfo* pResultRowInfo, SQueryRuntim
|
||||||
pResultRowInfo->capacity = (int32_t)newCapacity;
|
pResultRowInfo->capacity = (int32_t)newCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, int64_t tid, char *pData,
|
static SResultRow* doSetResultOutBufByKey(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pResultRowInfo, int64_t tid,
|
||||||
int16_t bytes, bool masterscan, uint64_t tableGroupId) {
|
char* pData, int16_t bytes, bool masterscan, uint64_t tableGroupId) {
|
||||||
bool existed = false;
|
bool existed = false;
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, tableGroupId);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, tableGroupId);
|
||||||
|
|
||||||
|
@ -426,16 +426,21 @@ static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SRes
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p1 != NULL) {
|
if (p1 != NULL) {
|
||||||
pResultRowInfo->current = (*p1);
|
|
||||||
|
|
||||||
if (pResultRowInfo->size == 0) {
|
if (pResultRowInfo->size == 0) {
|
||||||
existed = false;
|
existed = false;
|
||||||
|
assert(pResultRowInfo->curPos == -1);
|
||||||
} else if (pResultRowInfo->size == 1) {
|
} else if (pResultRowInfo->size == 1) {
|
||||||
existed = (pResultRowInfo->pResult[0] == (*p1));
|
existed = (pResultRowInfo->pResult[0] == (*p1));
|
||||||
|
pResultRowInfo->curPos = 0;
|
||||||
} else { // check if current pResultRowInfo contains the existed pResultRow
|
} else { // check if current pResultRowInfo contains the existed pResultRow
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, tid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, tid);
|
||||||
void* ptr = taosHashGet(pRuntimeEnv->pResultRowListSet, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
|
int64_t* index = taosHashGet(pRuntimeEnv->pResultRowListSet, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
|
||||||
existed = (ptr != NULL);
|
if (index != NULL) {
|
||||||
|
pResultRowInfo->curPos = (int32_t) *index;
|
||||||
|
existed = true;
|
||||||
|
} else {
|
||||||
|
existed = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -462,12 +467,12 @@ static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SRes
|
||||||
pResult = *p1;
|
pResult = *p1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pResultRowInfo->curPos = pResultRowInfo->size;
|
||||||
pResultRowInfo->pResult[pResultRowInfo->size++] = pResult;
|
pResultRowInfo->pResult[pResultRowInfo->size++] = pResult;
|
||||||
pResultRowInfo->current = pResult;
|
|
||||||
|
|
||||||
int64_t dummyVal = 0;
|
int64_t index = pResultRowInfo->curPos;
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, tid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, tid);
|
||||||
taosHashPut(pRuntimeEnv->pResultRowListSet, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), &dummyVal, POINTER_BYTES);
|
taosHashPut(pRuntimeEnv->pResultRowListSet, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), &index, POINTER_BYTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
// too many time window in query
|
// too many time window in query
|
||||||
|
@ -475,7 +480,7 @@ static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SRes
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_TOO_MANY_TIMEWINDOW);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_TOO_MANY_TIMEWINDOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pResultRowInfo->current;
|
return pResultRowInfo->pResult[pResultRowInfo->curPos];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getInitialStartTimeWindow(SQueryAttr* pQueryAttr, TSKEY ts, STimeWindow* w) {
|
static void getInitialStartTimeWindow(SQueryAttr* pQueryAttr, TSKEY ts, STimeWindow* w) {
|
||||||
|
@ -506,13 +511,8 @@ static void getInitialStartTimeWindow(SQueryAttr* pQueryAttr, TSKEY ts, STimeWin
|
||||||
static STimeWindow getActiveTimeWindow(SResultRowInfo * pResultRowInfo, int64_t ts, SQueryAttr *pQueryAttr) {
|
static STimeWindow getActiveTimeWindow(SResultRowInfo * pResultRowInfo, int64_t ts, SQueryAttr *pQueryAttr) {
|
||||||
STimeWindow w = {0};
|
STimeWindow w = {0};
|
||||||
|
|
||||||
if (pResultRowInfo->current == NULL) { // the first window, from the previous stored value
|
if (pResultRowInfo->curPos == -1) { // the first window, from the previous stored value
|
||||||
// if (pResultRowInfo->prevSKey == TSKEY_INITIAL_VAL) {
|
|
||||||
getInitialStartTimeWindow(pQueryAttr, ts, &w);
|
getInitialStartTimeWindow(pQueryAttr, ts, &w);
|
||||||
// pResultRowInfo->prevSKey = w.skey;
|
|
||||||
// } else {
|
|
||||||
// w.skey = pResultRowInfo->prevSKey;
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (pQueryAttr->interval.intervalUnit == 'n' || pQueryAttr->interval.intervalUnit == 'y') {
|
if (pQueryAttr->interval.intervalUnit == 'n' || pQueryAttr->interval.intervalUnit == 'y') {
|
||||||
w.ekey = taosTimeAdd(w.skey, pQueryAttr->interval.interval, pQueryAttr->interval.intervalUnit, pQueryAttr->precision) - 1;
|
w.ekey = taosTimeAdd(w.skey, pQueryAttr->interval.interval, pQueryAttr->interval.intervalUnit, pQueryAttr->precision) - 1;
|
||||||
|
@ -520,7 +520,7 @@ static STimeWindow getActiveTimeWindow(SResultRowInfo * pResultRowInfo, int64_t
|
||||||
w.ekey = w.skey + pQueryAttr->interval.interval - 1;
|
w.ekey = w.skey + pQueryAttr->interval.interval - 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
w = pResultRowInfo->current->win;
|
w = getResultRow(pResultRowInfo, pResultRowInfo->curPos)->win;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w.skey > ts || w.ekey < ts) {
|
if (w.skey > ts || w.ekey < ts) {
|
||||||
|
@ -600,13 +600,13 @@ static int32_t addNewWindowResultBuf(SResultRow *pWindowRes, SDiskbasedResultBuf
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t setWindowOutputBufByKey(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, int64_t tid, STimeWindow *win,
|
static int32_t setResultOutputBufByKey(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, int64_t tid, STimeWindow *win,
|
||||||
bool masterscan, SResultRow **pResult, int64_t tableGroupId, SQLFunctionCtx* pCtx,
|
bool masterscan, SResultRow **pResult, int64_t tableGroupId, SQLFunctionCtx* pCtx,
|
||||||
int32_t numOfOutput, int32_t* rowCellInfoOffset) {
|
int32_t numOfOutput, int32_t* rowCellInfoOffset) {
|
||||||
assert(win->skey <= win->ekey);
|
assert(win->skey <= win->ekey);
|
||||||
SDiskbasedResultBuf *pResultBuf = pRuntimeEnv->pResultBuf;
|
SDiskbasedResultBuf *pResultBuf = pRuntimeEnv->pResultBuf;
|
||||||
|
|
||||||
SResultRow *pResultRow = doPrepareResultRowFromKey(pRuntimeEnv, pResultRowInfo, tid, (char *)&win->skey, TSDB_KEYSIZE, masterscan, tableGroupId);
|
SResultRow *pResultRow = doSetResultOutBufByKey(pRuntimeEnv, pResultRowInfo, tid, (char *)&win->skey, TSDB_KEYSIZE, masterscan, tableGroupId);
|
||||||
if (pResultRow == NULL) {
|
if (pResultRow == NULL) {
|
||||||
*pResult = NULL;
|
*pResult = NULL;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -707,9 +707,10 @@ static void doUpdateResultRowIndex(SResultRowInfo*pResultRowInfo, TSKEY lastKey,
|
||||||
if (skey == TSKEY_INITIAL_VAL) {
|
if (skey == TSKEY_INITIAL_VAL) {
|
||||||
if (pResultRowInfo->size == 0) {
|
if (pResultRowInfo->size == 0) {
|
||||||
// assert(pResultRowInfo->current == NULL);
|
// assert(pResultRowInfo->current == NULL);
|
||||||
pResultRowInfo->current = NULL;
|
assert(pResultRowInfo->curPos == -1);
|
||||||
|
pResultRowInfo->curPos = -1;
|
||||||
} else {
|
} else {
|
||||||
pResultRowInfo->current = pResultRowInfo->pResult[pResultRowInfo->size - 1];
|
pResultRowInfo->curPos = pResultRowInfo->size - 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -721,9 +722,9 @@ static void doUpdateResultRowIndex(SResultRowInfo*pResultRowInfo, TSKEY lastKey,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == pResultRowInfo->size - 1) {
|
if (i == pResultRowInfo->size - 1) {
|
||||||
pResultRowInfo->current = pResultRowInfo->pResult[i];
|
pResultRowInfo->curPos = i;
|
||||||
} else {
|
} else {
|
||||||
pResultRowInfo->current = pResultRowInfo->pResult[i + 1]; // current not closed result object
|
pResultRowInfo->curPos = i + 1; // current not closed result object
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -732,7 +733,7 @@ static void updateResultRowInfoActiveIndex(SResultRowInfo* pResultRowInfo, SQuer
|
||||||
bool ascQuery = QUERY_IS_ASC_QUERY(pQueryAttr);
|
bool ascQuery = QUERY_IS_ASC_QUERY(pQueryAttr);
|
||||||
if ((lastKey > pQueryAttr->window.ekey && ascQuery) || (lastKey < pQueryAttr->window.ekey && (!ascQuery))) {
|
if ((lastKey > pQueryAttr->window.ekey && ascQuery) || (lastKey < pQueryAttr->window.ekey && (!ascQuery))) {
|
||||||
closeAllResultRows(pResultRowInfo);
|
closeAllResultRows(pResultRowInfo);
|
||||||
pResultRowInfo->current = pResultRowInfo->pResult[pResultRowInfo->size - 1];
|
pResultRowInfo->curPos = pResultRowInfo->size - 1;
|
||||||
} else {
|
} else {
|
||||||
int32_t step = ascQuery ? 1 : -1;
|
int32_t step = ascQuery ? 1 : -1;
|
||||||
doUpdateResultRowIndex(pResultRowInfo, lastKey - step, ascQuery, pQueryAttr->timeWindowInterpo);
|
doUpdateResultRowIndex(pResultRowInfo, lastKey - step, ascQuery, pQueryAttr->timeWindowInterpo);
|
||||||
|
@ -1241,7 +1242,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
||||||
int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQueryAttr->order.order);
|
int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQueryAttr->order.order);
|
||||||
bool ascQuery = QUERY_IS_ASC_QUERY(pQueryAttr);
|
bool ascQuery = QUERY_IS_ASC_QUERY(pQueryAttr);
|
||||||
|
|
||||||
SResultRow* prevRow = pResultRowInfo->current;
|
int32_t prevIndex = pResultRowInfo->curPos;
|
||||||
|
|
||||||
TSKEY* tsCols = NULL;
|
TSKEY* tsCols = NULL;
|
||||||
if (pSDataBlock->pDataBlock != NULL) {
|
if (pSDataBlock->pDataBlock != NULL) {
|
||||||
|
@ -1258,7 +1259,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
||||||
bool masterScan = IS_MASTER_SCAN(pRuntimeEnv);
|
bool masterScan = IS_MASTER_SCAN(pRuntimeEnv);
|
||||||
|
|
||||||
SResultRow* pResult = NULL;
|
SResultRow* pResult = NULL;
|
||||||
int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &win, masterScan, &pResult, tableGroupId, pInfo->pCtx,
|
int32_t ret = setResultOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &win, masterScan, &pResult, tableGroupId, pInfo->pCtx,
|
||||||
numOfOutput, pInfo->rowCellInfoOffset);
|
numOfOutput, pInfo->rowCellInfoOffset);
|
||||||
if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
|
if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
@ -1270,25 +1271,17 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
||||||
getNumOfRowsInTimeWindow(pRuntimeEnv, &pSDataBlock->info, tsCols, startPos, ekey, binarySearchForKey, true);
|
getNumOfRowsInTimeWindow(pRuntimeEnv, &pSDataBlock->info, tsCols, startPos, ekey, binarySearchForKey, true);
|
||||||
|
|
||||||
// prev time window not interpolation yet.
|
// prev time window not interpolation yet.
|
||||||
// int32_t curIndex = curTimeWindowIndex(pResultRowInfo);
|
int32_t curIndex = pResultRowInfo->curPos;
|
||||||
// if (prevIndex != -1 && prevIndex < curIndex && pQueryAttr->timeWindowInterpo) {
|
if (prevIndex != -1 && prevIndex < curIndex && pQueryAttr->timeWindowInterpo) {
|
||||||
// for (int32_t j = prevIndex; j < curIndex; ++j) { // previous time window may be all closed already.
|
for (int32_t j = prevIndex; j < curIndex; ++j) { // previous time window may be all closed already.
|
||||||
if (prevRow != NULL && prevRow != pResultRowInfo->current && pQueryAttr->timeWindowInterpo) {
|
SResultRow* pRes = getResultRow(pResultRowInfo, j);
|
||||||
int32_t j = 0;
|
|
||||||
while(pResultRowInfo->pResult[j] != prevRow) {
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
|
|
||||||
SResultRow* current = pResultRowInfo->current;
|
|
||||||
for(; pResultRowInfo->pResult[j] != current && j < pResultRowInfo->size; ++j) {
|
|
||||||
SResultRow* pRes = pResultRowInfo->pResult[j];
|
|
||||||
if (pRes->closed) {
|
if (pRes->closed) {
|
||||||
assert(resultRowInterpolated(pRes, RESULT_ROW_START_INTERP) && resultRowInterpolated(pRes, RESULT_ROW_END_INTERP));
|
assert(resultRowInterpolated(pRes, RESULT_ROW_START_INTERP) && resultRowInterpolated(pRes, RESULT_ROW_END_INTERP));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
STimeWindow w = pRes->win;
|
STimeWindow w = pRes->win;
|
||||||
ret = setWindowOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &w, masterScan, &pResult,
|
ret = setResultOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &w, masterScan, &pResult,
|
||||||
tableGroupId, pInfo->pCtx, numOfOutput, pInfo->rowCellInfoOffset);
|
tableGroupId, pInfo->pCtx, numOfOutput, pInfo->rowCellInfoOffset);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
@ -1306,7 +1299,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
||||||
}
|
}
|
||||||
|
|
||||||
// restore current time window
|
// restore current time window
|
||||||
ret = setWindowOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &win, masterScan, &pResult, tableGroupId, pInfo->pCtx,
|
ret = setResultOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &win, masterScan, &pResult, tableGroupId, pInfo->pCtx,
|
||||||
numOfOutput, pInfo->rowCellInfoOffset);
|
numOfOutput, pInfo->rowCellInfoOffset);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
@ -1326,7 +1319,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
||||||
}
|
}
|
||||||
|
|
||||||
// null data, failed to allocate more memory buffer
|
// null data, failed to allocate more memory buffer
|
||||||
int32_t code = setWindowOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &nextWin, masterScan, &pResult, tableGroupId,
|
int32_t code = setResultOutputBufByKey(pRuntimeEnv, pResultRowInfo, pSDataBlock->info.tid, &nextWin, masterScan, &pResult, tableGroupId,
|
||||||
pInfo->pCtx, numOfOutput, pInfo->rowCellInfoOffset);
|
pInfo->pCtx, numOfOutput, pInfo->rowCellInfoOffset);
|
||||||
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
|
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
@ -1467,7 +1460,7 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf
|
||||||
SResultRow* pResult = NULL;
|
SResultRow* pResult = NULL;
|
||||||
|
|
||||||
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
||||||
int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
int32_t ret = setResultOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
||||||
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
||||||
pBInfo->rowCellInfoOffset);
|
pBInfo->rowCellInfoOffset);
|
||||||
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
||||||
|
@ -1488,7 +1481,7 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf
|
||||||
SResultRow* pResult = NULL;
|
SResultRow* pResult = NULL;
|
||||||
|
|
||||||
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
||||||
int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
int32_t ret = setResultOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
||||||
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
||||||
pBInfo->rowCellInfoOffset);
|
pBInfo->rowCellInfoOffset);
|
||||||
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
||||||
|
@ -1532,7 +1525,7 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SOptrBasic
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t tid = 0;
|
int64_t tid = 0;
|
||||||
SResultRow *pResultRow = doPrepareResultRowFromKey(pRuntimeEnv, pResultRowInfo, tid, d, len, true, groupIndex);
|
SResultRow *pResultRow = doSetResultOutBufByKey(pRuntimeEnv, pResultRowInfo, tid, d, len, true, groupIndex);
|
||||||
assert (pResultRow != NULL);
|
assert (pResultRow != NULL);
|
||||||
|
|
||||||
setResultRowKey(pResultRow, pData, type);
|
setResultRowKey(pResultRow, pData, type);
|
||||||
|
@ -2779,7 +2772,7 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
|
||||||
TSKEY k = ascQuery? pBlock->info.window.skey : pBlock->info.window.ekey;
|
TSKEY k = ascQuery? pBlock->info.window.skey : pBlock->info.window.ekey;
|
||||||
|
|
||||||
STimeWindow win = getActiveTimeWindow(pTableScanInfo->pResultRowInfo, k, pQueryAttr);
|
STimeWindow win = getActiveTimeWindow(pTableScanInfo->pResultRowInfo, k, pQueryAttr);
|
||||||
if (setWindowOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.tid, &win, masterScan, &pResult, groupId,
|
if (setResultOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.tid, &win, masterScan, &pResult, groupId,
|
||||||
pTableScanInfo->pCtx, pTableScanInfo->numOfOutput,
|
pTableScanInfo->pCtx, pTableScanInfo->numOfOutput,
|
||||||
pTableScanInfo->rowCellInfoOffset) != TSDB_CODE_SUCCESS) {
|
pTableScanInfo->rowCellInfoOffset) != TSDB_CODE_SUCCESS) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
@ -2825,7 +2818,7 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
|
||||||
TSKEY k = ascQuery? pBlock->info.window.skey : pBlock->info.window.ekey;
|
TSKEY k = ascQuery? pBlock->info.window.skey : pBlock->info.window.ekey;
|
||||||
|
|
||||||
STimeWindow win = getActiveTimeWindow(pTableScanInfo->pResultRowInfo, k, pQueryAttr);
|
STimeWindow win = getActiveTimeWindow(pTableScanInfo->pResultRowInfo, k, pQueryAttr);
|
||||||
if (setWindowOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.tid, &win, masterScan, &pResult, groupId,
|
if (setResultOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.tid, &win, masterScan, &pResult, groupId,
|
||||||
pTableScanInfo->pCtx, pTableScanInfo->numOfOutput,
|
pTableScanInfo->pCtx, pTableScanInfo->numOfOutput,
|
||||||
pTableScanInfo->rowCellInfoOffset) != TSDB_CODE_SUCCESS) {
|
pTableScanInfo->rowCellInfoOffset) != TSDB_CODE_SUCCESS) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
@ -3181,11 +3174,11 @@ static void updateTableQueryInfoForReverseScan(STableQueryInfo *pTableQueryInfo)
|
||||||
pTableQueryInfo->cur.vgroupIndex = -1;
|
pTableQueryInfo->cur.vgroupIndex = -1;
|
||||||
|
|
||||||
// set the index to be the end slot of result rows array
|
// set the index to be the end slot of result rows array
|
||||||
SResultRowInfo* pResRowInfo = &pTableQueryInfo->resInfo;
|
SResultRowInfo* pResultRowInfo = &pTableQueryInfo->resInfo;
|
||||||
if (pResRowInfo->size > 0) {
|
if (pResultRowInfo->size > 0) {
|
||||||
pResRowInfo->current = pResRowInfo->pResult[pResRowInfo->size - 1];
|
pResultRowInfo->curPos = pResultRowInfo->size - 1;
|
||||||
} else {
|
} else {
|
||||||
pResRowInfo->current = NULL;
|
pResultRowInfo->curPos = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3240,7 +3233,7 @@ void setDefaultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SOptrBasicInfo *pInfo, i
|
||||||
SResultRowInfo* pResultRowInfo = &pInfo->resultRowInfo;
|
SResultRowInfo* pResultRowInfo = &pInfo->resultRowInfo;
|
||||||
|
|
||||||
int64_t tid = 0;
|
int64_t tid = 0;
|
||||||
SResultRow* pRow = doPrepareResultRowFromKey(pRuntimeEnv, pResultRowInfo, tid, (char *)&tid, sizeof(tid), true, uid);
|
SResultRow* pRow = doSetResultOutBufByKey(pRuntimeEnv, pResultRowInfo, tid, (char *)&tid, sizeof(tid), true, uid);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
|
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
|
||||||
SColumnInfoData* pData = taosArrayGet(pDataBlock->pDataBlock, i);
|
SColumnInfoData* pData = taosArrayGet(pDataBlock->pDataBlock, i);
|
||||||
|
@ -3477,7 +3470,7 @@ void doSetTableGroupOutputBuf(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pRe
|
||||||
int64_t tid = 0;
|
int64_t tid = 0;
|
||||||
|
|
||||||
SResultRow* pResultRow =
|
SResultRow* pResultRow =
|
||||||
doPrepareResultRowFromKey(pRuntimeEnv, pResultRowInfo, tid, (char*)&tableGroupId, sizeof(tableGroupId), true, uid);
|
doSetResultOutBufByKey(pRuntimeEnv, pResultRowInfo, tid, (char*)&tableGroupId, sizeof(tableGroupId), true, uid);
|
||||||
assert (pResultRow != NULL);
|
assert (pResultRow != NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3680,14 +3673,10 @@ void setIntervalQueryRange(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key) {
|
||||||
STableQueryInfo *pTableQueryInfo = pRuntimeEnv->current;
|
STableQueryInfo *pTableQueryInfo = pRuntimeEnv->current;
|
||||||
SResultRowInfo *pResultRowInfo = &pTableQueryInfo->resInfo;
|
SResultRowInfo *pResultRowInfo = &pTableQueryInfo->resInfo;
|
||||||
|
|
||||||
if (pResultRowInfo->current != NULL) {
|
if (pResultRowInfo->curPos != -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (pWindowResInfo->prevSKey != TSKEY_INITIAL_VAL) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
pTableQueryInfo->win.skey = key;
|
pTableQueryInfo->win.skey = key;
|
||||||
STimeWindow win = {.skey = key, .ekey = pQueryAttr->window.ekey};
|
STimeWindow win = {.skey = key, .ekey = pQueryAttr->window.ekey};
|
||||||
|
|
||||||
|
@ -4609,8 +4598,7 @@ static SSDataBlock* doTableScan(void* param, bool *newgroup) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pResultRowInfo->size > 0) {
|
if (pResultRowInfo->size > 0) {
|
||||||
pResultRowInfo->current = pResultRowInfo->pResult[0];
|
pResultRowInfo->curPos = 0;
|
||||||
// pResultRowInfo->prevSKey = pResultRowInfo->pResult[0]->win.skey;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:0x%"PRIx64" start to repeat scan data blocks due to query func required, qrange:%" PRId64 "-%" PRId64,
|
qDebug("QInfo:0x%"PRIx64" start to repeat scan data blocks due to query func required, qrange:%" PRId64 "-%" PRId64,
|
||||||
|
@ -4635,8 +4623,7 @@ static SSDataBlock* doTableScan(void* param, bool *newgroup) {
|
||||||
pTableScanInfo->order = cond.order;
|
pTableScanInfo->order = cond.order;
|
||||||
|
|
||||||
if (pResultRowInfo->size > 0) {
|
if (pResultRowInfo->size > 0) {
|
||||||
pResultRowInfo->current = pResultRowInfo->pResult[pResultRowInfo->size - 1];
|
pResultRowInfo->curPos = pResultRowInfo->size - 1;
|
||||||
// pResultRowInfo->prevSKey = pResultRowInfo->current->win.skey;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p = doTableScanImpl(pOperator, newgroup);
|
p = doTableScanImpl(pOperator, newgroup);
|
||||||
|
@ -5496,7 +5483,7 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
|
||||||
} else {
|
} else {
|
||||||
SResultRow* pResult = NULL;
|
SResultRow* pResult = NULL;
|
||||||
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
||||||
int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
int32_t ret = setResultOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
||||||
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
||||||
pBInfo->rowCellInfoOffset);
|
pBInfo->rowCellInfoOffset);
|
||||||
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
||||||
|
@ -5513,10 +5500,11 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRow* pResult = NULL;
|
SResultRow* pResult = NULL;
|
||||||
|
|
||||||
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
pInfo->curWindow.ekey = pInfo->curWindow.skey;
|
||||||
int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
int32_t ret = setResultOutputBufByKey(pRuntimeEnv, &pBInfo->resultRowInfo, pSDataBlock->info.tid, &pInfo->curWindow, masterScan,
|
||||||
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
&pResult, item->groupIndex, pBInfo->pCtx, pOperator->numOfOutput,
|
||||||
pBInfo->rowCellInfoOffset);
|
pBInfo->rowCellInfoOffset);
|
||||||
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
||||||
|
@ -6294,8 +6282,8 @@ static SSDataBlock* doTagScan(void* param, bool* newgroup) {
|
||||||
|
|
||||||
SColumnInfoData* pColInfo = taosArrayGet(pRes->pDataBlock, 0);
|
SColumnInfoData* pColInfo = taosArrayGet(pRes->pDataBlock, 0);
|
||||||
|
|
||||||
while(pInfo->currentIndex < pInfo->totalTables && count < maxNumOfTables) {
|
while(pInfo->curPos < pInfo->totalTables && count < maxNumOfTables) {
|
||||||
int32_t i = pInfo->currentIndex++;
|
int32_t i = pInfo->curPos++;
|
||||||
STableQueryInfo *item = taosArrayGetP(pa, i);
|
STableQueryInfo *item = taosArrayGetP(pa, i);
|
||||||
|
|
||||||
char *output = pColInfo->pData + count * rsize;
|
char *output = pColInfo->pData + count * rsize;
|
||||||
|
@ -6339,8 +6327,8 @@ static SSDataBlock* doTagScan(void* param, bool* newgroup) {
|
||||||
SExprInfo* pExprInfo = pOperator->pExpr; // todo use the column list instead of exprinfo
|
SExprInfo* pExprInfo = pOperator->pExpr; // todo use the column list instead of exprinfo
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
while(pInfo->currentIndex < pInfo->totalTables && count < maxNumOfTables) {
|
while(pInfo->curPos < pInfo->totalTables && count < maxNumOfTables) {
|
||||||
int32_t i = pInfo->currentIndex++;
|
int32_t i = pInfo->curPos++;
|
||||||
|
|
||||||
STableQueryInfo* item = taosArrayGetP(pa, i);
|
STableQueryInfo* item = taosArrayGetP(pa, i);
|
||||||
|
|
||||||
|
@ -6369,7 +6357,7 @@ static SSDataBlock* doTagScan(void* param, bool* newgroup) {
|
||||||
count += 1;
|
count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInfo->currentIndex >= pInfo->totalTables) {
|
if (pInfo->curPos >= pInfo->totalTables) {
|
||||||
pOperator->status = OP_EXEC_DONE;
|
pOperator->status = OP_EXEC_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6388,7 +6376,7 @@ SOperatorInfo* createTagScanOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SExprInf
|
||||||
assert(numOfGroup == 0 || numOfGroup == 1);
|
assert(numOfGroup == 0 || numOfGroup == 1);
|
||||||
|
|
||||||
pInfo->totalTables = pRuntimeEnv->tableqinfoGroupInfo.numOfTables;
|
pInfo->totalTables = pRuntimeEnv->tableqinfoGroupInfo.numOfTables;
|
||||||
pInfo->currentIndex = 0;
|
pInfo->curPos = 0;
|
||||||
|
|
||||||
SOperatorInfo* pOperator = calloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = calloc(1, sizeof(SOperatorInfo));
|
||||||
pOperator->name = "SeqTableTagScan";
|
pOperator->name = "SeqTableTagScan";
|
||||||
|
|
|
@ -44,8 +44,7 @@ int32_t getOutputInterResultBufSize(SQueryAttr* pQueryAttr) {
|
||||||
int32_t initResultRowInfo(SResultRowInfo *pResultRowInfo, int32_t size, int16_t type) {
|
int32_t initResultRowInfo(SResultRowInfo *pResultRowInfo, int32_t size, int16_t type) {
|
||||||
pResultRowInfo->type = type;
|
pResultRowInfo->type = type;
|
||||||
pResultRowInfo->size = 0;
|
pResultRowInfo->size = 0;
|
||||||
// pResultRowInfo->prevSKey = TSKEY_INITIAL_VAL;
|
pResultRowInfo->curPos = -1;
|
||||||
pResultRowInfo->current = NULL;
|
|
||||||
pResultRowInfo->capacity = size;
|
pResultRowInfo->capacity = size;
|
||||||
|
|
||||||
pResultRowInfo->pResult = calloc(pResultRowInfo->capacity, POINTER_BYTES);
|
pResultRowInfo->pResult = calloc(pResultRowInfo->capacity, POINTER_BYTES);
|
||||||
|
@ -92,8 +91,7 @@ void resetResultRowInfo(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRo
|
||||||
}
|
}
|
||||||
|
|
||||||
pResultRowInfo->size = 0;
|
pResultRowInfo->size = 0;
|
||||||
pResultRowInfo->current = NULL;
|
pResultRowInfo->curPos = -1;
|
||||||
// pResultRowInfo->prevSKey = TSKEY_INITIAL_VAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfClosedResultRows(SResultRowInfo *pResultRowInfo) {
|
int32_t numOfClosedResultRows(SResultRowInfo *pResultRowInfo) {
|
||||||
|
|
1434
src/query/src/sql.c
1434
src/query/src/sql.c
File diff suppressed because it is too large
Load Diff
|
@ -34,6 +34,7 @@ typedef int (*__compar_fn_t) (const void *, const void *);
|
||||||
#define elePtrAt(base, size, idx) (void *)((char *)(base) + (size) * (idx))
|
#define elePtrAt(base, size, idx) (void *)((char *)(base) + (size) * (idx))
|
||||||
|
|
||||||
typedef int32_t (*__ext_compar_fn_t)(const void *p1, const void *p2, const void *param);
|
typedef int32_t (*__ext_compar_fn_t)(const void *p1, const void *p2, const void *param);
|
||||||
|
typedef void (*__ext_swap_fn_t)(void *p1, void *p2, const void *param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* quick sort, with the compare function requiring additional parameters support
|
* quick sort, with the compare function requiring additional parameters support
|
||||||
|
@ -59,6 +60,38 @@ void taosqsort(void *src, size_t numOfElem, size_t size, const void* param, __ex
|
||||||
*/
|
*/
|
||||||
void *taosbsearch(const void *key, const void *base, size_t nmemb, size_t size, __compar_fn_t fn, int flags);
|
void *taosbsearch(const void *key, const void *base, size_t nmemb, size_t size, __compar_fn_t fn, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adjust heap
|
||||||
|
*
|
||||||
|
* @param base: the start address of array
|
||||||
|
* @param size: size of every item in array
|
||||||
|
* @param start: the first index
|
||||||
|
* @param end: the last index
|
||||||
|
* @param parcompar: parameters for compare function
|
||||||
|
* @param compar: user defined compare function
|
||||||
|
* @param parswap: parameters for swap function
|
||||||
|
* @param swap: user defined swap function, the default swap function doswap will be used if swap is NULL
|
||||||
|
* @param maxroot: if heap is max root heap
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
void taosheapadjust(void *base, int32_t size, int32_t start, int32_t end, const void *parcompar, __ext_compar_fn_t compar, const void *parswap, __ext_swap_fn_t swap, bool maxroot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sort heap to make sure it is a max/min root heap
|
||||||
|
*
|
||||||
|
* @param base: the start address of array
|
||||||
|
* @param size: size of every item in array
|
||||||
|
* @param len: the length of array
|
||||||
|
* @param parcompar: parameters for compare function
|
||||||
|
* @param compar: user defined compare function
|
||||||
|
* @param parswap: parameters for swap function
|
||||||
|
* @param swap: user defined swap function, the default swap function doswap will be used if swap is NULL
|
||||||
|
* @param maxroot: if heap is max root heap
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
void taosheapsort(void *base, int32_t size, int32_t len, const void *parcompar, __ext_compar_fn_t compar, const void *parswap, __ext_swap_fn_t swap, bool maxroot);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -225,3 +225,89 @@ void * taosbsearch(const void *key, const void *base, size_t nmemb, size_t size,
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void taosheapadjust(void *base, int32_t size, int32_t start, int32_t end, const void *parcompar, __ext_compar_fn_t compar, const void *parswap, __ext_swap_fn_t swap, bool maxroot)
|
||||||
|
{
|
||||||
|
int32_t parent;
|
||||||
|
int32_t child;
|
||||||
|
char *buf;
|
||||||
|
|
||||||
|
if (base && size > 0 && compar) {
|
||||||
|
parent = start;
|
||||||
|
child = 2 * parent + 1;
|
||||||
|
|
||||||
|
if (swap == NULL) {
|
||||||
|
buf = calloc(1, size);
|
||||||
|
if (buf == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxroot) {
|
||||||
|
while (child <= end) {
|
||||||
|
if (child + 1 <= end && (*compar)(elePtrAt(base, size, child), elePtrAt(base, size, child + 1), parcompar) < 0) {
|
||||||
|
child++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*compar)(elePtrAt(base, size, parent), elePtrAt(base, size, child), parcompar) > 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (swap == NULL) {
|
||||||
|
doswap(elePtrAt(base, size, parent), elePtrAt(base, size, child), size, buf);
|
||||||
|
} else {
|
||||||
|
(*swap)(elePtrAt(base, size, parent), elePtrAt(base, size, child), parswap);
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = child;
|
||||||
|
child = 2 * parent + 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while (child <= end) {
|
||||||
|
if (child + 1 <= end && (*compar)(elePtrAt(base, size, child), elePtrAt(base, size, child + 1), parcompar) > 0) {
|
||||||
|
child++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*compar)(elePtrAt(base, size, parent), elePtrAt(base, size, child), parcompar) < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (swap == NULL) {
|
||||||
|
doswap(elePtrAt(base, size, parent), elePtrAt(base, size, child), size, buf);
|
||||||
|
} else {
|
||||||
|
(*swap)(elePtrAt(base, size, parent), elePtrAt(base, size, child), parswap);
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = child;
|
||||||
|
child = 2 * parent + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (swap == NULL) {
|
||||||
|
tfree(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void taosheapsort(void *base, int32_t size, int32_t len, const void *parcompar, __ext_compar_fn_t compar, const void *parswap, __ext_swap_fn_t swap, bool maxroot)
|
||||||
|
{
|
||||||
|
int32_t i;
|
||||||
|
|
||||||
|
if (base && size > 0) {
|
||||||
|
for (i = len / 2 - 1; i >= 0; i--) {
|
||||||
|
taosheapadjust(base, size, i, len - 1, parcompar, compar, parswap, swap, maxroot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
char *buf = calloc(1, size);
|
||||||
|
|
||||||
|
for (i = len - 1; i > 0; i--) {
|
||||||
|
doswap(elePtrAt(base, size, 0), elePtrAt(base, size, i));
|
||||||
|
taosheapadjust(base, size, 0, i - 1, parcompar, compar, parswap, swap, maxroot);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(buf);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ static void prepare_data(TAOS* taos) {
|
||||||
result = taos_query(taos, "drop database if exists test;");
|
result = taos_query(taos, "drop database if exists test;");
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
result = taos_query(taos, "create database test;");
|
result = taos_query(taos, "create database test precision 'us';");
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
taos_select_db(taos, "test");
|
taos_select_db(taos, "test");
|
||||||
|
@ -949,13 +949,45 @@ void verify_stream(TAOS* taos) {
|
||||||
taos_close_stream(strm);
|
taos_close_stream(strm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t verify_schema_less(TAOS* taos) {
|
||||||
|
TAOS_RES *result;
|
||||||
|
result = taos_query(taos, "drop database if exists test;");
|
||||||
|
taos_free_result(result);
|
||||||
|
usleep(100000);
|
||||||
|
result = taos_query(taos, "create database test precision 'us';");
|
||||||
|
taos_free_result(result);
|
||||||
|
usleep(100000);
|
||||||
|
|
||||||
|
taos_select_db(taos, "test");
|
||||||
|
result = taos_query(taos, "create stable ste(ts timestamp, f int) tags(t1 bigint)");
|
||||||
|
taos_free_result(result);
|
||||||
|
usleep(100000);
|
||||||
|
|
||||||
|
char* lines[] = {
|
||||||
|
"st,t1=3i,t2=4,t3=\"t3\" c1=3i,c3=L\"passit\",c2=false,c4=4 1626006833639000000",
|
||||||
|
"st,t1=4i,t3=\"t4\",t2=5,t4=5 c1=3i,c3=L\"passitagin\",c2=true,c4=5,c5=5 1626006833640000000",
|
||||||
|
"ste,t2=5,t3=L\"ste\" c1=true,c2=4,c3=\"iam\" 1626056811823316532",
|
||||||
|
"st,t1=4i,t2=5,t3=\"t4\" c1=3i,c3=L\"passitagain\",c2=true,c4=5 1626006833642000000",
|
||||||
|
"ste,t2=5,t3=L\"ste2\" c3=\"iamszhou\",c4=false 1626056811843316532",
|
||||||
|
"ste,t2=5,t3=L\"ste2\" c3=\"iamszhou\",c4=false,c5=32b,c6=64s,c7=32w,c8=88.88f 1626056812843316532",
|
||||||
|
"st,t1=4i,t3=\"t4\",t2=5,t4=5 c1=3i,c3=L\"passitagin\",c2=true,c4=5,c5=5,c6=7u 1626006933640000000",
|
||||||
|
"stf,t1=4i,t3=\"t4\",t2=5,t4=5 c1=3i,c3=L\"passitagin\",c2=true,c4=5,c5=5,c6=7u 1626006933640000000",
|
||||||
|
"stf,t1=4i,t3=\"t4\",t2=5,t4=5 c1=3i,c3=L\"passitagin_stf\",c2=false,c5=5,c6=7u 1626006933641a"
|
||||||
|
};
|
||||||
|
|
||||||
|
// int code = taos_insert_lines(taos, lines , sizeof(lines)/sizeof(char*));
|
||||||
|
int code = taos_insert_lines(taos, &lines[0], 1);
|
||||||
|
code = taos_insert_lines(taos, &lines[1], 1);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
const char* host = "127.0.0.1";
|
const char* host = "127.0.0.1";
|
||||||
const char* user = "root";
|
const char* user = "root";
|
||||||
const char* passwd = "taosdata";
|
const char* passwd = "taosdata";
|
||||||
|
|
||||||
taos_options(TSDB_OPTION_TIMEZONE, "GMT-8");
|
taos_options(TSDB_OPTION_TIMEZONE, "GMT-8");
|
||||||
|
|
||||||
TAOS* taos = taos_connect(host, user, passwd, "", 0);
|
TAOS* taos = taos_connect(host, user, passwd, "", 0);
|
||||||
if (taos == NULL) {
|
if (taos == NULL) {
|
||||||
printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
|
printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
|
||||||
|
@ -967,6 +999,12 @@ int main(int argc, char *argv[]) {
|
||||||
info = taos_get_client_info(taos);
|
info = taos_get_client_info(taos);
|
||||||
printf("client info: %s\n", info);
|
printf("client info: %s\n", info);
|
||||||
|
|
||||||
|
printf("************ verify shemaless *************\n");
|
||||||
|
int code = verify_schema_less(taos);
|
||||||
|
if (code == 0) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
printf("************ verify query *************\n");
|
printf("************ verify query *************\n");
|
||||||
verify_query(taos);
|
verify_query(taos);
|
||||||
|
|
||||||
|
|
|
@ -236,9 +236,10 @@ python3 ./test.py -f query/queryTscomputWithNow.py
|
||||||
python3 ./test.py -f query/computeErrorinWhere.py
|
python3 ./test.py -f query/computeErrorinWhere.py
|
||||||
python3 ./test.py -f query/queryTsisNull.py
|
python3 ./test.py -f query/queryTsisNull.py
|
||||||
python3 ./test.py -f query/subqueryFilter.py
|
python3 ./test.py -f query/subqueryFilter.py
|
||||||
# python3 ./test.py -f query/nestedQuery/queryInterval.py
|
python3 ./test.py -f query/nestedQuery/queryInterval.py
|
||||||
python3 ./test.py -f query/queryStateWindow.py
|
python3 ./test.py -f query/queryStateWindow.py
|
||||||
python3 ./test.py -f query/nestedQuery/queryWithOrderLimit.py
|
python3 ./test.py -f query/nestedQuery/queryWithOrderLimit.py
|
||||||
|
python3 ./test.py -f query/nestquery_last_row.py
|
||||||
|
|
||||||
|
|
||||||
#stream
|
#stream
|
||||||
|
|
|
@ -27,6 +27,7 @@ class TDTestCase:
|
||||||
self.rowNum = 100
|
self.rowNum = 100
|
||||||
self.ts = 1537146000000
|
self.ts = 1537146000000
|
||||||
self.ts1 = 1537146000000000
|
self.ts1 = 1537146000000000
|
||||||
|
self.ts2 = 1597146000000
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
@ -35,6 +36,8 @@ class TDTestCase:
|
||||||
tdSql.execute('''create table test(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 float, col6 double,
|
tdSql.execute('''create table test(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 float, col6 double,
|
||||||
col7 bool, col8 binary(20), col9 nchar(20), col11 tinyint unsigned, col12 smallint unsigned, col13 int unsigned, col14 bigint unsigned) tags(loc nchar(20), tag1 int)''')
|
col7 bool, col8 binary(20), col9 nchar(20), col11 tinyint unsigned, col12 smallint unsigned, col13 int unsigned, col14 bigint unsigned) tags(loc nchar(20), tag1 int)''')
|
||||||
tdSql.execute("create table test1 using test tags('beijing', 10)")
|
tdSql.execute("create table test1 using test tags('beijing', 10)")
|
||||||
|
tdSql.execute("create table test2 using test tags('tianjing', 20)")
|
||||||
|
tdSql.execute("create table test3 using test tags('shanghai', 20)")
|
||||||
tdSql.execute("create table gtest1 (ts timestamp, col1 float)")
|
tdSql.execute("create table gtest1 (ts timestamp, col1 float)")
|
||||||
tdSql.execute("create table gtest2 (ts timestamp, col1 tinyint)")
|
tdSql.execute("create table gtest2 (ts timestamp, col1 tinyint)")
|
||||||
tdSql.execute("create table gtest3 (ts timestamp, col1 tinyint)")
|
tdSql.execute("create table gtest3 (ts timestamp, col1 tinyint)")
|
||||||
|
@ -48,6 +51,10 @@ class TDTestCase:
|
||||||
for i in range(self.rowNum):
|
for i in range(self.rowNum):
|
||||||
tdSql.execute("insert into test1 values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)"
|
tdSql.execute("insert into test1 values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)"
|
||||||
% (self.ts + i*1000, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1))
|
% (self.ts + i*1000, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1))
|
||||||
|
tdSql.execute("insert into test2 values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)"
|
||||||
|
% (self.ts2 + i*1000, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1))
|
||||||
|
tdSql.execute("insert into test3 values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)"
|
||||||
|
% (self.ts2 + i*1000, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1))
|
||||||
|
|
||||||
tdSql.execute("insert into gtest1 values(1537146000000,0);")
|
tdSql.execute("insert into gtest1 values(1537146000000,0);")
|
||||||
tdSql.execute("insert into gtest1 values(1537146001100,1.2);")
|
tdSql.execute("insert into gtest1 values(1537146001100,1.2);")
|
||||||
|
@ -69,7 +76,7 @@ class TDTestCase:
|
||||||
tdSql.execute("insert into gtest8 values(1537146000002,4);")
|
tdSql.execute("insert into gtest8 values(1537146000002,4);")
|
||||||
tdSql.execute("insert into gtest8 values(1537146002202,4);")
|
tdSql.execute("insert into gtest8 values(1537146002202,4);")
|
||||||
|
|
||||||
# irate verifacation
|
# irate verifacation --child table'query
|
||||||
tdSql.query("select irate(col1) from test1;")
|
tdSql.query("select irate(col1) from test1;")
|
||||||
tdSql.checkData(0, 0, 1)
|
tdSql.checkData(0, 0, 1)
|
||||||
tdSql.query("select irate(col1) from test1 interval(10s);")
|
tdSql.query("select irate(col1) from test1 interval(10s);")
|
||||||
|
@ -99,6 +106,32 @@ class TDTestCase:
|
||||||
tdSql.query("select irate(col2) from test1;")
|
tdSql.query("select irate(col2) from test1;")
|
||||||
tdSql.checkData(0, 0, 1)
|
tdSql.checkData(0, 0, 1)
|
||||||
|
|
||||||
|
# irate verifacation --super table'query
|
||||||
|
tdSql.query("select irate(col1) from test group by tbname,loc,tag1;")
|
||||||
|
tdSql.checkData(0, 0, 1)
|
||||||
|
tdSql.checkData(1, 1, "test2")
|
||||||
|
tdSql.checkData(2, 2, "shanghai")
|
||||||
|
|
||||||
|
# add function testcase of twa: query from super table
|
||||||
|
tdSql.query("select twa(col1) from test group by tbname,loc,tag1;")
|
||||||
|
tdSql.checkData(0, 0, 50.5)
|
||||||
|
tdSql.checkData(1, 1, "test2")
|
||||||
|
tdSql.checkData(2, 2, "shanghai")
|
||||||
|
|
||||||
|
# error: function of irate and twa has invalid operation
|
||||||
|
tdSql.error("select irate(col7) from test group by tbname,loc,tag1;")
|
||||||
|
tdSql.error("select irate(col7) from test group by tbname;")
|
||||||
|
tdSql.error("select irate(col1) from test group by loc,tbname,tag1;")
|
||||||
|
# tdSql.error("select irate(col1) from test group by tbname,col7;")
|
||||||
|
tdSql.error("select irate(col1) from test group by col7,tbname;")
|
||||||
|
tdSql.error("select twa(col7) from test group by tbname,loc,tag1;")
|
||||||
|
tdSql.error("select twa(col7) from test group by tbname;")
|
||||||
|
tdSql.error("select twa(col1) from test group by loc,tbname,tag1;")
|
||||||
|
# tdSql.error("select twa(col1) from test group by tbname,col7;")
|
||||||
|
tdSql.error("select twa(col1) from test group by col7,tbname;")
|
||||||
|
|
||||||
|
|
||||||
|
# general table'query
|
||||||
tdSql.query("select irate(col1) from gtest1;")
|
tdSql.query("select irate(col1) from gtest1;")
|
||||||
tdSql.checkData(0, 0, 1.2/1.1)
|
tdSql.checkData(0, 0, 1.2/1.1)
|
||||||
tdSql.query("select irate(col1) from gtest2;")
|
tdSql.query("select irate(col1) from gtest2;")
|
||||||
|
|
|
@ -0,0 +1,263 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import taos
|
||||||
|
from util.log import tdLog
|
||||||
|
from util.cases import tdCases
|
||||||
|
from util.sql import tdSql
|
||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
self.ts = 1600000000000
|
||||||
|
self.num = 10
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
# test case for https://jira.taosdata.com:18080/browse/TD-4735
|
||||||
|
|
||||||
|
tdSql.execute('''create stable stable_1
|
||||||
|
(ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint,
|
||||||
|
q_bool bool , q_binary binary(20) , q_nchar nchar(20) ,
|
||||||
|
q_float float , q_double double , q_ts timestamp)
|
||||||
|
tags(loc nchar(20) , t_int int , t_bigint bigint , t_smallint smallint , t_tinyint tinyint,
|
||||||
|
t_bool bool , t_binary binary(20) , t_nchar nchar(20) ,
|
||||||
|
t_float float , t_double double , t_ts timestamp);''')
|
||||||
|
tdSql.execute('''create table table_0 using stable_1
|
||||||
|
tags('table_0' , '0' , '0' , '0' , '0' , 0 , '0' , '0' , '0' , '0' ,'0')''')
|
||||||
|
tdSql.execute('''create table table_1 using stable_1
|
||||||
|
tags('table_1' , '2147483647' , '9223372036854775807' , '32767' , '127' , 1 ,
|
||||||
|
'binary1' , 'nchar1' , '1' , '11' , \'1999-09-09 09:09:09.090\')''')
|
||||||
|
tdSql.execute('''create table table_2 using stable_1
|
||||||
|
tags('table_2' , '-2147483647' , '-9223372036854775807' , '-32767' , '-127' , false ,
|
||||||
|
'binary2' , 'nchar2nchar2' , '-2.2' , '-22.22' , \'2099-09-09 09:09:09.090\')''')
|
||||||
|
tdSql.execute('''create table table_3 using stable_1
|
||||||
|
tags('table_3' , '3' , '3' , '3' , '3' , true , 'binary3' , 'nchar3' , '33.33' , '3333.3333' , '0')''')
|
||||||
|
tdSql.execute('''create table table_4 using stable_1
|
||||||
|
tags('table_4' , '4' , '4' , '4' , '4' , false , 'binary4' , 'nchar4' , '-444.444' , '-444444.444444' , '0')''')
|
||||||
|
tdSql.execute('''create table table_5 using stable_1
|
||||||
|
tags('table_5' , '5' , '5' , '5' , '5' , true , 'binary5' , 'nchar5' , '5555.5555' , '55555555.55555555' , '0')''')
|
||||||
|
#regular table
|
||||||
|
tdSql.execute('''create table regular_table_1
|
||||||
|
(ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint,
|
||||||
|
q_bool bool , q_binary binary(20) , q_nchar nchar(20) ,
|
||||||
|
q_float float , q_double double , q_ts timestamp) ;''')
|
||||||
|
|
||||||
|
for i in range(self.num):
|
||||||
|
tdSql.execute('''insert into table_0 values(%d, %d, %d, %d, %d, 0, 'binary.%s', 'nchar.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + i, i, i, i, i, i, i, i, i, self.ts + i))
|
||||||
|
tdSql.execute('''insert into table_1 values(%d, %d, %d, %d, %d, 1, 'binary1.%s', 'nchar1.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + i, 2147483647-i, 9223372036854775807-i, 32767-i, 127-i,
|
||||||
|
i, i, random.random(), random.random(), 1262304000001 + i))
|
||||||
|
tdSql.execute('''insert into table_2 values(%d, %d, %d, %d, %d, true, 'binary2.%s', 'nchar2nchar2.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + i, -2147483647+i, -9223372036854775807+i, -32767+i, -127+i,
|
||||||
|
i, i, random.uniform(-1,0), random.uniform(-1,0), 1577836800001 + i))
|
||||||
|
tdSql.execute('''insert into table_3 values(%d, %d, %d, %d, %d, false, 'binary3.%s', 'nchar3.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + i, random.randint(-2147483647, 2147483647),
|
||||||
|
random.randint(-9223372036854775807, 9223372036854775807), random.randint(-32767, 32767),
|
||||||
|
random.randint(-127, 127), random.randint(-100, 100), random.randint(-10000, 10000),
|
||||||
|
random.uniform(-100000,100000), random.uniform(-1000000000,1000000000), self.ts + i))
|
||||||
|
tdSql.execute('''insert into table_4 values(%d, %d, %d, %d, %d, true, 'binary4.%s', 'nchar4.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + i, i, i, i, i, i, i, i, i, self.ts + i))
|
||||||
|
tdSql.execute('''insert into table_5 values(%d, %d, %d, %d, %d, false, 'binary5.%s', 'nchar5.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + i, i, i, i, i, i, i, i, i, self.ts + i))
|
||||||
|
|
||||||
|
tdSql.execute('''insert into regular_table_1 values(%d, %d, %d, %d, %d, 0, 'binary.%s', 'nchar.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + i, i, i, i, i, i, i, i, i, self.ts + i))
|
||||||
|
tdSql.execute('''insert into regular_table_1 values(%d, %d, %d, %d, %d, 1, 'binary1.%s', 'nchar1.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + 100 + i, 2147483647-i, 9223372036854775807-i, 32767-i, 127-i,
|
||||||
|
i, i, random.random(), random.random(), 1262304000001 + i))
|
||||||
|
tdSql.execute('''insert into regular_table_1 values(%d, %d, %d, %d, %d, true, 'binary2.%s', 'nchar2nchar2.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + 200 + i, -2147483647+i, -9223372036854775807+i, -32767+i, -127+i,
|
||||||
|
i, i, random.uniform(-1,0), random.uniform(-1,0), 1577836800001 + i))
|
||||||
|
tdSql.execute('''insert into regular_table_1 values(%d, %d, %d, %d, %d, false, 'binary3.%s', 'nchar3.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + 300 + i, random.randint(-2147483647, 2147483647),
|
||||||
|
random.randint(-9223372036854775807, 9223372036854775807), random.randint(-32767, 32767),
|
||||||
|
random.randint(-127, 127), random.randint(-100, 100), random.randint(-10000, 10000),
|
||||||
|
random.uniform(-100000,100000), random.uniform(-1000000000,1000000000), self.ts + i))
|
||||||
|
tdSql.execute('''insert into regular_table_1 values(%d, %d, %d, %d, %d, true, 'binary4.%s', 'nchar4.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + 400 + i, i, i, i, i, i, i, i, i, self.ts + i))
|
||||||
|
tdSql.execute('''insert into regular_table_1 values(%d, %d, %d, %d, %d, false, 'binary5.%s', 'nchar5.%s', %f, %f, %d)'''
|
||||||
|
% (self.ts + 500 + i, i, i, i, i, i, i, i, i, self.ts + i))
|
||||||
|
|
||||||
|
sql = '''select * from stable_1'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(6*self.num)
|
||||||
|
sql = '''select * from regular_table_1'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(6*self.num)
|
||||||
|
|
||||||
|
tdLog.info("=======last_row(*)========")
|
||||||
|
sql = '''select last_row(*) from stable_1;'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkData(0,1,self.num-1)
|
||||||
|
sql = '''select last_row(*) from regular_table_1;'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkData(0,1,self.num-1)
|
||||||
|
|
||||||
|
sql = '''select * from stable_1
|
||||||
|
where loc = 'table_0';'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(self.num)
|
||||||
|
sql = '''select last_row(*) from
|
||||||
|
(select * from stable_1
|
||||||
|
where loc = 'table_0');'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
sql = '''select last_row(*) from
|
||||||
|
(select * from stable_1);'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkData(0,1,self.num-1)
|
||||||
|
tdSql.checkData(0,2,self.num-1)
|
||||||
|
tdSql.checkData(0,3,self.num-1)
|
||||||
|
tdSql.checkData(0,4,self.num-1)
|
||||||
|
tdSql.checkData(0,5,'False')
|
||||||
|
tdSql.checkData(0,6,'binary5.9')
|
||||||
|
tdSql.checkData(0,7,'nchar5.9')
|
||||||
|
tdSql.checkData(0,8,9.00000)
|
||||||
|
tdSql.checkData(0,9,9.000000000)
|
||||||
|
tdSql.checkData(0,10,'2020-09-13 20:26:40.009')
|
||||||
|
tdSql.checkData(0,11,'table_5')
|
||||||
|
tdSql.checkData(0,12,5)
|
||||||
|
tdSql.checkData(0,13,5)
|
||||||
|
tdSql.checkData(0,14,5)
|
||||||
|
tdSql.checkData(0,15,5)
|
||||||
|
tdSql.checkData(0,16,'True')
|
||||||
|
tdSql.checkData(0,17,'binary5')
|
||||||
|
tdSql.checkData(0,18,'nchar5')
|
||||||
|
tdSql.checkData(0,21,'1970-01-01 08:00:00.000')
|
||||||
|
|
||||||
|
sql = '''select * from regular_table_1 ;'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(6*self.num)
|
||||||
|
sql = '''select last_row(*) from
|
||||||
|
(select * from regular_table_1);'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0,1,self.num-1)
|
||||||
|
tdSql.checkData(0,2,self.num-1)
|
||||||
|
tdSql.checkData(0,3,self.num-1)
|
||||||
|
tdSql.checkData(0,4,self.num-1)
|
||||||
|
tdSql.checkData(0,5,'False')
|
||||||
|
tdSql.checkData(0,6,'binary5.9')
|
||||||
|
tdSql.checkData(0,7,'nchar5.9')
|
||||||
|
tdSql.checkData(0,8,9.00000)
|
||||||
|
tdSql.checkData(0,9,9.000000000)
|
||||||
|
tdSql.checkData(0,10,'2020-09-13 20:26:40.009')
|
||||||
|
|
||||||
|
sql = '''select last_row(*) from
|
||||||
|
((select * from table_0) union all
|
||||||
|
(select * from table_1) union all
|
||||||
|
(select * from table_2));'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0,1,self.num-1)
|
||||||
|
tdSql.checkData(0,2,self.num-1)
|
||||||
|
tdSql.checkData(0,3,self.num-1)
|
||||||
|
tdSql.checkData(0,4,self.num-1)
|
||||||
|
tdSql.checkData(0,5,'False')
|
||||||
|
tdSql.checkData(0,6,'binary.9')
|
||||||
|
tdSql.checkData(0,7,'nchar.9')
|
||||||
|
tdSql.checkData(0,8,9.00000)
|
||||||
|
tdSql.checkData(0,9,9.000000000)
|
||||||
|
tdSql.checkData(0,10,'2020-09-13 20:26:40.009')
|
||||||
|
|
||||||
|
# bug 5055
|
||||||
|
# sql = '''select last_row(*) from
|
||||||
|
# ((select * from stable_1) union all
|
||||||
|
# (select * from table_1) union all
|
||||||
|
# (select * from regular_table_1));'''
|
||||||
|
# tdSql.query(sql)
|
||||||
|
# tdSql.checkData(0,1,self.num-1)
|
||||||
|
|
||||||
|
sql = '''select last_row(*) from
|
||||||
|
((select last_row(*) from table_0) union all
|
||||||
|
(select last_row(*) from table_1) union all
|
||||||
|
(select last_row(*) from table_2));'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0,1,self.num-1)
|
||||||
|
tdSql.checkData(0,2,self.num-1)
|
||||||
|
tdSql.checkData(0,3,self.num-1)
|
||||||
|
tdSql.checkData(0,4,self.num-1)
|
||||||
|
tdSql.checkData(0,5,'False')
|
||||||
|
tdSql.checkData(0,6,'binary.9')
|
||||||
|
tdSql.checkData(0,7,'nchar.9')
|
||||||
|
tdSql.checkData(0,8,9.00000)
|
||||||
|
tdSql.checkData(0,9,9.000000000)
|
||||||
|
tdSql.checkData(0,10,'2020-09-13 20:26:40.009')
|
||||||
|
|
||||||
|
# bug 5055
|
||||||
|
# sql = '''select last_row(*) from
|
||||||
|
# ((select last_row(*) from stable_1) union all
|
||||||
|
# (select last_row(*) from table_1) union all
|
||||||
|
# (select last_row(*) from regular_table_1));'''
|
||||||
|
# tdSql.query(sql)
|
||||||
|
# tdSql.checkData(0,1,self.num-1)
|
||||||
|
|
||||||
|
sql = '''select last_row(*) from
|
||||||
|
((select * from table_0 limit 5 offset 5) union all
|
||||||
|
(select * from table_1 limit 5 offset 5) union all
|
||||||
|
(select * from regular_table_1 limit 5 offset 5));'''
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0,1,self.num-1)
|
||||||
|
tdSql.checkData(0,2,self.num-1)
|
||||||
|
tdSql.checkData(0,3,self.num-1)
|
||||||
|
tdSql.checkData(0,4,self.num-1)
|
||||||
|
tdSql.checkData(0,5,'False')
|
||||||
|
tdSql.checkData(0,6,'binary.9')
|
||||||
|
tdSql.checkData(0,7,'nchar.9')
|
||||||
|
tdSql.checkData(0,8,9.00000)
|
||||||
|
tdSql.checkData(0,9,9.000000000)
|
||||||
|
tdSql.checkData(0,10,'2020-09-13 20:26:40.009')
|
||||||
|
|
||||||
|
|
||||||
|
sql = '''select last_row(*) from
|
||||||
|
(select * from stable_1)
|
||||||
|
having q_int>5;'''
|
||||||
|
tdLog.info(sql)
|
||||||
|
tdSql.error(sql)
|
||||||
|
try:
|
||||||
|
tdSql.execute(sql)
|
||||||
|
tdLog.exit(" having only works with group by")
|
||||||
|
except Exception as e:
|
||||||
|
tdLog.info(repr(e))
|
||||||
|
tdLog.info("invalid operation: having only works with group by")
|
||||||
|
|
||||||
|
#bug 5057
|
||||||
|
# sql = '''select last_row(*) from
|
||||||
|
# (select * from (select * from stable_1))'''
|
||||||
|
# tdLog.info(sql)
|
||||||
|
# tdSql.error(sql)
|
||||||
|
# try:
|
||||||
|
# tdSql.execute(sql)
|
||||||
|
# tdLog.exit(" core dumped")
|
||||||
|
# except Exception as e:
|
||||||
|
# tdLog.info(repr(e))
|
||||||
|
# tdLog.info("core dumped")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -51,7 +51,7 @@ class TDTestCase:
|
||||||
else:
|
else:
|
||||||
tdLog.info("taosdemo found in %s" % buildPath)
|
tdLog.info("taosdemo found in %s" % buildPath)
|
||||||
binPath = buildPath + "/build/bin/"
|
binPath = buildPath + "/build/bin/"
|
||||||
os.system("%staosdemo -y -t %d -n %d" %
|
os.system("%staosdemo -y -t %d -n %d -b INT,INT,INT,INT" %
|
||||||
(binPath, self.numberOfTables, self.numberOfRecords))
|
(binPath, self.numberOfTables, self.numberOfRecords))
|
||||||
|
|
||||||
tdSql.execute("use test")
|
tdSql.execute("use test")
|
||||||
|
|
|
@ -54,7 +54,7 @@ class TDTestCase:
|
||||||
binPath = buildPath + "/build/bin/"
|
binPath = buildPath + "/build/bin/"
|
||||||
|
|
||||||
if(threadID == 0):
|
if(threadID == 0):
|
||||||
os.system("%staosdemo -y -t %d -n %d" %
|
os.system("%staosdemo -y -t %d -n %d -b INT,INT,INT,INT -m t" %
|
||||||
(binPath, self.numberOfTables, self.numberOfRecords))
|
(binPath, self.numberOfTables, self.numberOfRecords))
|
||||||
if(threadID == 1):
|
if(threadID == 1):
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
|
@ -60,7 +60,7 @@ class TDTestCase:
|
||||||
|
|
||||||
tdSql.execute("use test")
|
tdSql.execute("use test")
|
||||||
tdSql.query(
|
tdSql.query(
|
||||||
"select count(*) from test.t%d" % (self.numberOfTables -1))
|
"select count(*) from test.d%d" % (self.numberOfTables -1))
|
||||||
tdSql.checkData(0, 0, self.numberOfRecords)
|
tdSql.checkData(0, 0, self.numberOfRecords)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
|
|
@ -28,6 +28,7 @@ class TDTestCase:
|
||||||
tdSql.init(conn.cursor(), logSql)
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
global selfPath
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
if ("community" in selfPath):
|
if ("community" in selfPath):
|
||||||
|
@ -53,7 +54,7 @@ class TDTestCase:
|
||||||
tdLog.info("taosd found in %s" % buildPath)
|
tdLog.info("taosd found in %s" % buildPath)
|
||||||
|
|
||||||
binPath = buildPath+ "/build/bin/"
|
binPath = buildPath+ "/build/bin/"
|
||||||
testPath = buildPath[:buildPath.find("debug")]
|
testPath = selfPath+ "/../../../"
|
||||||
walFilePath = testPath + "/sim/dnode1/data/mnode_bak/wal/"
|
walFilePath = testPath + "/sim/dnode1/data/mnode_bak/wal/"
|
||||||
|
|
||||||
#new db and insert data
|
#new db and insert data
|
||||||
|
|
|
@ -86,6 +86,18 @@ class TwoClients:
|
||||||
tdSql.execute("alter table stb2_0 add column col2 binary(4)")
|
tdSql.execute("alter table stb2_0 add column col2 binary(4)")
|
||||||
tdSql.execute("alter table stb2_0 drop column col1")
|
tdSql.execute("alter table stb2_0 drop column col1")
|
||||||
tdSql.execute("insert into stb2_0 values(1614218422000,8638,'R')")
|
tdSql.execute("insert into stb2_0 values(1614218422000,8638,'R')")
|
||||||
|
tdSql.execute("drop dnode 10")
|
||||||
|
sleep(10)
|
||||||
|
os.system("rm -rf /var/lib/taos/*")
|
||||||
|
print("clear dnode chenhaoran02'data files")
|
||||||
|
os.system("nohup /usr/bin/taosd > /dev/null 2>&1 &")
|
||||||
|
print("start taosd")
|
||||||
|
sleep(10)
|
||||||
|
tdSql.execute("reset query cache ;")
|
||||||
|
tdSql.execute("create dnode chenhaoran02 ;")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# stop taosd and compact wal file
|
# stop taosd and compact wal file
|
||||||
|
|
|
@ -198,29 +198,25 @@ if $data12_db != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql alter database db wal 1
|
sql_error alter database db wal 1
|
||||||
sql show databases
|
|
||||||
print wal $data12_db
|
|
||||||
if $data12_db != 1 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql alter database db wal 1
|
|
||||||
sql alter database db wal 2
|
sql_error alter database db wal 1
|
||||||
sql alter database db wal 1
|
sql_error alter database db wal 2
|
||||||
sql alter database db wal 2
|
sql_error alter database db wal 1
|
||||||
sql alter database db wal 0
|
sql_error alter database db wal 2
|
||||||
|
sql_error alter database db wal 0
|
||||||
sql_error alter database db wal 3
|
sql_error alter database db wal 3
|
||||||
sql_error alter database db wal 4
|
sql_error alter database db wal 4
|
||||||
sql_error alter database db wal -1
|
sql_error alter database db wal -1
|
||||||
sql_error alter database db wal 1000
|
sql_error alter database db wal 1000
|
||||||
|
|
||||||
print ============== step fsync
|
print ============== step fsync
|
||||||
sql alter database db fsync 0
|
sql_error alter database db fsync 0
|
||||||
sql alter database db fsync 1
|
sql_error alter database db fsync 1
|
||||||
sql alter database db fsync 3600
|
sql_error alter database db fsync 3600
|
||||||
sql alter database db fsync 18000
|
sql_error alter database db fsync 18000
|
||||||
sql alter database db fsync 180000
|
sql_error alter database db fsync 180000
|
||||||
sql_error alter database db fsync 180001
|
sql_error alter database db fsync 180001
|
||||||
sql_error alter database db fsync -1
|
sql_error alter database db fsync -1
|
||||||
|
|
||||||
|
|
|
@ -495,18 +495,13 @@ if $data12_db != 1 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql_error alter topic db wal 1
|
sql_error alter topic db wal 1
|
||||||
sql alter database db wal 1
|
sql_error alter database db wal 1
|
||||||
sql show databases
|
|
||||||
print wal $data12_db
|
|
||||||
if $data12_db != 1 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql alter database db wal 1
|
sql_error alter database db wal 1
|
||||||
sql alter database db wal 2
|
sql_error alter database db wal 2
|
||||||
sql alter database db wal 1
|
sql_error alter database db wal 1
|
||||||
sql alter database db wal 2
|
sql_error alter database db wal 2
|
||||||
sql alter database db wal 0
|
sql_error alter database db wal 0
|
||||||
sql_error alter database db wal 3
|
sql_error alter database db wal 3
|
||||||
sql_error alter database db wal 4
|
sql_error alter database db wal 4
|
||||||
sql_error alter database db wal -1
|
sql_error alter database db wal -1
|
||||||
|
@ -523,11 +518,11 @@ sql_error alter topic db wal -1
|
||||||
sql_error alter topic db wal 1000
|
sql_error alter topic db wal 1000
|
||||||
|
|
||||||
print ============== step fsync
|
print ============== step fsync
|
||||||
sql alter database db fsync 0
|
sql_error alter database db fsync 0
|
||||||
sql alter database db fsync 1
|
sql_error alter database db fsync 1
|
||||||
sql alter database db fsync 3600
|
sql_error alter database db fsync 3600
|
||||||
sql alter database db fsync 18000
|
sql_error alter database db fsync 18000
|
||||||
sql alter database db fsync 180000
|
sql_error alter database db fsync 180000
|
||||||
sql_error alter database db fsync 180001
|
sql_error alter database db fsync 180001
|
||||||
sql_error alter database db fsync -1
|
sql_error alter database db fsync -1
|
||||||
|
|
||||||
|
@ -615,17 +610,6 @@ if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql alter database d1 fsync 0
|
|
||||||
sql show topics;
|
|
||||||
if $rows != 0 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql show databases;
|
|
||||||
if $rows != 1 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql drop database d1
|
sql drop database d1
|
||||||
sql show topics;
|
sql show topics;
|
||||||
if $rows != 0 then
|
if $rows != 0 then
|
||||||
|
@ -649,17 +633,6 @@ if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql alter database d1 fsync 0
|
|
||||||
sql show topics;
|
|
||||||
if $rows != 1 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql show databases;
|
|
||||||
if $rows != 1 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql drop database d1
|
sql drop database d1
|
||||||
sql show topics;
|
sql show topics;
|
||||||
if $rows != 0 then
|
if $rows != 0 then
|
||||||
|
|
|
@ -237,7 +237,42 @@ sql_error create database $db ctime 29
|
||||||
sql_error create database $db ctime 40961
|
sql_error create database $db ctime 40961
|
||||||
|
|
||||||
# wal {0, 2}
|
# wal {0, 2}
|
||||||
#sql_error create database $db wal 0
|
sql create database testwal wal 0
|
||||||
|
sql show databases
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show databases
|
||||||
|
print wallevel $data12_testwal
|
||||||
|
if $data12_testwal != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql drop database testwal
|
||||||
|
|
||||||
|
sql create database testwal wal 1
|
||||||
|
sql show databases
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql show databases
|
||||||
|
print wallevel $data12_testwal
|
||||||
|
if $data12_testwal != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql drop database testwal
|
||||||
|
|
||||||
|
sql create database testwal wal 2
|
||||||
|
sql show databases
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
print wallevel $data12_testwal
|
||||||
|
if $data12_testwal != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql drop database testwal
|
||||||
|
|
||||||
sql_error create database $db wal -1
|
sql_error create database $db wal -1
|
||||||
sql_error create database $db wal 3
|
sql_error create database $db wal 3
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sleep 2000
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
print =============== step1
|
||||||
|
$db = testlp
|
||||||
|
$mte = ste
|
||||||
|
$mt = st
|
||||||
|
sql drop database $db -x step1
|
||||||
|
step1:
|
||||||
|
sql create database $db precision 'us'
|
||||||
|
sql use $db
|
||||||
|
sql create stable $mte (ts timestamp, f int) TAGS(t1 bigint)
|
||||||
|
|
||||||
|
line_insert st,t1=3i,t2=4,t3="t3" c1=3i,c3=L"passit",c2=false,c4=4 1626006833639000000
|
||||||
|
line_insert st,t1=4i,t3="t41",t2=5 c1=3i,c3=L"passiT",c2=true,c4=5 1626006833640000000
|
||||||
|
line_insert stf,t1=4i,t2=5,t3="t4" c1=3i,c3=L"passitagain",c2=true,c4=5 1626006833642000000
|
||||||
|
line_insert ste,t2=5,t3=L"ste" c1=true,c2=4,c3="iam" 1626056811823316532
|
||||||
|
|
||||||
|
sql select * from st
|
||||||
|
if $rows != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != @21-07-11 20:33:53.639000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != @passit@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select * from stf
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select * from ste
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
#print =============== clear
|
||||||
|
sql drop database $db
|
||||||
|
sql show databases
|
||||||
|
if $rows != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -190,32 +190,32 @@ if $rows != 12800 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql select top(c1, 100), tbname, t1, t2 from select_tags_mt0;
|
sql select top(c1, 80), tbname, t1, t2 from select_tags_mt0;
|
||||||
if $rows != 100 then
|
if $rows != 80 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data00 != @70-01-01 08:03:30.100@ then
|
if $data00 != @70-01-01 08:03:40.100@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data10 != @70-01-01 08:03:30.200@ then
|
if $data10 != @70-01-01 08:03:40.200@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data01 != 110 then
|
if $data01 != 111 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data02 != @select_tags_tb11@ then
|
if $data02 != @select_tags_tb12@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data03 != 11 then
|
if $data03 != 12 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data04 != @abc11@ then
|
if $data04 != @abc12@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -248,8 +248,8 @@ if $data04 != @abc12@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql select bottom(c1, 100), tbname, t1, t2 from select_tags_mt0;
|
sql select bottom(c1, 72), tbname, t1, t2 from select_tags_mt0;
|
||||||
if $rows != 100 then
|
if $rows != 72 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,8 @@ enum {
|
||||||
SIM_CMD_RESTFUL,
|
SIM_CMD_RESTFUL,
|
||||||
SIM_CMD_TEST,
|
SIM_CMD_TEST,
|
||||||
SIM_CMD_RETURN,
|
SIM_CMD_RETURN,
|
||||||
|
SIM_CMD_LINE_INSERT,
|
||||||
|
SIM_CMD_LINE_INSERT_ERROR,
|
||||||
SIM_CMD_END
|
SIM_CMD_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -172,6 +174,8 @@ bool simExecuteSqlCmd(SScript *script, char *option);
|
||||||
bool simExecuteSqlErrorCmd(SScript *script, char *rest);
|
bool simExecuteSqlErrorCmd(SScript *script, char *rest);
|
||||||
bool simExecuteSqlSlowCmd(SScript *script, char *option);
|
bool simExecuteSqlSlowCmd(SScript *script, char *option);
|
||||||
bool simExecuteRestfulCmd(SScript *script, char *rest);
|
bool simExecuteRestfulCmd(SScript *script, char *rest);
|
||||||
|
bool simExecuteLineInsertCmd(SScript *script, char *option);
|
||||||
|
bool simExecuteLineInsertErrorCmd(SScript *script, char *option);
|
||||||
void simVisuallizeOption(SScript *script, char *src, char *dst);
|
void simVisuallizeOption(SScript *script, char *src, char *dst);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1067,3 +1067,49 @@ bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool simExecuteLineInsertCmd(SScript *script, char *rest) {
|
||||||
|
char buf[TSDB_MAX_BINARY_LEN];
|
||||||
|
|
||||||
|
simVisuallizeOption(script, rest, buf);
|
||||||
|
rest = buf;
|
||||||
|
|
||||||
|
SCmdLine *line = &script->lines[script->linePos];
|
||||||
|
|
||||||
|
simInfo("script:%s, %s", script->fileName, rest);
|
||||||
|
simLogSql(buf, true);
|
||||||
|
char * lines[] = {rest};
|
||||||
|
int32_t ret = taos_insert_lines(script->taos, lines, 1);
|
||||||
|
if (ret == TSDB_CODE_SUCCESS) {
|
||||||
|
simDebug("script:%s, taos:%p, %s executed. success.", script->fileName, script->taos, rest);
|
||||||
|
script->linePos++;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
sprintf(script->error, "lineNum: %d. line: %s failed, ret:%d:%s", line->lineNum, rest,
|
||||||
|
ret & 0XFFFF, tstrerror(ret));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool simExecuteLineInsertErrorCmd(SScript *script, char *rest) {
|
||||||
|
char buf[TSDB_MAX_BINARY_LEN];
|
||||||
|
|
||||||
|
simVisuallizeOption(script, rest, buf);
|
||||||
|
rest = buf;
|
||||||
|
|
||||||
|
SCmdLine *line = &script->lines[script->linePos];
|
||||||
|
|
||||||
|
simInfo("script:%s, %s", script->fileName, rest);
|
||||||
|
simLogSql(buf, true);
|
||||||
|
char * lines[] = {rest};
|
||||||
|
int32_t ret = taos_insert_lines(script->taos, lines, 1);
|
||||||
|
if (ret == TSDB_CODE_SUCCESS) {
|
||||||
|
sprintf(script->error, "script:%s, taos:%p, %s executed. expect failed, but success.", script->fileName, script->taos, rest);
|
||||||
|
script->linePos++;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
simDebug("lineNum: %d. line: %s failed, ret:%d:%s. Expect failed, so success", line->lineNum, rest,
|
||||||
|
ret & 0XFFFF, tstrerror(ret));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -838,6 +838,38 @@ bool simParseRunBackCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool simParseLineInsertCmd(char* rest, SCommand* pCmd, int32_t lineNum) {
|
||||||
|
int32_t expLen;
|
||||||
|
|
||||||
|
rest++;
|
||||||
|
cmdLine[numOfLines].cmdno = SIM_CMD_LINE_INSERT;
|
||||||
|
cmdLine[numOfLines].lineNum = lineNum;
|
||||||
|
cmdLine[numOfLines].optionOffset = optionOffset;
|
||||||
|
expLen = (int32_t)strlen(rest);
|
||||||
|
memcpy(optionBuffer + optionOffset, rest, expLen);
|
||||||
|
optionOffset += expLen + 1;
|
||||||
|
*(optionBuffer + optionOffset - 1) = 0;
|
||||||
|
|
||||||
|
numOfLines++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool simParseLineInsertErrorCmd(char* rest, SCommand* pCmd, int32_t lineNum) {
|
||||||
|
int32_t expLen;
|
||||||
|
|
||||||
|
rest++;
|
||||||
|
cmdLine[numOfLines].cmdno = SIM_CMD_LINE_INSERT;
|
||||||
|
cmdLine[numOfLines].lineNum = lineNum;
|
||||||
|
cmdLine[numOfLines].optionOffset = optionOffset;
|
||||||
|
expLen = (int32_t)strlen(rest);
|
||||||
|
memcpy(optionBuffer + optionOffset, rest, expLen);
|
||||||
|
optionOffset += expLen + 1;
|
||||||
|
*(optionBuffer + optionOffset - 1) = 0;
|
||||||
|
|
||||||
|
numOfLines++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void simInitsimCmdList() {
|
void simInitsimCmdList() {
|
||||||
int32_t cmdno;
|
int32_t cmdno;
|
||||||
memset(simCmdList, 0, SIM_CMD_END * sizeof(SCommand));
|
memset(simCmdList, 0, SIM_CMD_END * sizeof(SCommand));
|
||||||
|
@ -1049,4 +1081,20 @@ void simInitsimCmdList() {
|
||||||
simCmdList[cmdno].parseCmd = simParseReturnCmd;
|
simCmdList[cmdno].parseCmd = simParseReturnCmd;
|
||||||
simCmdList[cmdno].executeCmd = simExecuteReturnCmd;
|
simCmdList[cmdno].executeCmd = simExecuteReturnCmd;
|
||||||
simAddCmdIntoHash(&(simCmdList[cmdno]));
|
simAddCmdIntoHash(&(simCmdList[cmdno]));
|
||||||
|
|
||||||
|
cmdno = SIM_CMD_LINE_INSERT;
|
||||||
|
simCmdList[cmdno].cmdno = cmdno;
|
||||||
|
strcpy(simCmdList[cmdno].name, "line_insert");
|
||||||
|
simCmdList[cmdno].nlen = (int16_t)strlen(simCmdList[cmdno].name);
|
||||||
|
simCmdList[cmdno].parseCmd = simParseLineInsertCmd;
|
||||||
|
simCmdList[cmdno].executeCmd = simExecuteLineInsertCmd;
|
||||||
|
simAddCmdIntoHash(&(simCmdList[cmdno]));
|
||||||
|
|
||||||
|
cmdno = SIM_CMD_LINE_INSERT_ERROR;
|
||||||
|
simCmdList[cmdno].cmdno = cmdno;
|
||||||
|
strcpy(simCmdList[cmdno].name, "line_insert_error");
|
||||||
|
simCmdList[cmdno].nlen = (int16_t)strlen(simCmdList[cmdno].name);
|
||||||
|
simCmdList[cmdno].parseCmd = simParseLineInsertErrorCmd;
|
||||||
|
simCmdList[cmdno].executeCmd = simExecuteLineInsertErrorCmd;
|
||||||
|
simAddCmdIntoHash(&(simCmdList[cmdno]));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue