Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
9bf924aa
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
未验证
提交
9bf924aa
编写于
12月 20, 2021
作者:
M
Minglei Jin
提交者:
GitHub
12月 20, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #9106 from taosdata/hotfix/TS-904-D
[TS-904]<fix>:convert to lowercase when set tbname without `` by stmt
上级
df3b90a2
ffd1bab4
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
569 addition
and
21 deletion
+569
-21
deps/jemalloc
deps/jemalloc
+1
-1
src/client/src/tscPrepare.c
src/client/src/tscPrepare.c
+23
-14
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+7
-5
tests/examples/c/makefile
tests/examples/c/makefile
+0
-1
tests/examples/c/prepare.c
tests/examples/c/prepare.c
+538
-0
未找到文件。
jemalloc
@
9015e129
比较
ea6b3e97
...
9015e129
Subproject commit
ea6b3e973b477b8061e0076bb257dbd7f3faa756
Subproject commit
9015e129bd7de389afa4196495451669700904d0
src/client/src/tscPrepare.c
浏览文件 @
9bf924aa
...
...
@@ -1705,7 +1705,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
SSqlObj
*
pSql
=
pStmt
->
pSql
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
uint32_t
nameLen
=
(
u
int32_t
)
strlen
(
name
);
int32_t
nameLen
=
(
int32_t
)
strlen
(
name
);
if
(
name
==
NULL
||
nameLen
<=
0
)
{
tscError
(
"0x%"
PRIx64
" tbname is NULL"
,
pSql
->
self
);
...
...
@@ -1727,18 +1727,22 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
SStrToken
tname
=
{
0
};
tname
.
type
=
TK_STRING
;
tname
.
z
=
(
char
*
)
strdup
(
name
);
tname
.
n
=
(
uint32_t
)
strlen
(
name
);
if
(
!
tname
.
z
)
{
tscError
(
"0x%"
PRIx64
" out of memory"
,
pSql
->
self
);
STMT_RET
(
TSDB_CODE_TSC_OUT_OF_MEMORY
);
}
tname
.
n
=
(
uint32_t
)
strlen
(
tname
.
z
);
bool
dbIncluded
=
false
;
// Check if the table name available or not
if
(
tscValidateName
(
&
tname
,
true
,
&
dbIncluded
)
!=
TSDB_CODE_SUCCESS
)
{
tscError
(
"0x%"
PRIx64
" tbname[%s] is invalid"
,
pSql
->
self
,
name
);
tscError
(
"0x%"
PRIx64
" tbname[%s] is invalid"
,
pSql
->
self
,
tname
.
z
);
free
(
tname
.
z
);
STMT_RET
(
invalidOperationMsg
(
tscGetErrorMsgPayload
(
&
pStmt
->
pSql
->
cmd
),
"name is invalid"
));
}
uint64_t
*
uid
=
(
uint64_t
*
)
taosHashGet
(
pStmt
->
mtb
.
pTableHash
,
name
,
strlen
(
name
)
);
uint64_t
*
uid
=
(
uint64_t
*
)
taosHashGet
(
pStmt
->
mtb
.
pTableHash
,
tname
.
z
,
tname
.
n
);
if
(
uid
!=
NULL
)
{
pStmt
->
mtb
.
currentUid
=
*
uid
;
...
...
@@ -1752,6 +1756,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
if
((
*
t1
)
->
pData
==
NULL
)
{
code
=
tscCreateDataBlockData
(
*
t1
,
TSDB_PAYLOAD_SIZE
,
(
*
t1
)
->
pTableMeta
->
tableInfo
.
rowSize
,
sizeof
(
SSubmitBlk
));
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
free
(
tname
.
z
);
STMT_RET
(
code
);
}
}
...
...
@@ -1766,7 +1771,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
taosHashPut
(
pCmd
->
insertParam
.
pTableBlockHashList
,
(
void
*
)
&
pStmt
->
mtb
.
currentUid
,
sizeof
(
pStmt
->
mtb
.
currentUid
),
(
void
*
)
t1
,
POINTER_BYTES
);
tscDebug
(
"0x%"
PRIx64
" table:%s is already prepared, uid:%"
PRIu64
,
pSql
->
self
,
name
,
pStmt
->
mtb
.
currentUid
);
tscDebug
(
"0x%"
PRIx64
" table:%s is already prepared, uid:%"
PRIu64
,
pSql
->
self
,
tname
.
z
,
pStmt
->
mtb
.
currentUid
);
free
(
tname
.
z
);
STMT_RET
(
TSDB_CODE_SUCCESS
);
}
...
...
@@ -1779,18 +1784,19 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
SName
fullname
=
{
0
};
tscSetTableFullName
(
&
fullname
,
&
tname
,
pSql
,
dbIncluded
);
free
(
tname
.
z
);
memcpy
(
&
pTableMetaInfo
->
name
,
&
fullname
,
sizeof
(
fullname
));
code
=
tscGetTableMetaEx
(
pSql
,
pTableMetaInfo
,
false
,
true
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
free
(
tname
.
z
);
STMT_RET
(
code
);
}
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
if
(
strcmp
(
sTableName
,
pTableMeta
->
sTableName
))
{
free
(
tname
.
z
);
tscError
(
"0x%"
PRIx64
" only tables belongs to one stable is allowed"
,
pSql
->
self
);
STMT_RET
(
TSDB_CODE_TSC_APP_ERROR
);
}
...
...
@@ -1806,25 +1812,26 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
taosHashPut
(
pCmd
->
insertParam
.
pTableBlockHashList
,
(
void
*
)
&
pStmt
->
mtb
.
currentUid
,
sizeof
(
pStmt
->
mtb
.
currentUid
),
(
void
*
)
&
pBlock
,
POINTER_BYTES
);
taosHashPut
(
pStmt
->
mtb
.
pTableBlockHashList
,
(
void
*
)
&
pStmt
->
mtb
.
currentUid
,
sizeof
(
pStmt
->
mtb
.
currentUid
),
(
void
*
)
&
pBlock
,
POINTER_BYTES
);
taosHashPut
(
pStmt
->
mtb
.
pTableHash
,
name
,
strlen
(
name
),
(
char
*
)
&
pTableMeta
->
id
.
uid
,
sizeof
(
pTableMeta
->
id
.
uid
));
taosHashPut
(
pStmt
->
mtb
.
pTableHash
,
tname
.
z
,
tname
.
n
,
(
char
*
)
&
pTableMeta
->
id
.
uid
,
sizeof
(
pTableMeta
->
id
.
uid
));
tscDebug
(
"0x%"
PRIx64
" table:%s is prepared, uid:%"
PRIx64
,
pSql
->
self
,
name
,
pStmt
->
mtb
.
currentUid
);
tscDebug
(
"0x%"
PRIx64
" table:%s is prepared, uid:%"
PRIx64
,
pSql
->
self
,
tname
.
z
,
pStmt
->
mtb
.
currentUid
);
free
(
tname
.
z
);
STMT_RET
(
TSDB_CODE_SUCCESS
);
}
free
(
tname
.
z
);
if
(
pStmt
->
mtb
.
tagSet
)
{
pStmt
->
mtb
.
tbname
=
tscReplaceStrToken
(
&
pSql
->
sqlstr
,
&
pStmt
->
mtb
.
tbname
,
name
);
pStmt
->
mtb
.
tbname
=
tscReplaceStrToken
(
&
pSql
->
sqlstr
,
&
pStmt
->
mtb
.
tbname
,
tname
.
z
);
}
else
{
if
(
tags
==
NULL
)
{
tscError
(
"No tags set"
);
free
(
tname
.
z
);
STMT_RET
(
invalidOperationMsg
(
tscGetErrorMsgPayload
(
&
pStmt
->
pSql
->
cmd
),
"no tags set"
));
}
int32_t
ret
=
stmtGenInsertStatement
(
pSql
,
pStmt
,
name
,
tags
);
int32_t
ret
=
stmtGenInsertStatement
(
pSql
,
pStmt
,
tname
.
z
,
tags
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
free
(
tname
.
z
);
STMT_RET
(
ret
);
}
}
...
...
@@ -1859,6 +1866,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
code
=
tscGetDataBlockFromList
(
pCmd
->
insertParam
.
pTableBlockHashList
,
pTableMeta
->
id
.
uid
,
TSDB_PAYLOAD_SIZE
,
sizeof
(
SSubmitBlk
),
pTableMeta
->
tableInfo
.
rowSize
,
&
pTableMetaInfo
->
name
,
pTableMeta
,
&
pBlock
,
NULL
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
free
(
tname
.
z
);
STMT_RET
(
code
);
}
...
...
@@ -1869,15 +1877,16 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
pStmt
->
mtb
.
tbNum
++
;
taosHashPut
(
pStmt
->
mtb
.
pTableBlockHashList
,
(
void
*
)
&
pStmt
->
mtb
.
currentUid
,
sizeof
(
pStmt
->
mtb
.
currentUid
),
(
void
*
)
&
pBlock
,
POINTER_BYTES
);
taosHashPut
(
pStmt
->
mtb
.
pTableHash
,
name
,
strlen
(
name
),
(
char
*
)
&
pTableMeta
->
id
.
uid
,
sizeof
(
pTableMeta
->
id
.
uid
));
taosHashPut
(
pStmt
->
mtb
.
pTableHash
,
tname
.
z
,
tname
.
n
,
(
char
*
)
&
pTableMeta
->
id
.
uid
,
sizeof
(
pTableMeta
->
id
.
uid
));
if
(
pStmt
->
mtb
.
lastBlock
==
NULL
)
{
insertStmtGenLastBlock
(
&
pStmt
->
mtb
.
lastBlock
,
pBlock
);
}
tscDebug
(
"0x%"
PRIx64
" table:%s is prepared, uid:%"
PRIx64
,
pSql
->
self
,
name
,
pStmt
->
mtb
.
currentUid
);
tscDebug
(
"0x%"
PRIx64
" table:%s is prepared, uid:%"
PRIx64
,
pSql
->
self
,
tname
.
z
,
pStmt
->
mtb
.
currentUid
);
}
free
(
tname
.
z
);
STMT_RET
(
code
);
}
...
...
src/client/src/tscUtil.c
浏览文件 @
9bf924aa
...
...
@@ -132,8 +132,7 @@ int32_t converToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *le
return
TSDB_CODE_SUCCESS
;
}
static
void
tscStrToLower
(
char
*
str
,
int32_t
n
)
{
UNUSED_FUNC
static
void
tscStrToLower
(
char
*
str
,
int32_t
n
)
{
if
(
str
==
NULL
||
n
<=
0
)
{
return
;}
for
(
int32_t
i
=
0
;
i
<
n
;
i
++
)
{
if
(
str
[
i
]
>=
'A'
&&
str
[
i
]
<=
'Z'
)
{
...
...
@@ -3029,7 +3028,8 @@ int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded)
if
(
pToken
->
type
==
TK_STRING
)
{
tscDequoteAndTrimToken
(
pToken
);
tscStrToLower
(
pToken
->
z
,
pToken
->
n
);
// tscStrToLower(pToken->z, pToken->n);
strntolower
(
pToken
->
z
,
pToken
->
z
,
pToken
->
n
);
//pToken->n = (uint32_t)strtrim(pToken->z);
int
len
=
tGetToken
(
pToken
->
z
,
&
pToken
->
type
);
...
...
@@ -3083,7 +3083,8 @@ int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded)
if
(
validateQuoteToken
(
pToken
,
escapeEnabled
,
NULL
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
else
{
tscStrToLower
(
pToken
->
z
,
pToken
->
n
);
// tscStrToLower(pToken->z,pToken->n);
strntolower
(
pToken
->
z
,
pToken
->
z
,
pToken
->
n
);
firstPartQuote
=
true
;
}
}
...
...
@@ -3101,7 +3102,8 @@ int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded)
if
(
validateQuoteToken
(
pToken
,
escapeEnabled
,
NULL
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
else
{
tscStrToLower
(
pToken
->
z
,
pToken
->
n
);
// tscStrToLower(pToken->z,pToken->n);
strntolower
(
pToken
->
z
,
pToken
->
z
,
pToken
->
n
);
}
}
...
...
tests/examples/c/makefile
浏览文件 @
9bf924aa
...
...
@@ -25,7 +25,6 @@ clean:
rm
$(ROOT)
asyncdemo
rm
$(ROOT)
demo
rm
$(ROOT)
prepare
rm
$(ROOT)
batchprepare
rm
$(ROOT)
stream
rm
$(ROOT)
subscribe
rm
$(ROOT)
apitest
tests/examples/c/prepare.c
浏览文件 @
9bf924aa
...
...
@@ -857,6 +857,542 @@ void verify_prepare3(TAOS* taos) {
}
/**
* @brief Verify the upper/lower case of tableName for create(by setTableName)/query/show/describe/drop.
* https://jira.taosdata.com:18080/browse/TS-904
* https://jira.taosdata.com:18090/pages/viewpage.action?pageId=129140555
* @param taos
*/
void
verify_prepare4
(
TAOS
*
taos
)
{
printf
(
"Verify the upper/lower case of tableName for create(by setTableName)/query/show/describe/drop etc.
\n
"
);
TAOS_RES
*
result
=
taos_query
(
taos
,
"drop database if exists test;"
);
taos_free_result
(
result
);
usleep
(
100000
);
result
=
taos_query
(
taos
,
"create database test;"
);
int
code
=
taos_errno
(
result
);
if
(
code
!=
0
)
{
printf
(
"
\033
[31mfailed to create database, reason:%s
\033
[0m
\n
"
,
taos_errstr
(
result
));
taos_free_result
(
result
);
exit
(
EXIT_FAILURE
);
}
taos_free_result
(
result
);
usleep
(
100000
);
taos_select_db
(
taos
,
"test"
);
// create table
const
char
*
sql
=
"create stable st1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin "
"binary(40), blob nchar(10), u1 tinyint unsigned, u2 smallint unsigned, u4 int unsigned, u8 bigint unsigned) "
"tags "
"(b_tag bool, v1_tag tinyint, v2_tag smallint, v4_tag int, v8_tag bigint, f4_tag float, f8_tag double, bin_tag "
"binary(40), blob_tag nchar(10), u1_tag tinyint unsigned, u2_tag smallint unsigned, u4_tag int unsigned, u8_tag "
"bigint "
"unsigned)"
;
result
=
taos_query
(
taos
,
sql
);
code
=
taos_errno
(
result
);
if
(
code
!=
0
)
{
printf
(
"
\033
[31mfailed to create table, reason:%s
\033
[0m
\n
"
,
taos_errstr
(
result
));
taos_free_result
(
result
);
exit
(
EXIT_FAILURE
);
}
taos_free_result
(
result
);
TAOS_BIND
tags
[
13
];
struct
{
int8_t
b
;
int8_t
v1
;
int16_t
v2
;
int32_t
v4
;
int64_t
v8
;
float
f4
;
double
f8
;
char
bin
[
40
];
char
blob
[
80
];
uint8_t
u1
;
uint16_t
u2
;
uint32_t
u4
;
uint64_t
u8
;
}
id
=
{
0
};
id
.
b
=
(
int8_t
)
1
;
id
.
v1
=
(
int8_t
)
1
;
id
.
v2
=
(
int16_t
)
2
;
id
.
v4
=
(
int32_t
)
4
;
id
.
v8
=
(
int64_t
)
8
;
id
.
f4
=
(
float
)
40
;
id
.
f8
=
(
double
)
80
;
for
(
int
j
=
0
;
j
<
sizeof
(
id
.
bin
);
++
j
)
{
id
.
bin
[
j
]
=
(
char
)(
'1'
+
'0'
);
}
strcpy
(
id
.
blob
,
"一二三四五六七八九十"
);
id
.
u1
=
(
uint8_t
)
1
;
id
.
u2
=
(
uint16_t
)
2
;
id
.
u4
=
(
uint32_t
)
4
;
id
.
u8
=
(
uint64_t
)
8
;
tags
[
0
].
buffer_type
=
TSDB_DATA_TYPE_BOOL
;
tags
[
0
].
buffer_length
=
sizeof
(
id
.
b
);
tags
[
0
].
buffer
=
&
id
.
b
;
tags
[
0
].
length
=
&
tags
[
0
].
buffer_length
;
tags
[
0
].
is_null
=
NULL
;
tags
[
1
].
buffer_type
=
TSDB_DATA_TYPE_TINYINT
;
tags
[
1
].
buffer_length
=
sizeof
(
id
.
v1
);
tags
[
1
].
buffer
=
&
id
.
v1
;
tags
[
1
].
length
=
&
tags
[
1
].
buffer_length
;
tags
[
1
].
is_null
=
NULL
;
tags
[
2
].
buffer_type
=
TSDB_DATA_TYPE_SMALLINT
;
tags
[
2
].
buffer_length
=
sizeof
(
id
.
v2
);
tags
[
2
].
buffer
=
&
id
.
v2
;
tags
[
2
].
length
=
&
tags
[
2
].
buffer_length
;
tags
[
2
].
is_null
=
NULL
;
tags
[
3
].
buffer_type
=
TSDB_DATA_TYPE_INT
;
tags
[
3
].
buffer_length
=
sizeof
(
id
.
v4
);
tags
[
3
].
buffer
=
&
id
.
v4
;
tags
[
3
].
length
=
&
tags
[
3
].
buffer_length
;
tags
[
3
].
is_null
=
NULL
;
tags
[
4
].
buffer_type
=
TSDB_DATA_TYPE_BIGINT
;
tags
[
4
].
buffer_length
=
sizeof
(
id
.
v8
);
tags
[
4
].
buffer
=
&
id
.
v8
;
tags
[
4
].
length
=
&
tags
[
4
].
buffer_length
;
tags
[
4
].
is_null
=
NULL
;
tags
[
5
].
buffer_type
=
TSDB_DATA_TYPE_FLOAT
;
tags
[
5
].
buffer_length
=
sizeof
(
id
.
f4
);
tags
[
5
].
buffer
=
&
id
.
f4
;
tags
[
5
].
length
=
&
tags
[
5
].
buffer_length
;
tags
[
5
].
is_null
=
NULL
;
tags
[
6
].
buffer_type
=
TSDB_DATA_TYPE_DOUBLE
;
tags
[
6
].
buffer_length
=
sizeof
(
id
.
f8
);
tags
[
6
].
buffer
=
&
id
.
f8
;
tags
[
6
].
length
=
&
tags
[
6
].
buffer_length
;
tags
[
6
].
is_null
=
NULL
;
tags
[
7
].
buffer_type
=
TSDB_DATA_TYPE_BINARY
;
tags
[
7
].
buffer_length
=
sizeof
(
id
.
bin
);
tags
[
7
].
buffer
=
&
id
.
bin
;
tags
[
7
].
length
=
&
tags
[
7
].
buffer_length
;
tags
[
7
].
is_null
=
NULL
;
tags
[
8
].
buffer_type
=
TSDB_DATA_TYPE_NCHAR
;
tags
[
8
].
buffer_length
=
strlen
(
id
.
blob
);
tags
[
8
].
buffer
=
&
id
.
blob
;
tags
[
8
].
length
=
&
tags
[
8
].
buffer_length
;
tags
[
8
].
is_null
=
NULL
;
tags
[
9
].
buffer_type
=
TSDB_DATA_TYPE_UTINYINT
;
tags
[
9
].
buffer_length
=
sizeof
(
id
.
u1
);
tags
[
9
].
buffer
=
&
id
.
u1
;
tags
[
9
].
length
=
&
tags
[
9
].
buffer_length
;
tags
[
9
].
is_null
=
NULL
;
tags
[
10
].
buffer_type
=
TSDB_DATA_TYPE_USMALLINT
;
tags
[
10
].
buffer_length
=
sizeof
(
id
.
u2
);
tags
[
10
].
buffer
=
&
id
.
u2
;
tags
[
10
].
length
=
&
tags
[
10
].
buffer_length
;
tags
[
10
].
is_null
=
NULL
;
tags
[
11
].
buffer_type
=
TSDB_DATA_TYPE_UINT
;
tags
[
11
].
buffer_length
=
sizeof
(
id
.
u4
);
tags
[
11
].
buffer
=
&
id
.
u4
;
tags
[
11
].
length
=
&
tags
[
11
].
buffer_length
;
tags
[
11
].
is_null
=
NULL
;
tags
[
12
].
buffer_type
=
TSDB_DATA_TYPE_UBIGINT
;
tags
[
12
].
buffer_length
=
sizeof
(
id
.
u8
);
tags
[
12
].
buffer
=
&
id
.
u8
;
tags
[
12
].
length
=
&
tags
[
12
].
buffer_length
;
tags
[
12
].
is_null
=
NULL
;
// insert 10 records
struct
{
int64_t
ts
[
10
];
int8_t
b
[
10
];
int8_t
v1
[
10
];
int16_t
v2
[
10
];
int32_t
v4
[
10
];
int64_t
v8
[
10
];
float
f4
[
10
];
double
f8
[
10
];
char
bin
[
10
][
40
];
char
blob
[
10
][
80
];
uint8_t
u1
[
10
];
uint16_t
u2
[
10
];
uint32_t
u4
[
10
];
uint64_t
u8
[
10
];
}
v
;
int32_t
*
t8_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
t16_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
t32_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
t64_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
float_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
double_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
bin_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
blob_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
u8_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
u16_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
u32_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
int32_t
*
u64_len
=
malloc
(
sizeof
(
int32_t
)
*
10
);
TAOS_MULTI_BIND
params
[
14
];
char
is_null
[
10
]
=
{
0
};
params
[
0
].
buffer_type
=
TSDB_DATA_TYPE_TIMESTAMP
;
params
[
0
].
buffer_length
=
sizeof
(
v
.
ts
[
0
]);
params
[
0
].
buffer
=
v
.
ts
;
params
[
0
].
length
=
t64_len
;
params
[
0
].
is_null
=
is_null
;
params
[
0
].
num
=
10
;
params
[
1
].
buffer_type
=
TSDB_DATA_TYPE_BOOL
;
params
[
1
].
buffer_length
=
sizeof
(
v
.
b
[
0
]);
params
[
1
].
buffer
=
v
.
b
;
params
[
1
].
length
=
t8_len
;
params
[
1
].
is_null
=
is_null
;
params
[
1
].
num
=
10
;
params
[
2
].
buffer_type
=
TSDB_DATA_TYPE_TINYINT
;
params
[
2
].
buffer_length
=
sizeof
(
v
.
v1
[
0
]);
params
[
2
].
buffer
=
v
.
v1
;
params
[
2
].
length
=
t8_len
;
params
[
2
].
is_null
=
is_null
;
params
[
2
].
num
=
10
;
params
[
3
].
buffer_type
=
TSDB_DATA_TYPE_SMALLINT
;
params
[
3
].
buffer_length
=
sizeof
(
v
.
v2
[
0
]);
params
[
3
].
buffer
=
v
.
v2
;
params
[
3
].
length
=
t16_len
;
params
[
3
].
is_null
=
is_null
;
params
[
3
].
num
=
10
;
params
[
4
].
buffer_type
=
TSDB_DATA_TYPE_INT
;
params
[
4
].
buffer_length
=
sizeof
(
v
.
v4
[
0
]);
params
[
4
].
buffer
=
v
.
v4
;
params
[
4
].
length
=
t32_len
;
params
[
4
].
is_null
=
is_null
;
params
[
4
].
num
=
10
;
params
[
5
].
buffer_type
=
TSDB_DATA_TYPE_BIGINT
;
params
[
5
].
buffer_length
=
sizeof
(
v
.
v8
[
0
]);
params
[
5
].
buffer
=
v
.
v8
;
params
[
5
].
length
=
t64_len
;
params
[
5
].
is_null
=
is_null
;
params
[
5
].
num
=
10
;
params
[
6
].
buffer_type
=
TSDB_DATA_TYPE_FLOAT
;
params
[
6
].
buffer_length
=
sizeof
(
v
.
f4
[
0
]);
params
[
6
].
buffer
=
v
.
f4
;
params
[
6
].
length
=
float_len
;
params
[
6
].
is_null
=
is_null
;
params
[
6
].
num
=
10
;
params
[
7
].
buffer_type
=
TSDB_DATA_TYPE_DOUBLE
;
params
[
7
].
buffer_length
=
sizeof
(
v
.
f8
[
0
]);
params
[
7
].
buffer
=
v
.
f8
;
params
[
7
].
length
=
double_len
;
params
[
7
].
is_null
=
is_null
;
params
[
7
].
num
=
10
;
params
[
8
].
buffer_type
=
TSDB_DATA_TYPE_BINARY
;
params
[
8
].
buffer_length
=
sizeof
(
v
.
bin
[
0
]);
params
[
8
].
buffer
=
v
.
bin
;
params
[
8
].
length
=
bin_len
;
params
[
8
].
is_null
=
is_null
;
params
[
8
].
num
=
10
;
params
[
9
].
buffer_type
=
TSDB_DATA_TYPE_NCHAR
;
params
[
9
].
buffer_length
=
sizeof
(
v
.
blob
[
0
]);
params
[
9
].
buffer
=
v
.
blob
;
params
[
9
].
length
=
blob_len
;
params
[
9
].
is_null
=
is_null
;
params
[
9
].
num
=
10
;
params
[
10
].
buffer_type
=
TSDB_DATA_TYPE_UTINYINT
;
params
[
10
].
buffer_length
=
sizeof
(
v
.
u1
[
0
]);
params
[
10
].
buffer
=
v
.
u1
;
params
[
10
].
length
=
u8_len
;
params
[
10
].
is_null
=
is_null
;
params
[
10
].
num
=
10
;
params
[
11
].
buffer_type
=
TSDB_DATA_TYPE_USMALLINT
;
params
[
11
].
buffer_length
=
sizeof
(
v
.
u2
[
0
]);
params
[
11
].
buffer
=
v
.
u2
;
params
[
11
].
length
=
u16_len
;
params
[
11
].
is_null
=
is_null
;
params
[
11
].
num
=
10
;
params
[
12
].
buffer_type
=
TSDB_DATA_TYPE_UINT
;
params
[
12
].
buffer_length
=
sizeof
(
v
.
u4
[
0
]);
params
[
12
].
buffer
=
v
.
u4
;
params
[
12
].
length
=
u32_len
;
params
[
12
].
is_null
=
is_null
;
params
[
12
].
num
=
10
;
params
[
13
].
buffer_type
=
TSDB_DATA_TYPE_UBIGINT
;
params
[
13
].
buffer_length
=
sizeof
(
v
.
u8
[
0
]);
params
[
13
].
buffer
=
v
.
u8
;
params
[
13
].
length
=
u64_len
;
params
[
13
].
is_null
=
is_null
;
params
[
13
].
num
=
10
;
// verify table names for upper/lower case
#define VERIFY_CNT 5
typedef
struct
{
char
setTbName
[
20
];
char
showName
[
20
];
char
describeName
[
20
];
char
queryName
[
20
];
char
dropName
[
20
];
}
STbNames
;
/**
* @brief
* 0 - success expected
* NonZero - fail expected
*/
typedef
struct
{
int32_t
setTbName
;
int32_t
showName
;
int32_t
describeName
;
int32_t
queryName
;
int32_t
dropName
;
}
STbNamesResult
;
STbNames
tbName
[
VERIFY_CNT
]
=
{
0
};
STbNamesResult
tbNameResult
[
VERIFY_CNT
]
=
{
0
};
STbNames
*
pTbName
=
NULL
;
STbNamesResult
*
pTbNameResult
=
NULL
;
pTbName
=
&
tbName
[
0
];
pTbNameResult
=
&
tbNameResult
[
0
];
strcpy
(
pTbName
->
setTbName
,
"Mn1"
);
strcpy
(
pTbName
->
showName
,
"mn1"
);
strcpy
(
pTbName
->
describeName
,
"mn1"
);
strcpy
(
pTbName
->
queryName
,
"mn1"
);
strcpy
(
pTbName
->
dropName
,
"mn1"
);
pTbName
=
&
tbName
[
1
];
pTbNameResult
=
&
tbNameResult
[
1
];
strcpy
(
pTbName
->
setTbName
,
"'Mn1'"
);
strcpy
(
pTbName
->
showName
,
"'mn1'"
);
strcpy
(
pTbName
->
describeName
,
"'mn1'"
);
strcpy
(
pTbName
->
queryName
,
"'mn1'"
);
strcpy
(
pTbName
->
dropName
,
"'mn1'"
);
pTbName
=
&
tbName
[
2
];
pTbNameResult
=
&
tbNameResult
[
2
];
strcpy
(
pTbName
->
setTbName
,
"
\"
Mn1
\"
"
);
strcpy
(
pTbName
->
showName
,
"
\"
mn1
\"
"
);
strcpy
(
pTbName
->
describeName
,
"
\"
mn1
\"
"
);
strcpy
(
pTbName
->
queryName
,
"
\"
mn1
\"
"
);
strcpy
(
pTbName
->
dropName
,
"
\"
mn1
\"
"
);
pTbName
=
&
tbName
[
3
];
pTbNameResult
=
&
tbNameResult
[
3
];
strcpy
(
pTbName
->
setTbName
,
"
\"
Mn1
\"
"
);
strcpy
(
pTbName
->
showName
,
"'mn1'"
);
strcpy
(
pTbName
->
describeName
,
"'mn1'"
);
strcpy
(
pTbName
->
queryName
,
"mn1"
);
strcpy
(
pTbName
->
dropName
,
"
\"
mn1
\"
"
);
pTbName
=
&
tbName
[
4
];
pTbNameResult
=
&
tbNameResult
[
4
];
strcpy
(
pTbName
->
setTbName
,
"`Mn1`"
);
strcpy
(
pTbName
->
showName
,
"Mn1"
);
// TODO support uniform of ``
strcpy
(
pTbName
->
describeName
,
"`Mn1`"
);
strcpy
(
pTbName
->
queryName
,
"`Mn1`"
);
strcpy
(
pTbName
->
dropName
,
"`Mn1`"
);
TAOS_STMT
*
stmt
=
NULL
;
for
(
int
n
=
0
;
n
<
VERIFY_CNT
;
++
n
)
{
printf
(
"
\033
[31m[%d] ===================================
\033
[0m
\n
"
,
n
);
pTbName
=
&
tbName
[
n
];
pTbNameResult
=
&
tbNameResult
[
n
];
char
tmpStr
[
256
]
=
{
0
};
// set table name
stmt
=
taos_stmt_init
(
taos
);
if
(
!
stmt
)
{
printf
(
"
\033
[31m[%d] failed to execute taos_stmt_init. error:%s
\033
[0m
\n
"
,
n
);
exit
(
EXIT_FAILURE
);
}
sql
=
"insert into ? using st1 tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
;
code
=
taos_stmt_prepare
(
stmt
,
sql
,
0
);
if
(
code
!=
0
)
{
printf
(
"
\033
[31mfailed to execute taos_stmt_prepare. error:%s
\033
[0m
\n
"
,
taos_stmt_errstr
(
stmt
));
taos_stmt_close
(
stmt
);
exit
(
EXIT_FAILURE
);
}
printf
(
"[%d] taos_stmt_set_tbname_tags, tbname=%s
\n
"
,
n
,
pTbName
->
setTbName
);
code
=
taos_stmt_set_tbname_tags
(
stmt
,
pTbName
->
setTbName
,
tags
);
if
((
!
pTbNameResult
->
setTbName
&&
(
0
!=
code
))
||
(
pTbNameResult
->
setTbName
&&
(
0
==
code
)))
{
printf
(
"
\033
[31m[%d] failed to execute taos_stmt_set_tbname_tags. error:%s
\033
[0m
\n
"
,
n
,
taos_stmt_errstr
(
stmt
));
taos_stmt_close
(
stmt
);
exit
(
EXIT_FAILURE
);
}
if
(
code
==
0
)
{
int64_t
ts
=
1591060628000
+
1000
*
n
;
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
v
.
ts
[
i
]
=
ts
++
;
is_null
[
i
]
=
0
;
v
.
b
[
i
]
=
(
int8_t
)
i
%
2
;
v
.
v1
[
i
]
=
(
int8_t
)
i
;
v
.
v2
[
i
]
=
(
int16_t
)(
i
*
2
);
v
.
v4
[
i
]
=
(
int32_t
)(
i
*
4
);
v
.
v8
[
i
]
=
(
int64_t
)(
i
*
8
);
v
.
f4
[
i
]
=
(
float
)(
i
*
40
);
v
.
f8
[
i
]
=
(
double
)(
i
*
80
);
for
(
int
j
=
0
;
j
<
sizeof
(
v
.
bin
[
0
]);
++
j
)
{
v
.
bin
[
i
][
j
]
=
(
char
)(
i
+
'0'
);
}
strcpy
(
v
.
blob
[
i
],
"一二三四五六七八九十"
);
v
.
u1
[
i
]
=
(
uint8_t
)
i
;
v
.
u2
[
i
]
=
(
uint16_t
)(
i
*
2
);
v
.
u4
[
i
]
=
(
uint32_t
)(
i
*
4
);
v
.
u8
[
i
]
=
(
uint64_t
)(
i
*
8
);
t8_len
[
i
]
=
sizeof
(
int8_t
);
t16_len
[
i
]
=
sizeof
(
int16_t
);
t32_len
[
i
]
=
sizeof
(
int32_t
);
t64_len
[
i
]
=
sizeof
(
int64_t
);
float_len
[
i
]
=
sizeof
(
float
);
double_len
[
i
]
=
sizeof
(
double
);
bin_len
[
i
]
=
sizeof
(
v
.
bin
[
0
]);
blob_len
[
i
]
=
(
int32_t
)
strlen
(
v
.
blob
[
i
]);
u8_len
[
i
]
=
sizeof
(
uint8_t
);
u16_len
[
i
]
=
sizeof
(
uint16_t
);
u32_len
[
i
]
=
sizeof
(
uint32_t
);
u64_len
[
i
]
=
sizeof
(
uint64_t
);
}
taos_stmt_bind_param_batch
(
stmt
,
params
);
taos_stmt_add_batch
(
stmt
);
if
(
taos_stmt_execute
(
stmt
)
!=
0
)
{
printf
(
"
\033
[31m[%d] failed to execute insert statement.error:%s
\033
[0m
\n
"
,
n
,
taos_stmt_errstr
(
stmt
));
taos_stmt_close
(
stmt
);
exit
(
EXIT_FAILURE
);
}
}
taos_stmt_close
(
stmt
);
// show the table
printf
(
"[%d] show tables, tbName = %s
\n
"
,
n
,
pTbName
->
showName
);
stmt
=
taos_stmt_init
(
taos
);
sprintf
(
tmpStr
,
"show tables like %s"
,
pTbName
->
showName
);
taos_stmt_prepare
(
stmt
,
tmpStr
,
0
);
code
=
taos_stmt_execute
(
stmt
);
if
((
!
pTbNameResult
->
showName
&&
(
0
!=
code
))
||
(
pTbNameResult
->
showName
&&
(
0
==
code
)))
{
printf
(
"
\033
[31m[%d] failed to execute show tables like. error:%s
\033
[0m
\n
"
,
n
,
taos_stmt_errstr
(
stmt
));
taos_stmt_close
(
stmt
);
exit
(
EXIT_FAILURE
);
}
taos_stmt_close
(
stmt
);
// describe the table
printf
(
"[%d] describe tables, tbName = %s
\n
"
,
n
,
pTbName
->
describeName
);
stmt
=
taos_stmt_init
(
taos
);
sprintf
(
tmpStr
,
"describe %s"
,
pTbName
->
describeName
);
taos_stmt_prepare
(
stmt
,
tmpStr
,
0
);
code
=
taos_stmt_execute
(
stmt
);
if
((
!
pTbNameResult
->
describeName
&&
(
0
!=
code
))
||
(
pTbNameResult
->
describeName
&&
(
0
==
code
)))
{
printf
(
"
\033
[31m[%d] failed to execute describe tables. error:%s
\033
[0m
\n
"
,
n
,
taos_stmt_errstr
(
stmt
));
taos_stmt_close
(
stmt
);
exit
(
EXIT_FAILURE
);
}
taos_stmt_close
(
stmt
);
// query the records
printf
(
"[%d] select statement, tbName = %s
\n
"
,
n
,
pTbName
->
queryName
);
stmt
=
taos_stmt_init
(
taos
);
sprintf
(
tmpStr
,
"SELECT * FROM %s"
,
pTbName
->
queryName
);
taos_stmt_prepare
(
stmt
,
tmpStr
,
0
);
TAOS_BIND
qparams
[
2
];
int8_t
v1
=
5
;
int16_t
v2
=
15
;
qparams
[
0
].
buffer_type
=
TSDB_DATA_TYPE_TINYINT
;
qparams
[
0
].
buffer_length
=
sizeof
(
v1
);
qparams
[
0
].
buffer
=
&
v1
;
qparams
[
0
].
length
=
&
qparams
[
0
].
buffer_length
;
qparams
[
0
].
is_null
=
NULL
;
qparams
[
1
].
buffer_type
=
TSDB_DATA_TYPE_SMALLINT
;
qparams
[
1
].
buffer_length
=
sizeof
(
v2
);
qparams
[
1
].
buffer
=
&
v2
;
qparams
[
1
].
length
=
&
qparams
[
1
].
buffer_length
;
qparams
[
1
].
is_null
=
NULL
;
taos_stmt_bind_param
(
stmt
,
qparams
);
code
=
taos_stmt_execute
(
stmt
);
if
((
!
pTbNameResult
->
queryName
&&
(
0
!=
code
))
||
(
pTbNameResult
->
queryName
&&
(
0
==
code
)))
{
printf
(
"
\033
[31m[%d] failed to execute select statement.error:%s
\033
[0m
\n
"
,
n
,
taos_stmt_errstr
(
stmt
));
taos_stmt_close
(
stmt
);
exit
(
EXIT_FAILURE
);
}
result
=
taos_stmt_use_result
(
stmt
);
TAOS_ROW
row
;
int
rows
=
0
;
int
num_fields
=
taos_num_fields
(
result
);
TAOS_FIELD
*
fields
=
taos_fetch_fields
(
result
);
// fetch the records row by row
while
((
row
=
taos_fetch_row
(
result
)))
{
char
temp
[
256
]
=
{
0
};
rows
++
;
taos_print_row
(
temp
,
row
,
fields
,
num_fields
);
printf
(
"[%d] row = %s
\n
"
,
n
,
temp
);
}
taos_free_result
(
result
);
taos_stmt_close
(
stmt
);
// drop table
printf
(
"[%d] drop table, tbName = %s
\n
"
,
n
,
pTbName
->
dropName
);
stmt
=
taos_stmt_init
(
taos
);
sprintf
(
tmpStr
,
"drop table %s"
,
pTbName
->
dropName
);
taos_stmt_prepare
(
stmt
,
tmpStr
,
0
);
code
=
taos_stmt_execute
(
stmt
);
if
((
!
pTbNameResult
->
dropName
&&
(
0
!=
code
))
||
(
pTbNameResult
->
dropName
&&
(
0
==
code
)))
{
printf
(
"
\033
[31m[%d] failed to drop table. error:%s
\033
[0m
\n
"
,
n
,
taos_stmt_errstr
(
stmt
));
taos_stmt_close
(
stmt
);
exit
(
EXIT_FAILURE
);
}
taos_stmt_close
(
stmt
);
}
free
(
t8_len
);
free
(
t16_len
);
free
(
t32_len
);
free
(
t64_len
);
free
(
float_len
);
free
(
double_len
);
free
(
bin_len
);
free
(
blob_len
);
free
(
u8_len
);
free
(
u16_len
);
free
(
u32_len
);
free
(
u64_len
);
}
int
main
(
int
argc
,
char
*
argv
[])
{
const
char
*
host
=
"127.0.0.1"
;
const
char
*
user
=
"root"
;
...
...
@@ -880,5 +1416,7 @@ int main(int argc, char* argv[]) {
printf
(
"************ verify prepare3 *************
\n
"
);
verify_prepare3
(
taos
);
printf
(
"************ verify prepare4 *************
\n
"
);
verify_prepare4
(
taos
);
printf
(
"************ verify end *************
\n
"
);
exit
(
EXIT_SUCCESS
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录