Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
91461d8d
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看板
提交
91461d8d
编写于
12月 22, 2021
作者:
G
Ganlin Zhao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
retrigger CI
上级
ca700863
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
52 addition
and
52 deletion
+52
-52
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+52
-52
未找到文件。
src/query/src/qAggMain.c
浏览文件 @
91461d8d
...
...
@@ -866,17 +866,17 @@ static int32_t lastDistFuncRequired(SQLFunctionCtx *pCtx, STimeWindow* w, int32_
*/
static
void
avg_function
(
SQLFunctionCtx
*
pCtx
)
{
int32_t
notNullElems
=
0
;
// NOTE: keep the intermediate result into the interResultBuf
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SAvgInfo
*
pAvgInfo
=
(
SAvgInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
double
*
pVal
=
&
pAvgInfo
->
sum
;
if
(
pCtx
->
preAggVals
.
isSet
)
{
// Pre-aggregation
notNullElems
=
pCtx
->
size
-
pCtx
->
preAggVals
.
statis
.
numOfNull
;
assert
(
notNullElems
>=
0
);
if
(
IS_SIGNED_NUMERIC_TYPE
(
pCtx
->
inputType
))
{
*
pVal
+=
pCtx
->
preAggVals
.
statis
.
sum
;
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
pCtx
->
inputType
))
{
...
...
@@ -886,7 +886,7 @@ static void avg_function(SQLFunctionCtx *pCtx) {
}
}
else
{
void
*
pData
=
GET_INPUT_DATA_LIST
(
pCtx
);
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_TINYINT
)
{
LIST_ADD_N
(
*
pVal
,
pCtx
,
pData
,
int8_t
,
notNullElems
,
pCtx
->
inputType
);
}
else
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_SMALLINT
)
{
...
...
@@ -909,18 +909,18 @@ static void avg_function(SQLFunctionCtx *pCtx) {
LIST_ADD_N
(
*
pVal
,
pCtx
,
pData
,
uint64_t
,
notNullElems
,
pCtx
->
inputType
);
}
}
if
(
!
pCtx
->
hasNull
)
{
assert
(
notNullElems
==
pCtx
->
size
);
}
SET_VAL
(
pCtx
,
notNullElems
,
1
);
pAvgInfo
->
num
+=
notNullElems
;
if
(
notNullElems
>
0
)
{
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
}
// keep the data into the final output buffer for super table query since this execution may be the last one
if
(
pCtx
->
stableQuery
)
{
memcpy
(
pCtx
->
pOutput
,
GET_ROWCELL_INTERBUF
(
pResInfo
),
sizeof
(
SAvgInfo
));
...
...
@@ -929,18 +929,18 @@ static void avg_function(SQLFunctionCtx *pCtx) {
static
void
avg_func_merge
(
SQLFunctionCtx
*
pCtx
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
double
*
sum
=
(
double
*
)
pCtx
->
pOutput
;
char
*
input
=
GET_INPUT_DATA_LIST
(
pCtx
);
for
(
int32_t
i
=
0
;
i
<
pCtx
->
size
;
++
i
,
input
+=
pCtx
->
inputBytes
)
{
SAvgInfo
*
pInput
=
(
SAvgInfo
*
)
input
;
if
(
pInput
->
num
==
0
)
{
// current input is null
continue
;
}
SET_DOUBLE_VAL
(
sum
,
*
sum
+
pInput
->
sum
);
// keep the number of data into the temp buffer
*
(
int64_t
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
)
+=
pInput
->
num
;
}
...
...
@@ -951,10 +951,10 @@ static void avg_func_merge(SQLFunctionCtx *pCtx) {
*/
static
void
avg_finalizer
(
SQLFunctionCtx
*
pCtx
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
if
(
pCtx
->
currentStage
==
MERGE_STAGE
)
{
assert
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_BINARY
);
if
(
GET_INT64_VAL
(
GET_ROWCELL_INTERBUF
(
pResInfo
))
<=
0
)
{
setNull
(
pCtx
->
pOutput
,
pCtx
->
outputType
,
pCtx
->
outputBytes
);
return
;
...
...
@@ -964,15 +964,15 @@ static void avg_finalizer(SQLFunctionCtx *pCtx) {
}
else
{
// this is the secondary merge, only in the secondary merge, the input type is TSDB_DATA_TYPE_BINARY
assert
(
IS_NUMERIC_TYPE
(
pCtx
->
inputType
));
SAvgInfo
*
pAvgInfo
=
(
SAvgInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
if
(
pAvgInfo
->
num
==
0
)
{
// all data are NULL or empty table
setNull
(
pCtx
->
pOutput
,
pCtx
->
outputType
,
pCtx
->
outputBytes
);
return
;
}
SET_DOUBLE_VAL
((
double
*
)
pCtx
->
pOutput
,
pAvgInfo
->
sum
/
pAvgInfo
->
num
);
}
// cannot set the numOfIteratedElems again since it is set during previous iteration
GET_RES_INFO
(
pCtx
)
->
numOfRes
=
1
;
doFinalizer
(
pCtx
);
...
...
@@ -992,7 +992,7 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
void
*
tval
=
NULL
;
int16_t
index
=
0
;
if
(
isMin
)
{
tval
=
&
pCtx
->
preAggVals
.
statis
.
min
;
index
=
pCtx
->
preAggVals
.
statis
.
minIndex
;
...
...
@@ -1000,7 +1000,7 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
tval
=
&
pCtx
->
preAggVals
.
statis
.
max
;
index
=
pCtx
->
preAggVals
.
statis
.
maxIndex
;
}
TSKEY
key
=
TSKEY_INITIAL_VAL
;
if
(
pCtx
->
ptsList
!=
NULL
)
{
/**
...
...
@@ -1016,23 +1016,23 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
// the index is the original position, not the relative position
key
=
pCtx
->
ptsList
[
index
];
}
if
(
IS_SIGNED_NUMERIC_TYPE
(
pCtx
->
inputType
))
{
int64_t
val
=
GET_INT64_VAL
(
tval
);
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_TINYINT
)
{
int8_t
*
data
=
(
int8_t
*
)
pOutput
;
UPDATE_DATA
(
pCtx
,
*
data
,
(
int8_t
)
val
,
notNullElems
,
isMin
,
key
);
}
else
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_SMALLINT
)
{
int16_t
*
data
=
(
int16_t
*
)
pOutput
;
UPDATE_DATA
(
pCtx
,
*
data
,
(
int16_t
)
val
,
notNullElems
,
isMin
,
key
);
}
else
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_INT
)
{
int32_t
*
data
=
(
int32_t
*
)
pOutput
;
#if defined(_DEBUG_VIEW)
qDebug
(
"max value updated according to pre-cal:%d"
,
*
data
);
#endif
if
((
*
data
<
val
)
^
isMin
)
{
*
data
=
(
int32_t
)
val
;
for
(
int32_t
i
=
0
;
i
<
(
pCtx
)
->
tagInfo
.
numOfTagCols
;
++
i
)
{
...
...
@@ -1041,7 +1041,7 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
__ctx
->
tag
.
i64
=
key
;
__ctx
->
tag
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
}
aAggs
[
TSDB_FUNC_TAG
].
xFunction
(
__ctx
);
}
}
...
...
@@ -1073,18 +1073,18 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
}
else
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_FLOAT
)
{
float
*
data
=
(
float
*
)
pOutput
;
double
val
=
GET_DOUBLE_VAL
(
tval
);
UPDATE_DATA
(
pCtx
,
*
data
,
(
float
)
val
,
notNullElems
,
isMin
,
key
);
}
return
;
}
void
*
p
=
GET_INPUT_DATA_LIST
(
pCtx
);
TSKEY
*
tsList
=
GET_TS_LIST
(
pCtx
);
*
notNullElems
=
0
;
if
(
IS_SIGNED_NUMERIC_TYPE
(
pCtx
->
inputType
))
{
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_TINYINT
)
{
TYPED_LOOPCHECK_N
(
int8_t
,
pOutput
,
p
,
pCtx
,
pCtx
->
inputType
,
isMin
,
*
notNullElems
);
...
...
@@ -1093,12 +1093,12 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
}
else
if
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_INT
)
{
int32_t
*
pData
=
p
;
int32_t
*
retVal
=
(
int32_t
*
)
pOutput
;
for
(
int32_t
i
=
0
;
i
<
pCtx
->
size
;
++
i
)
{
if
(
pCtx
->
hasNull
&&
isNull
((
const
char
*
)
&
pData
[
i
],
pCtx
->
inputType
))
{
continue
;
}
if
((
*
retVal
<
pData
[
i
])
^
isMin
)
{
*
retVal
=
pData
[
i
];
if
(
tsList
)
{
...
...
@@ -1135,9 +1135,9 @@ static bool min_func_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo
if
(
!
function_setup
(
pCtx
,
pResultInfo
))
{
return
false
;
// not initialized since it has been initialized
}
GET_TRUE_DATA_TYPE
();
switch
(
type
)
{
case
TSDB_DATA_TYPE_TINYINT
:
*
((
int8_t
*
)
pCtx
->
pOutput
)
=
INT8_MAX
;
...
...
@@ -1180,9 +1180,9 @@ static bool max_func_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo
if
(
!
function_setup
(
pCtx
,
pResultInfo
))
{
return
false
;
// not initialized since it has been initialized
}
GET_TRUE_DATA_TYPE
();
switch
(
type
)
{
case
TSDB_DATA_TYPE_INT
:
*
((
int32_t
*
)
pCtx
->
pOutput
)
=
INT32_MIN
;
...
...
@@ -1217,7 +1217,7 @@ static bool max_func_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo
default:
qError
(
"illegal data type:%d in min/max query"
,
pCtx
->
inputType
);
}
return
true
;
}
...
...
@@ -1227,13 +1227,13 @@ static bool max_func_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo
static
void
min_function
(
SQLFunctionCtx
*
pCtx
)
{
int32_t
notNullElems
=
0
;
minMax_function
(
pCtx
,
pCtx
->
pOutput
,
1
,
&
notNullElems
);
SET_VAL
(
pCtx
,
notNullElems
,
1
);
if
(
notNullElems
>
0
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
// set the flag for super table query
if
(
pCtx
->
stableQuery
)
{
*
(
pCtx
->
pOutput
+
pCtx
->
inputBytes
)
=
DATA_SET_FLAG
;
...
...
@@ -1244,13 +1244,13 @@ static void min_function(SQLFunctionCtx *pCtx) {
static
void
max_function
(
SQLFunctionCtx
*
pCtx
)
{
int32_t
notNullElems
=
0
;
minMax_function
(
pCtx
,
pCtx
->
pOutput
,
0
,
&
notNullElems
);
SET_VAL
(
pCtx
,
notNullElems
,
1
);
if
(
notNullElems
>
0
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
// set the flag for super table query
if
(
pCtx
->
stableQuery
)
{
*
(
pCtx
->
pOutput
+
pCtx
->
inputBytes
)
=
DATA_SET_FLAG
;
...
...
@@ -1260,16 +1260,16 @@ static void max_function(SQLFunctionCtx *pCtx) {
static
int32_t
minmax_merge_impl
(
SQLFunctionCtx
*
pCtx
,
int32_t
bytes
,
char
*
output
,
bool
isMin
)
{
int32_t
notNullElems
=
0
;
GET_TRUE_DATA_TYPE
();
assert
(
pCtx
->
stableQuery
);
for
(
int32_t
i
=
0
;
i
<
pCtx
->
size
;
++
i
)
{
char
*
input
=
GET_INPUT_DATA
(
pCtx
,
i
);
if
(
input
[
bytes
]
!=
DATA_SET_FLAG
)
{
continue
;
}
switch
(
type
)
{
case
TSDB_DATA_TYPE_TINYINT
:
{
int8_t
v
=
GET_INT8_VAL
(
input
);
...
...
@@ -1285,12 +1285,12 @@ static int32_t minmax_merge_impl(SQLFunctionCtx *pCtx, int32_t bytes, char *outp
int32_t
v
=
GET_INT32_VAL
(
input
);
if
((
*
(
int32_t
*
)
output
<
v
)
^
isMin
)
{
*
(
int32_t
*
)
output
=
v
;
for
(
int32_t
j
=
0
;
j
<
pCtx
->
tagInfo
.
numOfTagCols
;
++
j
)
{
SQLFunctionCtx
*
__ctx
=
pCtx
->
tagInfo
.
pTagCtxList
[
j
];
aAggs
[
TSDB_FUNC_TAG
].
xFunction
(
__ctx
);
}
notNullElems
++
;
}
break
;
...
...
@@ -1339,15 +1339,15 @@ static int32_t minmax_merge_impl(SQLFunctionCtx *pCtx, int32_t bytes, char *outp
break
;
}
}
return
notNullElems
;
}
static
void
min_func_merge
(
SQLFunctionCtx
*
pCtx
)
{
int32_t
notNullElems
=
minmax_merge_impl
(
pCtx
,
pCtx
->
outputBytes
,
pCtx
->
pOutput
,
1
);
SET_VAL
(
pCtx
,
notNullElems
,
1
);
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
if
(
notNullElems
>
0
)
{
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
...
...
@@ -1356,9 +1356,9 @@ static void min_func_merge(SQLFunctionCtx *pCtx) {
static
void
max_func_merge
(
SQLFunctionCtx
*
pCtx
)
{
int32_t
numOfElem
=
minmax_merge_impl
(
pCtx
,
pCtx
->
outputBytes
,
pCtx
->
pOutput
,
0
);
SET_VAL
(
pCtx
,
numOfElem
,
1
);
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
if
(
numOfElem
>
0
)
{
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录