Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
89b2a644
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看板
提交
89b2a644
编写于
6月 06, 2022
作者:
wmmhello
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: fix error in json and add test cases for json
上级
5d042b67
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
136 addition
and
90 deletion
+136
-90
source/libs/scalar/src/sclvector.c
source/libs/scalar/src/sclvector.c
+100
-89
tests/system-test/2-query/json_tag.py
tests/system-test/2-query/json_tag.py
+36
-1
未找到文件。
source/libs/scalar/src/sclvector.c
浏览文件 @
89b2a644
...
...
@@ -88,7 +88,7 @@ void convertNumberToNumber(const void *inData, void *outData, int8_t inType, int
}
}
void
convert
StringToDouble
(
const
void
*
inData
,
void
*
outData
,
int8_t
inType
,
int8_t
outType
){
void
convert
NcharToDouble
(
const
void
*
inData
,
void
*
outData
){
char
*
tmp
=
taosMemoryMalloc
(
varDataTLen
(
inData
));
int
len
=
taosUcs4ToMbs
((
TdUcs4
*
)
varDataVal
(
inData
),
varDataLen
(
inData
),
tmp
);
if
(
len
<
0
)
{
...
...
@@ -97,13 +97,24 @@ void convertStringToDouble(const void *inData, void *outData, int8_t inType, int
tmp
[
len
]
=
0
;
ASSERT
(
outType
==
TSDB_DATA_TYPE_DOUBLE
);
double
value
=
taosStr2Double
(
tmp
,
NULL
);
*
((
double
*
)
outData
)
=
value
;
taosMemoryFreeClear
(
tmp
);
}
void
convertBinaryToDouble
(
const
void
*
inData
,
void
*
outData
){
char
*
tmp
=
taosMemoryCalloc
(
1
,
varDataTLen
(
inData
));
if
(
tmp
==
NULL
){
*
((
double
*
)
outData
)
=
0
.;
return
;
}
memcpy
(
tmp
,
varDataVal
(
inData
),
varDataLen
(
inData
));
double
ret
=
taosStr2Double
(
tmp
,
NULL
);
taosMemoryFree
(
tmp
);
*
((
double
*
)
outData
)
=
ret
;
}
typedef
int64_t
(
*
_getBigintValue_fn_t
)(
void
*
src
,
int32_t
index
);
int64_t
getVectorBigintValue_TINYINT
(
void
*
src
,
int32_t
index
)
{
...
...
@@ -147,7 +158,7 @@ int64_t getVectorBigintValue_JSON(void *src, int32_t index){
if
(
*
data
==
TSDB_DATA_TYPE_NULL
){
return
0
;
}
else
if
(
*
data
==
TSDB_DATA_TYPE_NCHAR
)
{
// json inner type can not be BINARY
convert
StringToDouble
(
data
+
CHAR_BYTES
,
&
out
,
*
data
,
TSDB_DATA_TYPE_DOUBLE
);
convert
NcharToDouble
(
data
+
CHAR_BYTES
,
&
out
);
}
else
{
convertNumberToNumber
(
data
+
CHAR_BYTES
,
&
out
,
*
data
,
TSDB_DATA_TYPE_DOUBLE
);
}
...
...
@@ -445,14 +456,30 @@ double getVectorDoubleValue_JSON(void *src, int32_t index){
if
(
*
data
==
TSDB_DATA_TYPE_NULL
){
return
out
;
}
else
if
(
*
data
==
TSDB_DATA_TYPE_NCHAR
)
{
// json inner type can not be BINARY
convert
StringToDouble
(
data
+
CHAR_BYTES
,
&
out
,
*
data
,
TSDB_DATA_TYPE_DOUBLE
);
convert
NcharToDouble
(
data
+
CHAR_BYTES
,
&
out
);
}
else
{
convertNumberToNumber
(
data
+
CHAR_BYTES
,
&
out
,
*
data
,
TSDB_DATA_TYPE_DOUBLE
);
}
return
out
;
}
bool
convertJsonValue
(
__compar_fn_t
*
fp
,
int32_t
optr
,
int8_t
typeLeft
,
int8_t
typeRight
,
char
**
pLeftData
,
char
**
pRightData
,
void
*
pLeftOut
,
void
*
pRightOut
,
bool
*
isNull
){
void
*
ncharTobinary
(
void
*
buf
){
// todo need to remove , if tobinary is nchar
int32_t
inputLen
=
varDataLen
(
buf
);
void
*
t
=
taosMemoryCalloc
(
1
,
inputLen
);
int32_t
len
=
taosUcs4ToMbs
((
TdUcs4
*
)
varDataVal
(
buf
),
varDataLen
(
buf
),
varDataVal
(
t
));
if
(
len
<
0
)
{
sclError
(
"charset:%s to %s. val:%s convert ncharTobinary failed."
,
DEFAULT_UNICODE_ENCODEC
,
tsCharset
,
(
char
*
)
varDataVal
(
buf
));
taosMemoryFree
(
t
);
return
NULL
;
}
varDataSetLen
(
t
,
len
);
return
t
;
}
bool
convertJsonValue
(
__compar_fn_t
*
fp
,
int32_t
optr
,
int8_t
typeLeft
,
int8_t
typeRight
,
char
**
pLeftData
,
char
**
pRightData
,
void
*
pLeftOut
,
void
*
pRightOut
,
bool
*
isNull
,
bool
*
freeLeft
,
bool
*
freeRight
){
if
(
optr
==
OP_TYPE_JSON_CONTAINS
)
{
return
true
;
}
...
...
@@ -489,21 +516,41 @@ bool convertJsonValue(__compar_fn_t *fp, int32_t optr, int8_t typeLeft, int8_t t
*
fp
=
filterGetCompFunc
(
type
,
optr
);
if
(
typeLeft
==
TSDB_DATA_TYPE_NCHAR
)
{
convertStringToDouble
(
*
pLeftData
,
pLeftOut
,
typeLeft
,
type
);
*
pLeftData
=
pLeftOut
;
}
else
if
(
typeLeft
!=
type
)
{
convertNumberToNumber
(
*
pLeftData
,
pLeftOut
,
typeLeft
,
type
);
*
pLeftData
=
pLeftOut
;
if
(
IS_NUMERIC_TYPE
(
type
)
||
IS_FLOAT_TYPE
(
type
)){
if
(
typeLeft
==
TSDB_DATA_TYPE_NCHAR
)
{
convertNcharToDouble
(
*
pLeftData
,
pLeftOut
);
*
pLeftData
=
pLeftOut
;
}
else
if
(
typeLeft
==
TSDB_DATA_TYPE_BINARY
)
{
convertBinaryToDouble
(
*
pLeftData
,
pLeftOut
);
*
pLeftData
=
pLeftOut
;
}
else
if
(
typeLeft
!=
type
)
{
convertNumberToNumber
(
*
pLeftData
,
pLeftOut
,
typeLeft
,
type
);
*
pLeftData
=
pLeftOut
;
}
if
(
typeRight
==
TSDB_DATA_TYPE_NCHAR
)
{
convertNcharToDouble
(
*
pRightData
,
pRightOut
);
*
pRightData
=
pRightOut
;
}
else
if
(
typeRight
==
TSDB_DATA_TYPE_BINARY
)
{
convertBinaryToDouble
(
*
pRightData
,
pRightOut
);
*
pRightData
=
pRightOut
;
}
else
if
(
typeRight
!=
type
)
{
convertNumberToNumber
(
*
pRightData
,
pRightOut
,
typeRight
,
type
);
*
pRightData
=
pRightOut
;
}
}
else
if
(
type
==
TSDB_DATA_TYPE_BINARY
){
if
(
typeLeft
==
TSDB_DATA_TYPE_NCHAR
){
*
pLeftData
=
ncharTobinary
(
*
pLeftData
);
*
freeLeft
=
true
;
}
if
(
typeRight
==
TSDB_DATA_TYPE_NCHAR
){
*
pRightData
=
ncharTobinary
(
*
pRightData
);
*
freeRight
=
true
;
}
}
else
{
ASSERT
(
0
);
}
if
(
typeRight
==
TSDB_DATA_TYPE_NCHAR
)
{
convertStringToDouble
(
*
pRightData
,
pRightOut
,
typeRight
,
type
);
*
pRightData
=
pRightOut
;
}
else
if
(
typeRight
!=
type
)
{
convertNumberToNumber
(
*
pRightData
,
pRightOut
,
typeRight
,
type
);
*
pRightData
=
pRightOut
;
}
return
true
;
}
...
...
@@ -1472,6 +1519,38 @@ void vectorBitOr(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut,
doReleaseVec
(
pRightCol
,
rightConvert
);
}
#define VEC_COM_INNER(pCol, index1, index2) \
for (; i < pCol->numOfRows && i >= 0; i += step) {\
if (IS_HELPER_NULL(pLeft->columnData, index1) || IS_HELPER_NULL(pRight->columnData, index2)) {\
bool res = false;\
colDataAppendInt8(pOut->columnData, i, (int8_t*)&res);\
continue;\
}\
char *pLeftData = colDataGetData(pLeft->columnData, index1);\
char *pRightData = colDataGetData(pRight->columnData, index2);\
int64_t leftOut = 0;\
int64_t rightOut = 0;\
bool freeLeft = false;\
bool freeRight = false;\
bool isJsonnull = false;\
bool result = convertJsonValue(&fp, optr, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight),\
&pLeftData, &pRightData, &leftOut, &rightOut, &isJsonnull, &freeLeft, &freeRight);\
if(isJsonnull){\
ASSERT(0);\
}\
if(!pLeftData || !pRightData){\
result = false;\
}\
if(!result){\
colDataAppendInt8(pOut->columnData, i, (int8_t*)&result);\
}else{\
bool res = filterDoCompare(fp, optr, pLeftData, pRightData);\
colDataAppendInt8(pOut->columnData, i, (int8_t*)&res);\
}\
if(freeLeft) taosMemoryFreeClear(pLeftData);\
if(freeRight) taosMemoryFreeClear(pRightData);\
}
void
vectorCompareImpl
(
SScalarParam
*
pLeft
,
SScalarParam
*
pRight
,
SScalarParam
*
pOut
,
int32_t
_ord
,
int32_t
optr
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
TMAX
(
pLeft
->
numOfRows
,
pRight
->
numOfRows
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
...
...
@@ -1495,79 +1574,11 @@ void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *
}
if
(
pLeft
->
numOfRows
==
pRight
->
numOfRows
)
{
for
(;
i
<
pRight
->
numOfRows
&&
i
>=
0
;
i
+=
step
)
{
if
(
IS_HELPER_NULL
(
pLeft
->
columnData
,
i
)
||
IS_HELPER_NULL
(
pRight
->
columnData
,
i
))
{
bool
res
=
false
;
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
res
);
continue
;
// TODO set null or ignore
}
char
*
pLeftData
=
colDataGetData
(
pLeft
->
columnData
,
i
);
char
*
pRightData
=
colDataGetData
(
pRight
->
columnData
,
i
);
int64_t
leftOut
=
0
;
int64_t
rightOut
=
0
;
bool
isJsonnull
=
false
;
bool
result
=
convertJsonValue
(
&
fp
,
optr
,
GET_PARAM_TYPE
(
pLeft
),
GET_PARAM_TYPE
(
pRight
),
&
pLeftData
,
&
pRightData
,
&
leftOut
,
&
rightOut
,
&
isJsonnull
);
if
(
isJsonnull
){
ASSERT
(
0
);
}
if
(
!
result
){
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
result
);
}
else
{
bool
res
=
filterDoCompare
(
fp
,
optr
,
pLeftData
,
pRightData
);
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
res
);
}
}
VEC_COM_INNER
(
pLeft
,
i
,
i
)
}
else
if
(
pRight
->
numOfRows
==
1
)
{
ASSERT
(
pLeft
->
pHashFilter
==
NULL
);
for
(;
i
>=
0
&&
i
<
pLeft
->
numOfRows
;
i
+=
step
)
{
if
(
IS_HELPER_NULL
(
pLeft
->
columnData
,
i
)
||
IS_HELPER_NULL
(
pRight
->
columnData
,
0
))
{
bool
res
=
false
;
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
res
);
continue
;
}
char
*
pLeftData
=
colDataGetData
(
pLeft
->
columnData
,
i
);
char
*
pRightData
=
colDataGetData
(
pRight
->
columnData
,
0
);
int64_t
leftOut
=
0
;
int64_t
rightOut
=
0
;
bool
isJsonnull
=
false
;
bool
result
=
convertJsonValue
(
&
fp
,
optr
,
GET_PARAM_TYPE
(
pLeft
),
GET_PARAM_TYPE
(
pRight
),
&
pLeftData
,
&
pRightData
,
&
leftOut
,
&
rightOut
,
&
isJsonnull
);
if
(
isJsonnull
){
ASSERT
(
0
);
}
if
(
!
result
){
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
result
);
}
else
{
bool
res
=
filterDoCompare
(
fp
,
optr
,
pLeftData
,
pRightData
);
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
res
);
}
}
VEC_COM_INNER
(
pLeft
,
i
,
0
)
}
else
if
(
pLeft
->
numOfRows
==
1
)
{
for
(;
i
>=
0
&&
i
<
pRight
->
numOfRows
;
i
+=
step
)
{
if
(
IS_HELPER_NULL
(
pRight
->
columnData
,
i
)
||
IS_HELPER_NULL
(
pLeft
->
columnData
,
0
))
{
bool
res
=
false
;
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
res
);
continue
;
}
char
*
pLeftData
=
colDataGetData
(
pLeft
->
columnData
,
0
);
char
*
pRightData
=
colDataGetData
(
pLeft
->
columnData
,
i
);
int64_t
leftOut
=
0
;
int64_t
rightOut
=
0
;
bool
isJsonnull
=
false
;
bool
result
=
convertJsonValue
(
&
fp
,
optr
,
GET_PARAM_TYPE
(
pLeft
),
GET_PARAM_TYPE
(
pRight
),
&
pLeftData
,
&
pRightData
,
&
leftOut
,
&
rightOut
,
&
isJsonnull
);
if
(
isJsonnull
){
ASSERT
(
0
);
}
if
(
!
result
){
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
result
);
}
else
{
bool
res
=
filterDoCompare
(
fp
,
optr
,
pLeftData
,
pRightData
);
colDataAppendInt8
(
pOut
->
columnData
,
i
,
(
int8_t
*
)
&
res
);
}
}
VEC_COM_INNER
(
pRight
,
0
,
i
)
}
}
...
...
tests/system-test/2-query/json_tag.py
浏览文件 @
89b2a644
...
...
@@ -118,7 +118,7 @@ class TDTestCase:
tdSql
.
error
(
"select jtag->location from jsons1"
)
tdSql
.
error
(
"select jtag contains location from jsons1"
)
tdSql
.
error
(
"select * from jsons1 where jtag contains location"
)
tdSql
.
error
(
"select * from jsons1 where jtag contains''"
)
#
tdSql.error("select * from jsons1 where jtag contains''")
tdSql
.
error
(
"select * from jsons1 where jtag contains 'location'='beijing'"
)
#
# # test function error
...
...
@@ -129,6 +129,41 @@ class TDTestCase:
tdSql
.
error
(
"select ceil(jtag->'tag1') from jsons1"
)
tdSql
.
error
(
"select ceil(jtag) from jsons1"
)
#
#test scalar operation
tdSql
.
query
(
"select jtag contains 'tag1',jtag->'tag1' from jsons1 order by jtag->'tag1'"
)
tdSql
.
checkRows
(
13
)
tdSql
.
checkData
(
0
,
0
,
False
)
tdSql
.
checkData
(
5
,
0
,
True
)
tdSql
.
checkData
(
12
,
0
,
True
)
tdSql
.
query
(
"select jtag->'tag1' like 'fe%',jtag->'tag1' from jsons1 order by jtag->'tag1'"
)
tdSql
.
checkRows
(
13
)
tdSql
.
checkData
(
10
,
0
,
False
)
tdSql
.
checkData
(
11
,
0
,
False
)
tdSql
.
checkData
(
12
,
0
,
True
)
tdSql
.
query
(
"select jtag->'tag1' not like 'fe%',jtag->'tag1' from jsons1 order by jtag->'tag1'"
)
tdSql
.
checkRows
(
13
)
tdSql
.
checkData
(
10
,
0
,
False
)
tdSql
.
checkData
(
11
,
0
,
True
)
tdSql
.
checkData
(
12
,
0
,
False
)
tdSql
.
query
(
"select jtag->'tag1' match 'fe',jtag->'tag1' from jsons1 order by jtag->'tag1'"
)
tdSql
.
checkRows
(
13
)
tdSql
.
checkData
(
10
,
0
,
False
)
tdSql
.
checkData
(
11
,
0
,
False
)
tdSql
.
checkData
(
12
,
0
,
True
)
tdSql
.
query
(
"select jtag->'tag1' nmatch 'fe',jtag->'tag1' from jsons1 order by jtag->'tag1'"
)
tdSql
.
checkRows
(
13
)
tdSql
.
checkData
(
10
,
0
,
False
)
tdSql
.
checkData
(
11
,
0
,
True
)
tdSql
.
checkData
(
12
,
0
,
False
)
tdSql
.
query
(
"select jtag->'tag1',jtag->'tag1'>='a' from jsons1 order by jtag->'tag1'"
)
tdSql
.
checkRows
(
13
)
tdSql
.
checkData
(
0
,
0
,
None
)
tdSql
.
checkData
(
0
,
1
,
False
)
tdSql
.
checkData
(
7
,
0
,
"false"
)
tdSql
.
checkData
(
7
,
1
,
True
)
tdSql
.
checkData
(
12
,
1
,
True
)
# # test select normal column
tdSql
.
query
(
"select dataint from jsons1 order by dataint"
)
tdSql
.
checkRows
(
9
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录