[td-225]merge develop.
This commit is contained in:
commit
134a825d9b
|
@ -2,25 +2,25 @@
|
||||||
|
|
||||||
## <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>通过源码安装
|
||||||
|
|
||||||
请参考我们的[TDengine github主页](https://github.com/taosdata/TDengine)下载源码并安装.
|
请参考我们的 [TDengine github 主页](https://github.com/taosdata/TDengine) 下载源码并安装.
|
||||||
|
|
||||||
### 通过Docker容器运行
|
### 通过 Docker 容器运行
|
||||||
|
|
||||||
暂时不建议生产环境采用 Docker 来部署 TDengine 的客户端或服务端,但在开发环境下或初次尝试时,使用 Docker 方式部署是十分方便的。特别是,利用 Docker,可以方便地在 Mac OSX 和 Windows 环境下尝试 TDengine。
|
暂时不建议生产环境采用 Docker 来部署 TDengine 的客户端或服务端,但在开发环境下或初次尝试时,使用 Docker 方式部署是十分方便的。特别是,利用 Docker,可以方便地在 Mac OS X 和 Windows 环境下尝试 TDengine。
|
||||||
|
|
||||||
详细操作方法请参照 [通过Docker快速体验TDengine](https://www.taosdata.com/cn/documentation/getting-started/docker)。
|
详细操作方法请参照 [通过 Docker 快速体验 TDengine](https://www.taosdata.com/cn/documentation/getting-started/docker)。
|
||||||
|
|
||||||
### <a class="anchor" id="package-install"></a>通过安装包安装
|
### <a class="anchor" id="package-install"></a>通过安装包安装
|
||||||
|
|
||||||
TDengine的安装非常简单,从下载到安装成功仅仅只要几秒钟。服务端安装包包含客户端和连接器,我们提供三种安装包,您可以根据需要选择:
|
TDengine 的安装非常简单,从下载到安装成功仅仅只要几秒钟。服务端安装包包含客户端和连接器,我们提供三种安装包,您可以根据需要选择:
|
||||||
|
|
||||||
安装包下载在[这里](https://www.taosdata.com/cn/getting-started/#通过安装包安装)。
|
安装包下载在 [这里](https://www.taosdata.com/cn/getting-started/#通过安装包安装)。
|
||||||
|
|
||||||
具体的安装过程,请参见[TDengine多种安装包的安装和卸载](https://www.taosdata.com/blog/2019/08/09/566.html)以及[视频教程](https://www.taosdata.com/blog/2020/11/11/1941.html)。
|
具体的安装过程,请参见 [TDengine 多种安装包的安装和卸载](https://www.taosdata.com/blog/2019/08/09/566.html) 以及 [视频教程](https://www.taosdata.com/blog/2020/11/11/1941.html)。
|
||||||
|
|
||||||
## <a class="anchor" id="start"></a>轻松启动
|
## <a class="anchor" id="start"></a>轻松启动
|
||||||
|
|
||||||
|
@ -53,21 +53,21 @@ $ systemctl status taosd
|
||||||
如果系统中不支持 systemd,也可以用手动运行 /usr/local/taos/bin/taosd 方式启动 TDengine 服务。
|
如果系统中不支持 systemd,也可以用手动运行 /usr/local/taos/bin/taosd 方式启动 TDengine 服务。
|
||||||
|
|
||||||
|
|
||||||
## <a class="anchor" id="console"></a>TDengine命令行程序
|
## <a class="anchor" id="console"></a>TDengine 命令行程序
|
||||||
|
|
||||||
执行TDengine命令行程序,您只要在Linux终端执行`taos`即可。
|
执行 TDengine 命令行程序,您只要在 Linux 终端执行 `taos` 即可。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ taos
|
$ taos
|
||||||
```
|
```
|
||||||
|
|
||||||
如果TDengine终端连接服务成功,将会打印出欢迎消息和版本信息。如果失败,则会打印错误消息出来(请参考[FAQ](https://www.taosdata.com/cn/documentation/faq/)来解决终端连接服务端失败的问题)。TDengine终端的提示符号如下:
|
如果 TDengine 终端连接服务成功,将会打印出欢迎消息和版本信息。如果失败,则会打印错误消息出来(请参考 [FAQ](https://www.taosdata.com/cn/documentation/faq/) 来解决终端连接服务端失败的问题)。TDengine 终端的提示符号如下:
|
||||||
|
|
||||||
```cmd
|
```cmd
|
||||||
taos>
|
taos>
|
||||||
```
|
```
|
||||||
|
|
||||||
在TDengine终端中,用户可以通过SQL命令来创建/删除数据库、表等,并进行插入查询操作。在终端中运行的SQL语句需要以分号结束来运行。示例:
|
在 TDengine 终端中,用户可以通过 SQL 命令来创建/删除数据库、表等,并进行插入查询操作。在终端中运行的 SQL 语句需要以分号结束来运行。示例:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
create database demo;
|
create database demo;
|
||||||
|
@ -76,24 +76,24 @@ create table t (ts timestamp, speed int);
|
||||||
insert into t values ('2019-07-15 00:00:00', 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 终端检查系统运行状态,添加删除用户账号等。
|
||||||
|
|
||||||
### 命令行参数
|
### 命令行参数
|
||||||
|
|
||||||
您可通过配置命令行参数来改变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
|
||||||
- -?, --help: 打印出所有命令行参数
|
- -?, --help: 打印出所有命令行参数
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
|
@ -102,7 +102,7 @@ Query OK, 2 row(s) in set (0.001700s)
|
||||||
$ taos -h 192.168.0.1 -s "use db; show tables;"
|
$ taos -h 192.168.0.1 -s "use db; show tables;"
|
||||||
```
|
```
|
||||||
|
|
||||||
### 运行SQL命令脚本
|
### 运行 SQL 命令脚本
|
||||||
|
|
||||||
TDengine 终端可以通过 `source` 命令来运行 SQL 命令脚本.
|
TDengine 终端可以通过 `source` 命令来运行 SQL 命令脚本.
|
||||||
|
|
||||||
|
@ -110,27 +110,27 @@ TDengine 终端可以通过 `source` 命令来运行 SQL 命令脚本.
|
||||||
taos> source <filename>;
|
taos> source <filename>;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Shell小技巧
|
### Shell 小技巧
|
||||||
|
|
||||||
- 可以使用上下光标键查看历史输入的指令
|
- 可以使用上下光标键查看历史输入的指令
|
||||||
- 修改用户密码。在 shell 中使用 alter user 指令
|
- 修改用户密码,在 shell 中使用 alter user 指令
|
||||||
- ctrl+c 中止正在进行中的查询
|
- ctrl+c 中止正在进行中的查询
|
||||||
- 执行 `RESET QUERY CACHE` 清空本地缓存的表 schema
|
- 执行 `RESET QUERY CACHE` 清空本地缓存的表 schema
|
||||||
|
|
||||||
|
|
||||||
## <a class="anchor" id="demo"></a>TDengine 极速体验
|
## <a class="anchor" id="demo"></a>TDengine 极速体验
|
||||||
|
|
||||||
启动TDengine的服务,在Linux终端执行taosdemo
|
启动 TDengine 的服务,在 Linux 终端执行 taosdemo
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ 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,49 +138,43 @@ $ 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` 详细列出。您可以设置不同参数进行体验。
|
||||||
|
|
||||||
|
|
||||||
## 客户端和报警模块
|
## 客户端和报警模块
|
||||||
|
|
||||||
如果客户端和服务端运行在不同的电脑上,可以单独安装客户端。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>支持平台列表
|
||||||
|
|
||||||
### TDengine服务器支持的平台列表
|
### TDengine 服务器支持的平台列表
|
||||||
|
|
||||||
| | **CentOS 6/7/8** | **Ubuntu 16/18/20** | **Other Linux** | **统信 UOS** | **银河/中标麒麟** | **凝思 V60/V80** | **华为 EulerOS** |
|
| | **CentOS 6/7/8** | **Ubuntu 16/18/20** | **Other Linux** | **统信 UOS** | **银河/中标麒麟** | **凝思 V60/V80** | **华为 EulerOS** |
|
||||||
| -------------- | --------------------- | ------------------------ | --------------- | --------------- | ------------------------- | --------------------- | --------------------- |
|
| -------------- | --------------------- | ------------------------ | --------------- | --------------- | ------------------------- | --------------------- | --------------------- |
|
||||||
|
@ -201,9 +195,9 @@ taos> select avg(f1), max(f2), min(f3) from test.t10 interval(10s);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### TDengine客户端和连接器支持的平台列表
|
### TDengine 客户端和连接器支持的平台列表
|
||||||
|
|
||||||
目前TDengine的连接器可支持的平台广泛,目前包括:X64/X86/ARM64/ARM32/MIPS/Alpha等硬件平台,以及Linux/Win64/Win32等开发环境。
|
目前 TDengine 的连接器可支持的平台广泛,目前包括:X64/X86/ARM64/ARM32/MIPS/Alpha 等硬件平台,以及 Linux/Win64/Win32 等开发环境。
|
||||||
|
|
||||||
对照矩阵如下:
|
对照矩阵如下:
|
||||||
|
|
||||||
|
@ -220,5 +214,5 @@ taos> select avg(f1), max(f2), min(f3) from test.t10 interval(10s);
|
||||||
|
|
||||||
注: ● 表示经过官方测试验证, ○ 表示非官方测试验证。
|
注: ● 表示经过官方测试验证, ○ 表示非官方测试验证。
|
||||||
|
|
||||||
请跳转到 [连接器](https://www.taosdata.com/cn/documentation/connector)查看更详细的信息。
|
请跳转到 [连接器](https://www.taosdata.com/cn/documentation/connector) 查看更详细的信息。
|
||||||
|
|
||||||
|
|
|
@ -1129,6 +1129,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
|
@ -1200,9 +1200,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) {
|
||||||
|
@ -1470,6 +1472,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);
|
||||||
|
|
||||||
|
@ -1646,7 +1649,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);
|
||||||
|
|
|
@ -98,7 +98,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);
|
||||||
|
@ -2023,8 +2023,8 @@ static SUdfInfo* isValidUdf(SArray* pUdfInfo, const char* name, int32_t len) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
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";
|
||||||
|
@ -2072,7 +2072,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) {
|
||||||
|
@ -2208,14 +2208,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;
|
||||||
|
@ -2239,7 +2240,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
|
||||||
|
@ -2247,13 +2248,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) {
|
||||||
|
@ -2261,12 +2262,40 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
|
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
|
||||||
SSchema colSchema = *tGetTbnameColumnSchema();
|
if (outerQuery) {
|
||||||
char name[TSDB_COL_NAME_LEN] = {0};
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||||
getColumnName(pItem, name, colSchema.name, sizeof(colSchema.name) - 1);
|
int32_t numOfCols = tscGetNumOfColumns(pTableMetaInfo->pTableMeta);
|
||||||
|
|
||||||
tstrncpy(colSchema.name, name, TSDB_COL_NAME_LEN);
|
bool existed = false;
|
||||||
/*SExprInfo* pExpr = */tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema, TSDB_COL_TAG, getNewResColId(pCmd));
|
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();
|
||||||
|
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_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;
|
||||||
|
@ -7501,8 +7530,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8331,7 +8359,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;
|
||||||
}
|
}
|
||||||
|
@ -8471,7 +8499,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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2544,7 +2544,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2885,8 +2885,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,
|
||||||
|
|
|
@ -3434,6 +3434,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));
|
||||||
|
|
||||||
|
@ -3707,6 +3708,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
|
||||||
|
|
|
@ -75,7 +75,7 @@ enum TEST_MODE {
|
||||||
|
|
||||||
#define MAX_RECORDS_PER_REQ 32766
|
#define MAX_RECORDS_PER_REQ 32766
|
||||||
|
|
||||||
#define HEAD_BUFF_LEN 1024*24 // 16*1024 + (192+32)*2 + insert into ..
|
#define HEAD_BUFF_LEN TSDB_MAX_COLUMNS*24 // 16*MAX_COLUMNS + (192+32)*2 + insert into ..
|
||||||
|
|
||||||
#define MAX_SQL_SIZE 65536
|
#define MAX_SQL_SIZE 65536
|
||||||
#define BUFFER_SIZE (65536*2)
|
#define BUFFER_SIZE (65536*2)
|
||||||
|
@ -84,26 +84,23 @@ enum TEST_MODE {
|
||||||
#define MAX_PASSWORD_SIZE 64
|
#define MAX_PASSWORD_SIZE 64
|
||||||
#define MAX_HOSTNAME_SIZE 64
|
#define MAX_HOSTNAME_SIZE 64
|
||||||
#define MAX_TB_NAME_SIZE 64
|
#define MAX_TB_NAME_SIZE 64
|
||||||
#define MAX_DATA_SIZE (16*1024)+20 // max record len: 16*1024, timestamp string and ,('') need extra space
|
#define MAX_DATA_SIZE (16*TSDB_MAX_COLUMNS)+20 // max record len: 16*MAX_COLUMNS, timestamp string and ,('') need extra space
|
||||||
#define MAX_NUM_DATATYPE 10
|
|
||||||
#define OPT_ABORT 1 /* –abort */
|
#define OPT_ABORT 1 /* –abort */
|
||||||
#define STRING_LEN 60000
|
#define STRING_LEN 60000
|
||||||
#define MAX_PREPARED_RAND 1000000
|
#define MAX_PREPARED_RAND 1000000
|
||||||
#define MAX_FILE_NAME_LEN 256 // max file name length on linux is 255.
|
#define MAX_FILE_NAME_LEN 256 // max file name length on linux is 255.
|
||||||
|
|
||||||
#define MAX_SAMPLES_ONCE_FROM_FILE 10000
|
#define MAX_SAMPLES_ONCE_FROM_FILE 10000
|
||||||
#define MAX_NUM_DATATYPE 10
|
#define MAX_NUM_COLUMNS (TSDB_MAX_COLUMNS - 1) // exclude first column timestamp
|
||||||
|
|
||||||
#define MAX_DB_COUNT 8
|
#define MAX_DB_COUNT 8
|
||||||
#define MAX_SUPER_TABLE_COUNT 200
|
#define MAX_SUPER_TABLE_COUNT 200
|
||||||
#define MAX_COLUMN_COUNT 1024
|
|
||||||
#define MAX_TAG_COUNT 128
|
|
||||||
|
|
||||||
#define MAX_QUERY_SQL_COUNT 100
|
#define MAX_QUERY_SQL_COUNT 100
|
||||||
#define MAX_QUERY_SQL_LENGTH 1024
|
#define MAX_QUERY_SQL_LENGTH 1024
|
||||||
|
|
||||||
#define MAX_DATABASE_COUNT 256
|
#define MAX_DATABASE_COUNT 256
|
||||||
#define INPUT_BUF_LEN 256
|
#define INPUT_BUF_LEN 256
|
||||||
|
|
||||||
#define DEFAULT_TIMESTAMP_STEP 1
|
#define DEFAULT_TIMESTAMP_STEP 1
|
||||||
|
|
||||||
|
@ -218,7 +215,7 @@ typedef struct SArguments_S {
|
||||||
bool performance_print;
|
bool performance_print;
|
||||||
char * output_file;
|
char * output_file;
|
||||||
bool async_mode;
|
bool async_mode;
|
||||||
char * datatype[MAX_NUM_DATATYPE + 1];
|
char * datatype[MAX_NUM_COLUMNS + 1];
|
||||||
uint32_t len_of_binary;
|
uint32_t len_of_binary;
|
||||||
uint32_t num_of_CPR;
|
uint32_t num_of_CPR;
|
||||||
uint32_t num_of_threads;
|
uint32_t num_of_threads;
|
||||||
|
@ -274,9 +271,9 @@ typedef struct SSuperTable_S {
|
||||||
char tagsFile[MAX_FILE_NAME_LEN];
|
char tagsFile[MAX_FILE_NAME_LEN];
|
||||||
|
|
||||||
uint32_t columnCount;
|
uint32_t columnCount;
|
||||||
StrColumn columns[MAX_COLUMN_COUNT];
|
StrColumn columns[TSDB_MAX_COLUMNS];
|
||||||
uint32_t tagCount;
|
uint32_t tagCount;
|
||||||
StrColumn tags[MAX_TAG_COUNT];
|
StrColumn tags[TSDB_MAX_TAGS];
|
||||||
|
|
||||||
char* childTblName;
|
char* childTblName;
|
||||||
char* colsOfCreateChildTable;
|
char* colsOfCreateChildTable;
|
||||||
|
@ -565,6 +562,8 @@ double randdouble[MAX_PREPARED_RAND];
|
||||||
char *aggreFunc[] = {"*", "count(*)", "avg(col0)", "sum(col0)",
|
char *aggreFunc[] = {"*", "count(*)", "avg(col0)", "sum(col0)",
|
||||||
"max(col0)", "min(col0)", "first(col0)", "last(col0)"};
|
"max(col0)", "min(col0)", "first(col0)", "last(col0)"};
|
||||||
|
|
||||||
|
#define DEFAULT_DATATYPE_NUM 3
|
||||||
|
|
||||||
SArguments g_args = {
|
SArguments g_args = {
|
||||||
NULL, // metaFile
|
NULL, // metaFile
|
||||||
0, // test_mode
|
0, // test_mode
|
||||||
|
@ -595,7 +594,7 @@ SArguments g_args = {
|
||||||
{
|
{
|
||||||
"FLOAT", // datatype
|
"FLOAT", // datatype
|
||||||
"INT", // datatype
|
"INT", // datatype
|
||||||
"FLOAT", // datatype
|
"FLOAT", // datatype. DEFAULT_DATATYPE_NUM is 3
|
||||||
},
|
},
|
||||||
16, // len_of_binary
|
16, // len_of_binary
|
||||||
4, // num_of_CPR
|
4, // num_of_CPR
|
||||||
|
@ -725,9 +724,13 @@ static void printHelp() {
|
||||||
"The data_type of columns, default: FLOAT, INT, FLOAT.");
|
"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%s%d\n", indent, "-l", indent,
|
||||||
"The number of columns per record. Default is 3. Max values is ",
|
"The number of columns per record. Default is ",
|
||||||
MAX_NUM_DATATYPE);
|
DEFAULT_DATATYPE_NUM,
|
||||||
|
". Max values is ",
|
||||||
|
MAX_NUM_COLUMNS);
|
||||||
|
printf("%s%s%s%s\n", indent, indent, indent,
|
||||||
|
"All of the new column(s) type is INT. If use -b to specify column type, -l will be ignored.");
|
||||||
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.");
|
||||||
printf("%s%s%s%s\n", indent, "-i", indent,
|
printf("%s%s%s%s\n", indent, "-i", indent,
|
||||||
|
@ -931,13 +934,16 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
}
|
}
|
||||||
arguments->num_of_CPR = atoi(argv[++i]);
|
arguments->num_of_CPR = atoi(argv[++i]);
|
||||||
|
|
||||||
if (arguments->num_of_CPR > MAX_NUM_DATATYPE) {
|
if (arguments->num_of_CPR > MAX_NUM_COLUMNS) {
|
||||||
printf("WARNING: max acceptible columns count is %d\n", MAX_NUM_DATATYPE);
|
printf("WARNING: max acceptible columns count is %d\n", MAX_NUM_COLUMNS);
|
||||||
prompt();
|
prompt();
|
||||||
arguments->num_of_CPR = MAX_NUM_DATATYPE;
|
arguments->num_of_CPR = MAX_NUM_COLUMNS;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int col = arguments->num_of_CPR; col < MAX_NUM_DATATYPE; col++) {
|
for (int col = DEFAULT_DATATYPE_NUM; col < arguments->num_of_CPR; col ++) {
|
||||||
|
arguments->datatype[col] = "INT";
|
||||||
|
}
|
||||||
|
for (int col = arguments->num_of_CPR; col < MAX_NUM_COLUMNS; col++) {
|
||||||
arguments->datatype[col] = NULL;
|
arguments->datatype[col] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -990,7 +996,7 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
}
|
}
|
||||||
arguments->datatype[index++] = token;
|
arguments->datatype[index++] = token;
|
||||||
token = strsep(&running, ",");
|
token = strsep(&running, ",");
|
||||||
if (index >= MAX_NUM_DATATYPE) break;
|
if (index >= MAX_NUM_COLUMNS) break;
|
||||||
}
|
}
|
||||||
arguments->datatype[index] = NULL;
|
arguments->datatype[index] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1086,7 +1092,7 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int columnCount;
|
int columnCount;
|
||||||
for (columnCount = 0; columnCount < MAX_NUM_DATATYPE; columnCount ++) {
|
for (columnCount = 0; columnCount < MAX_NUM_COLUMNS; columnCount ++) {
|
||||||
if (g_args.datatype[columnCount] == NULL) {
|
if (g_args.datatype[columnCount] == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1111,7 +1117,7 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
arguments->use_metric ? "true" : "false");
|
arguments->use_metric ? "true" : "false");
|
||||||
if (*(arguments->datatype)) {
|
if (*(arguments->datatype)) {
|
||||||
printf("# Specified data type: ");
|
printf("# Specified data type: ");
|
||||||
for (int i = 0; i < MAX_NUM_DATATYPE; i++)
|
for (int i = 0; i < MAX_NUM_COLUMNS; i++)
|
||||||
if (arguments->datatype[i])
|
if (arguments->datatype[i])
|
||||||
printf("%s,", arguments->datatype[i]);
|
printf("%s,", arguments->datatype[i]);
|
||||||
else
|
else
|
||||||
|
@ -2389,8 +2395,15 @@ static char* generateTagVaulesForStb(SSuperTable* stbInfo, int32_t tableSeq) {
|
||||||
tmfree(buf);
|
tmfree(buf);
|
||||||
} else if (0 == strncasecmp(stbInfo->tags[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->tags[i].dataType,
|
||||||
"int", strlen("int"))) {
|
"int", strlen("int"))) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, TSDB_MAX_SQL_LEN - dataLen,
|
if ((g_args.demo_mode) && (i == 0)) {
|
||||||
|
dataLen += snprintf(dataBuf + dataLen,
|
||||||
|
TSDB_MAX_SQL_LEN - dataLen,
|
||||||
|
"%d, ", tableSeq % 10);
|
||||||
|
} else {
|
||||||
|
dataLen += snprintf(dataBuf + dataLen,
|
||||||
|
TSDB_MAX_SQL_LEN - dataLen,
|
||||||
"%d, ", tableSeq);
|
"%d, ", tableSeq);
|
||||||
|
}
|
||||||
} else if (0 == strncasecmp(stbInfo->tags[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->tags[i].dataType,
|
||||||
"bigint", strlen("bigint"))) {
|
"bigint", strlen("bigint"))) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, TSDB_MAX_SQL_LEN - dataLen,
|
dataLen += snprintf(dataBuf + dataLen, TSDB_MAX_SQL_LEN - dataLen,
|
||||||
|
@ -2787,16 +2800,26 @@ static int createSuperTable(
|
||||||
char* dataType = superTbl->tags[tagIndex].dataType;
|
char* dataType = superTbl->tags[tagIndex].dataType;
|
||||||
|
|
||||||
if (strcasecmp(dataType, "BINARY") == 0) {
|
if (strcasecmp(dataType, "BINARY") == 0) {
|
||||||
len += snprintf(tags + len, STRING_LEN - len, "t%d %s(%d), ", tagIndex,
|
if ((g_args.demo_mode) && (tagIndex == 1)) {
|
||||||
"BINARY", superTbl->tags[tagIndex].dataLen);
|
len += snprintf(tags + len, STRING_LEN - len,
|
||||||
|
"loction BINARY(%d), ",
|
||||||
|
superTbl->tags[tagIndex].dataLen);
|
||||||
|
} else {
|
||||||
|
len += snprintf(tags + len, STRING_LEN - len, "t%d %s(%d), ",
|
||||||
|
tagIndex, "BINARY", superTbl->tags[tagIndex].dataLen);
|
||||||
|
}
|
||||||
lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + 3;
|
lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + 3;
|
||||||
} else if (strcasecmp(dataType, "NCHAR") == 0) {
|
} else if (strcasecmp(dataType, "NCHAR") == 0) {
|
||||||
len += snprintf(tags + len, STRING_LEN - len, "t%d %s(%d), ", tagIndex,
|
len += snprintf(tags + len, STRING_LEN - len, "t%d %s(%d), ", tagIndex,
|
||||||
"NCHAR", superTbl->tags[tagIndex].dataLen);
|
"NCHAR", superTbl->tags[tagIndex].dataLen);
|
||||||
lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + 3;
|
lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + 3;
|
||||||
} else if (strcasecmp(dataType, "INT") == 0) {
|
} else if (strcasecmp(dataType, "INT") == 0) {
|
||||||
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
if ((g_args.demo_mode) && (tagIndex == 0)) {
|
||||||
|
len += snprintf(tags + len, STRING_LEN - len, "groupId INT, ");
|
||||||
|
} else {
|
||||||
|
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
||||||
"INT");
|
"INT");
|
||||||
|
}
|
||||||
lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + 11;
|
lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + 11;
|
||||||
} else if (strcasecmp(dataType, "BIGINT") == 0) {
|
} else if (strcasecmp(dataType, "BIGINT") == 0) {
|
||||||
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
||||||
|
@ -3352,9 +3375,9 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
}
|
}
|
||||||
|
|
||||||
int columnSize = cJSON_GetArraySize(columns);
|
int columnSize = cJSON_GetArraySize(columns);
|
||||||
if ((columnSize + 1/* ts */) > MAX_COLUMN_COUNT) {
|
if ((columnSize + 1/* ts */) > TSDB_MAX_COLUMNS) {
|
||||||
errorPrint("%s() LN%d, failed to read json, column size overflow, max column size is %d\n",
|
errorPrint("%s() LN%d, failed to read json, column size overflow, max column size is %d\n",
|
||||||
__func__, __LINE__, MAX_COLUMN_COUNT);
|
__func__, __LINE__, TSDB_MAX_COLUMNS);
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3410,9 +3433,9 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((index + 1 /* ts */) > MAX_COLUMN_COUNT) {
|
if ((index + 1 /* ts */) > MAX_NUM_COLUMNS) {
|
||||||
errorPrint("%s() LN%d, failed to read json, column size overflow, allowed max column size is %d\n",
|
errorPrint("%s() LN%d, failed to read json, column size overflow, allowed max column size is %d\n",
|
||||||
__func__, __LINE__, MAX_COLUMN_COUNT);
|
__func__, __LINE__, MAX_NUM_COLUMNS);
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3429,9 +3452,9 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
}
|
}
|
||||||
|
|
||||||
int tagSize = cJSON_GetArraySize(tags);
|
int tagSize = cJSON_GetArraySize(tags);
|
||||||
if (tagSize > MAX_TAG_COUNT) {
|
if (tagSize > TSDB_MAX_TAGS) {
|
||||||
errorPrint("%s() LN%d, failed to read json, tags size overflow, max tag size is %d\n",
|
errorPrint("%s() LN%d, failed to read json, tags size overflow, max tag size is %d\n",
|
||||||
__func__, __LINE__, MAX_TAG_COUNT);
|
__func__, __LINE__, TSDB_MAX_TAGS);
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3481,17 +3504,17 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index > MAX_TAG_COUNT) {
|
if (index > TSDB_MAX_TAGS) {
|
||||||
errorPrint("%s() LN%d, failed to read json, tags size overflow, allowed max tag count is %d\n",
|
errorPrint("%s() LN%d, failed to read json, tags size overflow, allowed max tag count is %d\n",
|
||||||
__func__, __LINE__, MAX_TAG_COUNT);
|
__func__, __LINE__, TSDB_MAX_TAGS);
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
superTbls->tagCount = index;
|
superTbls->tagCount = index;
|
||||||
|
|
||||||
if ((superTbls->columnCount + superTbls->tagCount + 1 /* ts */) > MAX_COLUMN_COUNT) {
|
if ((superTbls->columnCount + superTbls->tagCount + 1 /* ts */) > TSDB_MAX_COLUMNS) {
|
||||||
errorPrint("%s() LN%d, columns + tags is more than allowed max columns count: %d\n",
|
errorPrint("%s() LN%d, columns + tags is more than allowed max columns count: %d\n",
|
||||||
__func__, __LINE__, MAX_COLUMN_COUNT);
|
__func__, __LINE__, TSDB_MAX_COLUMNS);
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
ret = true;
|
ret = true;
|
||||||
|
@ -7919,7 +7942,7 @@ static void setParaFromArg(){
|
||||||
g_Dbs.db[0].superTbls[0].maxSqlLen = g_args.max_sql_len;
|
g_Dbs.db[0].superTbls[0].maxSqlLen = g_args.max_sql_len;
|
||||||
|
|
||||||
g_Dbs.db[0].superTbls[0].columnCount = 0;
|
g_Dbs.db[0].superTbls[0].columnCount = 0;
|
||||||
for (int i = 0; i < MAX_NUM_DATATYPE; i++) {
|
for (int i = 0; i < MAX_NUM_COLUMNS; i++) {
|
||||||
if (data_type[i] == NULL) {
|
if (data_type[i] == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1786,6 +1786,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};
|
||||||
|
@ -1793,61 +1836,19 @@ static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData,
|
||||||
|
|
||||||
tValuePair **pList = pInfo->res;
|
tValuePair **pList = pInfo->res;
|
||||||
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);
|
||||||
(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) ||
|
taosheapsort((void *) pList, sizeof(tValuePair **), pInfo->num + 1, (const void *) &type, topBotComparFn, (const void *) &pTagInfo->tagsLen, topBotSwapFn, 0);
|
||||||
(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);
|
|
||||||
} 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1861,57 +1862,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 {
|
taosheapsort((void *) pList, sizeof(tValuePair **), pInfo->num + 1, (const void *) &type, topBotComparFn, (const void *) &pTagInfo->tagsLen, topBotSwapFn, 1);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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