Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
4351c4c8
TDengine
项目概览
taosdata
/
TDengine
接近 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
4351c4c8
编写于
1月 18, 2022
作者:
S
shenglian-zhou
提交者:
GitHub
1月 18, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #9813 from taosdata/fix/TD-12945
[TD-12945]<fix>(query): taos shell crash when constant comparison cause crash
上级
c1f241cc
d6c5dc3d
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
1452 addition
and
181 deletion
+1452
-181
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+13
-1
src/common/src/tarithoperator.c
src/common/src/tarithoperator.c
+183
-179
src/query/src/qSqlParser.c
src/query/src/qSqlParser.c
+115
-1
tests/develop-test/2-query/constant_compare.py
tests/develop-test/2-query/constant_compare.py
+1140
-0
tests/develop-test/fulltest-query.sh
tests/develop-test/fulltest-query.sh
+1
-0
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
4351c4c8
...
...
@@ -2431,7 +2431,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
if
(
pTableMeta
->
tableType
!=
TSDB_TEMP_TABLE
)
{
tscInsertPrimaryTsSourceColumn
(
pQueryInfo
,
pTableMeta
->
id
.
uid
);
}
}
else
if
(
tokenId
==
TK_STRING
||
tokenId
==
TK_INTEGER
||
tokenId
==
TK_FLOAT
)
{
// simple column projection query
}
else
if
(
tokenId
==
TK_STRING
||
tokenId
==
TK_INTEGER
||
tokenId
==
TK_FLOAT
||
tokenId
==
TK_BOOL
)
{
// simple column projection query
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
// user-specified constant value as a new result column
...
...
@@ -4659,6 +4659,7 @@ static int32_t validateSQLExprItemArithmeticExpr(SSqlCmd* pCmd, tSqlExpr* pExpr,
int32_t
rightType
=
SQLEXPR_TYPE_UNASSIGNED
;
const
char
*
msg1
=
"arithmetic expression composed with columns from different tables"
;
const
char
*
msg2
=
"arithmetic expression composed with functions/columns of different types"
;
const
char
*
msg3
=
"comparison/logical expression involving string operands is not supported"
;
int32_t
leftHeight
=
0
;
int32_t
ret
=
validateSQLExprItem
(
pCmd
,
pExpr
->
pLeft
,
pQueryInfo
,
pList
,
&
leftType
,
&
uidLeft
,
&
leftHeight
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -4691,6 +4692,17 @@ static int32_t validateSQLExprItemArithmeticExpr(SSqlCmd* pCmd, tSqlExpr* pExpr,
}
else
if
(
leftType
==
SQLEXPR_TYPE_SCALAR
||
rightType
==
SQLEXPR_TYPE_SCALAR
){
*
type
=
SQLEXPR_TYPE_SCALAR
;
}
// comparison/logical operations
if
(
pExpr
->
tokenId
==
TK_EQ
||
pExpr
->
tokenId
==
TK_NE
||
pExpr
->
tokenId
==
TK_GT
||
pExpr
->
tokenId
==
TK_GE
||
pExpr
->
tokenId
==
TK_LT
||
pExpr
->
tokenId
==
TK_LE
||
pExpr
->
tokenId
==
TK_AND
||
pExpr
->
tokenId
==
TK_OR
)
{
if
((
leftType
==
SQLEXPR_TYPE_VALUE
&&
pExpr
->
pLeft
->
tokenId
==
TK_STRING
)
||
(
rightType
==
SQLEXPR_TYPE_VALUE
&&
pExpr
->
pRight
->
tokenId
==
TK_STRING
))
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
}
}
return
TSDB_CODE_SUCCESS
;
}
...
...
src/common/src/tarithoperator.c
浏览文件 @
4351c4c8
...
...
@@ -217,6 +217,7 @@ void vectorAdd(void *left, int32_t len1, int32_t _left_type, void *right, int32_
}
}
}
void
vectorSub
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
...
...
@@ -252,6 +253,7 @@ void vectorSub(void *left, int32_t len1, int32_t _left_type, void *right, int32_
}
}
}
void
vectorMultiply
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
...
...
@@ -287,6 +289,7 @@ void vectorMultiply(void *left, int32_t len1, int32_t _left_type, void *right, i
}
}
}
void
vectorDivide
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
...
...
@@ -340,6 +343,7 @@ void vectorDivide(void *left, int32_t len1, int32_t _left_type, void *right, int
}
}
}
void
vectorRemainder
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
(
_ord
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
(
_ord
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
...
...
src/query/src/qSqlParser.c
浏览文件 @
4351c4c8
...
...
@@ -18,6 +18,7 @@
#include "taosdef.h"
#include "taosmsg.h"
#include "tcmdtype.h"
#include "tcompare.h"
#include "tstrbuild.h"
#include "ttoken.h"
#include "ttokendef.h"
...
...
@@ -318,12 +319,17 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
}
if
((
pLeft
!=
NULL
&&
pRight
!=
NULL
)
&&
(
optrType
==
TK_PLUS
||
optrType
==
TK_MINUS
||
optrType
==
TK_STAR
||
optrType
==
TK_DIVIDE
||
optrType
==
TK_REM
))
{
(
optrType
==
TK_PLUS
||
optrType
==
TK_MINUS
||
optrType
==
TK_STAR
||
optrType
==
TK_DIVIDE
||
optrType
==
TK_REM
||
optrType
==
TK_EQ
||
optrType
==
TK_NE
||
optrType
==
TK_LT
||
optrType
==
TK_GT
||
optrType
==
TK_LE
||
optrType
==
TK_GE
||
optrType
==
TK_AND
||
optrType
==
TK_OR
))
{
/*
* if a exprToken is noted as the TK_TIMESTAMP, the time precision is microsecond
* Otherwise, the time precision is adaptive, determined by the time precision from databases.
*/
if
((
pLeft
->
tokenId
==
TK_INTEGER
&&
pRight
->
tokenId
==
TK_INTEGER
)
||
(
pLeft
->
tokenId
==
TK_BOOL
&&
pRight
->
tokenId
==
TK_BOOL
)
||
(
pLeft
->
tokenId
==
TK_INTEGER
&&
pRight
->
tokenId
==
TK_BOOL
)
||
(
pLeft
->
tokenId
==
TK_BOOL
&&
pRight
->
tokenId
==
TK_INTEGER
)
||
(
pLeft
->
tokenId
==
TK_TIMESTAMP
&&
pRight
->
tokenId
==
TK_TIMESTAMP
))
{
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pExpr
->
tokenId
=
pLeft
->
tokenId
;
...
...
@@ -360,12 +366,46 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
pExpr
->
value
.
i64
=
pLeft
->
value
.
i64
%
pRight
->
value
.
i64
;
break
;
}
case
TK_EQ
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
==
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
case
TK_NE
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
!=
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
case
TK_LT
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
<
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
case
TK_GT
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
>
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
case
TK_LE
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
<=
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
case
TK_GE
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
>=
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
case
TK_AND
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
&&
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
case
TK_OR
:
{
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
||
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
}
}
tSqlExprDestroy
(
pLeft
);
tSqlExprDestroy
(
pRight
);
}
else
if
((
pLeft
->
tokenId
==
TK_FLOAT
&&
pRight
->
tokenId
==
TK_INTEGER
)
||
(
pLeft
->
tokenId
==
TK_INTEGER
&&
pRight
->
tokenId
==
TK_FLOAT
)
||
(
pLeft
->
tokenId
==
TK_BOOL
&&
pRight
->
tokenId
==
TK_FLOAT
)
||
(
pLeft
->
tokenId
==
TK_FLOAT
&&
pRight
->
tokenId
==
TK_BOOL
)
||
(
pLeft
->
tokenId
==
TK_FLOAT
&&
pRight
->
tokenId
==
TK_FLOAT
))
{
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
tokenId
=
TK_FLOAT
;
...
...
@@ -395,6 +435,80 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
pExpr
->
value
.
dKey
=
left
-
((
int64_t
)(
left
/
right
))
*
right
;
break
;
}
case
TK_EQ
:
{
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
if
(
compareDoubleVal
(
&
left
,
&
right
)
==
0
)
{
pExpr
->
value
.
i64
=
1
;
}
else
{
pExpr
->
value
.
i64
=
0
;
}
break
;
}
case
TK_NE
:
{
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
if
(
compareDoubleVal
(
&
left
,
&
right
)
!=
0
)
{
pExpr
->
value
.
i64
=
1
;
}
else
{
pExpr
->
value
.
i64
=
0
;
}
break
;
}
case
TK_LT
:
{
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
if
(
compareDoubleVal
(
&
left
,
&
right
)
==
-
1
)
{
pExpr
->
value
.
i64
=
1
;
}
else
{
pExpr
->
value
.
i64
=
0
;
}
break
;
}
case
TK_GT
:
{
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
if
(
compareDoubleVal
(
&
left
,
&
right
)
==
1
)
{
pExpr
->
value
.
i64
=
1
;
}
else
{
pExpr
->
value
.
i64
=
0
;
}
break
;
}
case
TK_LE
:
{
int32_t
res
=
compareDoubleVal
(
&
left
,
&
right
);
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
if
(
res
==
0
||
res
==
-
1
)
{
pExpr
->
value
.
i64
=
1
;
}
else
{
pExpr
->
value
.
i64
=
0
;
}
break
;
}
case
TK_GE
:
{
int32_t
res
=
compareDoubleVal
(
&
left
,
&
right
);
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
if
(
res
==
0
||
res
==
1
)
{
pExpr
->
value
.
i64
=
1
;
}
else
{
pExpr
->
value
.
i64
=
0
;
}
break
;
}
case
TK_AND
:
{
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pExpr
->
value
.
i64
=
(
left
&&
right
)
?
1
:
0
;
break
;
}
case
TK_OR
:
{
pExpr
->
tokenId
=
TK_INTEGER
;
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pExpr
->
value
.
i64
=
(
left
||
right
)
?
1
:
0
;
break
;
}
}
tSqlExprDestroy
(
pLeft
);
...
...
tests/develop-test/2-query/constant_compare.py
0 → 100644
浏览文件 @
4351c4c8
###################################################################
# Copyright (c) 2021 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import
sys
from
util.log
import
*
from
util.cases
import
*
from
util.sql
import
*
class
TDTestCase
:
def
caseDescription
(
self
):
'''
case1<Ganlin Zhao>: [TD-12945] : taos shell crash when constant comparison cause crash
'''
return
def
init
(
self
,
conn
,
logSql
):
tdLog
.
debug
(
"start to execute %s"
%
__file__
)
tdSql
.
init
(
conn
.
cursor
(),
logSql
)
def
getBuildPath
(
self
):
selfPath
=
os
.
path
.
dirname
(
os
.
path
.
realpath
(
__file__
))
if
(
"community"
in
selfPath
):
projPath
=
selfPath
[:
selfPath
.
find
(
"community"
)]
else
:
projPath
=
selfPath
[:
selfPath
.
find
(
"tests"
)]
for
root
,
dirs
,
files
in
os
.
walk
(
projPath
):
if
(
"taosd"
in
files
):
rootRealPath
=
os
.
path
.
dirname
(
os
.
path
.
realpath
(
root
))
if
(
"packaging"
not
in
rootRealPath
):
buildPath
=
root
[:
len
(
root
)
-
len
(
"/build/bin"
)]
break
return
buildPath
def
run
(
self
):
print
(
"running {}"
.
format
(
__file__
))
tdSql
.
execute
(
"drop database if exists db"
)
tdSql
.
execute
(
"create database if not exists db"
)
tdSql
.
execute
(
'use db'
)
#Prepare data
tdSql
.
execute
(
"create table tb (ts timestamp, value int);"
)
tdSql
.
execute
(
"insert into tb values (now, 123);"
)
##operator: =
tdSql
.
query
(
'select 1 = 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 = 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 = 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 = 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 = 1.0001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 = 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 = 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 = 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 = 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 = 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 = true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 = false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 = false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 = true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 = true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 = false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 = false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 = true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true = 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true = 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
error
(
'select "abc" = "def" from tb;'
)
tdSql
.
error
(
'select "abc" = 1 from tb;'
)
tdSql
.
error
(
'select 1 = "abc" from tb;'
)
tdSql
.
error
(
'select "abc" = 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 = "abc" from tb;'
)
tdSql
.
error
(
'select "abc" = true from tb;'
)
tdSql
.
error
(
'select false = "abc" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
=
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
= 1 from tb;'
)
tdSql
.
error
(
'select 1 =
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
= 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 =
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
= true from tb;'
)
tdSql
.
error
(
'select false =
\'
abc
\'
from tb;'
)
##operator: !=
tdSql
.
query
(
'select 1 != 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 != 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 != 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 1.0001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 != 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 != 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 != 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 != 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 != true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 != false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 != false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 != true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 != true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 != false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 != false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 != true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true != 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true != 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
error
(
'select "abc" != "def" from tb;'
)
tdSql
.
error
(
'select "abc" != 1 from tb;'
)
tdSql
.
error
(
'select 1 != "abc" from tb;'
)
tdSql
.
error
(
'select "abc" != 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 != "abc" from tb;'
)
tdSql
.
error
(
'select "abc" != true from tb;'
)
tdSql
.
error
(
'select false != "abc" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
!=
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
!= 1 from tb;'
)
tdSql
.
error
(
'select 1 !=
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
!= 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 !=
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
!= true from tb;'
)
tdSql
.
error
(
'select false !=
\'
abc
\'
from tb;'
)
##operator: <>
tdSql
.
query
(
'select 1 <> 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 <> 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <> 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 <> 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <> 1.0001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <> 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 <> 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 <> 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <> 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <> 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 <> true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 <> false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 <> false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 <> true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <> true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 <> false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 <> false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 <> true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true <> 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true <> 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
error
(
'select "abc" <> "def" from tb;'
)
tdSql
.
error
(
'select "abc" <> 1 from tb;'
)
tdSql
.
error
(
'select 1 <> "abc" from tb;'
)
tdSql
.
error
(
'select "abc" <> 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 <> "abc" from tb;'
)
tdSql
.
error
(
'select "abc" <> true from tb;'
)
tdSql
.
error
(
'select false <> "abc" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<>
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<> 1 from tb;'
)
tdSql
.
error
(
'select 1 <>
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<> 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 <>
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<> true from tb;'
)
tdSql
.
error
(
'select false <>
\'
abc
\'
from tb;'
)
##operator: <
tdSql
.
query
(
'select 1 < 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 < 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 < 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 < 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 < 1.0001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 < 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 < 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 < 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 < 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 < 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 < true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 < false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select false < true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true < false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 < true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 < false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select false < 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 < true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true < 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true < 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
error
(
'select "abc" < "def" from tb;'
)
tdSql
.
error
(
'select "abc" < 1 from tb;'
)
tdSql
.
error
(
'select 1 < "abc" from tb;'
)
tdSql
.
error
(
'select "abc" < 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 < "abc" from tb;'
)
tdSql
.
error
(
'select "abc" < true from tb;'
)
tdSql
.
error
(
'select false < "abc" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
< 1 from tb;'
)
tdSql
.
error
(
'select 1 <
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
< 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 <
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
< true from tb;'
)
tdSql
.
error
(
'select false <
\'
abc
\'
from tb;'
)
##operator: >
tdSql
.
query
(
'select 1 > 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 > 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 > 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 > 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0001 > 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 > 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 > 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 > 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.001 > 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0000000001 > 1.0 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 > false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 > true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select false > true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true > false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 > true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 > false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 > false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true > 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.001 > true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0000000001 > true from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
error
(
'select "abc" > "def" from tb;'
)
tdSql
.
error
(
'select "abc" > 1 from tb;'
)
tdSql
.
error
(
'select 1 > "abc" from tb;'
)
tdSql
.
error
(
'select "abc" > 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 > "abc" from tb;'
)
tdSql
.
error
(
'select "abc" > true from tb;'
)
tdSql
.
error
(
'select false > "abc" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
>
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
> 1 from tb;'
)
tdSql
.
error
(
'select 1 >
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
> 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 >
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
> true from tb;'
)
tdSql
.
error
(
'select false >
\'
abc
\'
from tb;'
)
##operator: <=
tdSql
.
query
(
'select 1 <= 2 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <= 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <= 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 <= 2.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <= 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <= 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 <= 1.0001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <= 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <= 2.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <= 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <= 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 <= 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <= 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 <= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 <= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select false <= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true <= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true <= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select false <= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 <= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 <= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select false <= 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 <= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true <= 1.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true <= 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
error
(
'select "abc" <= "def" from tb;'
)
tdSql
.
error
(
'select "abc" <= 1 from tb;'
)
tdSql
.
error
(
'select 1 <= "abc" from tb;'
)
tdSql
.
error
(
'select "abc" <= 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 <= "abc" from tb;'
)
tdSql
.
error
(
'select "abc" <= true from tb;'
)
tdSql
.
error
(
'select false <= "abc" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<=
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<= 1 from tb;'
)
tdSql
.
error
(
'select 1 <=
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<= 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 <=
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
<= true from tb;'
)
tdSql
.
error
(
'select false <=
\'
abc
\'
from tb;'
)
##operator: >=
tdSql
.
query
(
'select 1 >= 2 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 >= 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 >= 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 >= 2.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 >= 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 >= 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0001 >= 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 >= 1.0000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 >= 2.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 >= 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 >= 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.001 >= 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0000000001 >= 1.0 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 >= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 >= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select false >= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true >= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select false >= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true >= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 >= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 >= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 >= false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true >= 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.001 >= true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0000000001 >= true from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
error
(
'select "abc" >= "def" from tb;'
)
tdSql
.
error
(
'select "abc" >= 1 from tb;'
)
tdSql
.
error
(
'select 1 >= "abc" from tb;'
)
tdSql
.
error
(
'select "abc" >= 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 >= "abc" from tb;'
)
tdSql
.
error
(
'select "abc" >= true from tb;'
)
tdSql
.
error
(
'select false >= "abc" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
>=
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
>= 1 from tb;'
)
tdSql
.
error
(
'select 1 >=
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
>= 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 >=
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
>= true from tb;'
)
tdSql
.
error
(
'select false >=
\'
abc
\'
from tb;'
)
##operator: between and
tdSql
.
query
(
'select 1 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 3 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 2 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 4 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 between 2.0 and 4.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1.0 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 3 between 2.0 and 4.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 3.0 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 2 between 2.0 and 4.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 4 between 2.0 and 4.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 2.0 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 4.0 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 2.0001 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 2.0000000001 between 2 and 4 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 2 between 2.0001 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 2 between 2.000000001 and 4 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 4 between 2 and 4.0001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 4 between 2 and 4.000000001 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 4.0001 between 2 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 4.000000001 between 2 and 4 from tb;'
)
##DBL_EPSILON is used in floating number comparison
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select false between 0 and 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select false between 1 and 2 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true between 0 and 1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true between -1 and 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select false between 0.0 and 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select false between 1.0 and 2.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true between 0.0 and 1.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true between -1.0 and 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 between false and true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 between false and true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 between false and 10 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 between true and 10 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 between false and true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1.0 between false and true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 between false and 10.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 between true and 10.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
error
(
'select "abc" between "def" and "ghi" from tb;'
)
tdSql
.
error
(
'select "abc" between 1 and 2 from tb;'
)
tdSql
.
error
(
'select "abc" between 1.0 and 2.0 from tb;'
)
tdSql
.
error
(
'select "abc" between true and false from tb;'
)
tdSql
.
error
(
'select 1 between 1.0 and "cde" from tb;'
)
tdSql
.
error
(
'select 1.0 between true and "cde" from tb;'
)
tdSql
.
error
(
'select true between 1 and "cde" from tb;'
)
tdSql
.
error
(
'select 1 between "abc" and 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 between "abc" and true from tb;'
)
tdSql
.
error
(
'select true between "abc" and 1 from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
between
\'
def
\'
and
\'
ghi
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
between 1 and 2 from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
between 1.0 and 2.0 from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
between true and false from tb;'
)
tdSql
.
error
(
'select 1 between 1.0 and
\'
cde
\'
from tb;'
)
tdSql
.
error
(
'select 1.0 between true and
\'
cde
\'
from tb;'
)
tdSql
.
error
(
'select true between 1 and
\'
cde
\'
from tb;'
)
tdSql
.
error
(
'select 1 between
\'
abc
\'
and 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 between
\'
abc
\'
and true from tb;'
)
tdSql
.
error
(
'select true between
\'
abc
\'
and 1 from tb;'
)
##operator: and
tdSql
.
query
(
'select 10 and 10 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 10.0 and 10 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 10.0 and 10.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 10 and 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 10.0 and 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 10.0 and 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 10.0 and 0.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 10.0 and 0.000000000000000001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true and 10 and false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true and 10.0 and false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 and 2 and 3 and 10.1 and -20.02 and 22.03 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 and 2 and 3 and 0 and 20.02 and 22.03 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 and 2 and 3 and 0.0 and 20.02 and 22.03 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
error
(
'select "abc" and "def" from tb;'
)
tdSql
.
error
(
'select "abc" and 1 from tb;'
)
tdSql
.
error
(
'select 1 and "abc" from tb;'
)
tdSql
.
error
(
'select "abc" and 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 and abc from tb;'
)
tdSql
.
error
(
'select "abc" and true from tb;'
)
tdSql
.
error
(
'select false and "abc" from tb;'
)
tdSql
.
error
(
'select 1 and "abc" and 1.0 and true and false and 0 from tb;'
)
tdSql
.
error
(
'select 1 and "abc" and 1.0 and "cde" and false and 0 from tb;'
)
tdSql
.
error
(
'select 1 and "abc" and 1.0 and "cde" and false and "fhi" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
and
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
and 1 from tb;'
)
tdSql
.
error
(
'select 1 and
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
and 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 and abc from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
and true from tb;'
)
tdSql
.
error
(
'select false and
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select 1 and
\'
abc
\'
and 1.0 and true and false and 0 from tb;'
)
tdSql
.
error
(
'select 1 and
\'
abc
\'
and 1.0 and
\'
cde
\'
and false and "fhi" from tb;'
)
##operator: or
tdSql
.
query
(
'select 10 or 10 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 10.0 or 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 10 or 0.0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 or 0 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0.0 or 0.001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0.0 or 0.000000000000000001 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 or 2 or 3 or 0.0 or -20.02 or 22.03 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 or 0.0 or 0.00 or 0.000 or 0.0000 or 0.00000 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select true or 10 or false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select true or 10.0 or false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
error
(
'select "abc" or "def" from tb;'
)
tdSql
.
error
(
'select "abc" or 1 from tb;'
)
tdSql
.
error
(
'select 1 or "abc" from tb;'
)
tdSql
.
error
(
'select "abc" or 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 or abc from tb;'
)
tdSql
.
error
(
'select "abc" or true from tb;'
)
tdSql
.
error
(
'select false or "abc" from tb;'
)
tdSql
.
error
(
'select 1 or "abc" or 1.0 or true or false or 0 from tb;'
)
tdSql
.
error
(
'select 1 or "abc" or 1.0 or "cde" or false or 0 from tb;'
)
tdSql
.
error
(
'select 1 or "abc" or 1.0 or "cde" or false or "fhi" from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
or
\'
def
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
or 1 from tb;'
)
tdSql
.
error
(
'select 1 or
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
or 1.0 from tb;'
)
tdSql
.
error
(
'select 1.0 or abc from tb;'
)
tdSql
.
error
(
'select
\'
abc
\'
or true from tb;'
)
tdSql
.
error
(
'select false or
\'
abc
\'
from tb;'
)
tdSql
.
error
(
'select 1 or
\'
abc
\'
or 1.0 or true or false or 0 from tb;'
)
tdSql
.
error
(
'select 1 or
\'
abc
\'
or 1.0 or
\'
cde
\'
or false or "fhi" from tb;'
)
##operator: multiple operations
tdSql
.
query
(
'select 1 and 1 != 2 and 1 < 2 and 2 between 1 and 3 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 or 1 = 2 or 1 >= 2 or 2 between 3 and 5 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 and 1 != 2 and 1 < 2 and 2 between 1 and 3 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 or 1 = 2 or 1 >= 2 or 2 between 3 and 5 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 2 and 1 < 2 and 1 >= 2 and 2 between 1 and 3 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 = 2 or 1 >= 2 or 1<>3 or 2 between 3 and 5 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 0 or 1 != 2 and 1 <= 2 and 2 between 3 and 4 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 0 or 1 = 2 and 1 <= 2 and 2 between 3 and 5 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
0
)
tdSql
.
query
(
'select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 or true from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 and false from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 and true and 10.1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
query
(
'select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 and false or 10.1 from tb;'
)
tdSql
.
checkRows
(
1
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
error
(
'select 1 != 2 and "abc" or 1 >= 2 or "cde" between 4 and 5 and
\'
ghi
\'
or 10.1 from tb;'
)
tdSql
.
error
(
'select 1 != 2 and 1 < 2 or
\'
abc123
\'
or 2 between
\'
abc123
\'
and 5 and false or "abc123" from tb;'
)
tdSql
.
error
(
'select
\'
1234
\'
or 1 < 2 or
\'
aace
\'
and "cde" between 4 and "def" and "ckas" or 10.1 from tb;'
)
tdSql
.
execute
(
'drop database db'
)
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
"%s successfully executed"
%
__file__
)
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
tests/develop-test/fulltest-query.sh
浏览文件 @
4351c4c8
...
...
@@ -2,6 +2,7 @@ python3 ./test.py -f 2-query/ts_hidden_column.py
python3 ./test.py
-f
2-query/union-order.py
python3 ./test.py
-f
2-query/session_two_stage.py
python3 ./test.py
-f
2-query/timeline_agg_func_groupby.py
python3 ./test.py
-f
2-query/constant_compare.py
python3 ./test.py
-f
2-query/ts_2016.py
python3 ./test.py
-f
2-query/function_mavg.py
python3 ./test.py
-f
2-query/escape.py
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录