Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
c27476bd
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看板
提交
c27476bd
编写于
7月 06, 2022
作者:
C
cpwu
浏览文件
操作
浏览文件
下载
差异文件
Merge branch '3.0' into cpwu/3.0
上级
fa083897
a6f08c33
变更
29
展开全部
隐藏空白更改
内联
并排
Showing
29 changed file
with
1720 addition
and
612 deletion
+1720
-612
source/libs/executor/inc/executorimpl.h
source/libs/executor/inc/executorimpl.h
+5
-1
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+15
-6
source/libs/executor/src/sortoperator.c
source/libs/executor/src/sortoperator.c
+18
-5
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+9
-8
source/libs/parser/src/parUtil.c
source/libs/parser/src/parUtil.c
+0
-2
source/libs/scheduler/src/schStatus.c
source/libs/scheduler/src/schStatus.c
+1
-1
source/libs/scheduler/src/scheduler.c
source/libs/scheduler/src/scheduler.c
+2
-4
source/os/src/osDir.c
source/os/src/osDir.c
+8
-0
source/os/src/osSocket.c
source/os/src/osSocket.c
+3
-3
source/os/src/osSysinfo.c
source/os/src/osSysinfo.c
+3
-1
tests/system-test/1-insert/test_stmt_set_tbname_tag.py
tests/system-test/1-insert/test_stmt_set_tbname_tag.py
+7
-7
tests/system-test/2-query/Timediff.py
tests/system-test/2-query/Timediff.py
+4
-4
tests/system-test/2-query/and_or_for_byte.py
tests/system-test/2-query/and_or_for_byte.py
+545
-0
tests/system-test/2-query/csum.py
tests/system-test/2-query/csum.py
+54
-0
tests/system-test/2-query/elapsed.py
tests/system-test/2-query/elapsed.py
+457
-458
tests/system-test/2-query/function_diff.py
tests/system-test/2-query/function_diff.py
+56
-1
tests/system-test/2-query/mavg.py
tests/system-test/2-query/mavg.py
+54
-0
tests/system-test/2-query/queryQnode.py
tests/system-test/2-query/queryQnode.py
+3
-0
tests/system-test/2-query/sample.py
tests/system-test/2-query/sample.py
+30
-0
tests/system-test/2-query/statecount.py
tests/system-test/2-query/statecount.py
+57
-0
tests/system-test/2-query/tail.py
tests/system-test/2-query/tail.py
+52
-3
tests/system-test/2-query/timetruncate.py
tests/system-test/2-query/timetruncate.py
+0
-1
tests/system-test/2-query/unique.py
tests/system-test/2-query/unique.py
+52
-2
tests/system-test/fulltest.sh
tests/system-test/fulltest.sh
+178
-2
tools/shell/src/shellArguments.c
tools/shell/src/shellArguments.c
+41
-41
tools/shell/src/shellCommand.c
tools/shell/src/shellCommand.c
+4
-4
tools/shell/src/shellEngine.c
tools/shell/src/shellEngine.c
+43
-39
tools/shell/src/shellNettest.c
tools/shell/src/shellNettest.c
+9
-9
tools/shell/src/shellUtil.c
tools/shell/src/shellUtil.c
+10
-10
未找到文件。
source/libs/executor/inc/executorimpl.h
浏览文件 @
c27476bd
...
...
@@ -479,6 +479,8 @@ typedef struct SAggOperatorInfo {
uint64_t
groupId
;
SGroupResInfo
groupResInfo
;
SExprSupp
scalarExprSup
;
SNode
*
pCondition
;
}
SAggOperatorInfo
;
typedef
struct
SProjectOperatorInfo
{
...
...
@@ -680,6 +682,8 @@ typedef struct SSortOperatorInfo {
int64_t
startTs
;
// sort start time
uint64_t
sortElapsed
;
// sort elapsed time, time to flush to disk not included.
SNode
*
pCondition
;
}
SSortOperatorInfo
;
typedef
struct
STagFilterOperatorInfo
{
...
...
@@ -758,7 +762,7 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
STableListInfo
*
pTableListInfo
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createSysTableScanOperatorInfo
(
void
*
readHandle
,
SSystemTableScanPhysiNode
*
pScanPhyNode
,
const
char
*
pUser
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createAggregateOperatorInfo
(
SOperatorInfo
*
downstream
,
SExprInfo
*
pExprInfo
,
int32_t
numOfCols
,
SSDataBlock
*
pResultBlock
,
SExprInfo
*
pScalarExprInfo
,
SOperatorInfo
*
createAggregateOperatorInfo
(
SOperatorInfo
*
downstream
,
SExprInfo
*
pExprInfo
,
int32_t
numOfCols
,
SSDataBlock
*
pResultBlock
,
S
Node
*
pCondition
,
S
ExprInfo
*
pScalarExprInfo
,
int32_t
numOfScalarExpr
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createIndefinitOutputOperatorInfo
(
SOperatorInfo
*
downstream
,
SPhysiNode
*
pNode
,
SExecTaskInfo
*
pTaskInfo
);
...
...
source/libs/executor/src/executorimpl.c
浏览文件 @
c27476bd
...
...
@@ -3012,11 +3012,19 @@ static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) {
}
blockDataEnsureCapacity
(
pInfo
->
pRes
,
pOperator
->
resultInfo
.
capacity
);
doBuildResultDatablock
(
pOperator
,
pInfo
,
&
pAggInfo
->
groupResInfo
,
pAggInfo
->
aggSup
.
pResultBuf
);
if
(
pInfo
->
pRes
->
info
.
rows
==
0
||
!
hasDataInGroupInfo
(
&
pAggInfo
->
groupResInfo
))
{
doSetOperatorCompleted
(
pOperator
);
}
while
(
1
)
{
doBuildResultDatablock
(
pOperator
,
pInfo
,
&
pAggInfo
->
groupResInfo
,
pAggInfo
->
aggSup
.
pResultBuf
);
doFilter
(
pAggInfo
->
pCondition
,
pInfo
->
pRes
);
if
(
!
hasDataInGroupInfo
(
&
pAggInfo
->
groupResInfo
))
{
doSetOperatorCompleted
(
pOperator
);
break
;
}
if
(
pInfo
->
pRes
->
info
.
rows
>
0
)
{
break
;
}
}
size_t
rows
=
blockDataGetNumOfRows
(
pInfo
->
pRes
);
pOperator
->
resultInfo
.
totalRows
+=
rows
;
...
...
@@ -3557,7 +3565,7 @@ int32_t initExprSupp(SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfExpr) {
}
SOperatorInfo
*
createAggregateOperatorInfo
(
SOperatorInfo
*
downstream
,
SExprInfo
*
pExprInfo
,
int32_t
numOfCols
,
SSDataBlock
*
pResultBlock
,
SExprInfo
*
pScalarExprInfo
,
SSDataBlock
*
pResultBlock
,
S
Node
*
pCondition
,
S
ExprInfo
*
pScalarExprInfo
,
int32_t
numOfScalarExpr
,
SExecTaskInfo
*
pTaskInfo
)
{
SAggOperatorInfo
*
pInfo
=
taosMemoryCalloc
(
1
,
sizeof
(
SAggOperatorInfo
));
SOperatorInfo
*
pOperator
=
taosMemoryCalloc
(
1
,
sizeof
(
SOperatorInfo
));
...
...
@@ -3581,6 +3589,7 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo*
}
pInfo
->
groupId
=
INT32_MIN
;
pInfo
->
pCondition
=
pCondition
;
pOperator
->
name
=
"TableAggregate"
;
pOperator
->
operatorType
=
QUERY_NODE_PHYSICAL_PLAN_HASH_AGG
;
pOperator
->
blocking
=
true
;
...
...
@@ -4328,7 +4337,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
pScalarExprInfo
,
numOfScalarExpr
,
pTaskInfo
);
}
else
{
pOptr
=
createAggregateOperatorInfo
(
ops
[
0
],
pExprInfo
,
num
,
pResBlock
,
pScalarExprInfo
,
numOfScalarExpr
,
pTaskInfo
);
createAggregateOperatorInfo
(
ops
[
0
],
pExprInfo
,
num
,
pResBlock
,
p
AggNode
->
node
.
pConditions
,
p
ScalarExprInfo
,
numOfScalarExpr
,
pTaskInfo
);
}
}
else
if
(
QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL
==
type
||
QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL
==
type
)
{
SIntervalPhysiNode
*
pIntervalPhyNode
=
(
SIntervalPhysiNode
*
)
pPhyNode
;
...
...
source/libs/executor/src/sortoperator.c
浏览文件 @
c27476bd
...
...
@@ -46,7 +46,7 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode*
initResultSizeInfo
(
pOperator
,
1024
);
pInfo
->
pSortInfo
=
createSortInfo
(
pSortPhyNode
->
pSortKeys
);
;
pInfo
->
pCondition
=
pSortPhyNode
->
node
.
pConditions
;
pInfo
->
pColMatchInfo
=
pColMatchColInfo
;
pOperator
->
name
=
"SortOperator"
;
pOperator
->
operatorType
=
QUERY_NODE_PHYSICAL_PLAN_SORT
;
...
...
@@ -205,14 +205,27 @@ SSDataBlock* doSort(SOperatorInfo* pOperator) {
longjmp
(
pTaskInfo
->
env
,
code
);
}
SSDataBlock
*
pBlock
=
getSortedBlockData
(
pInfo
->
pSortHandle
,
pInfo
->
binfo
.
pRes
,
pOperator
->
resultInfo
.
capacity
,
pInfo
->
pColMatchInfo
,
pInfo
);
SSDataBlock
*
pBlock
=
NULL
;
while
(
1
)
{
pBlock
=
getSortedBlockData
(
pInfo
->
pSortHandle
,
pInfo
->
binfo
.
pRes
,
pOperator
->
resultInfo
.
capacity
,
pInfo
->
pColMatchInfo
,
pInfo
);
if
(
pBlock
!=
NULL
)
{
doFilter
(
pInfo
->
pCondition
,
pBlock
);
}
if
(
pBlock
==
NULL
)
{
doSetOperatorCompleted
(
pOperator
);
break
;
}
if
(
blockDataGetNumOfRows
(
pBlock
)
>
0
)
{
break
;
}
}
if
(
pBlock
!=
NULL
)
{
pOperator
->
resultInfo
.
totalRows
+=
pBlock
->
info
.
rows
;
}
else
{
doSetOperatorCompleted
(
pOperator
);
}
return
pBlock
;
}
...
...
source/libs/function/src/builtins.c
浏览文件 @
c27476bd
...
...
@@ -1615,26 +1615,27 @@ static int32_t translateSubstr(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
}
SExprNode
*
pPara0
=
(
SExprNode
*
)
nodesListGetNode
(
pFunc
->
pParameterList
,
0
);
SExprNode
*
p1
=
(
SExprNode
*
)
nodesListGetNode
(
pFunc
->
pParameterList
,
1
);
SExprNode
*
p
Para
1
=
(
SExprNode
*
)
nodesListGetNode
(
pFunc
->
pParameterList
,
1
);
uint8_t
para1Type
=
p1
->
resType
.
type
;
if
(
!
IS_VAR_DATA_TYPE
(
pPara0
->
resType
.
type
)
||
!
IS_INTEGER_TYPE
(
para1Type
))
{
uint8_t
para0Type
=
pPara0
->
resType
.
type
;
uint8_t
para1Type
=
pPara1
->
resType
.
type
;
if
(
!
IS_VAR_DATA_TYPE
(
para0Type
)
||
!
IS_INTEGER_TYPE
(
para1Type
))
{
return
invaildFuncParaTypeErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
}
if
(((
SValueNode
*
)
p
1
)
->
datum
.
i
<
1
)
{
if
(((
SValueNode
*
)
p
Para1
)
->
datum
.
i
==
0
)
{
return
invaildFuncParaValueErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
}
if
(
3
==
numOfParams
)
{
SExprNode
*
p2
=
(
SExprNode
*
)
nodesListGetNode
(
pFunc
->
pParameterList
,
2
);
uint8_t
para2Type
=
p2
->
resType
.
type
;
SExprNode
*
p
Para
2
=
(
SExprNode
*
)
nodesListGetNode
(
pFunc
->
pParameterList
,
2
);
uint8_t
para2Type
=
p
Para
2
->
resType
.
type
;
if
(
!
IS_INTEGER_TYPE
(
para2Type
))
{
return
invaildFuncParaTypeErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
}
int64_t
v
=
((
SValueNode
*
)
p
1
)
->
datum
.
i
;
if
(
v
<
0
||
v
>
INT16_MAX
)
{
int64_t
v
=
((
SValueNode
*
)
p
Para2
)
->
datum
.
i
;
if
(
v
<
0
)
{
return
invaildFuncParaValueErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
}
}
...
...
source/libs/parser/src/parUtil.c
浏览文件 @
c27476bd
...
...
@@ -376,8 +376,6 @@ int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag** ppTag, voi
char
*
jsonKey
=
item
->
string
;
if
(
!
isValidateTag
(
jsonKey
))
{
fprintf
(
stdout
,
"%s(%d) %s %08"
PRId64
"
\n
"
,
__FILE__
,
__LINE__
,
__func__
,
taosGetSelfPthreadId
());
fflush
(
stdout
);
retCode
=
buildSyntaxErrMsg
(
pMsgBuf
,
"json key not validate"
,
jsonKey
);
goto
end
;
}
...
...
source/libs/scheduler/src/schStatus.c
浏览文件 @
c27476bd
...
...
@@ -40,7 +40,7 @@ int32_t schSwitchJobStatus(SSchJob* pJob, int32_t status, void* param) {
SCH_RET
(
schProcessOnJobFailure
(
pJob
,
(
param
?
*
(
int32_t
*
)
param
:
0
)));
break
;
case
JOB_TASK_STATUS_DROP
:
SCH_ERR_JRET
(
schProcessOnJobDropped
(
pJob
,
*
(
int32_t
*
)
param
)
);
schProcessOnJobDropped
(
pJob
,
*
(
int32_t
*
)
param
);
if
(
taosRemoveRef
(
schMgmt
.
jobRef
,
pJob
->
refId
))
{
SCH_JOB_ELOG
(
"remove job from job list failed, refId:0x%"
PRIx64
,
pJob
->
refId
);
...
...
source/libs/scheduler/src/scheduler.c
浏览文件 @
c27476bd
...
...
@@ -144,11 +144,9 @@ void schedulerFreeJob(int64_t* jobId, int32_t errCode) {
return
;
}
if
(
schJobDone
(
pJob
))
{
return
;
}
schSwitchJobStatus
(
pJob
,
JOB_TASK_STATUS_DROP
,
(
void
*
)
&
errCode
);
schReleaseJob
(
*
jobId
);
*
jobId
=
0
;
}
...
...
source/os/src/osDir.c
浏览文件 @
c27476bd
...
...
@@ -260,6 +260,14 @@ char *taosDirName(char *name) {
name
[
0
]
=
0
;
}
return
name
;
#elif defined(_TD_DARWIN_64)
char
*
end
=
strrchr
(
name
,
'/'
);
if
(
end
!=
NULL
)
{
*
end
=
'\0'
;
}
else
{
name
[
0
]
=
0
;
}
return
name
;
#else
return
dirname
(
name
);
#endif
...
...
source/os/src/osSocket.c
浏览文件 @
c27476bd
...
...
@@ -947,9 +947,9 @@ int32_t taosGetFqdn(char *fqdn) {
hostname
[
1023
]
=
'\0'
;
if
(
gethostname
(
hostname
,
1023
)
==
-
1
)
{
#ifdef WINDOWS
printf
(
"failed to get hostname, reason:%s"
,
strerror
(
WSAGetLastError
()));
printf
(
"failed to get hostname, reason:%s
\n
"
,
strerror
(
WSAGetLastError
()));
#else
printf
(
"failed to get hostname, reason:%s"
,
strerror
(
errno
));
printf
(
"failed to get hostname, reason:%s
\n
"
,
strerror
(
errno
));
#endif
assert
(
0
);
return
-
1
;
...
...
@@ -968,7 +968,7 @@ int32_t taosGetFqdn(char *fqdn) {
#endif // __APPLE__
int32_t
ret
=
getaddrinfo
(
hostname
,
NULL
,
&
hints
,
&
result
);
if
(
!
result
)
{
fprintf
(
stderr
,
"failed to get fqdn, code:%d, reason:%s"
,
ret
,
gai_strerror
(
ret
));
fprintf
(
stderr
,
"failed to get fqdn, code:%d, reason:%s
\n
"
,
ret
,
gai_strerror
(
ret
));
return
-
1
;
}
...
...
source/os/src/osSysinfo.c
浏览文件 @
c27476bd
...
...
@@ -759,9 +759,11 @@ int32_t taosGetSystemUUID(char *uid, int32_t uidlen) {
return
0
;
#elif defined(_TD_DARWIN_64)
uuid_t
uuid
=
{
0
};
char
buf
[
37
]
=
{
0
};
uuid_generate
(
uuid
);
// it's caller's responsibility to make enough space for `uid`, that's 36-char + 1-null
uuid_unparse_lower
(
uuid
,
uid
);
uuid_unparse_lower
(
uuid
,
buf
);
memcpy
(
uid
,
buf
,
uidlen
);
return
0
;
#else
int
len
=
0
;
...
...
tests/system-test/1-insert/test_stmt_set_tbname_tag.py
浏览文件 @
c27476bd
...
...
@@ -218,13 +218,13 @@ class TDTestCase:
tdLog
.
debug
(
"assert 8th case %s"
%
rows
)
assert
rows
[
0
][
0
]
==
3
,
' 8th case is failed'
#
#
query: selector Functions 9
#
queryparam=new_bind_params(1)
#
queryparam[0].int(2)
# rows=self.stmtExe(conn,"select bottom(bu,?) from log group by bu
; ",queryparam)
#
tdLog.debug("assert 9th case %s"%rows)
# assert rows[0
][0] == 4, ' 9 case is failed'
# assert rows[1
][0] == 3, ' 9 case is failed'
#query: selector Functions 9
queryparam
=
new_bind_params
(
1
)
queryparam
[
0
].
int
(
2
)
rows
=
self
.
stmtExe
(
conn
,
"select bottom(bu,?) from log group by bu order by bu desc
; "
,
queryparam
)
tdLog
.
debug
(
"assert 9th case %s"
%
rows
)
assert
rows
[
1
][
0
]
==
4
,
' 9 case is failed'
assert
rows
[
2
][
0
]
==
3
,
' 9 case is failed'
# #query: time-series specific Functions 10
...
...
tests/system-test/2-query/Timediff.py
浏览文件 @
c27476bd
...
...
@@ -123,10 +123,10 @@ class TDTestCase:
elif
unit
.
lower
()
==
'1u'
:
for
i
in
range
(
len
(
self
.
ts_str
)):
tdSql
.
checkEqual
(
tdSql
.
queryResult
[
i
][
0
],
int
(((
date_time
[
i
]
/
1000
)
-
self
.
subtractor
*
1000000
)))
#
self.check_tbtype(tb_type)
#
tdSql.checkRows(len(self.ts_str))
#
for i in range(len(self.ts_str)):
# tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i]/1000000
)-self.subtractor*1000000000)))
self
.
check_tbtype
(
tb_type
)
tdSql
.
checkRows
(
len
(
self
.
ts_str
))
for
i
in
range
(
len
(
self
.
ts_str
)):
tdSql
.
checkEqual
(
tdSql
.
queryResult
[
i
][
0
],
int
(((
date_time
[
i
]
)
-
self
.
subtractor
*
1000000000
)))
for
unit
in
self
.
error_unit
:
if
tb_type
.
lower
()
==
'ntb'
:
tdSql
.
error
(
f
'select timediff(ts,
{
self
.
subtractor
}
,
{
unit
}
) from
{
self
.
ntbname
}
'
)
...
...
tests/system-test/2-query/and_or_for_byte.py
0 → 100644
浏览文件 @
c27476bd
此差异已折叠。
点击以展开。
tests/system-test/2-query/csum.py
浏览文件 @
c27476bd
...
...
@@ -419,12 +419,66 @@ class TDTestCase:
tdSql
.
checkData
(
3
,
0
,
4
)
tdSql
.
query
(
"select csum(abs(c1))+2 from t1 "
)
tdSql
.
checkRows
(
4
)
def
csum_support_stable
(
self
):
tdSql
.
query
(
" select csum(1) from stb1 "
)
tdSql
.
checkRows
(
70
)
tdSql
.
query
(
"select csum(c1) from stb1 partition by tbname "
)
tdSql
.
checkRows
(
40
)
# tdSql.query("select csum(st1) from stb1 partition by tbname")
# tdSql.checkRows(70)
tdSql
.
query
(
"select csum(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
40
)
tdSql
.
query
(
"select csum(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
40
)
tdSql
.
query
(
"select csum(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
40
)
# # bug need fix
# tdSql.query("select csum(st1+c1) from stb1 partition by tbname slimit 1 ")
# tdSql.checkRows(4)
# tdSql.error("select csum(st1+c1) from stb1 partition by tbname limit 1 ")
# bug need fix
tdSql
.
query
(
"select csum(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
40
)
# bug need fix
# tdSql.query("select tbname , csum(c1) from stb1 partition by tbname")
# tdSql.checkRows(40)
# tdSql.query("select tbname , csum(st1) from stb1 partition by tbname")
# tdSql.checkRows(70)
# tdSql.query("select tbname , csum(st1) from stb1 partition by tbname slimit 1")
# tdSql.checkRows(7)
# partition by tags
# tdSql.query("select st1 , csum(c1) from stb1 partition by st1")
# tdSql.checkRows(40)
# tdSql.query("select csum(c1) from stb1 partition by st1")
# tdSql.checkRows(40)
# tdSql.query("select st1 , csum(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(4)
# tdSql.query("select csum(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(4)
# partition by col
# tdSql.query("select c1 , csum(c1) from stb1 partition by c1")
# tdSql.checkRows(41)
# tdSql.query("select csum(c1) from stb1 partition by c1")
# tdSql.checkRows(41)
# tdSql.query("select c1 , csum(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(4)
# tdSql.query("select csum(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(4)
def
run
(
self
):
import
traceback
try
:
# run in develop branch
self
.
csum_test_run
()
self
.
csum_support_stable
()
pass
except
Exception
as
e
:
traceback
.
print_exc
()
...
...
tests/system-test/2-query/elapsed.py
浏览文件 @
c27476bd
此差异已折叠。
点击以展开。
tests/system-test/2-query/function_diff.py
浏览文件 @
c27476bd
...
...
@@ -355,9 +355,63 @@ class TDTestCase:
tdSql
.
execute
(
f
"create table tt
{
i
}
using stb2 tags(
{
i
}
)"
)
pass
def
diff_support_stable
(
self
):
tdSql
.
query
(
" select diff(1) from stb1 "
)
tdSql
.
checkRows
(
229
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
"select diff(c1) from stb1 partition by tbname "
)
tdSql
.
checkRows
(
199
)
# tdSql.query("select diff(st1) from stb1 partition by tbname")
# tdSql.checkRows(229)
tdSql
.
query
(
"select diff(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
199
)
tdSql
.
query
(
"select diff(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
199
)
tdSql
.
query
(
"select diff(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
199
)
# # bug need fix
# tdSql.query("select diff(st1+c1) from stb1 partition by tbname slimit 1 ")
# tdSql.checkRows(19)
# tdSql.error("select diff(st1+c1) from stb1 partition by tbname limit 1 ")
# bug need fix
tdSql
.
query
(
"select diff(st1+c1) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
199
)
# bug need fix
# tdSql.query("select tbname , diff(c1) from stb1 partition by tbname")
# tdSql.checkRows(199)
# tdSql.query("select tbname , diff(st1) from stb1 partition by tbname")
# tdSql.checkRows(199)
# tdSql.query("select tbname , diff(st1) from stb1 partition by tbname slimit 1")
# tdSql.checkRows(19)
# partition by tags
# tdSql.query("select st1 , diff(c1) from stb1 partition by st1")
# tdSql.checkRows(199)
# tdSql.query("select diff(c1) from stb1 partition by st1")
# tdSql.checkRows(199)
# tdSql.query("select st1 , diff(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(19)
# tdSql.query("select diff(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(19)
# partition by col
# tdSql.query("select c1 , diff(c1) from stb1 partition by c1")
# tdSql.checkRows(199)
# tdSql.query("select diff(c1) from stb1 partition by c1")
# tdSql.checkRows(41)
# tdSql.query("select c1 , diff(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(19)
# tdSql.query("select diff(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(19)
def
diff_test_run
(
self
)
:
tdLog
.
printNoPrefix
(
"==========
TD-10594
=========="
)
tdLog
.
printNoPrefix
(
"==========
run test case for diff function
=========="
)
tbnum
=
10
nowtime
=
int
(
round
(
time
.
time
()
*
1000
))
per_table_rows
=
10
...
...
@@ -422,6 +476,7 @@ class TDTestCase:
try
:
# run in develop branch
self
.
diff_test_run
()
self
.
diff_support_stable
()
pass
except
Exception
as
e
:
traceback
.
print_exc
()
...
...
tests/system-test/2-query/mavg.py
浏览文件 @
c27476bd
...
...
@@ -673,11 +673,65 @@ class TDTestCase:
tdSql
.
query
(
"select mavg(abs(c1),1) from t1"
)
tdSql
.
checkRows
(
4
)
def
mavg_support_stable
(
self
):
tdSql
.
query
(
" select mavg(1,3) from stb1 "
)
tdSql
.
checkRows
(
68
)
tdSql
.
checkData
(
0
,
0
,
1.000000000
)
tdSql
.
query
(
"select mavg(c1,3) from stb1 partition by tbname "
)
tdSql
.
checkRows
(
38
)
# tdSql.query("select mavg(st1,3) from stb1 partition by tbname")
# tdSql.checkRows(38)
tdSql
.
query
(
"select mavg(st1+c1,3) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
38
)
tdSql
.
query
(
"select mavg(st1+c1,3) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
38
)
tdSql
.
query
(
"select mavg(st1+c1,3) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
38
)
# # bug need fix
# tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname slimit 1 ")
# tdSql.checkRows(2)
# tdSql.error("select mavg(st1+c1,3) from stb1 partition by tbname limit 1 ")
# bug need fix
tdSql
.
query
(
"select mavg(st1+c1,3) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
38
)
# bug need fix
# tdSql.query("select tbname , mavg(c1,3) from stb1 partition by tbname")
# tdSql.checkRows(38)
# tdSql.query("select tbname , mavg(st1,3) from stb1 partition by tbname")
# tdSql.checkRows(38)
# tdSql.query("select tbname , mavg(st1,3) from stb1 partition by tbname slimit 1")
# tdSql.checkRows(2)
# partition by tags
# tdSql.query("select st1 , mavg(c1,3) from stb1 partition by st1")
# tdSql.checkRows(38)
# tdSql.query("select mavg(c1,3) from stb1 partition by st1")
# tdSql.checkRows(38)
# tdSql.query("select st1 , mavg(c1,3) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(2)
# tdSql.query("select mavg(c1,3) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(2)
# partition by col
# tdSql.query("select c1 , mavg(c1,3) from stb1 partition by c1")
# tdSql.checkRows(38)
# tdSql.query("select mavg(c1 ,3) from stb1 partition by c1")
# tdSql.checkRows(38)
# tdSql.query("select c1 , mavg(c1,3) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(2)
# tdSql.query("select diff(c1) from stb1 partition by st1 slimit 1")
# tdSql.checkRows(2)
def
run
(
self
):
import
traceback
try
:
# run in develop branch
self
.
mavg_test_run
()
self
.
mavg_support_stable
()
pass
except
Exception
as
e
:
traceback
.
print_exc
()
...
...
tests/system-test/2-query/queryQnode.py
浏览文件 @
c27476bd
...
...
@@ -478,6 +478,9 @@ class TDTestCase:
self
.
test_case3
()
# tdLog.debug(" LIMIT test_case3 ............ [OK]")
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
f
"
{
__file__
}
successfully executed"
)
return
#
...
...
tests/system-test/2-query/sample.py
浏览文件 @
c27476bd
...
...
@@ -798,6 +798,36 @@ class TDTestCase:
tdSql
.
query
(
"select sample(c1,100)+2 from ct1"
)
tdSql
.
query
(
"select abs(sample(c1,100)) from ct1"
)
# support stable and tbname
tdSql
.
query
(
"select tbname ,sample(c1,2) from stb1 partition by tbname order by tbname"
)
tdSql
.
checkRows
(
4
)
tdSql
.
checkData
(
0
,
0
,
'ct1'
)
tdSql
.
checkData
(
3
,
0
,
'ct4'
)
# # bug need fix
# tdSql.query(" select tbname ,c1 ,t1, sample(c1,2) from stb1 partition by tbname order by tbname ")
# tdSql.checkRows(4)
# tdSql.checkData(0,0,'ct1')
# tdSql.checkData(3,0,'ct4')
# tdSql.checkData(0,2,1)
# tdSql.checkData(3,2,4)
tdSql
.
query
(
" select tbname ,c1 ,t1, sample(c1,2) from stb1 partition by t1 order by t1 "
)
tdSql
.
checkRows
(
4
)
tdSql
.
checkData
(
0
,
0
,
'ct1'
)
tdSql
.
checkData
(
3
,
0
,
'ct4'
)
tdSql
.
checkData
(
0
,
2
,
1
)
tdSql
.
checkData
(
3
,
2
,
4
)
# bug need fix
# tdSql.query(" select tbname ,c1 ,t1, sample(c1,2) from stb1 partition by c1 order by c1 ")
# tdSql.checkRows(21)
# bug need fix
# tdSql.query(" select sample(c1,2) from stb1 partition by c1 ")
# tdSql.checkRows(21)
def
sample_test_run
(
self
)
:
tdLog
.
printNoPrefix
(
"==========support sample function=========="
)
tbnum
=
10
...
...
tests/system-test/2-query/statecount.py
浏览文件 @
c27476bd
...
...
@@ -18,6 +18,7 @@ class TDTestCase:
def
init
(
self
,
conn
,
logSql
):
tdLog
.
debug
(
f
"start to excute
{
__file__
}
"
)
tdSql
.
init
(
conn
.
cursor
())
self
.
ts
=
1420041600000
# 2015-01-01 00:00:00 this is begin time for first record
def
prepare_datas
(
self
):
tdSql
.
execute
(
...
...
@@ -344,6 +345,8 @@ class TDTestCase:
tdSql
.
error
(
"select stateduration(c1,'GT',1,1b) from ct1"
)
tdSql
.
error
(
"select stateduration(c1,'GT',1,1u) from ct1"
)
tdSql
.
error
(
"select stateduration(c1,'GT',1,1000s) from t1"
)
tdSql
.
error
(
"select stateduration(c1,'GT',1,10m) from t1"
)
tdSql
.
error
(
"select stateduration(c1,'GT',1,10d) from t1"
)
tdSql
.
query
(
"select stateduration(c1,'GT',1,1s) from t1"
)
tdSql
.
checkData
(
10
,
0
,
63072035
)
tdSql
.
query
(
"select stateduration(c1,'GT',1,1m) from t1"
)
...
...
@@ -355,6 +358,58 @@ class TDTestCase:
tdSql
.
query
(
"select stateduration(c1,'GT',1,1w) from t1"
)
tdSql
.
checkData
(
10
,
0
,
int
(
63072035
/
60
/
7
/
24
/
60
))
def
query_precision
(
self
):
def
generate_data
(
precision
=
"ms"
):
tdSql
.
execute
(
"create database if not exists db_%s precision '%s';"
%
(
precision
,
precision
))
tdSql
.
execute
(
"use db_%s;"
%
precision
)
tdSql
.
execute
(
"create stable db_%s.st (ts timestamp , id int) tags(ind int);"
%
precision
)
tdSql
.
execute
(
"create table db_%s.tb1 using st tags(1);"
%
precision
)
tdSql
.
execute
(
"create table db_%s.tb2 using st tags(2);"
%
precision
)
if
precision
==
"ms"
:
start_ts
=
self
.
ts
step
=
10000
elif
precision
==
"us"
:
start_ts
=
self
.
ts
*
1000
step
=
10000000
elif
precision
==
"ns"
:
start_ts
=
self
.
ts
*
1000000
step
=
10000000000
else
:
pass
for
i
in
range
(
10
):
sql1
=
"insert into db_%s.tb1 values (%d,%d)"
%
(
precision
,
start_ts
+
i
*
step
,
i
)
sql2
=
"insert into db_%s.tb1 values (%d,%d)"
%
(
precision
,
start_ts
+
i
*
step
,
i
)
tdSql
.
execute
(
sql1
)
tdSql
.
execute
(
sql2
)
time_units
=
[
"1s"
,
"1a"
,
"1u"
,
"1b"
]
precision_list
=
[
"ms"
,
"us"
,
"ns"
]
for
pres
in
precision_list
:
generate_data
(
pres
)
for
index
,
unit
in
enumerate
(
time_units
):
if
pres
==
"ms"
:
if
unit
in
[
"1u"
,
"1b"
]:
tdSql
.
error
(
"select stateduration(id,'GT',1,%s) from db_%s.tb1 "
%
(
unit
,
pres
))
pass
else
:
tdSql
.
query
(
"select stateduration(id,'GT',1,%s) from db_%s.tb1 "
%
(
unit
,
pres
))
elif
pres
==
"us"
and
unit
in
[
"1b"
]:
if
unit
in
[
"1b"
]:
tdSql
.
error
(
"select stateduration(id,'GT',1,%s) from db_%s.tb1 "
%
(
unit
,
pres
))
pass
else
:
tdSql
.
query
(
"select stateduration(id,'GT',1,%s) from db_%s.tb1 "
%
(
unit
,
pres
))
else
:
tdSql
.
query
(
"select stateduration(id,'GT',1,%s) from db_%s.tb1 "
%
(
unit
,
pres
))
basic_result
=
70
tdSql
.
checkData
(
9
,
0
,
basic_result
*
pow
(
1000
,
index
))
def
check_boundary_values
(
self
):
...
...
@@ -420,6 +475,8 @@ class TDTestCase:
tdLog
.
printNoPrefix
(
"==========step6: statecount unit time test ============"
)
self
.
check_unit_time
()
self
.
query_precision
()
def
stop
(
self
):
...
...
tests/system-test/2-query/tail.py
浏览文件 @
c27476bd
...
...
@@ -337,7 +337,7 @@ class TDTestCase:
tdSql
.
checkData
(
2
,
0
,
5
)
# nest query
# tdSql.query("select tail(c1,2) from (select c1 from ct1)")
# tdSql.query("select tail(c1,2) from (select
_rowts ,
c1 from ct1)")
tdSql
.
query
(
"select c1 from (select tail(c1,2) c1 from ct4) order by 1 nulls first"
)
tdSql
.
checkRows
(
2
)
tdSql
.
checkData
(
0
,
0
,
None
)
...
...
@@ -363,10 +363,59 @@ class TDTestCase:
tdSql
.
error
(
"select tail(c1,2) from ct1 group by tbname"
)
# super table
tdSql
.
error
(
"select tbname , tail(c1,2) from stb1 group by tbname"
)
tdSql
.
query
(
"select tail(c1,2) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
4
)
# bug need fix
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname")
# tdSql.checkRows(4)
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname order by tbname")
# tdSql.checkRows(4)
# tdSql.query(" select tbname , count(c1) from stb1 partition by tbname order by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname , max(c1) ,c1 from stb1 partition by tbname order by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname ,first(c1) from stb1 partition by tbname order by tbname ")
# tdSql.checkRows(2)
tdSql
.
query
(
"select tail(c1,2) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
4
)
# # bug need fix
# tdSql.query(" select tbname , tail(c1,2) from stb1 where t1 = 0 partition by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname , tail(c1,2) from stb1 where t1 = 0 partition by tbname order by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname , tail(c1,2) from stb1 where c1 = 0 partition by tbname order by tbname ")
# tdSql.checkRows(3)
# tdSql.query(" select tbname , tail(c1,2) from stb1 where c1 = 0 partition by tbname ")
# tdSql.checkRows(3)
# tdSql.query(" select tbname , tail(c1,2) from stb1 where c1 = 0 partition by tbname ")
# tdSql.checkRows(3)
tdSql
.
query
(
" select tail(t1,2) from stb1 "
)
tdSql
.
checkRows
(
2
)
tdSql
.
query
(
" select tail(t1+c1,2) from stb1 "
)
tdSql
.
checkRows
(
2
)
tdSql
.
query
(
" select tail(t1+c1,2) from stb1 partition by tbname "
)
tdSql
.
checkRows
(
4
)
tdSql
.
query
(
" select tail(t1,2) from stb1 partition by tbname "
)
tdSql
.
checkRows
(
4
)
# nest query
tdSql
.
query
(
" select tail(c1,2) from (select _rowts , t1 ,c1 , tbname from stb1 ) "
)
tdSql
.
checkRows
(
2
)
tdSql
.
checkData
(
0
,
0
,
None
)
tdSql
.
checkData
(
1
,
0
,
9
)
tdSql
.
query
(
"select tail(t1,2) from (select _rowts , t1 , tbname from stb1 )"
)
tdSql
.
checkRows
(
2
)
tdSql
.
checkData
(
0
,
0
,
4
)
tdSql
.
checkData
(
1
,
0
,
1
)
def
check_boundary_values
(
self
):
tdSql
.
execute
(
"drop database if exists bound_test"
)
...
...
tests/system-test/2-query/timetruncate.py
浏览文件 @
c27476bd
...
...
@@ -21,7 +21,6 @@ class TDTestCase:
self
.
db_param_precision
=
[
'ms'
,
'us'
,
'ns'
]
self
.
time_unit
=
[
'1w'
,
'1d'
,
'1h'
,
'1m'
,
'1s'
,
'1a'
,
'1u'
,
'1b'
]
self
.
error_unit
=
[
'2w'
,
'2d'
,
'2h'
,
'2m'
,
'2s'
,
'2a'
,
'2u'
,
'1c'
,
'#1'
]
self
.
error_unit
=
[
'2w'
,
'2d'
,
'2h'
,
'2m'
,
'2s'
,
'2a'
,
'2u'
,
'1c'
,
'#1'
]
self
.
ntbname
=
'ntb'
self
.
stbname
=
'stb'
self
.
ctbname
=
'ctb'
...
...
tests/system-test/2-query/unique.py
浏览文件 @
c27476bd
...
...
@@ -386,10 +386,60 @@ class TDTestCase:
tdSql
.
error
(
"select unique(c1) from ct1 group by tbname"
)
# super table
# super table
tdSql
.
error
(
"select tbname , tail(c1,2) from stb1 group by tbname"
)
tdSql
.
query
(
"select tail(c1,2) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
4
)
# bug need fix
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname")
# tdSql.checkRows(4)
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname order by tbname")
# tdSql.checkRows(4)
# tdSql.query(" select tbname , count(c1) from stb1 partition by tbname order by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname , max(c1) ,c1 from stb1 partition by tbname order by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname ,first(c1) from stb1 partition by tbname order by tbname ")
# tdSql.checkRows(2)
tdSql
.
query
(
"select tail(c1,2) from stb1 partition by tbname"
)
tdSql
.
checkRows
(
4
)
# # bug need fix
# tdSql.query(" select tbname , unique(c1) from stb1 where t1 = 0 partition by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname , unique(c1) from stb1 where t1 = 0 partition by tbname order by tbname ")
# tdSql.checkRows(2)
# tdSql.query(" select tbname , unique(c1) from stb1 where c1 = 0 partition by tbname order by tbname ")
# tdSql.checkRows(3)
# tdSql.query(" select tbname , unique(c1) from stb1 where c1 = 0 partition by tbname ")
# tdSql.checkRows(3)
tdSql
.
query
(
" select unique(t1) from stb1 "
)
tdSql
.
checkRows
(
2
)
tdSql
.
query
(
" select unique(t1+c1) from stb1 "
)
tdSql
.
checkRows
(
13
)
tdSql
.
query
(
" select unique(t1+c1) from stb1 partition by tbname "
)
tdSql
.
checkRows
(
13
)
tdSql
.
query
(
" select unique(t1) from stb1 partition by tbname "
)
tdSql
.
checkRows
(
2
)
# nest query
tdSql
.
query
(
" select unique(c1) from (select _rowts , t1 ,c1 , tbname from stb1 ) "
)
tdSql
.
checkRows
(
11
)
tdSql
.
checkData
(
0
,
0
,
6
)
tdSql
.
checkData
(
10
,
0
,
3
)
tdSql
.
query
(
"select unique(t1) from (select _rowts , t1 , tbname from stb1 )"
)
tdSql
.
checkRows
(
2
)
tdSql
.
checkData
(
0
,
0
,
4
)
tdSql
.
checkData
(
1
,
0
,
1
)
def
check_boundary_values
(
self
):
tdSql
.
execute
(
"drop database if exists bound_test"
)
...
...
tests/system-test/fulltest.sh
浏览文件 @
c27476bd
...
...
@@ -29,6 +29,7 @@ python3 ./test.py -f 1-insert/block_wise.py
python3 ./test.py
-f
1-insert/create_retentions.py
#python3 ./test.py -f 1-insert/table_param_ttl.py
python3 ./test.py
-f
2-query/between.py
python3 ./test.py
-f
2-query/distinct.py
python3 ./test.py
-f
2-query/varchar.py
...
...
@@ -95,7 +96,7 @@ python3 ./test.py -f 2-query/query_cols_tags_and_or.py
# python3 ./test.py -f 2-query/nestedQuery_str.py
python3 ./test.py
-f
2-query/avg.py
#
python3 ./test.py -f 2-query/elapsed.py
python3 ./test.py
-f
2-query/elapsed.py
python3 ./test.py
-f
2-query/csum.py
python3 ./test.py
-f
2-query/mavg.py
python3 ./test.py
-f
2-query/diff.py
...
...
@@ -117,9 +118,10 @@ python3 ./test.py -f 2-query/distribute_agg_avg.py
python3 ./test.py
-f
2-query/distribute_agg_stddev.py
python3 ./test.py
-f
2-query/twa.py
python3 ./test.py
-f
2-query/irate.py
python3 ./test.py
-f
2-query/and_or_for_byte.py
python3 ./test.py
-f
2-query/function_null.py
#
python3 ./test.py -f 2-query/queryQnode.py
python3 ./test.py
-f
2-query/queryQnode.py
#python3 ./test.py -f 6-cluster/5dnode1mnode.py
#python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 -M 3
...
...
@@ -172,3 +174,177 @@ python3 ./test.py -f 7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb.py
python3 ./test.py
-f
7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py
python3 ./test.py
-f
7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py
python3 ./test.py
-f
7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py
#------------querPolicy 2-----------
python3 ./test.py
-f
2-query/between.py
-Q
2
python3 ./test.py
-f
2-query/distinct.py
-Q
2
python3 ./test.py
-f
2-query/varchar.py
-Q
2
python3 ./test.py
-f
2-query/ltrim.py
-Q
2
python3 ./test.py
-f
2-query/rtrim.py
-Q
2
python3 ./test.py
-f
2-query/length.py
-Q
2
python3 ./test.py
-f
2-query/char_length.py
-Q
2
python3 ./test.py
-f
2-query/upper.py
-Q
2
python3 ./test.py
-f
2-query/lower.py
-Q
2
python3 ./test.py
-f
2-query/join.py
-Q
2
python3 ./test.py
-f
2-query/join2.py
-Q
2
python3 ./test.py
-f
2-query/cast.py
-Q
2
python3 ./test.py
-f
2-query/substr.py
-Q
2
python3 ./test.py
-f
2-query/union.py
-Q
2
python3 ./test.py
-f
2-query/union1.py
-Q
2
python3 ./test.py
-f
2-query/concat.py
-Q
2
python3 ./test.py
-f
2-query/concat2.py
-Q
2
python3 ./test.py
-f
2-query/concat_ws.py
-Q
2
python3 ./test.py
-f
2-query/concat_ws2.py
-Q
2
python3 ./test.py
-f
2-query/check_tsdb.py
-Q
2
python3 ./test.py
-f
2-query/spread.py
-Q
2
python3 ./test.py
-f
2-query/hyperloglog.py
-Q
2
python3 ./test.py
-f
2-query/explain.py
-Q
2
python3 ./test.py
-f
2-query/leastsquares.py
-Q
2
python3 ./test.py
-f
2-query/timezone.py
-Q
2
python3 ./test.py
-f
2-query/Now.py
-Q
2
python3 ./test.py
-f
2-query/Today.py
-Q
2
python3 ./test.py
-f
2-query/max.py
-Q
2
python3 ./test.py
-f
2-query/min.py
-Q
2
python3 ./test.py
-f
2-query/count.py
-Q
2
python3 ./test.py
-f
2-query/last.py
-Q
2
python3 ./test.py
-f
2-query/first.py
-Q
2
python3 ./test.py
-f
2-query/To_iso8601.py
-Q
2
python3 ./test.py
-f
2-query/To_unixtimestamp.py
-Q
2
python3 ./test.py
-f
2-query/timetruncate.py
-Q
2
python3 ./test.py
-f
2-query/diff.py
-Q
2
python3 ./test.py
-f
2-query/Timediff.py
-Q
2
python3 ./test.py
-f
2-query/json_tag.py
-Q
2
python3 ./test.py
-f
2-query/top.py
-Q
2
python3 ./test.py
-f
2-query/bottom.py
-Q
2
python3 ./test.py
-f
2-query/percentile.py
-Q
2
python3 ./test.py
-f
2-query/apercentile.py
-Q
2
python3 ./test.py
-f
2-query/abs.py
-Q
2
python3 ./test.py
-f
2-query/ceil.py
-Q
2
python3 ./test.py
-f
2-query/floor.py
-Q
2
python3 ./test.py
-f
2-query/round.py
-Q
2
python3 ./test.py
-f
2-query/log.py
-Q
2
python3 ./test.py
-f
2-query/pow.py
-Q
2
python3 ./test.py
-f
2-query/sqrt.py
-Q
2
python3 ./test.py
-f
2-query/sin.py
-Q
2
python3 ./test.py
-f
2-query/cos.py
-Q
2
python3 ./test.py
-f
2-query/tan.py
-Q
2
python3 ./test.py
-f
2-query/arcsin.py
-Q
2
python3 ./test.py
-f
2-query/arccos.py
-Q
2
python3 ./test.py
-f
2-query/arctan.py
-Q
2
python3 ./test.py
-f
2-query/query_cols_tags_and_or.py
-Q
2
# python3 ./test.py -f 2-query/nestedQuery.py -Q 2
# python3 ./test.py -f 2-query/nestedQuery_str.py -Q 2
python3 ./test.py
-f
2-query/avg.py
-Q
2
# python3 ./test.py -f 2-query/elapsed.py -Q 2
python3 ./test.py
-f
2-query/csum.py
-Q
2
python3 ./test.py
-f
2-query/mavg.py
-Q
2
python3 ./test.py
-f
2-query/diff.py
-Q
2
python3 ./test.py
-f
2-query/sample.py
-Q
2
python3 ./test.py
-f
2-query/function_diff.py
-Q
2
python3 ./test.py
-f
2-query/unique.py
-Q
2
python3 ./test.py
-f
2-query/stateduration.py
-Q
2
python3 ./test.py
-f
2-query/function_stateduration.py
-Q
2
python3 ./test.py
-f
2-query/statecount.py
-Q
2
python3 ./test.py
-f
2-query/tail.py
-Q
2
python3 ./test.py
-f
2-query/ttl_comment.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_count.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_max.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_min.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_sum.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_spread.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_apercentile.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_avg.py
-Q
2
python3 ./test.py
-f
2-query/distribute_agg_stddev.py
-Q
2
python3 ./test.py
-f
2-query/twa.py
-Q
2
python3 ./test.py
-f
2-query/irate.py
-Q
2
python3 ./test.py
-f
2-query/function_null.py
-Q
2
#------------querPolicy 3-----------
python3 ./test.py
-f
2-query/between.py
-Q
3
python3 ./test.py
-f
2-query/distinct.py
-Q
3
python3 ./test.py
-f
2-query/varchar.py
-Q
3
python3 ./test.py
-f
2-query/ltrim.py
-Q
3
python3 ./test.py
-f
2-query/rtrim.py
-Q
3
python3 ./test.py
-f
2-query/length.py
-Q
3
python3 ./test.py
-f
2-query/char_length.py
-Q
3
python3 ./test.py
-f
2-query/upper.py
-Q
3
python3 ./test.py
-f
2-query/lower.py
-Q
3
python3 ./test.py
-f
2-query/join.py
-Q
3
python3 ./test.py
-f
2-query/join2.py
-Q
3
python3 ./test.py
-f
2-query/cast.py
-Q
3
python3 ./test.py
-f
2-query/substr.py
-Q
3
python3 ./test.py
-f
2-query/union.py
-Q
3
python3 ./test.py
-f
2-query/union1.py
-Q
3
python3 ./test.py
-f
2-query/concat.py
-Q
3
python3 ./test.py
-f
2-query/concat2.py
-Q
3
python3 ./test.py
-f
2-query/concat_ws.py
-Q
3
python3 ./test.py
-f
2-query/concat_ws2.py
-Q
3
python3 ./test.py
-f
2-query/check_tsdb.py
-Q
3
python3 ./test.py
-f
2-query/spread.py
-Q
3
python3 ./test.py
-f
2-query/hyperloglog.py
-Q
3
python3 ./test.py
-f
2-query/explain.py
-Q
3
python3 ./test.py
-f
2-query/leastsquares.py
-Q
3
python3 ./test.py
-f
2-query/timezone.py
-Q
3
python3 ./test.py
-f
2-query/Now.py
-Q
3
python3 ./test.py
-f
2-query/Today.py
-Q
3
python3 ./test.py
-f
2-query/max.py
-Q
3
python3 ./test.py
-f
2-query/min.py
-Q
3
python3 ./test.py
-f
2-query/count.py
-Q
3
python3 ./test.py
-f
2-query/last.py
-Q
3
python3 ./test.py
-f
2-query/first.py
-Q
3
python3 ./test.py
-f
2-query/To_iso8601.py
-Q
3
python3 ./test.py
-f
2-query/To_unixtimestamp.py
-Q
3
python3 ./test.py
-f
2-query/timetruncate.py
-Q
3
python3 ./test.py
-f
2-query/diff.py
-Q
3
python3 ./test.py
-f
2-query/Timediff.py
-Q
3
python3 ./test.py
-f
2-query/json_tag.py
-Q
3
python3 ./test.py
-f
2-query/top.py
-Q
3
python3 ./test.py
-f
2-query/bottom.py
-Q
3
python3 ./test.py
-f
2-query/percentile.py
-Q
3
python3 ./test.py
-f
2-query/apercentile.py
-Q
3
python3 ./test.py
-f
2-query/abs.py
-Q
3
python3 ./test.py
-f
2-query/ceil.py
-Q
3
python3 ./test.py
-f
2-query/floor.py
-Q
3
python3 ./test.py
-f
2-query/round.py
-Q
3
python3 ./test.py
-f
2-query/log.py
-Q
3
python3 ./test.py
-f
2-query/pow.py
-Q
3
python3 ./test.py
-f
2-query/sqrt.py
-Q
3
python3 ./test.py
-f
2-query/sin.py
-Q
3
python3 ./test.py
-f
2-query/cos.py
-Q
3
python3 ./test.py
-f
2-query/tan.py
-Q
3
python3 ./test.py
-f
2-query/arcsin.py
-Q
3
python3 ./test.py
-f
2-query/arccos.py
-Q
3
python3 ./test.py
-f
2-query/arctan.py
-Q
3
python3 ./test.py
-f
2-query/query_cols_tags_and_or.py
-Q
3
# python3 ./test.py -f 2-query/nestedQuery.py -Q 3
# python3 ./test.py -f 2-query/nestedQuery_str.py -Q 3
# python3 ./test.py -f 2-query/avg.py -Q 3
# python3 ./test.py -f 2-query/elapsed.py -Q 3
python3 ./test.py
-f
2-query/csum.py
-Q
3
python3 ./test.py
-f
2-query/mavg.py
-Q
3
python3 ./test.py
-f
2-query/diff.py
-Q
3
python3 ./test.py
-f
2-query/sample.py
-Q
3
python3 ./test.py
-f
2-query/function_diff.py
-Q
3
python3 ./test.py
-f
2-query/unique.py
-Q
3
python3 ./test.py
-f
2-query/stateduration.py
-Q
3
python3 ./test.py
-f
2-query/function_stateduration.py
-Q
3
python3 ./test.py
-f
2-query/statecount.py
-Q
3
python3 ./test.py
-f
2-query/tail.py
-Q
3
python3 ./test.py
-f
2-query/ttl_comment.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_count.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_max.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_min.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_sum.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_spread.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_apercentile.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_avg.py
-Q
3
python3 ./test.py
-f
2-query/distribute_agg_stddev.py
-Q
3
python3 ./test.py
-f
2-query/twa.py
-Q
3
python3 ./test.py
-f
2-query/irate.py
-Q
3
python3 ./test.py
-f
2-query/function_null.py
-Q
3
tools/shell/src/shellArguments.c
浏览文件 @
c27476bd
...
...
@@ -44,27 +44,27 @@ static int32_t shellParseSingleOpt(int32_t key, char *arg);
void
shellPrintHelp
()
{
char
indent
[]
=
" "
;
printf
(
"Usage: taos [OPTION...]
\
n
\n
"
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-a,"
,
indent
,
SHELL_AUTH
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-A,"
,
indent
,
SHELL_GEN_AUTH
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-c,"
,
indent
,
SHELL_CFG_DIR
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-C,"
,
indent
,
SHELL_DMP_CFG
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-d,"
,
indent
,
SHELL_DB
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-f,"
,
indent
,
SHELL_FILE
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-h,"
,
indent
,
SHELL_HOST
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-k,"
,
indent
,
SHELL_CHECK
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-l,"
,
indent
,
SHELL_PKG_LEN
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-n,"
,
indent
,
SHELL_NET_ROLE
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-N,"
,
indent
,
SHELL_PKT_NUM
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-p,"
,
indent
,
SHELL_PASSWORD
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-P,"
,
indent
,
SHELL_PORT
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-r,"
,
indent
,
SHELL_RAW_TIME
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-s,"
,
indent
,
SHELL_CMD
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-t,"
,
indent
,
SHELL_STARTUP
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-u,"
,
indent
,
SHELL_USER
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-w,"
,
indent
,
SHELL_WIDTH
);
printf
(
"%s%s%s%s
\n
"
,
indent
,
"-V,"
,
indent
,
SHELL_VERSION
);
printf
(
"
\
n\n
Report bugs to %s.
\n
"
,
SHELL_EMAIL
);
printf
(
"Usage: taos [OPTION...]
\
r\n\r
\n
"
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-a,"
,
indent
,
SHELL_AUTH
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-A,"
,
indent
,
SHELL_GEN_AUTH
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-c,"
,
indent
,
SHELL_CFG_DIR
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-C,"
,
indent
,
SHELL_DMP_CFG
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-d,"
,
indent
,
SHELL_DB
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-f,"
,
indent
,
SHELL_FILE
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-h,"
,
indent
,
SHELL_HOST
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-k,"
,
indent
,
SHELL_CHECK
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-l,"
,
indent
,
SHELL_PKG_LEN
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-n,"
,
indent
,
SHELL_NET_ROLE
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-N,"
,
indent
,
SHELL_PKT_NUM
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-p,"
,
indent
,
SHELL_PASSWORD
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-P,"
,
indent
,
SHELL_PORT
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-r,"
,
indent
,
SHELL_RAW_TIME
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-s,"
,
indent
,
SHELL_CMD
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-t,"
,
indent
,
SHELL_STARTUP
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-u,"
,
indent
,
SHELL_USER
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-w,"
,
indent
,
SHELL_WIDTH
);
printf
(
"%s%s%s%s
\
r\
n
"
,
indent
,
"-V,"
,
indent
,
SHELL_VERSION
);
printf
(
"
\
r\n\r\n
Report bugs to %s.
\r
\n
"
,
SHELL_EMAIL
);
}
#ifdef LINUX
...
...
@@ -196,23 +196,23 @@ int32_t shellParseArgsWithoutArgp(int argc, char *argv[]) {
char
*
key
=
argv
[
i
];
int32_t
keyLen
=
strlen
(
key
);
if
(
keyLen
!=
2
)
{
fprintf
(
stderr
,
"invalid option %s
\n
"
,
key
);
fprintf
(
stderr
,
"invalid option %s
\
r\
n
"
,
key
);
return
-
1
;
}
if
(
key
[
0
]
!=
'-'
)
{
fprintf
(
stderr
,
"invalid option %s
\n
"
,
key
);
fprintf
(
stderr
,
"invalid option %s
\
r\
n
"
,
key
);
return
-
1
;
}
if
(
key
[
1
]
==
'h'
||
key
[
1
]
==
'P'
||
key
[
1
]
==
'u'
||
key
[
1
]
==
'a'
||
key
[
1
]
==
'c'
||
key
[
1
]
==
's'
||
key
[
1
]
==
'f'
||
key
[
1
]
==
'd'
||
key
[
1
]
==
'w'
||
key
[
1
]
==
'n'
||
key
[
1
]
==
'l'
||
key
[
1
]
==
'N'
)
{
if
(
i
+
1
>=
argc
)
{
fprintf
(
stderr
,
"option %s requires an argument
\n
"
,
key
);
fprintf
(
stderr
,
"option %s requires an argument
\
r\
n
"
,
key
);
return
-
1
;
}
char
*
val
=
argv
[
i
+
1
];
if
(
val
[
0
]
==
'-'
)
{
fprintf
(
stderr
,
"option %s requires an argument
\n
"
,
key
);
fprintf
(
stderr
,
"option %s requires an argument
\
r\
n
"
,
key
);
return
-
1
;
}
shellParseSingleOpt
(
key
[
1
],
val
);
...
...
@@ -221,7 +221,7 @@ int32_t shellParseArgsWithoutArgp(int argc, char *argv[]) {
key
[
1
]
==
't'
||
key
[
1
]
==
'V'
||
key
[
1
]
==
'?'
||
key
[
1
]
==
1
)
{
shellParseSingleOpt
(
key
[
1
],
NULL
);
}
else
{
fprintf
(
stderr
,
"invalid option %s
\n
"
,
key
);
fprintf
(
stderr
,
"invalid option %s
\
r\
n
"
,
key
);
return
-
1
;
}
}
...
...
@@ -241,7 +241,7 @@ static void shellInitArgs(int argc, char *argv[]) {
}
taosSetConsoleEcho
(
true
);
if
(
EOF
==
getchar
())
{
fprintf
(
stderr
,
"getchar() return EOF
\n
"
);
fprintf
(
stderr
,
"getchar() return EOF
\
r\
n
"
);
}
}
else
{
tstrncpy
(
shell
.
args
.
password
,
(
char
*
)(
argv
[
i
]
+
2
),
sizeof
(
shell
.
args
.
password
));
...
...
@@ -263,22 +263,22 @@ static void shellInitArgs(int argc, char *argv[]) {
static
int32_t
shellCheckArgs
()
{
SShellArgs
*
pArgs
=
&
shell
.
args
;
if
(
pArgs
->
host
!=
NULL
&&
(
strlen
(
pArgs
->
host
)
<=
0
||
strlen
(
pArgs
->
host
)
>
TSDB_FQDN_LEN
))
{
printf
(
"Invalid host:%s
\n
"
,
pArgs
->
host
);
printf
(
"Invalid host:%s
\
r\
n
"
,
pArgs
->
host
);
return
-
1
;
}
if
(
pArgs
->
user
!=
NULL
&&
(
strlen
(
pArgs
->
user
)
<=
0
||
strlen
(
pArgs
->
user
)
>
TSDB_USER_LEN
))
{
printf
(
"Invalid user:%s
\n
"
,
pArgs
->
user
);
printf
(
"Invalid user:%s
\
r\
n
"
,
pArgs
->
user
);
return
-
1
;
}
if
(
pArgs
->
auth
!=
NULL
&&
(
strlen
(
pArgs
->
auth
)
<=
0
||
strlen
(
pArgs
->
auth
)
>
TSDB_PASSWORD_LEN
))
{
printf
(
"Invalid auth:%s
\n
"
,
pArgs
->
auth
);
printf
(
"Invalid auth:%s
\
r\
n
"
,
pArgs
->
auth
);
return
-
1
;
}
if
(
pArgs
->
database
!=
NULL
&&
(
strlen
(
pArgs
->
database
)
<=
0
||
strlen
(
pArgs
->
database
)
>
TSDB_DB_NAME_LEN
))
{
printf
(
"Invalid database:%s
\n
"
,
pArgs
->
database
);
printf
(
"Invalid database:%s
\
r\
n
"
,
pArgs
->
database
);
return
-
1
;
}
...
...
@@ -291,7 +291,7 @@ static int32_t shellCheckArgs() {
if
(
pArgs
->
cfgdir
!=
NULL
)
{
if
(
strlen
(
pArgs
->
cfgdir
)
<=
0
||
strlen
(
pArgs
->
cfgdir
)
>=
PATH_MAX
)
{
printf
(
"Invalid cfgdir:%s
\n
"
,
pArgs
->
cfgdir
);
printf
(
"Invalid cfgdir:%s
\
r\
n
"
,
pArgs
->
cfgdir
);
return
-
1
;
}
else
{
if
(
taosExpandDir
(
pArgs
->
cfgdir
,
configDir
,
PATH_MAX
)
!=
0
)
{
...
...
@@ -301,37 +301,37 @@ static int32_t shellCheckArgs() {
}
if
(
pArgs
->
commands
!=
NULL
&&
(
strlen
(
pArgs
->
commands
)
<=
0
))
{
printf
(
"Invalid commands:%s
\n
"
,
pArgs
->
commands
);
printf
(
"Invalid commands:%s
\
r\
n
"
,
pArgs
->
commands
);
return
-
1
;
}
if
(
pArgs
->
netrole
!=
NULL
&&
!
(
strcmp
(
pArgs
->
netrole
,
"client"
)
==
0
||
strcmp
(
pArgs
->
netrole
,
"server"
)
==
0
))
{
printf
(
"Invalid netrole:%s
\n
"
,
pArgs
->
netrole
);
printf
(
"Invalid netrole:%s
\
r\
n
"
,
pArgs
->
netrole
);
return
-
1
;
}
if
(
pArgs
->
password
!=
NULL
&&
(
strlen
(
pArgs
->
password
)
<=
0
))
{
printf
(
"Invalid password
\n
"
);
printf
(
"Invalid password
\
r\
n
"
);
return
-
1
;
}
if
(
pArgs
->
port
<
0
||
pArgs
->
port
>
65535
)
{
printf
(
"Invalid port
\n
"
);
printf
(
"Invalid port
\
r\
n
"
);
return
-
1
;
}
if
(
pArgs
->
pktLen
<
SHELL_MIN_PKG_LEN
||
pArgs
->
pktLen
>
SHELL_MAX_PKG_LEN
)
{
printf
(
"Invalid pktLen:%d, range:[%d, %d]
\n
"
,
pArgs
->
pktLen
,
SHELL_MIN_PKG_LEN
,
SHELL_MAX_PKG_LEN
);
printf
(
"Invalid pktLen:%d, range:[%d, %d]
\
r\
n
"
,
pArgs
->
pktLen
,
SHELL_MIN_PKG_LEN
,
SHELL_MAX_PKG_LEN
);
return
-
1
;
}
if
(
pArgs
->
pktNum
<
SHELL_MIN_PKG_NUM
||
pArgs
->
pktNum
>
SHELL_MAX_PKG_NUM
)
{
printf
(
"Invalid pktNum:%d, range:[%d, %d]
\n
"
,
pArgs
->
pktNum
,
SHELL_MIN_PKG_NUM
,
SHELL_MAX_PKG_NUM
);
printf
(
"Invalid pktNum:%d, range:[%d, %d]
\
r\
n
"
,
pArgs
->
pktNum
,
SHELL_MIN_PKG_NUM
,
SHELL_MAX_PKG_NUM
);
return
-
1
;
}
if
(
pArgs
->
displayWidth
<=
0
||
pArgs
->
displayWidth
>
10
*
1024
)
{
printf
(
"Invalid displayWidth:%d, range:[1, 10 * 1024]
\n
"
,
pArgs
->
displayWidth
);
printf
(
"Invalid displayWidth:%d, range:[1, 10 * 1024]
\
r\
n
"
,
pArgs
->
displayWidth
);
return
-
1
;
}
...
...
@@ -341,8 +341,8 @@ static int32_t shellCheckArgs() {
int32_t
shellParseArgs
(
int32_t
argc
,
char
*
argv
[])
{
shellInitArgs
(
argc
,
argv
);
shell
.
info
.
clientVersion
=
"Welcome to the TDengine shell from %s, Client Version:%s
\n
"
"Copyright (c) 2022 by TAOS Data, Inc. All rights reserved.
\
n
\n
"
;
"Welcome to the TDengine shell from %s, Client Version:%s
\
r\
n
"
"Copyright (c) 2022 by TAOS Data, Inc. All rights reserved.
\
r\n\r
\n
"
;
shell
.
info
.
promptHeader
=
TAOS_CONSOLE_PROMPT_HEADER
;
shell
.
info
.
promptContinue
=
TAOS_CONSOLE_PROMPT_CONTINUE
;
shell
.
info
.
promptSize
=
6
;
...
...
tools/shell/src/shellCommand.c
浏览文件 @
c27476bd
...
...
@@ -314,7 +314,7 @@ void shellGetScreenSize(int32_t *ws_col, int32_t *ws_row) {
#else
struct
winsize
w
;
if
(
ioctl
(
0
,
TIOCGWINSZ
,
&
w
)
<
0
||
w
.
ws_col
==
0
||
w
.
ws_row
==
0
)
{
// fprintf(stderr, "No stream device, and use default value(col 120, row 30)\n");
// fprintf(stderr, "No stream device, and use default value(col 120, row 30)\
r\
n");
if
(
ws_col
!=
NULL
)
*
ws_col
=
120
;
if
(
ws_row
!=
NULL
)
*
ws_row
=
30
;
}
else
{
...
...
@@ -473,7 +473,7 @@ int32_t shellReadCommand(char *command) {
shellPositionCursorHome
(
&
cmd
);
break
;
case
3
:
printf
(
"
\n
"
);
printf
(
"
\
r\
n
"
);
shellResetCommand
(
&
cmd
,
""
);
#ifdef WINDOWS
raise
(
SIGINT
);
...
...
@@ -483,7 +483,7 @@ int32_t shellReadCommand(char *command) {
break
;
case
4
:
// EOF or Ctrl+D
taosResetTerminalMode
();
printf
(
"
\n
"
);
printf
(
"
\
r\
n
"
);
return
-
1
;
case
5
:
// ctrl E
shellPositionCursorEnd
(
&
cmd
);
...
...
@@ -495,7 +495,7 @@ int32_t shellReadCommand(char *command) {
case
'\r'
:
#ifdef WINDOWS
#else
printf
(
"
\n
"
);
printf
(
"
\
r\
n
"
);
#endif
if
(
shellIsReadyGo
(
&
cmd
))
{
sprintf
(
command
,
"%s%s"
,
cmd
.
buffer
,
cmd
.
command
);
...
...
tools/shell/src/shellEngine.c
浏览文件 @
c27476bd
...
...
@@ -180,7 +180,7 @@ void shellRunSingleCommandImp(char *command) {
}
if
(
shellRegexMatch
(
command
,
"^
\\
s*use
\\
s+[a-zA-Z0-9_]+
\\
s*;
\\
s*$"
,
REG_EXTENDED
|
REG_ICASE
))
{
fprintf
(
stdout
,
"Database changed.
\
n
\n
"
);
fprintf
(
stdout
,
"Database changed.
\
r\n\r
\n
"
);
fflush
(
stdout
);
taos_free_result
(
pSql
);
...
...
@@ -197,19 +197,19 @@ void shellRunSingleCommandImp(char *command) {
et
=
taosGetTimestampUs
();
if
(
error_no
==
0
)
{
printf
(
"Query OK, %d rows affected (%.6fs)
\n
"
,
numOfRows
,
(
et
-
st
)
/
1E6
);
printf
(
"Query OK, %d rows affected (%.6fs)
\
r\
n
"
,
numOfRows
,
(
et
-
st
)
/
1E6
);
}
else
{
printf
(
"Query interrupted (%s), %d rows affected (%.6fs)
\n
"
,
taos_errstr
(
pSql
),
numOfRows
,
(
et
-
st
)
/
1E6
);
printf
(
"Query interrupted (%s), %d rows affected (%.6fs)
\
r\
n
"
,
taos_errstr
(
pSql
),
numOfRows
,
(
et
-
st
)
/
1E6
);
}
taos_free_result
(
pSql
);
}
else
{
int32_t
num_rows_affacted
=
taos_affected_rows
(
pSql
);
taos_free_result
(
pSql
);
et
=
taosGetTimestampUs
();
printf
(
"Query OK, %d of %d rows affected (%.6fs)
\n
"
,
num_rows_affacted
,
num_rows_affacted
,
(
et
-
st
)
/
1E6
);
printf
(
"Query OK, %d of %d rows affected (%.6fs)
\
r\
n
"
,
num_rows_affacted
,
num_rows_affacted
,
(
et
-
st
)
/
1E6
);
}
printf
(
"
\n
"
);
printf
(
"
\
r\
n
"
);
}
char
*
shellFormatTimestamp
(
char
*
buf
,
int64_t
val
,
int32_t
precision
)
{
...
...
@@ -344,7 +344,7 @@ int32_t shellDumpResultToFile(const char *fname, TAOS_RES *tres) {
TdFilePtr
pFile
=
taosOpenFile
(
fullname
,
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_TRUNC
|
TD_FILE_STREAM
);
if
(
pFile
==
NULL
)
{
fprintf
(
stderr
,
"failed to open file: %s
\n
"
,
fullname
);
fprintf
(
stderr
,
"failed to open file: %s
\
r\
n
"
,
fullname
);
return
-
1
;
}
...
...
@@ -358,7 +358,7 @@ int32_t shellDumpResultToFile(const char *fname, TAOS_RES *tres) {
}
taosFprintfFile
(
pFile
,
"%s"
,
fields
[
col
].
name
);
}
taosFprintfFile
(
pFile
,
"
\n
"
);
taosFprintfFile
(
pFile
,
"
\
r\
n
"
);
int32_t
numOfRows
=
0
;
do
{
...
...
@@ -369,7 +369,7 @@ int32_t shellDumpResultToFile(const char *fname, TAOS_RES *tres) {
}
shellDumpFieldToFile
(
pFile
,
(
const
char
*
)
row
[
i
],
fields
+
i
,
length
[
i
],
precision
);
}
taosFprintfFile
(
pFile
,
"
\n
"
);
taosFprintfFile
(
pFile
,
"
\
r\
n
"
);
numOfRows
++
;
row
=
taos_fetch_row
(
tres
);
...
...
@@ -559,7 +559,7 @@ int32_t shellVerticalPrintResult(TAOS_RES *tres, const char *sql) {
int32_t
showMore
=
1
;
do
{
if
(
numOfRows
<
resShowMaxNum
)
{
printf
(
"*************************** %d.row ***************************
\n
"
,
numOfRows
+
1
);
printf
(
"*************************** %d.row ***************************
\
r\
n
"
,
numOfRows
+
1
);
int32_t
*
length
=
taos_fetch_lengths
(
tres
);
...
...
@@ -570,16 +570,17 @@ int32_t shellVerticalPrintResult(TAOS_RES *tres, const char *sql) {
printf
(
"%*.s%s: "
,
padding
,
" "
,
field
->
name
);
shellPrintField
((
const
char
*
)
row
[
i
],
field
,
0
,
length
[
i
],
precision
);
putchar
(
'\r'
);
putchar
(
'\n'
);
}
}
else
if
(
showMore
)
{
printf
(
"
\n
"
);
printf
(
" Notice: The result shows only the first %d rows.
\n
"
,
SHELL_DEFAULT_RES_SHOW_NUM
);
printf
(
" You can use the `LIMIT` clause to get fewer result to show.
\n
"
);
printf
(
" Or use '>>' to redirect the whole set of the result to a specified file.
\n
"
);
printf
(
"
\n
"
);
printf
(
" You can use Ctrl+C to stop the underway fetching.
\n
"
);
printf
(
"
\n
"
);
printf
(
"
\
r\
n
"
);
printf
(
" Notice: The result shows only the first %d rows.
\
r\
n
"
,
SHELL_DEFAULT_RES_SHOW_NUM
);
printf
(
" You can use the `LIMIT` clause to get fewer result to show.
\
r\
n
"
);
printf
(
" Or use '>>' to redirect the whole set of the result to a specified file.
\
r\
n
"
);
printf
(
"
\
r\
n
"
);
printf
(
" You can use Ctrl+C to stop the underway fetching.
\
r\
n
"
);
printf
(
"
\
r\
n
"
);
showMore
=
0
;
}
...
...
@@ -667,10 +668,12 @@ void shellPrintHeader(TAOS_FIELD *fields, int32_t *width, int32_t num_fields) {
rowWidth
+=
width
[
col
]
+
3
;
}
putchar
(
'\r'
);
putchar
(
'\n'
);
for
(
int32_t
i
=
0
;
i
<
rowWidth
;
i
++
)
{
putchar
(
'='
);
}
putchar
(
'\r'
);
putchar
(
'\n'
);
}
...
...
@@ -709,15 +712,16 @@ int32_t shellHorizontalPrintResult(TAOS_RES *tres, const char *sql) {
putchar
(
' '
);
putchar
(
'|'
);
}
putchar
(
'\r'
);
putchar
(
'\n'
);
}
else
if
(
showMore
)
{
printf
(
"
\n
"
);
printf
(
" Notice: The result shows only the first %d rows.
\n
"
,
SHELL_DEFAULT_RES_SHOW_NUM
);
printf
(
" You can use the `LIMIT` clause to get fewer result to show.
\n
"
);
printf
(
" Or use '>>' to redirect the whole set of the result to a specified file.
\n
"
);
printf
(
"
\n
"
);
printf
(
" You can use Ctrl+C to stop the underway fetching.
\n
"
);
printf
(
"
\n
"
);
printf
(
"
\
r\
n
"
);
printf
(
" Notice: The result shows only the first %d rows.
\
r\
n
"
,
SHELL_DEFAULT_RES_SHOW_NUM
);
printf
(
" You can use the `LIMIT` clause to get fewer result to show.
\
r\
n
"
);
printf
(
" Or use '>>' to redirect the whole set of the result to a specified file.
\
r\
n
"
);
printf
(
"
\
r\
n
"
);
printf
(
" You can use Ctrl+C to stop the underway fetching.
\
r\
n
"
);
printf
(
"
\
r\
n
"
);
showMore
=
0
;
}
...
...
@@ -794,7 +798,7 @@ void shellCleanupHistory() {
void
shellPrintError
(
TAOS_RES
*
tres
,
int64_t
st
)
{
int64_t
et
=
taosGetTimestampUs
();
fprintf
(
stderr
,
"
\
n
DB error: %s (%.6fs)
\n
"
,
taos_errstr
(
tres
),
(
et
-
st
)
/
1E6
);
fprintf
(
stderr
,
"
\
r\n
DB error: %s (%.6fs)
\r
\n
"
,
taos_errstr
(
tres
),
(
et
-
st
)
/
1E6
);
taos_free_result
(
tres
);
}
...
...
@@ -816,7 +820,7 @@ void shellSourceFile(const char *file) {
TdFilePtr
pFile
=
taosOpenFile
(
fullname
,
TD_FILE_READ
|
TD_FILE_STREAM
);
if
(
pFile
==
NULL
)
{
fprintf
(
stderr
,
"failed to open file %s
\n
"
,
fullname
);
fprintf
(
stderr
,
"failed to open file %s
\
r\
n
"
,
fullname
);
taosMemoryFree
(
cmd
);
return
;
}
...
...
@@ -837,7 +841,7 @@ void shellSourceFile(const char *file) {
}
memcpy
(
cmd
+
cmd_len
,
line
,
read_len
);
printf
(
"%s%s
\n
"
,
shell
.
info
.
promptHeader
,
cmd
);
printf
(
"%s%s
\
r\
n
"
,
shell
.
info
.
promptHeader
,
cmd
);
shellRunCommand
(
cmd
);
memset
(
cmd
,
0
,
TSDB_MAX_ALLOWED_SQL_LEN
);
cmd_len
=
0
;
...
...
@@ -851,7 +855,7 @@ void shellSourceFile(const char *file) {
void
shellGetGrantInfo
()
{
char
sinfo
[
1024
]
=
{
0
};
tstrncpy
(
sinfo
,
taos_get_server_info
(
shell
.
conn
),
sizeof
(
sinfo
));
strtok
(
sinfo
,
"
\n
"
);
strtok
(
sinfo
,
"
\
r\
n
"
);
char
sql
[]
=
"show grants"
;
...
...
@@ -860,25 +864,25 @@ void shellGetGrantInfo() {
int32_t
code
=
taos_errno
(
tres
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_OPS_NOT_SUPPORT
&&
code
!=
TSDB_CODE_MND_NO_RIGHTS
)
{
fprintf
(
stderr
,
"Failed to check Server Edition, Reason:0x%04x:%s
\
n
\n
"
,
code
,
taos_errstr
(
tres
));
fprintf
(
stderr
,
"Failed to check Server Edition, Reason:0x%04x:%s
\
r\n\r
\n
"
,
code
,
taos_errstr
(
tres
));
}
return
;
}
int32_t
num_fields
=
taos_field_count
(
tres
);
if
(
num_fields
==
0
)
{
fprintf
(
stderr
,
"
\
n
Invalid grant information.
\n
"
);
fprintf
(
stderr
,
"
\
r\n
Invalid grant information.
\r
\n
"
);
exit
(
0
);
}
else
{
if
(
tres
==
NULL
)
{
fprintf
(
stderr
,
"
\
n
Grant information is null.
\n
"
);
fprintf
(
stderr
,
"
\
r\n
Grant information is null.
\r
\n
"
);
exit
(
0
);
}
TAOS_FIELD
*
fields
=
taos_fetch_fields
(
tres
);
TAOS_ROW
row
=
taos_fetch_row
(
tres
);
if
(
row
==
NULL
)
{
fprintf
(
stderr
,
"
\
n
Failed to get grant information from server. Abort.
\n
"
);
fprintf
(
stderr
,
"
\
r\n
Failed to get grant information from server. Abort.
\r
\n
"
);
exit
(
0
);
}
...
...
@@ -891,17 +895,17 @@ void shellGetGrantInfo() {
memcpy
(
expired
,
row
[
2
],
fields
[
2
].
bytes
);
if
(
strcmp
(
serverVersion
,
"community"
)
==
0
)
{
fprintf
(
stdout
,
"Server is Community Edition.
\n
"
);
fprintf
(
stdout
,
"Server is Community Edition.
\
r\
n
"
);
}
else
if
(
strcmp
(
expiretime
,
"unlimited"
)
==
0
)
{
fprintf
(
stdout
,
"Server is Enterprise %s Edition, %s and will never expire.
\n
"
,
serverVersion
,
sinfo
);
fprintf
(
stdout
,
"Server is Enterprise %s Edition, %s and will never expire.
\
r\
n
"
,
serverVersion
,
sinfo
);
}
else
{
fprintf
(
stdout
,
"Server is Enterprise %s Edition, %s and will expire at %s.
\n
"
,
serverVersion
,
sinfo
,
expiretime
);
fprintf
(
stdout
,
"Server is Enterprise %s Edition, %s and will expire at %s.
\
r\
n
"
,
serverVersion
,
sinfo
,
expiretime
);
}
taos_free_result
(
tres
);
}
fprintf
(
stdout
,
"
\n
"
);
fprintf
(
stdout
,
"
\
r\
n
"
);
}
void
shellQueryInterruptHandler
(
int32_t
signum
,
void
*
sigInfo
,
void
*
context
)
{
tsem_post
(
&
shell
.
cancelSem
);
}
...
...
@@ -921,7 +925,7 @@ void *shellCancelHandler(void *arg) {
}
taosResetTerminalMode
();
printf
(
"
\
n
Receive SIGTERM or other signal, quit shell.
\n
"
);
printf
(
"
\
r\n
Receive SIGTERM or other signal, quit shell.
\r
\n
"
);
shellWriteHistory
();
shellExit
();
}
...
...
@@ -936,7 +940,7 @@ void *shellThreadLoop(void *arg) {
char
*
command
=
taosMemoryMalloc
(
SHELL_MAX_COMMAND_SIZE
);
if
(
command
==
NULL
)
{
printf
(
"failed to malloc command
\n
"
);
printf
(
"failed to malloc command
\
r\
n
"
);
return
NULL
;
}
...
...
@@ -979,7 +983,7 @@ int32_t shellExecute() {
if
(
pArgs
->
commands
!=
NULL
||
pArgs
->
file
[
0
]
!=
0
)
{
if
(
pArgs
->
commands
!=
NULL
)
{
printf
(
"%s%s
\n
"
,
shell
.
info
.
promptHeader
,
pArgs
->
commands
);
printf
(
"%s%s
\
r\
n
"
,
shell
.
info
.
promptHeader
,
pArgs
->
commands
);
char
*
cmd
=
strdup
(
pArgs
->
commands
);
shellRunCommand
(
cmd
);
taosMemoryFree
(
cmd
);
...
...
@@ -996,7 +1000,7 @@ int32_t shellExecute() {
}
if
(
tsem_init
(
&
shell
.
cancelSem
,
0
,
0
)
!=
0
)
{
printf
(
"failed to create cancel semphore
\n
"
);
printf
(
"failed to create cancel semphore
\
r\
n
"
);
return
-
1
;
}
...
...
tools/shell/src/shellNettest.c
浏览文件 @
c27476bd
...
...
@@ -34,7 +34,7 @@ static void shellWorkAsClient() {
clientRpc
=
rpcOpen
(
&
rpcInit
);
if
(
clientRpc
==
NULL
)
{
printf
(
"failed to init net test client since %s
\n
"
,
terrstr
());
printf
(
"failed to init net test client since %s
\
r\
n
"
,
terrstr
());
goto
_OVER
;
}
...
...
@@ -49,7 +49,7 @@ static void shellWorkAsClient() {
pArgs
->
port
=
tsServerPort
;
}
printf
(
"network test client is initialized, the server is %s:%u
\n
"
,
fqdn
,
pArgs
->
port
);
printf
(
"network test client is initialized, the server is %s:%u
\
r\
n
"
,
fqdn
,
pArgs
->
port
);
tstrncpy
(
epSet
.
eps
[
0
].
fqdn
,
fqdn
,
TSDB_FQDN_LEN
);
epSet
.
eps
[
0
].
port
=
(
uint16_t
)
pArgs
->
port
;
...
...
@@ -62,13 +62,13 @@ static void shellWorkAsClient() {
rpcMsg
.
pCont
=
rpcMallocCont
(
pArgs
->
pktLen
);
rpcMsg
.
contLen
=
pArgs
->
pktLen
;
printf
(
"request is sent, size:%d
\n
"
,
rpcMsg
.
contLen
);
printf
(
"request is sent, size:%d
\
r\
n
"
,
rpcMsg
.
contLen
);
rpcSendRecv
(
clientRpc
,
&
epSet
,
&
rpcMsg
,
&
rpcRsp
);
if
(
rpcRsp
.
code
==
0
&&
rpcRsp
.
contLen
==
rpcMsg
.
contLen
)
{
printf
(
"response is received, size:%d
\n
"
,
rpcMsg
.
contLen
);
printf
(
"response is received, size:%d
\
r\
n
"
,
rpcMsg
.
contLen
);
if
(
rpcRsp
.
code
==
0
)
totalSucc
++
;
}
else
{
printf
(
"response not received since %s
\n
"
,
tstrerror
(
rpcRsp
.
code
));
printf
(
"response not received since %s
\
r\
n
"
,
tstrerror
(
rpcRsp
.
code
));
}
rpcFreeCont
(
rpcRsp
.
pCont
);
...
...
@@ -78,7 +78,7 @@ static void shellWorkAsClient() {
uint64_t
endTime
=
taosGetTimestampUs
();
uint64_t
elT
=
endTime
-
startTime
;
printf
(
"
\
n
total succ:%5d/%d
\t
cost:%8.2lf ms
\t
speed:%8.2lf MB/s
\n
"
,
totalSucc
,
pArgs
->
pktNum
,
elT
/
1000
.
0
,
printf
(
"
\
r\n
total succ:%5d/%d
\t
cost:%8.2lf ms
\t
speed:%8.2lf MB/s
\r
\n
"
,
totalSucc
,
pArgs
->
pktNum
,
elT
/
1000
.
0
,
pArgs
->
pktLen
/
(
elT
/
1000000
.
0
)
/
1024
.
0
/
1024
.
0
*
totalSucc
);
_OVER:
...
...
@@ -91,7 +91,7 @@ _OVER:
}
static
void
shellProcessMsg
(
void
*
p
,
SRpcMsg
*
pRpc
,
SEpSet
*
pEpSet
)
{
printf
(
"request is received, size:%d
\n
"
,
pRpc
->
contLen
);
printf
(
"request is received, size:%d
\
r\
n
"
,
pRpc
->
contLen
);
fflush
(
stdout
);
SRpcMsg
rsp
=
{.
info
=
pRpc
->
info
,
.
code
=
0
};
rsp
.
pCont
=
rpcMallocCont
(
pRpc
->
contLen
);
...
...
@@ -124,9 +124,9 @@ static void shellWorkAsServer() {
void
*
serverRpc
=
rpcOpen
(
&
rpcInit
);
if
(
serverRpc
==
NULL
)
{
printf
(
"failed to init net test server since %s
\n
"
,
terrstr
());
printf
(
"failed to init net test server since %s
\
r\
n
"
,
terrstr
());
}
else
{
printf
(
"network test server is initialized, port:%u
\n
"
,
pArgs
->
port
);
printf
(
"network test server is initialized, port:%u
\
r\
n
"
,
pArgs
->
port
);
taosSetSignal
(
SIGTERM
,
shellNettestHandler
);
while
(
1
)
taosMsleep
(
10
);
}
...
...
tools/shell/src/shellUtil.c
浏览文件 @
c27476bd
...
...
@@ -40,7 +40,7 @@ bool shellRegexMatch(const char *s, const char *reg, int32_t cflags) {
return
false
;
}
else
{
regerror
(
reti
,
&
regex
,
msgbuf
,
sizeof
(
msgbuf
));
fprintf
(
stderr
,
"Regex match failed: %s
\n
"
,
msgbuf
);
fprintf
(
stderr
,
"Regex match failed: %s
\
r\
n
"
,
msgbuf
);
regfree
(
&
regex
);
shellExit
();
}
...
...
@@ -68,19 +68,19 @@ int32_t shellCheckIntSize() {
return
0
;
}
void
shellPrintVersion
()
{
printf
(
"version: %s
\n
"
,
version
);
}
void
shellPrintVersion
()
{
printf
(
"version: %s
\
r\
n
"
,
version
);
}
void
shellGenerateAuth
()
{
char
secretEncrypt
[
TSDB_PASSWORD_LEN
+
1
]
=
{
0
};
taosEncryptPass_c
((
uint8_t
*
)
shell
.
args
.
password
,
strlen
(
shell
.
args
.
password
),
secretEncrypt
);
printf
(
"%s
\n
"
,
secretEncrypt
);
printf
(
"%s
\
r\
n
"
,
secretEncrypt
);
fflush
(
stdout
);
}
void
shellDumpConfig
()
{
SConfig
*
pCfg
=
taosGetCfg
();
if
(
pCfg
==
NULL
)
{
printf
(
"TDengine read global config failed!
\n
"
);
printf
(
"TDengine read global config failed!
\
r\
n
"
);
}
else
{
cfgDumpCfg
(
pCfg
,
1
,
true
);
}
...
...
@@ -95,23 +95,23 @@ void shellCheckServerStatus() {
code
=
taos_check_server_status
(
shell
.
args
.
host
,
shell
.
args
.
port
,
details
,
1024
);
switch
(
code
)
{
case
TSDB_SRV_STATUS_UNAVAILABLE
:
printf
(
"0: unavailable
\n
"
);
printf
(
"0: unavailable
\
r\
n
"
);
break
;
case
TSDB_SRV_STATUS_NETWORK_OK
:
printf
(
"1: network ok
\n
"
);
printf
(
"1: network ok
\
r\
n
"
);
break
;
case
TSDB_SRV_STATUS_SERVICE_OK
:
printf
(
"2: service ok
\n
"
);
printf
(
"2: service ok
\
r\
n
"
);
break
;
case
TSDB_SRV_STATUS_SERVICE_DEGRADED
:
printf
(
"3: service degraded
\n
"
);
printf
(
"3: service degraded
\
r\
n
"
);
break
;
case
TSDB_SRV_STATUS_EXTING
:
printf
(
"4: exiting
\n
"
);
printf
(
"4: exiting
\
r\
n
"
);
break
;
}
if
(
strlen
(
details
)
!=
0
)
{
printf
(
"%s
\
n
\n
"
,
details
);
printf
(
"%s
\
r\n\r
\n
"
,
details
);
}
fflush
(
stdout
);
if
(
code
==
TSDB_SRV_STATUS_NETWORK_OK
&&
shell
.
args
.
is_startup
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录