Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
6a3886d9
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6a3886d9
编写于
12月 03, 2021
作者:
wmmhello
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix bugs and add test case
上级
59dea347
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
60 addition
and
105 deletion
+60
-105
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+5
-29
src/inc/taosmsg.h
src/inc/taosmsg.h
+1
-1
src/query/src/qExtbuffer.c
src/query/src/qExtbuffer.c
+6
-31
src/util/inc/tcompare.h
src/util/inc/tcompare.h
+1
-0
src/util/src/tcompare.c
src/util/src/tcompare.c
+37
-28
tests/pytest/stable/json_tag.py
tests/pytest/stable/json_tag.py
+10
-16
未找到文件。
src/client/src/tscSubquery.c
浏览文件 @
6a3886d9
...
...
@@ -738,36 +738,12 @@ int32_t tagValCompar(const void* p1, const void* p2) {
const
STidTags
*
t2
=
(
const
STidTags
*
)
varDataVal
(
p2
);
if
(
t1
->
padding
==
TSDB_DATA_TYPE_JSON
){
bool
f1IsNull
=
(
*
t1
->
tag
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
t1
->
tag
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
bool
f2IsNull
=
(
*
t1
->
tag
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
t1
->
tag
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
if
(
f1IsNull
&&
f2IsNull
){
return
0
;
}
else
if
(
f1IsNull
&&
!
f2IsNull
){
return
-
1
;
}
else
if
(
!
f1IsNull
&&
f2IsNull
){
return
1
;
}
else
{
bool
f1IsJsonNull
=
(
*
t1
->
tag
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
t1
->
tag
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
bool
f2IsJsonNull
=
(
*
t2
->
tag
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
t2
->
tag
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
if
(
f1IsJsonNull
&&
f2IsJsonNull
){
return
0
;
}
else
if
(
f1IsJsonNull
&&
!
f2IsJsonNull
){
return
-
1
;
}
else
if
(
!
f1IsJsonNull
&&
f2IsJsonNull
)
{
return
1
;
}
if
(
*
t1
->
tag
!=
*
t2
->
tag
&&
!
(
IS_NUMERIC_TYPE
(
*
t1
->
tag
)
&&
IS_NUMERIC_TYPE
(
*
t2
->
tag
)))
{
return
1
;
}
if
(
*
t1
->
tag
==
TSDB_DATA_TYPE_BIGINT
&&
*
t2
->
tag
==
TSDB_DATA_TYPE_DOUBLE
){
DEFAULT_COMP
(
GET_INT64_VAL
(
t1
->
tag
+
CHAR_BYTES
),
GET_DOUBLE_VAL
(
t2
->
tag
+
CHAR_BYTES
));
}
else
if
(
*
t1
->
tag
==
TSDB_DATA_TYPE_DOUBLE
&&
*
t2
->
tag
==
TSDB_DATA_TYPE_BIGINT
){
DEFAULT_COMP
(
GET_DOUBLE_VAL
(
t1
->
tag
+
CHAR_BYTES
),
GET_INT64_VAL
(
t2
->
tag
+
CHAR_BYTES
));
}
bool
canReturn
=
true
;
int32_t
result
=
jsonCompareUnit
(
t1
->
tag
,
t2
->
tag
,
&
canReturn
);
if
(
canReturn
)
return
result
;
__compar_fn_t
func
=
getComparFunc
(
t1
->
tag
[
0
],
0
);
return
func
(
t1
->
tag
+
CHAR_BYTES
,
t2
->
tag
+
CHAR_BYTES
);
}
__compar_fn_t
func
=
getComparFunc
(
t1
->
tag
[
0
],
0
);
return
func
(
t1
->
tag
+
CHAR_BYTES
,
t2
->
tag
+
CHAR_BYTES
);
}
__compar_fn_t
func
=
getComparFunc
(
t1
->
padding
,
0
);
return
func
(
t1
->
tag
,
t2
->
tag
);
...
...
src/inc/taosmsg.h
浏览文件 @
6a3886d9
...
...
@@ -400,7 +400,7 @@ typedef struct SColIndex {
int16_t
colId
;
// column id
int16_t
colIndex
;
// column index in colList if it is a normal column or index in tagColList if a tag
uint16_t
flag
;
// denote if it is a tag or a normal column
char
name
[
TSDB_COL_NAME_LEN
+
TSDB_TABLE_NAME_LEN
+
TSDB_MAX_JSON_KEY_LEN
+
4
+
1
];
char
name
[
TSDB_COL_NAME_LEN
+
TSDB_TABLE_NAME_LEN
+
TSDB_MAX_JSON_KEY_LEN
+
4
+
1
];
// 4 meams ->'' for json tag
}
SColIndex
;
typedef
struct
SColumnFilterInfo
{
...
...
src/query/src/qExtbuffer.c
浏览文件 @
6a3886d9
...
...
@@ -368,37 +368,12 @@ static int32_t tsCompareFunc(TSKEY k1, TSKEY k2, int32_t order) {
int32_t
columnValueAscendingComparator
(
char
*
f1
,
char
*
f2
,
int32_t
type
,
int32_t
bytes
)
{
if
(
type
==
TSDB_DATA_TYPE_JSON
){
bool
f1IsNull
=
(
*
f1
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
f1
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
bool
f2IsNull
=
(
*
f2
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
f2
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
if
(
f1IsNull
&&
f2IsNull
){
return
0
;
}
else
if
(
f1IsNull
&&
!
f2IsNull
){
return
-
1
;
}
else
if
(
!
f1IsNull
&&
f2IsNull
){
return
1
;
}
else
{
bool
f1IsJsonNull
=
(
*
f1
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
f1
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
bool
f2IsJsonNull
=
(
*
f2
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
f1
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
if
(
f1IsJsonNull
&&
f2IsJsonNull
){
return
0
;
}
else
if
(
f1IsJsonNull
&&
!
f2IsJsonNull
){
return
-
1
;
}
else
if
(
!
f1IsJsonNull
&&
f2IsJsonNull
)
{
return
1
;
}
if
(
*
f1
!=
*
f2
&&
!
(
IS_NUMERIC_TYPE
(
*
f1
)
&&
IS_NUMERIC_TYPE
(
*
f2
)))
{
return
1
;
}
if
(
*
f1
==
TSDB_DATA_TYPE_BIGINT
&&
*
f2
==
TSDB_DATA_TYPE_DOUBLE
){
DEFAULT_COMP
(
GET_INT64_VAL
(
f1
+
CHAR_BYTES
),
GET_DOUBLE_VAL
(
f2
+
CHAR_BYTES
));
}
else
if
(
*
f1
==
TSDB_DATA_TYPE_DOUBLE
&&
*
f2
==
TSDB_DATA_TYPE_BIGINT
){
DEFAULT_COMP
(
GET_DOUBLE_VAL
(
f1
+
CHAR_BYTES
),
GET_INT64_VAL
(
f2
+
CHAR_BYTES
));
}
type
=
*
f1
;
f1
+=
CHAR_BYTES
;
f2
+=
CHAR_BYTES
;
}
bool
canReturn
=
true
;
int32_t
result
=
jsonCompareUnit
(
f1
,
f2
,
&
canReturn
);
if
(
canReturn
)
return
result
;
type
=
*
f1
;
f1
+=
CHAR_BYTES
;
f2
+=
CHAR_BYTES
;
}
switch
(
type
)
{
case
TSDB_DATA_TYPE_INT
:
DEFAULT_COMP
(
GET_INT32_VAL
(
f1
),
GET_INT32_VAL
(
f2
));
...
...
src/util/inc/tcompare.h
浏览文件 @
6a3886d9
...
...
@@ -90,6 +90,7 @@ int32_t compareFindItemInSet(const void *pLeft, const void* pRight);
int32_t
compareWStrPatternComp
(
const
void
*
pLeft
,
const
void
*
pRight
);
int32_t
compareStrContainJson
(
const
void
*
pLeft
,
const
void
*
pRight
);
int32_t
compareJsonVal
(
const
void
*
pLeft
,
const
void
*
pRight
);
int32_t
jsonCompareUnit
(
const
char
*
f1
,
const
char
*
f2
,
bool
*
canReturn
);
#ifdef __cplusplus
}
...
...
src/util/src/tcompare.c
浏览文件 @
6a3886d9
...
...
@@ -615,38 +615,47 @@ __compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order) {
return
comparFn
;
}
int32_t
doCompare
(
const
char
*
f1
,
const
char
*
f2
,
int32_t
type
,
size_t
size
)
{
if
(
type
==
TSDB_DATA_TYPE_JSON
){
bool
f1IsNull
=
(
*
f1
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
f1
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
bool
f2IsNull
=
(
*
f2
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
f2
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
if
(
f1IsNull
&&
f2IsNull
){
int32_t
jsonCompareUnit
(
const
char
*
f1
,
const
char
*
f2
,
bool
*
canReturn
){
*
canReturn
=
true
;
bool
f1IsNull
=
(
*
f1
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
f1
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
bool
f2IsNull
=
(
*
f2
==
TSDB_DATA_TYPE_JSON
&&
isNull
(
f2
+
CHAR_BYTES
,
TSDB_DATA_TYPE_JSON
));
if
(
f1IsNull
&&
f2IsNull
){
return
0
;
}
else
if
(
f1IsNull
&&
!
f2IsNull
){
return
-
1
;
}
else
if
(
!
f1IsNull
&&
f2IsNull
){
return
1
;
}
else
{
bool
f1IsJsonNull
=
(
*
f1
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
f1
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
bool
f2IsJsonNull
=
(
*
f2
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
f1
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
if
(
f1IsJsonNull
&&
f2IsJsonNull
){
return
0
;
}
else
if
(
f1Is
Null
&&
!
f2Is
Null
){
}
else
if
(
f1Is
JsonNull
&&
!
f2IsJson
Null
){
return
-
1
;
}
else
if
(
!
f1Is
Null
&&
f2IsNull
)
{
}
else
if
(
!
f1Is
JsonNull
&&
f2IsJsonNull
)
{
return
1
;
}
else
{
bool
f1IsJsonNull
=
(
*
f1
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
f1
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
bool
f2IsJsonNull
=
(
*
f2
==
TSDB_DATA_TYPE_BINARY
&&
*
(
uint32_t
*
)(
f1
+
CHAR_BYTES
)
==
TSDB_DATA_JSON_null
);
if
(
f1IsJsonNull
&&
f2IsJsonNull
){
return
0
;
}
else
if
(
f1IsJsonNull
&&
!
f2IsJsonNull
){
return
-
1
;
}
else
if
(
!
f1IsJsonNull
&&
f2IsJsonNull
)
{
return
1
;
}
if
(
*
f1
!=
*
f2
&&
!
(
IS_NUMERIC_TYPE
(
*
f1
)
&&
IS_NUMERIC_TYPE
(
*
f2
)))
{
return
1
;
}
if
(
*
f1
==
TSDB_DATA_TYPE_BIGINT
&&
*
f2
==
TSDB_DATA_TYPE_DOUBLE
){
DEFAULT_COMP
(
GET_INT64_VAL
(
f1
+
CHAR_BYTES
),
GET_DOUBLE_VAL
(
f2
+
CHAR_BYTES
));
}
else
if
(
*
f1
==
TSDB_DATA_TYPE_DOUBLE
&&
*
f2
==
TSDB_DATA_TYPE_BIGINT
){
DEFAULT_COMP
(
GET_DOUBLE_VAL
(
f1
+
CHAR_BYTES
),
GET_INT64_VAL
(
f2
+
CHAR_BYTES
));
}
type
=
*
f1
;
f1
+=
CHAR_BYTES
;
f2
+=
CHAR_BYTES
;
}
if
(
*
f1
!=
*
f2
&&
!
(
IS_NUMERIC_TYPE
(
*
f1
)
&&
IS_NUMERIC_TYPE
(
*
f2
)))
{
return
*
f1
>
*
f2
?
1
:
-
1
;
}
if
(
*
f1
==
TSDB_DATA_TYPE_BIGINT
&&
*
f2
==
TSDB_DATA_TYPE_DOUBLE
){
DEFAULT_COMP
(
GET_INT64_VAL
(
f1
+
CHAR_BYTES
),
GET_DOUBLE_VAL
(
f2
+
CHAR_BYTES
));
}
else
if
(
*
f1
==
TSDB_DATA_TYPE_DOUBLE
&&
*
f2
==
TSDB_DATA_TYPE_BIGINT
){
DEFAULT_COMP
(
GET_DOUBLE_VAL
(
f1
+
CHAR_BYTES
),
GET_INT64_VAL
(
f2
+
CHAR_BYTES
));
}
*
canReturn
=
false
;
return
0
;
// meaningless
}
}
int32_t
doCompare
(
const
char
*
f1
,
const
char
*
f2
,
int32_t
type
,
size_t
size
)
{
if
(
type
==
TSDB_DATA_TYPE_JSON
){
bool
canReturn
=
true
;
int32_t
result
=
jsonCompareUnit
(
f1
,
f2
,
&
canReturn
);
if
(
canReturn
)
return
result
;
type
=
*
f1
;
f1
+=
CHAR_BYTES
;
f2
+=
CHAR_BYTES
;
}
switch
(
type
)
{
case
TSDB_DATA_TYPE_INT
:
DEFAULT_COMP
(
GET_INT32_VAL
(
f1
),
GET_INT32_VAL
(
f2
));
...
...
tests/pytest/stable/json_tag.py
浏览文件 @
6a3886d9
...
...
@@ -319,7 +319,7 @@ class TDTestCase:
# test join
tdSql
.
execute
(
"create table if not exists jsons2(ts timestamp, dataInt int, dataBool bool, dataStr nchar(50), dataStrBin binary(150)) tags(jtag json)"
)
tdSql
.
execute
(
"insert into jsons2_1 using jsons2 tags('{
\"
tag1
\"
:
\"
fff
\"
,
\"
tag2
\"
:5,
\"
tag3
\"
:true}') values(1591060618000, 2, false, 'json2', '你是2')"
)
tdSql
.
execute
(
"insert into jsons2_2 using jsons2 tags('{
\"
tag1
\"
:5,
\"
tag2
\"
:
\"
beijing
\"
}') values (1591060628000, 2, true, 'json2', 'sss')"
)
tdSql
.
execute
(
"insert into jsons2_2 using jsons2 tags('{
\"
tag1
\"
:5,
\"
tag2
\"
:
null
}') values (1591060628000, 2, true, 'json2', 'sss')"
)
tdSql
.
execute
(
"create table if not exists jsons3(ts timestamp, dataInt int, dataBool bool, dataStr nchar(50), dataStrBin binary(150)) tags(jtag json)"
)
tdSql
.
execute
(
"insert into jsons3_1 using jsons3 tags('{
\"
tag1
\"
:
\"
fff
\"
,
\"
tag2
\"
:5,
\"
tag3
\"
:true}') values(1591060618000, 3, false, 'json3', '你是3')"
)
...
...
@@ -335,30 +335,24 @@ class TDTestCase:
cname_list
.
append
(
"a.jtag->'tag3'"
)
tdSql
.
checkColNameList
(
res
,
cname_list
)
# test group by & order by
strin
g
#tdSql.query("select avg(dataint),
count(*) from jsons1 group by jtag->'tag1' order by jtag->'tag1' desc")
# test group by & order by
json ta
g
tdSql
.
query
(
"select
count(*) from jsons1 group by jtag->'tag1' order by jtag->'tag1' desc"
)
#tdSql.checkData(1, 0, 2.5)
#tdSql.checkData(1, 1, 2)
#tdSql.checkData(1, 2, "\"beijing\"")
#tdSql.checkData(2, 2, None)
# test stddev with group by json tag
sting
#
tdSql.query("select stddev(dataint) from jsons1 group by jtag->'tag1'")
# test stddev with group by json tag
tdSql
.
query
(
"select stddev(dataint) from jsons1 group by jtag->'tag1'"
)
#tdSql.checkData(0, 1, None)
#tdSql.checkData(1, 0, 0.5)
#tdSql.checkData(2, 0, 0)
#tdSql.query("select stddev(dataint) from jsons1 group by jtag->'tagint'")
#tdSql.checkData(0, 0, 1.16619037896906)
#tdSql.checkData(0, 1, None)
#tdSql.checkData(1, 0, 0)
#tdSql.checkData(2, 1, 2)
#res = tdSql.getColNameList("select stddev(dataint) from jsons1 group by jsons1.jtag->'tagint'")
#cname_list = []
#cname_list.append("stddev(dataint)")
#cname_list.append("jsons1.jtag->'tagint'")
#tdSql.checkColNameList(res, cname_list)
res
=
tdSql
.
getColNameList
(
"select stddev(dataint) from jsons1 group by jsons1.jtag->'tag1'"
)
cname_list
=
[]
cname_list
.
append
(
"stddev(dataint)"
)
cname_list
.
append
(
"jsons1.jtag->'tag1'"
)
tdSql
.
checkColNameList
(
res
,
cname_list
)
# subquery with json tag
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录