Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
47a983fb
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
47a983fb
编写于
4年前
作者:
H
hjxilinx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-98] fix bugs in reversed single table query
上级
119549c4
Branches不可用
ver
ver-3.1.0.2
ver-3.1.0.1
ver-3.1.0.0
ver-3.0.7.8
ver-3.0.7.1
ver-3.0.7.0
ver-3.0.6.1
ver-3.0.6.0
ver-3.0.5.1
ver-3.0.5.0
ver-3.0.4.2
ver-3.0.4.1
ver-3.0.4.0
ver-3.0.3.2
ver-3.0.3.1
ver-3.0.3.0
ver-3.0.2.220221228
ver-3.0.2.20221226
ver-3.0.2.20105
ver-3.0.2.6
ver-3.0.2.5
ver-3.0.2.4
ver-3.0.2.3
ver-3.0.2.2
ver-3.0.2.1
ver-3.0.2.0
ver-3.0.1.8
ver-3.0.1.7
ver-3.0.1.6
ver-3.0.1.5
ver-3.0.1.4
ver-3.0.1.3
ver-3.0.1.2
ver-3.0.1.1
ver-3.0.1.0
ver-3.0.0.2
ver-3.0.0.1
ver-3.0.0.0
ver-2.6.0.99
ver-2.6.0.63
ver-2.6.0.61
ver-2.6.0.59
ver-2.6.0.57
ver-2.6.0.55
ver-2.6.0.53
ver-2.6.0.51
ver-2.6.0.49
ver-2.6.0.47
ver-2.6.0.45
ver-2.6.0.44
ver-2.6.0.43
ver-2.6.0.41
ver-2.6.0.39
ver-2.6.0.38
ver-2.6.0.36
ver-2.6.0.35
ver-2.6.0.34
ver-2.6.0.33
ver-2.6.0.32
ver-2.6.0.31
ver-2.6.0.30
ver-2.6.0.28
ver-2.6.0.27
ver-2.6.0.25
ver-2.6.0.24
ver-2.6.0.22
ver-2.6.0.21
ver-2.6.0.19
ver-2.6.0.18
ver-2.6.0.17
ver-2.6.0.16
ver-2.6.0.15
ver-2.6.0.14
ver-2.6.0.12
ver-2.6.0.10
ver-2.6.0.8
ver-2.6.0.7
ver-2.6.0.6
ver-2.6.0.4
ver-2.6.0.3-kh
ver-2.6.0.1
ver-2.6.0.0
ver-2.5.0.1
ver-2.5.0.0
ver-2.4.0.43
ver-2.4.0.41
ver-2.4.0.39
ver-2.4.0.38
ver-2.4.0.37
ver-2.4.0.36
ver-2.4.0.35
ver-2.4.0.33
ver-2.4.0.31
ver-2.4.0.30
ver-2.4.0.27
ver-2.4.0.26
ver-2.4.0.25
ver-2.4.0.24
ver-2.4.0.20
ver-2.4.0.18
ver-2.4.0.16
ver-2.4.0.14
ver-2.4.0.12
ver-2.4.0.11
ver-2.4.0.10
ver-2.4.0.9
ver-2.4.0.8
ver-2.4.0.7
ver-2.4.0.6
ver-2.4.0.5
ver-2.4.0.4
ver-2.4.0.3
ver-2.4.0.2
ver-2.4.0.1
ver-2.4.0.0
ver-2.3.6.0
ver-2.3.5.0
ver-2.3.4.0
ver-2.3.3.0
ver-2.3.2.2
ver-2.3.2.1
ver-2.3.2.0
ver-2.3.1.0
ver-2.3.0.0
ver-2.2.2.16
ver-2.2.2.15
ver-2.2.2.14
ver-2.2.2.13
ver-2.2.2.12
ver-2.2.2.11
ver-2.2.2.10
ver-2.2.2.9
ver-2.2.2.8
ver-2.2.2.7
ver-2.2.2.6
ver-2.2.2.5
ver-2.2.2.4
ver-2.2.2.3
ver-2.2.2.1
ver-2.2.2.1-ningsi
ver-2.2.2.0
ver-2.2.1.6
ver-2.2.1.5
ver-2.2.1.4
ver-2.2.1.3
ver-2.2.1.2
ver-2.2.1.1
ver-2.2.1.0
ver-2.2.0.1001
ver-2.2.0.7
ver-2.2.0.6
ver-2.2.0.5
ver-2.2.0.4
ver-2.2.0.3
ver-2.2.0.2
ver-2.2.0.1
ver-2.2.0.0
ver-2.1.7.7
ver-2.1.7.6
ver-2.1.7.2
ver-2.1.7.1
ver-2.1.6.0
ver-2.1.5.0
ver-2.1.4.1
ver-2.1.3.2
ver-2.1.3.0
ver-2.1.2.0
ver-2.1.1.0
ver-2.1.0.1
ver-2.1.0.0
ver-2.1.0
ver-2.0.22.3
ver-2.0.22.2
ver-2.0.22.1
ver-2.0.22.0
ver-2.0.21.6
ver-2.0.21.5
ver-2.0.21.4
ver-2.0.21.3
ver-2.0.21.2
ver-2.0.21.1
ver-2.0.21.0
ver-2.0.20.20
ver-2.0.20.19
ver-2.0.20.18
ver-2.0.20.16
ver-2.0.20.13
ver-2.0.20.12
ver-2.0.20.11
ver-2.0.20.10
ver-2.0.20.9
ver-2.0.20.4
ver-2.0.20.3
ver-2.0.20.2
ver-2.0.20.0
ver-2.0.19.1
ver-2.0.19.0
ver-2.0.18.2
ver-2.0.18.0
ver-2.0.17.4
ver-2.0.17.0
ver-2.0.16.0
ver-2.0.15.0
ver-2.0.14.0
ver-2.0.13.0
ver-2.0.12.0
ver-2.0.11.0
ver-2.0.10.0
ver-2.0.9.0
ver-2.0.8.2
ver-2.0.8.0
ver-2.0.7.0
ver-2.0.6.0
ver-2.0.5.2
ver-2.0.5.0
ver-2.0.4.0
ver-2.0.3.2
ver-2.0.3.1
ver-2.0.3.0
ver-2.0.2.2
ver-2.0.2.2-beta
ver-2.0.2.1
ver-2.0.2.0
ver-2.0.1.9
ver-2.0.1.1
ver-2.0.1.1-ningsi
ver-2.0.1.0
ver-2.0.0.4
ver-2.0.0.3
ver-2.0.0.2
ver-2.0.0.1
ver-2.0.0.0
tq-1.0.0.1
release/ver-2.1.2.0
mac-enter-test
autoaddcol_07161651
autoaddcol_07161108
autoaddcol_07150626
autoaddcol_0720_1434
autoaddcol_0719_1122
autoaddcol_0718_2208
TDB-ver0.8
TDB-ver-0.7
无相关合并请求
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
121 addition
and
89 deletion
+121
-89
src/query/inc/queryExecutor.h
src/query/inc/queryExecutor.h
+2
-2
src/query/src/queryExecutor.c
src/query/src/queryExecutor.c
+119
-87
未找到文件。
src/query/inc/queryExecutor.h
浏览文件 @
47a983fb
...
...
@@ -170,11 +170,11 @@ typedef struct SQInfo {
int32_t
pointsInterpo
;
int32_t
code
;
// error code to returned to client
sem_t
dataReady
;
STableGroupInfo
groupInfo
;
// table id list
void
*
tsdb
;
STableGroupInfo
groupInfo
;
// table id list
SQueryRuntimeEnv
runtimeEnv
;
int32_t
subgroupId
x
;
int32_t
groupInde
x
;
int32_t
offset
;
/* offset in group result set of subgroup */
T_REF_DECLARE
()
...
...
This diff is collapsed.
Click to expand it.
src/query/src/queryExecutor.c
浏览文件 @
47a983fb
...
...
@@ -2900,14 +2900,14 @@ int32_t mergeIntoGroupResult(SQInfo *pQInfo) {
int32_t
numOfGroups
=
taosArrayGetSize
(
pQInfo
->
groupInfo
.
pGroupList
);
while
(
pQInfo
->
subgroupId
x
<
numOfGroups
)
{
SArray
*
group
=
taosArrayGetP
(
pQInfo
->
groupInfo
.
pGroupList
,
pQInfo
->
subgroupId
x
);
while
(
pQInfo
->
groupInde
x
<
numOfGroups
)
{
SArray
*
group
=
taosArrayGetP
(
pQInfo
->
groupInfo
.
pGroupList
,
pQInfo
->
groupInde
x
);
ret
=
mergeIntoGroupResultImpl
(
pQInfo
,
group
);
if
(
ret
<
0
)
{
// not enough disk space to save the data into disk
return
-
1
;
}
pQInfo
->
subgroupId
x
+=
1
;
pQInfo
->
groupInde
x
+=
1
;
// this group generates at least one result, return results
if
(
ret
>
0
)
{
...
...
@@ -2915,11 +2915,11 @@ int32_t mergeIntoGroupResult(SQInfo *pQInfo) {
}
assert
(
pQInfo
->
numOfGroupResultPages
==
0
);
dTrace
(
"QInfo:%p no result in group %d, continue"
,
pQInfo
,
pQInfo
->
subgroupId
x
-
1
);
dTrace
(
"QInfo:%p no result in group %d, continue"
,
pQInfo
,
pQInfo
->
groupInde
x
-
1
);
}
dTrace
(
"QInfo:%p merge res data into group, index:%d, total group:%d, elapsed time:%lldms"
,
pQInfo
,
pQInfo
->
subgroupId
x
-
1
,
numOfGroups
,
taosGetTimestampMs
()
-
st
);
pQInfo
,
pQInfo
->
groupInde
x
-
1
,
numOfGroups
,
taosGetTimestampMs
()
-
st
);
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -2934,7 +2934,7 @@ void copyResToQueryResultBuf(SQInfo *pQInfo, SQuery *pQuery) {
}
// set current query completed
// if (pQInfo->numOfGroupResultPages == 0 && pQInfo->
subgroupId
x == pQInfo->pSidSet->numOfSubSet) {
// if (pQInfo->numOfGroupResultPages == 0 && pQInfo->
groupInde
x == pQInfo->pSidSet->numOfSubSet) {
// pQInfo->tableIndex = pQInfo->pSidSet->numOfTables;
// return;
// }
...
...
@@ -2943,7 +2943,7 @@ void copyResToQueryResultBuf(SQInfo *pQInfo, SQuery *pQuery) {
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SDiskbasedResultBuf
*
pResultBuf
=
pRuntimeEnv
->
pResultBuf
;
int32_t
id
=
getGroupResultId
(
pQInfo
->
subgroupId
x
-
1
);
int32_t
id
=
getGroupResultId
(
pQInfo
->
groupInde
x
-
1
);
SIDList
list
=
getDataBufPagesIdList
(
pResultBuf
,
pQInfo
->
offset
+
id
);
int32_t
total
=
0
;
...
...
@@ -3149,7 +3149,7 @@ int32_t flushFromResultBuf(SQInfo *pQInfo) {
r
=
capacity
;
}
int32_t
id
=
getGroupResultId
(
pQInfo
->
subgroupId
x
)
+
pQInfo
->
numOfGroupResultPages
;
int32_t
id
=
getGroupResultId
(
pQInfo
->
groupInde
x
)
+
pQInfo
->
numOfGroupResultPages
;
tFilePage
*
buf
=
getNewDataBuf
(
pResultBuf
,
id
,
&
pageId
);
// pagewise copy to dest buffer
...
...
@@ -3198,8 +3198,8 @@ static void doDisableFunctsForSupplementaryScan(SQuery *pQuery, SWindowResInfo *
for
(
int32_t
j
=
0
;
j
<
pQuery
->
numOfOutputCols
;
++
j
)
{
int32_t
functId
=
pQuery
->
pSelectExpr
[
j
].
pBase
.
functionId
;
if
(((
functId
==
TSDB_FUNC_FIRST
||
functId
==
TSDB_FUNC_FIRST_DST
)
&&
order
==
TSDB_ORDER_
DE
SC
)
||
((
functId
==
TSDB_FUNC_LAST
||
functId
==
TSDB_FUNC_LAST_DST
)
&&
order
==
TSDB_ORDER_
A
SC
))
{
if
(((
functId
==
TSDB_FUNC_FIRST
||
functId
==
TSDB_FUNC_FIRST_DST
)
&&
order
==
TSDB_ORDER_
A
SC
)
||
((
functId
==
TSDB_FUNC_LAST
||
functId
==
TSDB_FUNC_LAST_DST
)
&&
order
==
TSDB_ORDER_
DE
SC
))
{
buf
->
resultInfo
[
j
].
complete
=
false
;
}
else
if
(
functId
!=
TSDB_FUNC_TS
&&
functId
!=
TSDB_FUNC_TAG
)
{
buf
->
resultInfo
[
j
].
complete
=
true
;
...
...
@@ -3208,32 +3208,28 @@ static void doDisableFunctsForSupplementaryScan(SQuery *pQuery, SWindowResInfo *
}
}
void
disableFuncInReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
order
)
{
void
disableFuncInReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
order
=
pQuery
->
order
.
order
;
// group by normal columns and interval query on normal table
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutputCols
;
++
i
)
{
pRuntimeEnv
->
pCtx
[
i
].
order
=
(
pRuntimeEnv
->
pCtx
[
i
].
order
)
^
1u
;
}
SWindowResInfo
*
pWindowResInfo
=
&
pRuntimeEnv
->
windowResInfo
;
if
(
isGroupbyNormalCol
(
pQuery
->
pGroupbyExpr
)
||
isIntervalQuery
(
pQuery
))
{
doDisableFunctsForSupplementaryScan
(
pQuery
,
pWindowResInfo
,
order
);
}
else
{
// for simple result of table query,
for
(
int32_t
j
=
0
;
j
<
pQuery
->
numOfOutputCols
;
++
j
)
{
int32_t
functId
=
pQuery
->
pSelectExpr
[
j
].
pBase
.
functionId
;
int32_t
functId
=
pQuery
->
pSelectExpr
[
j
].
pBase
.
functionId
;
SQLFunctionCtx
*
pCtx
=
&
pRuntimeEnv
->
pCtx
[
j
];
if
(((
functId
==
TSDB_FUNC_FIRST
||
functId
==
TSDB_FUNC_FIRST_DST
)
&&
order
==
TSDB_ORDER_
DE
SC
)
||
((
functId
==
TSDB_FUNC_LAST
||
functId
==
TSDB_FUNC_LAST_DST
)
&&
order
==
TSDB_ORDER_
A
SC
))
{
if
(((
functId
==
TSDB_FUNC_FIRST
||
functId
==
TSDB_FUNC_FIRST_DST
)
&&
order
==
TSDB_ORDER_
A
SC
)
||
((
functId
==
TSDB_FUNC_LAST
||
functId
==
TSDB_FUNC_LAST_DST
)
&&
order
==
TSDB_ORDER_
DE
SC
))
{
pCtx
->
resultInfo
->
complete
=
false
;
}
else
if
(
functId
!=
TSDB_FUNC_TS
&&
functId
!=
TSDB_FUNC_TAG
)
{
pCtx
->
resultInfo
->
complete
=
true
;
}
}
}
pQuery
->
order
.
order
=
pQuery
->
order
.
order
^
1u
;
}
void
disableFuncForReverseScan
(
SQInfo
*
pQInfo
,
int32_t
order
)
{
...
...
@@ -3259,14 +3255,11 @@ void disableFuncForReverseScan(SQInfo *pQInfo, int32_t order) {
pQuery
->
order
.
order
=
(
pQuery
->
order
.
order
)
^
1u
;
}
void
enableFuncForForwardScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
order
)
{
void
setCtxOrder
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutputCols
;
++
i
)
{
pRuntimeEnv
->
pCtx
[
i
].
order
=
(
pRuntimeEnv
->
pCtx
[
i
].
order
)
^
1u
;
pRuntimeEnv
->
pCtx
[
i
].
order
=
(
pRuntimeEnv
->
pCtx
[
i
].
order
==
TSDB_ORDER_ASC
)
?
TSDB_ORDER_DESC
:
TSDB_ORDER_ASC
;
}
pQuery
->
order
.
order
=
(
pQuery
->
order
.
order
)
^
1u
;
}
void
createQueryResultInfo
(
SQuery
*
pQuery
,
SWindowResult
*
pResultRow
,
bool
isSTableQuery
,
SPosInfo
*
posInfo
)
{
...
...
@@ -3381,8 +3374,8 @@ void doSkipResults(SQueryRuntimeEnv *pRuntimeEnv) {
}
typedef
struct
SQueryStatus
{
int8_t
overS
tatus
;
TSKEY
lastKey
;
int8_t
s
tatus
;
//
TSKEY lastKey;
STSCursor
cur
;
}
SQueryStatus
;
...
...
@@ -3390,8 +3383,8 @@ typedef struct SQueryStatus {
static
void
queryStatusSave
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQueryStatus
*
pStatus
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
pStatus
->
overS
tatus
=
pQuery
->
status
;
pStatus
->
lastKey
=
pQuery
->
lastKey
;
pStatus
->
s
tatus
=
pQuery
->
status
;
//
pStatus->lastKey = pQuery->lastKey;
pStatus
->
cur
=
tsBufGetCursor
(
pRuntimeEnv
->
pTSBuf
);
// save the cursor
...
...
@@ -3402,21 +3395,21 @@ static void queryStatusSave(SQueryRuntimeEnv *pRuntimeEnv, SQueryStatus *pStatus
setQueryStatus
(
pQuery
,
QUERY_NOT_COMPLETED
);
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
pQuery
->
lastKey
=
pQuery
->
window
.
skey
;
//
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
//
pQuery->lastKey = pQuery->window.skey;
}
static
void
queryStatusRestore
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQueryStatus
*
pStatus
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
pQuery
->
lastKey
=
pStatus
->
lastKey
;
pQuery
->
status
=
pStatus
->
overS
tatus
;
//
pQuery->lastKey = pStatus->lastKey;
pQuery
->
status
=
pStatus
->
s
tatus
;
tsBufSetCursor
(
pRuntimeEnv
->
pTSBuf
,
&
pStatus
->
cur
);
}
static
void
doReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
static
UNUSED_FUNC
void
doReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQueryStatus
qStatus
=
{
0
};
...
...
@@ -3428,19 +3421,15 @@ static void doReverseScan(SQueryRuntimeEnv *pRuntimeEnv) {
SET_SUPPLEMENT_SCAN_FLAG
(
pRuntimeEnv
);
// close necessary function execution during supplementary scan
disableFuncInReverseScan
(
pRuntimeEnv
,
pQuery
->
order
.
order
);
disableFuncInReverseScan
(
pRuntimeEnv
);
queryStatusSave
(
pRuntimeEnv
,
&
qStatus
);
// STimeWindow w = {.skey = pQuery->window.skey, .ekey = pQuery->window.ekey};
// reverse scan from current position
// tsdbpos_t current = tsdbDataBlockTell(pRuntimeEnv->pQueryHandle);
// tsdbResetQuery(pRuntimeEnv->pQueryHandle, &w, current, pQuery->order.order);
doScanAllDataBlocks
(
pRuntimeEnv
);
queryStatusRestore
(
pRuntimeEnv
,
&
qStatus
);
enableFuncForForwardScan
(
pRuntimeEnv
,
pQuery
->
order
.
order
);
setCtxOrder
(
pRuntimeEnv
);
SET_MASTER_SCAN_FLAG
(
pRuntimeEnv
);
}
...
...
@@ -3508,7 +3497,7 @@ void scanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
int64_t
skey
=
pQuery
->
lastKey
;
int32_t
status
=
pQuery
->
status
;
int32_t
active
Slot
=
pRuntimeEnv
->
windowResInfo
.
curIndex
;
int32_t
prev
Slot
=
pRuntimeEnv
->
windowResInfo
.
curIndex
;
SET_MASTER_SCAN_FLAG
(
pRuntimeEnv
);
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pQuery
->
order
.
order
);
...
...
@@ -3517,55 +3506,98 @@ void scanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
doScanAllDataBlocks
(
pRuntimeEnv
);
if
(
!
needScanDataBlocksAgain
(
pRuntimeEnv
))
{
// restore the status
if
(
pRuntimeEnv
->
scanFlag
==
REPEAT_SCAN
)
{
pQuery
->
status
=
status
;
pQuery
->
status
=
status
;
// restore the status code when abort from repeat scan
}
break
;
}
STsdbQueryCond
cond
=
{
.
twindow
=
{
pQuery
->
window
.
skey
,
pQuery
->
lastKey
},
.
twindow
=
{
.
skey
=
skey
,
.
ekey
=
pQuery
->
lastKey
-
step
},
.
order
=
pQuery
->
order
.
order
,
.
colList
=
pQuery
->
colList
,
.
numOfCols
=
pQuery
->
numOfCols
,
};
if
(
pRuntimeEnv
->
pSecQueryHandle
!
=
NULL
)
{
if
(
pRuntimeEnv
->
pSecQueryHandle
=
=
NULL
)
{
pRuntimeEnv
->
pSecQueryHandle
=
tsdbQueryTables
(
pQInfo
->
tsdb
,
&
cond
,
&
pQInfo
->
groupInfo
);
}
status
=
pQuery
->
status
;
pRuntimeEnv
->
windowResInfo
.
curIndex
=
active
Slot
;
status
=
pQuery
->
status
;
// backup the status
pRuntimeEnv
->
windowResInfo
.
curIndex
=
prev
Slot
;
setQueryStatus
(
pQuery
,
QUERY_NOT_COMPLETED
);
pRuntimeEnv
->
scanFlag
=
REPEAT_SCAN
;
// check if query is killed or not
if
(
isQueryKilled
(
GET_QINFO_ADDR
(
pRuntimeEnv
)
))
{
if
(
isQueryKilled
(
pQInfo
))
{
return
;
}
}
if
(
!
needReverseScan
(
pQuery
))
{
return
;
}
// save the query time window
STimeWindow
prev
=
{.
skey
=
pQuery
->
lastKey
,
.
ekey
=
pQuery
->
window
.
ekey
};
// no need to set the end key
TSKEY
lkey
=
pQuery
->
lastKey
;
TSKEY
ekey
=
pQuery
->
window
.
ekey
;
pQuery
->
window
.
skey
=
skey
;
pQuery
->
window
.
ekey
=
pQuery
->
lastKey
-
step
;
// /*tsdbpos_t current =*/ tsdbDataBlockTell(pRuntimeEnv->pQueryHandle);
doReverseScan
(
pRuntimeEnv
);
// update the pQuery->window.skey and pQuery->window.ekey to limit the scan scope of sliding query during reverse scan
pQuery
->
lastKey
=
lkey
;
pQuery
->
window
.
ekey
=
ekey
;
// reverse order time range
pQuery
->
window
.
skey
=
pQuery
->
lastKey
-
step
;
pQuery
->
window
.
ekey
=
skey
;
pQuery
->
order
.
order
=
(
pQuery
->
order
.
order
==
TSDB_ORDER_ASC
)
?
TSDB_ORDER_DESC
:
TSDB_ORDER_ASC
;
STsdbQueryCond
cond
=
{
.
twindow
=
pQuery
->
window
,
.
order
=
pQuery
->
order
.
order
,
.
colList
=
pQuery
->
colList
,
.
numOfCols
=
pQuery
->
numOfCols
,
};
// clean unused handle
if
(
pRuntimeEnv
->
pSecQueryHandle
!=
NULL
)
{
tsdbCleanupQueryHandle
(
pRuntimeEnv
->
pSecQueryHandle
);
}
// STimeWindow win = {.skey = pQuery->window.skey, .ekey = pQuery->window.ekey};
// tsdbResetQuery(pRuntimeEnv->pQueryHandle, &win, current, pQuery->order.order);
// tsdbNextDataBlock(pRuntimeEnv->pQueryHandle);
pRuntimeEnv
->
pSecQueryHandle
=
tsdbQueryTables
(
pQInfo
->
tsdb
,
&
cond
,
&
pQInfo
->
groupInfo
);
dTrace
(
"QInfo:%p start to reverse scan"
,
GET_QINFO_ADDR
(
pRuntimeEnv
));
SET_SUPPLEMENT_SCAN_FLAG
(
pRuntimeEnv
);
int32_t
status1
=
pQuery
->
status
;
STSCursor
cur
=
tsBufGetCursor
(
pRuntimeEnv
->
pTSBuf
);
// save the cursor
if
(
pRuntimeEnv
->
pTSBuf
)
{
pRuntimeEnv
->
pTSBuf
->
cur
.
order
=
pQuery
->
order
.
order
;
tsBufNextPos
(
pRuntimeEnv
->
pTSBuf
);
}
setQueryStatus
(
pQuery
,
QUERY_NOT_COMPLETED
);
setCtxOrder
(
pRuntimeEnv
);
disableFuncInReverseScan
(
pRuntimeEnv
);
// reverse scan from current position
doScanAllDataBlocks
(
pRuntimeEnv
);
pQuery
->
order
.
order
=
(
pQuery
->
order
.
order
==
TSDB_ORDER_ASC
)
?
TSDB_ORDER_DESC
:
TSDB_ORDER_ASC
;
tsBufSetCursor
(
pRuntimeEnv
->
pTSBuf
,
&
cur
);
if
(
pRuntimeEnv
->
pTSBuf
)
{
pRuntimeEnv
->
pTSBuf
->
cur
.
order
=
pQuery
->
order
.
order
;
}
setCtxOrder
(
pRuntimeEnv
);
SET_MASTER_SCAN_FLAG
(
pRuntimeEnv
);
// update the pQuery->window.skey and pQuery->window.ekey to limit the scan scope of sliding query
// during reverse scan
pQuery
->
lastKey
=
prev
.
skey
;
pQuery
->
status
=
status1
;
pQuery
->
window
.
ekey
=
prev
.
ekey
;
}
void
finalizeQueryResult
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
...
...
@@ -3859,17 +3891,17 @@ static int32_t doCopyToSData(SQInfo *pQInfo, SWindowResult *result, int32_t orde
int32_t
totalSubset
=
getNumOfSubset
(
pQInfo
);
if
(
orderType
==
TSDB_ORDER_ASC
)
{
startIdx
=
pQInfo
->
subgroupId
x
;
startIdx
=
pQInfo
->
groupInde
x
;
step
=
1
;
}
else
{
// desc order copy all data
startIdx
=
totalSubset
-
pQInfo
->
subgroupId
x
-
1
;
startIdx
=
totalSubset
-
pQInfo
->
groupInde
x
-
1
;
step
=
-
1
;
}
for
(
int32_t
i
=
startIdx
;
(
i
<
totalSubset
)
&&
(
i
>=
0
);
i
+=
step
)
{
if
(
result
[
i
].
numOfRows
==
0
)
{
pQInfo
->
offset
=
0
;
pQInfo
->
subgroupId
x
+=
1
;
pQInfo
->
groupInde
x
+=
1
;
continue
;
}
...
...
@@ -3887,7 +3919,7 @@ static int32_t doCopyToSData(SQInfo *pQInfo, SWindowResult *result, int32_t orde
pQInfo
->
offset
+=
numOfRowsToCopy
;
}
else
{
pQInfo
->
offset
=
0
;
pQInfo
->
subgroupId
x
+=
1
;
pQInfo
->
groupInde
x
+=
1
;
}
for
(
int32_t
j
=
0
;
j
<
pQuery
->
numOfOutputCols
;
++
j
)
{
...
...
@@ -4474,14 +4506,14 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
assert
(
pQuery
->
limit
.
offset
==
0
&&
pQuery
->
limit
.
limit
!=
0
);
#if 0
while (pQInfo->
subgroupId
x < numOfGroups) {
while (pQInfo->
groupInde
x < numOfGroups) {
SArray* group = taosArrayGetP(pQInfo->groupInfo.pGroupList, pQInfo->
subgroupId
x);
SArray* group = taosArrayGetP(pQInfo->groupInfo.pGroupList, pQInfo->
groupInde
x);
size_t numOfTable = taosArrayGetSize(group);
if (isFirstLastRowQuery(pQuery)) {
dTrace("QInfo:%p last_row query on vid:%d, numOfGroups:%d, current group:%d", pQInfo, vid, pTableIdList->numOfSubSet,
pQInfo->
subgroupId
x);
pQInfo->
groupInde
x);
TSKEY key = -1;
int32_t index = -1;
...
...
@@ -4502,7 +4534,7 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
// assert(num >= 0);
} else {
dTrace("QInfo:%p interp query on vid:%d, numOfGroups:%d, current group:%d", pQInfo, vid, pTableIdList->numOfSubSet,
pQInfo->
subgroupId
x);
pQInfo->
groupInde
x);
for (int32_t k = start; k <= end; ++k) {
if (isQueryKilled(pQInfo)) {
...
...
@@ -4520,7 +4552,7 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
}
}
pSupporter->
subgroupId
x++;
pSupporter->
groupInde
x++;
// output buffer is full, return to client
if (pQuery->size >= pQuery->pointsToRead) {
...
...
@@ -4537,7 +4569,7 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
* if the subgroup index is larger than 0, results generated by group by tbname,k is existed.
* we need to return it to client in the first place.
*/
if
(
pQInfo
->
subgroupId
x
>
0
)
{
if
(
pQInfo
->
groupInde
x
>
0
)
{
copyFromWindowResToSData
(
pQInfo
,
pRuntimeEnv
->
windowResInfo
.
pResult
);
pQuery
->
rec
.
total
+=
pQuery
->
rec
.
rows
;
...
...
@@ -4667,7 +4699,7 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
}
}
pQInfo
->
subgroupId
x
=
0
;
pQInfo
->
groupInde
x
=
0
;
pQuery
->
rec
.
rows
=
0
;
copyFromWindowResToSData
(
pQInfo
,
pWindowResInfo
->
pResult
);
}
...
...
@@ -4744,7 +4776,7 @@ static void doRestoreContext(SQInfo* pQInfo) {
pRuntimeEnv
->
pTSBuf
->
cur
.
order
=
pRuntimeEnv
->
pTSBuf
->
cur
.
order
^
1
;
}
enableFuncForForwardScan
(
pRuntimeEnv
,
pQuery
->
order
.
order
);
setCtxOrder
(
pRuntimeEnv
);
SET_MASTER_SCAN_FLAG
(
pRuntimeEnv
);
}
...
...
@@ -4777,9 +4809,9 @@ static void multiTableQueryProcess(SQInfo *pQInfo) {
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
if
(
pQInfo
->
subgroupId
x
>
0
)
{
if
(
pQInfo
->
groupInde
x
>
0
)
{
/*
* if the
subgroupId
x > 0, the query process must be completed yet, we only need to
* if the
groupInde
x > 0, the query process must be completed yet, we only need to
* copy the data into output buffer
*/
if
(
isIntervalQuery
(
pQuery
))
{
...
...
@@ -4841,7 +4873,7 @@ static void multiTableQueryProcess(SQInfo *pQInfo) {
}
if
(
isIntervalQuery
(
pQuery
)
||
isSumAvgRateQuery
(
pQuery
))
{
// assert(pSupporter->
subgroupId
x == 0 && pSupporter->numOfGroupResultPages == 0);
// assert(pSupporter->
groupInde
x == 0 && pSupporter->numOfGroupResultPages == 0);
if
(
mergeIntoGroupResult
(
pQInfo
)
==
TSDB_CODE_SUCCESS
)
{
copyResToQueryResultBuf
(
pQInfo
,
pQuery
);
...
...
@@ -4979,11 +5011,11 @@ static void tableIntervalProcess(SQInfo *pQInfo) {
tableIntervalProcessImpl
(
pRuntimeEnv
);
if
(
isIntervalQuery
(
pQuery
))
{
pQInfo
->
subgroupId
x
=
0
;
// always start from 0
pQInfo
->
groupInde
x
=
0
;
// always start from 0
pQuery
->
rec
.
rows
=
0
;
copyFromWindowResToSData
(
pQInfo
,
pRuntimeEnv
->
windowResInfo
.
pResult
);
clearFirstNTimeWindow
(
pRuntimeEnv
,
pQInfo
->
subgroupId
x
);
clearFirstNTimeWindow
(
pRuntimeEnv
,
pQInfo
->
groupInde
x
);
}
// the offset is handled at prepare stage if no interpolation involved
...
...
@@ -5015,10 +5047,10 @@ static void tableIntervalProcess(SQInfo *pQInfo) {
// all data scanned, the group by normal column can return
if
(
isGroupbyNormalCol
(
pQuery
->
pGroupbyExpr
))
{
// todo refactor with merge interval time result
pQInfo
->
subgroupId
x
=
0
;
pQInfo
->
groupInde
x
=
0
;
pQuery
->
rec
.
rows
=
0
;
copyFromWindowResToSData
(
pQInfo
,
pRuntimeEnv
->
windowResInfo
.
pResult
);
clearFirstNTimeWindow
(
pRuntimeEnv
,
pQInfo
->
subgroupId
x
);
clearFirstNTimeWindow
(
pRuntimeEnv
,
pQInfo
->
groupInde
x
);
}
pQInfo
->
pointsInterpo
+=
numOfInterpo
;
...
...
@@ -5054,13 +5086,13 @@ static void tableQueryImpl(SQInfo* pQInfo) {
// todo limit the output for interval query?
pQuery
->
rec
.
rows
=
0
;
pQInfo
->
subgroupId
x
=
0
;
// always start from 0
pQInfo
->
groupInde
x
=
0
;
// always start from 0
if
(
pRuntimeEnv
->
windowResInfo
.
size
>
0
)
{
copyFromWindowResToSData
(
pQInfo
,
pRuntimeEnv
->
windowResInfo
.
pResult
);
pQuery
->
rec
.
rows
+=
pQuery
->
rec
.
rows
;
clearFirstNTimeWindow
(
pRuntimeEnv
,
pQInfo
->
subgroupId
x
);
clearFirstNTimeWindow
(
pRuntimeEnv
,
pQInfo
->
groupInde
x
);
if
(
pQuery
->
rec
.
rows
>
0
)
{
dTrace
(
"QInfo:%p %d rows returned from group results, total:%d"
,
pQInfo
,
pQuery
->
rec
.
rows
,
pQuery
->
rec
.
total
);
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
反馈
建议
客服
返回
顶部