Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
e7167dbf
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
e7167dbf
编写于
1月 06, 2022
作者:
A
Alex Duan
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' into fix/TS-802-D1
上级
2c6ffc01
5ffa14b4
变更
49
展开全部
隐藏空白更改
内联
并排
Showing
49 changed file
with
4508 addition
and
685 deletion
+4508
-685
documentation20/cn/12.taos-sql/02.udf/docs.md
documentation20/cn/12.taos-sql/02.udf/docs.md
+1
-0
documentation20/cn/12.taos-sql/docs.md
documentation20/cn/12.taos-sql/docs.md
+52
-54
src/client/src/tscProfile.c
src/client/src/tscProfile.c
+10
-0
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+14
-7
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+5
-0
src/connector/C#/.gitignore
src/connector/C#/.gitignore
+2
-2
src/connector/C#/csharpTaos.sln
src/connector/C#/csharpTaos.sln
+14
-14
src/connector/C#/src/TDengineDriver/TDengineDriver.cs
src/connector/C#/src/TDengineDriver/TDengineDriver.cs
+1
-1
src/connector/C#/src/TDengineDriver/TDengineDriver.csproj
src/connector/C#/src/TDengineDriver/TDengineDriver.csproj
+2
-2
src/connector/C#/src/TDengineDriver/TaosMultiBind.cs
src/connector/C#/src/TDengineDriver/TaosMultiBind.cs
+43
-50
src/connector/C#/src/test/Cases/FetchLength.cs
src/connector/C#/src/test/Cases/FetchLength.cs
+0
-44
src/connector/C#/src/test/Cases/Program.cs
src/connector/C#/src/test/Cases/Program.cs
+0
-90
src/connector/C#/src/test/Cases/StmtStable.cs
src/connector/C#/src/test/Cases/StmtStable.cs
+0
-188
src/connector/C#/src/test/Cases/TaosFeild.cs
src/connector/C#/src/test/Cases/TaosFeild.cs
+0
-39
src/connector/C#/src/test/FunctionTest/DataSource.cs
src/connector/C#/src/test/FunctionTest/DataSource.cs
+421
-0
src/connector/C#/src/test/FunctionTest/FetchLength.cs
src/connector/C#/src/test/FunctionTest/FetchLength.cs
+56
-0
src/connector/C#/src/test/FunctionTest/FunctionTest.csproj
src/connector/C#/src/test/FunctionTest/FunctionTest.csproj
+28
-0
src/connector/C#/src/test/FunctionTest/ResultSetUtils.cs
src/connector/C#/src/test/FunctionTest/ResultSetUtils.cs
+39
-0
src/connector/C#/src/test/FunctionTest/StmtNormalTable.cs
src/connector/C#/src/test/FunctionTest/StmtNormalTable.cs
+455
-0
src/connector/C#/src/test/FunctionTest/StmtQuery.cs
src/connector/C#/src/test/FunctionTest/StmtQuery.cs
+0
-0
src/connector/C#/src/test/FunctionTest/StmtStable.cs
src/connector/C#/src/test/FunctionTest/StmtStable.cs
+468
-0
src/connector/C#/src/test/FunctionTest/StmtUtil.cs
src/connector/C#/src/test/FunctionTest/StmtUtil.cs
+0
-0
src/connector/C#/src/test/FunctionTest/TaosFeild.cs
src/connector/C#/src/test/FunctionTest/TaosFeild.cs
+80
-0
src/connector/C#/src/test/FunctionTest/Utils.cs
src/connector/C#/src/test/FunctionTest/Utils.cs
+388
-0
src/connector/C#/src/test/XUnitTest/TestTDengineMeta.cs
src/connector/C#/src/test/XUnitTest/TestTDengineMeta.cs
+76
-3
src/connector/C#/src/test/XUnitTest/TestTaosBind.cs
src/connector/C#/src/test/XUnitTest/TestTaosBind.cs
+208
-57
src/kit/shell/src/shellCheck.c
src/kit/shell/src/shellCheck.c
+1
-1
src/mnode/inc/mnodeVgroup.h
src/mnode/inc/mnodeVgroup.h
+1
-1
src/mnode/src/mnodeTable.c
src/mnode/src/mnodeTable.c
+21
-2
src/mnode/src/mnodeVgroup.c
src/mnode/src/mnodeVgroup.c
+39
-2
src/plugins/monitor/src/monMain.c
src/plugins/monitor/src/monMain.c
+6
-2
src/plugins/taosadapter
src/plugins/taosadapter
+1
-1
src/query/src/qFill.c
src/query/src/qFill.c
+4
-1
tests/develop-test/2-query/ts_2016.py
tests/develop-test/2-query/ts_2016.py
+62
-0
tests/develop-test/3-connectors/c#/test.sh
tests/develop-test/3-connectors/c#/test.sh
+3
-1
tests/develop-test/fulltest-query.sh
tests/develop-test/fulltest-query.sh
+1
-0
tests/examples/C#/.gitignore
tests/examples/C#/.gitignore
+2
-0
tests/examples/C#/jsonTag/JsonTag.cs
tests/examples/C#/jsonTag/JsonTag.cs
+18
-2
tests/examples/C#/jsonTag/Util.cs
tests/examples/C#/jsonTag/Util.cs
+3
-117
tests/examples/C#/jsonTag/jsonTag.csproj
tests/examples/C#/jsonTag/jsonTag.csproj
+12
-0
tests/examples/JDBC/connectionPools/pom.xml
tests/examples/JDBC/connectionPools/pom.xml
+1
-1
tests/examples/JDBC/taosdemo/pom.xml
tests/examples/JDBC/taosdemo/pom.xml
+1
-1
tests/perftest-scripts/HttpPerfCompare.py
tests/perftest-scripts/HttpPerfCompare.py
+137
-0
tests/perftest-scripts/specifyColsComparison.py
tests/perftest-scripts/specifyColsComparison.py
+197
-0
tests/pytest/fulltest-query.sh
tests/pytest/fulltest-query.sh
+1
-1
tests/pytest/functions/function_derivative.py
tests/pytest/functions/function_derivative.py
+6
-0
tests/pytest/functions/function_elapsed_case.py
tests/pytest/functions/function_elapsed_case.py
+3
-1
tests/pytest/query/queryTbnameUpperLower.py
tests/pytest/query/queryTbnameUpperLower.py
+2
-0
tests/system-test/2-query/function_elapsed.py
tests/system-test/2-query/function_elapsed.py
+1623
-0
未找到文件。
documentation20/cn/12.taos-sql/02.udf/docs.md
浏览文件 @
e7167dbf
...
@@ -53,6 +53,7 @@ TDengine 提供 3 个 UDF 的源代码示例,分别为:
...
@@ -53,6 +53,7 @@ TDengine 提供 3 个 UDF 的源代码示例,分别为:
*
numOfOutput:输出数据的个数,对聚合函数来说只能是0或者1。
*
numOfOutput:输出数据的个数,对聚合函数来说只能是0或者1。
*
buf:用于在 UDF 与引擎间的状态控制信息传递块。
*
buf:用于在 UDF 与引擎间的状态控制信息传递块。
其他典型场景,如协方差的计算,即可通过定义聚合UDF的方式实现。
### 其他 UDF 函数
### 其他 UDF 函数
...
...
documentation20/cn/12.taos-sql/docs.md
浏览文件 @
e7167dbf
...
@@ -1350,18 +1350,18 @@ TDengine支持针对数据的聚合查询。提供支持的聚合和选择函数
...
@@ -1350,18 +1350,18 @@ TDengine支持针对数据的聚合查询。提供支持的聚合和选择函数
```mysql
```mysql
SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };
SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };
```
```
功能说明:返回表/超级表的最后一条记录。
功能说明:返回表/超级表的最后一条记录。
返回结果数据类型:同应用的字段。
返回结果数据类型:同应用的字段。
应用字段:所有字段。
应用字段:所有字段。
适用于:**表、超级表**。
适用于:**表、超级表**。
限制:LAST_ROW() 不能与 INTERVAL 一起使用。
限制:LAST_ROW() 不能与 INTERVAL 一起使用。
说明:在用于超级表时,时间戳完全一样且同为最大的数据行可能有多个,那么会从中随机返回一条,而并不保证多次运行所挑选的数据行必然一致。<br/>
说明:在用于超级表时,时间戳完全一样且同为最大的数据行可能有多个,那么会从中随机返回一条,而并不保证多次运行所挑选的数据行必然一致。<br/>
<br/>示例:
<br/>示例:
```mysql
```mysql
taos> SELECT LAST_ROW(current) FROM meters;
taos> SELECT LAST_ROW(current) FROM meters;
...
@@ -1383,51 +1383,51 @@ TDengine支持针对数据的聚合查询。提供支持的聚合和选择函数
...
@@ -1383,51 +1383,51 @@ TDengine支持针对数据的聚合查询。提供支持的聚合和选择函数
SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [ RANGE(timestamp1,timestamp2) ] [EVERY(interval)] [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [ RANGE(timestamp1,timestamp2) ] [EVERY(interval)] [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
```
```
功能说明:返回表/超级表的指定时间截面指定列的记录值(插值)。
功能说明:返回表/超级表的指定时间截面指定列的记录值(插值)。
返回结果数据类型:同字段类型。
返回结果数据类型:同字段类型。
应用字段:数值型字段。
应用字段:数值型字段。
适用于:**表、超级表、嵌套查询**。
适用于:**表、超级表、嵌套查询**。
说明:
说明:
1)INTERP用于在指定时间断面获取指定列的记录值,如果该时间断面不存在符合条件的行数据,那么会根据 FILL 参数的设定进行插值。
1)INTERP用于在指定时间断面获取指定列的记录值,如果该时间断面不存在符合条件的行数据,那么会根据 FILL 参数的设定进行插值。
2)INTERP的输入数据为指定列的数据,可以通过条件语句(where子句)来对原始列数据进行过滤,如果没有指定过滤条件则输入为全部数据。
2)INTERP的输入数据为指定列的数据,可以通过条件语句(where子句)来对原始列数据进行过滤,如果没有指定过滤条件则输入为全部数据。
3)INTERP的输出时间范围根据RANGE(timestamp1,timestamp2)字段来指定,需满足timestamp1<=timestamp2。其中timestamp1(必选值)为输出时间范围的起始值,即如果timestamp1时刻符合插值条件则timestamp1为输出的第一条记录,timestamp2(必选值)为输出时间范围的结束值,即输出的最后一条记录的timestamp不能大于timestamp2。如果没有指定RANGE,那么满足过滤条件的输入数据中第一条记录的timestamp即为timestamp1,最后一条记录的timestamp即为timestamp2,同样也满足timestamp1 <= timestamp2。
3)INTERP的输出时间范围根据RANGE(timestamp1,timestamp2)字段来指定,需满足timestamp1<=timestamp2。其中timestamp1(必选值)为输出时间范围的起始值,即如果timestamp1时刻符合插值条件则timestamp1为输出的第一条记录,timestamp2(必选值)为输出时间范围的结束值,即输出的最后一条记录的timestamp不能大于timestamp2。如果没有指定RANGE,那么满足过滤条件的输入数据中第一条记录的timestamp即为timestamp1,最后一条记录的timestamp即为timestamp2,同样也满足timestamp1 <= timestamp2。
4)INTERP根据EVERY字段来确定输出时间范围内的结果条数,即从timestamp1开始每隔固定长度的时间(EVERY值)进行插值。如果没有指定EVERY,则默认窗口大小为无穷大,即从timestamp1开始只有一个窗口。
4)INTERP根据EVERY字段来确定输出时间范围内的结果条数,即从timestamp1开始每隔固定长度的时间(EVERY值)进行插值。如果没有指定EVERY,则默认窗口大小为无穷大,即从timestamp1开始只有一个窗口。
5)INTERP根据FILL字段来决定在每个符合输出条件的时刻如何进行插值,如果没有FILL字段则默认不插值,即输出为原始记录值或不输出(原始记录不存在)。
5)INTERP根据FILL字段来决定在每个符合输出条件的时刻如何进行插值,如果没有FILL字段则默认不插值,即输出为原始记录值或不输出(原始记录不存在)。
6)INTERP只能在一个时间序列内进行插值,因此当作用于超级表时必须跟group by tbname一起使用,当作用嵌套查询外层时内层子查询不能含GROUP BY信息。
6)INTERP只能在一个时间序列内进行插值,因此当作用于超级表时必须跟group by tbname一起使用,当作用嵌套查询外层时内层子查询不能含GROUP BY信息。
7)INTERP的插值结果不受ORDER BY timestamp的影响,ORDER BY timestamp只影响输出结果的排序。
7)INTERP的插值结果不受ORDER BY timestamp的影响,ORDER BY timestamp只影响输出结果的排序。
SQL示例:
SQL示例:
1) 单点线性插值
1) 单点线性插值
```mysql
```mysql
taos> SELECT INTERP(*) FROM t1 RANGE('2017-7-14 18:40:00','2017-7-14 18:40:00') FILL(LINEAR);
taos> SELECT INTERP(*) FROM t1 RANGE('2017-7-14 18:40:00','2017-7-14 18:40:00') FILL(LINEAR);
```
```
2) 在2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行取值(不插值)
2) 在2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行取值(不插值)
```mysql
```mysql
taos> SELECT INTERP(*) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s);
taos> SELECT INTERP(*) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s);
```
```
3) 在2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行线性插值
3) 在2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行线性插值
```mysql
```mysql
taos> SELECT INTERP(*) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);
taos> SELECT INTERP(*) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);
```
```
4.在所有时间范围内每隔5秒钟进行向后插值
4.在所有时间范围内每隔5秒钟进行向后插值
```mysql
```mysql
taos> SELECT INTERP(*) FROM t1 EVERY(5s) FILL(NEXT);
taos> SELECT INTERP(*) FROM t1 EVERY(5s) FILL(NEXT);
```
```
5.根据2017-07-14 17:00:00到2017-07-14 20:00:00间的数据进行从2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行线性插值
5.根据2017-07-14 17:00:00到2017-07-14 20:00:00间的数据进行从2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行线性插值
```mysql
```mysql
taos> SELECT INTERP(*) FROM t1 where ts >= '2017-07-14 17:00:00' and ts <= '2017-07-14 20:00:00' RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);
taos> SELECT INTERP(*) FROM t1 where ts >= '2017-07-14 17:00:00' and ts <= '2017-07-14 20:00:00' RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);
```
```
- **INTERP [2.3.1之前的版本]**
- **INTERP [2.3.1之前的版本]**
...
@@ -1436,15 +1436,15 @@ SQL示例:
...
@@ -1436,15 +1436,15 @@ SQL示例:
SELECT INTERP(field_name) FROM { tb_name | stb_name } WHERE ts='timestamp' [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
SELECT INTERP(field_name) FROM { tb_name | stb_name } WHERE ts='timestamp' [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
```
```
功能说明:返回表/超级表的指定时间截面、指定字段的记录。
功能说明:返回表/超级表的指定时间截面、指定字段的记录。
返回结果数据类型:同字段类型。
返回结果数据类型:同字段类型。
应用字段:数值型字段。
应用字段:数值型字段。
适用于:**表、超级表**。
适用于:**表、超级表**。
说明:(从 2.0.15.0 版本开始新增此函数) <br/>1)INTERP 必须指定时间断面,如果该时间断面不存在直接对应的数据,那么会根据 FILL 参数的设定进行插值。此外,条件语句里面可附带筛选条件,例如标签、tbname。<br/>2)INTERP 查询要求查询的时间区间必须位于数据集合(表)的所有记录的时间范围之内。如果给定的时间戳位于时间范围之外,即使有插值指令,仍然不返回结果。<br/>3)单个 INTERP 函数查询只能够针对一个时间点进行查询,如果需要返回等时间间隔的断面数据,可以通过 INTERP 配合 EVERY 的方式来进行查询处理(而不是使用 INTERVAL),其含义是每隔固定长度的时间进行插值。<br/>
说明:(从 2.0.15.0 版本开始新增此函数) <br/>1)INTERP 必须指定时间断面,如果该时间断面不存在直接对应的数据,那么会根据 FILL 参数的设定进行插值。此外,条件语句里面可附带筛选条件,例如标签、tbname。<br/>2)INTERP 查询要求查询的时间区间必须位于数据集合(表)的所有记录的时间范围之内。如果给定的时间戳位于时间范围之外,即使有插值指令,仍然不返回结果。<br/>3)单个 INTERP 函数查询只能够针对一个时间点进行查询,如果需要返回等时间间隔的断面数据,可以通过 INTERP 配合 EVERY 的方式来进行查询处理(而不是使用 INTERVAL),其含义是每隔固定长度的时间进行插值。<br/>
示例:
示例:
```mysql
```mysql
...
@@ -1455,7 +1455,7 @@ SQL示例:
...
@@ -1455,7 +1455,7 @@ SQL示例:
Query OK, 1 row(s) in set (0.002652s)
Query OK, 1 row(s) in set (0.002652s)
```
```
如果给定的时间戳无对应的数据,在不指定插值生成策略的情况下,不会返回结果,如果指定了插值策略,会根据插值策略返回结果。
如果给定的时间戳无对应的数据,在不指定插值生成策略的情况下,不会返回结果,如果指定了插值策略,会根据插值策略返回结果。
```mysql
```mysql
taos> SELECT INTERP(*) FROM meters WHERE tbname IN ('d636') AND ts='2017-7-14 18:40:00.005';
taos> SELECT INTERP(*) FROM meters WHERE tbname IN ('d636') AND ts='2017-7-14 18:40:00.005';
...
@@ -1468,7 +1468,7 @@ SQL示例:
...
@@ -1468,7 +1468,7 @@ SQL示例:
Query OK, 1 row(s) in set (0.003056s)
Query OK, 1 row(s) in set (0.003056s)
```
```
如下所示代码表示在时间区间 `['2017-7-14 18:40:00', '2017-7-14 18:40:00.014']` 中每隔 5 毫秒 进行一次断面计算。
如下所示代码表示在时间区间 `['2017-7-14 18:40:00', '2017-7-14 18:40:00.014']` 中每隔 5 毫秒 进行一次断面计算。
```mysql
```mysql
taos> SELECT INTERP(current) FROM d636 WHERE ts>='2017-7-14 18:40:00' AND ts<='2017-7-14 18:40:00.014' EVERY(5a);
taos> SELECT INTERP(current) FROM d636 WHERE ts>='2017-7-14 18:40:00' AND ts<='2017-7-14 18:40:00.014' EVERY(5a);
...
@@ -1577,8 +1577,6 @@ SQL示例:
...
@@ -1577,8 +1577,6 @@ SQL示例:
支持 +、-、*、/ 运算,如 ceil(col1) + ceil(col2)。
支持 +、-、*、/ 运算,如 ceil(col1) + ceil(col2)。
只能与普通列,选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
只能与普通列,选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
该函数可以应用在普通表和超级表上。
该函数可以应用在普通表和超级表上。
支持版本:指定计算算法的功能从 2.2.0.x 版本开始,2.2.0.0 之前的版本不支持指定使用算法的功能。
- **FLOOR**
- **FLOOR**
```mysql
```mysql
...
...
src/client/src/tscProfile.c
浏览文件 @
e7167dbf
...
@@ -170,6 +170,16 @@ void tscAddIntoStreamList(SSqlStream *pStream) {
...
@@ -170,6 +170,16 @@ void tscAddIntoStreamList(SSqlStream *pStream) {
STscObj
*
pObj
=
pStream
->
pSql
->
pTscObj
;
STscObj
*
pObj
=
pStream
->
pSql
->
pTscObj
;
pthread_mutex_lock
(
&
pObj
->
mutex
);
pthread_mutex_lock
(
&
pObj
->
mutex
);
//check if newly added stream node is present
//in the streamList to prevent loop in the list
SSqlStream
*
iter
=
pObj
->
streamList
;
while
(
iter
)
{
if
(
pStream
==
iter
)
{
pthread_mutex_unlock
(
&
pObj
->
mutex
);
return
;
}
iter
=
iter
->
next
;
}
pStream
->
next
=
pObj
->
streamList
;
pStream
->
next
=
pObj
->
streamList
;
if
(
pObj
->
streamList
)
pObj
->
streamList
->
prev
=
pStream
;
if
(
pObj
->
streamList
)
pObj
->
streamList
->
prev
=
pStream
;
...
...
src/client/src/tscSQLParser.c
浏览文件 @
e7167dbf
...
@@ -1392,7 +1392,7 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSl
...
@@ -1392,7 +1392,7 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSl
const
char
*
msg1
=
"sliding value no larger than the interval value"
;
const
char
*
msg1
=
"sliding value no larger than the interval value"
;
const
char
*
msg2
=
"sliding value can not less than 1% of interval value"
;
const
char
*
msg2
=
"sliding value can not less than 1% of interval value"
;
const
char
*
msg3
=
"does not support sliding when interval is natural month/year"
;
const
char
*
msg3
=
"does not support sliding when interval is natural month/year"
;
const
char
*
msg4
=
"sliding not support for interp query"
;
const
char
*
msg4
=
"sliding not support for interp query"
;
const
static
int32_t
INTERVAL_SLIDING_FACTOR
=
100
;
const
static
int32_t
INTERVAL_SLIDING_FACTOR
=
100
;
...
@@ -1410,7 +1410,7 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSl
...
@@ -1410,7 +1410,7 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSl
if
(
interpQuery
)
{
if
(
interpQuery
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg4
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg4
);
}
}
if
(
pInterval
->
intervalUnit
==
'n'
||
pInterval
->
intervalUnit
==
'y'
)
{
if
(
pInterval
->
intervalUnit
==
'n'
||
pInterval
->
intervalUnit
==
'y'
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
}
...
@@ -2727,7 +2727,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
...
@@ -2727,7 +2727,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
memset
(
pExpr
->
base
.
aliasName
,
0
,
tListLen
(
pExpr
->
base
.
aliasName
));
memset
(
pExpr
->
base
.
aliasName
,
0
,
tListLen
(
pExpr
->
base
.
aliasName
));
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
token
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
token
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
SColumnList
list
=
createColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
SColumnList
list
=
createColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
if
(
finalResult
)
{
if
(
finalResult
)
{
int32_t
numOfOutput
=
tscNumOfFields
(
pQueryInfo
);
int32_t
numOfOutput
=
tscNumOfFields
(
pQueryInfo
);
...
@@ -2852,6 +2852,13 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
...
@@ -2852,6 +2852,13 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
char
val
[
8
]
=
{
0
};
char
val
[
8
]
=
{
0
};
int64_t
tickPerSec
=
0
;
int64_t
tickPerSec
=
0
;
char
*
exprToken
=
tcalloc
(
pParamElem
[
1
].
pNode
->
exprToken
.
n
+
1
,
sizeof
(
char
));
memcpy
(
exprToken
,
pParamElem
[
1
].
pNode
->
exprToken
.
z
,
pParamElem
[
1
].
pNode
->
exprToken
.
n
);
if
(
pParamElem
[
1
].
pNode
->
exprToken
.
type
==
TK_NOW
||
strstr
(
exprToken
,
"now"
))
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
tfree
(
exprToken
);
if
((
TSDB_DATA_TYPE_NULL
==
pParamElem
[
1
].
pNode
->
value
.
nType
)
||
tVariantDump
(
&
pParamElem
[
1
].
pNode
->
value
,
(
char
*
)
&
tickPerSec
,
TSDB_DATA_TYPE_BIGINT
,
true
)
<
0
)
{
if
((
TSDB_DATA_TYPE_NULL
==
pParamElem
[
1
].
pNode
->
value
.
nType
)
||
tVariantDump
(
&
pParamElem
[
1
].
pNode
->
value
,
(
char
*
)
&
tickPerSec
,
TSDB_DATA_TYPE_BIGINT
,
true
)
<
0
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
...
@@ -2866,7 +2873,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
...
@@ -2866,7 +2873,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg10
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg10
);
}
else
if
(
tickPerSec
<=
0
)
{
}
else
if
(
tickPerSec
<=
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg16
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg16
);
}
}
tscExprAddParams
(
&
pExpr
->
base
,
(
char
*
)
&
tickPerSec
,
TSDB_DATA_TYPE_BIGINT
,
LONG_BYTES
);
tscExprAddParams
(
&
pExpr
->
base
,
(
char
*
)
&
tickPerSec
,
TSDB_DATA_TYPE_BIGINT
,
LONG_BYTES
);
if
(
functionId
==
TSDB_FUNC_DERIVATIVE
)
{
if
(
functionId
==
TSDB_FUNC_DERIVATIVE
)
{
...
@@ -4906,14 +4913,14 @@ static int32_t validateNullExpr(tSqlExpr* pExpr, STableMeta* pTableMeta, int32_t
...
@@ -4906,14 +4913,14 @@ static int32_t validateNullExpr(tSqlExpr* pExpr, STableMeta* pTableMeta, int32_t
if
(
IS_VAR_DATA_TYPE
(
pSchema
[
index
].
type
)
||
pSchema
[
index
].
type
==
TSDB_DATA_TYPE_JSON
)
{
if
(
IS_VAR_DATA_TYPE
(
pSchema
[
index
].
type
)
||
pSchema
[
index
].
type
==
TSDB_DATA_TYPE_JSON
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
char
*
v
=
strndup
(
pRight
->
exprToken
.
z
,
pRight
->
exprToken
.
n
);
char
*
v
=
strndup
(
pRight
->
exprToken
.
z
,
pRight
->
exprToken
.
n
);
int32_t
len
=
strRmquote
(
v
,
pRight
->
exprToken
.
n
);
int32_t
len
=
strRmquote
(
v
,
pRight
->
exprToken
.
n
);
if
(
len
>
0
)
{
if
(
len
>
0
)
{
uint32_t
type
=
0
;
uint32_t
type
=
0
;
tGetToken
(
v
,
&
type
);
tGetToken
(
v
,
&
type
);
if
(
type
==
TK_NULL
)
{
if
(
type
==
TK_NULL
)
{
free
(
v
);
free
(
v
);
return
invalidOperationMsg
(
msgBuf
,
msg
);
return
invalidOperationMsg
(
msgBuf
,
msg
);
}
}
...
@@ -5229,7 +5236,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
...
@@ -5229,7 +5236,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
}
}
}
}
if
(
pRight
!=
NULL
&&
(
pRight
->
tokenId
==
TK_ID
||
pRight
->
tokenId
==
TK_ARROW
))
{
// join on tag columns for stable query
if
(
joinQuery
&&
pRight
!=
NULL
&&
(
pRight
->
tokenId
==
TK_ID
||
pRight
->
tokenId
==
TK_ARROW
))
{
// join on tag columns for stable query
if
(
!
validateJoinExprNode
(
pCmd
,
pQueryInfo
,
*
pExpr
,
&
index
))
{
if
(
!
validateJoinExprNode
(
pCmd
,
pQueryInfo
,
*
pExpr
,
&
index
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
...
...
src/client/src/tscUtil.c
浏览文件 @
e7167dbf
...
@@ -4315,6 +4315,11 @@ void executeQuery(SSqlObj* pSql, SQueryInfo* pQueryInfo) {
...
@@ -4315,6 +4315,11 @@ void executeQuery(SSqlObj* pSql, SQueryInfo* pQueryInfo) {
// create sub query to handle the sub query.
// create sub query to handle the sub query.
SQueryInfo
*
pq
=
tscGetQueryInfo
(
&
psub
->
cmd
);
SQueryInfo
*
pq
=
tscGetQueryInfo
(
&
psub
->
cmd
);
STableMetaInfo
*
pSubMeta
=
tscGetMetaInfo
(
pq
,
0
);
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pSubMeta
)
&&
pq
->
command
==
TSDB_SQL_RETRIEVE_EMPTY_RESULT
)
{
psub
->
cmd
.
command
=
TSDB_SQL_RETRIEVE_EMPTY_RESULT
;
}
executeQuery
(
psub
,
pq
);
executeQuery
(
psub
,
pq
);
}
}
...
...
src/connector/C#/.gitignore
浏览文件 @
e7167dbf
src/TDengineDriver/bin/
src/TDengineDriver/bin/
src/TDengineDriver/obj/
src/TDengineDriver/obj/
src/test/
Cases
/bin/
src/test/
FunctionTest
/bin/
src/test/
Cases
/obj/
src/test/
FunctionTest
/obj/
src/test/XUnitTest/bin/
src/test/XUnitTest/bin/
src/test/XUnitTest/obj/
src/test/XUnitTest/obj/
src/test/doc/
src/test/doc/
...
...
src/connector/C#/csharpTaos.sln
浏览文件 @
e7167dbf
...
@@ -11,7 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{CB8E6458-3
...
@@ -11,7 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{CB8E6458-3
EndProject
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XUnitTest", "src\test\XUnitTest\XUnitTest.csproj", "{64C0A478-2591-4459-9F8F-A70F37976A41}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XUnitTest", "src\test\XUnitTest\XUnitTest.csproj", "{64C0A478-2591-4459-9F8F-A70F37976A41}"
EndProject
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "
Cases", "src\test\Cases\Cases.csproj", "{19A69D26-66BF-4227-97BE-9B087BC76B2F
}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "
FunctionTest", "src\test\FunctionTest\FunctionTest.csproj", "{E66B034B-4677-4BFB-8B87-84715D281E21
}"
EndProject
EndProject
Global
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
GlobalSection(SolutionConfigurationPlatforms) = preSolution
...
@@ -50,23 +50,23 @@ Global
...
@@ -50,23 +50,23 @@ Global
{64C0A478-2591-4459-9F8F-A70F37976A41}.Release|x64.Build.0 = Release|Any CPU
{64C0A478-2591-4459-9F8F-A70F37976A41}.Release|x64.Build.0 = Release|Any CPU
{64C0A478-2591-4459-9F8F-A70F37976A41}.Release|x86.ActiveCfg = Release|Any CPU
{64C0A478-2591-4459-9F8F-A70F37976A41}.Release|x86.ActiveCfg = Release|Any CPU
{64C0A478-2591-4459-9F8F-A70F37976A41}.Release|x86.Build.0 = Release|Any CPU
{64C0A478-2591-4459-9F8F-A70F37976A41}.Release|x86.Build.0 = Release|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Debug|Any CPU.Build.0 = Debug|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Debug|Any CPU.Build.0 = Debug|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Debug|x64.ActiveCfg = Debug|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Debug|x64.ActiveCfg = Debug|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Debug|x64.Build.0 = Debug|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Debug|x64.Build.0 = Debug|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Debug|x86.ActiveCfg = Debug|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Debug|x86.ActiveCfg = Debug|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Debug|x86.Build.0 = Debug|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Debug|x86.Build.0 = Debug|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Release|Any CPU.ActiveCfg = Release|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Release|Any CPU.ActiveCfg = Release|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Release|Any CPU.Build.0 = Release|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Release|Any CPU.Build.0 = Release|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Release|x64.ActiveCfg = Release|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Release|x64.ActiveCfg = Release|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Release|x64.Build.0 = Release|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Release|x64.Build.0 = Release|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Release|x86.ActiveCfg = Release|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Release|x86.ActiveCfg = Release|Any CPU
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
}.Release|x86.Build.0 = Release|Any CPU
{
E66B034B-4677-4BFB-8B87-84715D281E21
}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
GlobalSection(NestedProjects) = preSolution
{5BED7402-0A65-4ED9-A491-C56BFB518045} = {A1FB5B66-E32F-4789-9BE9-042E5BD21087}
{5BED7402-0A65-4ED9-A491-C56BFB518045} = {A1FB5B66-E32F-4789-9BE9-042E5BD21087}
{CB8E6458-31E1-4351-B704-1B918E998654} = {A1FB5B66-E32F-4789-9BE9-042E5BD21087}
{CB8E6458-31E1-4351-B704-1B918E998654} = {A1FB5B66-E32F-4789-9BE9-042E5BD21087}
{64C0A478-2591-4459-9F8F-A70F37976A41} = {CB8E6458-31E1-4351-B704-1B918E998654}
{64C0A478-2591-4459-9F8F-A70F37976A41} = {CB8E6458-31E1-4351-B704-1B918E998654}
{
19A69D26-66BF-4227-97BE-9B087BC76B2F
} = {CB8E6458-31E1-4351-B704-1B918E998654}
{
E66B034B-4677-4BFB-8B87-84715D281E21
} = {CB8E6458-31E1-4351-B704-1B918E998654}
EndGlobalSection
EndGlobalSection
EndGlobal
EndGlobal
src/connector/C#/src/TDengineDriver/TDengineDriver.cs
浏览文件 @
e7167dbf
...
@@ -87,7 +87,7 @@ namespace TDengineDriver
...
@@ -87,7 +87,7 @@ namespace TDengineDriver
case
TDengineDataType
.
TSDB_DATA_TYPE_DOUBLE
:
case
TDengineDataType
.
TSDB_DATA_TYPE_DOUBLE
:
return
"DOUBLE"
;
return
"DOUBLE"
;
case
TDengineDataType
.
TSDB_DATA_TYPE_BINARY
:
case
TDengineDataType
.
TSDB_DATA_TYPE_BINARY
:
return
"
STRING
"
;
return
"
BINARY
"
;
case
TDengineDataType
.
TSDB_DATA_TYPE_TIMESTAMP
:
case
TDengineDataType
.
TSDB_DATA_TYPE_TIMESTAMP
:
return
"TIMESTAMP"
;
return
"TIMESTAMP"
;
case
TDengineDataType
.
TSDB_DATA_TYPE_NCHAR
:
case
TDengineDataType
.
TSDB_DATA_TYPE_NCHAR
:
...
...
src/connector/C#/src/TDengineDriver/TDengineDriver.csproj
浏览文件 @
e7167dbf
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
<TargetFrameworks>net5;netstandard2.0;net45</TargetFrameworks>
<TargetFrameworks>net5;netstandard2.0;net45</TargetFrameworks>
<PackageId>TDengine.Connector</PackageId>
<PackageId>TDengine.Connector</PackageId>
<PackageIcon>logo.jpg</PackageIcon>
<PackageIcon>logo.jpg</PackageIcon>
<Version>1.0.
3
</Version>
<Version>1.0.
4
</Version>
<Authors>taosdata</Authors>
<Authors>taosdata</Authors>
<Company>www.taosdata.com</Company>
<Company>www.taosdata.com</Company>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
This C # connector supports: Linux 64/Windows x64/Windows x86.
This C # connector supports: Linux 64/Windows x64/Windows x86.
more information please visit: https://www.taosdata.com
more information please visit: https://www.taosdata.com
</Description>
</Description>
<RepositoryUrl>https://github.com/taosdata/TDengine/tree/develop/src/connector/C%2
3
</RepositoryUrl>
<RepositoryUrl>https://github.com/taosdata/TDengine/tree/develop/src/connector/C%2
523/src/TDengineDriver
</RepositoryUrl>
<NoWarn>CS1591</NoWarn>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
</PropertyGroup>
<ItemGroup>
<ItemGroup>
...
...
src/connector/C#/src/TDengineDriver/TaosMultiBind.cs
浏览文件 @
e7167dbf
...
@@ -436,49 +436,46 @@ namespace TDengineDriver
...
@@ -436,49 +436,46 @@ namespace TDengineDriver
{
{
TAOS_MULTI_BIND
multiBind
=
new
TAOS_MULTI_BIND
();
TAOS_MULTI_BIND
multiBind
=
new
TAOS_MULTI_BIND
();
int
elementCount
=
arr
.
Length
;
int
elementCount
=
arr
.
Length
;
//TypeSize represent the Max element length of the comming arr
//The size of the buffer is typeSize * elementCount
//This buffer is used to store TAOS_MULTI_BIND.buffer
int
typeSize
=
MaxElementLength
(
arr
);
int
typeSize
=
MaxElementLength
(
arr
);
//This intSize is used to calcuate buffer size of the struct TAOS_MULTI_BIND's
//length. The buffer is intSize * elementCount,which is used to store TAOS_MULTI_BIND.length
int
intSize
=
sizeof
(
int
);
int
intSize
=
sizeof
(
int
);
//This byteSize is used to calculate the buffer size of the struct TAOS_MULTI_BIND.is_null
//This buffer size is byteSize * elementCount
int
byteSize
=
sizeof
(
byte
);
int
byteSize
=
sizeof
(
byte
);
StringBuilder
arrStrBuilder
=
new
StringBuilder
();
;
StringBuilder
arrStrBuilder
=
new
StringBuilder
();
;
//TAOS_MULTI_BIND.length
//TAOS_MULTI_BIND.length
IntPtr
lengthArr
=
Marshal
.
AllocHGlobal
(
intSize
*
elementCount
);
IntPtr
lengthArr
=
Marshal
.
AllocHGlobal
(
intSize
*
elementCount
);
//TAOS_MULTI_BIND.is_null
//TAOS_MULTI_BIND.is_null
IntPtr
nullArr
=
Marshal
.
AllocHGlobal
(
byteSize
*
elementCount
);
IntPtr
nullArr
=
Marshal
.
AllocHGlobal
(
byteSize
*
elementCount
);
//TAOS_MULTI_BIND.buffer
IntPtr
uNcharBuff
=
Marshal
.
AllocHGlobal
(
typeSize
*
elementCount
);
for
(
int
i
=
0
;
i
<
elementCount
;
i
++)
for
(
int
i
=
0
;
i
<
elementCount
;
i
++)
{
{
int
itemLength
=
0
;
int
itemLength
=
0
;
byte
[]
decodeByte
=
GetStringEncodeByte
(
arr
[
i
]);
byte
[]
decodeByte
=
GetStringEncodeByte
(
arr
[
i
]);
itemLength
=
decodeByte
.
Length
;
itemLength
=
decodeByte
.
Length
;
// if element if not null and element length is less then typeSize
if
(!
String
.
IsNullOrEmpty
(
arr
[
i
]))
// fill the memory with default char.Since arr element memory need align.
if
(!
String
.
IsNullOrEmpty
(
arr
[
i
])
&&
typeSize
==
itemLength
)
{
arrStrBuilder
.
Append
(
arr
[
i
]);
}
else
if
(!
String
.
IsNullOrEmpty
(
arr
[
i
])
&&
typeSize
>
itemLength
)
{
arrStrBuilder
.
Append
(
arr
[
i
]);
arrStrBuilder
.
Append
(
AlignCharArr
(
typeSize
-
itemLength
));
}
else
{
{
// if is null value,fill the memory with default values.
for
(
int
j
=
0
;
j
<
itemLength
;
j
++)
arrStrBuilder
.
Append
(
AlignCharArr
(
typeSize
));
{
//Read byte after byte
Marshal
.
WriteByte
(
uNcharBuff
,
i
*
typeSize
+
j
,
decodeByte
[
j
]);
}
}
}
//Set TAOS_MULTI_BIND.length
//set TAOS_MULTI_BIND.length
Marshal
.
WriteInt32
(
lengthArr
,
intSize
*
i
,
itemLength
);
Marshal
.
WriteInt32
(
lengthArr
,
intSize
*
i
,
typeSize
);
//Set TAOS_MULTI_BIND.is_null
//set TAOS_MULTI_BIND.is_null
Marshal
.
WriteByte
(
nullArr
,
byteSize
*
i
,
Convert
.
ToByte
(
String
.
IsNullOrEmpty
(
arr
[
i
])
?
1
:
0
));
Marshal
.
WriteByte
(
nullArr
,
byteSize
*
i
,
Convert
.
ToByte
(
String
.
IsNullOrEmpty
(
arr
[
i
])
?
1
:
0
));
}
}
//set TAOS_MULTI_BIND.buffer
//Config TAOS_MULTI_BIND
IntPtr
uBinaryBuff
=
(
IntPtr
)
Marshal
.
StringToHGlobalAnsi
(
arrStrBuilder
.
ToString
());
//config TAOS_MULTI_BIND
multiBind
.
buffer_type
=
(
int
)
TDengineDataType
.
TSDB_DATA_TYPE_BINARY
;
multiBind
.
buffer_type
=
(
int
)
TDengineDataType
.
TSDB_DATA_TYPE_BINARY
;
multiBind
.
buffer
=
u
Binary
Buff
;
multiBind
.
buffer
=
u
Nchar
Buff
;
multiBind
.
buffer_length
=
(
ulong
)
typeSize
;
multiBind
.
buffer_length
=
(
ulong
)
typeSize
;
multiBind
.
length
=
lengthArr
;
multiBind
.
length
=
lengthArr
;
multiBind
.
is_null
=
nullArr
;
multiBind
.
is_null
=
nullArr
;
...
@@ -491,47 +488,43 @@ namespace TDengineDriver
...
@@ -491,47 +488,43 @@ namespace TDengineDriver
{
{
TAOS_MULTI_BIND
multiBind
=
new
TAOS_MULTI_BIND
();
TAOS_MULTI_BIND
multiBind
=
new
TAOS_MULTI_BIND
();
int
elementCount
=
arr
.
Length
;
int
elementCount
=
arr
.
Length
;
//TypeSize represent the Max element length of the comming arr
//The size of the buffer is typeSize * elementCount
//This buffer is used to store TAOS_MULTI_BIND.buffer
int
typeSize
=
MaxElementLength
(
arr
);
int
typeSize
=
MaxElementLength
(
arr
);
//This intSize is used to calcuate buffer size of the struct TAOS_MULTI_BIND's
//length. The buffer is intSize * elementCount,which is used to store TAOS_MULTI_BIND.length
int
intSize
=
sizeof
(
int
);
int
intSize
=
sizeof
(
int
);
//This byteSize is used to calculate the buffer size of the struct TAOS_MULTI_BIND.is_null
//This buffer size is byteSize * elementCount
int
byteSize
=
sizeof
(
byte
);
int
byteSize
=
sizeof
(
byte
);
StringBuilder
arrStrBuilder
=
new
StringBuilder
();
;
//TAOS_MULTI_BIND.length
//TAOS_MULTI_BIND.length
IntPtr
lengthArr
=
Marshal
.
AllocHGlobal
(
intSize
*
elementCount
);
IntPtr
lengthArr
=
Marshal
.
AllocHGlobal
(
intSize
*
elementCount
);
//TAOS_MULTI_BIND.is_null
//TAOS_MULTI_BIND.is_null
IntPtr
nullArr
=
Marshal
.
AllocHGlobal
(
byteSize
*
elementCount
);
IntPtr
nullArr
=
Marshal
.
AllocHGlobal
(
byteSize
*
elementCount
);
//TAOS_MULTI_BIND.buffer
IntPtr
uNcharBuff
=
Marshal
.
AllocHGlobal
(
typeSize
*
elementCount
);
for
(
int
i
=
0
;
i
<
elementCount
;
i
++)
for
(
int
i
=
0
;
i
<
elementCount
;
i
++)
{
{
int
itemLength
=
0
;
int
itemLength
=
0
;
byte
[]
decodeByte
=
GetStringEncodeByte
(
arr
[
i
]);
byte
[]
decodeByte
=
GetStringEncodeByte
(
arr
[
i
]);
itemLength
=
decodeByte
.
Length
;
itemLength
=
decodeByte
.
Length
;
// if element if not null and element length is less then typeSize
if
(!
String
.
IsNullOrEmpty
(
arr
[
i
]))
// fill the memory with default char.Since arr element memory need align.
if
(!
String
.
IsNullOrEmpty
(
arr
[
i
])
&&
typeSize
==
itemLength
)
{
arrStrBuilder
.
Append
(
arr
[
i
]);
}
else
if
(!
String
.
IsNullOrEmpty
(
arr
[
i
])
&&
typeSize
>
itemLength
)
{
{
arrStrBuilder
.
Append
(
arr
[
i
]);
for
(
int
j
=
0
;
j
<
itemLength
;
j
++)
arrStrBuilder
.
Append
(
AlignCharArr
(
typeSize
-
itemLength
));
{
//Read byte after byte
Marshal
.
WriteByte
(
uNcharBuff
,
i
*
typeSize
+
j
,
decodeByte
[
j
]);
}
}
}
else
//Set TAOS_MULTI_BIND.length
{
Marshal
.
WriteInt32
(
lengthArr
,
intSize
*
i
,
itemLength
);
// if is null value,fill the memory with default values.
//Set TAOS_MULTI_BIND.is_null
arrStrBuilder
.
Append
(
AlignCharArr
(
typeSize
));
}
//set TAOS_MULTI_BIND.length
Marshal
.
WriteInt32
(
lengthArr
,
intSize
*
i
,
typeSize
);
//set TAOS_MULTI_BIND.is_null
Marshal
.
WriteByte
(
nullArr
,
byteSize
*
i
,
Convert
.
ToByte
(
String
.
IsNullOrEmpty
(
arr
[
i
])
?
1
:
0
));
Marshal
.
WriteByte
(
nullArr
,
byteSize
*
i
,
Convert
.
ToByte
(
String
.
IsNullOrEmpty
(
arr
[
i
])
?
1
:
0
));
}
}
//set TAOS_MULTI_BIND.buffer
//Config TAOS_MULTI_BIND
IntPtr
uNcharBuff
=
(
IntPtr
)
Marshal
.
StringToHGlobalAnsi
(
arrStrBuilder
.
ToString
());
//config TAOS_MULTI_BIND
multiBind
.
buffer_type
=
(
int
)
TDengineDataType
.
TSDB_DATA_TYPE_NCHAR
;
multiBind
.
buffer_type
=
(
int
)
TDengineDataType
.
TSDB_DATA_TYPE_NCHAR
;
multiBind
.
buffer
=
uNcharBuff
;
multiBind
.
buffer
=
uNcharBuff
;
multiBind
.
buffer_length
=
(
ulong
)
typeSize
;
multiBind
.
buffer_length
=
(
ulong
)
typeSize
;
...
@@ -612,16 +605,16 @@ namespace TDengineDriver
...
@@ -612,16 +605,16 @@ namespace TDengineDriver
}
}
private
static
Byte
[]
GetStringEncodeByte
(
string
str
)
private
static
Byte
[]
GetStringEncodeByte
(
string
str
)
{
{
Byte
[]
strToBytes
=
null
;
Byte
[]
strToBytes
=
null
;
if
(
String
.
IsNullOrEmpty
(
str
))
if
(
String
.
IsNullOrEmpty
(
str
))
{
{
strToBytes
=
System
.
Text
.
Encoding
.
Default
.
GetBytes
(
String
.
Empty
);
strToBytes
=
System
.
Text
.
Encoding
.
Default
.
GetBytes
(
String
.
Empty
);
}
}
else
else
{
{
strToBytes
=
System
.
Text
.
Encoding
.
Default
.
GetBytes
(
str
);
strToBytes
=
System
.
Text
.
Encoding
.
Default
.
GetBytes
(
str
);
}
}
return
strToBytes
;
return
strToBytes
;
}
}
}
}
...
...
src/connector/C#/src/test/Cases/FetchLength.cs
已删除
100644 → 0
浏览文件 @
2c6ffc01
using
System
;
using
Test.UtilsTools
;
using
System.Collections.Generic
;
namespace
Cases
{
public
class
FetchLengthCase
{
/// <author>xiaolei</author>
/// <Name>TestRetrieveBinary</Name>
/// <describe>TD-12103 C# connector fetch_row with binary data retrieving error</describe>
/// <filename>FetchLength.cs</filename>
/// <result>pass or failed </result>
public
void
TestRetrieveBinary
(
IntPtr
conn
)
{
string
sql1
=
"create stable stb1 (ts timestamp, name binary(10)) tags(n int);"
;
string
sql2
=
"insert into tb1 using stb1 tags(1) values(now, 'log');"
;
string
sql3
=
"insert into tb2 using stb1 tags(2) values(now, 'test');"
;
string
sql4
=
"insert into tb3 using stb1 tags(3) values(now, 'db02');"
;
string
sql5
=
"insert into tb4 using stb1 tags(4) values(now, 'db3');"
;
string
sql6
=
"select distinct(name) from stb1;"
;
//
UtilsTools
.
ExecuteQuery
(
conn
,
sql1
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql2
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql3
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql4
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql5
);
IntPtr
resPtr
=
IntPtr
.
Zero
;
resPtr
=
UtilsTools
.
ExecuteQuery
(
conn
,
sql6
);
List
<
List
<
string
>>
result
=
UtilsTools
.
GetResultSet
(
resPtr
);
List
<
string
>
colname
=
result
[
0
];
List
<
string
>
data
=
result
[
1
];
UtilsTools
.
AssertEqual
(
"db3"
,
data
[
0
]);
UtilsTools
.
AssertEqual
(
"log"
,
data
[
1
]);
UtilsTools
.
AssertEqual
(
"db02"
,
data
[
2
]);
UtilsTools
.
AssertEqual
(
"test"
,
data
[
3
]);
}
}
}
src/connector/C#/src/test/Cases/Program.cs
已删除
100644 → 0
浏览文件 @
2c6ffc01
using
System
;
using
Test.UtilsTools
;
using
Cases
;
namespace
Cases.EntryPoint
{
class
Program
{
static
void
Main
(
string
[]
args
)
{
IntPtr
conn
=
IntPtr
.
Zero
;
IntPtr
stmt
=
IntPtr
.
Zero
;
IntPtr
res
=
IntPtr
.
Zero
;
conn
=
UtilsTools
.
TDConnection
(
"127.0.0.1"
,
"root"
,
"taosdata"
,
""
,
0
);
UtilsTools
.
ExecuteUpdate
(
conn
,
"drop database if exists csharp"
);
UtilsTools
.
ExecuteUpdate
(
conn
,
"create database if not exists csharp keep 3650"
);
UtilsTools
.
ExecuteUpdate
(
conn
,
"use csharp"
);
Console
.
WriteLine
(
"====================StableColumnByColumn==================="
);
StableColumnByColumn
columnByColumn
=
new
StableColumnByColumn
();
columnByColumn
.
Test
(
conn
,
"stablecolumnbycolumn"
);
Console
.
WriteLine
(
"====================StmtStableQuery==================="
);
StmtStableQuery
stmtStableQuery
=
new
StmtStableQuery
();
stmtStableQuery
.
Test
(
conn
,
"stablecolumnbycolumn"
);
Console
.
WriteLine
(
"====================StableMutipleLine==================="
);
StableMutipleLine
mutipleLine
=
new
StableMutipleLine
();
mutipleLine
.
Test
(
conn
,
"stablemutipleline"
);
//================================================================================
Console
.
WriteLine
(
"====================NtableSingleLine==================="
);
NtableSingleLine
ntableSingleLine
=
new
NtableSingleLine
();
ntableSingleLine
.
Test
(
conn
,
"stablesingleline"
);
IntPtr
resPtr
=
UtilsTools
.
ExecuteQuery
(
conn
,
"select * from stablesingleline "
);
UtilsTools
.
DisplayRes
(
resPtr
);
Console
.
WriteLine
(
"====================NtableMutipleLine==================="
);
NtableMutipleLine
ntableMutipleLine
=
new
NtableMutipleLine
();
ntableMutipleLine
.
Test
(
conn
,
"ntablemutipleline"
);
Console
.
WriteLine
(
"====================StmtNtableQuery==================="
);
StmtNtableQuery
stmtNtableQuery
=
new
StmtNtableQuery
();
stmtNtableQuery
.
Test
(
conn
,
"ntablemutipleline"
);
Console
.
WriteLine
(
"====================NtableColumnByColumn==================="
);
NtableColumnByColumn
ntableColumnByColumn
=
new
NtableColumnByColumn
();
ntableColumnByColumn
.
Test
(
conn
,
"ntablecolumnbycolumn"
);
Console
.
WriteLine
(
"====================fetchfeilds==================="
);
FetchFields
fetchFields
=
new
FetchFields
();
fetchFields
.
Test
(
conn
,
"fetchfeilds"
);
StableStmtCases
stableStmtCases
=
new
StableStmtCases
();
Console
.
WriteLine
(
"====================stableStmtCases.TestBindSingleLineCn==================="
);
stableStmtCases
.
TestBindSingleLineCn
(
conn
,
"stablestmtcasestestbindsinglelinecn"
);
Console
.
WriteLine
(
"====================stableStmtCases.TestBindColumnCn==================="
);
stableStmtCases
.
TestBindColumnCn
(
conn
,
" stablestmtcasestestbindcolumncn"
);
Console
.
WriteLine
(
"====================stableStmtCases.TestBindMultiLineCn==================="
);
stableStmtCases
.
TestBindMultiLineCn
(
conn
,
"stablestmtcasestestbindmultilinecn"
);
NormalTableStmtCases
normalTableStmtCases
=
new
NormalTableStmtCases
();
Console
.
WriteLine
(
"====================normalTableStmtCases.TestBindSingleLineCn==================="
);
normalTableStmtCases
.
TestBindSingleLineCn
(
conn
,
"normaltablestmtcasestestbindsinglelinecn"
);
Console
.
WriteLine
(
"====================normalTableStmtCases.TestBindColumnCn==================="
);
normalTableStmtCases
.
TestBindColumnCn
(
conn
,
"normaltablestmtcasestestbindcolumncn"
);
Console
.
WriteLine
(
"====================normalTableStmtCases.TestBindMultiLineCn==================="
);
normalTableStmtCases
.
TestBindMultiLineCn
(
conn
,
"normaltablestmtcasestestbindmultilinecn"
);
Console
.
WriteLine
(
"===================JsonTagTest===================="
);
JsonTagTest
jsonTagTest
=
new
JsonTagTest
();
jsonTagTest
.
Test
(
conn
);
Console
.
WriteLine
(
"====================fetchLengthCase==================="
);
FetchLengthCase
fetchLengthCase
=
new
FetchLengthCase
();
fetchLengthCase
.
TestRetrieveBinary
(
conn
);
UtilsTools
.
ExecuteQuery
(
conn
,
"drop database if exists csharp"
);
UtilsTools
.
CloseConnection
(
conn
);
UtilsTools
.
ExitProgram
();
}
}
}
src/connector/C#/src/test/Cases/StmtStable.cs
已删除
100644 → 0
浏览文件 @
2c6ffc01
using
System
;
using
Test.UtilsTools
;
using
TDengineDriver
;
using
Test.UtilsTools.DataSource
;
namespace
Cases
{
public
class
StableMutipleLine
{
TAOS_BIND
[]
tags
=
DataSource
.
getTags
();
TAOS_MULTI_BIND
[]
mbind
=
DataSource
.
GetMultiBindArr
();
public
void
Test
(
IntPtr
conn
,
string
tableName
)
{
String
createTb
=
"create stable "
+
tableName
+
" (ts timestamp ,b bool,v1 tinyint,v2 smallint,v4 int,v8 bigint,f4 float,f8 double,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,bin binary(200),blob nchar(200))tags(bo bool,tt tinyint,si smallint,ii int,bi bigint,tu tinyint unsigned,su smallint unsigned,iu int unsigned,bu bigint unsigned,ff float ,dd double ,bb binary(200),nc nchar(200));"
;
String
insertSql
=
"insert into ? using "
+
tableName
+
" tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
;
UtilsTools
.
ExecuteUpdate
(
conn
,
createTb
);
IntPtr
stmt
=
StmtUtilTools
.
StmtInit
(
conn
);
StmtUtilTools
.
StmtPrepare
(
stmt
,
insertSql
);
StmtUtilTools
.
SetTableNameTags
(
stmt
,
tableName
+
"_t1"
,
tags
);
StmtUtilTools
.
BindParamBatch
(
stmt
,
mbind
);
StmtUtilTools
.
AddBatch
(
stmt
);
StmtUtilTools
.
StmtExecute
(
stmt
);
StmtUtilTools
.
StmtClose
(
stmt
);
DataSource
.
FreeTaosBind
(
tags
);
DataSource
.
FreeTaosMBind
(
mbind
);
}
}
public
class
StableColumnByColumn
{
DataSource
data
=
new
DataSource
();
TAOS_BIND
[]
tags
=
DataSource
.
getTags
();
TAOS_MULTI_BIND
[]
mbind
=
DataSource
.
GetMultiBindArr
();
public
void
Test
(
IntPtr
conn
,
string
tableName
)
{
String
createTb
=
"create stable "
+
tableName
+
" (ts timestamp ,b bool,v1 tinyint,v2 smallint,v4 int,v8 bigint,f4 float,f8 double,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,bin binary(200),blob nchar(200))tags(bo bool,tt tinyint,si smallint,ii int,bi bigint,tu tinyint unsigned,su smallint unsigned,iu int unsigned,bu bigint unsigned,ff float ,dd double ,bb binary(200),nc nchar(200));"
;
String
insertSql
=
"insert into ? using "
+
tableName
+
" tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
;
UtilsTools
.
ExecuteUpdate
(
conn
,
createTb
);
IntPtr
stmt
=
StmtUtilTools
.
StmtInit
(
conn
);
StmtUtilTools
.
StmtPrepare
(
stmt
,
insertSql
);
StmtUtilTools
.
SetTableNameTags
(
stmt
,
tableName
+
"_t1"
,
tags
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
0
],
0
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
1
],
1
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
2
],
2
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
3
],
3
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
4
],
4
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
5
],
5
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
6
],
6
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
7
],
7
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
8
],
8
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
9
],
9
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
10
],
10
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
11
],
11
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
12
],
12
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
13
],
13
);
StmtUtilTools
.
AddBatch
(
stmt
);
StmtUtilTools
.
StmtExecute
(
stmt
);
StmtUtilTools
.
StmtClose
(
stmt
);
DataSource
.
FreeTaosBind
(
tags
);
DataSource
.
FreeTaosMBind
(
mbind
);
}
}
public
class
StableStmtCases
{
/// <author>xiaolei</author>
/// <Name>StableStmtCases.TestBindSingleLineCn</Name>
/// <describe>Test stmt insert single line of chinese character into stable by column after column </describe>
/// <filename>StmtSTable.cs</filename>
/// <result>pass or failed </result>
public
void
TestBindSingleLineCn
(
IntPtr
conn
,
string
tableName
)
{
TAOS_BIND
[]
tags
=
DataSource
.
getCNTags
();
TAOS_BIND
[]
binds
=
DataSource
.
getNtableCNRow
();
String
createTb
=
"create stable "
+
tableName
+
" (ts timestamp,v1 tinyint,v2 smallint,v4 int,v8 bigint,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,f4 float,f8 double,bin binary(200),blob nchar(200),b bool,nilcol int)tags(bo bool,tt tinyint,si smallint,ii int,bi bigint,tu tinyint unsigned,su smallint unsigned,iu int unsigned,bu bigint unsigned,ff float ,dd double ,bb binary(200),nc nchar(200));"
;
String
insertSql
=
"insert into ? using "
+
tableName
+
" tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
;
UtilsTools
.
ExecuteUpdate
(
conn
,
createTb
);
IntPtr
stmt
=
StmtUtilTools
.
StmtInit
(
conn
);
StmtUtilTools
.
StmtPrepare
(
stmt
,
insertSql
);
StmtUtilTools
.
SetTableNameTags
(
stmt
,
tableName
+
"_t1"
,
tags
);
StmtUtilTools
.
BindParam
(
stmt
,
binds
);
StmtUtilTools
.
AddBatch
(
stmt
);
StmtUtilTools
.
StmtExecute
(
stmt
);
StmtUtilTools
.
StmtClose
(
stmt
);
DataSource
.
FreeTaosBind
(
tags
);
DataSource
.
FreeTaosBind
(
binds
);
string
querySql
=
"select * from "
+
tableName
;
IntPtr
res
=
UtilsTools
.
ExecuteQuery
(
conn
,
querySql
);
UtilsTools
.
DisplayRes
(
res
);
}
/// <author>xiaolei</author>
/// <Name>StableStmtCases.TestBindColumnCn</Name>
/// <describe>Test stmt insert single line of chinese character into stable by column after column </describe>
/// <filename>StmtSTable.cs</filename>
/// <result>pass or failed </result>
public
void
TestBindColumnCn
(
IntPtr
conn
,
string
tableName
)
{
DataSource
data
=
new
DataSource
();
TAOS_BIND
[]
tags
=
DataSource
.
getCNTags
();
TAOS_MULTI_BIND
[]
mbind
=
DataSource
.
GetMultiBindCNArr
();
String
createTb
=
"create stable "
+
tableName
+
" (ts timestamp ,b bool,v1 tinyint,v2 smallint,v4 int,v8 bigint,f4 float,f8 double,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,bin binary(200),blob nchar(200))tags(bo bool,tt tinyint,si smallint,ii int,bi bigint,tu tinyint unsigned,su smallint unsigned,iu int unsigned,bu bigint unsigned,ff float ,dd double ,bb binary(200),nc nchar(200));"
;
String
insertSql
=
"insert into ? using "
+
tableName
+
" tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
;
UtilsTools
.
ExecuteUpdate
(
conn
,
createTb
);
IntPtr
stmt
=
StmtUtilTools
.
StmtInit
(
conn
);
StmtUtilTools
.
StmtPrepare
(
stmt
,
insertSql
);
StmtUtilTools
.
SetTableNameTags
(
stmt
,
tableName
+
"_t1"
,
tags
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
0
],
0
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
1
],
1
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
2
],
2
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
3
],
3
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
4
],
4
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
5
],
5
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
6
],
6
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
7
],
7
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
8
],
8
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
9
],
9
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
10
],
10
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
11
],
11
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
12
],
12
);
StmtUtilTools
.
BindSingleParamBatch
(
stmt
,
mbind
[
13
],
13
);
StmtUtilTools
.
AddBatch
(
stmt
);
StmtUtilTools
.
StmtExecute
(
stmt
);
StmtUtilTools
.
StmtClose
(
stmt
);
DataSource
.
FreeTaosBind
(
tags
);
DataSource
.
FreeTaosMBind
(
mbind
);
string
querySql
=
"select * from "
+
tableName
;
IntPtr
res
=
UtilsTools
.
ExecuteQuery
(
conn
,
querySql
);
UtilsTools
.
DisplayRes
(
res
);
}
/// <author>xiaolei</author>
/// <Name>StableStmtCases.TestBindMultiLineCn</Name>
/// <describe>Test stmt insert single line of chinese character into stable by column after column </describe>
/// <filename>StmtSTable.cs</filename>
/// <result>pass or failed </result>
public
void
TestBindMultiLineCn
(
IntPtr
conn
,
string
tableName
)
{
TAOS_BIND
[]
tags
=
DataSource
.
getCNTags
();
TAOS_MULTI_BIND
[]
mbind
=
DataSource
.
GetMultiBindCNArr
();
String
createTb
=
"create stable "
+
tableName
+
" (ts timestamp ,b bool,v1 tinyint,v2 smallint,v4 int,v8 bigint,f4 float,f8 double,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,bin binary(200),blob nchar(200))tags(bo bool,tt tinyint,si smallint,ii int,bi bigint,tu tinyint unsigned,su smallint unsigned,iu int unsigned,bu bigint unsigned,ff float ,dd double ,bb binary(200),nc nchar(200));"
;
String
insertSql
=
"insert into ? using "
+
tableName
+
" tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
;
UtilsTools
.
ExecuteUpdate
(
conn
,
createTb
);
IntPtr
stmt
=
StmtUtilTools
.
StmtInit
(
conn
);
StmtUtilTools
.
StmtPrepare
(
stmt
,
insertSql
);
StmtUtilTools
.
SetTableNameTags
(
stmt
,
tableName
+
"_t1"
,
tags
);
StmtUtilTools
.
BindParamBatch
(
stmt
,
mbind
);
StmtUtilTools
.
AddBatch
(
stmt
);
StmtUtilTools
.
StmtExecute
(
stmt
);
StmtUtilTools
.
StmtClose
(
stmt
);
DataSource
.
FreeTaosBind
(
tags
);
DataSource
.
FreeTaosMBind
(
mbind
);
string
querySql
=
"select * from "
+
tableName
;
IntPtr
res
=
UtilsTools
.
ExecuteQuery
(
conn
,
querySql
);
UtilsTools
.
DisplayRes
(
res
);
}
}
}
\ No newline at end of file
src/connector/C#/src/test/Cases/TaosFeild.cs
已删除
100644 → 0
浏览文件 @
2c6ffc01
using
System
;
using
Test.UtilsTools
;
using
TDengineDriver
;
using
System.Collections.Generic
;
using
System.Runtime.InteropServices
;
namespace
Cases
{
public
class
FetchFields
{
public
void
Test
(
IntPtr
conn
,
string
tableName
)
{
IntPtr
res
=
IntPtr
.
Zero
;
String
createTb
=
"create stable "
+
tableName
+
" (ts timestamp ,b bool,v1 tinyint,v2 smallint,v4 int,v8 bigint,f4 float,f8 double,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,bin binary(200),blob nchar(200))tags(jsontag json);"
;
String
insertSql
=
"insert into "
+
tableName
+
"_t1 using "
+
tableName
+
" tags('{\"k1\": \"v1\"}') values(1637064040000,true,1,2,3,4,5,6,7,8,9,10,'XI','XII')"
;
String
selectSql
=
"select * from "
+
tableName
;
String
dropSql
=
"drop table "
+
tableName
;
UtilsTools
.
ExecuteQuery
(
conn
,
createTb
);
UtilsTools
.
ExecuteQuery
(
conn
,
insertSql
);
res
=
UtilsTools
.
ExecuteQuery
(
conn
,
selectSql
);
UtilsTools
.
ExecuteQuery
(
conn
,
dropSql
);
List
<
TDengineMeta
>
metas
=
new
List
<
TDengineMeta
>();
metas
=
TDengine
.
FetchFields
(
res
);
if
(
metas
.
Capacity
==
0
)
{
Console
.
WriteLine
(
"empty result"
);
}
else
{
foreach
(
TDengineMeta
meta
in
metas
){
Console
.
WriteLine
(
"col_name:{0},col_type_code:{1},col_type:{2}({3})"
,
meta
.
name
,
meta
.
type
,
meta
.
TypeName
(),
meta
.
size
);
}
}
}
}
}
src/connector/C#/src/test/
Cases
/DataSource.cs
→
src/connector/C#/src/test/
FunctionTest
/DataSource.cs
浏览文件 @
e7167dbf
using
System
;
using
System
;
using
Test.UtilsTools
;
using
Test.UtilsTools
;
using
TDengineDriver
;
using
TDengineDriver
;
using
System.Collections.Generic
;
namespace
Test.UtilsTools.DataSource
namespace
Test.UtilsTools.DataSource
{
{
public
class
DataSource
public
class
DataSource
...
@@ -23,7 +23,10 @@ namespace Test.UtilsTools.DataSource
...
@@ -23,7 +23,10 @@ namespace Test.UtilsTools.DataSource
public
static
string
[]
binaryArrCn
=
new
string
[
5
]
{
"涛思数据"
,
String
.
Empty
,
null
,
"taosdata涛思数据"
,
"涛思数据TDengine"
};
public
static
string
[]
binaryArrCn
=
new
string
[
5
]
{
"涛思数据"
,
String
.
Empty
,
null
,
"taosdata涛思数据"
,
"涛思数据TDengine"
};
public
static
string
[]
NcharArrCn
=
new
string
[
5
]
{
"涛思数据"
,
null
,
"taosdata涛思数据"
,
"涛思数据TDengine"
,
String
.
Empty
};
public
static
string
[]
NcharArrCn
=
new
string
[
5
]
{
"涛思数据"
,
null
,
"taosdata涛思数据"
,
"涛思数据TDengine"
,
String
.
Empty
};
public
static
TAOS_BIND
[]
getTags
()
// Construct a TAOS_BIND array which contains normal character.
// For stmt bind tags,this will be used as tag info
public
static
TAOS_BIND
[]
GetTags
()
{
{
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
13
];
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
13
];
binds
[
0
]
=
TaosBind
.
BindBool
(
true
);
binds
[
0
]
=
TaosBind
.
BindBool
(
true
);
...
@@ -41,8 +44,59 @@ namespace Test.UtilsTools.DataSource
...
@@ -41,8 +44,59 @@ namespace Test.UtilsTools.DataSource
binds
[
12
]
=
TaosBind
.
BindNchar
(
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKZXCVBNM`1234567890-=+_)(*&^%$#@!~[];,./<>?:{}"
);
binds
[
12
]
=
TaosBind
.
BindNchar
(
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKZXCVBNM`1234567890-=+_)(*&^%$#@!~[];,./<>?:{}"
);
return
binds
;
return
binds
;
}
}
// Get the tag data within and string list
// Which will be retrieved as a string List
private
static
List
<
String
>
GetTagData
()
{
List
<
String
>
tagData
=
new
List
<
String
>();
tagData
.
Add
(
true
.
ToString
());
tagData
.
Add
((-
2
).
ToString
());
tagData
.
Add
((
short
.
MaxValue
).
ToString
());
tagData
.
Add
((
int
.
MaxValue
).
ToString
());
tagData
.
Add
((
Int64
.
MaxValue
).
ToString
());
tagData
.
Add
((
byte
.
MaxValue
-
1
).
ToString
());
tagData
.
Add
((
UInt16
.
MaxValue
-
1
).
ToString
());
tagData
.
Add
((
uint
.
MinValue
+
1
).
ToString
());
tagData
.
Add
((
UInt64
.
MinValue
+
1
).
ToString
());
tagData
.
Add
((
11.11F
).
ToString
());
tagData
.
Add
((
22.22D
).
ToString
());
tagData
.
Add
(
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKZXCVBNM`1234567890-=+_)(*&^%$#@!~[];,./<>?:{}"
);
tagData
.
Add
(
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKZXCVBNM`1234567890-=+_)(*&^%$#@!~[];,./<>?:{}"
);
return
tagData
;
}
public
static
TAOS_BIND
[]
getCNTags
()
public
static
List
<
string
>
GetMultiBindStableRowData
()
{
List
<
string
>
rowData
=
new
List
<
String
>();
List
<
string
>
tagData
=
GetTagData
();
for
(
int
i
=
0
;
i
<
tsArr
.
Length
;
i
++)
{
rowData
.
Add
(
tsArr
[
i
].
ToString
());
rowData
.
Add
(
boolArr
[
i
].
Equals
(
null
)
?
"NULL"
:
boolArr
[
i
].
ToString
());
rowData
.
Add
(
tinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
tinyIntArr
[
i
].
ToString
());
rowData
.
Add
(
shortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
shortArr
[
i
].
ToString
());
rowData
.
Add
(
intArr
[
i
].
Equals
(
null
)
?
"NULL"
:
intArr
[
i
].
ToString
());
rowData
.
Add
(
longArr
[
i
].
Equals
(
null
)
?
"NULL"
:
longArr
[
i
].
ToString
());
rowData
.
Add
(
floatArr
[
i
].
Equals
(
null
)
?
"NULL"
:
floatArr
[
i
].
ToString
());
rowData
.
Add
(
doubleArr
[
i
].
Equals
(
null
)
?
"NULL"
:
doubleArr
[
i
].
ToString
());
rowData
.
Add
(
uTinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uTinyIntArr
[
i
].
ToString
());
rowData
.
Add
(
uShortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uShortArr
[
i
].
ToString
());
rowData
.
Add
(
uIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uIntArr
[
i
].
ToString
());
rowData
.
Add
(
uLongArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uLongArr
[
i
].
ToString
());
rowData
.
Add
(
String
.
IsNullOrEmpty
(
binaryArr
[
i
])
?
"NULL"
:
binaryArr
[
i
]);
rowData
.
Add
(
String
.
IsNullOrEmpty
(
ncharArr
[
i
])
?
"NULL"
:
ncharArr
[
i
]);
rowData
.
AddRange
(
tagData
);
// Console.WriteLine("binaryArrCn[{0}]:{1},ncharArr[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? "NULL" : binaryArrCn[i],String.IsNullOrEmpty(ncharArr[i]) ? "NULL" : NcharArrCn[i]);
// Console.WriteLine("binaryArrCn[{0}]:{1},ncharArr[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? 0 :binaryArrCn[i].Length, String.IsNullOrEmpty(ncharArr[i]) ? 0 : NcharArrCn[i].Length);
// Console.WriteLine("========");
}
return
rowData
;
}
// Construct a TAOS_BIND array which contains chinese character.
// For stmt bind tags,this will be used as tag info
public
static
TAOS_BIND
[]
GetCNTags
()
{
{
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
13
];
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
13
];
binds
[
0
]
=
TaosBind
.
BindBool
(
true
);
binds
[
0
]
=
TaosBind
.
BindBool
(
true
);
...
@@ -57,11 +111,32 @@ namespace Test.UtilsTools.DataSource
...
@@ -57,11 +111,32 @@ namespace Test.UtilsTools.DataSource
binds
[
9
]
=
TaosBind
.
BindFloat
(
11.11F
);
binds
[
9
]
=
TaosBind
.
BindFloat
(
11.11F
);
binds
[
10
]
=
TaosBind
.
BindDouble
(
22.22D
);
binds
[
10
]
=
TaosBind
.
BindDouble
(
22.22D
);
binds
[
11
]
=
TaosBind
.
BindBinary
(
"TDengine涛思数据"
);
binds
[
11
]
=
TaosBind
.
BindBinary
(
"TDengine涛思数据"
);
binds
[
12
]
=
TaosBind
.
BindNchar
(
"涛思"
);
binds
[
12
]
=
TaosBind
.
BindNchar
(
"涛思
数据taos
"
);
return
binds
;
return
binds
;
}
}
// Get the tag data within and string list
public
static
TAOS_BIND
[]
getNtableCNRow
()
// Which will be retrieved as a string List
private
static
List
<
String
>
GetTagCnData
()
{
List
<
String
>
tagData
=
new
List
<
String
>();
tagData
.
Add
(
true
.
ToString
());
tagData
.
Add
((-
2
).
ToString
());
tagData
.
Add
((
short
.
MaxValue
-
1
).
ToString
());
tagData
.
Add
((
int
.
MaxValue
-
1
).
ToString
());
tagData
.
Add
((
Int64
.
MaxValue
-
1
).
ToString
());
tagData
.
Add
((
byte
.
MaxValue
-
1
).
ToString
());
tagData
.
Add
((
UInt16
.
MaxValue
-
1
).
ToString
());
tagData
.
Add
((
uint
.
MinValue
+
1
).
ToString
());
tagData
.
Add
((
UInt64
.
MinValue
+
1
).
ToString
());
tagData
.
Add
((
11.11F
).
ToString
());
tagData
.
Add
((
22.22D
).
ToString
());
tagData
.
Add
(
"TDengine涛思数据"
);
tagData
.
Add
(
"涛思数据taos"
);
return
tagData
;
}
// A line of data that's without CN character.
// Which is construct as an TAOS_BIND array
public
static
TAOS_BIND
[]
GetNtableCNRow
()
{
{
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
15
];
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
15
];
binds
[
0
]
=
TaosBind
.
BindTimestamp
(
1637064040000
);
binds
[
0
]
=
TaosBind
.
BindTimestamp
(
1637064040000
);
...
@@ -81,8 +156,40 @@ namespace Test.UtilsTools.DataSource
...
@@ -81,8 +156,40 @@ namespace Test.UtilsTools.DataSource
binds
[
14
]
=
TaosBind
.
BindNil
();
binds
[
14
]
=
TaosBind
.
BindNil
();
return
binds
;
return
binds
;
}
}
//Get and list data that will be insert into table
public
static
List
<
String
>
GetNtableCNRowData
()
{
var
data
=
new
List
<
string
>{
"1637064040000"
,
"-2"
,
short
.
MaxValue
.
ToString
(),
int
.
MaxValue
.
ToString
(),
Int64
.
MaxValue
.
ToString
(),
(
byte
.
MaxValue
-
1
).
ToString
(),
(
UInt16
.
MaxValue
-
1
).
ToString
(),
(
uint
.
MinValue
+
1
).
ToString
(),
(
UInt64
.
MinValue
+
1
).
ToString
(),
(
11.11F
).
ToString
(),
(
22.22D
).
ToString
(),
"TDengine数据"
,
"taosdata涛思数据"
,
"True"
,
"NULL"
};
return
data
;
}
// Get the data value and tag values which have chinese characters
// And retrieved as a string list.This is single Line.
public
static
List
<
String
>
GetStableCNRowData
()
{
List
<
String
>
columnData
=
GetNtableCNRowData
();
List
<
String
>
tagData
=
GetTagCnData
();
columnData
.
AddRange
(
tagData
);
return
columnData
;
}
public
static
TAOS_BIND
[]
getNtableRow
()
// A line of data that's without CN character
public
static
TAOS_BIND
[]
GetNtableRow
()
{
{
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
15
];
TAOS_BIND
[]
binds
=
new
TAOS_BIND
[
15
];
binds
[
0
]
=
TaosBind
.
BindTimestamp
(
1637064040000
);
binds
[
0
]
=
TaosBind
.
BindTimestamp
(
1637064040000
);
...
@@ -102,6 +209,31 @@ namespace Test.UtilsTools.DataSource
...
@@ -102,6 +209,31 @@ namespace Test.UtilsTools.DataSource
binds
[
14
]
=
TaosBind
.
BindNil
();
binds
[
14
]
=
TaosBind
.
BindNil
();
return
binds
;
return
binds
;
}
}
// A List of data ,use as expectResData. The value is equal to getNtableRow()
public
static
List
<
String
>
GetNtableRowData
()
{
var
data
=
new
List
<
string
>{
"1637064040000"
,
"-2"
,
short
.
MaxValue
.
ToString
(),
int
.
MaxValue
.
ToString
(),
(
Int64
.
MaxValue
).
ToString
(),
(
byte
.
MaxValue
-
1
).
ToString
(),
(
UInt16
.
MaxValue
-
1
).
ToString
(),
(
uint
.
MinValue
+
1
).
ToString
(),
(
UInt64
.
MinValue
+
1
).
ToString
(),
(
11.11F
).
ToString
(),
(
22.22D
).
ToString
(),
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKZXCVBNM`1234567890-=+_)(*&^%$#@!~[];,./<>?:{}"
,
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKZXCVBNM`1234567890-=+_)(*&^%$#@!~[];,./<>?:{}"
,
true
.
ToString
(),
"NULL"
};
return
data
;
}
// Five lines of data, that is construct as taos_mutli_bind array.
// There aren't any CN character
public
static
TAOS_MULTI_BIND
[]
GetMultiBindArr
()
public
static
TAOS_MULTI_BIND
[]
GetMultiBindArr
()
{
{
TAOS_MULTI_BIND
[]
mBinds
=
new
TAOS_MULTI_BIND
[
14
];
TAOS_MULTI_BIND
[]
mBinds
=
new
TAOS_MULTI_BIND
[
14
];
...
@@ -121,6 +253,35 @@ namespace Test.UtilsTools.DataSource
...
@@ -121,6 +253,35 @@ namespace Test.UtilsTools.DataSource
mBinds
[
13
]
=
TaosMultiBind
.
MultiBindNchar
(
ncharArr
);
mBinds
[
13
]
=
TaosMultiBind
.
MultiBindNchar
(
ncharArr
);
return
mBinds
;
return
mBinds
;
}
}
// A List of data ,use as expectResData. The value is equal to GetMultiBindCNArr()
public
static
List
<
string
>
GetMultiBindResData
()
{
var
rowData
=
new
List
<
string
>();
for
(
int
i
=
0
;
i
<
tsArr
.
Length
;
i
++)
{
rowData
.
Add
(
tsArr
[
i
].
ToString
());
rowData
.
Add
(
boolArr
[
i
].
Equals
(
null
)
?
"NULL"
:
boolArr
[
i
].
ToString
());
rowData
.
Add
(
tinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
tinyIntArr
[
i
].
ToString
());
rowData
.
Add
(
shortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
shortArr
[
i
].
ToString
());
rowData
.
Add
(
intArr
[
i
].
Equals
(
null
)
?
"NULL"
:
intArr
[
i
].
ToString
());
rowData
.
Add
(
longArr
[
i
].
Equals
(
null
)
?
"NULL"
:
longArr
[
i
].
ToString
());
rowData
.
Add
(
floatArr
[
i
].
Equals
(
null
)
?
"NULL"
:
floatArr
[
i
].
ToString
());
rowData
.
Add
(
doubleArr
[
i
].
Equals
(
null
)
?
"NULL"
:
doubleArr
[
i
].
ToString
());
rowData
.
Add
(
uTinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uTinyIntArr
[
i
].
ToString
());
rowData
.
Add
(
uShortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uShortArr
[
i
].
ToString
());
rowData
.
Add
(
uIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uIntArr
[
i
].
ToString
());
rowData
.
Add
(
uLongArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uLongArr
[
i
].
ToString
());
rowData
.
Add
(
String
.
IsNullOrEmpty
(
binaryArr
[
i
])
?
"NULL"
:
binaryArr
[
i
]);
rowData
.
Add
(
String
.
IsNullOrEmpty
(
ncharArr
[
i
])
?
"NULL"
:
ncharArr
[
i
]);
// Console.WriteLine("binaryArrCn[{0}]:{1},NcharArrCn[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? "NULL" : binaryArrCn[i],String.IsNullOrEmpty(NcharArrCn[i]) ? "NULL" : NcharArrCn[i]);
// Console.WriteLine("binaryArrCn[{0}]:{1},NcharArrCn[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? 0 :binaryArrCn[i].Length, String.IsNullOrEmpty(NcharArrCn[i]) ? 0 : NcharArrCn[i].Length);
// Console.WriteLine("========");
}
return
rowData
;
}
// Five lines of data, that is construct as taos_mutli_bind array.
// There aren some CN characters and letters.
public
static
TAOS_MULTI_BIND
[]
GetMultiBindCNArr
()
public
static
TAOS_MULTI_BIND
[]
GetMultiBindCNArr
()
{
{
TAOS_MULTI_BIND
[]
mBinds
=
new
TAOS_MULTI_BIND
[
14
];
TAOS_MULTI_BIND
[]
mBinds
=
new
TAOS_MULTI_BIND
[
14
];
...
@@ -140,6 +301,62 @@ namespace Test.UtilsTools.DataSource
...
@@ -140,6 +301,62 @@ namespace Test.UtilsTools.DataSource
mBinds
[
13
]
=
TaosMultiBind
.
MultiBindNchar
(
NcharArrCn
);
mBinds
[
13
]
=
TaosMultiBind
.
MultiBindNchar
(
NcharArrCn
);
return
mBinds
;
return
mBinds
;
}
}
// A List of data ,use as expectResData. The value is equal to GetMultiBindCNArr()
public
static
List
<
string
>
GetMultiBindCNRowData
()
{
var
rowData
=
new
List
<
string
>();
for
(
int
i
=
0
;
i
<
tsArr
.
Length
;
i
++)
{
rowData
.
Add
(
tsArr
[
i
].
ToString
());
rowData
.
Add
(
boolArr
[
i
].
Equals
(
null
)
?
"NULL"
:
boolArr
[
i
].
ToString
());
rowData
.
Add
(
tinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
tinyIntArr
[
i
].
ToString
());
rowData
.
Add
(
shortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
shortArr
[
i
].
ToString
());
rowData
.
Add
(
intArr
[
i
].
Equals
(
null
)
?
"NULL"
:
intArr
[
i
].
ToString
());
rowData
.
Add
(
longArr
[
i
].
Equals
(
null
)
?
"NULL"
:
longArr
[
i
].
ToString
());
rowData
.
Add
(
floatArr
[
i
].
Equals
(
null
)
?
"NULL"
:
floatArr
[
i
].
ToString
());
rowData
.
Add
(
doubleArr
[
i
].
Equals
(
null
)
?
"NULL"
:
doubleArr
[
i
].
ToString
());
rowData
.
Add
(
uTinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uTinyIntArr
[
i
].
ToString
());
rowData
.
Add
(
uShortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uShortArr
[
i
].
ToString
());
rowData
.
Add
(
uIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uIntArr
[
i
].
ToString
());
rowData
.
Add
(
uLongArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uLongArr
[
i
].
ToString
());
rowData
.
Add
(
String
.
IsNullOrEmpty
(
binaryArrCn
[
i
])
?
"NULL"
:
binaryArrCn
[
i
]);
rowData
.
Add
(
String
.
IsNullOrEmpty
(
NcharArrCn
[
i
])
?
"NULL"
:
NcharArrCn
[
i
]);
// Console.WriteLine("binaryArrCn[{0}]:{1},NcharArrCn[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? "NULL" : binaryArrCn[i],String.IsNullOrEmpty(NcharArrCn[i]) ? "NULL" : NcharArrCn[i]);
// Console.WriteLine("binaryArrCn[{0}]:{1},NcharArrCn[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? 0 :binaryArrCn[i].Length, String.IsNullOrEmpty(NcharArrCn[i]) ? 0 : NcharArrCn[i].Length);
// Console.WriteLine("========");
}
return
rowData
;
}
public
static
List
<
String
>
GetMultiBindStableCNRowData
()
{
List
<
String
>
columnData
=
new
List
<
string
>();
List
<
String
>
tagData
=
GetTagCnData
();
for
(
int
i
=
0
;
i
<
tsArr
.
Length
;
i
++)
{
columnData
.
Add
(
tsArr
[
i
].
ToString
());
columnData
.
Add
(
boolArr
[
i
].
Equals
(
null
)
?
"NULL"
:
boolArr
[
i
].
ToString
());
columnData
.
Add
(
tinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
tinyIntArr
[
i
].
ToString
());
columnData
.
Add
(
shortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
shortArr
[
i
].
ToString
());
columnData
.
Add
(
intArr
[
i
].
Equals
(
null
)
?
"NULL"
:
intArr
[
i
].
ToString
());
columnData
.
Add
(
longArr
[
i
].
Equals
(
null
)
?
"NULL"
:
longArr
[
i
].
ToString
());
columnData
.
Add
(
floatArr
[
i
].
Equals
(
null
)
?
"NULL"
:
floatArr
[
i
].
ToString
());
columnData
.
Add
(
doubleArr
[
i
].
Equals
(
null
)
?
"NULL"
:
doubleArr
[
i
].
ToString
());
columnData
.
Add
(
uTinyIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uTinyIntArr
[
i
].
ToString
());
columnData
.
Add
(
uShortArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uShortArr
[
i
].
ToString
());
columnData
.
Add
(
uIntArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uIntArr
[
i
].
ToString
());
columnData
.
Add
(
uLongArr
[
i
].
Equals
(
null
)
?
"NULL"
:
uLongArr
[
i
].
ToString
());
columnData
.
Add
(
String
.
IsNullOrEmpty
(
binaryArrCn
[
i
])
?
"NULL"
:
binaryArrCn
[
i
]);
columnData
.
Add
(
String
.
IsNullOrEmpty
(
NcharArrCn
[
i
])
?
"NULL"
:
NcharArrCn
[
i
]);
columnData
.
AddRange
(
tagData
);
// Console.WriteLine("binaryArrCn[{0}]:{1},NcharArrCn[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? "NULL" : binaryArrCn[i],String.IsNullOrEmpty(NcharArrCn[i]) ? "NULL" : NcharArrCn[i]);
// Console.WriteLine("binaryArrCn[{0}]:{1},NcharArrCn[{0}]:{2}",i,String.IsNullOrEmpty(binaryArrCn[i]) ? 0 :binaryArrCn[i].Length, String.IsNullOrEmpty(NcharArrCn[i]) ? 0 : NcharArrCn[i].Length);
// Console.WriteLine("========");
}
return
columnData
;
}
public
static
TAOS_BIND
[]
GetQueryCondition
()
public
static
TAOS_BIND
[]
GetQueryCondition
()
{
{
...
@@ -158,7 +375,47 @@ namespace Test.UtilsTools.DataSource
...
@@ -158,7 +375,47 @@ namespace Test.UtilsTools.DataSource
{
{
TaosMultiBind
.
FreeTaosBind
(
mbinds
);
TaosMultiBind
.
FreeTaosBind
(
mbinds
);
}
}
//Get the TDengineMeta list from the ddl either normal table or stable
public
static
List
<
TDengineMeta
>
GetMetaFromDLL
(
string
dllStr
)
{
var
expectResMeta
=
new
List
<
TDengineMeta
>();
//"CREATE TABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS(location BINARY(30), groupId INT);";
int
bracetInd
=
dllStr
.
IndexOf
(
"("
);
//(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS(location BINARY(30), groupId INT);
string
subDllStr
=
dllStr
.
Substring
(
bracetInd
);
String
[]
stableSeparators
=
new
String
[]
{
"tags"
,
"TAGS"
};
//(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT)
//(location BINARY(30), groupId INT)
String
[]
dllStrElements
=
subDllStr
.
Split
(
stableSeparators
,
StringSplitOptions
.
RemoveEmptyEntries
);
//(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT)
dllStrElements
[
0
]
=
dllStrElements
[
0
].
Substring
(
1
,
dllStrElements
[
0
].
Length
-
2
);
String
[]
finalStr1
=
dllStrElements
[
0
].
Split
(
','
,
StringSplitOptions
.
RemoveEmptyEntries
);
foreach
(
string
item
in
finalStr1
)
{
//ts TIMESTAMP
string
[]
itemArr
=
item
.
Split
(
' '
,
2
,
StringSplitOptions
.
RemoveEmptyEntries
);
// Console.WriteLine("GetMetaFromDLL():{0},{1}",itemArr[0],itemArr[1]);
expectResMeta
.
Add
(
UtilsTools
.
ConstructTDengineMeta
(
itemArr
[
0
],
itemArr
[
1
]));
}
if
(
dllStr
.
Contains
(
"TAGS"
)
||
dllStr
.
Contains
(
"tags"
))
{
//location BINARY(30), groupId INT
dllStrElements
[
1
]
=
dllStrElements
[
1
].
Substring
(
1
,
dllStrElements
[
1
].
Length
-
2
);
//location BINARY(30) groupId INT
String
[]
finalStr2
=
dllStrElements
[
1
].
Split
(
','
,
StringSplitOptions
.
RemoveEmptyEntries
);
Console
.
WriteLine
(
"========"
);
foreach
(
string
item
in
finalStr2
)
{
//location BINARY(30)
string
[]
itemArr
=
item
.
Split
(
' '
,
2
,
StringSplitOptions
.
RemoveEmptyEntries
);
// Console.WriteLine("GetMetaFromDLL():{0},{1}",itemArr[0],itemArr[1]);
expectResMeta
.
Add
(
UtilsTools
.
ConstructTDengineMeta
(
itemArr
[
0
],
itemArr
[
1
]));
}
}
return
expectResMeta
;
}
}
}
}
}
\ No newline at end of file
src/connector/C#/src/test/FunctionTest/FetchLength.cs
0 → 100644
浏览文件 @
e7167dbf
using
System
;
using
Test.UtilsTools
;
using
System.Collections.Generic
;
using
Xunit
;
using
TDengineDriver
;
using
Test.UtilsTools.ResultSet
;
namespace
Cases
{
public
class
FetchLengthCase
{
/// <author>xiaolei</author>
/// <Name>TestRetrieveBinary</Name>
/// <describe>TD-12103 C# connector fetch_row with binary data retrieving error</describe>
/// <filename>FetchLength.cs</filename>
/// <result>pass or failed </result>
[
Fact
(
DisplayName
=
"Skip FetchLengthCase.TestRetrieveBinary()"
)]
public
void
TestRetrieveBinary
()
{
IntPtr
conn
=
UtilsTools
.
TDConnection
();
var
expectData
=
new
List
<
string
>
{
"log"
,
"test"
,
"db02"
,
"db3"
};
var
expectMeta
=
new
List
<
TDengineMeta
>{
UtilsTools
.
ConstructTDengineMeta
(
"ts"
,
"timestamp"
),
UtilsTools
.
ConstructTDengineMeta
(
"name"
,
"binary(10)"
),
UtilsTools
.
ConstructTDengineMeta
(
"n"
,
"int"
)
};
string
sql0
=
"drop table if exists stb1;"
;
string
sql1
=
"create stable if not exists stb1 (ts timestamp, name binary(10)) tags(n int);"
;
string
sql2
=
$"insert into tb1 using stb1 tags(1) values(now, '
{
expectData
[
0
]}
');"
;
string
sql3
=
$"insert into tb2 using stb1 tags(2) values(now, '
{
expectData
[
1
]}
');"
;
string
sql4
=
$"insert into tb3 using stb1 tags(3) values(now, '
{
expectData
[
2
]}
');"
;
string
sql5
=
$"insert into tb4 using stb1 tags(4) values(now, '
{
expectData
[
3
]}
');"
;
string
sql6
=
"select distinct(name) from stb1;"
;
UtilsTools
.
ExecuteQuery
(
conn
,
sql0
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql1
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql2
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql3
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql4
);
UtilsTools
.
ExecuteQuery
(
conn
,
sql5
);
IntPtr
resPtr
=
IntPtr
.
Zero
;
resPtr
=
UtilsTools
.
ExecuteQuery
(
conn
,
sql6
);
ResultSet
actualResult
=
new
ResultSet
(
resPtr
);
List
<
string
>
actualData
=
actualResult
.
GetResultData
();
List
<
TDengineMeta
>
actualMeta
=
actualResult
.
GetResultMeta
();
expectData
.
Reverse
();
Assert
.
Equal
(
expectData
[
0
],
actualData
[
0
]);
Assert
.
Equal
(
expectMeta
[
1
].
name
,
actualMeta
[
0
].
name
);
Assert
.
Equal
(
expectMeta
[
1
].
size
,
actualMeta
[
0
].
size
);
Assert
.
Equal
(
expectMeta
[
1
].
type
,
actualMeta
[
0
].
type
);
}
}
}
src/connector/C#/src/test/FunctionTest/FunctionTest.csproj
0 → 100644
浏览文件 @
e7167dbf
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
<NoWarn>CS1591;CS0168</NoWarn>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<DocumentationFile>..\doc\FunctionTest.XML</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\TDengineDriver\TDengineDriver.csproj" />
</ItemGroup>
</Project>
src/connector/C#/src/test/FunctionTest/ResultSetUtils.cs
0 → 100644
浏览文件 @
e7167dbf
using
System
;
using
TDengineDriver
;
using
System.Runtime.InteropServices
;
using
System.Text
;
using
System.Collections.Generic
;
namespace
Test.UtilsTools.ResultSet
{
public
class
ResultSet
{
private
List
<
TDengineMeta
>
resultMeta
;
private
List
<
String
>
resultData
;
// private bool isValidResult = false;
public
ResultSet
(
IntPtr
res
)
{
resultMeta
=
UtilsTools
.
GetResField
(
res
);
resultData
=
UtilsTools
.
GetResData
(
res
);
}
public
ResultSet
(
List
<
TDengineMeta
>
metas
,
List
<
String
>
datas
)
{
resultMeta
=
metas
;
resultData
=
datas
;
}
public
List
<
String
>
GetResultData
()
{
return
resultData
;
}
public
List
<
TDengineMeta
>
GetResultMeta
()
{
return
resultMeta
;
}
}
}
\ No newline at end of file
src/connector/C#/src/test/
Cases
/StmtNormalTable.cs
→
src/connector/C#/src/test/
FunctionTest
/StmtNormalTable.cs
浏览文件 @
e7167dbf
此差异已折叠。
点击以展开。
src/connector/C#/src/test/
Cases
/StmtQuery.cs
→
src/connector/C#/src/test/
FunctionTest
/StmtQuery.cs
浏览文件 @
e7167dbf
文件已移动
src/connector/C#/src/test/FunctionTest/StmtStable.cs
0 → 100644
浏览文件 @
e7167dbf
此差异已折叠。
点击以展开。
src/connector/C#/src/test/
Cases
/StmtUtil.cs
→
src/connector/C#/src/test/
FunctionTest
/StmtUtil.cs
浏览文件 @
e7167dbf
文件已移动
src/connector/C#/src/test/FunctionTest/TaosFeild.cs
0 → 100644
浏览文件 @
e7167dbf
using
System
;
using
Test.UtilsTools
;
using
TDengineDriver
;
using
System.Collections.Generic
;
using
Xunit
;
using
Test.UtilsTools.ResultSet
;
namespace
Cases
{
public
class
FetchFieldCases
{
/// <author>xiaolei</author>
/// <Name>FetchFieldCases.TestFetchFieldJsonTag</Name>
/// <describe>test taos_fetch_fields(), check the meta data</describe>
/// <filename>TaosFeild.cs</filename>
/// <result>pass or failed </result>
[
Fact
(
DisplayName
=
"FetchFieldCases.TestFetchFieldJsonTag()"
)]
public
void
TestFetchFieldJsonTag
()
{
IntPtr
conn
=
UtilsTools
.
TDConnection
();
IntPtr
_res
=
IntPtr
.
Zero
;
string
tableName
=
"fetchfeilds"
;
var
expectResMeta
=
new
List
<
TDengineMeta
>
{
UtilsTools
.
ConstructTDengineMeta
(
"ts"
,
"timestamp"
),
UtilsTools
.
ConstructTDengineMeta
(
"b"
,
"bool"
),
UtilsTools
.
ConstructTDengineMeta
(
"v1"
,
"tinyint"
),
UtilsTools
.
ConstructTDengineMeta
(
"v2"
,
"smallint"
),
UtilsTools
.
ConstructTDengineMeta
(
"v4"
,
"int"
),
UtilsTools
.
ConstructTDengineMeta
(
"v8"
,
"bigint"
),
UtilsTools
.
ConstructTDengineMeta
(
"f4"
,
"float"
),
UtilsTools
.
ConstructTDengineMeta
(
"f8"
,
"double"
),
UtilsTools
.
ConstructTDengineMeta
(
"u1"
,
"tinyint unsigned"
),
UtilsTools
.
ConstructTDengineMeta
(
"u2"
,
"smallint unsigned"
),
UtilsTools
.
ConstructTDengineMeta
(
"u4"
,
"int unsigned"
),
UtilsTools
.
ConstructTDengineMeta
(
"u8"
,
"bigint unsigned"
),
UtilsTools
.
ConstructTDengineMeta
(
"bin"
,
"binary(200)"
),
UtilsTools
.
ConstructTDengineMeta
(
"blob"
,
"nchar(200)"
),
UtilsTools
.
ConstructTDengineMeta
(
"jsontag"
,
"json"
),
};
var
expectResData
=
new
List
<
String
>
{
"1637064040000"
,
"true"
,
"1"
,
"2"
,
"3"
,
"4"
,
"5"
,
"6"
,
"7"
,
"8"
,
"9"
,
"10"
,
"XI"
,
"XII"
,
"{\"k1\": \"v1\"}"
};
String
dropTb
=
"drop table if exists "
+
tableName
;
String
createTb
=
"create stable "
+
tableName
+
" (ts timestamp"
+
",b bool"
+
",v1 tinyint"
+
",v2 smallint"
+
",v4 int"
+
",v8 bigint"
+
",f4 float"
+
",f8 double"
+
",u1 tinyint unsigned"
+
",u2 smallint unsigned"
+
",u4 int unsigned"
+
",u8 bigint unsigned"
+
",bin binary(200)"
+
",blob nchar(200)"
+
")"
+
"tags"
+
"(jsontag json);"
;
String
insertSql
=
"insert into "
+
tableName
+
"_t1 using "
+
tableName
+
" tags('{\"k1\": \"v1\"}') "
+
"values(1637064040000,true,1,2,3,4,5,6,7,8,9,10,'XI','XII')"
;
String
selectSql
=
"select * from "
+
tableName
;
String
dropSql
=
"drop table "
+
tableName
;
UtilsTools
.
ExecuteUpdate
(
conn
,
dropTb
);
UtilsTools
.
ExecuteUpdate
(
conn
,
createTb
);
UtilsTools
.
ExecuteUpdate
(
conn
,
insertSql
);
_res
=
UtilsTools
.
ExecuteQuery
(
conn
,
selectSql
);
ResultSet
actualResult
=
new
ResultSet
(
_res
);
List
<
TDengineMeta
>
actualMeta
=
actualResult
.
GetResultMeta
();
for
(
int
i
=
0
;
i
<
actualMeta
.
Count
;
i
++)
{
Assert
.
Equal
(
expectResMeta
[
i
].
name
,
actualMeta
[
i
].
name
);
Assert
.
Equal
(
expectResMeta
[
i
].
type
,
actualMeta
[
i
].
type
);
Assert
.
Equal
(
expectResMeta
[
i
].
size
,
actualMeta
[
i
].
size
);
}
}
}
}
src/connector/C#/src/test/FunctionTest/Utils.cs
0 → 100644
浏览文件 @
e7167dbf
using
System
;
using
TDengineDriver
;
using
System.Runtime.InteropServices
;
using
System.Text
;
using
System.Collections.Generic
;
namespace
Test.UtilsTools
{
public
class
UtilsTools
{
static
string
ip
=
"127.0.0.1"
;
static
string
user
=
"root"
;
static
string
password
=
"taosdata"
;
static
string
db
=
""
;
static
short
port
=
0
;
public
static
IntPtr
TDConnection
()
{
TDengine
.
Options
((
int
)
TDengineInitOption
.
TDDB_OPTION_CONFIGDIR
,
GetConfigPath
());
TDengine
.
Options
((
int
)
TDengineInitOption
.
TDDB_OPTION_SHELL_ACTIVITY_TIMER
,
"60"
);
TDengine
.
Init
();
IntPtr
conn
=
TDengine
.
Connect
(
ip
,
user
,
password
,
db
,
port
);
// UtilsTools.ExecuteUpdate(conn, "drop database if exists csharp");
UtilsTools
.
ExecuteUpdate
(
conn
,
"create database if not exists csharp keep 3650"
);
UtilsTools
.
ExecuteUpdate
(
conn
,
"use csharp"
);
return
conn
;
}
public
static
string
GetConfigPath
()
{
string
configDir
=
""
;
if
(
OperatingSystem
.
IsOSPlatform
(
"Windows"
))
{
configDir
=
"C:/TDengine/cfg"
;
}
else
if
(
OperatingSystem
.
IsOSPlatform
(
"Linux"
))
{
configDir
=
"/etc/taos"
;
}
else
if
(
OperatingSystem
.
IsOSPlatform
(
"macOS"
))
{
configDir
=
"/etc/taos"
;
}
return
configDir
;
}
public
static
IntPtr
ExecuteQuery
(
IntPtr
conn
,
String
sql
)
{
IntPtr
res
=
TDengine
.
Query
(
conn
,
sql
);
if
(!
IsValidResult
(
res
))
{
Console
.
Write
(
sql
.
ToString
()
+
" failure, "
);
ExitProgram
();
}
else
{
Console
.
WriteLine
(
sql
.
ToString
()
+
" success"
);
}
return
res
;
}
public
static
IntPtr
ExecuteErrorQuery
(
IntPtr
conn
,
String
sql
)
{
IntPtr
res
=
TDengine
.
Query
(
conn
,
sql
);
if
(!
IsValidResult
(
res
))
{
Console
.
Write
(
sql
.
ToString
()
+
" failure, "
);
ExitProgram
();
}
else
{
Console
.
WriteLine
(
sql
.
ToString
()
+
" success"
);
}
return
res
;
}
public
static
void
ExecuteUpdate
(
IntPtr
conn
,
String
sql
)
{
IntPtr
res
=
TDengine
.
Query
(
conn
,
sql
);
if
(!
IsValidResult
(
res
))
{
Console
.
Write
(
sql
.
ToString
()
+
" failure, "
);
ExitProgram
();
}
else
{
Console
.
WriteLine
(
sql
.
ToString
()
+
" success"
);
}
TDengine
.
FreeResult
(
res
);
}
public
static
void
DisplayRes
(
IntPtr
res
)
{
if
(!
IsValidResult
(
res
))
{
ExitProgram
();
}
List
<
TDengineMeta
>
metas
=
GetResField
(
res
);
int
fieldCount
=
metas
.
Count
;
IntPtr
rowdata
;
// StringBuilder builder = new StringBuilder();
List
<
string
>
datas
=
QueryRes
(
res
,
metas
);
Console
.
Write
(
" DisplayRes ---"
);
for
(
int
i
=
0
;
i
<
metas
.
Count
;
i
++)
{
for
(
int
j
=
0
;
j
<
datas
.
Count
;
j
++)
{
Console
.
Write
(
" {0} ---"
,
datas
[
i
*
j
+
i
]);
}
Console
.
WriteLine
(
""
);
}
// if (TDengine.ErrorNo(res) != 0)
// {
// Console.Write("Query is not complete, Error {0:G}", TDengine.ErrorNo(res), TDengine.Error(res));
// }
// TDengine.FreeResult(res); Console.WriteLine("");
}
public
static
List
<
List
<
string
>>
GetResultSet
(
IntPtr
res
)
{
List
<
List
<
string
>>
result
=
new
List
<
List
<
string
>>();
List
<
string
>
colName
=
new
List
<
string
>();
List
<
string
>
dataRaw
=
new
List
<
string
>();
if
(!
IsValidResult
(
res
))
{
ExitProgram
();
}
List
<
TDengineMeta
>
metas
=
GetResField
(
res
);
result
.
Add
(
colName
);
dataRaw
=
QueryRes
(
res
,
metas
);
result
.
Add
(
dataRaw
);
if
(
TDengine
.
ErrorNo
(
res
)
!=
0
)
{
Console
.
Write
(
"Query is not complete, Error {0:G}"
,
TDengine
.
ErrorNo
(
res
),
TDengine
.
Error
(
res
));
}
return
result
;
}
public
static
bool
IsValidResult
(
IntPtr
res
)
{
if
((
res
==
IntPtr
.
Zero
)
||
(
TDengine
.
ErrorNo
(
res
)
!=
0
))
{
if
(
res
!=
IntPtr
.
Zero
)
{
Console
.
Write
(
"reason: "
+
TDengine
.
Error
(
res
));
return
false
;
}
Console
.
WriteLine
(
""
);
return
false
;
}
return
true
;
}
public
static
void
CloseConnection
(
IntPtr
conn
)
{
ExecuteUpdate
(
conn
,
"drop database if exists csharp"
);
if
(
conn
!=
IntPtr
.
Zero
)
{
if
(
TDengine
.
Close
(
conn
)
==
0
)
{
Console
.
WriteLine
(
"close connection sucess"
);
}
else
{
Console
.
WriteLine
(
"close Connection failed"
);
}
}
}
public
static
List
<
TDengineMeta
>
GetResField
(
IntPtr
res
)
{
List
<
TDengineMeta
>
metas
=
TDengine
.
FetchFields
(
res
);
return
metas
;
}
public
static
void
AssertEqual
(
string
expectVal
,
string
actualVal
)
{
if
(
expectVal
==
actualVal
)
{
Console
.
WriteLine
(
"{0}=={1} pass"
,
expectVal
,
actualVal
);
}
else
{
Console
.
WriteLine
(
"{0}=={1} failed"
,
expectVal
,
actualVal
);
ExitProgram
();
}
}
public
static
void
ExitProgram
()
{
TDengine
.
Cleanup
();
System
.
Environment
.
Exit
(
0
);
}
public
static
List
<
String
>
GetResData
(
IntPtr
res
)
{
List
<
string
>
colName
=
new
List
<
string
>();
List
<
string
>
dataRaw
=
new
List
<
string
>();
if
(!
IsValidResult
(
res
))
{
ExitProgram
();
}
List
<
TDengineMeta
>
metas
=
GetResField
(
res
);
dataRaw
=
QueryRes
(
res
,
metas
);
return
dataRaw
;
}
public
static
TDengineMeta
ConstructTDengineMeta
(
string
name
,
string
type
)
{
TDengineMeta
_meta
=
new
TDengineMeta
();
_meta
.
name
=
name
;
char
[]
separators
=
new
char
[]
{
'('
,
')'
};
string
[]
subs
=
type
.
Split
(
separators
,
StringSplitOptions
.
RemoveEmptyEntries
);
switch
(
subs
[
0
].
ToUpper
())
{
case
"BOOL"
:
_meta
.
type
=
1
;
_meta
.
size
=
1
;
break
;
case
"TINYINT"
:
_meta
.
type
=
2
;
_meta
.
size
=
1
;
break
;
case
"SMALLINT"
:
_meta
.
type
=
3
;
_meta
.
size
=
2
;
break
;
case
"INT"
:
_meta
.
type
=
4
;
_meta
.
size
=
4
;
break
;
case
"BIGINT"
:
_meta
.
type
=
5
;
_meta
.
size
=
8
;
break
;
case
"TINYINT UNSIGNED"
:
_meta
.
type
=
11
;
_meta
.
size
=
1
;
break
;
case
"SMALLINT UNSIGNED"
:
_meta
.
type
=
12
;
_meta
.
size
=
2
;
break
;
case
"INT UNSIGNED"
:
_meta
.
type
=
13
;
_meta
.
size
=
4
;
break
;
case
"BIGINT UNSIGNED"
:
_meta
.
type
=
14
;
_meta
.
size
=
8
;
break
;
case
"FLOAT"
:
_meta
.
type
=
6
;
_meta
.
size
=
4
;
break
;
case
"DOUBLE"
:
_meta
.
type
=
7
;
_meta
.
size
=
8
;
break
;
case
"BINARY"
:
_meta
.
type
=
8
;
_meta
.
size
=
short
.
Parse
(
subs
[
1
]);
break
;
case
"TIMESTAMP"
:
_meta
.
type
=
9
;
_meta
.
size
=
8
;
break
;
case
"NCHAR"
:
_meta
.
type
=
10
;
_meta
.
size
=
short
.
Parse
(
subs
[
1
]);
break
;
case
"JSON"
:
_meta
.
type
=
15
;
_meta
.
size
=
4096
;
break
;
default
:
_meta
.
type
=
byte
.
MaxValue
;
_meta
.
size
=
0
;
break
;
}
return
_meta
;
}
private
static
List
<
string
>
QueryRes
(
IntPtr
res
,
List
<
TDengineMeta
>
metas
)
{
IntPtr
rowdata
;
long
queryRows
=
0
;
List
<
string
>
dataRaw
=
new
List
<
string
>();
int
fieldCount
=
metas
.
Count
;
while
((
rowdata
=
TDengine
.
FetchRows
(
res
))
!=
IntPtr
.
Zero
)
{
queryRows
++;
IntPtr
colLengthPtr
=
TDengine
.
FetchLengths
(
res
);
int
[]
colLengthArr
=
new
int
[
fieldCount
];
Marshal
.
Copy
(
colLengthPtr
,
colLengthArr
,
0
,
fieldCount
);
for
(
int
fields
=
0
;
fields
<
fieldCount
;
++
fields
)
{
TDengineMeta
meta
=
metas
[
fields
];
int
offset
=
IntPtr
.
Size
*
fields
;
IntPtr
data
=
Marshal
.
ReadIntPtr
(
rowdata
,
offset
);
if
(
data
==
IntPtr
.
Zero
)
{
dataRaw
.
Add
(
"NULL"
);
continue
;
}
switch
((
TDengineDataType
)
meta
.
type
)
{
case
TDengineDataType
.
TSDB_DATA_TYPE_BOOL
:
bool
v1
=
Marshal
.
ReadByte
(
data
)
==
0
?
false
:
true
;
dataRaw
.
Add
(
v1
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_TINYINT
:
sbyte
v2
=
(
sbyte
)
Marshal
.
ReadByte
(
data
);
dataRaw
.
Add
(
v2
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_SMALLINT
:
short
v3
=
Marshal
.
ReadInt16
(
data
);
dataRaw
.
Add
(
v3
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_INT
:
int
v4
=
Marshal
.
ReadInt32
(
data
);
dataRaw
.
Add
(
v4
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_BIGINT
:
long
v5
=
Marshal
.
ReadInt64
(
data
);
dataRaw
.
Add
(
v5
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_FLOAT
:
float
v6
=
(
float
)
Marshal
.
PtrToStructure
(
data
,
typeof
(
float
));
dataRaw
.
Add
(
v6
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_DOUBLE
:
double
v7
=
(
double
)
Marshal
.
PtrToStructure
(
data
,
typeof
(
double
));
dataRaw
.
Add
(
v7
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_BINARY
:
string
v8
=
Marshal
.
PtrToStringAnsi
(
data
,
colLengthArr
[
fields
]);
dataRaw
.
Add
(
v8
);
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_TIMESTAMP
:
long
v9
=
Marshal
.
ReadInt64
(
data
);
dataRaw
.
Add
(
v9
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_NCHAR
:
string
v10
=
Marshal
.
PtrToStringAnsi
(
data
,
colLengthArr
[
fields
]);
dataRaw
.
Add
(
v10
);
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_UTINYINT
:
byte
v12
=
Marshal
.
ReadByte
(
data
);
dataRaw
.
Add
(
v12
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_USMALLINT
:
ushort
v13
=
(
ushort
)
Marshal
.
ReadInt16
(
data
);
dataRaw
.
Add
(
v13
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_UINT
:
uint
v14
=
(
uint
)
Marshal
.
ReadInt32
(
data
);
dataRaw
.
Add
(
v14
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_UBIGINT
:
ulong
v15
=
(
ulong
)
Marshal
.
ReadInt64
(
data
);
dataRaw
.
Add
(
v15
.
ToString
());
break
;
default
:
dataRaw
.
Add
(
"unknown value"
);
break
;
}
}
}
if
(
TDengine
.
ErrorNo
(
res
)
!=
0
)
{
Console
.
Write
(
"Query is not complete, Error {0:G}"
,
TDengine
.
ErrorNo
(
res
),
TDengine
.
Error
(
res
));
}
TDengine
.
FreeResult
(
res
);
Console
.
WriteLine
(
""
);
return
dataRaw
;
}
}
}
src/connector/C#/src/test/XUnitTest/TestTDengineMeta.cs
浏览文件 @
e7167dbf
...
@@ -6,6 +6,11 @@ namespace TDengineDriver.Test
...
@@ -6,6 +6,11 @@ namespace TDengineDriver.Test
{
{
public
class
TestTDengineMeta
public
class
TestTDengineMeta
{
{
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameBool</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's bool meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameBool
()
public
void
TestTypeNameBool
()
{
{
...
@@ -17,7 +22,11 @@ namespace TDengineDriver.Test
...
@@ -17,7 +22,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameTINYINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's TinnyInt's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameTINYINT
()
public
void
TestTypeNameTINYINT
()
{
{
...
@@ -29,6 +38,11 @@ namespace TDengineDriver.Test
...
@@ -29,6 +38,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameSMALLINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's SMALLINT's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameSMALLINT
()
public
void
TestTypeNameSMALLINT
()
{
{
...
@@ -40,6 +54,11 @@ namespace TDengineDriver.Test
...
@@ -40,6 +54,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's INT's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameINT
()
public
void
TestTypeNameINT
()
{
{
...
@@ -51,6 +70,11 @@ namespace TDengineDriver.Test
...
@@ -51,6 +70,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameBIGINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's BIGINT's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameBIGINT
()
public
void
TestTypeNameBIGINT
()
{
{
...
@@ -62,6 +86,11 @@ namespace TDengineDriver.Test
...
@@ -62,6 +86,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameUTINYINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's TINYINT UNSIGNED's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameUTINYINT
()
public
void
TestTypeNameUTINYINT
()
{
{
...
@@ -73,6 +102,11 @@ namespace TDengineDriver.Test
...
@@ -73,6 +102,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameUSMALLINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's SMALLINT UNSIGNED's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameUSMALLINT
()
public
void
TestTypeNameUSMALLINT
()
{
{
...
@@ -84,6 +118,11 @@ namespace TDengineDriver.Test
...
@@ -84,6 +118,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameUINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's INT UNSIGNED's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameUINT
()
public
void
TestTypeNameUINT
()
{
{
...
@@ -95,6 +134,11 @@ namespace TDengineDriver.Test
...
@@ -95,6 +134,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameUBIGINT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's BIGINT UNSIGNED's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameUBIGINT
()
public
void
TestTypeNameUBIGINT
()
{
{
...
@@ -106,7 +150,11 @@ namespace TDengineDriver.Test
...
@@ -106,7 +150,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameFLOAT</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's FLOAT's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameFLOAT
()
public
void
TestTypeNameFLOAT
()
{
{
...
@@ -118,6 +166,11 @@ namespace TDengineDriver.Test
...
@@ -118,6 +166,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameDOUBLE</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's DOUBLE's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameDOUBLE
()
public
void
TestTypeNameDOUBLE
()
{
{
...
@@ -129,10 +182,15 @@ namespace TDengineDriver.Test
...
@@ -129,10 +182,15 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameSTRING</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's BINARY's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameSTRING
()
public
void
TestTypeNameSTRING
()
{
{
string
typeName
=
"
STRING
"
;
string
typeName
=
"
BINARY
"
;
TDengineDriver
.
TDengineMeta
meta
=
new
TDengineDriver
.
TDengineMeta
();
TDengineDriver
.
TDengineMeta
meta
=
new
TDengineDriver
.
TDengineMeta
();
meta
.
type
=
8
;
meta
.
type
=
8
;
string
metaTypeName
=
meta
.
TypeName
();
string
metaTypeName
=
meta
.
TypeName
();
...
@@ -140,6 +198,11 @@ namespace TDengineDriver.Test
...
@@ -140,6 +198,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameTIMESTAMP</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's TIMESTAMP's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameTIMESTAMP
()
public
void
TestTypeNameTIMESTAMP
()
{
{
...
@@ -151,6 +214,11 @@ namespace TDengineDriver.Test
...
@@ -151,6 +214,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameNCHAR</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's NCHAR's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameNCHAR
()
public
void
TestTypeNameNCHAR
()
{
{
...
@@ -162,6 +230,11 @@ namespace TDengineDriver.Test
...
@@ -162,6 +230,11 @@ namespace TDengineDriver.Test
Assert
.
Equal
(
metaTypeName
,
typeName
);
Assert
.
Equal
(
metaTypeName
,
typeName
);
}
}
/// <author>xiaolei</author>
/// <Name>TestTDengineMeta.TestTypeNameUndefined</Name>
/// <describe>Unit test for oject TDengineDriver.TDengineMeta's undefine's meta info</describe>
/// <filename>TestTDengineMeta.cs</filename>
/// <result>pass or failed </result>
[
Fact
]
[
Fact
]
public
void
TestTypeNameUndefined
()
public
void
TestTypeNameUndefined
()
{
{
...
...
src/connector/C#/src/test/XUnitTest/TestTaosBind.cs
浏览文件 @
e7167dbf
此差异已折叠。
点击以展开。
src/kit/shell/src/shellCheck.c
浏览文件 @
e7167dbf
...
@@ -131,7 +131,7 @@ static void *shellCheckThreadFp(void *arg) {
...
@@ -131,7 +131,7 @@ static void *shellCheckThreadFp(void *arg) {
char
*
tbname
=
tbNames
[
t
];
char
*
tbname
=
tbNames
[
t
];
if
(
tbname
==
NULL
)
break
;
if
(
tbname
==
NULL
)
break
;
snprintf
(
sql
,
SHELL_SQL_LEN
,
"select
last_row(_c0
) from %s;"
,
tbname
);
snprintf
(
sql
,
SHELL_SQL_LEN
,
"select
count(*
) from %s;"
,
tbname
);
TAOS_RES
*
pSql
=
taos_query
(
pThread
->
taos
,
sql
);
TAOS_RES
*
pSql
=
taos_query
(
pThread
->
taos
,
sql
);
int32_t
code
=
taos_errno
(
pSql
);
int32_t
code
=
taos_errno
(
pSql
);
...
...
src/mnode/inc/mnodeVgroup.h
浏览文件 @
e7167dbf
...
@@ -43,7 +43,7 @@ void mnodeCheckUnCreatedVgroup(SDnodeObj *pDnode, SVnodeLoad *pVloads, int32_
...
@@ -43,7 +43,7 @@ void mnodeCheckUnCreatedVgroup(SDnodeObj *pDnode, SVnodeLoad *pVloads, int32_
int32_t
mnodeCreateVgroup
(
struct
SMnodeMsg
*
pMsg
);
int32_t
mnodeCreateVgroup
(
struct
SMnodeMsg
*
pMsg
);
void
mnodeDropVgroup
(
SVgObj
*
pVgroup
,
void
*
ahandle
);
void
mnodeDropVgroup
(
SVgObj
*
pVgroup
,
void
*
ahandle
);
void
mnodeAlterVgroup
(
SVgObj
*
pVgroup
,
void
*
ahandle
);
void
mnodeAlterVgroup
(
SVgObj
*
pVgroup
,
void
*
ahandle
);
int32_t
mnodeGetAvailableVgroup
(
struct
SMnodeMsg
*
pMsg
,
SVgObj
**
pVgroup
,
int32_t
*
sid
);
int32_t
mnodeGetAvailableVgroup
(
struct
SMnodeMsg
*
pMsg
,
SVgObj
**
pVgroup
,
int32_t
*
sid
,
int32_t
vgId
);
int32_t
mnodeAddTableIntoVgroup
(
SVgObj
*
pVgroup
,
SCTableObj
*
pTable
,
bool
needCheck
);
int32_t
mnodeAddTableIntoVgroup
(
SVgObj
*
pVgroup
,
SCTableObj
*
pTable
,
bool
needCheck
);
void
mnodeRemoveTableFromVgroup
(
SVgObj
*
pVgroup
,
SCTableObj
*
pTable
);
void
mnodeRemoveTableFromVgroup
(
SVgObj
*
pVgroup
,
SCTableObj
*
pTable
);
...
...
src/mnode/src/mnodeTable.c
浏览文件 @
e7167dbf
...
@@ -48,6 +48,12 @@
...
@@ -48,6 +48,12 @@
#define CREATE_CTABLE_RETRY_TIMES 10
#define CREATE_CTABLE_RETRY_TIMES 10
#define CREATE_CTABLE_RETRY_SEC 14
#define CREATE_CTABLE_RETRY_SEC 14
// informal
#define META_SYNC_TABLE_NAME "_taos_meta_sync_table_name_taos_"
#define META_SYNC_TABLE_NAME_LEN 32
static
int32_t
tsMetaSyncOption
=
0
;
// informal
int64_t
tsCTableRid
=
-
1
;
int64_t
tsCTableRid
=
-
1
;
static
void
*
tsChildTableSdb
;
static
void
*
tsChildTableSdb
;
int64_t
tsSTableRid
=
-
1
;
int64_t
tsSTableRid
=
-
1
;
...
@@ -1726,6 +1732,9 @@ int32_t mnodeRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows,
...
@@ -1726,6 +1732,9 @@ int32_t mnodeRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows,
cols
++
;
cols
++
;
numOfRows
++
;
numOfRows
++
;
mDebug
(
"stable: %s, uid: %"
PRIu64
,
prefix
,
pTable
->
uid
);
mnodeDecTableRef
(
pTable
);
mnodeDecTableRef
(
pTable
);
}
}
...
@@ -2227,9 +2236,19 @@ static int32_t mnodeProcessCreateChildTableMsg(SMnodeMsg *pMsg) {
...
@@ -2227,9 +2236,19 @@ static int32_t mnodeProcessCreateChildTableMsg(SMnodeMsg *pMsg) {
if
(
pMsg
->
pTable
==
NULL
)
{
if
(
pMsg
->
pTable
==
NULL
)
{
SVgObj
*
pVgroup
=
NULL
;
SVgObj
*
pVgroup
=
NULL
;
int32_t
tid
=
0
;
int32_t
tid
=
0
;
code
=
mnodeGetAvailableVgroup
(
pMsg
,
&
pVgroup
,
&
tid
);
int32_t
vgId
=
0
;
if
(
tsMetaSyncOption
)
{
char
*
pTbName
=
strchr
(
pCreate
->
tableName
,
'.'
);
if
(
pTbName
&&
(
pTbName
=
strchr
(
pTbName
+
1
,
'.'
)))
{
if
(
0
==
strncmp
(
META_SYNC_TABLE_NAME
,
++
pTbName
,
META_SYNC_TABLE_NAME_LEN
))
{
vgId
=
atoi
(
pTbName
+
META_SYNC_TABLE_NAME_LEN
);
}
}
}
code
=
mnodeGetAvailableVgroup
(
pMsg
,
&
pVgroup
,
&
tid
,
vgId
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
m
Debug
(
"msg:%p, app:%p table:%s, failed to get available vgroup, reason:%s"
,
pMsg
,
pMsg
->
rpcMsg
.
ahandle
,
m
Error
(
"msg:%p, app:%p table:%s, failed to get available vgroup, reason:%s"
,
pMsg
,
pMsg
->
rpcMsg
.
ahandle
,
pCreate
->
tableName
,
tstrerror
(
code
));
pCreate
->
tableName
,
tstrerror
(
code
));
return
code
;
return
code
;
}
}
...
...
src/mnode/src/mnodeVgroup.c
浏览文件 @
e7167dbf
...
@@ -428,10 +428,47 @@ static int32_t mnodeAllocVgroupIdPool(SVgObj *pInputVgroup) {
...
@@ -428,10 +428,47 @@ static int32_t mnodeAllocVgroupIdPool(SVgObj *pInputVgroup) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
mnodeGetAvailableVgroup
(
SMnodeMsg
*
pMsg
,
SVgObj
**
ppVgroup
,
int32_t
*
pSid
)
{
int32_t
mnodeGetAvailableVgroup
(
SMnodeMsg
*
pMsg
,
SVgObj
**
ppVgroup
,
int32_t
*
pSid
,
int32_t
vgId
)
{
SDbObj
*
pDb
=
pMsg
->
pDb
;
SDbObj
*
pDb
=
pMsg
->
pDb
;
pthread_mutex_lock
(
&
pDb
->
mutex
);
pthread_mutex_lock
(
&
pDb
->
mutex
);
if
(
vgId
>
0
)
{
for
(
int32_t
v
=
0
;
v
<
pDb
->
numOfVgroups
;
++
v
)
{
SVgObj
*
pVgroup
=
pDb
->
vgList
[
v
];
if
(
pVgroup
==
NULL
)
{
mError
(
"db:%s, vgroup: %d is null"
,
pDb
->
name
,
v
);
pthread_mutex_unlock
(
&
pDb
->
mutex
);
return
TSDB_CODE_MND_APP_ERROR
;
}
if
(
pVgroup
->
vgId
!=
(
uint32_t
)
vgId
)
{
// find the target vgId
continue
;
}
int32_t
sid
=
taosAllocateId
(
pVgroup
->
idPool
);
if
(
sid
<=
0
)
{
int
curMaxId
=
taosIdPoolMaxSize
(
pVgroup
->
idPool
);
if
((
taosUpdateIdPool
(
pVgroup
->
idPool
,
curMaxId
+
1
)
<
0
)
||
((
sid
=
taosAllocateId
(
pVgroup
->
idPool
))
<=
0
))
{
mError
(
"msg:%p, app:%p db:%s, no enough sid in vgId:%d"
,
pMsg
,
pMsg
->
rpcMsg
.
ahandle
,
pDb
->
name
,
pVgroup
->
vgId
);
pthread_mutex_unlock
(
&
pDb
->
mutex
);
return
TSDB_CODE_MND_APP_ERROR
;
}
}
mDebug
(
"vgId:%d, alloc tid:%d"
,
pVgroup
->
vgId
,
sid
);
*
pSid
=
sid
;
*
ppVgroup
=
pVgroup
;
pDb
->
vgListIndex
=
v
;
pthread_mutex_unlock
(
&
pDb
->
mutex
);
return
TSDB_CODE_SUCCESS
;
}
pthread_mutex_unlock
(
&
pDb
->
mutex
);
mError
(
"db:%s, vgroup: %d not exist"
,
pDb
->
name
,
vgId
);
return
TSDB_CODE_MND_APP_ERROR
;
}
for
(
int32_t
v
=
0
;
v
<
pDb
->
numOfVgroups
;
++
v
)
{
for
(
int32_t
v
=
0
;
v
<
pDb
->
numOfVgroups
;
++
v
)
{
int
vgIndex
=
(
v
+
pDb
->
vgListIndex
)
%
pDb
->
numOfVgroups
;
int
vgIndex
=
(
v
+
pDb
->
vgListIndex
)
%
pDb
->
numOfVgroups
;
SVgObj
*
pVgroup
=
pDb
->
vgList
[
vgIndex
];
SVgObj
*
pVgroup
=
pDb
->
vgList
[
vgIndex
];
...
...
src/plugins/monitor/src/monMain.c
浏览文件 @
e7167dbf
...
@@ -458,14 +458,18 @@ static void monBuildMonitorSql(char *sql, int32_t cmd) {
...
@@ -458,14 +458,18 @@ static void monBuildMonitorSql(char *sql, int32_t cmd) {
", expire_time int, timeseries_used int, timeseries_total int)"
,
", expire_time int, timeseries_used int, timeseries_total int)"
,
tsMonitorDbName
);
tsMonitorDbName
);
}
else
if
(
cmd
==
MON_CMD_CREATE_MT_RESTFUL
)
{
}
else
if
(
cmd
==
MON_CMD_CREATE_MT_RESTFUL
)
{
int
usedLen
=
0
,
len
=
0
;
int
pos
=
snprintf
(
sql
,
SQL_LENGTH
,
int
pos
=
snprintf
(
sql
,
SQL_LENGTH
,
"create table if not exists %s.restful_info(ts timestamp"
,
tsMonitorDbName
);
"create table if not exists %s.restful_info(ts timestamp"
,
tsMonitorDbName
);
usedLen
+=
pos
;
for
(
int
i
=
0
;
i
<
tListLen
(
monHttpStatusTable
);
++
i
)
{
for
(
int
i
=
0
;
i
<
tListLen
(
monHttpStatusTable
);
++
i
)
{
pos
+=
snprintf
(
sql
+
pos
,
SQL_LENGTH
,
", `%s(%d)`
int"
,
len
=
snprintf
(
sql
+
pos
,
SQL_LENGTH
-
usedLen
,
", %s_%d
int"
,
monHttpStatusTable
[
i
].
name
,
monHttpStatusTable
[
i
].
name
,
monHttpStatusTable
[
i
].
code
);
monHttpStatusTable
[
i
].
code
);
usedLen
+=
len
;
pos
+=
len
;
}
}
snprintf
(
sql
+
pos
,
SQL_LENGTH
,
snprintf
(
sql
+
pos
,
SQL_LENGTH
-
usedLen
,
") tags (dnode_id int, dnode_ep binary(%d))"
,
") tags (dnode_id int, dnode_ep binary(%d))"
,
TSDB_EP_LEN
);
TSDB_EP_LEN
);
}
else
if
(
cmd
==
MON_CMD_CREATE_TB_RESTFUL
)
{
}
else
if
(
cmd
==
MON_CMD_CREATE_TB_RESTFUL
)
{
...
...
taosadapter
@
47fb0b3e
比较
fd84b35d
...
47fb0b3e
Subproject commit
fd84b35d3a30c9bcf3939d565f717b7f98ff9eb7
Subproject commit
47fb0b3e627ddadf1ca983c1d75b9a4e44cd98fd
src/query/src/qFill.c
浏览文件 @
e7167dbf
...
@@ -101,7 +101,6 @@ static void doFillOneRowResult(SFillInfo* pFillInfo, void** data, char** srcData
...
@@ -101,7 +101,6 @@ static void doFillOneRowResult(SFillInfo* pFillInfo, void** data, char** srcData
setNullValueForRow
(
pFillInfo
,
data
,
pFillInfo
->
numOfCols
,
index
);
setNullValueForRow
(
pFillInfo
,
data
,
pFillInfo
->
numOfCols
,
index
);
}
}
}
else
if
(
pFillInfo
->
type
==
TSDB_FILL_LINEAR
)
{
}
else
if
(
pFillInfo
->
type
==
TSDB_FILL_LINEAR
)
{
// TODO : linear interpolation supports NULL value
if
(
prev
!=
NULL
&&
!
outOfBound
)
{
if
(
prev
!=
NULL
&&
!
outOfBound
)
{
for
(
int32_t
i
=
1
;
i
<
pFillInfo
->
numOfCols
;
++
i
)
{
for
(
int32_t
i
=
1
;
i
<
pFillInfo
->
numOfCols
;
++
i
)
{
SFillColInfo
*
pCol
=
&
pFillInfo
->
pFillCol
[
i
];
SFillColInfo
*
pCol
=
&
pFillInfo
->
pFillCol
[
i
];
...
@@ -121,6 +120,10 @@ static void doFillOneRowResult(SFillInfo* pFillInfo, void** data, char** srcData
...
@@ -121,6 +120,10 @@ static void doFillOneRowResult(SFillInfo* pFillInfo, void** data, char** srcData
bool
exceedMax
=
false
,
exceedMin
=
false
;
bool
exceedMax
=
false
,
exceedMin
=
false
;
point1
=
(
SPoint
){.
key
=
*
(
TSKEY
*
)(
prev
),
.
val
=
prev
+
pCol
->
col
.
offset
};
point1
=
(
SPoint
){.
key
=
*
(
TSKEY
*
)(
prev
),
.
val
=
prev
+
pCol
->
col
.
offset
};
point2
=
(
SPoint
){.
key
=
ts
,
.
val
=
srcData
[
i
]
+
pFillInfo
->
index
*
bytes
};
point2
=
(
SPoint
){.
key
=
ts
,
.
val
=
srcData
[
i
]
+
pFillInfo
->
index
*
bytes
};
if
(
isNull
(
point2
.
val
,
type
))
{
setNull
(
val1
,
pCol
->
col
.
type
,
bytes
);
continue
;
}
point
=
(
SPoint
){.
key
=
pFillInfo
->
currentKey
,
.
val
=
val1
};
point
=
(
SPoint
){.
key
=
pFillInfo
->
currentKey
,
.
val
=
val1
};
taosGetLinearInterpolationVal
(
&
point
,
type
,
&
point1
,
&
point2
,
type
,
&
exceedMax
,
&
exceedMin
);
taosGetLinearInterpolationVal
(
&
point
,
type
,
&
point1
,
&
point2
,
type
,
&
exceedMax
,
&
exceedMin
);
}
}
...
...
tests/develop-test/2-query/ts_2016.py
0 → 100644
浏览文件 @
e7167dbf
###################################################################
# Copyright (c) 2021 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
from
util.log
import
*
from
util.cases
import
*
from
util.sql
import
*
class
TDTestCase
:
def
caseDescription
(
self
):
'''
case1<shenglian zhou>: [TS-2016]fix select * from (select * from empty_stable)
'''
return
def
init
(
self
,
conn
,
logSql
):
tdLog
.
debug
(
"start to execute %s"
%
__file__
)
tdSql
.
init
(
conn
.
cursor
(),
logSql
)
self
.
_conn
=
conn
def
run
(
self
):
print
(
"running {}"
.
format
(
__file__
))
tdSql
.
execute
(
"drop database if exists td12229"
)
tdSql
.
execute
(
"create database if not exists td12229"
)
tdSql
.
execute
(
'use td12229'
)
tdSql
.
execute
(
'create stable st(ts timestamp , value int ) tags (ind int)'
)
tdSql
.
execute
(
'insert into tb1 using st tags(1) values(now ,1)'
)
tdSql
.
execute
(
'insert into tb1 using st tags(1) values(now+1s ,2)'
)
tdSql
.
execute
(
'insert into tb1 using st tags(1) values(now+2s ,3)'
)
tdSql
.
execute
(
'create stable ste(ts timestamp , value int ) tags (ind int)'
)
tdSql
.
query
(
'select * from st'
)
tdSql
.
checkRows
(
3
)
tdSql
.
query
(
'select * from (select * from ste)'
)
tdSql
.
checkRows
(
0
)
tdSql
.
query
(
'select * from st union all select * from ste'
)
tdSql
.
checkRows
(
3
)
tdSql
.
query
(
'select * from ste union all select * from st'
)
tdSql
.
checkRows
(
3
)
tdSql
.
query
(
'select elapsed(ts) from ste group by tbname union all select elapsed(ts) from st group by tbname;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
query
(
'select elapsed(ts) from st group by tbname union all select elapsed(ts) from ste group by tbname;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
execute
(
'drop database td12229'
)
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
"%s successfully executed"
%
__file__
)
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
tests/develop-test/3-connectors/c#/test.sh
浏览文件 @
e7167dbf
...
@@ -19,12 +19,14 @@ cd ../../
...
@@ -19,12 +19,14 @@ cd ../../
WKC
=
`
pwd
`
WKC
=
`
pwd
`
cd
${
WKC
}
/src/connector/C#
cd
${
WKC
}
/src/connector/C#
dotnet
test
dotnet
test
dotnet run
--project
src/test/Cases/Cases.csproj
#
dotnet run --project src/test/Cases/Cases.csproj
cd
${
WKC
}
/tests/examples/C#
cd
${
WKC
}
/tests/examples/C#
dotnet run
--project
C#checker/C#checker.csproj
dotnet run
--project
C#checker/C#checker.csproj
dotnet run
--project
TDengineTest/TDengineTest.csproj
dotnet run
--project
TDengineTest/TDengineTest.csproj
dotnet run
--project
schemaless/schemaless.csproj
dotnet run
--project
schemaless/schemaless.csproj
dotnet run
--project
jsonTag/jsonTag.csproj
dotnet run
--project
stmt/stmt.csproj
cd
${
WKC
}
/tests/examples/C#/taosdemo
cd
${
WKC
}
/tests/examples/C#/taosdemo
dotnet build
-c
Release
dotnet build
-c
Release
...
...
tests/develop-test/fulltest-query.sh
浏览文件 @
e7167dbf
python3 ./test.py
-f
2-query/ts_hidden_column.py
python3 ./test.py
-f
2-query/ts_hidden_column.py
python3 ./test.py
-f
2-query/union-order.py
python3 ./test.py
-f
2-query/union-order.py
python3 ./test.py
-f
2-query/session_two_stage.py
python3 ./test.py
-f
2-query/session_two_stage.py
python3 ./test.py
-f
2-query/ts_2016.py
tests/examples/C#/.gitignore
浏览文件 @
e7167dbf
...
@@ -11,3 +11,5 @@ stmt/bin/
...
@@ -11,3 +11,5 @@ stmt/bin/
stmt/obj/
stmt/obj/
taosdemo/bin/
taosdemo/bin/
taosdemo/obj/
taosdemo/obj/
jsonTag/bin/
jsonTag/obj/
src/connector/C#/src/test/Cases
/JsonTag.cs
→
tests/examples/C#/jsonTag
/JsonTag.cs
浏览文件 @
e7167dbf
using
System
;
using
System
;
using
Test.UtilsToo
ls
;
using
Uti
ls
;
namespace
Cases
namespace
Cases
{
{
public
class
JsonTagTest
class
Program
{
static
void
Main
(
string
[]
args
)
{
IntPtr
conn
=
IntPtr
.
Zero
;
Console
.
WriteLine
(
"===================JsonTagTest===================="
);
conn
=
conn
=
UtilsTools
.
TDConnection
(
"127.0.0.1"
,
"root"
,
"taosdata"
,
""
,
0
);
UtilsTools
.
ExecuteUpdate
(
conn
,
"create database if not exists csharp_sample keep 3650"
);
UtilsTools
.
ExecuteUpdate
(
conn
,
"use csharp"
);
JsonTagSample
jsonTagSample
=
new
JsonTagSample
();
jsonTagSample
.
Test
(
conn
);
}
}
public
class
JsonTagSample
{
{
public
void
Test
(
IntPtr
conn
)
public
void
Test
(
IntPtr
conn
)
{
{
...
...
src/connector/C#/src/test/Cases/Utils
.cs
→
tests/examples/C#/jsonTag/Util
.cs
浏览文件 @
e7167dbf
...
@@ -3,9 +3,9 @@ using TDengineDriver;
...
@@ -3,9 +3,9 @@ using TDengineDriver;
using
System.Runtime.InteropServices
;
using
System.Runtime.InteropServices
;
using
System.Text
;
using
System.Text
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
namespace
Test.UtilsToo
ls
namespace
Uti
ls
{
{
public
class
UtilsTools
public
class
UtilsTools
{
{
static
string
configDir
=
"/etc/taos"
;
//"C:/TDengine/cfg";
static
string
configDir
=
"/etc/taos"
;
//"C:/TDengine/cfg";
...
@@ -189,103 +189,6 @@ namespace Test.UtilsTools
...
@@ -189,103 +189,6 @@ namespace Test.UtilsTools
TDengine
.
FreeResult
(
res
);
Console
.
WriteLine
(
""
);
TDengine
.
FreeResult
(
res
);
Console
.
WriteLine
(
""
);
}
}
public
static
List
<
List
<
string
>>
GetResultSet
(
IntPtr
res
)
{
List
<
List
<
string
>>
result
=
new
List
<
List
<
string
>>();
List
<
string
>
colName
=
new
List
<
string
>();
List
<
string
>
dataRaw
=
new
List
<
string
>();
long
queryRows
=
0
;
if
(!
IsValidResult
(
res
))
{
ExitProgram
();
}
int
fieldCount
=
TDengine
.
FieldCount
(
res
);
List
<
TDengineMeta
>
metas
=
TDengine
.
FetchFields
(
res
);
for
(
int
j
=
0
;
j
<
metas
.
Count
;
j
++)
{
TDengineMeta
meta
=
(
TDengineMeta
)
metas
[
j
];
colName
.
Add
(
meta
.
name
);
}
result
.
Add
(
colName
);
IntPtr
rowdata
;
while
((
rowdata
=
TDengine
.
FetchRows
(
res
))
!=
IntPtr
.
Zero
)
{
queryRows
++;
IntPtr
colLengthPtr
=
TDengine
.
FetchLengths
(
res
);
int
[]
colLengthArr
=
new
int
[
fieldCount
];
Marshal
.
Copy
(
colLengthPtr
,
colLengthArr
,
0
,
fieldCount
);
for
(
int
fields
=
0
;
fields
<
fieldCount
;
++
fields
)
{
TDengineMeta
meta
=
metas
[
fields
];
int
offset
=
IntPtr
.
Size
*
fields
;
IntPtr
data
=
Marshal
.
ReadIntPtr
(
rowdata
,
offset
);
if
(
data
==
IntPtr
.
Zero
)
{
dataRaw
.
Add
(
"NULL"
);
continue
;
}
switch
((
TDengineDataType
)
meta
.
type
)
{
case
TDengineDataType
.
TSDB_DATA_TYPE_BOOL
:
bool
v1
=
Marshal
.
ReadByte
(
data
)
==
0
?
false
:
true
;
dataRaw
.
Add
(
v1
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_TINYINT
:
byte
v2
=
Marshal
.
ReadByte
(
data
);
dataRaw
.
Add
(
v2
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_SMALLINT
:
short
v3
=
Marshal
.
ReadInt16
(
data
);
dataRaw
.
Add
(
v3
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_INT
:
int
v4
=
Marshal
.
ReadInt32
(
data
);
dataRaw
.
Add
(
v4
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_BIGINT
:
long
v5
=
Marshal
.
ReadInt64
(
data
);
dataRaw
.
Add
(
v5
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_FLOAT
:
float
v6
=
(
float
)
Marshal
.
PtrToStructure
(
data
,
typeof
(
float
));
dataRaw
.
Add
(
v6
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_DOUBLE
:
double
v7
=
(
double
)
Marshal
.
PtrToStructure
(
data
,
typeof
(
double
));
dataRaw
.
Add
(
v7
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_BINARY
:
string
v8
=
Marshal
.
PtrToStringAnsi
(
data
,
colLengthArr
[
fields
]);
dataRaw
.
Add
(
v8
);
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_TIMESTAMP
:
long
v9
=
Marshal
.
ReadInt64
(
data
);
dataRaw
.
Add
(
v9
.
ToString
());
break
;
case
TDengineDataType
.
TSDB_DATA_TYPE_NCHAR
:
string
v10
=
Marshal
.
PtrToStringAnsi
(
data
,
colLengthArr
[
fields
]);
dataRaw
.
Add
(
v10
);
break
;
}
}
}
result
.
Add
(
dataRaw
);
if
(
TDengine
.
ErrorNo
(
res
)
!=
0
)
{
Console
.
Write
(
"Query is not complete, Error {0:G}"
,
TDengine
.
ErrorNo
(
res
),
TDengine
.
Error
(
res
));
}
TDengine
.
FreeResult
(
res
);
Console
.
WriteLine
(
""
);
return
result
;
}
public
static
bool
IsValidResult
(
IntPtr
res
)
public
static
bool
IsValidResult
(
IntPtr
res
)
{
{
if
((
res
==
IntPtr
.
Zero
)
||
(
TDengine
.
ErrorNo
(
res
)
!=
0
))
if
((
res
==
IntPtr
.
Zero
)
||
(
TDengine
.
ErrorNo
(
res
)
!=
0
))
...
@@ -314,27 +217,10 @@ namespace Test.UtilsTools
...
@@ -314,27 +217,10 @@ namespace Test.UtilsTools
}
}
}
}
}
}
public
static
List
<
TDengineMeta
>
getField
(
IntPtr
res
)
{
List
<
TDengineMeta
>
metas
=
TDengine
.
FetchFields
(
res
);
return
metas
;
}
public
static
void
AssertEqual
(
string
expectVal
,
string
actualVal
)
{
if
(
expectVal
==
actualVal
)
{
Console
.
WriteLine
(
"{0}=={1} pass"
,
expectVal
,
actualVal
);
}
else
{
Console
.
WriteLine
(
"{0}=={1} failed"
,
expectVal
,
actualVal
);
ExitProgram
();
}
}
public
static
void
ExitProgram
()
public
static
void
ExitProgram
()
{
{
TDengine
.
Cleanup
();
TDengine
.
Cleanup
();
System
.
Environment
.
Exit
(
0
);
System
.
Environment
.
Exit
(
0
);
}
}
}
}
}
}
\ No newline at end of file
src/connector/C#/src/test/Cases/Cases
.csproj
→
tests/examples/C#/jsonTag/jsonTag
.csproj
浏览文件 @
e7167dbf
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\TDengineDriver\TDengineDriver.csproj" />
<PackageReference Include="TDengine.Connector" Version="1.0.3" />
</ItemGroup>
</ItemGroup>
<PropertyGroup>
</Project>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<NoWarn>CS1591</NoWarn>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<DocumentationFile>..\doc\FunctionTest.XML</DocumentationFile>
</PropertyGroup>
</Project>
tests/examples/JDBC/connectionPools/pom.xml
浏览文件 @
e7167dbf
...
@@ -53,7 +53,7 @@
...
@@ -53,7 +53,7 @@
<dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-core
</artifactId>
<artifactId>
log4j-core
</artifactId>
<version>
2.17.
0
</version>
<version>
2.17.
1
</version>
</dependency>
</dependency>
<!-- proxool -->
<!-- proxool -->
<dependency>
<dependency>
...
...
tests/examples/JDBC/taosdemo/pom.xml
浏览文件 @
e7167dbf
...
@@ -88,7 +88,7 @@
...
@@ -88,7 +88,7 @@
<dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-core
</artifactId>
<artifactId>
log4j-core
</artifactId>
<version>
2.17.
0
</version>
<version>
2.17.
1
</version>
</dependency>
</dependency>
<!-- junit -->
<!-- junit -->
<dependency>
<dependency>
...
...
tests/perftest-scripts/HttpPerfCompare.py
0 → 100644
浏览文件 @
e7167dbf
from
loguru
import
logger
import
time
import
os
import
json
class
HttpPerfCompard
:
def
__init__
(
self
):
self
.
hostname
=
"vm85"
self
.
taosc_port
=
6030
self
.
http_port
=
6041
self
.
database
=
"test"
self
.
query_times
=
1
self
.
concurrent
=
1
self
.
column_count
=
10
self
.
tag_count
=
10
self
.
perfMonitorBin
=
'/home/ubuntu/perfMonitor'
self
.
taosBenchmarkBin
=
'/usr/local/bin/taosBenchmark'
self
.
sleep_time
=
20
self
.
current_time
=
time
.
strftime
(
"%Y-%m-%d-%H:%M:%S"
,
time
.
localtime
(
time
.
time
()))
self
.
current_dir
=
os
.
path
.
dirname
(
os
.
path
.
realpath
(
__file__
))
self
.
log_file
=
os
.
path
.
join
(
self
.
current_dir
,
f
'./performance.log'
)
logger
.
add
(
self
.
log_file
)
logger
.
info
(
f
'init env success, log will be export to
{
self
.
log_file
}
'
)
self
.
sql_list
=
[
'select last_row(*) from test.stb;'
,
'select * from test.stb limit 100000;'
,
'select count(*) from test.stb interval (1d);'
,
'select avg(c3), max(c4), min(c5) from test.stb interval (1d);'
,
'select count(*) from test.stb where t1 = "shanghai" interval (1h);'
,
'select avg(c3), max(c4), min(c5) from test.stb where t1 = "shanghai" interval (1d);'
,
'select avg(c3), max(c4), min(c5) from test.stb where ts > "2021-01-01 00:00:00" and ts < "2021-01-31 00:00:00" interval (1d);'
'select last(*) from test.stb;'
]
# self.sql_list = ['select * from test.stb limit 100000;']
def
initLog
(
self
):
self
.
exec_local_cmd
(
f
'echo "" >
{
self
.
log_file
}
'
)
def
exec_local_cmd
(
self
,
shell_cmd
):
result
=
os
.
popen
(
shell_cmd
).
read
().
strip
()
return
result
def
genQueryJsonFile
(
self
,
query_sql
):
json_file
=
os
.
path
.
join
(
self
.
current_dir
,
f
'./query.json'
)
jdict
=
{
"filetype"
:
"query"
,
"cfgdir"
:
"/etc/taos"
,
"host"
:
self
.
hostname
,
"port"
:
self
.
taosc_port
,
"user"
:
"root"
,
"password"
:
"taosdata"
,
"confirm_parameter_prompt"
:
"no"
,
"databases"
:
self
.
database
,
"query_times"
:
self
.
query_times
,
"query_mode"
:
"restful"
,
"specified_table_query"
:
{
"concurrent"
:
self
.
concurrent
,
"sqls"
:
[
{
"sql"
:
query_sql
,
"result"
:
"./query_res0.txt"
}
]
}
}
with
open
(
json_file
,
"w"
,
encoding
=
"utf-8"
)
as
f_w
:
f_w
.
write
(
json
.
dumps
(
jdict
))
def
genInsertJsonFile
(
self
,
thread_count
,
table_count
,
row_count
,
batch_size
):
json_file
=
os
.
path
.
join
(
self
.
current_dir
,
f
'./insert.json'
)
jdict
=
{
"filetype"
:
"insert"
,
"cfgdir"
:
"/etc/taos"
,
"host"
:
self
.
hostname
,
"rest_host"
:
self
.
hostname
,
"port"
:
self
.
taosc_port
,
"rest_port"
:
self
.
http_port
,
"user"
:
"root"
,
"password"
:
"taosdata"
,
"thread_count"
:
thread_count
,
"thread_count_create_tbl"
:
1
,
"result_file"
:
self
.
log_file
,
"databases"
:
[{
"dbinfo"
:
{
"name"
:
self
.
database
,
"drop"
:
"yes"
},
"super_tables"
:
[{
"name"
:
"stb"
,
"childtable_count"
:
table_count
,
"childtable_prefix"
:
"stb_"
,
"batch_create_tbl_num"
:
1
,
"insert_mode"
:
"rand"
,
"insert_iface"
:
"rest"
,
"insert_rows"
:
row_count
,
"insert_interval"
:
0
,
"batch_rows"
:
batch_size
,
"max_sql_len"
:
1048576
,
"timestamp_step"
:
3000
,
"start_timestamp"
:
"2021-01-01 00:00:00.000"
,
"tags_file"
:
""
,
"partical_col_num"
:
0
,
"columns"
:
[{
"type"
:
"INT"
,
"count"
:
self
.
column_count
}],
"tags"
:
[{
"type"
:
"BINARY"
,
"len"
:
16
,
"count"
:
self
.
tag_count
}]
}]
}]
}
with
open
(
json_file
,
"w"
,
encoding
=
"utf-8"
)
as
f_w
:
f_w
.
write
(
json
.
dumps
(
jdict
))
def
runTest
(
self
):
self
.
initLog
()
self
.
genInsertJsonFile
(
32
,
100
,
100000
,
1
)
logger
.
info
(
'result of insert_perf with 32 threads and 1 batch_size:'
)
self
.
exec_local_cmd
(
f
'
{
self
.
perfMonitorBin
}
-f insert.json'
)
time
.
sleep
(
self
.
sleep_time
)
self
.
genInsertJsonFile
(
32
,
500
,
1000000
,
1000
)
logger
.
info
(
'result of insert_perf with 32 threads and 1000 batch_size:'
)
self
.
exec_local_cmd
(
f
'
{
self
.
perfMonitorBin
}
-f insert.json'
)
time
.
sleep
(
self
.
sleep_time
)
for
query_sql
in
self
.
sql_list
:
self
.
genQueryJsonFile
(
query_sql
)
self
.
exec_local_cmd
(
f
'
{
self
.
taosBenchmarkBin
}
-f query.json > tmp.log'
)
res
=
self
.
exec_local_cmd
(
'grep -Eo
\'
\<Spent.+s\>
\'
tmp.log |grep -v
\'
total queries
\'
|awk
\'
{sum+=$2}END{print "Average=",sum/NR,"s"}
\'
'
)
logger
.
info
(
query_sql
)
logger
.
info
(
res
)
time
.
sleep
(
self
.
sleep_time
)
if
__name__
==
'__main__'
:
runPerf
=
HttpPerfCompard
()
runPerf
.
runTest
()
tests/perftest-scripts/specifyColsComparison.py
0 → 100644
浏览文件 @
e7167dbf
from
loguru
import
logger
import
time
import
os
import
json
import
sys
from
fabric
import
Connection
# apt install -y sudo python3-pip
# pip3 install fabric loguru
class
specifyColsCompared
:
def
__init__
(
self
):
# remote server
self
.
remote_hostname
=
"vm85"
self
.
remote_sshport
=
"22"
self
.
remote_username
=
"root"
self
.
remote_password
=
"tbase125!"
# TDengine pkg path
self
.
autoDeploy
=
False
self
.
install_package
=
'/root/share/TDengine-server-2.4.0.0-Linux-amd64.tar.gz'
# test element
self
.
update_list
=
[
1
,
2
]
self
.
column_count_list
=
[
100
,
500
,
2000
]
# perfMonitor config
self
.
thread_count
=
10
self
.
taosc_port
=
6030
self
.
http_port
=
6041
self
.
database
=
"test"
self
.
table_count
=
10
self
.
tag_count
=
5
self
.
col_count
=
50000
self
.
batch_size
=
1
self
.
sleep_time
=
20
self
.
current_time
=
time
.
strftime
(
"%Y-%m-%d-%H:%M:%S"
,
time
.
localtime
(
time
.
time
()))
self
.
current_dir
=
os
.
path
.
dirname
(
os
.
path
.
realpath
(
__file__
))
self
.
log_file
=
os
.
path
.
join
(
self
.
current_dir
,
f
'./performance.log'
)
if
self
.
remote_username
==
"root"
:
self
.
remote_dir
=
"/root"
else
:
self
.
remote_dir
=
f
'/home/
{
self
.
remote_username
}
'
self
.
conn
=
Connection
(
self
.
remote_hostname
,
user
=
self
.
remote_username
,
port
=
self
.
remote_sshport
,
connect_timeout
=
120
,
connect_kwargs
=
{
"password"
:
self
.
remote_password
})
logger
.
add
(
self
.
log_file
)
logger
.
info
(
f
'init env success, log will be export to
{
self
.
log_file
}
'
)
def
initLog
(
self
):
# init log
self
.
exec_local_cmd
(
f
'echo "" >
{
self
.
log_file
}
'
)
def
exec_local_cmd
(
self
,
shell_cmd
):
# exec local cmd
try
:
result
=
os
.
popen
(
shell_cmd
).
read
().
strip
()
return
result
except
Exception
as
e
:
logger
.
error
(
f
"exec cmd:
{
shell_cmd
}
failed----
{
e
}
"
)
def
checkStatus
(
self
,
process
):
# check process status
try
:
process_count
=
self
.
conn
.
run
(
f
'ps -ef | grep -w
{
process
}
| grep -v grep | wc -l'
,
pty
=
False
,
warn
=
True
,
hide
=
False
).
stdout
if
int
(
process_count
.
strip
())
>
0
:
logger
.
info
(
f
'check
{
self
.
remote_hostname
}
{
process
}
existed'
)
return
True
else
:
logger
.
info
(
f
'check
{
self
.
remote_hostname
}
{
process
}
not exist'
)
return
False
except
Exception
as
e
:
logger
.
error
(
f
"check status failed----
{
e
}
, please check by manual"
)
def
deployPerfMonitor
(
self
):
# deploy perfMonitor
logger
.
info
(
'deploying perfMonitor'
)
if
os
.
path
.
exists
(
f
'
{
self
.
current_dir
}
/perfMonitor'
):
os
.
remove
(
f
'
{
self
.
current_dir
}
/perfMonitor'
)
self
.
exec_local_cmd
(
f
'wget -P
{
self
.
current_dir
}
http://39.105.163.10:9000/perfMonitor && chmod +x
{
self
.
current_dir
}
/perfMonitor'
)
package_name
=
self
.
install_package
.
split
(
'/'
)[
-
1
]
package_dir
=
'-'
.
join
(
package_name
.
split
(
"-"
,
3
)[
0
:
3
])
self
.
exec_local_cmd
(
f
'tar -xvf
{
self
.
install_package
}
&& cd
{
package_dir
}
&& echo -e "
\n
" | ./install.sh'
)
def
dropAndCreateDb
(
self
):
try
:
self
.
conn
.
run
(
f
'taos -s "drop database if exists
{
self
.
database
}
"'
)
self
.
conn
.
run
(
f
'taos -s "create database if not exists
{
self
.
database
}
"'
)
except
Exception
as
e
:
logger
.
error
(
f
"drop db failed----
{
e
}
, please check by manual"
)
def
uploadPkg
(
self
):
# upload TDengine pkg
try
:
logger
.
info
(
f
'uploading
{
self
.
install_package
}
to
{
self
.
remote_hostname
}
:
{
self
.
remote_dir
}
'
)
self
.
conn
.
put
(
self
.
install_package
,
self
.
remote_dir
)
except
Exception
as
e
:
logger
.
error
(
f
"pkg send failed----
{
e
}
, please check by manual"
)
def
deployTDengine
(
self
):
# deploy TDengine
try
:
package_name
=
self
.
install_package
.
split
(
'/'
)[
-
1
]
package_dir
=
'-'
.
join
(
package_name
.
split
(
"-"
,
3
)[
0
:
3
])
self
.
uploadPkg
()
self
.
conn
.
run
(
f
'sudo rmtaos'
,
pty
=
False
,
warn
=
True
,
hide
=
False
)
logger
.
info
(
'installing TDengine'
)
logger
.
info
(
self
.
conn
.
run
(
f
'cd
{
self
.
remote_dir
}
&& tar -xvf
{
self
.
remote_dir
}
/
{
package_name
}
&& cd
{
package_dir
}
&& echo -e "
\n
"|./install.sh'
,
pty
=
False
,
warn
=
True
,
hide
=
False
))
logger
.
info
(
'start TDengine'
)
logger
.
info
(
self
.
conn
.
run
(
'sudo systemctl start taosd'
,
pty
=
False
,
warn
=
True
,
hide
=
False
))
for
deploy_elm
in
[
'taosd'
,
'taosadapter'
]:
if
self
.
checkStatus
(
deploy_elm
):
logger
.
success
(
f
'
{
self
.
remote_hostname
}
:
{
deploy_elm
}
deploy success'
)
else
:
logger
.
error
(
f
'
{
self
.
remote_hostname
}
:
{
deploy_elm
}
deploy failed, please check by manual'
)
sys
.
exit
(
1
)
except
Exception
as
e
:
logger
.
error
(
f
"deploy TDengine failed----
{
e
}
, please check by manual"
)
def
genInsertJsonFile
(
self
,
thread_count
,
table_count
,
row_count
,
batch_size
,
column_count
,
partical_col_num
,
update
,
drop
=
"yes"
,
result_file
=
None
):
# gen json file
json_file
=
os
.
path
.
join
(
self
.
current_dir
,
f
'./insert.json'
)
if
result_file
==
None
:
result_file
=
self
.
log_file
else
:
result_file
=
self
.
log_file
.
replace
(
'performance.log'
,
'unused_performance.log'
)
jdict
=
{
"filetype"
:
"insert"
,
"cfgdir"
:
"/etc/taos"
,
"host"
:
self
.
remote_hostname
,
"rest_host"
:
self
.
remote_hostname
,
"port"
:
self
.
taosc_port
,
"rest_port"
:
self
.
http_port
,
"user"
:
"root"
,
"password"
:
"taosdata"
,
"thread_count"
:
thread_count
,
"thread_count_create_tbl"
:
1
,
"result_file"
:
result_file
,
"databases"
:
[{
"dbinfo"
:
{
"name"
:
self
.
database
,
"drop"
:
drop
,
"update"
:
update
},
"super_tables"
:
[{
"name"
:
"stb"
,
"childtable_count"
:
table_count
,
"childtable_prefix"
:
"stb_"
,
"batch_create_tbl_num"
:
1
,
"insert_mode"
:
"rand"
,
"insert_iface"
:
"rest"
,
"insert_rows"
:
row_count
,
"insert_interval"
:
0
,
"batch_rows"
:
batch_size
,
"max_sql_len"
:
1048576
,
"timestamp_step"
:
1000
,
"start_timestamp"
:
"2021-01-01 00:00:00.000"
,
"tags_file"
:
""
,
"partical_col_num"
:
partical_col_num
,
"columns"
:
[{
"type"
:
"INT"
,
"count"
:
column_count
}],
"tags"
:
[{
"type"
:
"BINARY"
,
"len"
:
16
,
"count"
:
self
.
tag_count
}]
}]
}]
}
with
open
(
json_file
,
"w"
,
encoding
=
"utf-8"
)
as
f_w
:
f_w
.
write
(
json
.
dumps
(
jdict
))
def
runTest
(
self
):
self
.
initLog
()
if
self
.
autoDeploy
:
self
.
deployTDengine
()
self
.
deployPerfMonitor
()
# blank insert
update
=
0
for
col_count
in
self
.
column_count_list
:
for
partical_col_num
in
[
int
(
col_count
*
0
),
int
(
col_count
*
0.1
),
int
(
col_count
*
0.3
)]:
logger
.
info
(
f
'update:
{
update
}
|| col_count:
{
col_count
}
|| partical_col_num:
{
partical_col_num
}
test'
)
self
.
genInsertJsonFile
(
self
.
thread_count
,
self
.
table_count
,
self
.
col_count
,
self
.
batch_size
,
col_count
,
partical_col_num
,
update
)
self
.
exec_local_cmd
(
f
'
{
self
.
current_dir
}
/perfMonitor -f insert.json'
)
time
.
sleep
(
self
.
sleep_time
)
# update = 1/2
for
update
in
self
.
update_list
:
for
col_count
in
self
.
column_count_list
:
for
partical_col_num
in
[
int
(
col_count
*
0.1
),
int
(
col_count
*
0.3
)]:
logger
.
info
(
f
'update:
{
update
}
|| col_count:
{
col_count
}
|| partical_col_num:
{
partical_col_num
}
test'
)
self
.
genInsertJsonFile
(
self
.
thread_count
,
self
.
table_count
,
self
.
col_count
,
100
,
col_count
,
int
(
col_count
*
0
),
update
,
drop
=
"yes"
,
result_file
=
"unused"
)
self
.
exec_local_cmd
(
f
'
{
self
.
current_dir
}
/perfMonitor -f insert.json'
)
time
.
sleep
(
self
.
sleep_time
)
self
.
genInsertJsonFile
(
self
.
thread_count
,
self
.
table_count
,
self
.
col_count
,
self
.
batch_size
,
col_count
,
partical_col_num
,
update
,
drop
=
"no"
)
self
.
exec_local_cmd
(
f
'
{
self
.
current_dir
}
/perfMonitor -f insert.json'
)
time
.
sleep
(
self
.
sleep_time
)
if
__name__
==
'__main__'
:
runPerf
=
specifyColsCompared
()
runPerf
.
runTest
()
tests/pytest/fulltest-query.sh
浏览文件 @
e7167dbf
...
@@ -143,7 +143,7 @@ python3 ./test.py -f stream/stream1.py
...
@@ -143,7 +143,7 @@ python3 ./test.py -f stream/stream1.py
python3 ./test.py
-f
stream/stream2.py
python3 ./test.py
-f
stream/stream2.py
#python3 ./test.py -f stream/parser.py
#python3 ./test.py -f stream/parser.py
python3 ./test.py
-f
stream/history.py
python3 ./test.py
-f
stream/history.py
python3 ./test.py
-f
stream/sys.py
#
python3 ./test.py -f stream/sys.py
python3 ./test.py
-f
stream/table_1.py
python3 ./test.py
-f
stream/table_1.py
python3 ./test.py
-f
stream/table_n.py
python3 ./test.py
-f
stream/table_n.py
python3 ./test.py
-f
stream/showStreamExecTimeisNull.py
python3 ./test.py
-f
stream/showStreamExecTimeisNull.py
...
...
tests/pytest/functions/function_derivative.py
浏览文件 @
e7167dbf
...
@@ -140,6 +140,9 @@ class TDTestCase:
...
@@ -140,6 +140,9 @@ class TDTestCase:
tdSql
.
error
(
"select derivative(col, 1s, 1) from tb2"
)
tdSql
.
error
(
"select derivative(col, 1s, 1) from tb2"
)
tdSql
.
error
(
"select derivative(col, 10s, 0) from tb2"
)
tdSql
.
error
(
"select derivative(col, 10s, 0) from tb2"
)
tdSql
.
error
(
"select derivative(col, 999ms, 0) from tb2"
)
tdSql
.
error
(
"select derivative(col, 999ms, 0) from tb2"
)
tdSql
.
error
(
"select derivative(col, now, 0) from tb2"
)
#TD-11983 now not allowed in second param
tdSql
.
error
(
"select derivative(col, now+3d-8h+6m, 0) from tb2"
)
#TD-11983 now not allowed in second param
tdSql
.
error
(
"select derivative(col, 3d-8h+now+6m, 0) from tb2"
)
#TD-11983 now not allowed in second param
tdSql
.
error
(
"select derivative(col, 10s, 1) from stb"
)
tdSql
.
error
(
"select derivative(col, 10s, 1) from stb"
)
tdSql
.
error
(
"select derivative(col, 10s, 1) from stb group by col"
)
tdSql
.
error
(
"select derivative(col, 10s, 1) from stb group by col"
)
...
@@ -150,6 +153,9 @@ class TDTestCase:
...
@@ -150,6 +153,9 @@ class TDTestCase:
tdSql
.
error
(
"select derivative(col, 10y, 0) from stb group by tbname"
)
#TD-10399, DB error: syntax error near '10y, 0) from stb group by tbname;'
tdSql
.
error
(
"select derivative(col, 10y, 0) from stb group by tbname"
)
#TD-10399, DB error: syntax error near '10y, 0) from stb group by tbname;'
tdSql
.
error
(
"select derivative(col, -106752d, 0) from stb group by tbname"
)
#TD-10398 overflow tips
tdSql
.
error
(
"select derivative(col, -106752d, 0) from stb group by tbname"
)
#TD-10398 overflow tips
tdSql
.
error
(
"select derivative(col, 106751991168d, 0) from stb group by tbname"
)
#TD-10398 overflow tips
tdSql
.
error
(
"select derivative(col, 106751991168d, 0) from stb group by tbname"
)
#TD-10398 overflow tips
tdSql
.
error
(
"select derivative(col, now, 1) from stb"
)
#TD-11983 now not allowed in second param
tdSql
.
error
(
"select derivative(col, now+3d-8h+6m, 1) from stb"
)
#TD-11983 now not allowed in second param
tdSql
.
error
(
"select derivative(col, 3d-8h+now+6m, 1) from stb"
)
#TD-11983 now not allowed in second param
def
run
(
self
):
def
run
(
self
):
tdSql
.
prepare
()
tdSql
.
prepare
()
...
...
tests/pytest/functions/function_elapsed_case.py
浏览文件 @
e7167dbf
...
@@ -345,7 +345,9 @@ class ElapsedCase:
...
@@ -345,7 +345,9 @@ class ElapsedCase:
tdSql
.
error
(
"select elapsed(*) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(*) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, '1s') from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, '1s') from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, i) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, i) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
#tdSql.error("select elapsed(ts, now) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'")
tdSql
.
error
(
"select elapsed(ts, now) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, now-7d+2h-3m+2s) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, 7d+2h+now+3m+2s) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, ts) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, ts) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts + 1) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts + 1) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, 1b) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
tdSql
.
error
(
"select elapsed(ts, 1b) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'"
)
...
...
tests/pytest/query/queryTbnameUpperLower.py
浏览文件 @
e7167dbf
...
@@ -26,6 +26,8 @@ class TDTestCase:
...
@@ -26,6 +26,8 @@ class TDTestCase:
'''
'''
tdCom
.
cleanTb
()
tdCom
.
cleanTb
()
table_name
=
tdCom
.
getLongName
(
8
,
"letters_mixed"
)
table_name
=
tdCom
.
getLongName
(
8
,
"letters_mixed"
)
while
table_name
.
islower
():
table_name
=
tdCom
.
getLongName
(
8
,
"letters_mixed"
)
table_name_sub
=
f
'
{
table_name
}
_sub'
table_name_sub
=
f
'
{
table_name
}
_sub'
tb_name_lower
=
table_name_sub
.
lower
()
tb_name_lower
=
table_name_sub
.
lower
()
tb_name_upper
=
table_name_sub
.
upper
()
tb_name_upper
=
table_name_sub
.
upper
()
...
...
tests/system-test/2-query/function_elapsed.py
0 → 100644
浏览文件 @
e7167dbf
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录