Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
cdd7eed7
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
cdd7eed7
编写于
3月 30, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-2819] refactor codes.
上级
60010d2e
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
829 addition
and
809 deletion
+829
-809
src/client/inc/tscUtil.h
src/client/inc/tscUtil.h
+1
-1
src/client/inc/tsclient.h
src/client/inc/tsclient.h
+1
-1
src/client/src/tscServer.c
src/client/src/tscServer.c
+4
-4
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+11
-12
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+61
-61
src/os/tests/test.cpp
src/os/tests/test.cpp
+1
-1
src/query/inc/qExecutor.h
src/query/inc/qExecutor.h
+6
-6
src/query/inc/qPlan.h
src/query/inc/qPlan.h
+23
-0
src/query/inc/qUtil.h
src/query/inc/qUtil.h
+4
-4
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+0
-2
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+633
-633
src/query/src/qPlan.c
src/query/src/qPlan.c
+20
-20
src/query/src/qUtil.c
src/query/src/qUtil.c
+13
-13
src/query/src/queryMain.c
src/query/src/queryMain.c
+5
-5
src/tsdb/src/tsdbRead.c
src/tsdb/src/tsdbRead.c
+1
-1
tests/script/general/parser/testSuite.sim
tests/script/general/parser/testSuite.sim
+45
-45
未找到文件。
src/client/inc/tscUtil.h
浏览文件 @
cdd7eed7
...
...
@@ -300,7 +300,7 @@ CChildTableMeta* tscCreateChildMeta(STableMeta* pTableMeta);
uint32_t
tscGetTableMetaMaxSize
();
int32_t
tscCreateTableMetaFromCChildMeta
(
STableMeta
*
pChild
,
const
char
*
name
);
STableMeta
*
tscTableMetaDup
(
STableMeta
*
pTableMeta
);
int32_t
tscCreateQueryFromQueryInfo
(
SQueryInfo
*
pQueryInfo
,
SQuery
*
pQuery
,
void
*
addr
);
int32_t
tscCreateQueryFromQueryInfo
(
SQueryInfo
*
pQueryInfo
,
SQuery
Attr
*
pQueryAttr
,
void
*
addr
);
void
tsCreateSQLFunctionCtx
(
SQueryInfo
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
,
SSchemaEx
*
pSchema
);
void
*
createQueryInfoFromQueryNode
(
SQueryInfo
*
pQueryInfo
,
SExprInfo
*
pExprs
,
STableGroupInfo
*
pTableGroupInfo
,
...
...
src/client/inc/tsclient.h
浏览文件 @
cdd7eed7
...
...
@@ -216,7 +216,7 @@ typedef struct SQueryInfo {
SArray
*
pDSOperator
;
// data source operator
SArray
*
pPhyOperator
;
// physical query execution plan
SQuery
*
pQuery
;
// query object
SQuery
Attr
*
pQueryAttr
;
// query object
struct
SQueryInfo
*
sibling
;
// sibling
SArray
*
pUpstream
;
// SArray<struct SQueryInfo>
...
...
src/client/src/tscServer.c
浏览文件 @
cdd7eed7
...
...
@@ -703,7 +703,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
}
SQueryInfo
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
SQuery
query
=
{
0
};
SQuery
Attr
query
=
{
0
};
tscCreateQueryFromQueryInfo
(
pQueryInfo
,
&
query
,
pSql
);
SArray
*
tableScanOperator
=
createTableScanPlan
(
&
query
);
SArray
*
queryOperator
=
createExecOperatorPlan
(
&
query
);
...
...
@@ -2584,10 +2584,10 @@ int tscProcessShowCreateRsp(SSqlObj *pSql) {
int
tscProcessQueryRsp
(
SSqlObj
*
pSql
)
{
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryTableRsp
*
pQuery
=
(
SQueryTableRsp
*
)
pRes
->
pRsp
;
pQuery
->
qid
=
htobe64
(
pQuery
->
qid
);
SQueryTableRsp
*
pQuery
Attr
=
(
SQueryTableRsp
*
)
pRes
->
pRsp
;
pQuery
Attr
->
qid
=
htobe64
(
pQueryAttr
->
qid
);
pRes
->
qid
=
pQuery
->
qid
;
pRes
->
qid
=
pQuery
Attr
->
qid
;
pRes
->
data
=
NULL
;
tscResetForNextRetrieve
(
pRes
);
...
...
src/client/src/tscSubquery.c
浏览文件 @
cdd7eed7
...
...
@@ -2018,7 +2018,6 @@ void tscFirstRoundRetrieveCallback(void* param, TAOS_RES* tres, int numOfRows) {
}
pQueryInfo1
->
round
=
1
;
// tscDoQuery(pParent);
executeQuery
(
pParent
,
pQueryInfo1
);
}
...
...
@@ -3228,23 +3227,23 @@ void* createQueryInfoFromQueryNode(SQueryInfo* pQueryInfo, SExprInfo* pExprs, ST
// to make sure third party won't overwrite this structure
pQInfo
->
signature
=
pQInfo
;
SQuery
*
pQuery
=
&
pQInfo
->
query
;
pQInfo
->
runtimeEnv
.
pQuery
=
pQuery
;
tscCreateQueryFromQueryInfo
(
pQueryInfo
,
pQuery
,
addr
);
SQuery
Attr
*
pQueryAttr
=
&
pQInfo
->
query
;
pQInfo
->
runtimeEnv
.
pQuery
Attr
=
pQueryAttr
;
tscCreateQueryFromQueryInfo
(
pQueryInfo
,
pQuery
Attr
,
addr
);
// calculate the result row size
for
(
int16_t
col
=
0
;
col
<
numOfOutput
;
++
col
)
{
assert
(
pExprs
[
col
].
base
.
resBytes
>
0
);
pQuery
->
resultRowSize
+=
pExprs
[
col
].
base
.
resBytes
;
pQuery
Attr
->
resultRowSize
+=
pExprs
[
col
].
base
.
resBytes
;
// keep the tag length
if
(
TSDB_COL_IS_TAG
(
pExprs
[
col
].
base
.
colInfo
.
flag
))
{
pQuery
->
tagLen
+=
pExprs
[
col
].
base
.
resBytes
;
pQuery
Attr
->
tagLen
+=
pExprs
[
col
].
base
.
resBytes
;
}
}
// doUpdateExprColumnIndex(pQuery);
// int32_t ret = createFilterInfo(pQInfo, pQuery);
// doUpdateExprColumnIndex(pQuery
Attr
);
// int32_t ret = createFilterInfo(pQInfo, pQuery
Attr
);
// if (ret != TSDB_CODE_SUCCESS) {
// goto _cleanup;
// }
...
...
@@ -3275,11 +3274,11 @@ void* createQueryInfoFromQueryNode(SQueryInfo* pQueryInfo, SExprInfo* pExprs, ST
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
STimeWindow
window
=
pQuery
->
window
;
STimeWindow
window
=
pQuery
Attr
->
window
;
int32_t
index
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfGroups
;
++
i
)
{
SArray
*
pa
=
taosArrayGetP
(
pQuery
->
tableGroupInfo
.
pGroupList
,
i
);
SArray
*
pa
=
taosArrayGetP
(
pQuery
Attr
->
tableGroupInfo
.
pGroupList
,
i
);
size_t
s
=
taosArrayGetSize
(
pa
);
SArray
*
p1
=
taosArrayInit
(
s
,
POINTER_BYTES
);
...
...
@@ -3294,7 +3293,7 @@ void* createQueryInfoFromQueryNode(SQueryInfo* pQueryInfo, SExprInfo* pExprs, ST
window
.
skey
=
info
->
lastKey
;
void
*
buf
=
(
char
*
)
pQInfo
->
pBuf
+
index
*
sizeof
(
STableQueryInfo
);
STableQueryInfo
*
item
=
createTableQueryInfo
(
pQuery
,
info
->
pTable
,
pQuery
->
groupbyColumn
,
window
,
buf
);
STableQueryInfo
*
item
=
createTableQueryInfo
(
pQuery
Attr
,
info
->
pTable
,
pQueryAttr
->
groupbyColumn
,
window
,
buf
);
if
(
item
==
NULL
)
{
goto
_cleanup
;
}
...
...
@@ -3308,7 +3307,7 @@ void* createQueryInfoFromQueryNode(SQueryInfo* pQueryInfo, SExprInfo* pExprs, ST
}
}
// colIdCheck(pQuery, pQInfo);
// colIdCheck(pQuery
Attr
, pQInfo);
pQInfo
->
qId
=
0
;
if
(
qId
!=
NULL
)
{
...
...
src/client/src/tscUtil.c
浏览文件 @
cdd7eed7
...
...
@@ -3072,22 +3072,22 @@ STableMeta* tscTableMetaDup(STableMeta* pTableMeta) {
return
p
;
}
static
int32_t
createSecondaryExpr
(
SQuery
*
pQuery
,
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
)
{
static
int32_t
createSecondaryExpr
(
SQuery
Attr
*
pQueryAttr
,
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
)
{
if
(
!
tscIsSecondStageQuery
(
pQueryInfo
))
{
return
TSDB_CODE_SUCCESS
;
}
pQuery
->
numOfExpr2
=
tscNumOfFields
(
pQueryInfo
);
pQuery
->
pExpr2
=
calloc
(
pQuery
->
numOfExpr2
,
sizeof
(
SExprInfo
));
if
(
pQuery
->
pExpr2
==
NULL
)
{
pQuery
Attr
->
numOfExpr2
=
tscNumOfFields
(
pQueryInfo
);
pQuery
Attr
->
pExpr2
=
calloc
(
pQueryAttr
->
numOfExpr2
,
sizeof
(
SExprInfo
));
if
(
pQuery
Attr
->
pExpr2
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfExpr2
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfExpr2
;
++
i
)
{
SInternalField
*
pField
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
i
);
SExprInfo
*
pExpr
=
pField
->
pExpr
;
SSqlExpr
*
pse
=
&
pQuery
->
pExpr2
[
i
].
base
;
SSqlExpr
*
pse
=
&
pQuery
Attr
->
pExpr2
[
i
].
base
;
pse
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
pse
->
resColId
=
pExpr
->
base
.
resColId
;
...
...
@@ -3096,8 +3096,8 @@ static int32_t createSecondaryExpr(SQuery* pQuery, SQueryInfo* pQueryInfo, STabl
pse
->
functionId
=
TSDB_FUNC_PRJ
;
pse
->
colInfo
.
colId
=
pExpr
->
base
.
resColId
;
for
(
int32_t
j
=
0
;
j
<
pQuery
->
numOfOutput
;
++
j
)
{
if
(
pQuery
->
pExpr1
[
j
].
base
.
resColId
==
pse
->
colInfo
.
colId
)
{
for
(
int32_t
j
=
0
;
j
<
pQuery
Attr
->
numOfOutput
;
++
j
)
{
if
(
pQuery
Attr
->
pExpr1
[
j
].
base
.
resColId
==
pse
->
colInfo
.
colId
)
{
pse
->
colInfo
.
colIndex
=
j
;
}
}
...
...
@@ -3126,9 +3126,9 @@ static int32_t createSecondaryExpr(SQuery* pQuery, SQueryInfo* pQueryInfo, STabl
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
createTagColumnInfo
(
SQuery
*
pQuery
,
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
)
{
pQuery
->
numOfTags
=
(
int32_t
)
taosArrayGetSize
(
pTableMetaInfo
->
tagColList
);
if
(
pQuery
->
numOfTags
==
0
)
{
static
int32_t
createTagColumnInfo
(
SQuery
Attr
*
pQueryAttr
,
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
)
{
pQuery
Attr
->
numOfTags
=
(
int32_t
)
taosArrayGetSize
(
pTableMetaInfo
->
tagColList
);
if
(
pQuery
Attr
->
numOfTags
==
0
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -3136,13 +3136,13 @@ static int32_t createTagColumnInfo(SQuery* pQuery, SQueryInfo* pQueryInfo, STabl
int32_t
numOfTagColumns
=
tscGetNumOfTags
(
pTableMeta
);
pQuery
->
tagColList
=
calloc
(
pQuery
->
numOfTags
,
sizeof
(
SColumnInfo
));
if
(
pQuery
->
tagColList
==
NULL
)
{
pQuery
Attr
->
tagColList
=
calloc
(
pQueryAttr
->
numOfTags
,
sizeof
(
SColumnInfo
));
if
(
pQuery
Attr
->
tagColList
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
SSchema
*
pSchema
=
tscGetTableTagSchema
(
pTableMeta
);
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfTags
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfTags
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
pTableMetaInfo
->
tagColList
,
i
);
SSchema
*
pColSchema
=
&
pSchema
[
pCol
->
colIndex
.
columnIndex
];
...
...
@@ -3151,7 +3151,7 @@ static int32_t createTagColumnInfo(SQuery* pQuery, SQueryInfo* pQueryInfo, STabl
return
TSDB_CODE_TSC_INVALID_SQL
;
}
SColumnInfo
*
pTagCol
=
&
pQuery
->
tagColList
[
i
];
SColumnInfo
*
pTagCol
=
&
pQuery
Attr
->
tagColList
[
i
];
pTagCol
->
colId
=
pColSchema
->
colId
;
pTagCol
->
bytes
=
pColSchema
->
bytes
;
...
...
@@ -3162,98 +3162,98 @@ static int32_t createTagColumnInfo(SQuery* pQuery, SQueryInfo* pQueryInfo, STabl
return
TSDB_CODE_SUCCESS
;
}
int32_t
tscCreateQueryFromQueryInfo
(
SQueryInfo
*
pQueryInfo
,
SQuery
*
pQuery
,
void
*
addr
)
{
memset
(
pQuery
,
0
,
sizeof
(
SQuery
));
int32_t
tscCreateQueryFromQueryInfo
(
SQueryInfo
*
pQueryInfo
,
SQuery
Attr
*
pQueryAttr
,
void
*
addr
)
{
memset
(
pQuery
Attr
,
0
,
sizeof
(
SQueryAttr
));
int16_t
numOfCols
=
taosArrayGetSize
(
pQueryInfo
->
colList
);
int16_t
numOfOutput
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
pQuery
->
topBotQuery
=
tscIsTopBotQuery
(
pQueryInfo
);
pQuery
->
hasTagResults
=
hasTagValOutput
(
pQueryInfo
);
pQuery
->
stabledev
=
isStabledev
(
pQueryInfo
);
pQuery
->
tsCompQuery
=
isTsCompQuery
(
pQueryInfo
);
pQuery
->
simpleAgg
=
isSimpleAggregate
(
pQueryInfo
);
pQuery
->
needReverseScan
=
tscNeedReverseScan
(
pQueryInfo
);
pQuery
->
stableQuery
=
QUERY_IS_STABLE_QUERY
(
pQueryInfo
->
type
);
pQuery
->
groupbyColumn
=
tscGroupbyColumn
(
pQueryInfo
);
pQuery
->
queryBlockDist
=
isBlockDistQuery
(
pQueryInfo
);
pQuery
->
pointInterpQuery
=
tscIsPointInterpQuery
(
pQueryInfo
);
pQuery
->
timeWindowInterpo
=
timeWindowInterpoRequired
(
pQueryInfo
);
pQuery
->
numOfCols
=
numOfCols
;
pQuery
->
numOfOutput
=
numOfOutput
;
pQuery
->
limit
=
pQueryInfo
->
limit
;
pQuery
->
order
=
pQueryInfo
->
order
;
pQuery
->
fillType
=
pQueryInfo
->
fillType
;
pQuery
->
groupbyColumn
=
tscGroupbyColumn
(
pQueryInfo
);
pQuery
->
window
=
pQueryInfo
->
window
;
memcpy
(
&
pQuery
->
interval
,
&
pQueryInfo
->
interval
,
sizeof
(
pQuery
->
interval
));
pQuery
Attr
->
topBotQuery
=
tscIsTopBotQuery
(
pQueryInfo
);
pQuery
Attr
->
hasTagResults
=
hasTagValOutput
(
pQueryInfo
);
pQuery
Attr
->
stabledev
=
isStabledev
(
pQueryInfo
);
pQuery
Attr
->
tsCompQuery
=
isTsCompQuery
(
pQueryInfo
);
pQuery
Attr
->
simpleAgg
=
isSimpleAggregate
(
pQueryInfo
);
pQuery
Attr
->
needReverseScan
=
tscNeedReverseScan
(
pQueryInfo
);
pQuery
Attr
->
stableQuery
=
QUERY_IS_STABLE_QUERY
(
pQueryInfo
->
type
);
pQuery
Attr
->
groupbyColumn
=
tscGroupbyColumn
(
pQueryInfo
);
pQuery
Attr
->
queryBlockDist
=
isBlockDistQuery
(
pQueryInfo
);
pQuery
Attr
->
pointInterpQuery
=
tscIsPointInterpQuery
(
pQueryInfo
);
pQuery
Attr
->
timeWindowInterpo
=
timeWindowInterpoRequired
(
pQueryInfo
);
pQuery
Attr
->
numOfCols
=
numOfCols
;
pQuery
Attr
->
numOfOutput
=
numOfOutput
;
pQuery
Attr
->
limit
=
pQueryInfo
->
limit
;
pQuery
Attr
->
order
=
pQueryInfo
->
order
;
pQuery
Attr
->
fillType
=
pQueryInfo
->
fillType
;
pQuery
Attr
->
groupbyColumn
=
tscGroupbyColumn
(
pQueryInfo
);
pQuery
Attr
->
window
=
pQueryInfo
->
window
;
memcpy
(
&
pQuery
Attr
->
interval
,
&
pQueryInfo
->
interval
,
sizeof
(
pQueryAttr
->
interval
));
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
0
];
pQuery
->
pGroupbyExpr
=
calloc
(
1
,
sizeof
(
SSqlGroupbyExpr
));
*
(
pQuery
->
pGroupbyExpr
)
=
pQueryInfo
->
groupbyExpr
;
pQuery
Attr
->
pGroupbyExpr
=
calloc
(
1
,
sizeof
(
SSqlGroupbyExpr
));
*
(
pQuery
Attr
->
pGroupbyExpr
)
=
pQueryInfo
->
groupbyExpr
;
pQuery
->
pExpr1
=
calloc
(
pQuery
->
numOfOutput
,
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
pQuery
Attr
->
pExpr1
=
calloc
(
pQueryAttr
->
numOfOutput
,
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
tscSqlExprAssign
(
&
pQuery
->
pExpr1
[
i
],
pExpr
);
tscSqlExprAssign
(
&
pQuery
Attr
->
pExpr1
[
i
],
pExpr
);
}
pQuery
->
colList
=
calloc
(
numOfCols
,
sizeof
(
SColumnInfo
));
pQuery
Attr
->
colList
=
calloc
(
numOfCols
,
sizeof
(
SColumnInfo
));
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
pQueryInfo
->
colList
,
i
);
if
(
!
isValidDataType
(
pCol
->
info
.
type
)
||
pCol
->
info
.
type
==
TSDB_DATA_TYPE_NULL
)
{
assert
(
0
);
}
pQuery
->
colList
[
i
]
=
pCol
->
info
;
pQuery
->
colList
[
i
].
filterInfo
=
tFilterInfoDup
(
pCol
->
info
.
filterInfo
,
pQuery
->
colList
[
i
].
numOfFilters
);
pQuery
Attr
->
colList
[
i
]
=
pCol
->
info
;
pQuery
Attr
->
colList
[
i
].
filterInfo
=
tFilterInfoDup
(
pCol
->
info
.
filterInfo
,
pQueryAttr
->
colList
[
i
].
numOfFilters
);
}
// for simple table, not for super table
int32_t
code
=
createSecondaryExpr
(
pQuery
,
pQueryInfo
,
pTableMetaInfo
);
int32_t
code
=
createSecondaryExpr
(
pQuery
Attr
,
pQueryInfo
,
pTableMetaInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
// tag column info
code
=
createTagColumnInfo
(
pQuery
,
pQueryInfo
,
pTableMetaInfo
);
code
=
createTagColumnInfo
(
pQuery
Attr
,
pQueryInfo
,
pTableMetaInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
if
(
pQuery
->
fillType
!=
TSDB_FILL_NONE
)
{
pQuery
->
fillVal
=
calloc
(
pQuery
->
numOfOutput
,
sizeof
(
int64_t
));
memcpy
(
pQuery
->
fillVal
,
pQueryInfo
->
fillVal
,
pQuery
->
numOfOutput
*
sizeof
(
int64_t
));
if
(
pQuery
Attr
->
fillType
!=
TSDB_FILL_NONE
)
{
pQuery
Attr
->
fillVal
=
calloc
(
pQueryAttr
->
numOfOutput
,
sizeof
(
int64_t
));
memcpy
(
pQuery
Attr
->
fillVal
,
pQueryInfo
->
fillVal
,
pQueryAttr
->
numOfOutput
*
sizeof
(
int64_t
));
}
pQuery
->
srcRowSize
=
0
;
pQuery
->
maxTableColumnWidth
=
0
;
pQuery
Attr
->
srcRowSize
=
0
;
pQuery
Attr
->
maxTableColumnWidth
=
0
;
for
(
int16_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
pQuery
->
srcRowSize
+=
pQuery
->
colList
[
i
].
bytes
;
if
(
pQuery
->
maxTableColumnWidth
<
pQuery
->
colList
[
i
].
bytes
)
{
pQuery
->
maxTableColumnWidth
=
pQuery
->
colList
[
i
].
bytes
;
pQuery
Attr
->
srcRowSize
+=
pQueryAttr
->
colList
[
i
].
bytes
;
if
(
pQuery
Attr
->
maxTableColumnWidth
<
pQueryAttr
->
colList
[
i
].
bytes
)
{
pQuery
Attr
->
maxTableColumnWidth
=
pQueryAttr
->
colList
[
i
].
bytes
;
}
}
pQuery
->
interBufSize
=
getOutputInterResultBufSize
(
pQuery
);
pQuery
Attr
->
interBufSize
=
getOutputInterResultBufSize
(
pQueryAttr
);
if
(
pQuery
->
numOfCols
<=
0
&&
!
tscQueryTags
(
pQueryInfo
)
&&
!
pQuery
->
queryBlockDist
)
{
if
(
pQuery
Attr
->
numOfCols
<=
0
&&
!
tscQueryTags
(
pQueryInfo
)
&&
!
pQueryAttr
->
queryBlockDist
)
{
tscError
(
"%p illegal value of numOfCols in query msg: %"
PRIu64
", table cols:%d"
,
addr
,
(
uint64_t
)
pQuery
->
numOfCols
,
numOfCols
);
(
uint64_t
)
pQuery
Attr
->
numOfCols
,
numOfCols
);
return
TSDB_CODE_TSC_INVALID_SQL
;
}
if
(
pQuery
->
interval
.
interval
<
0
)
{
if
(
pQuery
Attr
->
interval
.
interval
<
0
)
{
tscError
(
"%p illegal value of aggregation time interval in query msg: %"
PRId64
,
addr
,
(
int64_t
)
pQueryInfo
->
interval
.
interval
);
return
TSDB_CODE_TSC_INVALID_SQL
;
}
if
(
pQuery
->
pGroupbyExpr
->
numOfGroupCols
<
0
)
{
if
(
pQuery
Attr
->
pGroupbyExpr
->
numOfGroupCols
<
0
)
{
tscError
(
"%p illegal value of numOfGroupCols in query msg: %d"
,
addr
,
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
);
return
TSDB_CODE_TSC_INVALID_SQL
;
}
...
...
src/os/tests/test.cpp
浏览文件 @
cdd7eed7
...
...
@@ -18,7 +18,7 @@ TEST(testCase, parse_time) {
deltaToUtcInitOnce
();
// window: 1500000001000, 1500002000000
// pQuery->interval: interval: 86400000, sliding:3600000
// pQuery
Attr
->interval: interval: 86400000, sliding:3600000
int64_t
key
=
1500000001000
;
SInterval
interval
=
{
0
};
interval
.
interval
=
86400000
;
...
...
src/query/inc/qExecutor.h
浏览文件 @
cdd7eed7
...
...
@@ -179,7 +179,7 @@ typedef struct SSDataBlock {
// The basic query information extracted from the SQueryInfo tree to support the
// execution of query in a data node.
typedef
struct
SQuery
{
typedef
struct
SQuery
Attr
{
SLimitVal
limit
;
bool
stableQuery
;
// super table query or not
...
...
@@ -226,7 +226,7 @@ typedef struct SQuery {
SMemRef
memRef
;
STableGroupInfo
tableGroupInfo
;
// table <tid, last_key> list SArray<STableKeyInfo>
int32_t
vgId
;
}
SQuery
;
}
SQuery
Attr
;
typedef
SSDataBlock
*
(
*
__operator_fn_t
)(
void
*
param
);
typedef
void
(
*
__optr_cleanup_fn_t
)(
void
*
param
,
int32_t
num
);
...
...
@@ -235,7 +235,7 @@ struct SOperatorInfo;
typedef
struct
SQueryRuntimeEnv
{
jmp_buf
env
;
SQuery
*
pQuery
;
SQuery
Attr
*
pQueryAttr
;
uint32_t
status
;
// query status
void
*
qinfo
;
uint8_t
scanFlag
;
// denotes reversed scan of data or not
...
...
@@ -324,7 +324,7 @@ typedef struct SQInfo {
int64_t
owner
;
// if it is in execution
SQueryRuntimeEnv
runtimeEnv
;
SQuery
query
;
SQuery
Attr
query
;
void
*
pBuf
;
// allocated buffer for STableQueryInfo, sizeof(STableQueryInfo)*numOfTables;
pthread_mutex_t
lock
;
// used to synchronize the rsp/query threads
...
...
@@ -451,14 +451,14 @@ int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, SQInfo* pQInfo, SQueryPara
void
freeColumnFilterInfo
(
SColumnFilterInfo
*
pFilter
,
int32_t
numOfFilters
);
STableQueryInfo
*
createTableQueryInfo
(
SQuery
*
pQuery
,
void
*
pTable
,
bool
groupbyColumn
,
STimeWindow
win
,
void
*
buf
);
STableQueryInfo
*
createTableQueryInfo
(
SQuery
Attr
*
pQueryAttr
,
void
*
pTable
,
bool
groupbyColumn
,
STimeWindow
win
,
void
*
buf
);
bool
isQueryKilled
(
SQInfo
*
pQInfo
);
int32_t
checkForQueryBuf
(
size_t
numOfTables
);
bool
doBuildResCheck
(
SQInfo
*
pQInfo
);
void
setQueryStatus
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int8_t
status
);
bool
onlyQueryTags
(
SQuery
*
pQuery
);
bool
onlyQueryTags
(
SQuery
Attr
*
pQueryAttr
);
bool
isValidQInfo
(
void
*
param
);
int32_t
doDumpQueryResult
(
SQInfo
*
pQInfo
,
char
*
data
);
...
...
src/query/inc/qPlan.h
0 → 100644
浏览文件 @
cdd7eed7
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TDENGINE_QPLAN_H
#define TDENGINE_QPLAN_H
//TODO refactor
SArray
*
createTableScanPlan
(
SQueryAttr
*
pQueryAttr
);
SArray
*
createExecOperatorPlan
(
SQueryAttr
*
pQueryAttr
);
#endif // TDENGINE_QPLAN_H
src/query/inc/qUtil.h
浏览文件 @
cdd7eed7
...
...
@@ -29,7 +29,7 @@
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
#define GET_ROW_PARAM_FOR_MULTIOUTPUT(_q, tbq, sq) (((tbq) && (!(sq)))? (_q)->pExpr1[1].base.param[0].i64:1)
int32_t
getOutputInterResultBufSize
(
SQuery
*
pQuery
);
int32_t
getOutputInterResultBufSize
(
SQuery
Attr
*
pQueryAttr
);
size_t
getResultRowSize
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
int32_t
initResultRowInfo
(
SResultRowInfo
*
pResultRowInfo
,
int32_t
size
,
int16_t
type
);
...
...
@@ -51,10 +51,10 @@ static FORCE_INLINE SResultRow *getResultRow(SResultRowInfo *pResultRowInfo, int
return
pResultRowInfo
->
pResult
[
slot
];
}
static
FORCE_INLINE
char
*
getPosInResultPage
(
SQuery
*
pQuery
,
tFilePage
*
page
,
int32_t
rowOffset
,
int16_t
offset
)
{
assert
(
rowOffset
>=
0
&&
pQuery
!=
NULL
);
static
FORCE_INLINE
char
*
getPosInResultPage
(
SQuery
Attr
*
pQueryAttr
,
tFilePage
*
page
,
int32_t
rowOffset
,
int16_t
offset
)
{
assert
(
rowOffset
>=
0
&&
pQuery
Attr
!=
NULL
);
int32_t
numOfRows
=
(
int32_t
)
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQuery
,
pQuery
->
topBotQuery
,
pQuery
->
stableQuery
);
int32_t
numOfRows
=
(
int32_t
)
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQuery
Attr
,
pQueryAttr
->
topBotQuery
,
pQueryAttr
->
stableQuery
);
return
((
char
*
)
page
->
data
)
+
rowOffset
+
offset
*
numOfRows
;
}
...
...
src/query/src/qAggMain.c
浏览文件 @
cdd7eed7
...
...
@@ -3318,8 +3318,6 @@ static void col_project_function_f(SQLFunctionCtx *pCtx, int32_t index) {
INC_INIT_VAL
(
pCtx
,
1
);
char
*
pData
=
GET_INPUT_DATA
(
pCtx
,
index
);
memcpy
(
pCtx
->
pOutput
,
pData
,
pCtx
->
inputBytes
);
pCtx
->
pOutput
+=
pCtx
->
inputBytes
;
}
/**
...
...
src/query/src/qExecutor.c
浏览文件 @
cdd7eed7
...
...
@@ -105,19 +105,19 @@ int32_t getMaximumIdleDurationSec() {
return
tsShellActivityTimer
*
2
;
}
static
void
getNextTimeWindow
(
SQuery
*
pQuery
,
STimeWindow
*
tw
)
{
int32_t
factor
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
->
order
.
order
);
if
(
pQuery
->
interval
.
intervalUnit
!=
'n'
&&
pQuery
->
interval
.
intervalUnit
!=
'y'
)
{
tw
->
skey
+=
pQuery
->
interval
.
sliding
*
factor
;
tw
->
ekey
=
tw
->
skey
+
pQuery
->
interval
.
interval
-
1
;
static
void
getNextTimeWindow
(
SQuery
Attr
*
pQueryAttr
,
STimeWindow
*
tw
)
{
int32_t
factor
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
Attr
->
order
.
order
);
if
(
pQuery
Attr
->
interval
.
intervalUnit
!=
'n'
&&
pQueryAttr
->
interval
.
intervalUnit
!=
'y'
)
{
tw
->
skey
+=
pQuery
Attr
->
interval
.
sliding
*
factor
;
tw
->
ekey
=
tw
->
skey
+
pQuery
Attr
->
interval
.
interval
-
1
;
return
;
}
int64_t
key
=
tw
->
skey
/
1000
,
interval
=
pQuery
->
interval
.
interval
;
if
(
pQuery
->
precision
==
TSDB_TIME_PRECISION_MICRO
)
{
int64_t
key
=
tw
->
skey
/
1000
,
interval
=
pQuery
Attr
->
interval
.
interval
;
if
(
pQuery
Attr
->
precision
==
TSDB_TIME_PRECISION_MICRO
)
{
key
/=
1000
;
}
if
(
pQuery
->
interval
.
intervalUnit
==
'y'
)
{
if
(
pQuery
Attr
->
interval
.
intervalUnit
==
'y'
)
{
interval
*=
12
;
}
...
...
@@ -135,7 +135,7 @@ static void getNextTimeWindow(SQuery* pQuery, STimeWindow* tw) {
tm
.
tm_mon
=
mon
%
12
;
tw
->
ekey
=
mktime
(
&
tm
)
*
1000L
;
if
(
pQuery
->
precision
==
TSDB_TIME_PRECISION_MICRO
)
{
if
(
pQuery
Attr
->
precision
==
TSDB_TIME_PRECISION_MICRO
)
{
tw
->
skey
*=
1000L
;
tw
->
ekey
*=
1000L
;
}
...
...
@@ -152,18 +152,18 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
static
void
setBlockStatisInfo
(
SQLFunctionCtx
*
pCtx
,
SSDataBlock
*
pSDataBlock
,
SColIndex
*
pColIndex
);
static
void
destroyTableQueryInfoImpl
(
STableQueryInfo
*
pTableQueryInfo
);
static
bool
hasMainOutput
(
SQuery
*
pQuery
);
static
bool
hasMainOutput
(
SQuery
Attr
*
pQueryAttr
);
static
int32_t
setTimestampListJoinInfo
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
tVariant
*
pTag
,
STableQueryInfo
*
pTableQueryInfo
);
static
void
releaseQueryBuf
(
size_t
numOfTables
);
static
int32_t
binarySearchForKey
(
char
*
pValue
,
int
num
,
TSKEY
key
,
int
order
);
static
STsdbQueryCond
createTsdbQueryCond
(
SQuery
*
pQuery
,
STimeWindow
*
win
);
static
STsdbQueryCond
createTsdbQueryCond
(
SQuery
Attr
*
pQueryAttr
,
STimeWindow
*
win
);
static
STableIdInfo
createTableIdInfo
(
STableQueryInfo
*
pTableQueryInfo
);
static
void
setTableScanFilterOperatorInfo
(
STableScanInfo
*
pTableScanInfo
,
SOperatorInfo
*
pDownstream
);
static
int32_t
getNumOfScanTimes
(
SQuery
*
pQuery
);
//static bool isFixedOutputQuery(SQuery
* pQuery
);
static
int32_t
getNumOfScanTimes
(
SQuery
Attr
*
pQueryAttr
);
//static bool isFixedOutputQuery(SQuery
Attr* pQueryAttr
);
static
SOperatorInfo
*
createDataBlocksOptScanInfo
(
void
*
pTsdbQueryHandle
,
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
repeatTime
,
int32_t
reverseTime
);
static
SOperatorInfo
*
createTableScanOperator
(
void
*
pTsdbQueryHandle
,
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
repeatTime
);
...
...
@@ -195,9 +195,9 @@ static int32_t getGroupbyColumnIndex(SSqlGroupbyExpr *pGroupbyExpr, SSDataBlock*
static
int32_t
setGroupResultOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupbyOperatorInfo
*
pInfo
,
int32_t
numOfCols
,
char
*
pData
,
int16_t
type
,
int16_t
bytes
,
int32_t
groupIndex
);
static
void
initCtxOutputBuffer
(
SQLFunctionCtx
*
pCtx
,
int32_t
size
);
static
void
getAlignQueryTimeWindow
(
SQuery
*
pQuery
,
int64_t
key
,
int64_t
keyFirst
,
int64_t
keyLast
,
STimeWindow
*
win
);
//static bool isPointInterpoQuery(SQuery
*pQuery
);
static
void
setResultBufSize
(
SQuery
*
pQuery
,
SRspResultInfo
*
pResultInfo
);
static
void
getAlignQueryTimeWindow
(
SQuery
Attr
*
pQueryAttr
,
int64_t
key
,
int64_t
keyFirst
,
int64_t
keyLast
,
STimeWindow
*
win
);
//static bool isPointInterpoQuery(SQuery
Attr *pQueryAttr
);
static
void
setResultBufSize
(
SQuery
Attr
*
pQueryAttr
,
SRspResultInfo
*
pResultInfo
);
static
void
setCtxTagForJoin
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
SExprInfo
*
pExprInfo
,
void
*
pTable
);
static
void
setParamForStableStddev
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
,
SExprInfo
*
pExpr
);
static
void
doSetTableGroupOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
...
...
@@ -243,8 +243,8 @@ static void* destroyOutputBuf(SSDataBlock* pBlock) {
}
int32_t
getNumOfResult
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
bool
hasMainFunction
=
hasMainOutput
(
pQuery
);
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
bool
hasMainFunction
=
hasMainOutput
(
pQuery
Attr
);
int32_t
maxOutput
=
0
;
for
(
int32_t
j
=
0
;
j
<
numOfOutput
;
++
j
)
{
...
...
@@ -294,9 +294,9 @@ static bool isSelectivityWithTagsQuery(SQLFunctionCtx *pCtx, int32_t numOfOutput
return
(
numOfSelectivity
>
0
&&
hasTags
);
}
static
bool
isProjQuery
(
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
int32_t
functId
=
pQuery
->
pExpr1
[
i
].
base
.
functionId
;
static
bool
isProjQuery
(
SQuery
Attr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
int32_t
functId
=
pQuery
Attr
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functId
!=
TSDB_FUNC_PRJ
&&
functId
!=
TSDB_FUNC_TAGPRJ
)
{
return
false
;
}
...
...
@@ -352,7 +352,7 @@ static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SRes
(
SResultRow
**
)
taosHashGet
(
pRuntimeEnv
->
pResultRowHashTable
,
pRuntimeEnv
->
keyBuf
,
GET_RES_WINDOW_KEY_LEN
(
bytes
));
// in case of repeat scan/reverse scan, no new time window added.
if
(
QUERY_IS_INTERVAL_QUERY
(
pRuntimeEnv
->
pQuery
))
{
if
(
QUERY_IS_INTERVAL_QUERY
(
pRuntimeEnv
->
pQuery
Attr
))
{
if
(
!
masterscan
)
{
// the *p1 may be NULL in case of sliding+offset exists.
return
(
p1
!=
NULL
)
?
*
p1
:
NULL
;
}
...
...
@@ -402,19 +402,19 @@ static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SRes
return
getResultRow
(
pResultRowInfo
,
pResultRowInfo
->
curIndex
);
}
static
void
getInitialStartTimeWindow
(
SQuery
*
pQuery
,
TSKEY
ts
,
STimeWindow
*
w
)
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
getAlignQueryTimeWindow
(
pQuery
,
ts
,
ts
,
pQuery
->
window
.
ekey
,
w
);
static
void
getInitialStartTimeWindow
(
SQuery
Attr
*
pQueryAttr
,
TSKEY
ts
,
STimeWindow
*
w
)
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
getAlignQueryTimeWindow
(
pQuery
Attr
,
ts
,
ts
,
pQueryAttr
->
window
.
ekey
,
w
);
}
else
{
// the start position of the first time window in the endpoint that spreads beyond the queried last timestamp
getAlignQueryTimeWindow
(
pQuery
,
ts
,
pQuery
->
window
.
ekey
,
ts
,
w
);
getAlignQueryTimeWindow
(
pQuery
Attr
,
ts
,
pQueryAttr
->
window
.
ekey
,
ts
,
w
);
int64_t
key
=
w
->
skey
;
while
(
key
<
ts
)
{
// moving towards end
if
(
pQuery
->
interval
.
intervalUnit
==
'n'
||
pQuery
->
interval
.
intervalUnit
==
'y'
)
{
key
=
taosTimeAdd
(
key
,
pQuery
->
interval
.
sliding
,
pQuery
->
interval
.
slidingUnit
,
pQuery
->
precision
);
if
(
pQuery
Attr
->
interval
.
intervalUnit
==
'n'
||
pQueryAttr
->
interval
.
intervalUnit
==
'y'
)
{
key
=
taosTimeAdd
(
key
,
pQuery
Attr
->
interval
.
sliding
,
pQueryAttr
->
interval
.
slidingUnit
,
pQueryAttr
->
precision
);
}
else
{
key
+=
pQuery
->
interval
.
sliding
;
key
+=
pQuery
Attr
->
interval
.
sliding
;
}
if
(
key
>=
ts
)
{
...
...
@@ -427,21 +427,21 @@ static void getInitialStartTimeWindow(SQuery* pQuery, TSKEY ts, STimeWindow* w)
}
// get the correct time window according to the handled timestamp
static
STimeWindow
getActiveTimeWindow
(
SResultRowInfo
*
pResultRowInfo
,
int64_t
ts
,
SQuery
*
pQuery
)
{
static
STimeWindow
getActiveTimeWindow
(
SResultRowInfo
*
pResultRowInfo
,
int64_t
ts
,
SQuery
Attr
*
pQueryAttr
)
{
STimeWindow
w
=
{
0
};
if
(
pResultRowInfo
->
curIndex
==
-
1
)
{
// the first window, from the previous stored value
if
(
pResultRowInfo
->
prevSKey
==
TSKEY_INITIAL_VAL
)
{
getInitialStartTimeWindow
(
pQuery
,
ts
,
&
w
);
getInitialStartTimeWindow
(
pQuery
Attr
,
ts
,
&
w
);
pResultRowInfo
->
prevSKey
=
w
.
skey
;
}
else
{
w
.
skey
=
pResultRowInfo
->
prevSKey
;
}
if
(
pQuery
->
interval
.
intervalUnit
==
'n'
||
pQuery
->
interval
.
intervalUnit
==
'y'
)
{
w
.
ekey
=
taosTimeAdd
(
w
.
skey
,
pQuery
->
interval
.
interval
,
pQuery
->
interval
.
intervalUnit
,
pQuery
->
precision
)
-
1
;
if
(
pQuery
Attr
->
interval
.
intervalUnit
==
'n'
||
pQueryAttr
->
interval
.
intervalUnit
==
'y'
)
{
w
.
ekey
=
taosTimeAdd
(
w
.
skey
,
pQuery
Attr
->
interval
.
interval
,
pQueryAttr
->
interval
.
intervalUnit
,
pQueryAttr
->
precision
)
-
1
;
}
else
{
w
.
ekey
=
w
.
skey
+
pQuery
->
interval
.
interval
-
1
;
w
.
ekey
=
w
.
skey
+
pQuery
Attr
->
interval
.
interval
-
1
;
}
}
else
{
int32_t
slot
=
curTimeWindowIndex
(
pResultRowInfo
);
...
...
@@ -450,23 +450,23 @@ static STimeWindow getActiveTimeWindow(SResultRowInfo * pResultRowInfo, int64_t
}
if
(
w
.
skey
>
ts
||
w
.
ekey
<
ts
)
{
if
(
pQuery
->
interval
.
intervalUnit
==
'n'
||
pQuery
->
interval
.
intervalUnit
==
'y'
)
{
w
.
skey
=
taosTimeTruncate
(
ts
,
&
pQuery
->
interval
,
pQuery
->
precision
);
w
.
ekey
=
taosTimeAdd
(
w
.
skey
,
pQuery
->
interval
.
interval
,
pQuery
->
interval
.
intervalUnit
,
pQuery
->
precision
)
-
1
;
if
(
pQuery
Attr
->
interval
.
intervalUnit
==
'n'
||
pQueryAttr
->
interval
.
intervalUnit
==
'y'
)
{
w
.
skey
=
taosTimeTruncate
(
ts
,
&
pQuery
Attr
->
interval
,
pQueryAttr
->
precision
);
w
.
ekey
=
taosTimeAdd
(
w
.
skey
,
pQuery
Attr
->
interval
.
interval
,
pQueryAttr
->
interval
.
intervalUnit
,
pQueryAttr
->
precision
)
-
1
;
}
else
{
int64_t
st
=
w
.
skey
;
if
(
st
>
ts
)
{
st
-=
((
st
-
ts
+
pQuery
->
interval
.
sliding
-
1
)
/
pQuery
->
interval
.
sliding
)
*
pQuery
->
interval
.
sliding
;
st
-=
((
st
-
ts
+
pQuery
Attr
->
interval
.
sliding
-
1
)
/
pQueryAttr
->
interval
.
sliding
)
*
pQueryAttr
->
interval
.
sliding
;
}
int64_t
et
=
st
+
pQuery
->
interval
.
interval
-
1
;
int64_t
et
=
st
+
pQuery
Attr
->
interval
.
interval
-
1
;
if
(
et
<
ts
)
{
st
+=
((
ts
-
et
+
pQuery
->
interval
.
sliding
-
1
)
/
pQuery
->
interval
.
sliding
)
*
pQuery
->
interval
.
sliding
;
st
+=
((
ts
-
et
+
pQuery
Attr
->
interval
.
sliding
-
1
)
/
pQueryAttr
->
interval
.
sliding
)
*
pQueryAttr
->
interval
.
sliding
;
}
w
.
skey
=
st
;
w
.
ekey
=
w
.
skey
+
pQuery
->
interval
.
interval
-
1
;
w
.
ekey
=
w
.
skey
+
pQuery
Attr
->
interval
.
interval
-
1
;
}
}
...
...
@@ -474,8 +474,8 @@ static STimeWindow getActiveTimeWindow(SResultRowInfo * pResultRowInfo, int64_t
* query border check, skey should not be bounded by the query time range, since the value skey will
* be used as the time window index value. So we only change ekey of time window accordingly.
*/
if
(
w
.
ekey
>
pQuery
->
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
{
w
.
ekey
=
pQuery
->
window
.
ekey
;
if
(
w
.
ekey
>
pQuery
Attr
->
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQueryAttr
))
{
w
.
ekey
=
pQuery
Attr
->
window
.
ekey
;
}
return
w
;
...
...
@@ -540,7 +540,7 @@ static int32_t setWindowOutputBufByKey(SQueryRuntimeEnv *pRuntimeEnv, SResultRow
// not assign result buffer yet, add new result buffer
if
(
pResultRow
->
pageId
==
-
1
)
{
int32_t
ret
=
addNewWindowResultBuf
(
pResultRow
,
pResultBuf
,
(
int32_t
)
groupId
,
pRuntimeEnv
->
pQuery
->
intermediateResultRowSize
);
int32_t
ret
=
addNewWindowResultBuf
(
pResultRow
,
pResultBuf
,
(
int32_t
)
groupId
,
pRuntimeEnv
->
pQuery
Attr
->
intermediateResultRowSize
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
-
1
;
}
...
...
@@ -651,28 +651,28 @@ static void doUpdateResultRowIndex(SResultRowInfo*pResultRowInfo, TSKEY lastKey,
}
}
static
void
updateResultRowInfoActiveIndex
(
SResultRowInfo
*
pResultRowInfo
,
SQuery
*
pQuery
,
TSKEY
lastKey
)
{
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
);
if
((
lastKey
>
pQuery
->
window
.
ekey
&&
ascQuery
)
||
(
lastKey
<
pQuery
->
window
.
ekey
&&
(
!
ascQuery
)))
{
static
void
updateResultRowInfoActiveIndex
(
SResultRowInfo
*
pResultRowInfo
,
SQuery
Attr
*
pQueryAttr
,
TSKEY
lastKey
)
{
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
);
if
((
lastKey
>
pQuery
Attr
->
window
.
ekey
&&
ascQuery
)
||
(
lastKey
<
pQueryAttr
->
window
.
ekey
&&
(
!
ascQuery
)))
{
closeAllResultRows
(
pResultRowInfo
);
pResultRowInfo
->
curIndex
=
pResultRowInfo
->
size
-
1
;
}
else
{
int32_t
step
=
ascQuery
?
1
:
-
1
;
doUpdateResultRowIndex
(
pResultRowInfo
,
lastKey
-
step
,
ascQuery
,
pQuery
->
timeWindowInterpo
);
doUpdateResultRowIndex
(
pResultRowInfo
,
lastKey
-
step
,
ascQuery
,
pQuery
Attr
->
timeWindowInterpo
);
}
}
static
int32_t
getNumOfRowsInTimeWindow
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SDataBlockInfo
*
pDataBlockInfo
,
TSKEY
*
pPrimaryColumn
,
int32_t
startPos
,
TSKEY
ekey
,
__block_search_fn_t
searchFn
,
bool
updateLastKey
)
{
assert
(
startPos
>=
0
&&
startPos
<
pDataBlockInfo
->
rows
);
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
STableQueryInfo
*
item
=
pRuntimeEnv
->
current
;
int32_t
num
=
-
1
;
int32_t
order
=
pQuery
->
order
.
order
;
int32_t
order
=
pQuery
Attr
->
order
.
order
;
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
order
);
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
if
(
ekey
<
pDataBlockInfo
->
window
.
ekey
)
{
num
=
getForwardStepsInBlock
(
pDataBlockInfo
->
rows
,
searchFn
,
ekey
,
startPos
,
order
,
pPrimaryColumn
);
if
(
updateLastKey
)
{
// update the last key
...
...
@@ -704,7 +704,7 @@ static int32_t getNumOfRowsInTimeWindow(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc
static
void
doApplyFunctions
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
STimeWindow
*
pWin
,
int32_t
offset
,
int32_t
forwardStep
,
TSKEY
*
tsCol
,
int32_t
numOfTotal
,
int32_t
numOfOutput
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
bool
hasPrev
=
pCtx
[
0
].
preAggVals
.
isSet
;
for
(
int32_t
k
=
0
;
k
<
numOfOutput
;
++
k
)
{
...
...
@@ -713,7 +713,7 @@ static void doApplyFunctions(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx
char
*
start
=
pCtx
[
k
].
pInput
;
int32_t
pos
=
(
QUERY_IS_ASC_QUERY
(
pQuery
))
?
offset
:
offset
-
(
forwardStep
-
1
);
int32_t
pos
=
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
?
offset
:
offset
-
(
forwardStep
-
1
);
if
(
pCtx
[
k
].
pInput
!=
NULL
)
{
pCtx
[
k
].
pInput
=
(
char
*
)
pCtx
[
k
].
pInput
+
pos
*
pCtx
[
k
].
inputBytes
;
}
...
...
@@ -741,42 +741,42 @@ static void doApplyFunctions(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx
}
static
int32_t
getNextQualifiedWindow
(
SQuery
*
pQuery
,
STimeWindow
*
pNext
,
SDataBlockInfo
*
pDataBlockInfo
,
static
int32_t
getNextQualifiedWindow
(
SQuery
Attr
*
pQueryAttr
,
STimeWindow
*
pNext
,
SDataBlockInfo
*
pDataBlockInfo
,
TSKEY
*
primaryKeys
,
__block_search_fn_t
searchFn
,
int32_t
prevPosition
)
{
getNextTimeWindow
(
pQuery
,
pNext
);
getNextTimeWindow
(
pQuery
Attr
,
pNext
);
// next time window is not in current block
if
((
pNext
->
skey
>
pDataBlockInfo
->
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
(
pNext
->
ekey
<
pDataBlockInfo
->
window
.
skey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)))
{
if
((
pNext
->
skey
>
pDataBlockInfo
->
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
||
(
pNext
->
ekey
<
pDataBlockInfo
->
window
.
skey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
)))
{
return
-
1
;
}
TSKEY
startKey
=
-
1
;
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
startKey
=
pNext
->
skey
;
if
(
startKey
<
pQuery
->
window
.
skey
)
{
startKey
=
pQuery
->
window
.
skey
;
if
(
startKey
<
pQuery
Attr
->
window
.
skey
)
{
startKey
=
pQuery
Attr
->
window
.
skey
;
}
}
else
{
startKey
=
pNext
->
ekey
;
if
(
startKey
>
pQuery
->
window
.
skey
)
{
startKey
=
pQuery
->
window
.
skey
;
if
(
startKey
>
pQuery
Attr
->
window
.
skey
)
{
startKey
=
pQuery
Attr
->
window
.
skey
;
}
}
int32_t
startPos
=
0
;
// tumbling time window query, a special case of sliding time window query
if
(
pQuery
->
interval
.
sliding
==
pQuery
->
interval
.
interval
&&
prevPosition
!=
-
1
)
{
int32_t
factor
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
->
order
.
order
);
if
(
pQuery
Attr
->
interval
.
sliding
==
pQueryAttr
->
interval
.
interval
&&
prevPosition
!=
-
1
)
{
int32_t
factor
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
Attr
->
order
.
order
);
startPos
=
prevPosition
+
factor
;
}
else
{
if
(
startKey
<=
pDataBlockInfo
->
window
.
skey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
{
if
(
startKey
<=
pDataBlockInfo
->
window
.
skey
&&
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
startPos
=
0
;
}
else
if
(
startKey
>=
pDataBlockInfo
->
window
.
ekey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
))
{
}
else
if
(
startKey
>=
pDataBlockInfo
->
window
.
ekey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
startPos
=
pDataBlockInfo
->
rows
-
1
;
}
else
{
startPos
=
searchFn
((
char
*
)
primaryKeys
,
pDataBlockInfo
->
rows
,
startKey
,
pQuery
->
order
.
order
);
startPos
=
searchFn
((
char
*
)
primaryKeys
,
pDataBlockInfo
->
rows
,
startKey
,
pQuery
Attr
->
order
.
order
);
}
}
...
...
@@ -785,29 +785,29 @@ static int32_t getNextQualifiedWindow(SQuery* pQuery, STimeWindow *pNext, SDataB
* this case may happen when the time window is too small
*/
if
(
primaryKeys
==
NULL
)
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
assert
(
pDataBlockInfo
->
window
.
skey
<=
pNext
->
ekey
);
}
else
{
assert
(
pDataBlockInfo
->
window
.
ekey
>=
pNext
->
skey
);
}
}
else
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
primaryKeys
[
startPos
]
>
pNext
->
ekey
)
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
)
&&
primaryKeys
[
startPos
]
>
pNext
->
ekey
)
{
TSKEY
next
=
primaryKeys
[
startPos
];
if
(
pQuery
->
interval
.
intervalUnit
==
'n'
||
pQuery
->
interval
.
intervalUnit
==
'y'
)
{
pNext
->
skey
=
taosTimeTruncate
(
next
,
&
pQuery
->
interval
,
pQuery
->
precision
);
pNext
->
ekey
=
taosTimeAdd
(
pNext
->
skey
,
pQuery
->
interval
.
interval
,
pQuery
->
interval
.
intervalUnit
,
pQuery
->
precision
)
-
1
;
if
(
pQuery
Attr
->
interval
.
intervalUnit
==
'n'
||
pQueryAttr
->
interval
.
intervalUnit
==
'y'
)
{
pNext
->
skey
=
taosTimeTruncate
(
next
,
&
pQuery
Attr
->
interval
,
pQueryAttr
->
precision
);
pNext
->
ekey
=
taosTimeAdd
(
pNext
->
skey
,
pQuery
Attr
->
interval
.
interval
,
pQueryAttr
->
interval
.
intervalUnit
,
pQueryAttr
->
precision
)
-
1
;
}
else
{
pNext
->
ekey
+=
((
next
-
pNext
->
ekey
+
pQuery
->
interval
.
sliding
-
1
)
/
pQuery
->
interval
.
sliding
)
*
pQuery
->
interval
.
sliding
;
pNext
->
skey
=
pNext
->
ekey
-
pQuery
->
interval
.
interval
+
1
;
pNext
->
ekey
+=
((
next
-
pNext
->
ekey
+
pQuery
Attr
->
interval
.
sliding
-
1
)
/
pQueryAttr
->
interval
.
sliding
)
*
pQueryAttr
->
interval
.
sliding
;
pNext
->
skey
=
pNext
->
ekey
-
pQuery
Attr
->
interval
.
interval
+
1
;
}
}
else
if
((
!
QUERY_IS_ASC_QUERY
(
pQuery
))
&&
primaryKeys
[
startPos
]
<
pNext
->
skey
)
{
}
else
if
((
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
&&
primaryKeys
[
startPos
]
<
pNext
->
skey
)
{
TSKEY
next
=
primaryKeys
[
startPos
];
if
(
pQuery
->
interval
.
intervalUnit
==
'n'
||
pQuery
->
interval
.
intervalUnit
==
'y'
)
{
pNext
->
skey
=
taosTimeTruncate
(
next
,
&
pQuery
->
interval
,
pQuery
->
precision
);
pNext
->
ekey
=
taosTimeAdd
(
pNext
->
skey
,
pQuery
->
interval
.
interval
,
pQuery
->
interval
.
intervalUnit
,
pQuery
->
precision
)
-
1
;
if
(
pQuery
Attr
->
interval
.
intervalUnit
==
'n'
||
pQueryAttr
->
interval
.
intervalUnit
==
'y'
)
{
pNext
->
skey
=
taosTimeTruncate
(
next
,
&
pQuery
Attr
->
interval
,
pQueryAttr
->
precision
);
pNext
->
ekey
=
taosTimeAdd
(
pNext
->
skey
,
pQuery
Attr
->
interval
.
interval
,
pQueryAttr
->
interval
.
intervalUnit
,
pQueryAttr
->
precision
)
-
1
;
}
else
{
pNext
->
skey
-=
((
pNext
->
skey
-
next
+
pQuery
->
interval
.
sliding
-
1
)
/
pQuery
->
interval
.
sliding
)
*
pQuery
->
interval
.
sliding
;
pNext
->
ekey
=
pNext
->
skey
+
pQuery
->
interval
.
interval
-
1
;
pNext
->
skey
-=
((
pNext
->
skey
-
next
+
pQuery
Attr
->
interval
.
sliding
-
1
)
/
pQueryAttr
->
interval
.
sliding
)
*
pQueryAttr
->
interval
.
sliding
;
pNext
->
ekey
=
pNext
->
skey
+
pQuery
Attr
->
interval
.
interval
-
1
;
}
}
}
...
...
@@ -815,17 +815,17 @@ static int32_t getNextQualifiedWindow(SQuery* pQuery, STimeWindow *pNext, SDataB
return
startPos
;
}
static
FORCE_INLINE
TSKEY
reviseWindowEkey
(
SQuery
*
pQuery
,
STimeWindow
*
pWindow
)
{
static
FORCE_INLINE
TSKEY
reviseWindowEkey
(
SQuery
Attr
*
pQueryAttr
,
STimeWindow
*
pWindow
)
{
TSKEY
ekey
=
-
1
;
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
ekey
=
pWindow
->
ekey
;
if
(
ekey
>
pQuery
->
window
.
ekey
)
{
ekey
=
pQuery
->
window
.
ekey
;
if
(
ekey
>
pQuery
Attr
->
window
.
ekey
)
{
ekey
=
pQuery
Attr
->
window
.
ekey
;
}
}
else
{
ekey
=
pWindow
->
skey
;
if
(
ekey
<
pQuery
->
window
.
ekey
)
{
ekey
=
pQuery
->
window
.
ekey
;
if
(
ekey
<
pQuery
Attr
->
window
.
ekey
)
{
ekey
=
pQuery
Attr
->
window
.
ekey
;
}
}
...
...
@@ -853,17 +853,17 @@ static void saveDataBlockLastRow(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo*
return
;
}
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
for
(
int32_t
k
=
0
;
k
<
pQuery
->
numOfCols
;
++
k
)
{
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
for
(
int32_t
k
=
0
;
k
<
pQuery
Attr
->
numOfCols
;
++
k
)
{
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pDataBlock
,
k
);
memcpy
(
pRuntimeEnv
->
prevRow
[
k
],
((
char
*
)
pColInfo
->
pData
)
+
(
pColInfo
->
info
.
bytes
*
rowIndex
),
pColInfo
->
info
.
bytes
);
}
}
static
TSKEY
getStartTsKey
(
SQuery
*
pQuery
,
STimeWindow
*
win
,
const
TSKEY
*
tsCols
,
int32_t
rows
)
{
static
TSKEY
getStartTsKey
(
SQuery
Attr
*
pQueryAttr
,
STimeWindow
*
win
,
const
TSKEY
*
tsCols
,
int32_t
rows
)
{
TSKEY
ts
=
TSKEY_INITIAL_VAL
;
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
);
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
);
if
(
tsCols
==
NULL
)
{
ts
=
ascQuery
?
win
->
skey
:
win
->
ekey
;
}
else
{
...
...
@@ -964,10 +964,10 @@ static void doAggregateImpl(SOperatorInfo* pOperator, TSKEY startTs, SQLFunction
}
static
void
arithmeticApplyFunctions
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
for
(
int32_t
k
=
0
;
k
<
numOfOutput
;
++
k
)
{
pCtx
[
k
].
startTs
=
pQuery
->
window
.
skey
;
pCtx
[
k
].
startTs
=
pQuery
Attr
->
window
.
skey
;
aAggs
[
pCtx
[
k
].
functionId
].
xFunction
(
&
pCtx
[
k
]);
}
}
...
...
@@ -1030,9 +1030,9 @@ void doTimeWindowInterpolation(SOperatorInfo* pOperator, SOptrBasicInfo* pInfo,
static
bool
setTimeWindowInterpolationStartTs
(
SOperatorInfo
*
pOperatorInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
pos
,
int32_t
numOfRows
,
SArray
*
pDataBlock
,
const
TSKEY
*
tsCols
,
STimeWindow
*
win
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperatorInfo
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
);
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
);
TSKEY
curTs
=
tsCols
[
pos
];
TSKEY
lastTs
=
*
(
TSKEY
*
)
pRuntimeEnv
->
prevRow
[
0
];
...
...
@@ -1050,7 +1050,7 @@ static bool setTimeWindowInterpolationStartTs(SOperatorInfo* pOperatorInfo, SQLF
return
true
;
}
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
->
order
.
order
);
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
Attr
->
order
.
order
);
TSKEY
prevTs
=
((
pos
==
0
&&
ascQuery
)
||
(
pos
==
(
numOfRows
-
1
)
&&
!
ascQuery
))
?
lastTs
:
tsCols
[
pos
-
step
];
doTimeWindowInterpolation
(
pOperatorInfo
,
pOperatorInfo
->
info
,
pDataBlock
,
prevTs
,
pos
-
step
,
curTs
,
pos
,
...
...
@@ -1061,15 +1061,15 @@ static bool setTimeWindowInterpolationStartTs(SOperatorInfo* pOperatorInfo, SQLF
static
bool
setTimeWindowInterpolationEndTs
(
SOperatorInfo
*
pOperatorInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
endRowIndex
,
SArray
*
pDataBlock
,
const
TSKEY
*
tsCols
,
TSKEY
blockEkey
,
STimeWindow
*
win
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperatorInfo
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
numOfOutput
=
pOperatorInfo
->
numOfOutput
;
TSKEY
actualEndKey
=
tsCols
[
endRowIndex
];
TSKEY
key
=
QUERY_IS_ASC_QUERY
(
pQuery
)
?
win
->
ekey
:
win
->
skey
;
TSKEY
key
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
)
?
win
->
ekey
:
win
->
skey
;
// not ended in current data block, do not invoke interpolation
if
((
key
>
blockEkey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
(
key
<
blockEkey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)))
{
if
((
key
>
blockEkey
&&
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
||
(
key
<
blockEkey
&&
!
QUERY_IS_ASC_QUERY
(
pQueryAttr
)))
{
setNotInterpoWindowKey
(
pCtx
,
numOfOutput
,
RESULT_ROW_END_INTERP
);
return
false
;
}
...
...
@@ -1080,7 +1080,7 @@ static bool setTimeWindowInterpolationEndTs(SOperatorInfo* pOperatorInfo, SQLFun
return
true
;
}
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
->
order
.
order
);
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
Attr
->
order
.
order
);
int32_t
nextRowIndex
=
endRowIndex
+
step
;
assert
(
nextRowIndex
>=
0
);
...
...
@@ -1093,13 +1093,13 @@ static bool setTimeWindowInterpolationEndTs(SOperatorInfo* pOperatorInfo, SQLFun
static
void
doWindowBorderInterpolation
(
SOperatorInfo
*
pOperatorInfo
,
SSDataBlock
*
pBlock
,
SQLFunctionCtx
*
pCtx
,
SResultRow
*
pResult
,
STimeWindow
*
win
,
int32_t
startPos
,
int32_t
forwardStep
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperatorInfo
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
if
(
!
pQuery
->
timeWindowInterpo
)
{
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
if
(
!
pQuery
Attr
->
timeWindowInterpo
)
{
return
;
}
assert
(
pBlock
!=
NULL
);
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
->
order
.
order
);
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
Attr
->
order
.
order
);
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
0
);
...
...
@@ -1113,11 +1113,11 @@ static void doWindowBorderInterpolation(SOperatorInfo* pOperatorInfo, SSDataBloc
setResultRowInterpo
(
pResult
,
RESULT_ROW_START_INTERP
);
}
}
else
{
setNotInterpoWindowKey
(
pCtx
,
pQuery
->
numOfOutput
,
RESULT_ROW_START_INTERP
);
setNotInterpoWindowKey
(
pCtx
,
pQuery
Attr
->
numOfOutput
,
RESULT_ROW_START_INTERP
);
}
// point interpolation does not require the end key time window interpolation.
if
(
pQuery
->
pointInterpQuery
)
{
if
(
pQuery
Attr
->
pointInterpQuery
)
{
return
;
}
...
...
@@ -1126,13 +1126,13 @@ static void doWindowBorderInterpolation(SOperatorInfo* pOperatorInfo, SSDataBloc
if
(
!
done
)
{
int32_t
endRowIndex
=
startPos
+
(
forwardStep
-
1
)
*
step
;
TSKEY
endKey
=
QUERY_IS_ASC_QUERY
(
pQuery
)
?
pBlock
->
info
.
window
.
ekey
:
pBlock
->
info
.
window
.
skey
;
TSKEY
endKey
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
)
?
pBlock
->
info
.
window
.
ekey
:
pBlock
->
info
.
window
.
skey
;
bool
interp
=
setTimeWindowInterpolationEndTs
(
pOperatorInfo
,
pCtx
,
endRowIndex
,
pBlock
->
pDataBlock
,
tsCols
,
endKey
,
win
);
if
(
interp
)
{
setResultRowInterpo
(
pResult
,
RESULT_ROW_END_INTERP
);
}
}
else
{
setNotInterpoWindowKey
(
pCtx
,
pQuery
->
numOfOutput
,
RESULT_ROW_END_INTERP
);
setNotInterpoWindowKey
(
pCtx
,
pQuery
Attr
->
numOfOutput
,
RESULT_ROW_END_INTERP
);
}
}
...
...
@@ -1141,10 +1141,10 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperatorInfo
->
pRuntimeEnv
;
int32_t
numOfOutput
=
pOperatorInfo
->
numOfOutput
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
->
order
.
order
);
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
);
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
Attr
->
order
.
order
);
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
);
int32_t
prevIndex
=
curTimeWindowIndex
(
pResultRowInfo
);
...
...
@@ -1157,9 +1157,9 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
}
int32_t
startPos
=
ascQuery
?
0
:
(
pSDataBlock
->
info
.
rows
-
1
);
TSKEY
ts
=
getStartTsKey
(
pQuery
,
&
pSDataBlock
->
info
.
window
,
tsCols
,
pSDataBlock
->
info
.
rows
);
TSKEY
ts
=
getStartTsKey
(
pQuery
Attr
,
&
pSDataBlock
->
info
.
window
,
tsCols
,
pSDataBlock
->
info
.
rows
);
STimeWindow
win
=
getActiveTimeWindow
(
pResultRowInfo
,
ts
,
pQuery
);
STimeWindow
win
=
getActiveTimeWindow
(
pResultRowInfo
,
ts
,
pQuery
Attr
);
bool
masterScan
=
IS_MASTER_SCAN
(
pRuntimeEnv
);
SResultRow
*
pResult
=
NULL
;
...
...
@@ -1170,13 +1170,13 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
}
int32_t
forwardStep
=
0
;
TSKEY
ekey
=
reviseWindowEkey
(
pQuery
,
&
win
);
TSKEY
ekey
=
reviseWindowEkey
(
pQuery
Attr
,
&
win
);
forwardStep
=
getNumOfRowsInTimeWindow
(
pRuntimeEnv
,
&
pSDataBlock
->
info
,
tsCols
,
startPos
,
ekey
,
binarySearchForKey
,
true
);
// prev time window not interpolation yet.
int32_t
curIndex
=
curTimeWindowIndex
(
pResultRowInfo
);
if
(
prevIndex
!=
-
1
&&
prevIndex
<
curIndex
&&
pQuery
->
timeWindowInterpo
)
{
if
(
prevIndex
!=
-
1
&&
prevIndex
<
curIndex
&&
pQuery
Attr
->
timeWindowInterpo
)
{
for
(
int32_t
j
=
prevIndex
;
j
<
curIndex
;
++
j
)
{
// previous time window may be all closed already.
SResultRow
*
pRes
=
pResultRowInfo
->
pResult
[
j
];
if
(
pRes
->
closed
)
{
...
...
@@ -1198,7 +1198,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
-
1
,
tsCols
[
startPos
],
startPos
,
w
.
ekey
,
RESULT_ROW_END_INTERP
);
setResultRowInterpo
(
pResult
,
RESULT_ROW_END_INTERP
);
setNotInterpoWindowKey
(
pInfo
->
pCtx
,
pQuery
->
numOfOutput
,
RESULT_ROW_START_INTERP
);
setNotInterpoWindowKey
(
pInfo
->
pCtx
,
pQuery
Attr
->
numOfOutput
,
RESULT_ROW_START_INTERP
);
doApplyFunctions
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
w
,
startPos
,
0
,
tsCols
,
pSDataBlock
->
info
.
rows
,
numOfOutput
);
}
...
...
@@ -1218,7 +1218,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
STimeWindow
nextWin
=
win
;
while
(
1
)
{
int32_t
prevEndPos
=
(
forwardStep
-
1
)
*
step
+
startPos
;
startPos
=
getNextQualifiedWindow
(
pQuery
,
&
nextWin
,
&
pSDataBlock
->
info
,
tsCols
,
binarySearchForKey
,
prevEndPos
);
startPos
=
getNextQualifiedWindow
(
pQuery
Attr
,
&
nextWin
,
&
pSDataBlock
->
info
,
tsCols
,
binarySearchForKey
,
prevEndPos
);
if
(
startPos
<
0
)
{
break
;
}
...
...
@@ -1230,7 +1230,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
longjmp
(
pRuntimeEnv
->
env
,
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
ekey
=
reviseWindowEkey
(
pQuery
,
&
nextWin
);
ekey
=
reviseWindowEkey
(
pQuery
Attr
,
&
nextWin
);
forwardStep
=
getNumOfRowsInTimeWindow
(
pRuntimeEnv
,
&
pSDataBlock
->
info
,
tsCols
,
startPos
,
ekey
,
binarySearchForKey
,
true
);
// window start(end) key interpolation
...
...
@@ -1238,12 +1238,12 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
doApplyFunctions
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
nextWin
,
startPos
,
forwardStep
,
tsCols
,
pSDataBlock
->
info
.
rows
,
numOfOutput
);
}
if
(
pQuery
->
timeWindowInterpo
)
{
if
(
pQuery
Attr
->
timeWindowInterpo
)
{
int32_t
rowIndex
=
ascQuery
?
(
pSDataBlock
->
info
.
rows
-
1
)
:
0
;
saveDataBlockLastRow
(
pRuntimeEnv
,
&
pSDataBlock
->
info
,
pSDataBlock
->
pDataBlock
,
rowIndex
);
}
updateResultRowInfoActiveIndex
(
pResultRowInfo
,
pQuery
,
pRuntimeEnv
->
current
->
lastKey
);
updateResultRowInfoActiveIndex
(
pResultRowInfo
,
pQuery
Attr
,
pRuntimeEnv
->
current
->
lastKey
);
}
static
void
doHashGroupbyAgg
(
SOperatorInfo
*
pOperator
,
SGroupbyOperatorInfo
*
pInfo
,
SSDataBlock
*
pSDataBlock
)
{
...
...
@@ -1300,7 +1300,7 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf
bool
masterScan
=
IS_MASTER_SCAN
(
pRuntimeEnv
);
SOptrBasicInfo
*
pBInfo
=
&
pInfo
->
binfo
;
int64_t
gap
=
pOperator
->
pRuntimeEnv
->
pQuery
->
sw
.
gap
;
int64_t
gap
=
pOperator
->
pRuntimeEnv
->
pQuery
Attr
->
sw
.
gap
;
pInfo
->
numOfRows
=
0
;
TSKEY
*
tsList
=
(
TSKEY
*
)
pColInfoData
->
pData
;
...
...
@@ -1386,7 +1386,7 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SGroupbyOp
setResultRowKey
(
pResultRow
,
pData
,
type
);
if
(
pResultRow
->
pageId
==
-
1
)
{
int32_t
ret
=
addNewWindowResultBuf
(
pResultRow
,
pResultBuf
,
groupIndex
,
pRuntimeEnv
->
pQuery
->
resultRowSize
);
int32_t
ret
=
addNewWindowResultBuf
(
pResultRow
,
pResultBuf
,
groupIndex
,
pRuntimeEnv
->
pQuery
Attr
->
resultRowSize
);
if
(
ret
!=
0
)
{
return
-
1
;
}
...
...
@@ -1420,7 +1420,7 @@ static int32_t getGroupbyColumnIndex(SSqlGroupbyExpr *pGroupbyExpr, SSDataBlock*
static
bool
functionNeedToExecute
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
functionId
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
// in case of timestamp column, always generated results.
if
(
functionId
==
TSDB_FUNC_TS
)
{
...
...
@@ -1432,12 +1432,12 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
}
if
(
functionId
==
TSDB_FUNC_FIRST_DST
||
functionId
==
TSDB_FUNC_FIRST
)
{
return
QUERY_IS_ASC_QUERY
(
pQuery
);
return
QUERY_IS_ASC_QUERY
(
pQuery
Attr
);
}
// denote the order type
if
((
functionId
==
TSDB_FUNC_LAST_DST
||
functionId
==
TSDB_FUNC_LAST
))
{
return
pCtx
->
param
[
0
].
i64
==
pQuery
->
order
.
order
;
return
pCtx
->
param
[
0
].
i64
==
pQuery
Attr
->
order
.
order
;
}
// in the reverse table scan, only the following functions need to be executed
...
...
@@ -1516,7 +1516,7 @@ static int32_t setCtxTagColumnInfo(SQLFunctionCtx *pCtx, int32_t numOfOutput) {
static
SQLFunctionCtx
*
createSQLFunctionCtx
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SExprInfo
*
pExpr
,
int32_t
numOfOutput
,
int32_t
**
rowCellInfoOffset
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SQLFunctionCtx
*
pFuncCtx
=
(
SQLFunctionCtx
*
)
calloc
(
numOfOutput
,
sizeof
(
SQLFunctionCtx
));
if
(
pFuncCtx
==
NULL
)
{
...
...
@@ -1550,9 +1550,9 @@ static SQLFunctionCtx* createSQLFunctionCtx(SQueryRuntimeEnv* pRuntimeEnv, SExpr
pCtx
->
outputBytes
=
pSqlExpr
->
resBytes
;
pCtx
->
outputType
=
pSqlExpr
->
resType
;
pCtx
->
order
=
pQuery
->
order
.
order
;
pCtx
->
order
=
pQuery
Attr
->
order
.
order
;
pCtx
->
functionId
=
pSqlExpr
->
functionId
;
pCtx
->
stableQuery
=
pQuery
->
stableQuery
;
pCtx
->
stableQuery
=
pQuery
Attr
->
stableQuery
;
pCtx
->
interBufBytes
=
pSqlExpr
->
interBytes
;
pCtx
->
start
.
key
=
INT64_MIN
;
pCtx
->
end
.
key
=
INT64_MIN
;
...
...
@@ -1579,30 +1579,30 @@ static SQLFunctionCtx* createSQLFunctionCtx(SQueryRuntimeEnv* pRuntimeEnv, SExpr
int32_t
f
=
pExpr
[
0
].
base
.
functionId
;
assert
(
f
==
TSDB_FUNC_TS
||
f
==
TSDB_FUNC_TS_DUMMY
);
pCtx
->
param
[
2
].
i64
=
pQuery
->
order
.
order
;
pCtx
->
param
[
2
].
i64
=
pQuery
Attr
->
order
.
order
;
pCtx
->
param
[
2
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
pCtx
->
param
[
3
].
i64
=
functionId
;
pCtx
->
param
[
3
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
pCtx
->
param
[
1
].
i64
=
pQuery
->
order
.
orderColId
;
pCtx
->
param
[
1
].
i64
=
pQuery
Attr
->
order
.
orderColId
;
}
else
if
(
functionId
==
TSDB_FUNC_INTERP
)
{
pCtx
->
param
[
2
].
i64
=
(
int8_t
)
pQuery
->
fillType
;
if
(
pQuery
->
fillVal
!=
NULL
)
{
if
(
isNull
((
const
char
*
)
&
pQuery
->
fillVal
[
i
],
pCtx
->
inputType
))
{
pCtx
->
param
[
2
].
i64
=
(
int8_t
)
pQuery
Attr
->
fillType
;
if
(
pQuery
Attr
->
fillVal
!=
NULL
)
{
if
(
isNull
((
const
char
*
)
&
pQuery
Attr
->
fillVal
[
i
],
pCtx
->
inputType
))
{
pCtx
->
param
[
1
].
nType
=
TSDB_DATA_TYPE_NULL
;
}
else
{
// todo refactor, tVariantCreateFromBinary should handle the NULL value
if
(
pCtx
->
inputType
!=
TSDB_DATA_TYPE_BINARY
&&
pCtx
->
inputType
!=
TSDB_DATA_TYPE_NCHAR
)
{
tVariantCreateFromBinary
(
&
pCtx
->
param
[
1
],
(
char
*
)
&
pQuery
->
fillVal
[
i
],
pCtx
->
inputBytes
,
pCtx
->
inputType
);
tVariantCreateFromBinary
(
&
pCtx
->
param
[
1
],
(
char
*
)
&
pQuery
Attr
->
fillVal
[
i
],
pCtx
->
inputBytes
,
pCtx
->
inputType
);
}
}
}
}
else
if
(
functionId
==
TSDB_FUNC_TS_COMP
)
{
pCtx
->
param
[
0
].
i64
=
pQuery
->
vgId
;
//TODO this should be the parameter from client
pCtx
->
param
[
0
].
i64
=
pQuery
Attr
->
vgId
;
//TODO this should be the parameter from client
pCtx
->
param
[
0
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
}
else
if
(
functionId
==
TSDB_FUNC_TWA
)
{
pCtx
->
param
[
1
].
i64
=
pQuery
->
window
.
skey
;
pCtx
->
param
[
1
].
i64
=
pQuery
Attr
->
window
.
skey
;
pCtx
->
param
[
1
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
pCtx
->
param
[
2
].
i64
=
pQuery
->
window
.
ekey
;
pCtx
->
param
[
2
].
i64
=
pQuery
Attr
->
window
.
ekey
;
pCtx
->
param
[
2
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
}
else
if
(
functionId
==
TSDB_FUNC_ARITHM
)
{
pCtx
->
param
[
1
].
pz
=
(
char
*
)
&
pRuntimeEnv
->
sasArray
[
i
];
...
...
@@ -1611,7 +1611,7 @@ static SQLFunctionCtx* createSQLFunctionCtx(SQueryRuntimeEnv* pRuntimeEnv, SExpr
for
(
int32_t
i
=
1
;
i
<
numOfOutput
;
++
i
)
{
(
*
rowCellInfoOffset
)[
i
]
=
(
int32_t
)((
*
rowCellInfoOffset
)[
i
-
1
]
+
sizeof
(
SResultRowCellInfo
)
+
pExpr
[
i
-
1
].
base
.
interBytes
*
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQuery
,
pQuery
->
topBotQuery
,
pQuery
->
stableQuery
));
pExpr
[
i
-
1
].
base
.
interBytes
*
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQuery
Attr
,
pQueryAttr
->
topBotQuery
,
pQueryAttr
->
stableQuery
));
}
setCtxTagColumnInfo
(
pFuncCtx
,
numOfOutput
);
...
...
@@ -1639,33 +1639,33 @@ static void* destroySQLFunctionCtx(SQLFunctionCtx* pCtx, int32_t numOfOutput) {
static
int32_t
setupQueryRuntimeEnv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
numOfTables
,
SArray
*
pOperator
)
{
qDebug
(
"QInfo:%p setup runtime env"
,
pRuntimeEnv
->
qinfo
);
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
pRuntimeEnv
->
prevGroupId
=
INT32_MIN
;
pRuntimeEnv
->
pQuery
=
pQuery
;
pRuntimeEnv
->
pQuery
Attr
=
pQueryAttr
;
pRuntimeEnv
->
pResultRowHashTable
=
taosHashInit
(
numOfTables
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_NO_LOCK
);
pRuntimeEnv
->
keyBuf
=
malloc
(
pQuery
->
maxTableColumnWidth
+
sizeof
(
int64_t
));
pRuntimeEnv
->
keyBuf
=
malloc
(
pQuery
Attr
->
maxTableColumnWidth
+
sizeof
(
int64_t
));
pRuntimeEnv
->
pool
=
initResultRowPool
(
getResultRowSize
(
pRuntimeEnv
));
pRuntimeEnv
->
prevRow
=
malloc
(
POINTER_BYTES
*
pQuery
->
numOfCols
+
pQuery
->
srcRowSize
);
pRuntimeEnv
->
tagVal
=
malloc
(
pQuery
->
tagLen
);
pRuntimeEnv
->
currentOffset
=
pQuery
->
limit
.
offset
;
pRuntimeEnv
->
prevRow
=
malloc
(
POINTER_BYTES
*
pQuery
Attr
->
numOfCols
+
pQueryAttr
->
srcRowSize
);
pRuntimeEnv
->
tagVal
=
malloc
(
pQuery
Attr
->
tagLen
);
pRuntimeEnv
->
currentOffset
=
pQuery
Attr
->
limit
.
offset
;
// NOTE: pTableCheckInfo need to update the query time range and the lastKey info
pRuntimeEnv
->
pTableRetrieveTsMap
=
taosHashInit
(
numOfTables
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
false
,
HASH_NO_LOCK
);
pRuntimeEnv
->
sasArray
=
calloc
(
pQuery
->
numOfOutput
,
sizeof
(
SArithmeticSupport
));
pRuntimeEnv
->
sasArray
=
calloc
(
pQuery
Attr
->
numOfOutput
,
sizeof
(
SArithmeticSupport
));
if
(
pRuntimeEnv
->
sasArray
==
NULL
||
pRuntimeEnv
->
pResultRowHashTable
==
NULL
||
pRuntimeEnv
->
keyBuf
==
NULL
||
pRuntimeEnv
->
prevRow
==
NULL
||
pRuntimeEnv
->
tagVal
==
NULL
)
{
goto
_clean
;
}
if
(
pQuery
->
numOfCols
)
{
char
*
start
=
POINTER_BYTES
*
pQuery
->
numOfCols
+
(
char
*
)
pRuntimeEnv
->
prevRow
;
if
(
pQuery
Attr
->
numOfCols
)
{
char
*
start
=
POINTER_BYTES
*
pQuery
Attr
->
numOfCols
+
(
char
*
)
pRuntimeEnv
->
prevRow
;
pRuntimeEnv
->
prevRow
[
0
]
=
start
;
for
(
int32_t
i
=
1
;
i
<
pQuery
->
numOfCols
;
++
i
)
{
pRuntimeEnv
->
prevRow
[
i
]
=
pRuntimeEnv
->
prevRow
[
i
-
1
]
+
pQuery
->
colList
[
i
-
1
].
bytes
;
for
(
int32_t
i
=
1
;
i
<
pQuery
Attr
->
numOfCols
;
++
i
)
{
pRuntimeEnv
->
prevRow
[
i
]
=
pRuntimeEnv
->
prevRow
[
i
-
1
]
+
pQuery
Attr
->
colList
[
i
-
1
].
bytes
;
}
*
(
int64_t
*
)
pRuntimeEnv
->
prevRow
[
0
]
=
INT64_MIN
;
...
...
@@ -1681,42 +1681,42 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOf
switch
(
*
op
)
{
case
OP_TagScan
:
{
pRuntimeEnv
->
proot
=
createTagScanOperatorInfo
(
pRuntimeEnv
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
pRuntimeEnv
->
proot
=
createTagScanOperatorInfo
(
pRuntimeEnv
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
break
;
}
case
OP_MultiTableTimeInterval
:
{
pRuntimeEnv
->
proot
=
createMultiTableTimeIntervalOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
createMultiTableTimeIntervalOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
setTableScanFilterOperatorInfo
(
pRuntimeEnv
->
pTableScanner
->
info
,
pRuntimeEnv
->
proot
);
break
;
}
case
OP_TimeWindow
:
{
pRuntimeEnv
->
proot
=
createTimeIntervalOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
createTimeIntervalOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
setTableScanFilterOperatorInfo
(
pRuntimeEnv
->
pTableScanner
->
info
,
pRuntimeEnv
->
proot
);
break
;
}
case
OP_Groupby
:
{
pRuntimeEnv
->
proot
=
createGroupbyOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
createGroupbyOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
setTableScanFilterOperatorInfo
(
pRuntimeEnv
->
pTableScanner
->
info
,
pRuntimeEnv
->
proot
);
break
;
}
case
OP_SessionWindow
:
{
pRuntimeEnv
->
proot
=
createSWindowOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
createSWindowOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
setTableScanFilterOperatorInfo
(
pRuntimeEnv
->
pTableScanner
->
info
,
pRuntimeEnv
->
proot
);
break
;
}
case
OP_MultiTableAggregate
:
{
pRuntimeEnv
->
proot
=
createMultiTableAggOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
createMultiTableAggOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
setTableScanFilterOperatorInfo
(
pRuntimeEnv
->
pTableScanner
->
info
,
pRuntimeEnv
->
proot
);
break
;
}
case
OP_Aggregate
:
{
pRuntimeEnv
->
proot
=
createAggregateOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
createAggregateOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
setTableScanFilterOperatorInfo
(
pRuntimeEnv
->
pTableScanner
->
info
,
pRuntimeEnv
->
proot
);
break
;
}
...
...
@@ -1724,11 +1724,11 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOf
case
OP_Arithmetic
:
{
SOperatorInfo
*
prev
=
pRuntimeEnv
->
pTableScanner
;
if
(
i
==
0
)
{
pRuntimeEnv
->
proot
=
createArithOperatorInfo
(
pRuntimeEnv
,
prev
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
pRuntimeEnv
->
proot
=
createArithOperatorInfo
(
pRuntimeEnv
,
prev
,
pQuery
Attr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
setTableScanFilterOperatorInfo
(
pRuntimeEnv
->
pTableScanner
->
info
,
pRuntimeEnv
->
proot
);
}
else
{
prev
=
pRuntimeEnv
->
proot
;
pRuntimeEnv
->
proot
=
createArithOperatorInfo
(
pRuntimeEnv
,
prev
,
pQuery
->
pExpr2
,
pQuery
->
numOfExpr2
);
pRuntimeEnv
->
proot
=
createArithOperatorInfo
(
pRuntimeEnv
,
prev
,
pQuery
Attr
->
pExpr2
,
pQueryAttr
->
numOfExpr2
);
}
break
;
...
...
@@ -1756,71 +1756,71 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOf
}
}
/*
if (onlyQueryTags(pQuery)) { // do nothing for tags query
if (onlyQueryTags(pQuery
Attr
)) { // do nothing for tags query
} else if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
if (pQuery->stableQuery) {
} else if (QUERY_IS_INTERVAL_QUERY(pQuery
Attr
)) {
if (pQuery
Attr
->stableQuery) {
pRuntimeEnv->proot = createMultiTableTimeIntervalOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner,
pQuery
->pExpr1, pQuery
->numOfOutput);
pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
setTableScanFilterOperatorInfo(pRuntimeEnv->pTableScanner->info, pRuntimeEnv->proot);
} else {
pRuntimeEnv->proot =
createTimeIntervalOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
->pExpr1, pQuery
->numOfOutput);
createTimeIntervalOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
setTableScanFilterOperatorInfo(pRuntimeEnv->pTableScanner->info, pRuntimeEnv->proot);
if (pQuery->pExpr2 != NULL) {
if (pQuery
Attr
->pExpr2 != NULL) {
pRuntimeEnv->proot =
createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
->pExpr2, pQuery
->numOfExpr2);
createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
Attr->pExpr2, pQueryAttr
->numOfExpr2);
}
if (pQuery
->fillType != TSDB_FILL_NONE && !pQuery
->pointInterpQuery) {
if (pQuery
Attr->fillType != TSDB_FILL_NONE && !pQueryAttr
->pointInterpQuery) {
SOperatorInfo* pInfo = pRuntimeEnv->proot;
pRuntimeEnv->proot = createFillOperatorInfo(pRuntimeEnv, pInfo, pInfo->pExpr, pInfo->numOfOutput);
}
}
} else if (pQuery->groupbyColumn) {
} else if (pQuery
Attr
->groupbyColumn) {
pRuntimeEnv->proot =
createGroupbyOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
->pExpr1, pQuery
->numOfOutput);
createGroupbyOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
setTableScanFilterOperatorInfo(pRuntimeEnv->pTableScanner->info, pRuntimeEnv->proot);
if (pQuery->pExpr2 != NULL) {
pRuntimeEnv->proot = createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
->pExpr2, pQuery
->numOfExpr2);
if (pQuery
Attr
->pExpr2 != NULL) {
pRuntimeEnv->proot = createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
Attr->pExpr2, pQueryAttr
->numOfExpr2);
}
} else if (pQuery->sw.gap > 0) {
pRuntimeEnv->proot = createSWindowOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
->pExpr1, pQuery
->numOfOutput);
} else if (pQuery
Attr
->sw.gap > 0) {
pRuntimeEnv->proot = createSWindowOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
setTableScanFilterOperatorInfo(pRuntimeEnv->pTableScanner->info, pRuntimeEnv->proot);
if (pQuery->pExpr2 != NULL) {
pRuntimeEnv->proot = createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
->pExpr2, pQuery
->numOfExpr2);
if (pQuery
Attr
->pExpr2 != NULL) {
pRuntimeEnv->proot = createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
Attr->pExpr2, pQueryAttr
->numOfExpr2);
}
} else if (pQuery->simpleAgg) {
if (pQuery
->stableQuery && !pQuery
->tsCompQuery) {
} else if (pQuery
Attr
->simpleAgg) {
if (pQuery
Attr->stableQuery && !pQueryAttr
->tsCompQuery) {
pRuntimeEnv->proot =
createMultiTableAggOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
->pExpr1, pQuery
->numOfOutput);
createMultiTableAggOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
} else {
pRuntimeEnv->proot =
createAggregateOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
->pExpr1, pQuery
->numOfOutput);
createAggregateOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
}
setTableScanFilterOperatorInfo(pRuntimeEnv->pTableScanner->info, pRuntimeEnv->proot);
if (pQuery
->pExpr2 != NULL && !pQuery
->stableQuery) {
pRuntimeEnv->proot = createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
->pExpr2, pQuery
->numOfExpr2);
if (pQuery
Attr->pExpr2 != NULL && !pQueryAttr
->stableQuery) {
pRuntimeEnv->proot = createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot, pQuery
Attr->pExpr2, pQueryAttr
->numOfExpr2);
}
} else { // diff/add/multiply/subtract/division
if (!onlyQueryTags(pQuery)) {
if (!onlyQueryTags(pQuery
Attr
)) {
pRuntimeEnv->proot =
createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
->pExpr1, pQuery
->numOfOutput);
createArithOperatorInfo(pRuntimeEnv, pRuntimeEnv->pTableScanner, pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
setTableScanFilterOperatorInfo(pRuntimeEnv->pTableScanner->info, pRuntimeEnv->proot);
}
}
if (pQuery->limit.offset > 0) {
if (pQuery
Attr
->limit.offset > 0) {
pRuntimeEnv->proot = createOffsetOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot);
}
if (pQuery->limit.limit > 0) {
if (pQuery
Attr
->limit.limit > 0) {
pRuntimeEnv->proot = createLimitOperatorInfo(pRuntimeEnv, pRuntimeEnv->proot);
}
*/
...
...
@@ -1837,23 +1837,23 @@ _clean:
}
static
void
doFreeQueryHandle
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
tsdbCleanupQueryHandle
(
pRuntimeEnv
->
pQueryHandle
);
pRuntimeEnv
->
pQueryHandle
=
NULL
;
SMemRef
*
pMemRef
=
&
pQuery
->
memRef
;
SMemRef
*
pMemRef
=
&
pQuery
Attr
->
memRef
;
assert
(
pMemRef
->
ref
==
0
&&
pMemRef
->
snapshot
.
imem
==
NULL
&&
pMemRef
->
snapshot
.
mem
==
NULL
);
}
static
void
teardownQueryRuntimeEnv
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SQInfo
*
pQInfo
=
(
SQInfo
*
)
pRuntimeEnv
->
qinfo
;
qDebug
(
"QInfo:%p teardown runtime env"
,
pQInfo
);
if
(
pRuntimeEnv
->
sasArray
!=
NULL
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
tfree
(
pRuntimeEnv
->
sasArray
[
i
].
data
);
tfree
(
pRuntimeEnv
->
sasArray
[
i
].
colList
);
}
...
...
@@ -1908,18 +1908,18 @@ bool isQueryKilled(SQInfo *pQInfo) {
void
setQueryKilled
(
SQInfo
*
pQInfo
)
{
pQInfo
->
code
=
TSDB_CODE_TSC_QUERY_CANCELLED
;}
//static bool isFixedOutputQuery(SQuery
* pQuery
) {
// if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
//static bool isFixedOutputQuery(SQuery
Attr* pQueryAttr
) {
// if (QUERY_IS_INTERVAL_QUERY(pQuery
Attr
)) {
// return false;
// }
//
// // Note:top/bottom query is fixed output query
// if (pQuery
->topBotQuery || pQuery->groupbyColumn || pQuery
->tsCompQuery) {
// if (pQuery
Attr->topBotQuery || pQueryAttr->groupbyColumn || pQueryAttr
->tsCompQuery) {
// return true;
// }
//
// for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
// SSqlExpr *pExpr = &pQuery->pExpr1[i].base;
// for (int32_t i = 0; i < pQuery
Attr
->numOfOutput; ++i) {
// SSqlExpr *pExpr = &pQuery
Attr
->pExpr1[i].base;
//
// if (pExpr->functionId == TSDB_FUNC_TS || pExpr->functionId == TSDB_FUNC_TS_DUMMY) {
// continue;
...
...
@@ -1934,9 +1934,9 @@ void setQueryKilled(SQInfo *pQInfo) { pQInfo->code = TSDB_CODE_TSC_QUERY_CANCELL
//}
// todo refactor with isLastRowQuery
//bool isPointInterpoQuery(SQuery
*pQuery
) {
// for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
// int32_t functionId = pQuery->pExpr1[i].base.functionId;
//bool isPointInterpoQuery(SQuery
Attr *pQueryAttr
) {
// for (int32_t i = 0; i < pQuery
Attr
->numOfOutput; ++i) {
// int32_t functionId = pQuery
Attr
->pExpr1[i].base.functionId;
// if (functionId == TSDB_FUNC_INTERP) {
// return true;
// }
...
...
@@ -1946,9 +1946,9 @@ void setQueryKilled(SQInfo *pQInfo) { pQInfo->code = TSDB_CODE_TSC_QUERY_CANCELL
//}
// TODO REFACTOR:MERGE WITH CLIENT-SIDE FUNCTION
static
UNUSED_FUNC
bool
isSumAvgRateQuery
(
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
->
pExpr1
[
i
].
base
.
functionId
;
static
UNUSED_FUNC
bool
isSumAvgRateQuery
(
SQuery
Attr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
Attr
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TS
)
{
continue
;
}
...
...
@@ -1962,9 +1962,9 @@ static UNUSED_FUNC bool isSumAvgRateQuery(SQuery *pQuery) {
return
false
;
}
static
bool
isFirstLastRowQuery
(
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
int32_t
functionID
=
pQuery
->
pExpr1
[
i
].
base
.
functionId
;
static
bool
isFirstLastRowQuery
(
SQuery
Attr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
int32_t
functionID
=
pQuery
Attr
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functionID
==
TSDB_FUNC_LAST_ROW
)
{
return
true
;
}
...
...
@@ -1977,9 +1977,9 @@ static bool isFirstLastRowQuery(SQuery *pQuery) {
* The following 4 kinds of query are treated as the tags query
* tagprj, tid_tag query, count(tbname), 'abc' (user defined constant value column) query
*/
bool
onlyQueryTags
(
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
&
pQuery
->
pExpr1
[
i
];
bool
onlyQueryTags
(
SQuery
Attr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
&
pQuery
Attr
->
pExpr1
[
i
];
int32_t
functionId
=
pExprInfo
->
base
.
functionId
;
...
...
@@ -1996,31 +1996,31 @@ bool onlyQueryTags(SQuery* pQuery) {
/////////////////////////////////////////////////////////////////////////////////////////////
void
getAlignQueryTimeWindow
(
SQuery
*
pQuery
,
int64_t
key
,
int64_t
keyFirst
,
int64_t
keyLast
,
STimeWindow
*
win
)
{
assert
(
key
>=
keyFirst
&&
key
<=
keyLast
&&
pQuery
->
interval
.
sliding
<=
pQuery
->
interval
.
interval
);
win
->
skey
=
taosTimeTruncate
(
key
,
&
pQuery
->
interval
,
pQuery
->
precision
);
void
getAlignQueryTimeWindow
(
SQuery
Attr
*
pQueryAttr
,
int64_t
key
,
int64_t
keyFirst
,
int64_t
keyLast
,
STimeWindow
*
win
)
{
assert
(
key
>=
keyFirst
&&
key
<=
keyLast
&&
pQuery
Attr
->
interval
.
sliding
<=
pQueryAttr
->
interval
.
interval
);
win
->
skey
=
taosTimeTruncate
(
key
,
&
pQuery
Attr
->
interval
,
pQueryAttr
->
precision
);
/*
* if the realSkey > INT64_MAX - pQuery->interval.interval, the query duration between
* if the realSkey > INT64_MAX - pQuery
Attr
->interval.interval, the query duration between
* realSkey and realEkey must be less than one interval.Therefore, no need to adjust the query ranges.
*/
if
(
keyFirst
>
(
INT64_MAX
-
pQuery
->
interval
.
interval
))
{
assert
(
keyLast
-
keyFirst
<
pQuery
->
interval
.
interval
);
if
(
keyFirst
>
(
INT64_MAX
-
pQuery
Attr
->
interval
.
interval
))
{
assert
(
keyLast
-
keyFirst
<
pQuery
Attr
->
interval
.
interval
);
win
->
ekey
=
INT64_MAX
;
}
else
if
(
pQuery
->
interval
.
intervalUnit
==
'n'
||
pQuery
->
interval
.
intervalUnit
==
'y'
)
{
win
->
ekey
=
taosTimeAdd
(
win
->
skey
,
pQuery
->
interval
.
interval
,
pQuery
->
interval
.
intervalUnit
,
pQuery
->
precision
)
-
1
;
}
else
if
(
pQuery
Attr
->
interval
.
intervalUnit
==
'n'
||
pQueryAttr
->
interval
.
intervalUnit
==
'y'
)
{
win
->
ekey
=
taosTimeAdd
(
win
->
skey
,
pQuery
Attr
->
interval
.
interval
,
pQueryAttr
->
interval
.
intervalUnit
,
pQueryAttr
->
precision
)
-
1
;
}
else
{
win
->
ekey
=
win
->
skey
+
pQuery
->
interval
.
interval
-
1
;
win
->
ekey
=
win
->
skey
+
pQuery
Attr
->
interval
.
interval
-
1
;
}
}
/*
* todo add more parameters to check soon..
*/
bool
colIdCheck
(
SQuery
*
pQuery
,
void
*
qinfo
)
{
bool
colIdCheck
(
SQuery
Attr
*
pQueryAttr
,
void
*
qinfo
)
{
// load data column information is incorrect
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfCols
-
1
;
++
i
)
{
if
(
pQuery
->
colList
[
i
].
colId
==
pQuery
->
colList
[
i
+
1
].
colId
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfCols
-
1
;
++
i
)
{
if
(
pQuery
Attr
->
colList
[
i
].
colId
==
pQueryAttr
->
colList
[
i
+
1
].
colId
)
{
qError
(
"QInfo:%p invalid data load column for query"
,
qinfo
);
return
false
;
}
...
...
@@ -2031,9 +2031,9 @@ bool colIdCheck(SQuery *pQuery, void* qinfo) {
// todo ignore the avg/sum/min/max/count/stddev/top/bottom functions, of which
// the scan order is not matter
static
bool
onlyOneQueryType
(
SQuery
*
pQuery
,
int32_t
functId
,
int32_t
functIdDst
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
->
pExpr1
[
i
].
base
.
functionId
;
static
bool
onlyOneQueryType
(
SQuery
Attr
*
pQueryAttr
,
int32_t
functId
,
int32_t
functIdDst
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
Attr
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TS
||
functionId
==
TSDB_FUNC_TS_DUMMY
||
functionId
==
TSDB_FUNC_TAG
||
functionId
==
TSDB_FUNC_TAG_DUMMY
)
{
...
...
@@ -2048,15 +2048,15 @@ static bool onlyOneQueryType(SQuery *pQuery, int32_t functId, int32_t functIdDst
return
true
;
}
static
bool
onlyFirstQuery
(
SQuery
*
pQuery
)
{
return
onlyOneQueryType
(
pQuery
,
TSDB_FUNC_FIRST
,
TSDB_FUNC_FIRST_DST
);
}
static
bool
onlyFirstQuery
(
SQuery
Attr
*
pQueryAttr
)
{
return
onlyOneQueryType
(
pQueryAttr
,
TSDB_FUNC_FIRST
,
TSDB_FUNC_FIRST_DST
);
}
static
bool
onlyLastQuery
(
SQuery
*
pQuery
)
{
return
onlyOneQueryType
(
pQuery
,
TSDB_FUNC_LAST
,
TSDB_FUNC_LAST_DST
);
}
static
bool
onlyLastQuery
(
SQuery
Attr
*
pQueryAttr
)
{
return
onlyOneQueryType
(
pQueryAttr
,
TSDB_FUNC_LAST
,
TSDB_FUNC_LAST_DST
);
}
static
void
doExchangeTimeWindow
(
SQInfo
*
pQInfo
,
STimeWindow
*
win
)
{
SQuery
*
pQuery
=
&
pQInfo
->
query
;
size_t
t
=
taosArrayGetSize
(
pQuery
->
tableGroupInfo
.
pGroupList
);
SQuery
Attr
*
pQueryAttr
=
&
pQInfo
->
query
;
size_t
t
=
taosArrayGetSize
(
pQuery
Attr
->
tableGroupInfo
.
pGroupList
);
for
(
int32_t
i
=
0
;
i
<
t
;
++
i
)
{
SArray
*
p1
=
taosArrayGetP
(
pQuery
->
tableGroupInfo
.
pGroupList
,
i
);
SArray
*
p1
=
taosArrayGetP
(
pQuery
Attr
->
tableGroupInfo
.
pGroupList
,
i
);
size_t
len
=
taosArrayGetSize
(
p1
);
for
(
int32_t
j
=
0
;
j
<
len
;
++
j
)
{
...
...
@@ -2071,7 +2071,7 @@ static void doExchangeTimeWindow(SQInfo* pQInfo, STimeWindow* win) {
}
static
void
changeExecuteScanOrder
(
SQInfo
*
pQInfo
,
SQueryTableMsg
*
pQueryMsg
,
bool
stableQuery
)
{
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
// in case of point-interpolation query, use asc order scan
char
msg
[]
=
"QInfo:%p scan order changed for %s query, old:%d, new:%d, qrange exchanged, old qrange:%"
PRId64
...
...
@@ -2079,92 +2079,92 @@ static void changeExecuteScanOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bo
// todo handle the case the the order irrelevant query type mixed up with order critical query type
// descending order query for last_row query
if
(
isFirstLastRowQuery
(
pQuery
))
{
qDebug
(
"QInfo:%p scan order changed for last_row query, old:%d, new:%d"
,
pQInfo
,
pQuery
->
order
.
order
,
TSDB_ORDER_ASC
);
if
(
isFirstLastRowQuery
(
pQuery
Attr
))
{
qDebug
(
"QInfo:%p scan order changed for last_row query, old:%d, new:%d"
,
pQInfo
,
pQuery
Attr
->
order
.
order
,
TSDB_ORDER_ASC
);
pQuery
->
order
.
order
=
TSDB_ORDER_ASC
;
if
(
pQuery
->
window
.
skey
>
pQuery
->
window
.
ekey
)
{
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
pQuery
Attr
->
order
.
order
=
TSDB_ORDER_ASC
;
if
(
pQuery
Attr
->
window
.
skey
>
pQueryAttr
->
window
.
ekey
)
{
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
}
return
;
}
if
(
pQuery
->
groupbyColumn
&&
pQuery
->
order
.
order
==
TSDB_ORDER_DESC
)
{
pQuery
->
order
.
order
=
TSDB_ORDER_ASC
;
if
(
pQuery
->
window
.
skey
>
pQuery
->
window
.
ekey
)
{
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
if
(
pQuery
Attr
->
groupbyColumn
&&
pQueryAttr
->
order
.
order
==
TSDB_ORDER_DESC
)
{
pQuery
Attr
->
order
.
order
=
TSDB_ORDER_ASC
;
if
(
pQuery
Attr
->
window
.
skey
>
pQueryAttr
->
window
.
ekey
)
{
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
}
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
->
window
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
Attr
->
window
);
return
;
}
if
(
pQuery
->
pointInterpQuery
&&
pQuery
->
interval
.
interval
==
0
)
{
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
))
{
qDebug
(
msg
,
pQInfo
,
"interp"
,
pQuery
->
order
.
order
,
TSDB_ORDER_ASC
,
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
skey
);
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
if
(
pQuery
Attr
->
pointInterpQuery
&&
pQueryAttr
->
interval
.
interval
==
0
)
{
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
qDebug
(
msg
,
pQInfo
,
"interp"
,
pQuery
Attr
->
order
.
order
,
TSDB_ORDER_ASC
,
pQueryAttr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
skey
);
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
}
pQuery
->
order
.
order
=
TSDB_ORDER_ASC
;
pQuery
Attr
->
order
.
order
=
TSDB_ORDER_ASC
;
return
;
}
if
(
pQuery
->
interval
.
interval
==
0
)
{
if
(
onlyFirstQuery
(
pQuery
))
{
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
))
{
qDebug
(
msg
,
pQInfo
,
"only-first"
,
pQuery
->
order
.
order
,
TSDB_ORDER_ASC
,
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
skey
);
if
(
pQuery
Attr
->
interval
.
interval
==
0
)
{
if
(
onlyFirstQuery
(
pQuery
Attr
))
{
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
qDebug
(
msg
,
pQInfo
,
"only-first"
,
pQuery
Attr
->
order
.
order
,
TSDB_ORDER_ASC
,
pQueryAttr
->
window
.
skey
,
pQuery
Attr
->
window
.
ekey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
skey
);
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
->
window
);
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
Attr
->
window
);
}
pQuery
->
order
.
order
=
TSDB_ORDER_ASC
;
}
else
if
(
onlyLastQuery
(
pQuery
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
qDebug
(
msg
,
pQInfo
,
"only-last"
,
pQuery
->
order
.
order
,
TSDB_ORDER_DESC
,
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
skey
);
pQuery
Attr
->
order
.
order
=
TSDB_ORDER_ASC
;
}
else
if
(
onlyLastQuery
(
pQuery
Attr
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
qDebug
(
msg
,
pQInfo
,
"only-last"
,
pQuery
Attr
->
order
.
order
,
TSDB_ORDER_DESC
,
pQueryAttr
->
window
.
skey
,
pQuery
Attr
->
window
.
ekey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
skey
);
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
->
window
);
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
Attr
->
window
);
}
pQuery
->
order
.
order
=
TSDB_ORDER_DESC
;
pQuery
Attr
->
order
.
order
=
TSDB_ORDER_DESC
;
}
}
else
{
// interval query
if
(
stableQuery
)
{
if
(
onlyFirstQuery
(
pQuery
))
{
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
))
{
qDebug
(
msg
,
pQInfo
,
"only-first stable"
,
pQuery
->
order
.
order
,
TSDB_ORDER_ASC
,
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
skey
);
if
(
onlyFirstQuery
(
pQuery
Attr
))
{
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
qDebug
(
msg
,
pQInfo
,
"only-first stable"
,
pQuery
Attr
->
order
.
order
,
TSDB_ORDER_ASC
,
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
skey
);
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
->
window
);
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
Attr
->
window
);
}
pQuery
->
order
.
order
=
TSDB_ORDER_ASC
;
}
else
if
(
onlyLastQuery
(
pQuery
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
qDebug
(
msg
,
pQInfo
,
"only-last stable"
,
pQuery
->
order
.
order
,
TSDB_ORDER_DESC
,
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
ekey
,
pQuery
->
window
.
skey
);
pQuery
Attr
->
order
.
order
=
TSDB_ORDER_ASC
;
}
else
if
(
onlyLastQuery
(
pQuery
Attr
))
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
qDebug
(
msg
,
pQInfo
,
"only-last stable"
,
pQuery
Attr
->
order
.
order
,
TSDB_ORDER_DESC
,
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
ekey
,
pQueryAttr
->
window
.
skey
);
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
->
window
);
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
doExchangeTimeWindow
(
pQInfo
,
&
pQuery
Attr
->
window
);
}
pQuery
->
order
.
order
=
TSDB_ORDER_DESC
;
pQuery
Attr
->
order
.
order
=
TSDB_ORDER_DESC
;
}
}
}
}
static
void
getIntermediateBufInfo
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
*
ps
,
int32_t
*
rowsize
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
MIN_ROWS_PER_PAGE
=
4
;
*
rowsize
=
(
int32_t
)(
pQuery
->
resultRowSize
*
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQuery
,
pQuery
->
topBotQuery
,
pQuery
->
stableQuery
));
*
rowsize
=
(
int32_t
)(
pQuery
Attr
->
resultRowSize
*
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQueryAttr
,
pQueryAttr
->
topBotQuery
,
pQueryAttr
->
stableQuery
));
int32_t
overhead
=
sizeof
(
tFilePage
);
// one page contains at least two rows
...
...
@@ -2180,17 +2180,17 @@ static void getIntermediateBufInfo(SQueryRuntimeEnv* pRuntimeEnv, int32_t* ps, i
#define IS_PREFILTER_TYPE(_t) ((_t) != TSDB_DATA_TYPE_BINARY && (_t) != TSDB_DATA_TYPE_NCHAR)
static
bool
doFilterByBlockStatistics
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SDataStatis
*
pDataStatis
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfRows
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
if
(
pDataStatis
==
NULL
||
pQuery
->
numOfFilterCols
==
0
)
{
if
(
pDataStatis
==
NULL
||
pQuery
Attr
->
numOfFilterCols
==
0
)
{
return
true
;
}
for
(
int32_t
k
=
0
;
k
<
pQuery
->
numOfFilterCols
;
++
k
)
{
SSingleColumnFilterInfo
*
pFilterInfo
=
&
pQuery
->
pFilterInfo
[
k
];
for
(
int32_t
k
=
0
;
k
<
pQuery
Attr
->
numOfFilterCols
;
++
k
)
{
SSingleColumnFilterInfo
*
pFilterInfo
=
&
pQuery
Attr
->
pFilterInfo
[
k
];
int32_t
index
=
-
1
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfCols
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfCols
;
++
i
)
{
if
(
pDataStatis
[
i
].
colId
==
pFilterInfo
->
info
.
colId
)
{
index
=
i
;
break
;
...
...
@@ -2244,14 +2244,14 @@ static bool doFilterByBlockStatistics(SQueryRuntimeEnv* pRuntimeEnv, SDataStatis
return
false
;
}
static
bool
overlapWithTimeWindow
(
SQuery
*
pQuery
,
SDataBlockInfo
*
pBlockInfo
)
{
static
bool
overlapWithTimeWindow
(
SQuery
Attr
*
pQueryAttr
,
SDataBlockInfo
*
pBlockInfo
)
{
STimeWindow
w
=
{
0
};
TSKEY
sk
=
MIN
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
);
TSKEY
ek
=
MAX
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
);
TSKEY
sk
=
MIN
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
);
TSKEY
ek
=
MAX
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
);
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
getAlignQueryTimeWindow
(
pQuery
,
pBlockInfo
->
window
.
skey
,
sk
,
ek
,
&
w
);
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
getAlignQueryTimeWindow
(
pQuery
Attr
,
pBlockInfo
->
window
.
skey
,
sk
,
ek
,
&
w
);
assert
(
w
.
ekey
>=
pBlockInfo
->
window
.
skey
);
if
(
w
.
ekey
<
pBlockInfo
->
window
.
ekey
)
{
...
...
@@ -2259,7 +2259,7 @@ static bool overlapWithTimeWindow(SQuery* pQuery, SDataBlockInfo* pBlockInfo) {
}
while
(
1
)
{
getNextTimeWindow
(
pQuery
,
&
w
);
getNextTimeWindow
(
pQuery
Attr
,
&
w
);
if
(
w
.
skey
>
pBlockInfo
->
window
.
ekey
)
{
break
;
}
...
...
@@ -2270,7 +2270,7 @@ static bool overlapWithTimeWindow(SQuery* pQuery, SDataBlockInfo* pBlockInfo) {
}
}
}
else
{
getAlignQueryTimeWindow
(
pQuery
,
pBlockInfo
->
window
.
ekey
,
sk
,
ek
,
&
w
);
getAlignQueryTimeWindow
(
pQuery
Attr
,
pBlockInfo
->
window
.
ekey
,
sk
,
ek
,
&
w
);
assert
(
w
.
skey
<=
pBlockInfo
->
window
.
ekey
);
if
(
w
.
skey
>
pBlockInfo
->
window
.
skey
)
{
...
...
@@ -2278,7 +2278,7 @@ static bool overlapWithTimeWindow(SQuery* pQuery, SDataBlockInfo* pBlockInfo) {
}
while
(
1
)
{
getNextTimeWindow
(
pQuery
,
&
w
);
getNextTimeWindow
(
pQuery
Attr
,
&
w
);
if
(
w
.
ekey
<
pBlockInfo
->
window
.
skey
)
{
break
;
}
...
...
@@ -2298,7 +2298,7 @@ static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key, bool asc
#if defined(_DEBUG_VIEW)
printf
(
"elem in comp ts file:%"
PRId64
", key:%"
PRId64
", tag:%"
PRIu64
", query order:%d, ts order:%d, traverse:%d, index:%d
\n
"
,
elem
.
ts
,
key
,
elem
.
tag
.
i64
,
pQuery
->
order
.
order
,
pRuntimeEnv
->
pTsBuf
->
tsOrder
,
elem
.
ts
,
key
,
elem
.
tag
.
i64
,
pQuery
Attr
->
order
.
order
,
pRuntimeEnv
->
pTsBuf
->
tsOrder
,
pRuntimeEnv
->
pTsBuf
->
cur
.
order
,
pRuntimeEnv
->
pTsBuf
->
cur
.
tsIndex
);
#endif
...
...
@@ -2469,18 +2469,18 @@ static uint32_t doFilterByBlockTimeWindow(STableScanInfo* pTableScanInfo, SSData
return
status
;
}
static
void
doSetFilterColumnInfo
(
SQuery
*
pQuery
,
SSDataBlock
*
pBlock
)
{
if
(
pQuery
->
numOfFilterCols
>
0
&&
pQuery
->
pFilterInfo
[
0
].
pData
!=
NULL
)
{
static
void
doSetFilterColumnInfo
(
SQuery
Attr
*
pQueryAttr
,
SSDataBlock
*
pBlock
)
{
if
(
pQuery
Attr
->
numOfFilterCols
>
0
&&
pQueryAttr
->
pFilterInfo
[
0
].
pData
!=
NULL
)
{
return
;
}
// set the initial static data value filter expression
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfFilterCols
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfFilterCols
;
++
i
)
{
for
(
int32_t
j
=
0
;
j
<
pBlock
->
info
.
numOfCols
;
++
j
)
{
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
j
);
if
(
pQuery
->
pFilterInfo
[
i
].
info
.
colId
==
pColInfo
->
info
.
colId
)
{
pQuery
->
pFilterInfo
[
i
].
pData
=
pColInfo
->
pData
;
if
(
pQuery
Attr
->
pFilterInfo
[
i
].
info
.
colId
==
pColInfo
->
info
.
colId
)
{
pQuery
Attr
->
pFilterInfo
[
i
].
pData
=
pColInfo
->
pData
;
break
;
}
}
...
...
@@ -2493,9 +2493,9 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
pBlock
->
pDataBlock
=
NULL
;
pBlock
->
pBlockStatis
=
NULL
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int64_t
groupId
=
pRuntimeEnv
->
current
->
groupIndex
;
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
);
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
);
SQInfo
*
pQInfo
=
pRuntimeEnv
->
qinfo
;
SQueryCostInfo
*
pCost
=
&
pQInfo
->
summary
;
...
...
@@ -2503,10 +2503,10 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
if
(
pRuntimeEnv
->
pTsBuf
!=
NULL
)
{
(
*
status
)
=
BLK_DATA_ALL_NEEDED
;
if
(
pQuery
->
stableQuery
)
{
// todo refactor
if
(
pQuery
Attr
->
stableQuery
)
{
// todo refactor
SExprInfo
*
pExprInfo
=
&
pTableScanInfo
->
pExpr
[
0
];
int16_t
tagId
=
(
int16_t
)
pExprInfo
->
base
.
param
[
0
].
i64
;
SColumnInfo
*
pColInfo
=
doGetTagColumnInfoById
(
pQuery
->
tagColList
,
pQuery
->
numOfTags
,
tagId
);
SColumnInfo
*
pColInfo
=
doGetTagColumnInfoById
(
pQuery
Attr
->
tagColList
,
pQueryAttr
->
numOfTags
,
tagId
);
// compare tag first
tVariant
t
=
{
0
};
...
...
@@ -2523,8 +2523,8 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
// Calculate all time windows that are overlapping or contain current data block.
// If current data block is contained by all possible time window, do not load current data block.
if
(
pQuery
->
numOfFilterCols
>
0
||
pQuery
->
groupbyColumn
||
pQuery
->
sw
.
gap
>
0
||
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
)
&&
overlapWithTimeWindow
(
pQuery
,
&
pBlock
->
info
)))
{
if
(
pQuery
Attr
->
numOfFilterCols
>
0
||
pQueryAttr
->
groupbyColumn
||
pQueryAttr
->
sw
.
gap
>
0
||
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
Attr
)
&&
overlapWithTimeWindow
(
pQueryAttr
,
&
pBlock
->
info
)))
{
(
*
status
)
=
BLK_DATA_ALL_NEEDED
;
}
...
...
@@ -2532,19 +2532,19 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
if
((
*
status
)
!=
BLK_DATA_ALL_NEEDED
)
{
// the pCtx[i] result is belonged to previous time window since the outputBuf has not been set yet,
// the filter result may be incorrect. So in case of interval query, we need to set the correct time output buffer
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
))
{
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
Attr
))
{
SResultRow
*
pResult
=
NULL
;
bool
masterScan
=
IS_MASTER_SCAN
(
pRuntimeEnv
);
TSKEY
k
=
ascQuery
?
pBlock
->
info
.
window
.
skey
:
pBlock
->
info
.
window
.
ekey
;
STimeWindow
win
=
getActiveTimeWindow
(
pTableScanInfo
->
pResultRowInfo
,
k
,
pQuery
);
STimeWindow
win
=
getActiveTimeWindow
(
pTableScanInfo
->
pResultRowInfo
,
k
,
pQuery
Attr
);
if
(
setWindowOutputBufByKey
(
pRuntimeEnv
,
pTableScanInfo
->
pResultRowInfo
,
&
win
,
masterScan
,
&
pResult
,
groupId
,
pTableScanInfo
->
pCtx
,
pTableScanInfo
->
numOfOutput
,
pTableScanInfo
->
rowCellInfoOffset
)
!=
TSDB_CODE_SUCCESS
)
{
longjmp
(
pRuntimeEnv
->
env
,
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
}
else
if
(
pQuery
->
stableQuery
&&
(
!
pQuery
->
tsCompQuery
))
{
// stable aggregate, not interval aggregate or normal column aggregate
}
else
if
(
pQuery
Attr
->
stableQuery
&&
(
!
pQueryAttr
->
tsCompQuery
))
{
// stable aggregate, not interval aggregate or normal column aggregate
doSetTableGroupOutputBuf
(
pRuntimeEnv
,
pTableScanInfo
->
pResultRowInfo
,
pTableScanInfo
->
pCtx
,
pTableScanInfo
->
rowCellInfoOffset
,
pTableScanInfo
->
numOfOutput
,
pRuntimeEnv
->
current
->
groupIndex
);
...
...
@@ -2574,9 +2574,9 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
pCost
->
loadBlockStatis
+=
1
;
tsdbRetrieveDataBlockStatisInfo
(
pTableScanInfo
->
pQueryHandle
,
&
pBlock
->
pBlockStatis
);
if
(
pQuery
->
topBotQuery
&&
pBlock
->
pBlockStatis
!=
NULL
)
{
if
(
pQuery
Attr
->
topBotQuery
&&
pBlock
->
pBlockStatis
!=
NULL
)
{
bool
load
=
false
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pTableScanInfo
->
pCtx
[
i
].
functionId
;
if
(
functionId
==
TSDB_FUNC_TOP
||
functionId
==
TSDB_FUNC_BOTTOM
)
{
load
=
topbot_datablock_filter
(
&
pTableScanInfo
->
pCtx
[
i
],
(
char
*
)
&
(
pBlock
->
pBlockStatis
[
i
].
min
),
...
...
@@ -2608,9 +2608,9 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
return
terrno
;
}
doSetFilterColumnInfo
(
pQuery
,
pBlock
);
if
(
pQuery
->
numOfFilterCols
>
0
||
pRuntimeEnv
->
pTsBuf
!=
NULL
)
{
filterRowsInDataBlock
(
pRuntimeEnv
,
pQuery
->
pFilterInfo
,
pQuery
->
numOfFilterCols
,
pBlock
,
ascQuery
);
doSetFilterColumnInfo
(
pQuery
Attr
,
pBlock
);
if
(
pQuery
Attr
->
numOfFilterCols
>
0
||
pRuntimeEnv
->
pTsBuf
!=
NULL
)
{
filterRowsInDataBlock
(
pRuntimeEnv
,
pQuery
Attr
->
pFilterInfo
,
pQueryAttr
->
numOfFilterCols
,
pBlock
,
ascQuery
);
}
}
...
...
@@ -2725,22 +2725,22 @@ static SColumnInfo* doGetTagColumnInfoById(SColumnInfo* pTagColList, int32_t num
void
setTagValue
(
SOperatorInfo
*
pOperatorInfo
,
void
*
pTable
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperatorInfo
->
pRuntimeEnv
;
SExprInfo
*
pExpr
=
pOperatorInfo
->
pExpr
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SExprInfo
*
pExpr
=
pOperatorInfo
->
pExpr
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SExprInfo
*
pExprInfo
=
&
pExpr
[
0
];
if
(
pQuery
->
numOfOutput
==
1
&&
pExprInfo
->
base
.
functionId
==
TSDB_FUNC_TS_COMP
&&
pQuery
->
stableQuery
)
{
if
(
pQuery
Attr
->
numOfOutput
==
1
&&
pExprInfo
->
base
.
functionId
==
TSDB_FUNC_TS_COMP
&&
pQueryAttr
->
stableQuery
)
{
assert
(
pExprInfo
->
base
.
numOfParams
==
1
);
int16_t
tagColId
=
(
int16_t
)
pExprInfo
->
base
.
param
[
0
].
i64
;
SColumnInfo
*
pColInfo
=
doGetTagColumnInfoById
(
pQuery
->
tagColList
,
pQuery
->
numOfTags
,
tagColId
);
SColumnInfo
*
pColInfo
=
doGetTagColumnInfoById
(
pQuery
Attr
->
tagColList
,
pQueryAttr
->
numOfTags
,
tagColId
);
doSetTagValueInParam
(
pTable
,
tagColId
,
&
pCtx
[
0
].
tag
,
pColInfo
->
type
,
pColInfo
->
bytes
);
return
;
}
else
{
// set tag value, by which the results are aggregated.
int32_t
offset
=
0
;
memset
(
pRuntimeEnv
->
tagVal
,
0
,
pQuery
->
tagLen
);
memset
(
pRuntimeEnv
->
tagVal
,
0
,
pQuery
Attr
->
tagLen
);
for
(
int32_t
idx
=
0
;
idx
<
numOfOutput
;
++
idx
)
{
SExprInfo
*
pLocalExprInfo
=
&
pExpr
[
idx
];
...
...
@@ -2764,7 +2764,7 @@ void setTagValue(SOperatorInfo* pOperatorInfo, void *pTable, SQLFunctionCtx* pCt
}
//todo : use index to avoid iterator all possible output columns
if
(
pQuery
->
stableQuery
&&
pQuery
->
stabledev
&&
(
pRuntimeEnv
->
prevResult
!=
NULL
))
{
if
(
pQuery
Attr
->
stableQuery
&&
pQueryAttr
->
stabledev
&&
(
pRuntimeEnv
->
prevResult
!=
NULL
))
{
setParamForStableStddev
(
pRuntimeEnv
,
pCtx
,
numOfOutput
,
pExprInfo
);
}
}
...
...
@@ -2845,32 +2845,32 @@ static UNUSED_FUNC void printBinaryData(int32_t functionId, char *data, int32_t
}
void
UNUSED_FUNC
displayInterResult
(
tFilePage
**
pdata
,
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
numOfRows
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
numOfCols
=
pQuery
->
numOfOutput
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
numOfCols
=
pQuery
Attr
->
numOfOutput
;
printf
(
"super table query intermediate result, total:%d
\n
"
,
numOfRows
);
for
(
int32_t
j
=
0
;
j
<
numOfRows
;
++
j
)
{
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
switch
(
pQuery
->
pExpr1
[
i
].
base
.
resType
)
{
switch
(
pQuery
Attr
->
pExpr1
[
i
].
base
.
resType
)
{
case
TSDB_DATA_TYPE_BINARY
:
{
int32_t
type
=
pQuery
->
pExpr1
[
i
].
base
.
resType
;
printBinaryData
(
pQuery
->
pExpr1
[
i
].
base
.
functionId
,
pdata
[
i
]
->
data
+
pQuery
->
pExpr1
[
i
].
base
.
resBytes
*
j
,
int32_t
type
=
pQuery
Attr
->
pExpr1
[
i
].
base
.
resType
;
printBinaryData
(
pQuery
Attr
->
pExpr1
[
i
].
base
.
functionId
,
pdata
[
i
]
->
data
+
pQueryAttr
->
pExpr1
[
i
].
base
.
resBytes
*
j
,
type
);
break
;
}
case
TSDB_DATA_TYPE_TIMESTAMP
:
case
TSDB_DATA_TYPE_BIGINT
:
printf
(
"%"
PRId64
"
\t
"
,
*
(
int64_t
*
)(
pdata
[
i
]
->
data
+
pQuery
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
printf
(
"%"
PRId64
"
\t
"
,
*
(
int64_t
*
)(
pdata
[
i
]
->
data
+
pQuery
Attr
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
break
;
case
TSDB_DATA_TYPE_INT
:
printf
(
"%d
\t
"
,
*
(
int32_t
*
)(
pdata
[
i
]
->
data
+
pQuery
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
printf
(
"%d
\t
"
,
*
(
int32_t
*
)(
pdata
[
i
]
->
data
+
pQuery
Attr
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
break
;
case
TSDB_DATA_TYPE_FLOAT
:
printf
(
"%f
\t
"
,
*
(
float
*
)(
pdata
[
i
]
->
data
+
pQuery
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
printf
(
"%f
\t
"
,
*
(
float
*
)(
pdata
[
i
]
->
data
+
pQuery
Attr
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
break
;
case
TSDB_DATA_TYPE_DOUBLE
:
printf
(
"%lf
\t
"
,
*
(
double
*
)(
pdata
[
i
]
->
data
+
pQuery
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
printf
(
"%lf
\t
"
,
*
(
double
*
)(
pdata
[
i
]
->
data
+
pQuery
Attr
->
pExpr1
[
i
].
base
.
resBytes
*
j
));
break
;
}
}
...
...
@@ -2910,7 +2910,7 @@ void copyToSDataBlock(SQueryRuntimeEnv* pRuntimeEnv, int32_t threshold, SSDataBl
}
static
void
updateTableQueryInfoForReverseScan
(
SQuery
*
pQuery
,
STableQueryInfo
*
pTableQueryInfo
)
{
static
void
updateTableQueryInfoForReverseScan
(
SQuery
Attr
*
pQueryAttr
,
STableQueryInfo
*
pTableQueryInfo
)
{
if
(
pTableQueryInfo
==
NULL
)
{
return
;
}
...
...
@@ -2926,17 +2926,17 @@ static void updateTableQueryInfoForReverseScan(SQuery *pQuery, STableQueryInfo *
}
static
void
setupQueryRangeForReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
numOfGroups
=
(
int32_t
)(
GET_NUM_OF_TABLEGROUP
(
pRuntimeEnv
));
for
(
int32_t
i
=
0
;
i
<
numOfGroups
;
++
i
)
{
SArray
*
group
=
GET_TABLEGROUP
(
pRuntimeEnv
,
i
);
SArray
*
tableKeyGroup
=
taosArrayGetP
(
pQuery
->
tableGroupInfo
.
pGroupList
,
i
);
SArray
*
tableKeyGroup
=
taosArrayGetP
(
pQuery
Attr
->
tableGroupInfo
.
pGroupList
,
i
);
size_t
t
=
taosArrayGetSize
(
group
);
for
(
int32_t
j
=
0
;
j
<
t
;
++
j
)
{
STableQueryInfo
*
pCheckInfo
=
taosArrayGetP
(
group
,
j
);
updateTableQueryInfoForReverseScan
(
pQuery
,
pCheckInfo
);
updateTableQueryInfoForReverseScan
(
pQuery
Attr
,
pCheckInfo
);
// update the last key in tableKeyInfo list, the tableKeyInfo is used to build the tsdbQueryHandle and decide
// the start check timestamp of tsdbQueryHandle
...
...
@@ -3057,7 +3057,7 @@ void setQueryStatus(SQueryRuntimeEnv *pRuntimeEnv, int8_t status) {
}
static
void
setupEnvForReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
if
(
pRuntimeEnv
->
pTsBuf
)
{
SWITCH_ORDER
(
pRuntimeEnv
->
pTsBuf
->
cur
.
order
);
...
...
@@ -3066,25 +3066,25 @@ static void setupEnvForReverseScan(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo
}
// reverse order time range
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
SWAP
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
,
TSKEY
);
SET_REVERSE_SCAN_FLAG
(
pRuntimeEnv
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_NOT_COMPLETED
);
switchCtxOrder
(
pCtx
,
numOfOutput
);
SWITCH_ORDER
(
pQuery
->
order
.
order
);
SWITCH_ORDER
(
pQuery
Attr
->
order
.
order
);
setupQueryRangeForReverseScan
(
pRuntimeEnv
);
}
void
finalizeQueryResult
(
SOperatorInfo
*
pOperator
,
SQLFunctionCtx
*
pCtx
,
SResultRowInfo
*
pResultRowInfo
,
int32_t
*
rowCellInfoOffset
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperator
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
numOfOutput
=
pOperator
->
numOfOutput
;
if
(
pQuery
->
groupbyColumn
||
QUERY_IS_INTERVAL_QUERY
(
pQuery
)
||
pQuery
->
sw
.
gap
>
0
)
{
if
(
pQuery
Attr
->
groupbyColumn
||
QUERY_IS_INTERVAL_QUERY
(
pQueryAttr
)
||
pQueryAttr
->
sw
.
gap
>
0
)
{
// for each group result, call the finalize function for each column
if
(
pQuery
->
groupbyColumn
)
{
if
(
pQuery
Attr
->
groupbyColumn
)
{
closeAllResultRows
(
pResultRowInfo
);
}
...
...
@@ -3114,9 +3114,9 @@ void finalizeQueryResult(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SResult
}
}
static
bool
hasMainOutput
(
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
->
pExpr1
[
i
].
base
.
functionId
;
static
bool
hasMainOutput
(
SQuery
Attr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
Attr
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functionId
!=
TSDB_FUNC_TS
&&
functionId
!=
TSDB_FUNC_TAG
&&
functionId
!=
TSDB_FUNC_TAGPRJ
)
{
return
true
;
...
...
@@ -3126,7 +3126,7 @@ static bool hasMainOutput(SQuery *pQuery) {
return
false
;
}
STableQueryInfo
*
createTableQueryInfo
(
SQuery
*
pQuery
,
void
*
pTable
,
bool
groupbyColumn
,
STimeWindow
win
,
void
*
buf
)
{
STableQueryInfo
*
createTableQueryInfo
(
SQuery
Attr
*
pQueryAttr
,
void
*
pTable
,
bool
groupbyColumn
,
STimeWindow
win
,
void
*
buf
)
{
STableQueryInfo
*
pTableQueryInfo
=
buf
;
pTableQueryInfo
->
win
=
win
;
...
...
@@ -3136,7 +3136,7 @@ STableQueryInfo *createTableQueryInfo(SQuery* pQuery, void* pTable, bool groupby
pTableQueryInfo
->
cur
.
vgroupIndex
=
-
1
;
// set more initial size of interval/groupby query
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
)
||
groupbyColumn
)
{
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
Attr
)
||
groupbyColumn
)
{
int32_t
initialSize
=
128
;
int32_t
code
=
initResultRowInfo
(
&
pTableQueryInfo
->
resInfo
,
initialSize
,
TSDB_DATA_TYPE_INT
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -3172,7 +3172,7 @@ void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pRe
continue
;
}
pCtx
[
i
].
pOutput
=
getPosInResultPage
(
pRuntimeEnv
->
pQuery
,
bufPage
,
pResult
->
offset
,
offset
);
pCtx
[
i
].
pOutput
=
getPosInResultPage
(
pRuntimeEnv
->
pQuery
Attr
,
bufPage
,
pResult
->
offset
,
offset
);
offset
+=
pCtx
[
i
].
outputBytes
;
int32_t
functionId
=
pCtx
[
i
].
functionId
;
...
...
@@ -3198,7 +3198,7 @@ void doSetTableGroupOutputBuf(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pRe
* all group belong to one result set, and each group result has different group id so set the id to be one
*/
if
(
pResultRow
->
pageId
==
-
1
)
{
int32_t
ret
=
addNewWindowResultBuf
(
pResultRow
,
pRuntimeEnv
->
pResultBuf
,
groupIndex
,
pRuntimeEnv
->
pQuery
->
resultRowSize
);
int32_t
ret
=
addNewWindowResultBuf
(
pResultRow
,
pRuntimeEnv
->
pResultBuf
,
groupIndex
,
pRuntimeEnv
->
pQuery
Attr
->
resultRowSize
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
;
}
...
...
@@ -3230,7 +3230,7 @@ void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLF
int16_t
offset
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
pCtx
[
i
].
pOutput
=
getPosInResultPage
(
pRuntimeEnv
->
pQuery
,
page
,
pResult
->
offset
,
offset
);
pCtx
[
i
].
pOutput
=
getPosInResultPage
(
pRuntimeEnv
->
pQuery
Attr
,
page
,
pResult
->
offset
,
offset
);
offset
+=
pCtx
[
i
].
outputBytes
;
int32_t
functionId
=
pCtx
[
i
].
functionId
;
...
...
@@ -3247,16 +3247,16 @@ void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLF
}
void
setCtxTagForJoin
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
SExprInfo
*
pExprInfo
,
void
*
pTable
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SSqlExpr
*
pExpr
=
&
pExprInfo
->
base
;
if
(
pQuery
->
stableQuery
&&
(
pRuntimeEnv
->
pTsBuf
!=
NULL
)
&&
if
(
pQuery
Attr
->
stableQuery
&&
(
pRuntimeEnv
->
pTsBuf
!=
NULL
)
&&
(
pExpr
->
functionId
==
TSDB_FUNC_TS
||
pExpr
->
functionId
==
TSDB_FUNC_PRJ
)
&&
(
pExpr
->
colInfo
.
colIndex
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
))
{
assert
(
pExpr
->
numOfParams
==
1
);
int16_t
tagColId
=
(
int16_t
)
pExprInfo
->
base
.
param
[
0
].
i64
;
SColumnInfo
*
pColInfo
=
doGetTagColumnInfoById
(
pQuery
->
tagColList
,
pQuery
->
numOfTags
,
tagColId
);
SColumnInfo
*
pColInfo
=
doGetTagColumnInfoById
(
pQuery
Attr
->
tagColList
,
pQueryAttr
->
numOfTags
,
tagColId
);
doSetTagValueInParam
(
pTable
,
tagColId
,
&
pCtx
->
tag
,
pColInfo
->
type
,
pColInfo
->
bytes
);
...
...
@@ -3272,7 +3272,7 @@ void setCtxTagForJoin(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, SExpr
}
int32_t
setTimestampListJoinInfo
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
tVariant
*
pTag
,
STableQueryInfo
*
pTableQueryInfo
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
assert
(
pRuntimeEnv
->
pTsBuf
!=
NULL
);
...
...
@@ -3280,7 +3280,7 @@ int32_t setTimestampListJoinInfo(SQueryRuntimeEnv* pRuntimeEnv, tVariant* pTag,
if
(
pTableQueryInfo
->
cur
.
vgroupIndex
==
-
1
)
{
tVariantAssign
(
&
pTableQueryInfo
->
tag
,
pTag
);
STSElem
elem
=
tsBufGetElemStartPos
(
pRuntimeEnv
->
pTsBuf
,
pQuery
->
vgId
,
&
pTableQueryInfo
->
tag
);
STSElem
elem
=
tsBufGetElemStartPos
(
pRuntimeEnv
->
pTsBuf
,
pQuery
Attr
->
vgId
,
&
pTableQueryInfo
->
tag
);
// failed to find data with the specified tag value and vnodeId
if
(
!
tsBufIsValidElem
(
&
elem
))
{
...
...
@@ -3314,9 +3314,9 @@ int32_t setTimestampListJoinInfo(SQueryRuntimeEnv* pRuntimeEnv, tVariant* pTag,
}
void
setParamForStableStddev
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
,
SExprInfo
*
pExprInfo
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
numOfExprs
=
pQuery
->
numOfOutput
;
int32_t
numOfExprs
=
pQuery
Attr
->
numOfOutput
;
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExprInfo1
=
&
(
pExprInfo
[
i
]);
if
(
pExprInfo
->
base
.
functionId
!=
TSDB_FUNC_STDDEV_DST
)
{
...
...
@@ -3332,7 +3332,7 @@ void setParamForStableStddev(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx
int32_t
numOfGroup
=
(
int32_t
)
taosArrayGetSize
(
pRuntimeEnv
->
prevResult
);
for
(
int32_t
j
=
0
;
j
<
numOfGroup
;
++
j
)
{
SInterResult
*
p
=
taosArrayGet
(
pRuntimeEnv
->
prevResult
,
j
);
if
(
pQuery
->
tagLen
==
0
||
memcmp
(
p
->
tags
,
pRuntimeEnv
->
tagVal
,
pQuery
->
tagLen
)
==
0
)
{
if
(
pQuery
Attr
->
tagLen
==
0
||
memcmp
(
p
->
tags
,
pRuntimeEnv
->
tagVal
,
pQueryAttr
->
tagLen
)
==
0
)
{
int32_t
numOfCols
=
(
int32_t
)
taosArrayGetSize
(
p
->
pResult
);
for
(
int32_t
k
=
0
;
k
<
numOfCols
;
++
k
)
{
SStddevInterResult
*
pres
=
taosArrayGet
(
p
->
pResult
,
k
);
...
...
@@ -3350,14 +3350,14 @@ void setParamForStableStddev(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx
/*
* There are two cases to handle:
*
* 1. Query range is not set yet (queryRangeSet = 0). we need to set the query range info, including pQuery->lastKey,
* pQuery
->window.skey, and pQuery
->eKey.
* 1. Query range is not set yet (queryRangeSet = 0). we need to set the query range info, including pQuery
Attr
->lastKey,
* pQuery
Attr->window.skey, and pQueryAttr
->eKey.
* 2. Query range is set and query is in progress. There may be another result with the same query ranges to be
* merged during merge stage. In this case, we need the pTableQueryInfo->lastResRows to decide if there
* is a previous result generated or not.
*/
void
setIntervalQueryRange
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
TSKEY
key
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
STableQueryInfo
*
pTableQueryInfo
=
pRuntimeEnv
->
current
;
SResultRowInfo
*
pWindowResInfo
=
&
pTableQueryInfo
->
resInfo
;
...
...
@@ -3366,7 +3366,7 @@ void setIntervalQueryRange(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key) {
}
pTableQueryInfo
->
win
.
skey
=
key
;
STimeWindow
win
=
{.
skey
=
key
,
.
ekey
=
pQuery
->
window
.
ekey
};
STimeWindow
win
=
{.
skey
=
key
,
.
ekey
=
pQuery
Attr
->
window
.
ekey
};
/**
* In handling the both ascending and descending order super table query, we need to find the first qualified
...
...
@@ -3378,11 +3378,11 @@ void setIntervalQueryRange(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key) {
TSKEY
sk
=
MIN
(
win
.
skey
,
win
.
ekey
);
TSKEY
ek
=
MAX
(
win
.
skey
,
win
.
ekey
);
getAlignQueryTimeWindow
(
pQuery
,
win
.
skey
,
sk
,
ek
,
&
w
);
getAlignQueryTimeWindow
(
pQuery
Attr
,
win
.
skey
,
sk
,
ek
,
&
w
);
if
(
pWindowResInfo
->
prevSKey
==
TSKEY_INITIAL_VAL
)
{
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
))
{
assert
(
win
.
ekey
==
pQuery
->
window
.
ekey
);
if
(
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
assert
(
win
.
ekey
==
pQuery
Attr
->
window
.
ekey
);
}
pWindowResInfo
->
prevSKey
=
w
.
skey
;
...
...
@@ -3402,7 +3402,7 @@ void setIntervalQueryRange(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key) {
*/
static
int32_t
doCopyToSDataBlock
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupResInfo
*
pGroupResInfo
,
int32_t
orderType
,
SSDataBlock
*
pBlock
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
numOfRows
=
getNumOfTotalRes
(
pGroupResInfo
);
int32_t
numOfResult
=
pBlock
->
info
.
rows
;
// there are already exists result rows
...
...
@@ -3438,7 +3438,7 @@ static int32_t doCopyToSDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo*
int32_t
bytes
=
pColInfoData
->
info
.
bytes
;
char
*
out
=
pColInfoData
->
pData
+
numOfResult
*
bytes
;
char
*
in
=
getPosInResultPage
(
pQuery
,
page
,
pRow
->
offset
,
offset
);
char
*
in
=
getPosInResultPage
(
pQuery
Attr
,
page
,
pRow
->
offset
,
offset
);
memcpy
(
out
,
in
,
bytes
*
numOfRowsToCopy
);
offset
+=
bytes
;
...
...
@@ -3463,8 +3463,8 @@ static void toSSDataBlock(SGroupResInfo *pGroupResInfo, SQueryRuntimeEnv* pRunti
return
;
}
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
orderType
=
(
pQuery
->
pGroupbyExpr
!=
NULL
)
?
pQuery
->
pGroupbyExpr
->
orderType
:
TSDB_ORDER_ASC
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
orderType
=
(
pQuery
Attr
->
pGroupbyExpr
!=
NULL
)
?
pQueryAttr
->
pGroupbyExpr
->
orderType
:
TSDB_ORDER_ASC
;
doCopyToSDataBlock
(
pRuntimeEnv
,
pGroupResInfo
,
orderType
,
pBlock
);
SColumnInfoData
*
pInfoData
=
taosArrayGet
(
pBlock
->
pDataBlock
,
0
);
...
...
@@ -3478,10 +3478,10 @@ static void toSSDataBlock(SGroupResInfo *pGroupResInfo, SQueryRuntimeEnv* pRunti
static
void
updateNumOfRowsInResultRows
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
,
SResultRowInfo
*
pResultRowInfo
,
int32_t
*
rowCellInfoOffset
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
// update the number of result for each, only update the number of rows for the corresponding window result.
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
))
{
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
Attr
))
{
return
;
}
...
...
@@ -3502,18 +3502,18 @@ static void updateNumOfRowsInResultRows(SQueryRuntimeEnv *pRuntimeEnv,
static
void
doCopyQueryResultToMsg
(
SQInfo
*
pQInfo
,
int32_t
numOfRows
,
char
*
data
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SSDataBlock
*
pRes
=
pRuntimeEnv
->
outputBuf
;
if
(
pQuery
->
pExpr2
==
NULL
)
{
for
(
int32_t
col
=
0
;
col
<
pQuery
->
numOfOutput
;
++
col
)
{
if
(
pQuery
Attr
->
pExpr2
==
NULL
)
{
for
(
int32_t
col
=
0
;
col
<
pQuery
Attr
->
numOfOutput
;
++
col
)
{
SColumnInfoData
*
pColRes
=
taosArrayGet
(
pRes
->
pDataBlock
,
col
);
memmove
(
data
,
pColRes
->
pData
,
pColRes
->
info
.
bytes
*
pRes
->
info
.
rows
);
data
+=
pColRes
->
info
.
bytes
*
pRes
->
info
.
rows
;
}
}
else
{
for
(
int32_t
col
=
0
;
col
<
pQuery
->
numOfExpr2
;
++
col
)
{
for
(
int32_t
col
=
0
;
col
<
pQuery
Attr
->
numOfExpr2
;
++
col
)
{
SColumnInfoData
*
pColRes
=
taosArrayGet
(
pRes
->
pDataBlock
,
col
);
memmove
(
data
,
pColRes
->
pData
,
pColRes
->
info
.
bytes
*
numOfRows
);
data
+=
pColRes
->
info
.
bytes
*
numOfRows
;
...
...
@@ -3589,34 +3589,34 @@ void queryCostStatis(SQInfo *pQInfo) {
}
//static void updateOffsetVal(SQueryRuntimeEnv *pRuntimeEnv, SDataBlockInfo *pBlockInfo) {
// SQuery
*pQuery = pRuntimeEnv->pQuery
;
// SQuery
Attr *pQueryAttr = pRuntimeEnv->pQueryAttr
;
// STableQueryInfo* pTableQueryInfo = pRuntimeEnv->current;
//
// int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
// int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery
Attr
->order.order);
//
// if (pQuery->limit.offset == pBlockInfo->rows) { // current block will ignore completed
// pTableQueryInfo->lastKey = QUERY_IS_ASC_QUERY(pQuery) ? pBlockInfo->window.ekey + step : pBlockInfo->window.skey + step;
// pQuery->limit.offset = 0;
// if (pQuery
Attr
->limit.offset == pBlockInfo->rows) { // current block will ignore completed
// pTableQueryInfo->lastKey = QUERY_IS_ASC_QUERY(pQuery
Attr
) ? pBlockInfo->window.ekey + step : pBlockInfo->window.skey + step;
// pQuery
Attr
->limit.offset = 0;
// return;
// }
//
// if (QUERY_IS_ASC_QUERY(pQuery)) {
// pQuery
->pos = (int32_t)pQuery
->limit.offset;
// if (QUERY_IS_ASC_QUERY(pQuery
Attr
)) {
// pQuery
Attr->pos = (int32_t)pQueryAttr
->limit.offset;
// } else {
// pQuery
->pos = pBlockInfo->rows - (int32_t)pQuery
->limit.offset - 1;
// pQuery
Attr->pos = pBlockInfo->rows - (int32_t)pQueryAttr
->limit.offset - 1;
// }
//
// assert(pQuery
->pos >= 0 && pQuery
->pos <= pBlockInfo->rows - 1);
// assert(pQuery
Attr->pos >= 0 && pQueryAttr
->pos <= pBlockInfo->rows - 1);
//
// SArray * pDataBlock = tsdbRetrieveDataBlock(pRuntimeEnv->pQueryHandle, NULL);
// SColumnInfoData *pColInfoData = taosArrayGet(pDataBlock, 0);
//
// // update the pQuery
->limit.offset value, and pQuery
->pos value
// // update the pQuery
Attr->limit.offset value, and pQueryAttr
->pos value
// TSKEY *keys = (TSKEY *) pColInfoData->pData;
//
// // update the offset value
// pTableQueryInfo->lastKey = keys[pQuery->pos];
// pQuery->limit.offset = 0;
// pTableQueryInfo->lastKey = keys[pQuery
Attr
->pos];
// pQuery
Attr
->limit.offset = 0;
//
// int32_t numOfRes = tableApplyFunctionsOnBlock(pRuntimeEnv, pBlockInfo, NULL, binarySearchForKey, pDataBlock);
//
...
...
@@ -3625,14 +3625,14 @@ void queryCostStatis(SQInfo *pQInfo) {
//}
//void skipBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
// SQuery
*pQuery = pRuntimeEnv->pQuery
;
// SQuery
Attr *pQueryAttr = pRuntimeEnv->pQueryAttr
;
//
// if (pQuery
->limit.offset <= 0 || pQuery
->numOfFilterCols > 0) {
// if (pQuery
Attr->limit.offset <= 0 || pQueryAttr
->numOfFilterCols > 0) {
// return;
// }
//
// pQuery->pos = 0;
// int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
// pQuery
Attr
->pos = 0;
// int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery
Attr
->order.order);
//
// STableQueryInfo* pTableQueryInfo = pRuntimeEnv->current;
// TsdbQueryHandleT pQueryHandle = pRuntimeEnv->pQueryHandle;
...
...
@@ -3645,13 +3645,13 @@ void queryCostStatis(SQInfo *pQInfo) {
//
// tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
//
// if (pQuery->limit.offset > blockInfo.rows) {
// pQuery->limit.offset -= blockInfo.rows;
// pTableQueryInfo->lastKey = (QUERY_IS_ASC_QUERY(pQuery)) ? blockInfo.window.ekey : blockInfo.window.skey;
// if (pQuery
Attr
->limit.offset > blockInfo.rows) {
// pQuery
Attr
->limit.offset -= blockInfo.rows;
// pTableQueryInfo->lastKey = (QUERY_IS_ASC_QUERY(pQuery
Attr
)) ? blockInfo.window.ekey : blockInfo.window.skey;
// pTableQueryInfo->lastKey += step;
//
// qDebug("QInfo:%p skip rows:%d, offset:%" PRId64, pRuntimeEnv->qinfo, blockInfo.rows,
// pQuery->limit.offset);
// pQuery
Attr
->limit.offset);
// } else { // find the appropriated start position in current block
// updateOffsetVal(pRuntimeEnv, &blockInfo);
// break;
...
...
@@ -3664,15 +3664,15 @@ void queryCostStatis(SQInfo *pQInfo) {
//}
//static TSKEY doSkipIntervalProcess(SQueryRuntimeEnv* pRuntimeEnv, STimeWindow* win, SDataBlockInfo* pBlockInfo, STableQueryInfo* pTableQueryInfo) {
// SQuery
*pQuery = pRuntimeEnv->pQuery
;
// SQuery
Attr *pQueryAttr = pRuntimeEnv->pQueryAttr
;
// SResultRowInfo *pWindowResInfo = &pRuntimeEnv->resultRowInfo;
//
// assert(pQuery->limit.offset == 0);
// assert(pQuery
Attr
->limit.offset == 0);
// STimeWindow tw = *win;
// getNextTimeWindow(pQuery, &tw);
// getNextTimeWindow(pQuery
Attr
, &tw);
//
// if ((tw.skey <= pBlockInfo->window.ekey && QUERY_IS_ASC_QUERY(pQuery)) ||
// (tw.ekey >= pBlockInfo->window.skey && !QUERY_IS_ASC_QUERY(pQuery))) {
// if ((tw.skey <= pBlockInfo->window.ekey && QUERY_IS_ASC_QUERY(pQuery
Attr
)) ||
// (tw.ekey >= pBlockInfo->window.skey && !QUERY_IS_ASC_QUERY(pQuery
Attr
))) {
//
// // load the data block and check data remaining in current data block
// // TODO optimize performance
...
...
@@ -3681,15 +3681,15 @@ void queryCostStatis(SQInfo *pQInfo) {
//
// tw = *win;
// int32_t startPos =
// getNextQualifiedWindow(pQuery, &tw, pBlockInfo, pColInfoData->pData, binarySearchForKey, -1);
// getNextQualifiedWindow(pQuery
Attr
, &tw, pBlockInfo, pColInfoData->pData, binarySearchForKey, -1);
// assert(startPos >= 0);
//
// // set the abort info
// pQuery->pos = startPos;
// pQuery
Attr
->pos = startPos;
//
// // reset the query start timestamp
// pTableQueryInfo->win.skey = ((TSKEY *)pColInfoData->pData)[startPos];
// pQuery->window.skey = pTableQueryInfo->win.skey;
// pQuery
Attr
->window.skey = pTableQueryInfo->win.skey;
// TSKEY key = pTableQueryInfo->win.skey;
//
// pWindowResInfo->prevSKey = tw.skey;
...
...
@@ -3704,7 +3704,7 @@ void queryCostStatis(SQInfo *pQInfo) {
//
// return key;
// } else { // do nothing
// pQuery->window.skey = tw.skey;
// pQuery
Attr
->window.skey = tw.skey;
// pWindowResInfo->prevSKey = tw.skey;
// pTableQueryInfo->lastKey = tw.skey;
//
...
...
@@ -3715,27 +3715,27 @@ void queryCostStatis(SQInfo *pQInfo) {
//}
//static bool skipTimeInterval(SQueryRuntimeEnv *pRuntimeEnv, TSKEY* start) {
// SQuery
*pQuery = pRuntimeEnv->pQuery
;
// if (QUERY_IS_ASC_QUERY(pQuery)) {
// SQuery
Attr *pQueryAttr = pRuntimeEnv->pQueryAttr
;
// if (QUERY_IS_ASC_QUERY(pQuery
Attr
)) {
// assert(*start <= pRuntimeEnv->current->lastKey);
// } else {
// assert(*start >= pRuntimeEnv->current->lastKey);
// }
//
// // if queried with value filter, do NOT forward query start position
// if (pQuery
->limit.offset <= 0 || pQuery
->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf != NULL || pRuntimeEnv->pFillInfo != NULL) {
// if (pQuery
Attr->limit.offset <= 0 || pQueryAttr
->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf != NULL || pRuntimeEnv->pFillInfo != NULL) {
// return true;
// }
//
// /*
// * 1. for interval without interpolation query we forward pQuery->interval.interval at a time for
// * pQuery
->limit.offset times. Since hole exists, pQuery->interval.interval*pQuery
->limit.offset value is
// * not valid. otherwise, we only forward pQuery->limit.offset number of points
// * 1. for interval without interpolation query we forward pQuery
Attr
->interval.interval at a time for
// * pQuery
Attr->limit.offset times. Since hole exists, pQueryAttr->interval.interval*pQueryAttr
->limit.offset value is
// * not valid. otherwise, we only forward pQuery
Attr
->limit.offset number of points
// */
// assert(pRuntimeEnv->resultRowInfo.prevSKey == TSKEY_INITIAL_VAL);
//
// STimeWindow w = TSWINDOW_INITIALIZER;
// bool ascQuery = QUERY_IS_ASC_QUERY(pQuery);
// bool ascQuery = QUERY_IS_ASC_QUERY(pQuery
Attr
);
//
// SResultRowInfo *pWindowResInfo = &pRuntimeEnv->resultRowInfo;
// STableQueryInfo *pTableQueryInfo = pRuntimeEnv->current;
...
...
@@ -3744,24 +3744,24 @@ void queryCostStatis(SQInfo *pQInfo) {
// while (tsdbNextDataBlock(pRuntimeEnv->pQueryHandle)) {
// tsdbRetrieveDataBlockInfo(pRuntimeEnv->pQueryHandle, &blockInfo);
//
// if (QUERY_IS_ASC_QUERY(pQuery)) {
// if (QUERY_IS_ASC_QUERY(pQuery
Attr
)) {
// if (pWindowResInfo->prevSKey == TSKEY_INITIAL_VAL) {
// getAlignQueryTimeWindow(pQuery
, blockInfo.window.skey, blockInfo.window.skey, pQuery
->window.ekey, &w);
// getAlignQueryTimeWindow(pQuery
Attr, blockInfo.window.skey, blockInfo.window.skey, pQueryAttr
->window.ekey, &w);
// pWindowResInfo->prevSKey = w.skey;
// }
// } else {
// getAlignQueryTimeWindow(pQuery
, blockInfo.window.ekey, pQuery
->window.ekey, blockInfo.window.ekey, &w);
// getAlignQueryTimeWindow(pQuery
Attr, blockInfo.window.ekey, pQueryAttr
->window.ekey, blockInfo.window.ekey, &w);
// pWindowResInfo->prevSKey = w.skey;
// }
//
// // the first time window
// STimeWindow win = getActiveTimeWindow(pWindowResInfo, pWindowResInfo->prevSKey, pQuery);
// STimeWindow win = getActiveTimeWindow(pWindowResInfo, pWindowResInfo->prevSKey, pQuery
Attr
);
//
// while (pQuery->limit.offset > 0) {
// while (pQuery
Attr
->limit.offset > 0) {
// STimeWindow tw = win;
//
// if ((win.ekey <= blockInfo.window.ekey && ascQuery) || (win.ekey >= blockInfo.window.skey && !ascQuery)) {
// pQuery->limit.offset -= 1;
// pQuery
Attr
->limit.offset -= 1;
// pWindowResInfo->prevSKey = win.skey;
//
// // current time window is aligned with blockInfo.window.ekey
...
...
@@ -3771,13 +3771,13 @@ void queryCostStatis(SQInfo *pQInfo) {
// }
// }
//
// if (pQuery->limit.offset == 0) {
// if (pQuery
Attr
->limit.offset == 0) {
// *start = doSkipIntervalProcess(pRuntimeEnv, &win, &blockInfo, pTableQueryInfo);
// return true;
// }
//
// // current window does not ended in current data block, try next data block
// getNextTimeWindow(pQuery, &tw);
// getNextTimeWindow(pQuery
Attr
, &tw);
//
// /*
// * If the next time window still starts from current data block,
...
...
@@ -3792,20 +3792,20 @@ void queryCostStatis(SQInfo *pQInfo) {
// SColumnInfoData *pColInfoData = taosArrayGet(pDataBlock, 0);
//
// if ((win.ekey > blockInfo.window.ekey && ascQuery) || (win.ekey < blockInfo.window.skey && !ascQuery)) {
// pQuery->limit.offset -= 1;
// pQuery
Attr
->limit.offset -= 1;
// }
//
// if (pQuery->limit.offset == 0) {
// if (pQuery
Attr
->limit.offset == 0) {
// *start = doSkipIntervalProcess(pRuntimeEnv, &win, &blockInfo, pTableQueryInfo);
// return true;
// } else {
// tw = win;
// int32_t startPos =
// getNextQualifiedWindow(pQuery, &tw, &blockInfo, pColInfoData->pData, binarySearchForKey, -1);
// getNextQualifiedWindow(pQuery
Attr
, &tw, &blockInfo, pColInfoData->pData, binarySearchForKey, -1);
// assert(startPos >= 0);
//
// // set the abort info
// pQuery->pos = startPos;
// pQuery
Attr
->pos = startPos;
// pTableQueryInfo->lastKey = ((TSKEY *)pColInfoData->pData)[startPos];
// pWindowResInfo->prevSKey = tw.skey;
// win = tw;
...
...
@@ -3828,24 +3828,24 @@ static void doDestroyTableQueryInfo(STableGroupInfo* pTableqinfoGroupInfo);
static
int32_t
setupQueryHandle
(
void
*
tsdb
,
SQInfo
*
pQInfo
,
bool
isSTableQuery
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
// TODO set the tags scan handle
if
(
onlyQueryTags
(
pQuery
))
{
if
(
onlyQueryTags
(
pQuery
Attr
))
{
return
TSDB_CODE_SUCCESS
;
}
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
,
&
pQuery
->
window
);
if
(
pQuery
->
tsCompQuery
||
pQuery
->
pointInterpQuery
)
{
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
Attr
,
&
pQueryAttr
->
window
);
if
(
pQuery
Attr
->
tsCompQuery
||
pQueryAttr
->
pointInterpQuery
)
{
cond
.
type
=
BLOCK_LOAD_TABLE_SEQ_ORDER
;
}
if
(
!
isSTableQuery
&&
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
==
1
)
&&
(
cond
.
order
==
TSDB_ORDER_ASC
)
&&
(
!
QUERY_IS_INTERVAL_QUERY
(
pQuery
))
&&
(
!
pQuery
->
groupbyColumn
)
&&
(
!
pQuery
->
simpleAgg
)
&&
(
!
QUERY_IS_INTERVAL_QUERY
(
pQuery
Attr
))
&&
(
!
pQuery
Attr
->
groupbyColumn
)
&&
(
!
pQuery
Attr
->
simpleAgg
)
)
{
SArray
*
pa
=
GET_TABLEGROUP
(
pRuntimeEnv
,
0
);
STableQueryInfo
*
pCheckInfo
=
taosArrayGetP
(
pa
,
0
);
...
...
@@ -3853,12 +3853,12 @@ static int32_t setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery)
}
terrno
=
TSDB_CODE_SUCCESS
;
if
(
isFirstLastRowQuery
(
pQuery
))
{
pRuntimeEnv
->
pQueryHandle
=
tsdbQueryLastRow
(
tsdb
,
&
cond
,
&
pQuery
->
tableGroupInfo
,
pQInfo
,
&
pQuery
->
memRef
);
if
(
isFirstLastRowQuery
(
pQuery
Attr
))
{
pRuntimeEnv
->
pQueryHandle
=
tsdbQueryLastRow
(
tsdb
,
&
cond
,
&
pQuery
Attr
->
tableGroupInfo
,
pQInfo
,
&
pQueryAttr
->
memRef
);
// update the query time window
pQuery
->
window
=
cond
.
twindow
;
if
(
pQuery
->
tableGroupInfo
.
numOfTables
==
0
)
{
pQuery
Attr
->
window
=
cond
.
twindow
;
if
(
pQuery
Attr
->
tableGroupInfo
.
numOfTables
==
0
)
{
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
=
0
;
}
else
{
size_t
numOfGroups
=
GET_NUM_OF_TABLEGROUP
(
pRuntimeEnv
);
...
...
@@ -3869,15 +3869,15 @@ static int32_t setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery)
for
(
int32_t
j
=
0
;
j
<
t
;
++
j
)
{
STableQueryInfo
*
pCheckInfo
=
taosArrayGetP
(
group
,
j
);
pCheckInfo
->
win
=
pQuery
->
window
;
pCheckInfo
->
win
=
pQuery
Attr
->
window
;
pCheckInfo
->
lastKey
=
pCheckInfo
->
win
.
skey
;
}
}
}
}
else
if
(
pQuery
->
pointInterpQuery
)
{
pRuntimeEnv
->
pQueryHandle
=
tsdbQueryRowsInExternalWindow
(
tsdb
,
&
cond
,
&
pQuery
->
tableGroupInfo
,
pQInfo
,
&
pQuery
->
memRef
);
}
else
if
(
pQuery
Attr
->
pointInterpQuery
)
{
pRuntimeEnv
->
pQueryHandle
=
tsdbQueryRowsInExternalWindow
(
tsdb
,
&
cond
,
&
pQuery
Attr
->
tableGroupInfo
,
pQInfo
,
&
pQueryAttr
->
memRef
);
}
else
{
pRuntimeEnv
->
pQueryHandle
=
tsdbQueryTables
(
tsdb
,
&
cond
,
&
pQuery
->
tableGroupInfo
,
pQInfo
,
&
pQuery
->
memRef
);
pRuntimeEnv
->
pQueryHandle
=
tsdbQueryTables
(
tsdb
,
&
cond
,
&
pQuery
Attr
->
tableGroupInfo
,
pQInfo
,
&
pQueryAttr
->
memRef
);
}
return
terrno
;
...
...
@@ -3911,41 +3911,41 @@ static SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfOutput, in
int32_t
doInitQInfo
(
SQInfo
*
pQInfo
,
STSBuf
*
pTsBuf
,
SArray
*
prevResult
,
void
*
tsdb
,
int32_t
tbScanner
,
SArray
*
pOperator
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
pQuery
->
tsdb
=
tsdb
;
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
pQuery
Attr
->
tsdb
=
tsdb
;
pRuntimeEnv
->
prevResult
=
prevResult
;
pRuntimeEnv
->
qinfo
=
pQInfo
;
if
(
tsdb
!=
NULL
)
{
int32_t
code
=
setupQueryHandle
(
tsdb
,
pQInfo
,
pQuery
->
stableQuery
);
int32_t
code
=
setupQueryHandle
(
tsdb
,
pQInfo
,
pQuery
Attr
->
stableQuery
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
}
pQuery
->
tsdb
=
tsdb
;
pQuery
->
interBufSize
=
getOutputInterResultBufSize
(
pQuery
);
pQuery
Attr
->
tsdb
=
tsdb
;
pQuery
Attr
->
interBufSize
=
getOutputInterResultBufSize
(
pQueryAttr
);
pRuntimeEnv
->
groupResInfo
.
totalGroup
=
(
int32_t
)
(
pQuery
->
stableQuery
?
GET_NUM_OF_TABLEGROUP
(
pRuntimeEnv
)
:
0
);
pRuntimeEnv
->
groupResInfo
.
totalGroup
=
(
int32_t
)
(
pQuery
Attr
->
stableQuery
?
GET_NUM_OF_TABLEGROUP
(
pRuntimeEnv
)
:
0
);
pRuntimeEnv
->
pQuery
=
pQuery
;
pRuntimeEnv
->
pQuery
Attr
=
pQueryAttr
;
pRuntimeEnv
->
pTsBuf
=
pTsBuf
;
pRuntimeEnv
->
cur
.
vgroupIndex
=
-
1
;
setResultBufSize
(
pQuery
,
&
pRuntimeEnv
->
resultInfo
);
setResultBufSize
(
pQuery
Attr
,
&
pRuntimeEnv
->
resultInfo
);
/*
if (onlyQueryTags(pQuery)) {
if (onlyQueryTags(pQuery
Attr
)) {
// pRuntimeEnv->resultInfo.capacity = 4096;
// pRuntimeEnv->proot = createTagScanOperatorInfo(pRuntimeEnv, pQuery
->pExpr1, pQuery
->numOfOutput);
} else if (pQuery->queryBlockDist) {
// pRuntimeEnv->proot = createTagScanOperatorInfo(pRuntimeEnv, pQuery
Attr->pExpr1, pQueryAttr
->numOfOutput);
} else if (pQuery
Attr
->queryBlockDist) {
pRuntimeEnv->pTableScanner = createTableBlockInfoScanOperator(pRuntimeEnv->pQueryHandle, pRuntimeEnv);
} else if (pQuery
->tsCompQuery || pQuery
->pointInterpQuery) {
} else if (pQuery
Attr->tsCompQuery || pQueryAttr
->pointInterpQuery) {
pRuntimeEnv->pTableScanner = createTableSeqScanOperator(pRuntimeEnv->pQueryHandle, pRuntimeEnv);
} else if (needReverseScan(pQuery)) {
pRuntimeEnv->pTableScanner = createDataBlocksOptScanInfo(pRuntimeEnv->pQueryHandle, pRuntimeEnv, getNumOfScanTimes(pQuery), 1);
} else if (needReverseScan(pQuery
Attr
)) {
pRuntimeEnv->pTableScanner = createDataBlocksOptScanInfo(pRuntimeEnv->pQueryHandle, pRuntimeEnv, getNumOfScanTimes(pQuery
Attr
), 1);
} else {
pRuntimeEnv->pTableScanner = createTableScanOperator(pRuntimeEnv->pQueryHandle, pRuntimeEnv, getNumOfScanTimes(pQuery));
pRuntimeEnv->pTableScanner = createTableScanOperator(pRuntimeEnv->pQueryHandle, pRuntimeEnv, getNumOfScanTimes(pQuery
Attr
));
}
*/
switch
(
tbScanner
)
{
...
...
@@ -3958,11 +3958,11 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, SArray* prevResult, void *ts
break
;
}
case
OP_DataBlocksOptScan
:
{
pRuntimeEnv
->
pTableScanner
=
createDataBlocksOptScanInfo
(
pRuntimeEnv
->
pQueryHandle
,
pRuntimeEnv
,
getNumOfScanTimes
(
pQuery
),
1
);
pRuntimeEnv
->
pTableScanner
=
createDataBlocksOptScanInfo
(
pRuntimeEnv
->
pQueryHandle
,
pRuntimeEnv
,
getNumOfScanTimes
(
pQuery
Attr
),
1
);
break
;
}
case
OP_TableScan
:
{
pRuntimeEnv
->
pTableScanner
=
createTableScanOperator
(
pRuntimeEnv
->
pQueryHandle
,
pRuntimeEnv
,
getNumOfScanTimes
(
pQuery
));
pRuntimeEnv
->
pTableScanner
=
createTableScanOperator
(
pRuntimeEnv
->
pQueryHandle
,
pRuntimeEnv
,
getNumOfScanTimes
(
pQuery
Attr
));
break
;
}
default:
{
...
...
@@ -3971,12 +3971,12 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, SArray* prevResult, void *ts
}
}
if
(
pTsBuf
!=
NULL
)
{
int16_t
order
=
(
pQuery
->
order
.
order
==
pRuntimeEnv
->
pTsBuf
->
tsOrder
)
?
TSDB_ORDER_ASC
:
TSDB_ORDER_DESC
;
int16_t
order
=
(
pQuery
Attr
->
order
.
order
==
pRuntimeEnv
->
pTsBuf
->
tsOrder
)
?
TSDB_ORDER_ASC
:
TSDB_ORDER_DESC
;
tsBufSetTraverseOrder
(
pRuntimeEnv
->
pTsBuf
,
order
);
}
int32_t
ps
=
DEFAULT_PAGE_SIZE
;
getIntermediateBufInfo
(
pRuntimeEnv
,
&
ps
,
&
pQuery
->
intermediateResultRowSize
);
getIntermediateBufInfo
(
pRuntimeEnv
,
&
ps
,
&
pQuery
Attr
->
intermediateResultRowSize
);
int32_t
TENMB
=
1024
*
1024
*
10
;
int32_t
code
=
createDiskbasedResultBuffer
(
&
pRuntimeEnv
->
pResultBuf
,
ps
,
TENMB
,
pQInfo
);
...
...
@@ -3985,9 +3985,9 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, SArray* prevResult, void *ts
}
// create runtime environment
int32_t
numOfTables
=
(
int32_t
)
pQuery
->
tableGroupInfo
.
numOfTables
;
int32_t
numOfTables
=
(
int32_t
)
pQuery
Attr
->
tableGroupInfo
.
numOfTables
;
pQInfo
->
summary
.
tableInfoSize
+=
(
numOfTables
*
sizeof
(
STableQueryInfo
));
code
=
setupQueryRuntimeEnv
(
pRuntimeEnv
,
(
int32_t
)
pQuery
->
tableGroupInfo
.
numOfTables
,
pOperator
);
code
=
setupQueryRuntimeEnv
(
pRuntimeEnv
,
(
int32_t
)
pQuery
Attr
->
tableGroupInfo
.
numOfTables
,
pOperator
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -3996,25 +3996,25 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, SArray* prevResult, void *ts
return
TSDB_CODE_SUCCESS
;
}
static
void
doTableQueryInfoTimeWindowCheck
(
SQuery
*
pQuery
,
STableQueryInfo
*
pTableQueryInfo
)
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
static
void
doTableQueryInfoTimeWindowCheck
(
SQuery
Attr
*
pQueryAttr
,
STableQueryInfo
*
pTableQueryInfo
)
{
if
(
QUERY_IS_ASC_QUERY
(
pQuery
Attr
))
{
assert
(
(
pTableQueryInfo
->
win
.
skey
<=
pTableQueryInfo
->
win
.
ekey
)
&&
(
pTableQueryInfo
->
lastKey
>=
pTableQueryInfo
->
win
.
skey
)
&&
(
pTableQueryInfo
->
win
.
skey
>=
pQuery
->
window
.
skey
&&
pTableQueryInfo
->
win
.
ekey
<=
pQuery
->
window
.
ekey
));
(
pTableQueryInfo
->
win
.
skey
>=
pQuery
Attr
->
window
.
skey
&&
pTableQueryInfo
->
win
.
ekey
<=
pQueryAttr
->
window
.
ekey
));
}
else
{
assert
(
(
pTableQueryInfo
->
win
.
skey
>=
pTableQueryInfo
->
win
.
ekey
)
&&
(
pTableQueryInfo
->
lastKey
<=
pTableQueryInfo
->
win
.
skey
)
&&
(
pTableQueryInfo
->
win
.
skey
<=
pQuery
->
window
.
skey
&&
pTableQueryInfo
->
win
.
ekey
>=
pQuery
->
window
.
ekey
));
(
pTableQueryInfo
->
win
.
skey
<=
pQuery
Attr
->
window
.
skey
&&
pTableQueryInfo
->
win
.
ekey
>=
pQueryAttr
->
window
.
ekey
));
}
}
STsdbQueryCond
createTsdbQueryCond
(
SQuery
*
pQuery
,
STimeWindow
*
win
)
{
STsdbQueryCond
createTsdbQueryCond
(
SQuery
Attr
*
pQueryAttr
,
STimeWindow
*
win
)
{
STsdbQueryCond
cond
=
{
.
colList
=
pQuery
->
colList
,
.
order
=
pQuery
->
order
.
order
,
.
numOfCols
=
pQuery
->
numOfCols
,
.
colList
=
pQuery
Attr
->
colList
,
.
order
=
pQuery
Attr
->
order
.
order
,
.
numOfCols
=
pQuery
Attr
->
numOfCols
,
.
type
=
BLOCK_LOAD_OFFSET_SEQ_ORDER
,
.
loadExternalRows
=
false
,
};
...
...
@@ -4067,8 +4067,8 @@ static SSDataBlock* doTableScanImpl(void* param) {
STableScanInfo
*
pTableScanInfo
=
pOperator
->
info
;
SSDataBlock
*
pBlock
=
&
pTableScanInfo
->
block
;
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperator
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
STableGroupInfo
*
pTableGroupInfo
=
&
pOperator
->
pRuntimeEnv
->
tableqinfoGroupInfo
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
STableGroupInfo
*
pTableGroupInfo
=
&
pOperator
->
pRuntimeEnv
->
tableqinfoGroupInfo
;
while
(
tsdbNextDataBlock
(
pTableScanInfo
->
pQueryHandle
))
{
if
(
isQueryKilled
(
pOperator
->
pRuntimeEnv
->
qinfo
))
{
...
...
@@ -4087,7 +4087,7 @@ static SSDataBlock* doTableScanImpl(void* param) {
}
pRuntimeEnv
->
current
=
*
pTableQueryInfo
;
doTableQueryInfoTimeWindowCheck
(
pQuery
,
*
pTableQueryInfo
);
doTableQueryInfoTimeWindowCheck
(
pQuery
Attr
,
*
pTableQueryInfo
);
}
// this function never returns error?
...
...
@@ -4113,7 +4113,7 @@ static SSDataBlock* doTableScan(void* param) {
STableScanInfo
*
pTableScanInfo
=
pOperator
->
info
;
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperator
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SResultRowInfo
*
pResultRowInfo
=
pTableScanInfo
->
pResultRowInfo
;
...
...
@@ -4132,7 +4132,7 @@ static SSDataBlock* doTableScan(void* param) {
}
// do prepare for the next round table scan operation
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
,
&
pQuery
->
window
);
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
Attr
,
&
pQueryAttr
->
window
);
tsdbResetQueryHandle
(
pTableScanInfo
->
pQueryHandle
,
&
cond
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_NOT_COMPLETED
);
...
...
@@ -4155,7 +4155,7 @@ static SSDataBlock* doTableScan(void* param) {
if
(
pTableScanInfo
->
reverseTimes
>
0
)
{
setupEnvForReverseScan
(
pRuntimeEnv
,
pTableScanInfo
->
pResultRowInfo
,
pTableScanInfo
->
pCtx
,
pTableScanInfo
->
numOfOutput
);
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
,
&
pQuery
->
window
);
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
Attr
,
&
pQueryAttr
->
window
);
tsdbResetQueryHandle
(
pTableScanInfo
->
pQueryHandle
,
&
cond
);
qDebug
(
"QInfo:%p start to reverse scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
...
...
@@ -4227,7 +4227,7 @@ SOperatorInfo* createTableScanOperator(void* pTsdbQueryHandle, SQueryRuntimeEnv*
pInfo
->
pQueryHandle
=
pTsdbQueryHandle
;
pInfo
->
times
=
repeatTime
;
pInfo
->
reverseTimes
=
0
;
pInfo
->
order
=
pRuntimeEnv
->
pQuery
->
order
.
order
;
pInfo
->
order
=
pRuntimeEnv
->
pQuery
Attr
->
order
.
order
;
pInfo
->
current
=
0
;
SOperatorInfo
*
pOperator
=
calloc
(
1
,
sizeof
(
SOperatorInfo
));
...
...
@@ -4236,7 +4236,7 @@ SOperatorInfo* createTableScanOperator(void* pTsdbQueryHandle, SQueryRuntimeEnv*
pOperator
->
blockingOptr
=
false
;
pOperator
->
status
=
OP_IN_EXECUTING
;
pOperator
->
info
=
pInfo
;
pOperator
->
numOfOutput
=
pRuntimeEnv
->
pQuery
->
numOfCols
;
pOperator
->
numOfOutput
=
pRuntimeEnv
->
pQuery
Attr
->
numOfCols
;
pOperator
->
pRuntimeEnv
=
pRuntimeEnv
;
pOperator
->
exec
=
doTableScan
;
...
...
@@ -4249,7 +4249,7 @@ SOperatorInfo* createTableSeqScanOperator(void* pTsdbQueryHandle, SQueryRuntimeE
pInfo
->
pQueryHandle
=
pTsdbQueryHandle
;
pInfo
->
times
=
1
;
pInfo
->
reverseTimes
=
0
;
pInfo
->
order
=
pRuntimeEnv
->
pQuery
->
order
.
order
;
pInfo
->
order
=
pRuntimeEnv
->
pQuery
Attr
->
order
.
order
;
pInfo
->
current
=
0
;
SOperatorInfo
*
pOperator
=
calloc
(
1
,
sizeof
(
SOperatorInfo
));
...
...
@@ -4258,7 +4258,7 @@ SOperatorInfo* createTableSeqScanOperator(void* pTsdbQueryHandle, SQueryRuntimeE
pOperator
->
blockingOptr
=
false
;
pOperator
->
status
=
OP_IN_EXECUTING
;
pOperator
->
info
=
pInfo
;
pOperator
->
numOfOutput
=
pRuntimeEnv
->
pQuery
->
numOfCols
;
pOperator
->
numOfOutput
=
pRuntimeEnv
->
pQuery
Attr
->
numOfCols
;
pOperator
->
pRuntimeEnv
=
pRuntimeEnv
;
pOperator
->
exec
=
doTableScanImpl
;
...
...
@@ -4284,7 +4284,7 @@ SOperatorInfo* createTableBlockInfoScanOperator(void* pTsdbQueryHandle, SQueryRu
pOperator
->
status
=
OP_IN_EXECUTING
;
pOperator
->
info
=
pInfo
;
pOperator
->
pRuntimeEnv
=
pRuntimeEnv
;
pOperator
->
numOfOutput
=
pRuntimeEnv
->
pQuery
->
numOfCols
;
pOperator
->
numOfOutput
=
pRuntimeEnv
->
pQuery
Attr
->
numOfCols
;
pOperator
->
exec
=
doBlockInfoScan
;
return
pOperator
;
...
...
@@ -4348,7 +4348,7 @@ static SOperatorInfo* createDataBlocksOptScanInfo(void* pTsdbQueryHandle, SQuery
pInfo
->
times
=
repeatTime
;
pInfo
->
reverseTimes
=
reverseTime
;
pInfo
->
current
=
0
;
pInfo
->
order
=
pRuntimeEnv
->
pQuery
->
order
.
order
;
pInfo
->
order
=
pRuntimeEnv
->
pQuery
Attr
->
order
.
order
;
SOperatorInfo
*
pOptr
=
calloc
(
1
,
sizeof
(
SOperatorInfo
));
pOptr
->
name
=
"DataBlocksOptimizedScanOperator"
;
...
...
@@ -4377,8 +4377,8 @@ static SSDataBlock* doAggregate(void* param) {
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperator
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
order
=
pQuery
->
order
.
order
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
order
=
pQuery
Attr
->
order
.
order
;
SOperatorInfo
*
upstream
=
pOperator
->
upstream
;
...
...
@@ -4397,7 +4397,7 @@ static SSDataBlock* doAggregate(void* param) {
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock
(
pOperator
,
pInfo
->
pCtx
,
pBlock
,
order
);
doAggregateImpl
(
pOperator
,
pQuery
->
window
.
skey
,
pInfo
->
pCtx
,
pBlock
);
doAggregateImpl
(
pOperator
,
pQuery
Attr
->
window
.
skey
,
pInfo
->
pCtx
,
pBlock
);
}
pOperator
->
status
=
OP_EXEC_DONE
;
...
...
@@ -4430,8 +4430,8 @@ static SSDataBlock* doSTableAggregate(void* param) {
return
pInfo
->
pRes
;
}
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
order
=
pQuery
->
order
.
order
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
order
=
pQuery
Attr
->
order
.
order
;
SOperatorInfo
*
upstream
=
pOperator
->
upstream
;
...
...
@@ -4451,9 +4451,9 @@ static SSDataBlock* doSTableAggregate(void* param) {
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock
(
pOperator
,
pInfo
->
pCtx
,
pBlock
,
order
);
TSKEY
key
=
QUERY_IS_ASC_QUERY
(
pQuery
)
?
pBlock
->
info
.
window
.
ekey
+
1
:
pBlock
->
info
.
window
.
skey
-
1
;
TSKEY
key
=
QUERY_IS_ASC_QUERY
(
pQuery
Attr
)
?
pBlock
->
info
.
window
.
ekey
+
1
:
pBlock
->
info
.
window
.
skey
-
1
;
setExecutionContext
(
pRuntimeEnv
,
pInfo
,
pOperator
->
numOfOutput
,
pRuntimeEnv
->
current
->
groupIndex
,
key
);
doAggregateImpl
(
pOperator
,
pQuery
->
window
.
skey
,
pInfo
->
pCtx
,
pBlock
);
doAggregateImpl
(
pOperator
,
pQuery
Attr
->
window
.
skey
,
pInfo
->
pCtx
,
pBlock
);
}
pOperator
->
status
=
OP_RES_TO_RETURN
;
...
...
@@ -4480,7 +4480,7 @@ static SSDataBlock* doArithmeticOperation(void* param) {
SOptrBasicInfo
*
pInfo
=
&
pArithInfo
->
binfo
;
SSDataBlock
*
pRes
=
pInfo
->
pRes
;
int32_t
order
=
pRuntimeEnv
->
pQuery
->
order
.
order
;
int32_t
order
=
pRuntimeEnv
->
pQuery
Attr
->
order
.
order
;
pRes
->
info
.
rows
=
0
;
...
...
@@ -4599,9 +4599,9 @@ static SSDataBlock* doIntervalAgg(void* param) {
return
pIntervalInfo
->
pRes
;
}
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
order
=
pQuery
->
order
.
order
;
STimeWindow
win
=
pQuery
->
window
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
order
=
pQuery
Attr
->
order
.
order
;
STimeWindow
win
=
pQuery
Attr
->
window
;
SOperatorInfo
*
upstream
=
pOperator
->
upstream
;
...
...
@@ -4612,13 +4612,13 @@ static SSDataBlock* doIntervalAgg(void* param) {
}
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock
(
pOperator
,
pIntervalInfo
->
pCtx
,
pBlock
,
pQuery
->
order
.
order
);
setInputDataBlock
(
pOperator
,
pIntervalInfo
->
pCtx
,
pBlock
,
pQuery
Attr
->
order
.
order
);
hashIntervalAgg
(
pOperator
,
&
pIntervalInfo
->
resultRowInfo
,
pBlock
,
0
);
}
// restore the value
pQuery
->
order
.
order
=
order
;
pQuery
->
window
=
win
;
pQuery
Attr
->
order
.
order
=
order
;
pQuery
Attr
->
window
=
win
;
pOperator
->
status
=
OP_RES_TO_RETURN
;
closeAllResultRows
(
&
pIntervalInfo
->
resultRowInfo
);
...
...
@@ -4653,8 +4653,8 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
return
pIntervalInfo
->
pRes
;
}
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
order
=
pQuery
->
order
.
order
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
order
=
pQuery
Attr
->
order
.
order
;
SOperatorInfo
*
upstream
=
pOperator
->
upstream
;
...
...
@@ -4668,14 +4668,14 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
STableQueryInfo
*
pTableQueryInfo
=
pRuntimeEnv
->
current
;
setTagValue
(
pOperator
,
pTableQueryInfo
->
pTable
,
pIntervalInfo
->
pCtx
,
pOperator
->
numOfOutput
);
setInputDataBlock
(
pOperator
,
pIntervalInfo
->
pCtx
,
pBlock
,
pQuery
->
order
.
order
);
setInputDataBlock
(
pOperator
,
pIntervalInfo
->
pCtx
,
pBlock
,
pQuery
Attr
->
order
.
order
);
setIntervalQueryRange
(
pRuntimeEnv
,
pBlock
->
info
.
window
.
skey
);
hashIntervalAgg
(
pOperator
,
&
pTableQueryInfo
->
resInfo
,
pBlock
,
pTableQueryInfo
->
groupIndex
);
}
pOperator
->
status
=
OP_RES_TO_RETURN
;
pQuery
->
order
.
order
=
order
;
// TODO : restore the order
pQuery
Attr
->
order
.
order
=
order
;
// TODO : restore the order
doCloseAllTimeWindow
(
pRuntimeEnv
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
...
...
@@ -4707,9 +4707,9 @@ static SSDataBlock* doSessionWindowAgg(void* param) {
return
pBInfo
->
pRes
;
}
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
order
=
pQuery
->
order
.
order
;
STimeWindow
win
=
pQuery
->
window
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
order
=
pQuery
Attr
->
order
.
order
;
STimeWindow
win
=
pQuery
Attr
->
window
;
SOperatorInfo
*
upstream
=
pOperator
->
upstream
;
...
...
@@ -4720,13 +4720,13 @@ static SSDataBlock* doSessionWindowAgg(void* param) {
}
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock
(
pOperator
,
pBInfo
->
pCtx
,
pBlock
,
pQuery
->
order
.
order
);
setInputDataBlock
(
pOperator
,
pBInfo
->
pCtx
,
pBlock
,
pQuery
Attr
->
order
.
order
);
doSessionWindowAggImpl
(
pOperator
,
pWindowInfo
,
pBlock
);
}
// restore the value
pQuery
->
order
.
order
=
order
;
pQuery
->
window
=
win
;
pQuery
Attr
->
order
.
order
=
order
;
pQuery
Attr
->
window
=
win
;
pOperator
->
status
=
OP_RES_TO_RETURN
;
closeAllResultRows
(
&
pBInfo
->
resultRowInfo
);
...
...
@@ -4771,10 +4771,10 @@ static SSDataBlock* hashGroupbyAggregate(void* param) {
}
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock
(
pOperator
,
pInfo
->
binfo
.
pCtx
,
pBlock
,
pRuntimeEnv
->
pQuery
->
order
.
order
);
setInputDataBlock
(
pOperator
,
pInfo
->
binfo
.
pCtx
,
pBlock
,
pRuntimeEnv
->
pQuery
Attr
->
order
.
order
);
setTagValue
(
pOperator
,
pRuntimeEnv
->
current
->
pTable
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
);
if
(
pInfo
->
colIndex
==
-
1
)
{
pInfo
->
colIndex
=
getGroupbyColumnIndex
(
pRuntimeEnv
->
pQuery
->
pGroupbyExpr
,
pBlock
);
pInfo
->
colIndex
=
getGroupbyColumnIndex
(
pRuntimeEnv
->
pQuery
Attr
->
pGroupbyExpr
,
pBlock
);
}
doHashGroupbyAgg
(
pOperator
,
pInfo
,
pBlock
);
...
...
@@ -4784,7 +4784,7 @@ static SSDataBlock* hashGroupbyAggregate(void* param) {
closeAllResultRows
(
&
pInfo
->
binfo
.
resultRowInfo
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
if
(
!
pRuntimeEnv
->
pQuery
->
stableQuery
)
{
// finalize include the update of result rows
if
(
!
pRuntimeEnv
->
pQuery
Attr
->
stableQuery
)
{
// finalize include the update of result rows
finalizeQueryResult
(
pOperator
,
pInfo
->
binfo
.
pCtx
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
rowCellInfoOffset
);
}
else
{
updateNumOfRowsInResultRows
(
pRuntimeEnv
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
rowCellInfoOffset
);
...
...
@@ -4822,11 +4822,11 @@ static SSDataBlock* doFill(void* param) {
return
NULL
;
}
taosFillSetStartInfo
(
pInfo
->
pFillInfo
,
0
,
pRuntimeEnv
->
pQuery
->
window
.
ekey
);
taosFillSetStartInfo
(
pInfo
->
pFillInfo
,
0
,
pRuntimeEnv
->
pQuery
Attr
->
window
.
ekey
);
}
else
{
pInfo
->
totalInputRows
+=
pBlock
->
info
.
rows
;
int64_t
ekey
=
Q_STATUS_EQUAL
(
pRuntimeEnv
->
status
,
QUERY_COMPLETED
)
?
pRuntimeEnv
->
pQuery
->
window
.
ekey
:
pBlock
->
info
.
window
.
ekey
;
int64_t
ekey
=
Q_STATUS_EQUAL
(
pRuntimeEnv
->
status
,
QUERY_COMPLETED
)
?
pRuntimeEnv
->
pQuery
Attr
->
window
.
ekey
:
pBlock
->
info
.
window
.
ekey
;
taosFillSetStartInfo
(
pInfo
->
pFillInfo
,
pBlock
->
info
.
rows
,
ekey
);
taosFillSetInputDataBlock
(
pInfo
->
pFillInfo
,
pBlock
);
...
...
@@ -4838,9 +4838,9 @@ static SSDataBlock* doFill(void* param) {
}
// todo set the attribute of query scan count
static
int32_t
getNumOfScanTimes
(
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
->
pExpr1
[
i
].
base
.
functionId
;
static
int32_t
getNumOfScanTimes
(
SQuery
Attr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQuery
Attr
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_STDDEV
||
functionId
==
TSDB_FUNC_PERCT
)
{
return
2
;
}
...
...
@@ -4866,8 +4866,8 @@ static void destroyOperatorInfo(SOperatorInfo* pOperator) {
static
SOperatorInfo
*
createAggregateOperatorInfo
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SOperatorInfo
*
upstream
,
SExprInfo
*
pExpr
,
int32_t
numOfOutput
)
{
SAggOperatorInfo
*
pInfo
=
calloc
(
1
,
sizeof
(
SAggOperatorInfo
));
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
numOfRows
=
(
int32_t
)(
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQuery
,
pQuery
->
topBotQuery
,
pQuery
->
stableQuery
));
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
int32_t
numOfRows
=
(
int32_t
)(
GET_ROW_PARAM_FOR_MULTIOUTPUT
(
pQuery
Attr
,
pQueryAttr
->
topBotQuery
,
pQueryAttr
->
stableQuery
));
pInfo
->
binfo
.
pRes
=
createOutputBuf
(
pExpr
,
numOfOutput
,
numOfRows
);
pInfo
->
binfo
.
pCtx
=
createSQLFunctionCtx
(
pRuntimeEnv
,
pExpr
,
numOfOutput
,
&
pInfo
->
binfo
.
rowCellInfoOffset
);
...
...
@@ -4988,7 +4988,7 @@ SOperatorInfo* createArithOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorI
SOperatorInfo
*
createLimitOperatorInfo
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SOperatorInfo
*
upstream
)
{
SLimitOperatorInfo
*
pInfo
=
calloc
(
1
,
sizeof
(
SLimitOperatorInfo
));
pInfo
->
limit
=
pRuntimeEnv
->
pQuery
->
limit
.
limit
;
pInfo
->
limit
=
pRuntimeEnv
->
pQuery
Attr
->
limit
.
limit
;
SOperatorInfo
*
pOperator
=
calloc
(
1
,
sizeof
(
SOperatorInfo
));
...
...
@@ -5007,7 +5007,7 @@ SOperatorInfo* createLimitOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorI
SOperatorInfo
*
createOffsetOperatorInfo
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SOperatorInfo
*
upstream
)
{
SOffsetOperatorInfo
*
pInfo
=
calloc
(
1
,
sizeof
(
SOffsetOperatorInfo
));
pInfo
->
offset
=
pRuntimeEnv
->
pQuery
->
limit
.
offset
;
pInfo
->
offset
=
pRuntimeEnv
->
pQuery
Attr
->
limit
.
offset
;
SOperatorInfo
*
pOperator
=
calloc
(
1
,
sizeof
(
SOperatorInfo
));
pOperator
->
name
=
"OffsetOperator"
;
...
...
@@ -5125,17 +5125,17 @@ SOperatorInfo* createFillOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorIn
pInfo
->
pRes
=
createOutputBuf
(
pExpr
,
numOfOutput
,
pRuntimeEnv
->
resultInfo
.
capacity
);
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SFillColInfo
*
pColInfo
=
createFillColInfo
(
pExpr
,
numOfOutput
,
pQuery
->
fillVal
);
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SFillColInfo
*
pColInfo
=
createFillColInfo
(
pExpr
,
numOfOutput
,
pQuery
Attr
->
fillVal
);
STimeWindow
w
=
TSWINDOW_INITIALIZER
;
TSKEY
sk
=
MIN
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
);
TSKEY
ek
=
MAX
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
);
getAlignQueryTimeWindow
(
pQuery
,
pQuery
->
window
.
skey
,
sk
,
ek
,
&
w
);
TSKEY
sk
=
MIN
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
);
TSKEY
ek
=
MAX
(
pQuery
Attr
->
window
.
skey
,
pQueryAttr
->
window
.
ekey
);
getAlignQueryTimeWindow
(
pQuery
Attr
,
pQueryAttr
->
window
.
skey
,
sk
,
ek
,
&
w
);
pInfo
->
pFillInfo
=
taosCreateFillInfo
(
pQuery
->
order
.
order
,
w
.
skey
,
0
,
(
int32_t
)
pRuntimeEnv
->
resultInfo
.
capacity
,
numOfOutput
,
pQuery
->
interval
.
sliding
,
pQuery
->
interval
.
slidingUnit
,
(
int8_t
)
pQuery
->
precision
,
pQuery
->
fillType
,
pColInfo
,
pRuntimeEnv
->
qinfo
);
pInfo
->
pFillInfo
=
taosCreateFillInfo
(
pQuery
Attr
->
order
.
order
,
w
.
skey
,
0
,
(
int32_t
)
pRuntimeEnv
->
resultInfo
.
capacity
,
numOfOutput
,
pQuery
Attr
->
interval
.
sliding
,
pQueryAttr
->
interval
.
slidingUnit
,
(
int8_t
)
pQueryAttr
->
precision
,
pQuery
Attr
->
fillType
,
pColInfo
,
pRuntimeEnv
->
qinfo
);
}
SOperatorInfo
*
pOperator
=
calloc
(
1
,
sizeof
(
SOperatorInfo
));
...
...
@@ -5175,8 +5175,8 @@ static SSDataBlock* doTagScan(void* param) {
int32_t
functionId
=
pOperator
->
pExpr
[
0
].
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TID_TAG
)
{
// return the tags & table Id
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
assert
(
pQuery
->
numOfOutput
==
1
);
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
assert
(
pQuery
Attr
->
numOfOutput
==
1
);
SExprInfo
*
pExprInfo
=
&
pOperator
->
pExpr
[
0
];
int32_t
rsize
=
pExprInfo
->
base
.
resBytes
;
...
...
@@ -5186,10 +5186,10 @@ static SSDataBlock* doTagScan(void* param) {
int16_t
bytes
=
pExprInfo
->
base
.
resBytes
;
int16_t
type
=
pExprInfo
->
base
.
resType
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfTags
;
++
i
)
{
if
(
pQuery
->
tagColList
[
i
].
colId
==
pExprInfo
->
base
.
colInfo
.
colId
)
{
bytes
=
pQuery
->
tagColList
[
i
].
bytes
;
type
=
pQuery
->
tagColList
[
i
].
type
;
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfTags
;
++
i
)
{
if
(
pQuery
Attr
->
tagColList
[
i
].
colId
==
pExprInfo
->
base
.
colInfo
.
colId
)
{
bytes
=
pQuery
Attr
->
tagColList
[
i
].
bytes
;
type
=
pQuery
Attr
->
tagColList
[
i
].
type
;
break
;
}
}
...
...
@@ -5215,8 +5215,8 @@ static SSDataBlock* doTagScan(void* param) {
*
(
int32_t
*
)
output
=
id
->
tid
;
output
+=
sizeof
(
id
->
tid
);
*
(
int32_t
*
)
output
=
pQuery
->
vgId
;
output
+=
sizeof
(
pQuery
->
vgId
);
*
(
int32_t
*
)
output
=
pQuery
Attr
->
vgId
;
output
+=
sizeof
(
pQuery
Attr
->
vgId
);
char
*
data
=
NULL
;
if
(
pExprInfo
->
base
.
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
)
{
...
...
@@ -5977,30 +5977,30 @@ SSqlGroupbyExpr *createGroupbyExprFromMsg(SQueryTableMsg *pQueryMsg, SColIndex *
return
pGroupbyExpr
;
}
static
int32_t
createFilterInfo
(
void
*
pQInfo
,
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfCols
;
++
i
)
{
if
(
pQuery
->
colList
[
i
].
numOfFilters
>
0
)
{
pQuery
->
numOfFilterCols
++
;
static
int32_t
createFilterInfo
(
void
*
pQInfo
,
SQuery
Attr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfCols
;
++
i
)
{
if
(
pQuery
Attr
->
colList
[
i
].
numOfFilters
>
0
)
{
pQuery
Attr
->
numOfFilterCols
++
;
}
}
if
(
pQuery
->
numOfFilterCols
==
0
)
{
if
(
pQuery
Attr
->
numOfFilterCols
==
0
)
{
return
TSDB_CODE_SUCCESS
;
}
pQuery
->
pFilterInfo
=
calloc
(
1
,
sizeof
(
SSingleColumnFilterInfo
)
*
pQuery
->
numOfFilterCols
);
if
(
pQuery
->
pFilterInfo
==
NULL
)
{
pQuery
Attr
->
pFilterInfo
=
calloc
(
1
,
sizeof
(
SSingleColumnFilterInfo
)
*
pQueryAttr
->
numOfFilterCols
);
if
(
pQuery
Attr
->
pFilterInfo
==
NULL
)
{
return
TSDB_CODE_QRY_OUT_OF_MEMORY
;
}
for
(
int32_t
i
=
0
,
j
=
0
;
i
<
pQuery
->
numOfCols
;
++
i
)
{
if
(
pQuery
->
colList
[
i
].
numOfFilters
>
0
)
{
SSingleColumnFilterInfo
*
pFilterInfo
=
&
pQuery
->
pFilterInfo
[
j
];
for
(
int32_t
i
=
0
,
j
=
0
;
i
<
pQuery
Attr
->
numOfCols
;
++
i
)
{
if
(
pQuery
Attr
->
colList
[
i
].
numOfFilters
>
0
)
{
SSingleColumnFilterInfo
*
pFilterInfo
=
&
pQuery
Attr
->
pFilterInfo
[
j
];
memcpy
(
&
pFilterInfo
->
info
,
&
pQuery
->
colList
[
i
],
sizeof
(
SColumnInfo
));
pFilterInfo
->
info
=
pQuery
->
colList
[
i
];
memcpy
(
&
pFilterInfo
->
info
,
&
pQuery
Attr
->
colList
[
i
],
sizeof
(
SColumnInfo
));
pFilterInfo
->
info
=
pQuery
Attr
->
colList
[
i
];
pFilterInfo
->
numOfFilters
=
pQuery
->
colList
[
i
].
numOfFilters
;
pFilterInfo
->
numOfFilters
=
pQuery
Attr
->
colList
[
i
].
numOfFilters
;
pFilterInfo
->
pFilters
=
calloc
(
pFilterInfo
->
numOfFilters
,
sizeof
(
SColumnFilterElem
));
if
(
pFilterInfo
->
pFilters
==
NULL
)
{
return
TSDB_CODE_QRY_OUT_OF_MEMORY
;
...
...
@@ -6008,7 +6008,7 @@ static int32_t createFilterInfo(void *pQInfo, SQuery *pQuery) {
for
(
int32_t
f
=
0
;
f
<
pFilterInfo
->
numOfFilters
;
++
f
)
{
SColumnFilterElem
*
pSingleColFilter
=
&
pFilterInfo
->
pFilters
[
f
];
pSingleColFilter
->
filterInfo
=
pQuery
->
colList
[
i
].
filterInfo
[
f
];
pSingleColFilter
->
filterInfo
=
pQuery
Attr
->
colList
[
i
].
filterInfo
[
f
];
int32_t
lower
=
pSingleColFilter
->
filterInfo
.
lowerRelOptr
;
int32_t
upper
=
pSingleColFilter
->
filterInfo
.
upperRelOptr
;
...
...
@@ -6023,7 +6023,7 @@ static int32_t createFilterInfo(void *pQInfo, SQuery *pQuery) {
return
TSDB_CODE_QRY_INVALID_MSG
;
}
pSingleColFilter
->
bytes
=
pQuery
->
colList
[
i
].
bytes
;
pSingleColFilter
->
bytes
=
pQuery
Attr
->
colList
[
i
].
bytes
;
}
j
++
;
...
...
@@ -6033,11 +6033,11 @@ static int32_t createFilterInfo(void *pQInfo, SQuery *pQuery) {
return
TSDB_CODE_SUCCESS
;
}
static
void
doUpdateExprColumnIndex
(
SQuery
*
pQuery
)
{
assert
(
pQuery
->
pExpr1
!=
NULL
&&
pQuery
!=
NULL
);
static
void
doUpdateExprColumnIndex
(
SQuery
Attr
*
pQueryAttr
)
{
assert
(
pQuery
Attr
->
pExpr1
!=
NULL
&&
pQueryAttr
!=
NULL
);
for
(
int32_t
k
=
0
;
k
<
pQuery
->
numOfOutput
;
++
k
)
{
SSqlExpr
*
pSqlExprMsg
=
&
pQuery
->
pExpr1
[
k
].
base
;
for
(
int32_t
k
=
0
;
k
<
pQuery
Attr
->
numOfOutput
;
++
k
)
{
SSqlExpr
*
pSqlExprMsg
=
&
pQuery
Attr
->
pExpr1
[
k
].
base
;
if
(
pSqlExprMsg
->
functionId
==
TSDB_FUNC_ARITHM
)
{
continue
;
}
...
...
@@ -6046,34 +6046,34 @@ static void doUpdateExprColumnIndex(SQuery *pQuery) {
SColIndex
*
pColIndex
=
&
pSqlExprMsg
->
colInfo
;
if
(
TSDB_COL_IS_NORMAL_COL
(
pColIndex
->
flag
))
{
int32_t
f
=
0
;
for
(
f
=
0
;
f
<
pQuery
->
numOfCols
;
++
f
)
{
if
(
pColIndex
->
colId
==
pQuery
->
colList
[
f
].
colId
)
{
for
(
f
=
0
;
f
<
pQuery
Attr
->
numOfCols
;
++
f
)
{
if
(
pColIndex
->
colId
==
pQuery
Attr
->
colList
[
f
].
colId
)
{
pColIndex
->
colIndex
=
f
;
break
;
}
}
assert
(
f
<
pQuery
->
numOfCols
);
assert
(
f
<
pQuery
Attr
->
numOfCols
);
}
else
if
(
pColIndex
->
colId
<=
TSDB_UD_COLUMN_INDEX
)
{
// do nothing for user-defined constant value result columns
}
else
if
(
pColIndex
->
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
)
{
pColIndex
->
colIndex
=
0
;
// only one source column, so it must be 0;
assert
(
pQuery
->
numOfOutput
==
1
);
assert
(
pQuery
Attr
->
numOfOutput
==
1
);
}
else
{
int32_t
f
=
0
;
for
(
f
=
0
;
f
<
pQuery
->
numOfTags
;
++
f
)
{
if
(
pColIndex
->
colId
==
pQuery
->
tagColList
[
f
].
colId
)
{
for
(
f
=
0
;
f
<
pQuery
Attr
->
numOfTags
;
++
f
)
{
if
(
pColIndex
->
colId
==
pQuery
Attr
->
tagColList
[
f
].
colId
)
{
pColIndex
->
colIndex
=
f
;
break
;
}
}
assert
(
f
<
pQuery
->
numOfTags
||
pColIndex
->
colId
==
TSDB_TBNAME_COLUMN_INDEX
||
pColIndex
->
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
);
assert
(
f
<
pQuery
Attr
->
numOfTags
||
pColIndex
->
colId
==
TSDB_TBNAME_COLUMN_INDEX
||
pColIndex
->
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
);
}
}
}
void
setResultBufSize
(
SQuery
*
pQuery
,
SRspResultInfo
*
pResultInfo
)
{
void
setResultBufSize
(
SQuery
Attr
*
pQueryAttr
,
SRspResultInfo
*
pResultInfo
)
{
const
int32_t
DEFAULT_RESULT_MSG_SIZE
=
1024
*
(
1024
+
512
);
// the minimum number of rows for projection query
...
...
@@ -6082,8 +6082,8 @@ void setResultBufSize(SQuery* pQuery, SRspResultInfo* pResultInfo) {
const
float
THRESHOLD_RATIO
=
0
.
85
f
;
if
(
isProjQuery
(
pQuery
))
{
int32_t
numOfRes
=
DEFAULT_RESULT_MSG_SIZE
/
pQuery
->
resultRowSize
;
if
(
isProjQuery
(
pQuery
Attr
))
{
int32_t
numOfRes
=
DEFAULT_RESULT_MSG_SIZE
/
pQuery
Attr
->
resultRowSize
;
if
(
numOfRes
<
MIN_ROWS_FOR_PRJ_QUERY
)
{
numOfRes
=
MIN_ROWS_FOR_PRJ_QUERY
;
}
...
...
@@ -6114,83 +6114,83 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SSqlGroupbyExpr* pGroupbyExpr
// to make sure third party won't overwrite this structure
pQInfo
->
signature
=
pQInfo
;
SQuery
*
pQuery
=
&
pQInfo
->
query
;
pQInfo
->
runtimeEnv
.
pQuery
=
pQuery
;
pQuery
->
tableGroupInfo
=
*
pTableGroupInfo
;
pQuery
->
numOfCols
=
numOfCols
;
pQuery
->
numOfOutput
=
numOfOutput
;
pQuery
->
limit
.
limit
=
pQueryMsg
->
limit
;
pQuery
->
limit
.
offset
=
pQueryMsg
->
offset
;
pQuery
->
order
.
order
=
pQueryMsg
->
order
;
pQuery
->
order
.
orderColId
=
pQueryMsg
->
orderColId
;
pQuery
->
pExpr1
=
pExprs
;
pQuery
->
pExpr2
=
pSecExprs
;
pQuery
->
numOfExpr2
=
pQueryMsg
->
secondStageOutput
;
pQuery
->
pGroupbyExpr
=
pGroupbyExpr
;
memcpy
(
&
pQuery
->
interval
,
&
pQueryMsg
->
interval
,
sizeof
(
pQuery
->
interval
));
pQuery
->
fillType
=
pQueryMsg
->
fillType
;
pQuery
->
numOfTags
=
pQueryMsg
->
numOfTags
;
pQuery
->
tagColList
=
pTagCols
;
pQuery
->
prjInfo
.
vgroupLimit
=
pQueryMsg
->
vgroupLimit
;
pQuery
->
prjInfo
.
ts
=
(
pQueryMsg
->
order
==
TSDB_ORDER_ASC
)
?
INT64_MIN
:
INT64_MAX
;
pQuery
->
sw
=
pQueryMsg
->
sw
;
pQuery
->
stableQuery
=
pQueryMsg
->
stableQuery
;
pQuery
->
topBotQuery
=
pQueryMsg
->
topBotQuery
;
pQuery
->
groupbyColumn
=
pQueryMsg
->
groupbyColumn
;
pQuery
->
hasTagResults
=
pQueryMsg
->
hasTagResults
;
pQuery
->
timeWindowInterpo
=
pQueryMsg
->
timeWindowInterpo
;
pQuery
->
queryBlockDist
=
pQueryMsg
->
queryBlockDist
;
pQuery
->
stabledev
=
pQueryMsg
->
stabledev
;
pQuery
->
tsCompQuery
=
pQueryMsg
->
tsCompQuery
;
pQuery
->
simpleAgg
=
pQueryMsg
->
simpleAgg
;
pQuery
->
pointInterpQuery
=
pQueryMsg
->
pointInterpQuery
;
pQuery
->
needReverseScan
=
pQueryMsg
->
needReverseScan
;
pQuery
->
vgId
=
vgId
;
pQuery
->
colList
=
calloc
(
numOfCols
,
sizeof
(
SSingleColumnFilterInfo
));
if
(
pQuery
->
colList
==
NULL
)
{
SQuery
Attr
*
pQueryAttr
=
&
pQInfo
->
query
;
pQInfo
->
runtimeEnv
.
pQuery
Attr
=
pQueryAttr
;
pQuery
Attr
->
tableGroupInfo
=
*
pTableGroupInfo
;
pQuery
Attr
->
numOfCols
=
numOfCols
;
pQuery
Attr
->
numOfOutput
=
numOfOutput
;
pQuery
Attr
->
limit
.
limit
=
pQueryMsg
->
limit
;
pQuery
Attr
->
limit
.
offset
=
pQueryMsg
->
offset
;
pQuery
Attr
->
order
.
order
=
pQueryMsg
->
order
;
pQuery
Attr
->
order
.
orderColId
=
pQueryMsg
->
orderColId
;
pQuery
Attr
->
pExpr1
=
pExprs
;
pQuery
Attr
->
pExpr2
=
pSecExprs
;
pQuery
Attr
->
numOfExpr2
=
pQueryMsg
->
secondStageOutput
;
pQuery
Attr
->
pGroupbyExpr
=
pGroupbyExpr
;
memcpy
(
&
pQuery
Attr
->
interval
,
&
pQueryMsg
->
interval
,
sizeof
(
pQueryAttr
->
interval
));
pQuery
Attr
->
fillType
=
pQueryMsg
->
fillType
;
pQuery
Attr
->
numOfTags
=
pQueryMsg
->
numOfTags
;
pQuery
Attr
->
tagColList
=
pTagCols
;
pQuery
Attr
->
prjInfo
.
vgroupLimit
=
pQueryMsg
->
vgroupLimit
;
pQuery
Attr
->
prjInfo
.
ts
=
(
pQueryMsg
->
order
==
TSDB_ORDER_ASC
)
?
INT64_MIN
:
INT64_MAX
;
pQuery
Attr
->
sw
=
pQueryMsg
->
sw
;
pQuery
Attr
->
stableQuery
=
pQueryMsg
->
stableQuery
;
pQuery
Attr
->
topBotQuery
=
pQueryMsg
->
topBotQuery
;
pQuery
Attr
->
groupbyColumn
=
pQueryMsg
->
groupbyColumn
;
pQuery
Attr
->
hasTagResults
=
pQueryMsg
->
hasTagResults
;
pQuery
Attr
->
timeWindowInterpo
=
pQueryMsg
->
timeWindowInterpo
;
pQuery
Attr
->
queryBlockDist
=
pQueryMsg
->
queryBlockDist
;
pQuery
Attr
->
stabledev
=
pQueryMsg
->
stabledev
;
pQuery
Attr
->
tsCompQuery
=
pQueryMsg
->
tsCompQuery
;
pQuery
Attr
->
simpleAgg
=
pQueryMsg
->
simpleAgg
;
pQuery
Attr
->
pointInterpQuery
=
pQueryMsg
->
pointInterpQuery
;
pQuery
Attr
->
needReverseScan
=
pQueryMsg
->
needReverseScan
;
pQuery
Attr
->
vgId
=
vgId
;
pQuery
Attr
->
colList
=
calloc
(
numOfCols
,
sizeof
(
SSingleColumnFilterInfo
));
if
(
pQuery
Attr
->
colList
==
NULL
)
{
goto
_cleanup
;
}
pQuery
->
srcRowSize
=
0
;
pQuery
->
maxTableColumnWidth
=
0
;
pQuery
Attr
->
srcRowSize
=
0
;
pQuery
Attr
->
maxTableColumnWidth
=
0
;
for
(
int16_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
pQuery
->
colList
[
i
]
=
pQueryMsg
->
colList
[
i
];
pQuery
->
colList
[
i
].
filterInfo
=
tFilterInfoDup
(
pQueryMsg
->
colList
[
i
].
filterInfo
,
pQuery
->
colList
[
i
].
numOfFilters
);
pQuery
Attr
->
colList
[
i
]
=
pQueryMsg
->
colList
[
i
];
pQuery
Attr
->
colList
[
i
].
filterInfo
=
tFilterInfoDup
(
pQueryMsg
->
colList
[
i
].
filterInfo
,
pQueryAttr
->
colList
[
i
].
numOfFilters
);
pQuery
->
srcRowSize
+=
pQuery
->
colList
[
i
].
bytes
;
if
(
pQuery
->
maxTableColumnWidth
<
pQuery
->
colList
[
i
].
bytes
)
{
pQuery
->
maxTableColumnWidth
=
pQuery
->
colList
[
i
].
bytes
;
pQuery
Attr
->
srcRowSize
+=
pQueryAttr
->
colList
[
i
].
bytes
;
if
(
pQuery
Attr
->
maxTableColumnWidth
<
pQueryAttr
->
colList
[
i
].
bytes
)
{
pQuery
Attr
->
maxTableColumnWidth
=
pQueryAttr
->
colList
[
i
].
bytes
;
}
}
// calculate the result row size
for
(
int16_t
col
=
0
;
col
<
numOfOutput
;
++
col
)
{
assert
(
pExprs
[
col
].
base
.
resBytes
>
0
);
pQuery
->
resultRowSize
+=
pExprs
[
col
].
base
.
resBytes
;
pQuery
Attr
->
resultRowSize
+=
pExprs
[
col
].
base
.
resBytes
;
// keep the tag length
if
(
TSDB_COL_IS_TAG
(
pExprs
[
col
].
base
.
colInfo
.
flag
))
{
pQuery
->
tagLen
+=
pExprs
[
col
].
base
.
resBytes
;
pQuery
Attr
->
tagLen
+=
pExprs
[
col
].
base
.
resBytes
;
}
}
doUpdateExprColumnIndex
(
pQuery
);
int32_t
ret
=
createFilterInfo
(
pQInfo
,
pQuery
);
doUpdateExprColumnIndex
(
pQuery
Attr
);
int32_t
ret
=
createFilterInfo
(
pQInfo
,
pQuery
Attr
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
goto
_cleanup
;
}
if
(
pQuery
->
fillType
!=
TSDB_FILL_NONE
)
{
pQuery
->
fillVal
=
malloc
(
sizeof
(
int64_t
)
*
pQuery
->
numOfOutput
);
if
(
pQuery
->
fillVal
==
NULL
)
{
if
(
pQuery
Attr
->
fillType
!=
TSDB_FILL_NONE
)
{
pQuery
Attr
->
fillVal
=
malloc
(
sizeof
(
int64_t
)
*
pQueryAttr
->
numOfOutput
);
if
(
pQuery
Attr
->
fillVal
==
NULL
)
{
goto
_cleanup
;
}
// the first column is the timestamp
memcpy
(
pQuery
->
fillVal
,
(
char
*
)
pQueryMsg
->
fillVal
,
pQuery
->
numOfOutput
*
sizeof
(
int64_t
));
memcpy
(
pQuery
Attr
->
fillVal
,
(
char
*
)
pQueryMsg
->
fillVal
,
pQueryAttr
->
numOfOutput
*
sizeof
(
int64_t
));
}
size_t
numOfGroups
=
0
;
...
...
@@ -6214,15 +6214,15 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SSqlGroupbyExpr* pGroupbyExpr
pthread_mutex_init
(
&
pQInfo
->
lock
,
NULL
);
tsem_init
(
&
pQInfo
->
ready
,
0
,
0
);
pQuery
->
window
=
pQueryMsg
->
window
;
changeExecuteScanOrder
(
pQInfo
,
pQueryMsg
,
pQuery
->
stableQuery
);
pQuery
Attr
->
window
=
pQueryMsg
->
window
;
changeExecuteScanOrder
(
pQInfo
,
pQueryMsg
,
pQuery
Attr
->
stableQuery
);
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
STimeWindow
window
=
pQuery
->
window
;
STimeWindow
window
=
pQuery
Attr
->
window
;
int32_t
index
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfGroups
;
++
i
)
{
SArray
*
pa
=
taosArrayGetP
(
pQuery
->
tableGroupInfo
.
pGroupList
,
i
);
SArray
*
pa
=
taosArrayGetP
(
pQuery
Attr
->
tableGroupInfo
.
pGroupList
,
i
);
size_t
s
=
taosArrayGetSize
(
pa
);
SArray
*
p1
=
taosArrayInit
(
s
,
POINTER_BYTES
);
...
...
@@ -6237,7 +6237,7 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SSqlGroupbyExpr* pGroupbyExpr
window
.
skey
=
info
->
lastKey
;
void
*
buf
=
(
char
*
)
pQInfo
->
pBuf
+
index
*
sizeof
(
STableQueryInfo
);
STableQueryInfo
*
item
=
createTableQueryInfo
(
pQuery
,
info
->
pTable
,
pQuery
->
groupbyColumn
,
window
,
buf
);
STableQueryInfo
*
item
=
createTableQueryInfo
(
pQuery
Attr
,
info
->
pTable
,
pQueryAttr
->
groupbyColumn
,
window
,
buf
);
if
(
item
==
NULL
)
{
goto
_cleanup
;
}
...
...
@@ -6251,7 +6251,7 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SSqlGroupbyExpr* pGroupbyExpr
}
}
colIdCheck
(
pQuery
,
pQInfo
);
colIdCheck
(
pQuery
Attr
,
pQInfo
);
pQInfo
->
qId
=
atomic_add_fetch_64
(
&
queryHandleId
,
1
);
*
qId
=
pQInfo
->
qId
;
...
...
@@ -6300,13 +6300,13 @@ int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, SQInfo* pQInfo, SQueryPara
int32_t
code
=
TSDB_CODE_SUCCESS
;
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
STSBuf
*
pTsBuf
=
NULL
;
if
(
pTsBufInfo
->
tsLen
>
0
)
{
// open new file to save the result
char
*
tsBlock
=
start
+
pTsBufInfo
->
tsOffset
;
pTsBuf
=
tsBufCreateFromCompBlocks
(
tsBlock
,
pTsBufInfo
->
tsNumOfBlocks
,
pTsBufInfo
->
tsLen
,
pTsBufInfo
->
tsOrder
,
pQuery
->
vgId
);
pQuery
Attr
->
vgId
);
tsBufResetPos
(
pTsBuf
);
bool
ret
=
tsBufNextPos
(
pTsBuf
);
...
...
@@ -6319,13 +6319,13 @@ int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, SQInfo* pQInfo, SQueryPara
}
if
(
tsdb
!=
NULL
)
{
pQuery
->
precision
=
tsdbGetCfg
(
tsdb
)
->
precision
;
pQuery
Attr
->
precision
=
tsdbGetCfg
(
tsdb
)
->
precision
;
}
if
((
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
(
pQuery
->
window
.
skey
>
pQuery
->
window
.
ekey
))
||
(
!
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
(
pQuery
->
window
.
ekey
>
pQuery
->
window
.
skey
)))
{
qDebug
(
"QInfo:%p no result in time range %"
PRId64
"-%"
PRId64
", order %d"
,
pQInfo
,
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
pQuery
->
order
.
order
);
if
((
QUERY_IS_ASC_QUERY
(
pQuery
Attr
)
&&
(
pQueryAttr
->
window
.
skey
>
pQueryAttr
->
window
.
ekey
))
||
(
!
QUERY_IS_ASC_QUERY
(
pQuery
Attr
)
&&
(
pQueryAttr
->
window
.
ekey
>
pQueryAttr
->
window
.
skey
)))
{
qDebug
(
"QInfo:%p no result in time range %"
PRId64
"-%"
PRId64
", order %d"
,
pQInfo
,
pQuery
Attr
->
window
.
skey
,
pQuery
Attr
->
window
.
ekey
,
pQueryAttr
->
order
.
order
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
=
0
;
// todo free memory
...
...
@@ -6416,36 +6416,36 @@ void freeQInfo(SQInfo *pQInfo) {
releaseQueryBuf
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
);
teardownQueryRuntimeEnv
(
&
pQInfo
->
runtimeEnv
);
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
if
(
pQuery
!=
NULL
)
{
if
(
pQuery
->
fillVal
!=
NULL
)
{
tfree
(
pQuery
->
fillVal
);
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
if
(
pQuery
Attr
!=
NULL
)
{
if
(
pQuery
Attr
->
fillVal
!=
NULL
)
{
tfree
(
pQuery
Attr
->
fillVal
);
}
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfFilterCols
;
++
i
)
{
SSingleColumnFilterInfo
*
pColFilter
=
&
pQuery
->
pFilterInfo
[
i
];
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfFilterCols
;
++
i
)
{
SSingleColumnFilterInfo
*
pColFilter
=
&
pQuery
Attr
->
pFilterInfo
[
i
];
if
(
pColFilter
->
numOfFilters
>
0
)
{
tfree
(
pColFilter
->
pFilters
);
}
}
pQuery
->
pExpr1
=
destroyQueryFuncExpr
(
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
pQuery
->
pExpr2
=
destroyQueryFuncExpr
(
pQuery
->
pExpr2
,
pQuery
->
numOfExpr2
);
pQuery
Attr
->
pExpr1
=
destroyQueryFuncExpr
(
pQueryAttr
->
pExpr1
,
pQueryAttr
->
numOfOutput
);
pQuery
Attr
->
pExpr2
=
destroyQueryFuncExpr
(
pQueryAttr
->
pExpr2
,
pQueryAttr
->
numOfExpr2
);
tfree
(
pQuery
->
tagColList
);
tfree
(
pQuery
->
pFilterInfo
);
tfree
(
pQuery
Attr
->
tagColList
);
tfree
(
pQuery
Attr
->
pFilterInfo
);
if
(
pQuery
->
colList
!=
NULL
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfCols
;
i
++
)
{
SColumnInfo
*
column
=
pQuery
->
colList
+
i
;
if
(
pQuery
Attr
->
colList
!=
NULL
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfCols
;
i
++
)
{
SColumnInfo
*
column
=
pQuery
Attr
->
colList
+
i
;
freeColumnFilterInfo
(
column
->
filterInfo
,
column
->
numOfFilters
);
}
tfree
(
pQuery
->
colList
);
tfree
(
pQuery
Attr
->
colList
);
}
if
(
pQuery
->
pGroupbyExpr
!=
NULL
)
{
taosArrayDestroy
(
pQuery
->
pGroupbyExpr
->
columnInfo
);
tfree
(
pQuery
->
pGroupbyExpr
);
if
(
pQuery
Attr
->
pGroupbyExpr
!=
NULL
)
{
taosArrayDestroy
(
pQuery
Attr
->
pGroupbyExpr
->
columnInfo
);
tfree
(
pQuery
Attr
->
pGroupbyExpr
);
}
}
...
...
@@ -6454,7 +6454,7 @@ void freeQInfo(SQInfo *pQInfo) {
tfree
(
pQInfo
->
pBuf
);
tfree
(
pQInfo
->
sql
);
tsdbDestroyTableGroup
(
&
pQuery
->
tableGroupInfo
);
tsdbDestroyTableGroup
(
&
pQuery
Attr
->
tableGroupInfo
);
taosArrayDestroy
(
pRuntimeEnv
->
groupResInfo
.
pRows
);
pQInfo
->
signature
=
0
;
...
...
@@ -6467,10 +6467,10 @@ void freeQInfo(SQInfo *pQInfo) {
int32_t
doDumpQueryResult
(
SQInfo
*
pQInfo
,
char
*
data
)
{
// the remained number of retrieved rows, not the interpolated result
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
// load data from file to msg buffer
if
(
pQuery
->
tsCompQuery
)
{
if
(
pQuery
Attr
->
tsCompQuery
)
{
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pRuntimeEnv
->
outputBuf
->
pDataBlock
,
0
);
FILE
*
f
=
*
(
FILE
**
)
pColInfoData
->
pData
;
// TODO refactor
...
...
@@ -6513,8 +6513,8 @@ int32_t doDumpQueryResult(SQInfo *pQInfo, char *data) {
qDebug
(
"QInfo:%p current numOfRes rows:%d, total:%"
PRId64
,
pQInfo
,
pRuntimeEnv
->
outputBuf
->
info
.
rows
,
pRuntimeEnv
->
resultInfo
.
total
);
if
(
pQuery
->
limit
.
limit
>
0
&&
pQuery
->
limit
.
limit
==
pRuntimeEnv
->
resultInfo
.
total
)
{
qDebug
(
"QInfo:%p results limitation reached, limitation:%"
PRId64
,
pQInfo
,
pQuery
->
limit
.
limit
);
if
(
pQuery
Attr
->
limit
.
limit
>
0
&&
pQueryAttr
->
limit
.
limit
==
pRuntimeEnv
->
resultInfo
.
total
)
{
qDebug
(
"QInfo:%p results limitation reached, limitation:%"
PRId64
,
pQInfo
,
pQuery
Attr
->
limit
.
limit
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_OVER
);
}
...
...
src/query/src/qPlan.c
浏览文件 @
cdd7eed7
...
...
@@ -36,17 +36,17 @@ SQueryNode* queryPlanFromString() {
return
NULL
;
}
SArray
*
createTableScanPlan
(
SQuery
*
pQuery
)
{
SArray
*
createTableScanPlan
(
SQuery
Attr
*
pQueryAttr
)
{
SArray
*
plan
=
taosArrayInit
(
4
,
sizeof
(
int32_t
));
int32_t
op
=
0
;
if
(
onlyQueryTags
(
pQuery
))
{
if
(
onlyQueryTags
(
pQuery
Attr
))
{
// op = OP_TagScan;
}
else
if
(
pQuery
->
queryBlockDist
)
{
}
else
if
(
pQuery
Attr
->
queryBlockDist
)
{
op
=
OP_TableBlockInfoScan
;
}
else
if
(
pQuery
->
tsCompQuery
||
pQuery
->
pointInterpQuery
)
{
}
else
if
(
pQuery
Attr
->
tsCompQuery
||
pQueryAttr
->
pointInterpQuery
)
{
op
=
OP_TableSeqScan
;
}
else
if
(
pQuery
->
needReverseScan
)
{
}
else
if
(
pQuery
Attr
->
needReverseScan
)
{
op
=
OP_DataBlocksOptScan
;
}
else
{
op
=
OP_TableScan
;
...
...
@@ -56,50 +56,50 @@ SArray* createTableScanPlan(SQuery* pQuery) {
return
plan
;
}
SArray
*
createExecOperatorPlan
(
SQuery
*
pQuery
)
{
SArray
*
createExecOperatorPlan
(
SQuery
Attr
*
pQueryAttr
)
{
SArray
*
plan
=
taosArrayInit
(
4
,
sizeof
(
int32_t
));
int32_t
op
=
0
;
if
(
onlyQueryTags
(
pQuery
))
{
// do nothing for tags query
if
(
onlyQueryTags
(
pQuery
Attr
))
{
// do nothing for tags query
op
=
OP_TagScan
;
taosArrayPush
(
plan
,
&
op
);
}
else
if
(
pQuery
->
interval
.
interval
>
0
)
{
if
(
pQuery
->
stableQuery
)
{
}
else
if
(
pQuery
Attr
->
interval
.
interval
>
0
)
{
if
(
pQuery
Attr
->
stableQuery
)
{
op
=
OP_MultiTableTimeInterval
;
taosArrayPush
(
plan
,
&
op
);
}
else
{
op
=
OP_TimeWindow
;
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
)
{
if
(
pQuery
Attr
->
pExpr2
!=
NULL
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
if
(
pQuery
->
fillType
!=
TSDB_FILL_NONE
&&
(
!
pQuery
->
pointInterpQuery
))
{
if
(
pQuery
Attr
->
fillType
!=
TSDB_FILL_NONE
&&
(
!
pQueryAttr
->
pointInterpQuery
))
{
op
=
OP_Fill
;
taosArrayPush
(
plan
,
&
op
);
}
}
}
else
if
(
pQuery
->
groupbyColumn
)
{
}
else
if
(
pQuery
Attr
->
groupbyColumn
)
{
op
=
OP_Groupby
;
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
)
{
if
(
pQuery
Attr
->
pExpr2
!=
NULL
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
}
else
if
(
pQuery
->
sw
.
gap
>
0
)
{
}
else
if
(
pQuery
Attr
->
sw
.
gap
>
0
)
{
op
=
OP_SessionWindow
;
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
)
{
if
(
pQuery
Attr
->
pExpr2
!=
NULL
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
}
else
if
(
pQuery
->
simpleAgg
)
{
if
(
pQuery
->
stableQuery
&&
!
pQuery
->
tsCompQuery
)
{
}
else
if
(
pQuery
Attr
->
simpleAgg
)
{
if
(
pQuery
Attr
->
stableQuery
&&
!
pQueryAttr
->
tsCompQuery
)
{
op
=
OP_MultiTableAggregate
;
}
else
{
op
=
OP_Aggregate
;
...
...
@@ -107,7 +107,7 @@ SArray* createExecOperatorPlan(SQuery* pQuery) {
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
&&
!
pQuery
->
stableQuery
)
{
if
(
pQuery
Attr
->
pExpr2
!=
NULL
&&
!
pQueryAttr
->
stableQuery
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
...
...
@@ -116,12 +116,12 @@ SArray* createExecOperatorPlan(SQuery* pQuery) {
taosArrayPush
(
plan
,
&
op
);
}
if
(
pQuery
->
limit
.
offset
>
0
)
{
if
(
pQuery
Attr
->
limit
.
offset
>
0
)
{
op
=
OP_Offset
;
taosArrayPush
(
plan
,
&
op
);
}
if
(
pQuery
->
limit
.
limit
>
0
)
{
if
(
pQuery
Attr
->
limit
.
limit
>
0
)
{
op
=
OP_Limit
;
taosArrayPush
(
plan
,
&
op
);
}
...
...
src/query/src/qUtil.c
浏览文件 @
cdd7eed7
...
...
@@ -30,11 +30,11 @@ typedef struct SCompSupporter {
int32_t
order
;
}
SCompSupporter
;
int32_t
getOutputInterResultBufSize
(
SQuery
*
pQuery
)
{
int32_t
getOutputInterResultBufSize
(
SQuery
Attr
*
pQueryAttr
)
{
int32_t
size
=
0
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
size
+=
pQuery
->
pExpr1
[
i
].
base
.
interBytes
;
for
(
int32_t
i
=
0
;
i
<
pQuery
Attr
->
numOfOutput
;
++
i
)
{
size
+=
pQuery
Attr
->
pExpr1
[
i
].
base
.
interBytes
;
}
assert
(
size
>=
0
);
...
...
@@ -136,11 +136,11 @@ void clearResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResultRow, int16
tFilePage
*
page
=
getResBufPage
(
pRuntimeEnv
->
pResultBuf
,
pResultRow
->
pageId
);
int16_t
offset
=
0
;
for
(
int32_t
i
=
0
;
i
<
pRuntimeEnv
->
pQuery
->
numOfOutput
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pRuntimeEnv
->
pQuery
Attr
->
numOfOutput
;
++
i
)
{
SResultRowCellInfo
*
pResultInfo
=
&
pResultRow
->
pCellInfo
[
i
];
int16_t
size
=
pRuntimeEnv
->
pQuery
->
pExpr1
[
i
].
base
.
resType
;
char
*
s
=
getPosInResultPage
(
pRuntimeEnv
->
pQuery
,
page
,
pResultRow
->
offset
,
offset
);
int16_t
size
=
pRuntimeEnv
->
pQuery
Attr
->
pExpr1
[
i
].
base
.
resType
;
char
*
s
=
getPosInResultPage
(
pRuntimeEnv
->
pQuery
Attr
,
page
,
pResultRow
->
offset
,
offset
);
memset
(
s
,
0
,
size
);
offset
+=
size
;
...
...
@@ -167,8 +167,8 @@ SResultRowCellInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t
}
size_t
getResultRowSize
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
return
(
pQuery
->
numOfOutput
*
sizeof
(
SResultRowCellInfo
))
+
pQuery
->
interBufSize
+
sizeof
(
SResultRow
);
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
return
(
pQuery
Attr
->
numOfOutput
*
sizeof
(
SResultRowCellInfo
))
+
pQueryAttr
->
interBufSize
+
sizeof
(
SResultRow
);
}
SResultRowPool
*
initResultRowPool
(
size_t
size
)
{
...
...
@@ -385,10 +385,10 @@ int32_t getNumOfTotalRes(SGroupResInfo* pGroupResInfo) {
}
static
int64_t
getNumOfResultWindowRes
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pResultRow
,
int32_t
*
rowCellInfoOffset
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
for
(
int32_t
j
=
0
;
j
<
pQuery
->
numOfOutput
;
++
j
)
{
int32_t
functionId
=
pQuery
->
pExpr1
[
j
].
base
.
functionId
;
for
(
int32_t
j
=
0
;
j
<
pQuery
Attr
->
numOfOutput
;
++
j
)
{
int32_t
functionId
=
pQuery
Attr
->
pExpr1
[
j
].
base
.
functionId
;
/*
* ts, tag, tagprj function can not decide the output number of current query
...
...
@@ -451,7 +451,7 @@ static int32_t tableResultComparFn(const void *pLeft, const void *pRight, void *
static
int32_t
mergeIntoGroupResultImpl
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupResInfo
*
pGroupResInfo
,
SArray
*
pTableList
,
int32_t
*
rowCellInfoOffset
)
{
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pRuntimeEnv
->
pQuery
);
bool
ascQuery
=
QUERY_IS_ASC_QUERY
(
pRuntimeEnv
->
pQuery
Attr
);
int32_t
code
=
TSDB_CODE_SUCCESS
;
...
...
@@ -487,7 +487,7 @@ static int32_t mergeIntoGroupResultImpl(SQueryRuntimeEnv *pRuntimeEnv, SGroupRes
goto
_end
;
}
SCompSupporter
cs
=
{
pTableQueryInfoList
,
posList
,
pRuntimeEnv
->
pQuery
->
order
.
order
};
SCompSupporter
cs
=
{
pTableQueryInfoList
,
posList
,
pRuntimeEnv
->
pQuery
Attr
->
order
.
order
};
int32_t
ret
=
tLoserTreeCreate
(
&
pTree
,
numOfTables
,
&
cs
,
tableResultComparFn
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
...
...
src/query/src/queryMain.c
浏览文件 @
cdd7eed7
...
...
@@ -273,14 +273,14 @@ int32_t qRetrieveQueryResultInfo(qinfo_t qinfo, bool* buildRes, void* pRspContex
code
=
pQInfo
->
code
;
}
else
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
pthread_mutex_lock
(
&
pQInfo
->
lock
);
assert
(
pQInfo
->
rspContext
==
NULL
);
if
(
pQInfo
->
dataReady
==
QUERY_RESULT_READY
)
{
*
buildRes
=
true
;
qDebug
(
"QInfo:%p retrieve result info, rowsize:%d, rows:%d, code:%s"
,
pQInfo
,
pQuery
->
resultRowSize
,
qDebug
(
"QInfo:%p retrieve result info, rowsize:%d, rows:%d, code:%s"
,
pQInfo
,
pQuery
Attr
->
resultRowSize
,
GET_NUM_OF_RESULTS
(
pRuntimeEnv
),
tstrerror
(
pQInfo
->
code
));
}
else
{
*
buildRes
=
false
;
...
...
@@ -303,11 +303,11 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
}
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
SQuery
Attr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
int32_t
s
=
GET_NUM_OF_RESULTS
(
pRuntimeEnv
);
size_t
size
=
pQuery
->
resultRowSize
*
s
;
size_t
size
=
pQuery
Attr
->
resultRowSize
*
s
;
size
+=
sizeof
(
int32_t
);
size
+=
sizeof
(
STableIdInfo
)
*
taosHashGetSize
(
pRuntimeEnv
->
pTableRetrieveTsMap
);
...
...
@@ -329,7 +329,7 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
(
*
pRsp
)
->
useconds
=
htobe64
(
pQInfo
->
summary
.
elapsedTime
);
}
(
*
pRsp
)
->
precision
=
htons
(
pQuery
->
precision
);
(
*
pRsp
)
->
precision
=
htons
(
pQuery
Attr
->
precision
);
if
(
GET_NUM_OF_RESULTS
(
&
(
pQInfo
->
runtimeEnv
))
>
0
&&
pQInfo
->
code
==
TSDB_CODE_SUCCESS
)
{
doDumpQueryResult
(
pQInfo
,
(
*
pRsp
)
->
data
);
}
else
{
...
...
src/tsdb/src/tsdbRead.c
浏览文件 @
cdd7eed7
...
...
@@ -123,7 +123,7 @@ typedef struct STsdbQueryHandle {
SMemRef
*
pMemRef
;
SArray
*
defaultLoadColumn
;
// default load column
SDataBlockLoadInfo
dataBlockLoadInfo
;
/* record current block load information */
SLoadCompBlockInfo
compBlockLoadInfo
;
/* record current compblock information in SQuery */
SLoadCompBlockInfo
compBlockLoadInfo
;
/* record current compblock information in SQuery
Attr
*/
SArray
*
prev
;
// previous row which is before than time window
SArray
*
next
;
// next row which is after the query time window
...
...
tests/script/general/parser/testSuite.sim
浏览文件 @
cdd7eed7
run general/parser/alter.sim
run general/parser/alter1.sim
run general/parser/alter_stable.sim
run general/parser/auto_create_tb.sim
run general/parser/auto_create_tb_drop_tb.sim
run general/parser/col_arithmetic_operation.sim
run general/parser/columnValue.sim
run general/parser/commit.sim
run general/parser/create_db.sim
run general/parser/create_mt.sim
run general/parser/create_tb.sim
run general/parser/dbtbnameValidate.sim
run general/parser/fill.sim
run general/parser/fill_stb.sim
#run general/parser/fill_us.sim #
run general/parser/first_last.sim
run general/parser/import_commit1.sim
run general/parser/import_commit2.sim
run general/parser/import_commit3.sim
#run general/parser/import_file.sim
run general/parser/insert_tb.sim
run general/parser/tags_dynamically_specifiy.sim
run general/parser/interp.sim
run general/parser/lastrow.sim
run general/parser/limit.sim
run general/parser/limit1.sim
run general/parser/limit1_tblocks100.sim
run general/parser/limit2.sim
run general/parser/mixed_blocks.sim
run general/parser/nchar.sim
run general/parser/null_char.sim
run general/parser/selectResNum.sim
run general/parser/select_across_vnodes.sim
run general/parser/select_from_cache_disk.sim
run general/parser/set_tag_vals.sim
run general/parser/single_row_in_tb.sim
run general/parser/slimit.sim
run general/parser/slimit1.sim
run general/parser/slimit_alter_tags.sim
run general/parser/tbnameIn.sim
run general/parser/slimit_alter_tags.sim # persistent failed
run general/parser/join.sim
run general/parser/join_multivnode.sim
run general/parser/join_manyblocks.sim
#
run general/parser/alter.sim
#
run general/parser/alter1.sim
#
run general/parser/alter_stable.sim
#
run general/parser/auto_create_tb.sim
#
run general/parser/auto_create_tb_drop_tb.sim
#
run general/parser/col_arithmetic_operation.sim
#
run general/parser/columnValue.sim
#
run general/parser/commit.sim
#
run general/parser/create_db.sim
#
run general/parser/create_mt.sim
#
run general/parser/create_tb.sim
#
run general/parser/dbtbnameValidate.sim
#
run general/parser/fill.sim
#
run general/parser/fill_stb.sim
#
#
run general/parser/fill_us.sim #
#
run general/parser/first_last.sim
#
run general/parser/import_commit1.sim
#
run general/parser/import_commit2.sim
#
run general/parser/import_commit3.sim
#
#
run general/parser/import_file.sim
#
run general/parser/insert_tb.sim
#
run general/parser/tags_dynamically_specifiy.sim
#
run general/parser/interp.sim
#
run general/parser/lastrow.sim
#
run general/parser/limit.sim
#
run general/parser/limit1.sim
#
run general/parser/limit1_tblocks100.sim
#
run general/parser/limit2.sim
#
run general/parser/mixed_blocks.sim
#
run general/parser/nchar.sim
#
run general/parser/null_char.sim
#
run general/parser/selectResNum.sim
#
run general/parser/select_across_vnodes.sim
#
run general/parser/select_from_cache_disk.sim
#
run general/parser/set_tag_vals.sim
#
run general/parser/single_row_in_tb.sim
#
run general/parser/slimit.sim
#
run general/parser/slimit1.sim
#
run general/parser/slimit_alter_tags.sim
#
run general/parser/tbnameIn.sim
#
run general/parser/slimit_alter_tags.sim # persistent failed
#
run general/parser/join.sim
#
run general/parser/join_multivnode.sim
#
run general/parser/join_manyblocks.sim
run general/parser/projection_limit_offset.sim
run general/parser/select_with_tags.sim
run general/parser/groupby.sim
#
run general/parser/groupby.sim
run general/parser/tags_filter.sim
run general/parser/topbot.sim
run general/parser/union.sim
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录