Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
5d543449
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1184
Star
22015
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5d543449
编写于
6月 07, 2022
作者:
G
Ganlin Zhao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh(query): add distributed splitting of aggregate function
TD-16321
上级
9c21f484
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
95 addition
and
10 deletion
+95
-10
include/libs/function/functionMgt.h
include/libs/function/functionMgt.h
+4
-0
source/libs/function/inc/builtinsimpl.h
source/libs/function/inc/builtinsimpl.h
+2
-0
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+54
-10
source/libs/function/src/builtinsimpl.c
source/libs/function/src/builtinsimpl.c
+35
-0
未找到文件。
include/libs/function/functionMgt.h
浏览文件 @
5d543449
...
@@ -122,6 +122,10 @@ typedef enum EFunctionType {
...
@@ -122,6 +122,10 @@ typedef enum EFunctionType {
// internal function
// internal function
FUNCTION_TYPE_SELECT_VALUE
,
FUNCTION_TYPE_SELECT_VALUE
,
// distributed splitting functions
FUNCTION_TYPE_APERCENTILE_PARTIAL
,
FUNCTION_TYPE_APERCENTILE_MERGE
,
// user defined funcion
// user defined funcion
FUNCTION_TYPE_UDF
=
10000
FUNCTION_TYPE_UDF
=
10000
}
EFunctionType
;
}
EFunctionType
;
...
...
source/libs/function/inc/builtinsimpl.h
浏览文件 @
5d543449
...
@@ -23,6 +23,7 @@ extern "C" {
...
@@ -23,6 +23,7 @@ extern "C" {
#include "function.h"
#include "function.h"
#include "functionMgt.h"
#include "functionMgt.h"
bool
functionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
bool
functionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
int32_t
functionFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
int32_t
functionFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
int32_t
dummyProcess
(
SqlFunctionCtx
*
UNUSED_PARAM
(
pCtx
));
int32_t
dummyProcess
(
SqlFunctionCtx
*
UNUSED_PARAM
(
pCtx
));
...
@@ -77,6 +78,7 @@ bool getApercentileFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
...
@@ -77,6 +78,7 @@ bool getApercentileFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
bool
apercentileFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
bool
apercentileFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
int32_t
apercentileFunction
(
SqlFunctionCtx
*
pCtx
);
int32_t
apercentileFunction
(
SqlFunctionCtx
*
pCtx
);
int32_t
apercentileFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
int32_t
apercentileFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
int32_t
apercentilePartialFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
bool
getDiffFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
bool
getDiffFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
bool
diffFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResInfo
);
bool
diffFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResInfo
);
...
...
source/libs/function/src/builtins.c
浏览文件 @
5d543449
...
@@ -212,7 +212,7 @@ static bool validateApercentileAlgo(const SValueNode* pVal) {
...
@@ -212,7 +212,7 @@ static bool validateApercentileAlgo(const SValueNode* pVal) {
0
==
strcasecmp
(
varDataVal
(
pVal
->
datum
.
p
),
"t-digest"
));
0
==
strcasecmp
(
varDataVal
(
pVal
->
datum
.
p
),
"t-digest"
));
}
}
static
int32_t
translateApercentile
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
static
int32_t
translateApercentile
Impl
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
,
bool
isPartial
)
{
int32_t
numOfParams
=
LIST_LENGTH
(
pFunc
->
pParameterList
);
int32_t
numOfParams
=
LIST_LENGTH
(
pFunc
->
pParameterList
);
if
(
2
!=
numOfParams
&&
3
!=
numOfParams
)
{
if
(
2
!=
numOfParams
&&
3
!=
numOfParams
)
{
return
invaildFuncParaNumErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
return
invaildFuncParaNumErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
...
@@ -261,10 +261,22 @@ static int32_t translateApercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t
...
@@ -261,10 +261,22 @@ static int32_t translateApercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t
pValue
->
notReserved
=
true
;
pValue
->
notReserved
=
true
;
}
}
pFunc
->
node
.
resType
=
(
SDataType
){.
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
,
.
type
=
TSDB_DATA_TYPE_DOUBLE
};
if
(
!
isPartial
)
{
pFunc
->
node
.
resType
=
(
SDataType
){.
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
,
.
type
=
TSDB_DATA_TYPE_DOUBLE
};
}
else
{
pFunc
->
node
.
resType
=
(
SDataType
){.
bytes
=
1000
,
.
type
=
TSDB_DATA_TYPE_BINARY
};
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
translateApercentilePartial
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
return
translateApercentileImpl
(
pFunc
,
pErrBuf
,
len
,
true
);
}
static
int32_t
translateApercentileFinal
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
return
translateApercentileImpl
(
pFunc
,
pErrBuf
,
len
,
false
);
}
static
int32_t
translateTbnameColumn
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
static
int32_t
translateTbnameColumn
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
// pseudo column do not need to check parameters
// pseudo column do not need to check parameters
pFunc
->
node
.
resType
=
pFunc
->
node
.
resType
=
...
@@ -1142,9 +1154,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1142,9 +1154,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
processFunc
=
countFunction
,
.
processFunc
=
countFunction
,
.
finalizeFunc
=
functionFinalize
,
.
finalizeFunc
=
functionFinalize
,
.
invertFunc
=
countInvertFunction
,
.
invertFunc
=
countInvertFunction
,
.
combineFunc
=
combineFunction
,
.
combineFunc
=
combineFunction
,
//
.pPartialFunc = "count",
.
pPartialFunc
=
"count"
,
//
.pMergeFunc = "sum"
.
pMergeFunc
=
"sum"
},
},
{
{
.
name
=
"sum"
,
.
name
=
"sum"
,
...
@@ -1157,7 +1169,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1157,7 +1169,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
processFunc
=
sumFunction
,
.
processFunc
=
sumFunction
,
.
finalizeFunc
=
functionFinalize
,
.
finalizeFunc
=
functionFinalize
,
.
invertFunc
=
sumInvertFunction
,
.
invertFunc
=
sumInvertFunction
,
.
combineFunc
=
sumCombine
,
.
combineFunc
=
sumCombine
,
.
pPartialFunc
=
"sum"
,
.
pMergeFunc
=
"sum"
},
},
{
{
.
name
=
"min"
,
.
name
=
"min"
,
...
@@ -1169,7 +1183,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1169,7 +1183,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
initFunc
=
minmaxFunctionSetup
,
.
initFunc
=
minmaxFunctionSetup
,
.
processFunc
=
minFunction
,
.
processFunc
=
minFunction
,
.
finalizeFunc
=
minmaxFunctionFinalize
,
.
finalizeFunc
=
minmaxFunctionFinalize
,
.
combineFunc
=
minCombine
.
combineFunc
=
minCombine
,
.
pPartialFunc
=
"min"
,
.
pMergeFunc
=
"min"
},
},
{
{
.
name
=
"max"
,
.
name
=
"max"
,
...
@@ -1181,7 +1197,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1181,7 +1197,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
initFunc
=
minmaxFunctionSetup
,
.
initFunc
=
minmaxFunctionSetup
,
.
processFunc
=
maxFunction
,
.
processFunc
=
maxFunction
,
.
finalizeFunc
=
minmaxFunctionFinalize
,
.
finalizeFunc
=
minmaxFunctionFinalize
,
.
combineFunc
=
maxCombine
.
combineFunc
=
maxCombine
,
.
pPartialFunc
=
"max"
,
.
pMergeFunc
=
"max"
},
},
{
{
.
name
=
"stddev"
,
.
name
=
"stddev"
,
...
@@ -1217,6 +1235,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1217,6 +1235,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
finalizeFunc
=
avgFinalize
,
.
finalizeFunc
=
avgFinalize
,
.
invertFunc
=
avgInvertFunction
,
.
invertFunc
=
avgInvertFunction
,
.
combineFunc
=
avgCombine
,
.
combineFunc
=
avgCombine
,
.
pPartialFunc
=
"avgPartial"
,
.
pMergeFunc
=
"avgMerge"
},
},
{
{
.
name
=
"percentile"
,
.
name
=
"percentile"
,
...
@@ -1232,7 +1252,27 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1232,7 +1252,27 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
name
=
"apercentile"
,
.
name
=
"apercentile"
,
.
type
=
FUNCTION_TYPE_APERCENTILE
,
.
type
=
FUNCTION_TYPE_APERCENTILE
,
.
classification
=
FUNC_MGT_AGG_FUNC
,
.
classification
=
FUNC_MGT_AGG_FUNC
,
.
translateFunc
=
translateApercentile
,
.
translateFunc
=
translateApercentileFinal
,
.
getEnvFunc
=
getApercentileFuncEnv
,
.
initFunc
=
apercentileFunctionSetup
,
.
processFunc
=
apercentileFunction
,
.
finalizeFunc
=
apercentileFinalize
},
{
.
name
=
"_apercentile_partial"
,
.
type
=
FUNCTION_TYPE_APERCENTILE_PARTIAL
,
.
classification
=
FUNC_MGT_AGG_FUNC
,
.
translateFunc
=
translateApercentilePartial
,
.
getEnvFunc
=
getApercentileFuncEnv
,
.
initFunc
=
apercentileFunctionSetup
,
.
processFunc
=
apercentileFunction
,
.
finalizeFunc
=
apercentilePartialFinalize
},
{
.
name
=
"_apercentile_merge"
,
.
type
=
FUNCTION_TYPE_APERCENTILE_MERGE
,
.
classification
=
FUNC_MGT_AGG_FUNC
,
.
translateFunc
=
translateApercentileFinal
,
.
getEnvFunc
=
getApercentileFuncEnv
,
.
getEnvFunc
=
getApercentileFuncEnv
,
.
initFunc
=
apercentileFunctionSetup
,
.
initFunc
=
apercentileFunctionSetup
,
.
processFunc
=
apercentileFunction
,
.
processFunc
=
apercentileFunction
,
...
@@ -1299,7 +1339,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1299,7 +1339,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
initFunc
=
functionSetup
,
.
initFunc
=
functionSetup
,
.
processFunc
=
firstFunction
,
.
processFunc
=
firstFunction
,
.
finalizeFunc
=
firstLastFinalize
,
.
finalizeFunc
=
firstLastFinalize
,
.
combineFunc
=
firstCombine
,
.
combineFunc
=
firstCombine
,
.
pPartialFunc
=
"first"
,
.
pMergeFunc
=
"first"
},
},
{
{
.
name
=
"last"
,
.
name
=
"last"
,
...
@@ -1311,6 +1353,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -1311,6 +1353,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
processFunc
=
lastFunction
,
.
processFunc
=
lastFunction
,
.
finalizeFunc
=
firstLastFinalize
,
.
finalizeFunc
=
firstLastFinalize
,
.
combineFunc
=
lastCombine
,
.
combineFunc
=
lastCombine
,
.
pPartialFunc
=
"last"
,
.
pMergeFunc
=
"last"
},
},
{
{
.
name
=
"twa"
,
.
name
=
"twa"
,
...
...
source/libs/function/src/builtinsimpl.c
浏览文件 @
5d543449
...
@@ -2071,6 +2071,41 @@ int32_t apercentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
...
@@ -2071,6 +2071,41 @@ int32_t apercentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
return
functionFinalize
(
pCtx
,
pBlock
);
return
functionFinalize
(
pCtx
,
pBlock
);
}
}
int32_t
apercentilePartialFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SVariant
*
pVal
=
&
pCtx
->
param
[
1
].
param
;
double
percent
=
(
pVal
->
nType
==
TSDB_DATA_TYPE_BIGINT
)
?
pVal
->
i
:
pVal
->
d
;
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SAPercentileInfo
*
pInfo
=
(
SAPercentileInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
int32_t
bytesHist
=
(
int32_t
)(
sizeof
(
SAPercentileInfo
)
+
sizeof
(
SHistogramInfo
)
+
sizeof
(
SHistBin
)
*
(
MAX_HISTOGRAM_BIN
+
1
));
int32_t
bytesDigest
=
(
int32_t
)(
sizeof
(
SAPercentileInfo
)
+
TDIGEST_SIZE
(
COMPRESSION
));
int32_t
resultBytes
=
TMAX
(
bytesHist
,
bytesDigest
);
char
*
tmp
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
if
(
pInfo
->
algo
==
APERCT_ALGO_TDIGEST
)
{
if
(
pInfo
->
pTDigest
->
size
>
0
)
{
memcpy
(
varDataVal
(
tmp
),
pInfo
->
pTDigest
,
resultBytes
);
}
else
{
return
TSDB_CODE_SUCCESS
;
}
}
else
{
if
(
pInfo
->
pHisto
->
numOfElems
>
0
)
{
memcpy
(
varDataVal
(
tmp
),
pInfo
->
pHisto
,
resultBytes
);
}
else
{
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
slotId
=
pCtx
->
pExpr
->
base
.
resSchema
.
slotId
;
SColumnInfoData
*
pCol
=
taosArrayGet
(
pBlock
->
pDataBlock
,
slotId
);
colDataAppend
(
pCol
,
pBlock
->
info
.
rows
,
tmp
,
false
);
taosMemoryFree
(
tmp
);
return
pResInfo
->
numOfRes
;
}
bool
getFirstLastFuncEnv
(
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
)
{
bool
getFirstLastFuncEnv
(
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
)
{
SColumnNode
*
pNode
=
nodesListGetNode
(
pFunc
->
pParameterList
,
0
);
SColumnNode
*
pNode
=
nodesListGetNode
(
pFunc
->
pParameterList
,
0
);
pEnv
->
calcMemSize
=
pNode
->
node
.
resType
.
bytes
+
sizeof
(
int64_t
);
pEnv
->
calcMemSize
=
pNode
->
node
.
resType
.
bytes
+
sizeof
(
int64_t
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录