Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
6cc2a721
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
提交
6cc2a721
编写于
2月 15, 2022
作者:
wmmhello
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
modify unique function like top
上级
474c47b0
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
28 addition
and
23 deletion
+28
-23
src/client/inc/tscUtil.h
src/client/inc/tscUtil.h
+1
-1
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+3
-1
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+1
-1
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+19
-16
src/query/src/qUtil.c
src/query/src/qUtil.c
+4
-4
未找到文件。
src/client/inc/tscUtil.h
浏览文件 @
6cc2a721
...
...
@@ -242,7 +242,7 @@ SExprInfo* tscExprAppend(SQueryInfo* pQueryInfo, int16_t functionId, SColumnInde
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
);
SExprInfo
*
tscExprUpdate
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
int16_t
type
,
int
16
_t
size
);
int
32
_t
size
);
size_t
tscNumOfExprs
(
SQueryInfo
*
pQueryInfo
);
int32_t
tscExprTopBottomIndex
(
SQueryInfo
*
pQueryInfo
);
...
...
src/client/src/tscSQLParser.c
浏览文件 @
6cc2a721
...
...
@@ -4000,7 +4000,9 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo* pQueryInfo) {
(
functionId
>=
TSDB_FUNC_FIRST_DST
&&
functionId
<=
TSDB_FUNC_STDDEV_DST
)
||
(
functionId
>=
TSDB_FUNC_RATE
&&
functionId
<=
TSDB_FUNC_IRATE
)
||
(
functionId
==
TSDB_FUNC_SAMPLE
)
||
(
functionId
==
TSDB_FUNC_ELAPSED
)
||
(
functionId
==
TSDB_FUNC_HISTOGRAM
))
{
(
functionId
==
TSDB_FUNC_ELAPSED
)
||
(
functionId
==
TSDB_FUNC_HISTOGRAM
)
||
(
functionId
==
TSDB_FUNC_UNIQUE
))
{
if
(
getResultDataInfo
(
pSrcSchema
->
type
,
pSrcSchema
->
bytes
,
functionId
,
(
int32_t
)
pExpr
->
base
.
param
[
0
].
i64
,
&
type
,
&
bytes
,
&
interBytes
,
0
,
true
,
NULL
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
...
...
src/client/src/tscUtil.c
浏览文件 @
6cc2a721
...
...
@@ -2615,7 +2615,7 @@ SExprInfo* tscExprAppend(SQueryInfo* pQueryInfo, int16_t functionId, SColumnInde
}
SExprInfo
*
tscExprUpdate
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
int16_t
type
,
int
16
_t
size
)
{
int16_t
type
,
int
32
_t
size
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
index
);
if
(
pExpr
==
NULL
)
{
...
...
src/query/src/qAggMain.c
浏览文件 @
6cc2a721
...
...
@@ -5193,15 +5193,15 @@ static bool unique_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pRes
return
true
;
}
static
void
do_unique_function
(
SQLFunctionCtx
*
pCtx
,
SUniqueFuncInfo
*
pInfo
,
TSKEY
timestamp
,
char
*
pData
,
char
*
tag
){
UniqueUnit
*
unique
=
taosHashGet
(
pCtx
->
pUniqueSet
,
pData
,
pCtx
->
inputB
ytes
);
static
void
do_unique_function
(
SQLFunctionCtx
*
pCtx
,
SUniqueFuncInfo
*
pInfo
,
TSKEY
timestamp
,
char
*
pData
,
char
*
tag
,
int32_t
bytes
){
UniqueUnit
*
unique
=
taosHashGet
(
pCtx
->
pUniqueSet
,
pData
,
b
ytes
);
if
(
unique
==
NULL
)
{
size_t
size
=
sizeof
(
UniqueUnit
)
+
pCtx
->
inputB
ytes
+
pCtx
->
tagInfo
.
tagsLen
;
size_t
size
=
sizeof
(
UniqueUnit
)
+
b
ytes
+
pCtx
->
tagInfo
.
tagsLen
;
char
*
tmp
=
pInfo
->
res
+
pInfo
->
num
*
size
;
((
UniqueUnit
*
)
tmp
)
->
timestamp
=
timestamp
;
char
*
data
=
tmp
+
sizeof
(
UniqueUnit
);
char
*
tags
=
tmp
+
sizeof
(
UniqueUnit
)
+
pCtx
->
inputB
ytes
;
memcpy
(
data
,
pData
,
pCtx
->
inputB
ytes
);
char
*
tags
=
tmp
+
sizeof
(
UniqueUnit
)
+
b
ytes
;
memcpy
(
data
,
pData
,
b
ytes
);
if
(
pCtx
->
currentStage
==
MERGE_STAGE
&&
tag
!=
NULL
)
{
memcpy
(
tags
,
tag
,
(
size_t
)
pCtx
->
tagInfo
.
tagsLen
);
...
...
@@ -5209,15 +5209,18 @@ static void do_unique_function(SQLFunctionCtx *pCtx, SUniqueFuncInfo *pInfo, TSK
int32_t
offset
=
0
;
for
(
int32_t
j
=
0
;
j
<
pCtx
->
tagInfo
.
numOfTagCols
;
++
j
)
{
SQLFunctionCtx
*
tagCtx
=
pCtx
->
tagInfo
.
pTagCtxList
[
j
];
if
(
tagCtx
->
functionId
==
TSDB_FUNC_TAG_DUMMY
)
{
aAggs
[
TSDB_FUNC_TAG
].
xFunction
(
tagCtx
);
memcpy
(
tags
+
offset
,
tagCtx
->
pOutput
,
tagCtx
->
outputBytes
);
offset
+=
tagCtx
->
outputBytes
;
if
(
tagCtx
->
functionId
==
TSDB_FUNC_TS_DUMMY
)
{
tagCtx
->
tag
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
tagCtx
->
tag
.
i64
=
timestamp
;
}
tVariantDump
(
&
tagCtx
->
tag
,
tagCtx
->
pOutput
,
tagCtx
->
tag
.
nType
,
true
);
memcpy
(
tags
+
offset
,
tagCtx
->
pOutput
,
tagCtx
->
outputBytes
);
offset
+=
tagCtx
->
outputBytes
;
}
}
taosHashPut
(
pCtx
->
pUniqueSet
,
pData
,
pCtx
->
inputBytes
,
&
tmp
,
sizeof
(
tValuePair
*
));
taosHashPut
(
pCtx
->
pUniqueSet
,
pData
,
bytes
,
&
tmp
,
sizeof
(
UniqueUnit
*
));
pInfo
->
num
++
;
}
else
if
(
unique
->
timestamp
>
timestamp
){
unique
->
timestamp
=
timestamp
;
...
...
@@ -5233,7 +5236,7 @@ static void unique_function(SQLFunctionCtx *pCtx) {
if
(
pCtx
->
ptsList
!=
NULL
)
{
k
=
GET_TS_DATA
(
pCtx
,
i
);
}
do_unique_function
(
pCtx
,
pInfo
,
k
,
pData
,
NULL
);
do_unique_function
(
pCtx
,
pInfo
,
k
,
pData
,
NULL
,
pCtx
->
inputBytes
);
if
(
sizeof
(
SUniqueFuncInfo
)
+
pInfo
->
num
*
(
sizeof
(
UniqueUnit
)
+
pCtx
->
inputBytes
+
pCtx
->
tagInfo
.
tagsLen
)
>=
MAX_UNIQUE_RESULT_SIZE
){
GET_RES_INFO
(
pCtx
)
->
numOfRes
=
-
1
;
// mark out of memory
...
...
@@ -5247,15 +5250,15 @@ static void unique_function(SQLFunctionCtx *pCtx) {
static
void
unique_function_merge
(
SQLFunctionCtx
*
pCtx
)
{
SUniqueFuncInfo
*
pInput
=
(
SUniqueFuncInfo
*
)
GET_INPUT_DATA_LIST
(
pCtx
);
SUniqueFuncInfo
*
pOutput
=
getUniqueOutputInfo
(
pCtx
);
size_t
size
=
sizeof
(
UniqueUnit
)
+
pCtx
->
in
putBytes
+
pCtx
->
tagInfo
.
tagsLen
;
size_t
size
=
sizeof
(
UniqueUnit
)
+
pCtx
->
out
putBytes
+
pCtx
->
tagInfo
.
tagsLen
;
for
(
int32_t
i
=
0
;
i
<
pInput
->
num
;
++
i
)
{
char
*
tmp
=
pInput
->
res
+
i
*
size
;
TSKEY
timestamp
=
((
UniqueUnit
*
)
tmp
)
->
timestamp
;
char
*
data
=
tmp
+
sizeof
(
UniqueUnit
);
char
*
tags
=
tmp
+
sizeof
(
UniqueUnit
)
+
pCtx
->
in
putBytes
;
do_unique_function
(
pCtx
,
pOutput
,
timestamp
,
data
,
tags
);
char
*
tags
=
tmp
+
sizeof
(
UniqueUnit
)
+
pCtx
->
out
putBytes
;
do_unique_function
(
pCtx
,
pOutput
,
timestamp
,
data
,
tags
,
pCtx
->
outputBytes
);
if
(
sizeof
(
SUniqueFuncInfo
)
+
pOutput
->
num
*
(
sizeof
(
UniqueUnit
)
+
pCtx
->
in
putBytes
+
pCtx
->
tagInfo
.
tagsLen
)
>=
MAX_UNIQUE_RESULT_SIZE
){
if
(
sizeof
(
SUniqueFuncInfo
)
+
pOutput
->
num
*
(
sizeof
(
UniqueUnit
)
+
pCtx
->
out
putBytes
+
pCtx
->
tagInfo
.
tagsLen
)
>=
MAX_UNIQUE_RESULT_SIZE
){
GET_RES_INFO
(
pCtx
)
->
numOfRes
=
-
1
;
// mark out of memory
return
;
}
...
...
@@ -5772,7 +5775,7 @@ SAggFunctionInfo aAggs[TSDB_FUNC_MAX_NUM] = {{
// 39
"unique"
,
TSDB_FUNC_UNIQUE
,
TSDB_FUNC_
INVALID_ID
,
TSDB_FUNC_
UNIQUE
,
TSDB_FUNCSTATE_MO
|
TSDB_FUNCSTATE_STABLE
|
TSDB_FUNCSTATE_SELECTIVITY
,
unique_function_setup
,
unique_function
,
...
...
src/query/src/qUtil.c
浏览文件 @
6cc2a721
...
...
@@ -33,7 +33,7 @@ typedef struct SCompSupporter {
}
SCompSupporter
;
int32_t
getRowNumForMultioutput
(
SQueryAttr
*
pQueryAttr
,
bool
topBottomQuery
,
bool
stable
)
{
if
(
pQueryAttr
&&
(
!
stable
))
{
if
(
pQueryAttr
&&
(
!
stable
))
{
// if table is stable, no need return more than 1 no in merge stage
for
(
int16_t
i
=
0
;
i
<
pQueryAttr
->
numOfOutput
;
++
i
)
{
if
(
pQueryAttr
->
pExpr1
[
i
].
base
.
functionId
==
TSDB_FUNC_TOP
||
pQueryAttr
->
pExpr1
[
i
].
base
.
functionId
==
TSDB_FUNC_BOTTOM
||
...
...
@@ -42,11 +42,11 @@ int32_t getRowNumForMultioutput(SQueryAttr* pQueryAttr, bool topBottomQuery, boo
return
(
int32_t
)
pQueryAttr
->
pExpr1
[
i
].
base
.
param
[
0
].
i64
;
}
}
if
(
pQueryAttr
->
uniqueQuery
){
return
MAX_UNIQUE_RESULT_ROWS
;
}
}
if
(
pQueryAttr
->
uniqueQuery
){
return
MAX_UNIQUE_RESULT_ROWS
;
}
return
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录