Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
2679a075
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看板
提交
2679a075
编写于
3月 10, 2022
作者:
A
Alex Duan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TS-207]<fix>(query): compare nchar and binary with strcmp
上级
576a1574
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
96 addition
and
43 deletion
+96
-43
src/client/src/tscGlobalmerge.c
src/client/src/tscGlobalmerge.c
+3
-3
src/connector/jdbc/src/test/java/com/taosdata/jdbc/JsonTagTest.java
...tor/jdbc/src/test/java/com/taosdata/jdbc/JsonTagTest.java
+1
-1
src/os/src/windows/wString.c
src/os/src/windows/wString.c
+3
-3
src/query/inc/qExtbuffer.h
src/query/inc/qExtbuffer.h
+1
-1
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+0
-1
src/query/src/qExtbuffer.c
src/query/src/qExtbuffer.c
+36
-19
tests/develop-test/0-others/json_tag.py
tests/develop-test/0-others/json_tag.py
+9
-10
tests/pytest/functions/function_stddev.py
tests/pytest/functions/function_stddev.py
+2
-2
tests/pytest/query/querySort.py
tests/pytest/query/querySort.py
+41
-3
未找到文件。
src/client/src/tscGlobalmerge.c
浏览文件 @
2679a075
...
...
@@ -810,7 +810,7 @@ SSDataBlock* doMultiwayMergeSort(void* param, bool* newgroup) {
pOneDataSrc
->
rowIdx
,
pIndex
->
colIndex
);
char
*
data
=
pInfo
->
prevRow
[
i
];
int32_t
ret
=
columnValueAscendingComparator
(
data
,
newRow
,
pColInfo
->
info
.
type
,
pColInfo
->
info
.
bytes
);
int32_t
ret
=
columnValueAscendingComparator
(
data
,
newRow
,
pColInfo
->
info
.
type
,
pColInfo
->
info
.
bytes
,
true
);
if
(
ret
==
0
)
{
continue
;
}
else
{
...
...
@@ -872,7 +872,7 @@ static bool isSameGroup(SArray* orderColumnList, SSDataBlock* pBlock, char** dat
assert
(
pIndex
->
colId
==
pColInfo
->
info
.
colId
);
char
*
data
=
dataCols
[
i
];
int32_t
ret
=
columnValueAscendingComparator
(
data
,
pColInfo
->
pData
,
pColInfo
->
info
.
type
,
pColInfo
->
info
.
bytes
);
int32_t
ret
=
columnValueAscendingComparator
(
data
,
pColInfo
->
pData
,
pColInfo
->
info
.
type
,
pColInfo
->
info
.
bytes
,
true
);
if
(
ret
==
0
)
{
continue
;
}
else
{
...
...
@@ -1057,7 +1057,7 @@ static int32_t doSlimitImpl(SOperatorInfo* pOperator, SSLimitOperatorInfo* pInfo
SColumnInfo
*
pColInfo
=
&
pColInfoData
->
info
;
char
*
d
=
rowIndex
*
pColInfo
->
bytes
+
(
char
*
)
pColInfoData
->
pData
;
int32_t
ret
=
columnValueAscendingComparator
(
pInfo
->
prevRow
[
i
],
d
,
pColInfo
->
type
,
pColInfo
->
bytes
);
int32_t
ret
=
columnValueAscendingComparator
(
pInfo
->
prevRow
[
i
],
d
,
pColInfo
->
type
,
pColInfo
->
bytes
,
true
);
if
(
ret
!=
0
)
{
// it is a new group
samegroup
=
false
;
break
;
...
...
src/connector/jdbc/src/test/java/com/taosdata/jdbc/JsonTagTest.java
浏览文件 @
2679a075
...
...
@@ -1131,7 +1131,7 @@ public class JsonTagTest {
}
Assert
.
assertEquals
(
8
,
count
);
Assert
.
assertEquals
(
"\"
femail
\""
,
s
);
Assert
.
assertEquals
(
"\"
收到货
\""
,
s
);
close
(
resultSet
);
}
...
...
src/os/src/windows/wString.c
浏览文件 @
2679a075
...
...
@@ -93,9 +93,9 @@ int32_t twcslen(const wchar_t *wcs) {
}
int32_t
tasoUcs4Compare
(
void
*
f1_ucs4
,
void
*
f2_ucs4
,
int32_t
bytes
)
{
for
(
int32_t
i
=
0
;
i
<
bytes
;
++
i
)
{
int32_t
f1
=
*
(
int32_t
*
)((
char
*
)
f1_ucs4
+
i
*
4
);
int32_t
f2
=
*
(
int32_t
*
)((
char
*
)
f2_ucs4
+
i
*
4
);
for
(
int32_t
i
=
0
;
i
<
bytes
;
i
+=
4
)
{
int32_t
f1
=
*
(
int32_t
*
)((
char
*
)
f1_ucs4
+
i
);
int32_t
f2
=
*
(
int32_t
*
)((
char
*
)
f2_ucs4
+
i
);
if
((
f1
==
0
&&
f2
!=
0
)
||
(
f1
!=
0
&&
f2
==
0
))
{
return
f1
-
f2
;
...
...
src/query/inc/qExtbuffer.h
浏览文件 @
2679a075
...
...
@@ -254,7 +254,7 @@ int32_t compare_d(tOrderDescriptor *, int32_t numOfRow1, int32_t s1, char *data1
struct
SSDataBlock
;
int32_t
compare_aRv
(
struct
SSDataBlock
*
pBlock
,
SArray
*
colIndex
,
int32_t
numOfCols
,
int32_t
rowIndex
,
char
**
buffer
,
int32_t
order
);
int32_t
columnValueAscendingComparator
(
char
*
f1
,
char
*
f2
,
int32_t
type
,
int32_t
bytes
);
int32_t
columnValueAscendingComparator
(
char
*
f1
,
char
*
f2
,
int32_t
type
,
int32_t
bytes
,
bool
lenFirst
);
#ifdef __cplusplus
}
...
...
src/query/src/qExecutor.c
浏览文件 @
2679a075
...
...
@@ -9547,7 +9547,6 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SGroupbyExpr* pGroupbyExpr, S
pQueryAttr
->
needTableSeqScan
=
pQueryMsg
->
needTableSeqScan
;
pQueryAttr
->
needReverseScan
=
pQueryMsg
->
needReverseScan
;
pQueryAttr
->
stateWindow
=
pQueryMsg
->
stateWindow
;
pQueryAttr
->
vgId
=
vgId
;
pQueryAttr
->
pFilters
=
pFilters
;
pQueryAttr
->
range
=
pQueryMsg
->
range
;
...
...
src/query/src/qExtbuffer.c
浏览文件 @
2679a075
...
...
@@ -366,7 +366,7 @@ static int32_t tsCompareFunc(TSKEY k1, TSKEY k2, int32_t order) {
}
}
int32_t
columnValueAscendingComparator
(
char
*
f1
,
char
*
f2
,
int32_t
type
,
int32_t
bytes
)
{
int32_t
columnValueAscendingComparator
(
char
*
f1
,
char
*
f2
,
int32_t
type
,
int32_t
bytes
,
bool
lenFirst
)
{
if
(
type
==
TSDB_DATA_TYPE_JSON
){
bool
canReturn
=
true
;
int32_t
result
=
jsonCompareUnit
(
f1
,
f2
,
&
canReturn
);
...
...
@@ -388,30 +388,47 @@ int32_t columnValueAscendingComparator(char *f1, char *f2, int32_t type, int32_t
int32_t
len1
=
varDataLen
(
f1
);
int32_t
len2
=
varDataLen
(
f2
);
if
(
len1
!=
len2
)
{
return
len1
>
len2
?
1
:-
1
;
}
else
{
int32_t
ret
=
strncmp
(
varDataVal
(
f1
),
varDataVal
(
f2
),
len1
);
if
(
ret
==
0
)
{
// length first compare
if
(
lenFirst
)
{
if
(
len1
>
len2
)
return
1
;
else
if
(
len1
<
len2
)
return
-
1
;
}
// compare context
int32_t
ret
=
strncmp
(
varDataVal
(
f1
),
varDataVal
(
f2
),
len1
>
len2
?
len2
:
len1
);
if
(
ret
==
0
)
{
if
(
len1
>
len2
)
return
1
;
else
if
(
len1
<
len2
)
return
-
1
;
else
return
0
;
}
return
(
ret
<
0
)
?
-
1
:
1
;
}
return
(
ret
<
0
)
?
-
1
:
1
;
};
case
TSDB_DATA_TYPE_NCHAR
:
{
// todo handle the var string compare
int32_t
len1
=
varDataLen
(
f1
);
int32_t
len2
=
varDataLen
(
f2
);
if
(
len1
!=
len2
)
{
return
len1
>
len2
?
1
:
-
1
;
}
else
{
int32_t
ret
=
tasoUcs4Compare
(
varDataVal
(
f1
),
varDataVal
(
f2
),
len1
);
if
(
ret
==
0
)
{
// length first compare
if
(
lenFirst
)
{
if
(
len1
>
len2
)
return
1
;
else
if
(
len1
<
len2
)
return
-
1
;
}
// compare context
int32_t
ret
=
tasoUcs4Compare
(
varDataVal
(
f1
),
varDataVal
(
f2
),
len1
>
len2
?
len2
:
len1
);
if
(
ret
==
0
)
{
if
(
len1
>
len2
)
return
1
;
else
if
(
len1
<
len2
)
return
-
1
;
else
return
0
;
}
return
(
ret
<
0
)
?
-
1
:
1
;
}
return
(
ret
<
0
)
?
-
1
:
1
;
};
case
TSDB_DATA_TYPE_UTINYINT
:
DEFAULT_COMP
(
GET_UINT8_VAL
(
f1
),
GET_UINT8_VAL
(
f2
));
case
TSDB_DATA_TYPE_USMALLINT
:
DEFAULT_COMP
(
GET_UINT16_VAL
(
f1
),
GET_UINT16_VAL
(
f2
));
...
...
@@ -442,7 +459,7 @@ int32_t compare_a(tOrderDescriptor *pDescriptor, int32_t numOfRows1, int32_t s1,
}
}
else
{
SSchemaEx
*
pSchema
=
&
pDescriptor
->
pColumnModel
->
pFields
[
colIdx
];
int32_t
ret
=
columnValueAscendingComparator
(
f1
,
f2
,
pSchema
->
field
.
type
,
pSchema
->
field
.
bytes
);
int32_t
ret
=
columnValueAscendingComparator
(
f1
,
f2
,
pSchema
->
field
.
type
,
pSchema
->
field
.
bytes
,
strcmp
(
pSchema
->
field
.
name
,
TSQL_TBNAME_L
)
==
0
);
if
(
ret
==
0
)
{
continue
;
}
else
{
...
...
@@ -471,7 +488,7 @@ int32_t compare_aRv(SSDataBlock* pBlock, SArray* colIndex, int32_t numOfCols, in
return
ret
;
}
}
else
{
int32_t
ret
=
columnValueAscendingComparator
(
data
,
buffer
[
i
],
pColInfo
->
info
.
type
,
pColInfo
->
info
.
bytes
);
int32_t
ret
=
columnValueAscendingComparator
(
data
,
buffer
[
i
],
pColInfo
->
info
.
type
,
pColInfo
->
info
.
bytes
,
false
);
if
(
ret
==
0
)
{
continue
;
}
else
{
...
...
@@ -503,7 +520,7 @@ int32_t compare_d(tOrderDescriptor *pDescriptor, int32_t numOfRows1, int32_t s1,
}
}
else
{
SSchemaEx
*
pSchema
=
&
pDescriptor
->
pColumnModel
->
pFields
[
colIdx
];
int32_t
ret
=
columnValueAscendingComparator
(
f1
,
f2
,
pSchema
->
field
.
type
,
pSchema
->
field
.
bytes
);
int32_t
ret
=
columnValueAscendingComparator
(
f1
,
f2
,
pSchema
->
field
.
type
,
pSchema
->
field
.
bytes
,
strcmp
(
pSchema
->
field
.
name
,
TSQL_TBNAME_L
)
==
0
);
if
(
ret
==
0
)
{
continue
;
}
else
{
...
...
tests/develop-test/0-others/json_tag.py
浏览文件 @
2679a075
...
...
@@ -34,7 +34,6 @@ class TDTestCase:
def
run
(
self
):
tdSql
.
prepare
()
print
(
"============== STEP 1 ===== prepare data & validate json string"
)
tdSql
.
error
(
"create table if not exists jsons1(ts timestamp, dataInt int, dataBool bool, dataStr nchar(50), dataStrBin binary(150)) tags(jtag json, tagint int)"
)
tdSql
.
error
(
"create table if not exists jsons1(ts timestamp, data json) tags(tagint int)"
)
...
...
@@ -379,8 +378,8 @@ class TDTestCase:
tdSql
.
error
(
"select count(*) from jsons1 group by jtag->'tag1' order by jtag"
)
tdSql
.
query
(
"select count(*) from jsons1 group by jtag->'tag1' order by jtag->'tag1' desc"
)
tdSql
.
checkRows
(
8
)
tdSql
.
checkData
(
0
,
0
,
2
)
tdSql
.
checkData
(
0
,
1
,
'"femail"'
)
tdSql
.
checkData
(
1
,
0
,
2
)
tdSql
.
checkData
(
1
,
1
,
'"femail"'
)
tdSql
.
checkData
(
2
,
0
,
1
)
tdSql
.
checkData
(
2
,
1
,
11
)
tdSql
.
checkData
(
5
,
0
,
1
)
...
...
@@ -398,8 +397,8 @@ class TDTestCase:
tdSql
.
checkData
(
2
,
1
,
"false"
)
tdSql
.
checkData
(
5
,
0
,
1
)
tdSql
.
checkData
(
5
,
1
,
11
)
tdSql
.
checkData
(
7
,
0
,
2
)
tdSql
.
checkData
(
7
,
1
,
'"femail"'
)
tdSql
.
checkData
(
6
,
0
,
2
)
tdSql
.
checkData
(
6
,
1
,
'"femail"'
)
# test stddev with group by json tag
tdSql
.
query
(
"select stddev(dataint) from jsons1 group by jtag->'tag1'"
)
...
...
@@ -407,8 +406,8 @@ class TDTestCase:
tdSql
.
checkData
(
0
,
1
,
None
)
tdSql
.
checkData
(
1
,
0
,
0
)
tdSql
.
checkData
(
1
,
1
,
"null"
)
tdSql
.
checkData
(
7
,
0
,
11
)
tdSql
.
checkData
(
7
,
1
,
'"femail"'
)
tdSql
.
checkData
(
6
,
0
,
11
)
tdSql
.
checkData
(
6
,
1
,
'"femail"'
)
res
=
tdSql
.
getColNameList
(
"select stddev(dataint) from jsons1 group by jsons1.jtag->'tag1'"
)
cname_list
=
[]
...
...
@@ -422,8 +421,8 @@ class TDTestCase:
tdSql
.
checkData
(
0
,
1
,
4
)
tdSql
.
checkData
(
1
,
1
,
24
)
tdSql
.
checkData
(
1
,
2
,
None
)
tdSql
.
checkData
(
10
,
1
,
1
)
tdSql
.
checkData
(
10
,
2
,
'"femail"'
)
tdSql
.
checkData
(
8
,
1
,
1
)
tdSql
.
checkData
(
8
,
2
,
'"femail"'
)
# test having
tdSql
.
query
(
"select stddev(dataint) from jsons1 group by jtag->'tag1' having stddev(dataint) > 0"
)
...
...
@@ -437,7 +436,7 @@ class TDTestCase:
tdSql
.
query
(
"select jtag->'tag1' from (select jtag->'tag1', dataint from jsons1)"
)
tdSql
.
checkRows
(
11
)
tdSql
.
checkData
(
0
,
0
,
'"femail"'
)
tdSql
.
checkData
(
1
,
0
,
'"femail"'
)
tdSql
.
checkData
(
2
,
0
,
5
)
res
=
tdSql
.
getColNameList
(
"select jtag->'tag1' from (select jtag->'tag1', dataint from jsons1)"
)
...
...
tests/pytest/functions/function_stddev.py
浏览文件 @
2679a075
...
...
@@ -135,9 +135,9 @@ class TDTestCase:
tdSql
.
execute
(
"insert into std3 values(now + 5s, 4);"
)
tdSql
.
execute
(
"insert into std3 values(now + 6s, 8);"
)
tdSql
.
query
(
"select stddev(col1) from stdtable group by loc;"
)
tdSql
.
checkData
(
0
,
0
,
2.0
)
tdSql
.
checkData
(
2
,
0
,
2.0
)
tdSql
.
checkData
(
1
,
0
,
0.5
)
tdSql
.
checkData
(
2
,
0
,
0.5
)
tdSql
.
checkData
(
0
,
0
,
0.5
)
tdSql
.
execute
(
"create table stdtableint(ts timestamp, col1 int) tags(num int)"
)
tdSql
.
execute
(
"create table stdint1 using stdtableint tags(1)"
)
...
...
tests/pytest/query/querySort.py
浏览文件 @
2679a075
...
...
@@ -18,6 +18,8 @@ from util.cases import *
from
util.sql
import
*
import
numpy
as
np
# constant define
WAITS
=
5
# wait seconds
class
TDTestCase
:
def
init
(
self
,
conn
,
logSql
):
...
...
@@ -67,9 +69,7 @@ class TDTestCase:
"%s failed: sql:%s, the order provided for col:%d is not correct"
%
(
callerFilename
,
tdSql
.
sql
,
col
))
def
run
(
self
):
tdSql
.
prepare
()
def
test_base
(
self
):
print
(
"======= step 1: create table and insert data ========="
)
tdLog
.
debug
(
''' create table st(ts timestamp, tbcol1 tinyint, tbcol2 smallint, tbcol3 int, tbcol4 bigint, tbcol5 float, tbcol6 double,
...
...
@@ -183,6 +183,44 @@ class TDTestCase:
tdSql
.
close
()
tdLog
.
success
(
"%s successfully executed"
%
__file__
)
def
create_insert_data
(
self
):
sql
=
"create table sb(ts timestamp, i1 int) tags(t_b1 binary(32), t_n1 nchar(64));"
tdSql
.
execute
(
sql
)
for
i
in
range
(
20
):
value
=
"%s%s%s"
%
(
chr
(
64
+
i
),
chr
(
64
+
i
),
chr
(
65
+
i
))
if
i
%
10
==
5
:
value
+=
"_%s"
%
(
chr
(
66
+
i
))
if
i
%
10
==
0
:
value
+=
"_%s"
%
(
chr
(
67
+
i
))
sql
=
"insert into b%d using sb tags('A%s', 'B%s') values(now, %d);"
%
(
i
,
value
,
value
,
i
+
1000
)
tdSql
.
execute
(
sql
)
def
test_groupby_order
(
self
):
# create and insert data
print
(
"======= group order step 1: create table and insert data ========="
)
self
.
create_insert_data
()
# do query
print
(
"======= group order step 2: do query ========="
)
# ASC
sql
=
"select count(*) from sb group by t_b1 order by t_b1 asc;"
tdSql
.
execute
(
sql
)
tdSql
.
waitedQuery
(
sql
,
20
,
WAITS
)
tdSql
.
checkData
(
0
,
1
,
"A@@A_C"
)
tdSql
.
checkData
(
5
,
1
,
"AEEF_G"
)
tdSql
.
checkData
(
19
,
1
,
"ASST"
)
#DESC
sql
=
"select count(*) from sb group by t_b1 order by t_b1 desc;"
tdSql
.
execute
(
sql
)
tdSql
.
waitedQuery
(
sql
,
20
,
WAITS
)
tdSql
.
checkData
(
19
,
1
,
"A@@A_C"
)
tdSql
.
checkData
(
4
,
1
,
"AOOP_Q"
)
tdSql
.
checkData
(
0
,
1
,
"ASST"
)
def
run
(
self
):
tdSql
.
prepare
()
self
.
test_base
()
self
.
test_groupby_order
()
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录