Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
732a91c9
T
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1184
Star
22015
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
732a91c9
编写于
6月 27, 2022
作者:
X
Xiaoyu Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: tail function rewrite to statement
上级
9c68bde6
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
139 addition
and
129 deletion
+139
-129
source/libs/planner/src/planOptimizer.c
source/libs/planner/src/planOptimizer.c
+138
-129
source/libs/planner/src/planSpliter.c
source/libs/planner/src/planSpliter.c
+1
-0
未找到文件。
source/libs/planner/src/planOptimizer.c
浏览文件 @
732a91c9
...
...
@@ -20,9 +20,8 @@
#define OPTIMIZE_FLAG_MASK(n) (1 << n)
#define OPTIMIZE_FLAG_OSD OPTIMIZE_FLAG_MASK(0)
#define OPTIMIZE_FLAG_CPD OPTIMIZE_FLAG_MASK(1)
#define OPTIMIZE_FLAG_OPK OPTIMIZE_FLAG_MASK(2)
#define OPTIMIZE_FLAG_OSD OPTIMIZE_FLAG_MASK(0)
#define OPTIMIZE_FLAG_PUSH_DOWN_CONDE OPTIMIZE_FLAG_MASK(1)
#define OPTIMIZE_FLAG_SET_MASK(val, mask) (val) |= (mask)
#define OPTIMIZE_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
...
...
@@ -76,7 +75,7 @@ static SLogicNode* optFindPossibleNode(SLogicNode* pNode, FMayBeOptimized func)
return
NULL
;
}
EDealRes
osd
HaveNormalColImpl
(
SNode
*
pNode
,
void
*
pContext
)
{
EDealRes
scanPathOpt
HaveNormalColImpl
(
SNode
*
pNode
,
void
*
pContext
)
{
if
(
QUERY_NODE_COLUMN
==
nodeType
(
pNode
))
{
// *((bool*)pContext) = (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType);
*
((
bool
*
)
pContext
)
=
true
;
...
...
@@ -85,13 +84,13 @@ EDealRes osdHaveNormalColImpl(SNode* pNode, void* pContext) {
return
DEAL_RES_CONTINUE
;
}
static
bool
osd
HaveNormalCol
(
SNodeList
*
pList
)
{
static
bool
scanPathOpt
HaveNormalCol
(
SNodeList
*
pList
)
{
bool
res
=
false
;
nodesWalkExprsPostOrder
(
pList
,
osd
HaveNormalColImpl
,
&
res
);
nodesWalkExprsPostOrder
(
pList
,
scanPathOpt
HaveNormalColImpl
,
&
res
);
return
res
;
}
static
bool
osd
MayBeOptimized
(
SLogicNode
*
pNode
)
{
static
bool
scanPathOpt
MayBeOptimized
(
SLogicNode
*
pNode
)
{
if
(
OPTIMIZE_FLAG_TEST_MASK
(
pNode
->
optimizedFlag
,
OPTIMIZE_FLAG_OSD
))
{
return
false
;
}
...
...
@@ -108,10 +107,10 @@ static bool osdMayBeOptimized(SLogicNode* pNode) {
QUERY_NODE_LOGIC_PLAN_WINDOW
==
nodeType
(
pNode
->
pParent
->
pParent
)))
{
return
true
;
}
return
!
osd
HaveNormalCol
(((
SAggLogicNode
*
)
pNode
->
pParent
)
->
pGroupKeys
);
return
!
scanPathOpt
HaveNormalCol
(((
SAggLogicNode
*
)
pNode
->
pParent
)
->
pGroupKeys
);
}
static
SNodeList
*
osd
GetAllFuncs
(
SLogicNode
*
pNode
)
{
static
SNodeList
*
scanPathOpt
GetAllFuncs
(
SLogicNode
*
pNode
)
{
switch
(
nodeType
(
pNode
))
{
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
return
((
SWindowLogicNode
*
)
pNode
)
->
pFuncs
;
...
...
@@ -123,7 +122,7 @@ static SNodeList* osdGetAllFuncs(SLogicNode* pNode) {
return
NULL
;
}
static
bool
n
eedOptimizeDataRequire
(
const
SFunctionNode
*
pFunc
)
{
static
bool
scanPathOptN
eedOptimizeDataRequire
(
const
SFunctionNode
*
pFunc
)
{
if
(
!
fmIsSpecialDataRequiredFunc
(
pFunc
->
funcId
))
{
return
false
;
}
...
...
@@ -136,7 +135,7 @@ static bool needOptimizeDataRequire(const SFunctionNode* pFunc) {
return
true
;
}
static
bool
needOptimizeDynamicScan
(
const
SFunctionNode
*
pFunc
)
{
static
bool
scanPathOptNeedDynOptimize
(
const
SFunctionNode
*
pFunc
)
{
if
(
!
fmIsDynamicScanOptimizedFunc
(
pFunc
->
funcId
))
{
return
false
;
}
...
...
@@ -149,17 +148,17 @@ static bool needOptimizeDynamicScan(const SFunctionNode* pFunc) {
return
true
;
}
static
int32_t
osd
GetRelatedFuncs
(
SScanLogicNode
*
pScan
,
SNodeList
**
pSdrFuncs
,
SNodeList
**
pDsoFuncs
)
{
SNodeList
*
pAllFuncs
=
osd
GetAllFuncs
(
pScan
->
node
.
pParent
);
static
int32_t
scanPathOpt
GetRelatedFuncs
(
SScanLogicNode
*
pScan
,
SNodeList
**
pSdrFuncs
,
SNodeList
**
pDsoFuncs
)
{
SNodeList
*
pAllFuncs
=
scanPathOpt
GetAllFuncs
(
pScan
->
node
.
pParent
);
SNodeList
*
pTmpSdrFuncs
=
NULL
;
SNodeList
*
pTmpDsoFuncs
=
NULL
;
SNode
*
pFunc
=
NULL
;
bool
otherFunc
=
false
;
FOREACH
(
pFunc
,
pAllFuncs
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
n
eedOptimizeDataRequire
((
SFunctionNode
*
)
pFunc
))
{
if
(
scanPathOptN
eedOptimizeDataRequire
((
SFunctionNode
*
)
pFunc
))
{
code
=
nodesListMakeStrictAppend
(
&
pTmpSdrFuncs
,
nodesCloneNode
(
pFunc
));
}
else
if
(
needOptimizeDynamicScan
((
SFunctionNode
*
)
pFunc
))
{
}
else
if
(
scanPathOptNeedDynOptimize
((
SFunctionNode
*
)
pFunc
))
{
code
=
nodesListMakeStrictAppend
(
&
pTmpDsoFuncs
,
nodesCloneNode
(
pFunc
));
}
else
{
otherFunc
=
true
;
...
...
@@ -180,15 +179,15 @@ static int32_t osdGetRelatedFuncs(SScanLogicNode* pScan, SNodeList** pSdrFuncs,
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
osd
Match
(
SOptimizeContext
*
pCxt
,
SLogicNode
*
pLogicNode
,
SOsdInfo
*
pInfo
)
{
pInfo
->
pScan
=
(
SScanLogicNode
*
)
optFindPossibleNode
(
pLogicNode
,
osd
MayBeOptimized
);
static
int32_t
scanPathOpt
Match
(
SOptimizeContext
*
pCxt
,
SLogicNode
*
pLogicNode
,
SOsdInfo
*
pInfo
)
{
pInfo
->
pScan
=
(
SScanLogicNode
*
)
optFindPossibleNode
(
pLogicNode
,
scanPathOpt
MayBeOptimized
);
if
(
NULL
==
pInfo
->
pScan
)
{
return
TSDB_CODE_SUCCESS
;
}
return
osd
GetRelatedFuncs
(
pInfo
->
pScan
,
&
pInfo
->
pSdrFuncs
,
&
pInfo
->
pDsoFuncs
);
return
scanPathOpt
GetRelatedFuncs
(
pInfo
->
pScan
,
&
pInfo
->
pSdrFuncs
,
&
pInfo
->
pDsoFuncs
);
}
static
EFuncDataRequired
osd
PromoteDataRequired
(
EFuncDataRequired
l
,
EFuncDataRequired
r
)
{
static
EFuncDataRequired
scanPathOpt
PromoteDataRequired
(
EFuncDataRequired
l
,
EFuncDataRequired
r
)
{
switch
(
l
)
{
case
FUNC_DATA_REQUIRED_DATA_LOAD
:
return
l
;
...
...
@@ -202,19 +201,19 @@ static EFuncDataRequired osdPromoteDataRequired(EFuncDataRequired l, EFuncDataRe
return
r
;
}
static
int32_t
osd
GetDataRequired
(
SNodeList
*
pFuncs
)
{
static
int32_t
scanPathOpt
GetDataRequired
(
SNodeList
*
pFuncs
)
{
if
(
NULL
==
pFuncs
)
{
return
FUNC_DATA_REQUIRED_DATA_LOAD
;
}
EFuncDataRequired
dataRequired
=
FUNC_DATA_REQUIRED_FILTEROUT
;
SNode
*
pFunc
=
NULL
;
FOREACH
(
pFunc
,
pFuncs
)
{
dataRequired
=
osd
PromoteDataRequired
(
dataRequired
,
fmFuncDataRequired
((
SFunctionNode
*
)
pFunc
,
NULL
));
dataRequired
=
scanPathOpt
PromoteDataRequired
(
dataRequired
,
fmFuncDataRequired
((
SFunctionNode
*
)
pFunc
,
NULL
));
}
return
dataRequired
;
}
static
void
s
etScanWindowInfo
(
SScanLogicNode
*
pScan
)
{
static
void
s
canPathOptSetScanWin
(
SScanLogicNode
*
pScan
)
{
SLogicNode
*
pParent
=
pScan
->
node
.
pParent
;
if
(
QUERY_NODE_LOGIC_PLAN_PARTITION
==
nodeType
(
pParent
)
&&
pParent
->
pParent
&&
QUERY_NODE_LOGIC_PLAN_WINDOW
==
nodeType
(
pParent
->
pParent
))
{
...
...
@@ -233,14 +232,14 @@ static void setScanWindowInfo(SScanLogicNode* pScan) {
}
}
static
int32_t
pickS
canPathOptimize
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
)
{
static
int32_t
s
canPathOptimize
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
)
{
SOsdInfo
info
=
{
0
};
int32_t
code
=
osd
Match
(
pCxt
,
pLogicSubplan
->
pNode
,
&
info
);
int32_t
code
=
scanPathOpt
Match
(
pCxt
,
pLogicSubplan
->
pNode
,
&
info
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
info
.
pScan
)
{
s
etScanWindowInfo
((
SScanLogicNode
*
)
info
.
pScan
);
s
canPathOptSetScanWin
((
SScanLogicNode
*
)
info
.
pScan
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
(
NULL
!=
info
.
pDsoFuncs
||
NULL
!=
info
.
pSdrFuncs
))
{
info
.
pScan
->
dataRequired
=
osd
GetDataRequired
(
info
.
pSdrFuncs
);
info
.
pScan
->
dataRequired
=
scanPathOpt
GetDataRequired
(
info
.
pSdrFuncs
);
info
.
pScan
->
pDynamicScanFuncs
=
info
.
pDsoFuncs
;
OPTIMIZE_FLAG_SET_MASK
(
info
.
pScan
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_OSD
);
pCxt
->
optimized
=
true
;
...
...
@@ -249,7 +248,7 @@ static int32_t pickScanPathOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogi
return
code
;
}
static
int32_t
p
dc
OptMergeCond
(
SNode
**
pDst
,
SNode
**
pSrc
)
{
static
int32_t
p
ushDownCond
OptMergeCond
(
SNode
**
pDst
,
SNode
**
pSrc
)
{
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)
nodesMakeNode
(
QUERY_NODE_LOGIC_CONDITION
);
if
(
NULL
==
pLogicCond
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
...
...
@@ -270,7 +269,7 @@ static int32_t pdcOptMergeCond(SNode** pDst, SNode** pSrc) {
return
code
;
}
static
int32_t
p
dc
OptAppendCond
(
SNode
**
pCond
,
SNode
**
pAdditionalCond
)
{
static
int32_t
p
ushDownCond
OptAppendCond
(
SNode
**
pCond
,
SNode
**
pAdditionalCond
)
{
if
(
NULL
==
*
pCond
)
{
TSWAP
(
*
pCond
,
*
pAdditionalCond
);
return
TSDB_CODE_SUCCESS
;
...
...
@@ -283,16 +282,16 @@ static int32_t pdcOptAppendCond(SNode** pCond, SNode** pAdditionalCond) {
*
pAdditionalCond
=
NULL
;
}
}
else
{
code
=
p
dc
OptMergeCond
(
pCond
,
pAdditionalCond
);
code
=
p
ushDownCond
OptMergeCond
(
pCond
,
pAdditionalCond
);
}
return
code
;
}
static
int32_t
p
dc
OptCalcTimeRange
(
SOptimizeContext
*
pCxt
,
SScanLogicNode
*
pScan
,
SNode
**
pPrimaryKeyCond
,
SNode
**
pOtherCond
)
{
static
int32_t
p
ushDownCond
OptCalcTimeRange
(
SOptimizeContext
*
pCxt
,
SScanLogicNode
*
pScan
,
SNode
**
pPrimaryKeyCond
,
SNode
**
pOtherCond
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
pCxt
->
pPlanCxt
->
topicQuery
||
pCxt
->
pPlanCxt
->
streamQuery
)
{
code
=
p
dc
OptAppendCond
(
pOtherCond
,
pPrimaryKeyCond
);
code
=
p
ushDownCond
OptAppendCond
(
pOtherCond
,
pPrimaryKeyCond
);
}
else
{
bool
isStrict
=
false
;
code
=
filterGetTimeRange
(
*
pPrimaryKeyCond
,
&
pScan
->
scanRange
,
&
isStrict
);
...
...
@@ -300,7 +299,7 @@ static int32_t pdcOptCalcTimeRange(SOptimizeContext* pCxt, SScanLogicNode* pScan
if
(
isStrict
)
{
nodesDestroyNode
(
*
pPrimaryKeyCond
);
}
else
{
code
=
p
dc
OptAppendCond
(
pOtherCond
,
pPrimaryKeyCond
);
code
=
p
ushDownCond
OptAppendCond
(
pOtherCond
,
pPrimaryKeyCond
);
}
*
pPrimaryKeyCond
=
NULL
;
}
...
...
@@ -308,8 +307,9 @@ static int32_t pdcOptCalcTimeRange(SOptimizeContext* pCxt, SScanLogicNode* pScan
return
code
;
}
static
int32_t
pdcOptDealScan
(
SOptimizeContext
*
pCxt
,
SScanLogicNode
*
pScan
)
{
if
(
NULL
==
pScan
->
node
.
pConditions
||
OPTIMIZE_FLAG_TEST_MASK
(
pScan
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_CPD
)
||
static
int32_t
pushDownCondOptDealScan
(
SOptimizeContext
*
pCxt
,
SScanLogicNode
*
pScan
)
{
if
(
NULL
==
pScan
->
node
.
pConditions
||
OPTIMIZE_FLAG_TEST_MASK
(
pScan
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_PUSH_DOWN_CONDE
)
||
TSDB_SYSTEM_TABLE
==
pScan
->
tableType
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -319,14 +319,14 @@ static int32_t pdcOptDealScan(SOptimizeContext* pCxt, SScanLogicNode* pScan) {
int32_t
code
=
nodesPartitionCond
(
&
pScan
->
node
.
pConditions
,
&
pPrimaryKeyCond
,
&
pScan
->
pTagIndexCond
,
&
pScan
->
pTagCond
,
&
pOtherCond
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pPrimaryKeyCond
)
{
code
=
p
dc
OptCalcTimeRange
(
pCxt
,
pScan
,
&
pPrimaryKeyCond
,
&
pOtherCond
);
code
=
p
ushDownCond
OptCalcTimeRange
(
pCxt
,
pScan
,
&
pPrimaryKeyCond
,
&
pOtherCond
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pScan
->
node
.
pConditions
=
pOtherCond
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
OPTIMIZE_FLAG_SET_MASK
(
pScan
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_
CPD
);
OPTIMIZE_FLAG_SET_MASK
(
pScan
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_
PUSH_DOWN_CONDE
);
pCxt
->
optimized
=
true
;
}
else
{
nodesDestroyNode
(
pPrimaryKeyCond
);
...
...
@@ -336,7 +336,7 @@ static int32_t pdcOptDealScan(SOptimizeContext* pCxt, SScanLogicNode* pScan) {
return
code
;
}
static
bool
p
dc
OptBelongThisTable
(
SNode
*
pCondCol
,
SNodeList
*
pTableCols
)
{
static
bool
p
ushDownCond
OptBelongThisTable
(
SNode
*
pCondCol
,
SNodeList
*
pTableCols
)
{
SNode
*
pTableCol
=
NULL
;
FOREACH
(
pTableCol
,
pTableCols
)
{
if
(
nodesEqualNode
(
pCondCol
,
pTableCol
))
{
...
...
@@ -346,12 +346,12 @@ static bool pdcOptBelongThisTable(SNode* pCondCol, SNodeList* pTableCols) {
return
false
;
}
static
EDealRes
p
dc
OptIsCrossTableCond
(
SNode
*
pNode
,
void
*
pContext
)
{
static
EDealRes
p
ushDownCond
OptIsCrossTableCond
(
SNode
*
pNode
,
void
*
pContext
)
{
SCpdIsMultiTableCondCxt
*
pCxt
=
pContext
;
if
(
QUERY_NODE_COLUMN
==
nodeType
(
pNode
))
{
if
(
p
dc
OptBelongThisTable
(
pNode
,
pCxt
->
pLeftCols
))
{
if
(
p
ushDownCond
OptBelongThisTable
(
pNode
,
pCxt
->
pLeftCols
))
{
pCxt
->
havaLeftCol
=
true
;
}
else
if
(
p
dc
OptBelongThisTable
(
pNode
,
pCxt
->
pRightCols
))
{
}
else
if
(
p
ushDownCond
OptBelongThisTable
(
pNode
,
pCxt
->
pRightCols
))
{
pCxt
->
haveRightCol
=
true
;
}
return
pCxt
->
havaLeftCol
&&
pCxt
->
haveRightCol
?
DEAL_RES_END
:
DEAL_RES_CONTINUE
;
...
...
@@ -359,10 +359,11 @@ static EDealRes pdcOptIsCrossTableCond(SNode* pNode, void* pContext) {
return
DEAL_RES_CONTINUE
;
}
static
ECondAction
pdcOptGetCondAction
(
EJoinType
joinType
,
SNodeList
*
pLeftCols
,
SNodeList
*
pRightCols
,
SNode
*
pNode
)
{
static
ECondAction
pushDownCondOptGetCondAction
(
EJoinType
joinType
,
SNodeList
*
pLeftCols
,
SNodeList
*
pRightCols
,
SNode
*
pNode
)
{
SCpdIsMultiTableCondCxt
cxt
=
{
.
pLeftCols
=
pLeftCols
,
.
pRightCols
=
pRightCols
,
.
havaLeftCol
=
false
,
.
haveRightCol
=
false
};
nodesWalkExpr
(
pNode
,
p
dc
OptIsCrossTableCond
,
&
cxt
);
nodesWalkExpr
(
pNode
,
p
ushDownCond
OptIsCrossTableCond
,
&
cxt
);
return
(
JOIN_TYPE_INNER
!=
joinType
?
COND_ACTION_STAY
:
(
cxt
.
havaLeftCol
&&
cxt
.
haveRightCol
...
...
@@ -370,8 +371,8 @@ static ECondAction pdcOptGetCondAction(EJoinType joinType, SNodeList* pLeftCols,
:
(
cxt
.
havaLeftCol
?
COND_ACTION_PUSH_LEFT_CHILD
:
COND_ACTION_PUSH_RIGHT_CHILD
)));
}
static
int32_t
p
dcOptPartition
LogicCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pOnCond
,
SNode
**
pLeftChildCond
,
SNode
**
pRightChildCond
)
{
static
int32_t
p
ushDownCondOptPart
LogicCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pOnCond
,
SNode
**
pLeftChildCond
,
SNode
**
pRightChildCond
)
{
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)
pJoin
->
node
.
pConditions
;
if
(
LOGIC_COND_TYPE_AND
!=
pLogicCond
->
condType
)
{
return
TSDB_CODE_SUCCESS
;
...
...
@@ -387,7 +388,7 @@ static int32_t pdcOptPartitionLogicCond(SJoinLogicNode* pJoin, SNode** pOnCond,
SNodeList
*
pRemainConds
=
NULL
;
SNode
*
pCond
=
NULL
;
FOREACH
(
pCond
,
pLogicCond
->
pParameterList
)
{
ECondAction
condAction
=
p
dc
OptGetCondAction
(
pJoin
->
joinType
,
pLeftCols
,
pRightCols
,
pCond
);
ECondAction
condAction
=
p
ushDownCond
OptGetCondAction
(
pJoin
->
joinType
,
pLeftCols
,
pRightCols
,
pCond
);
if
(
COND_ACTION_PUSH_JOIN
==
condAction
)
{
code
=
nodesListMakeAppend
(
&
pOnConds
,
nodesCloneNode
(
pCond
));
}
else
if
(
COND_ACTION_PUSH_LEFT_CHILD
==
condAction
)
{
...
...
@@ -439,11 +440,12 @@ static int32_t pdcOptPartitionLogicCond(SJoinLogicNode* pJoin, SNode** pOnCond,
return
code
;
}
static
int32_t
p
dcOptPartition
OpCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pOnCond
,
SNode
**
pLeftChildCond
,
SNode
**
pRightChildCond
)
{
static
int32_t
p
ushDownCondOptPart
OpCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pOnCond
,
SNode
**
pLeftChildCond
,
SNode
**
pRightChildCond
)
{
SNodeList
*
pLeftCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
0
))
->
pTargets
;
SNodeList
*
pRightCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
))
->
pTargets
;
ECondAction
condAction
=
pdcOptGetCondAction
(
pJoin
->
joinType
,
pLeftCols
,
pRightCols
,
pJoin
->
node
.
pConditions
);
ECondAction
condAction
=
pushDownCondOptGetCondAction
(
pJoin
->
joinType
,
pLeftCols
,
pRightCols
,
pJoin
->
node
.
pConditions
);
if
(
COND_ACTION_STAY
==
condAction
)
{
return
TSDB_CODE_SUCCESS
;
}
else
if
(
COND_ACTION_PUSH_JOIN
==
condAction
)
{
...
...
@@ -457,35 +459,35 @@ static int32_t pdcOptPartitionOpCond(SJoinLogicNode* pJoin, SNode** pOnCond, SNo
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
p
dcOptPartition
Cond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pOnCond
,
SNode
**
pLeftChildCond
,
SNode
**
pRightChildCond
)
{
static
int32_t
p
ushDownCondOptPart
Cond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pOnCond
,
SNode
**
pLeftChildCond
,
SNode
**
pRightChildCond
)
{
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pJoin
->
node
.
pConditions
))
{
return
p
dcOptPartition
LogicCond
(
pJoin
,
pOnCond
,
pLeftChildCond
,
pRightChildCond
);
return
p
ushDownCondOptPart
LogicCond
(
pJoin
,
pOnCond
,
pLeftChildCond
,
pRightChildCond
);
}
else
{
return
p
dcOptPartition
OpCond
(
pJoin
,
pOnCond
,
pLeftChildCond
,
pRightChildCond
);
return
p
ushDownCondOptPart
OpCond
(
pJoin
,
pOnCond
,
pLeftChildCond
,
pRightChildCond
);
}
}
static
int32_t
p
dc
OptPushCondToOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SNode
**
pCond
)
{
return
p
dc
OptAppendCond
(
&
pJoin
->
pOnConditions
,
pCond
);
static
int32_t
p
ushDownCond
OptPushCondToOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SNode
**
pCond
)
{
return
p
ushDownCond
OptAppendCond
(
&
pJoin
->
pOnConditions
,
pCond
);
}
static
int32_t
p
dc
OptPushCondToScan
(
SOptimizeContext
*
pCxt
,
SScanLogicNode
*
pScan
,
SNode
**
pCond
)
{
return
p
dc
OptAppendCond
(
&
pScan
->
node
.
pConditions
,
pCond
);
static
int32_t
p
ushDownCond
OptPushCondToScan
(
SOptimizeContext
*
pCxt
,
SScanLogicNode
*
pScan
,
SNode
**
pCond
)
{
return
p
ushDownCond
OptAppendCond
(
&
pScan
->
node
.
pConditions
,
pCond
);
}
static
int32_t
p
dc
OptPushCondToChild
(
SOptimizeContext
*
pCxt
,
SLogicNode
*
pChild
,
SNode
**
pCond
)
{
static
int32_t
p
ushDownCond
OptPushCondToChild
(
SOptimizeContext
*
pCxt
,
SLogicNode
*
pChild
,
SNode
**
pCond
)
{
switch
(
nodeType
(
pChild
))
{
case
QUERY_NODE_LOGIC_PLAN_SCAN
:
return
p
dc
OptPushCondToScan
(
pCxt
,
(
SScanLogicNode
*
)
pChild
,
pCond
);
return
p
ushDownCond
OptPushCondToScan
(
pCxt
,
(
SScanLogicNode
*
)
pChild
,
pCond
);
default:
break
;
}
planError
(
"p
dc
OptPushCondToChild failed, invalid logic plan node %s"
,
nodesNodeName
(
nodeType
(
pChild
)));
planError
(
"p
ushDownCond
OptPushCondToChild failed, invalid logic plan node %s"
,
nodesNodeName
(
nodeType
(
pChild
)));
return
TSDB_CODE_PLAN_INTERNAL_ERROR
;
}
static
bool
p
dcOptIsPrimary
Key
(
SNode
*
pNode
,
SNodeList
*
pTableCols
)
{
static
bool
p
ushDownCondOptIsPri
Key
(
SNode
*
pNode
,
SNodeList
*
pTableCols
)
{
if
(
QUERY_NODE_COLUMN
!=
nodeType
(
pNode
))
{
return
false
;
}
...
...
@@ -493,10 +495,10 @@ static bool pdcOptIsPrimaryKey(SNode* pNode, SNodeList* pTableCols) {
if
(
PRIMARYKEY_TIMESTAMP_COL_ID
!=
pCol
->
colId
)
{
return
false
;
}
return
p
dc
OptBelongThisTable
(
pNode
,
pTableCols
);
return
p
ushDownCond
OptBelongThisTable
(
pNode
,
pTableCols
);
}
static
bool
p
dcOptIsPrimary
KeyEqualCond
(
SJoinLogicNode
*
pJoin
,
SNode
*
pCond
)
{
static
bool
p
ushDownCondOptIsPri
KeyEqualCond
(
SJoinLogicNode
*
pJoin
,
SNode
*
pCond
)
{
if
(
QUERY_NODE_OPERATOR
!=
nodeType
(
pCond
))
{
return
false
;
}
...
...
@@ -508,15 +510,15 @@ static bool pdcOptIsPrimaryKeyEqualCond(SJoinLogicNode* pJoin, SNode* pCond) {
SNodeList
*
pLeftCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
0
))
->
pTargets
;
SNodeList
*
pRightCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
))
->
pTargets
;
if
(
p
dcOptIsPrimary
Key
(
pOper
->
pLeft
,
pLeftCols
))
{
return
p
dcOptIsPrimary
Key
(
pOper
->
pRight
,
pRightCols
);
}
else
if
(
p
dcOptIsPrimary
Key
(
pOper
->
pLeft
,
pRightCols
))
{
return
p
dcOptIsPrimary
Key
(
pOper
->
pRight
,
pLeftCols
);
if
(
p
ushDownCondOptIsPri
Key
(
pOper
->
pLeft
,
pLeftCols
))
{
return
p
ushDownCondOptIsPri
Key
(
pOper
->
pRight
,
pRightCols
);
}
else
if
(
p
ushDownCondOptIsPri
Key
(
pOper
->
pLeft
,
pRightCols
))
{
return
p
ushDownCondOptIsPri
Key
(
pOper
->
pRight
,
pLeftCols
);
}
return
false
;
}
static
bool
p
dc
OptContainPriKeyEqualCond
(
SJoinLogicNode
*
pJoin
,
SNode
*
pCond
)
{
static
bool
p
ushDownCond
OptContainPriKeyEqualCond
(
SJoinLogicNode
*
pJoin
,
SNode
*
pCond
)
{
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pCond
))
{
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)
pCond
;
if
(
LOGIC_COND_TYPE_AND
!=
pLogicCond
->
condType
)
{
...
...
@@ -525,54 +527,56 @@ static bool pdcOptContainPriKeyEqualCond(SJoinLogicNode* pJoin, SNode* pCond) {
bool
hasPrimaryKeyEqualCond
=
false
;
SNode
*
pCond
=
NULL
;
FOREACH
(
pCond
,
pLogicCond
->
pParameterList
)
{
if
(
p
dc
OptContainPriKeyEqualCond
(
pJoin
,
pCond
))
{
if
(
p
ushDownCond
OptContainPriKeyEqualCond
(
pJoin
,
pCond
))
{
hasPrimaryKeyEqualCond
=
true
;
break
;
}
}
return
hasPrimaryKeyEqualCond
;
}
else
{
return
p
dcOptIsPrimary
KeyEqualCond
(
pJoin
,
pCond
);
return
p
ushDownCondOptIsPri
KeyEqualCond
(
pJoin
,
pCond
);
}
}
static
int32_t
p
dc
OptCheckJoinOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
static
int32_t
p
ushDownCond
OptCheckJoinOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
if
(
NULL
==
pJoin
->
pOnConditions
)
{
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_NOT_SUPPORT_CROSS_JOIN
);
}
if
(
!
p
dc
OptContainPriKeyEqualCond
(
pJoin
,
pJoin
->
pOnConditions
))
{
if
(
!
p
ushDownCond
OptContainPriKeyEqualCond
(
pJoin
,
pJoin
->
pOnConditions
))
{
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_EXPECTED_TS_EQUAL
);
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
p
dc
OptDealJoin
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
if
(
OPTIMIZE_FLAG_TEST_MASK
(
pJoin
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_
CPD
))
{
static
int32_t
p
ushDownCond
OptDealJoin
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
if
(
OPTIMIZE_FLAG_TEST_MASK
(
pJoin
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_
PUSH_DOWN_CONDE
))
{
return
TSDB_CODE_SUCCESS
;
}
if
(
NULL
==
pJoin
->
node
.
pConditions
)
{
return
p
dc
OptCheckJoinOnCond
(
pCxt
,
pJoin
);
return
p
ushDownCond
OptCheckJoinOnCond
(
pCxt
,
pJoin
);
}
SNode
*
pOnCond
=
NULL
;
SNode
*
pLeftChildCond
=
NULL
;
SNode
*
pRightChildCond
=
NULL
;
int32_t
code
=
p
dcOptPartition
Cond
(
pJoin
,
&
pOnCond
,
&
pLeftChildCond
,
&
pRightChildCond
);
int32_t
code
=
p
ushDownCondOptPart
Cond
(
pJoin
,
&
pOnCond
,
&
pLeftChildCond
,
&
pRightChildCond
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pOnCond
)
{
code
=
p
dc
OptPushCondToOnCond
(
pCxt
,
pJoin
,
&
pOnCond
);
code
=
p
ushDownCond
OptPushCondToOnCond
(
pCxt
,
pJoin
,
&
pOnCond
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pLeftChildCond
)
{
code
=
pdcOptPushCondToChild
(
pCxt
,
(
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
0
),
&
pLeftChildCond
);
code
=
pushDownCondOptPushCondToChild
(
pCxt
,
(
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
0
),
&
pLeftChildCond
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pRightChildCond
)
{
code
=
pdcOptPushCondToChild
(
pCxt
,
(
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
),
&
pRightChildCond
);
code
=
pushDownCondOptPushCondToChild
(
pCxt
,
(
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
),
&
pRightChildCond
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
OPTIMIZE_FLAG_SET_MASK
(
pJoin
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_
CPD
);
OPTIMIZE_FLAG_SET_MASK
(
pJoin
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_
PUSH_DOWN_CONDE
);
pCxt
->
optimized
=
true
;
code
=
p
dc
OptCheckJoinOnCond
(
pCxt
,
pJoin
);
code
=
p
ushDownCond
OptCheckJoinOnCond
(
pCxt
,
pJoin
);
}
else
{
nodesDestroyNode
(
pOnCond
);
nodesDestroyNode
(
pLeftChildCond
);
...
...
@@ -582,7 +586,7 @@ static int32_t pdcOptDealJoin(SOptimizeContext* pCxt, SJoinLogicNode* pJoin) {
return
code
;
}
static
int32_t
p
dc
OptDealAgg
(
SOptimizeContext
*
pCxt
,
SAggLogicNode
*
pAgg
)
{
static
int32_t
p
ushDownCond
OptDealAgg
(
SOptimizeContext
*
pCxt
,
SAggLogicNode
*
pAgg
)
{
// todo
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -591,13 +595,13 @@ static int32_t pushDownCondOptimizeImpl(SOptimizeContext* pCxt, SLogicNode* pLog
int32_t
code
=
TSDB_CODE_SUCCESS
;
switch
(
nodeType
(
pLogicNode
))
{
case
QUERY_NODE_LOGIC_PLAN_SCAN
:
code
=
p
dc
OptDealScan
(
pCxt
,
(
SScanLogicNode
*
)
pLogicNode
);
code
=
p
ushDownCond
OptDealScan
(
pCxt
,
(
SScanLogicNode
*
)
pLogicNode
);
break
;
case
QUERY_NODE_LOGIC_PLAN_JOIN
:
code
=
p
dc
OptDealJoin
(
pCxt
,
(
SJoinLogicNode
*
)
pLogicNode
);
code
=
p
ushDownCond
OptDealJoin
(
pCxt
,
(
SJoinLogicNode
*
)
pLogicNode
);
break
;
case
QUERY_NODE_LOGIC_PLAN_AGG
:
code
=
p
dc
OptDealAgg
(
pCxt
,
(
SAggLogicNode
*
)
pLogicNode
);
code
=
p
ushDownCond
OptDealAgg
(
pCxt
,
(
SAggLogicNode
*
)
pLogicNode
);
break
;
default:
break
;
...
...
@@ -717,7 +721,7 @@ static int32_t sortPrimaryKeyOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLo
return
sortPrimaryKeyOptimizeImpl
(
pCxt
,
pLogicSubplan
,
pSort
);
}
static
bool
smaOptMayBeOptimized
(
SLogicNode
*
pNode
)
{
static
bool
sma
Index
OptMayBeOptimized
(
SLogicNode
*
pNode
)
{
if
(
QUERY_NODE_LOGIC_PLAN_SCAN
!=
nodeType
(
pNode
)
||
NULL
==
pNode
->
pParent
||
QUERY_NODE_LOGIC_PLAN_WINDOW
!=
nodeType
(
pNode
->
pParent
)
||
WINDOW_TYPE_INTERVAL
!=
((
SWindowLogicNode
*
)
pNode
->
pParent
)
->
winType
)
{
...
...
@@ -732,7 +736,8 @@ static bool smaOptMayBeOptimized(SLogicNode* pNode) {
return
true
;
}
static
int32_t
smaOptCreateMerge
(
SLogicNode
*
pChild
,
SNodeList
*
pMergeKeys
,
SNodeList
*
pTargets
,
SLogicNode
**
pOutput
)
{
static
int32_t
smaIndexOptCreateMerge
(
SLogicNode
*
pChild
,
SNodeList
*
pMergeKeys
,
SNodeList
*
pTargets
,
SLogicNode
**
pOutput
)
{
SMergeLogicNode
*
pMerge
=
(
SMergeLogicNode
*
)
nodesMakeNode
(
QUERY_NODE_LOGIC_PLAN_MERGE
);
if
(
NULL
==
pMerge
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
...
...
@@ -751,8 +756,8 @@ static int32_t smaOptCreateMerge(SLogicNode* pChild, SNodeList* pMergeKeys, SNod
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
smaOptRecombinationNode
(
SLogicSubplan
*
pLogicSubplan
,
SLogicNode
*
pInterval
,
SLogicNode
*
pMerge
,
SLogicNode
*
pSmaScan
)
{
static
int32_t
sma
Index
OptRecombinationNode
(
SLogicSubplan
*
pLogicSubplan
,
SLogicNode
*
pInterval
,
SLogicNode
*
pMerge
,
SLogicNode
*
pSmaScan
)
{
int32_t
code
=
nodesListMakeAppend
(
&
pMerge
->
pChildren
,
(
SNode
*
)
pInterval
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListMakeAppend
(
&
pMerge
->
pChildren
,
(
SNode
*
)
pSmaScan
);
...
...
@@ -765,8 +770,8 @@ static int32_t smaOptRecombinationNode(SLogicSubplan* pLogicSubplan, SLogicNode*
return
code
;
}
static
int32_t
smaOptCreateSmaScan
(
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
*
pCols
,
SLogicNode
**
pOutput
)
{
static
int32_t
sma
Index
OptCreateSmaScan
(
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
*
pCols
,
SLogicNode
**
pOutput
)
{
SScanLogicNode
*
pSmaScan
=
(
SScanLogicNode
*
)
nodesMakeNode
(
QUERY_NODE_LOGIC_PLAN_SCAN
);
if
(
NULL
==
pSmaScan
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
...
...
@@ -795,7 +800,7 @@ static int32_t smaOptCreateSmaScan(SScanLogicNode* pScan, STableIndexInfo* pInde
return
TSDB_CODE_SUCCESS
;
}
static
bool
smaOptEqualInterval
(
SScanLogicNode
*
pScan
,
SWindowLogicNode
*
pWindow
,
STableIndexInfo
*
pIndex
)
{
static
bool
sma
Index
OptEqualInterval
(
SScanLogicNode
*
pScan
,
SWindowLogicNode
*
pWindow
,
STableIndexInfo
*
pIndex
)
{
if
(
pWindow
->
interval
!=
pIndex
->
interval
||
pWindow
->
intervalUnit
!=
pIndex
->
intervalUnit
||
pWindow
->
offset
!=
pIndex
->
offset
||
pWindow
->
sliding
!=
pIndex
->
sliding
||
pWindow
->
slidingUnit
!=
pIndex
->
slidingUnit
)
{
...
...
@@ -815,7 +820,7 @@ static bool smaOptEqualInterval(SScanLogicNode* pScan, SWindowLogicNode* pWindow
return
true
;
}
static
SNode
*
smaOptCreateSmaCol
(
SNode
*
pFunc
,
uint64_t
tableId
,
int32_t
colId
)
{
static
SNode
*
sma
Index
OptCreateSmaCol
(
SNode
*
pFunc
,
uint64_t
tableId
,
int32_t
colId
)
{
SColumnNode
*
pCol
=
(
SColumnNode
*
)
nodesMakeNode
(
QUERY_NODE_COLUMN
);
if
(
NULL
==
pCol
)
{
return
NULL
;
...
...
@@ -830,7 +835,7 @@ static SNode* smaOptCreateSmaCol(SNode* pFunc, uint64_t tableId, int32_t colId)
return
(
SNode
*
)
pCol
;
}
static
int32_t
smaOptFindSmaFunc
(
SNode
*
pQueryFunc
,
SNodeList
*
pSmaFuncs
)
{
static
int32_t
sma
Index
OptFindSmaFunc
(
SNode
*
pQueryFunc
,
SNodeList
*
pSmaFuncs
)
{
int32_t
index
=
0
;
SNode
*
pSmaFunc
=
NULL
;
FOREACH
(
pSmaFunc
,
pSmaFuncs
)
{
...
...
@@ -842,8 +847,8 @@ static int32_t smaOptFindSmaFunc(SNode* pQueryFunc, SNodeList* pSmaFuncs) {
return
-
1
;
}
static
int32_t
smaOptCreateSmaCols
(
SNodeList
*
pFuncs
,
uint64_t
tableId
,
SNodeList
*
pSmaFuncs
,
SNodeList
**
pOutput
,
int32_t
*
pWStrartIndex
)
{
static
int32_t
sma
Index
OptCreateSmaCols
(
SNodeList
*
pFuncs
,
uint64_t
tableId
,
SNodeList
*
pSmaFuncs
,
SNodeList
**
pOutput
,
int32_t
*
pWStrartIndex
)
{
SNodeList
*
pCols
=
NULL
;
SNode
*
pFunc
=
NULL
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
...
...
@@ -854,11 +859,11 @@ static int32_t smaOptCreateSmaCols(SNodeList* pFuncs, uint64_t tableId, SNodeLis
if
(
FUNCTION_TYPE_WSTARTTS
==
((
SFunctionNode
*
)
pFunc
)
->
funcType
)
{
*
pWStrartIndex
=
index
;
}
smaFuncIndex
=
smaOptFindSmaFunc
(
pFunc
,
pSmaFuncs
);
smaFuncIndex
=
sma
Index
OptFindSmaFunc
(
pFunc
,
pSmaFuncs
);
if
(
smaFuncIndex
<
0
)
{
break
;
}
else
{
code
=
nodesListMakeStrictAppend
(
&
pCols
,
smaOptCreateSmaCol
(
pFunc
,
tableId
,
smaFuncIndex
+
2
));
code
=
nodesListMakeStrictAppend
(
&
pCols
,
sma
Index
OptCreateSmaCol
(
pFunc
,
tableId
,
smaFuncIndex
+
2
));
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
break
;
}
...
...
@@ -875,22 +880,22 @@ static int32_t smaOptCreateSmaCols(SNodeList* pFuncs, uint64_t tableId, SNodeLis
return
code
;
}
static
int32_t
smaOptCouldApplyIndex
(
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
**
pCols
,
int32_t
*
pWStrartIndex
)
{
static
int32_t
sma
Index
OptCouldApplyIndex
(
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
**
pCols
,
int32_t
*
pWStrartIndex
)
{
SWindowLogicNode
*
pWindow
=
(
SWindowLogicNode
*
)
pScan
->
node
.
pParent
;
if
(
!
smaOptEqualInterval
(
pScan
,
pWindow
,
pIndex
))
{
if
(
!
sma
Index
OptEqualInterval
(
pScan
,
pWindow
,
pIndex
))
{
return
TSDB_CODE_SUCCESS
;
}
SNodeList
*
pSmaFuncs
=
NULL
;
int32_t
code
=
nodesStringToList
(
pIndex
->
expr
,
&
pSmaFuncs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
smaOptCreateSmaCols
(
pWindow
->
pFuncs
,
pIndex
->
dstTbUid
,
pSmaFuncs
,
pCols
,
pWStrartIndex
);
code
=
sma
Index
OptCreateSmaCols
(
pWindow
->
pFuncs
,
pIndex
->
dstTbUid
,
pSmaFuncs
,
pCols
,
pWStrartIndex
);
}
nodesDestroyList
(
pSmaFuncs
);
return
code
;
}
static
SNode
*
smaOptCreateWStartTs
()
{
static
SNode
*
sma
Index
OptCreateWStartTs
()
{
SFunctionNode
*
pWStart
=
(
SFunctionNode
*
)
nodesMakeNode
(
QUERY_NODE_FUNCTION
);
if
(
NULL
==
pWStart
)
{
return
NULL
;
...
...
@@ -904,7 +909,7 @@ static SNode* smaOptCreateWStartTs() {
return
(
SNode
*
)
pWStart
;
}
static
int32_t
smaOptCreateMergeKey
(
SNode
*
pCol
,
SNodeList
**
pMergeKeys
)
{
static
int32_t
sma
Index
OptCreateMergeKey
(
SNode
*
pCol
,
SNodeList
**
pMergeKeys
)
{
SOrderByExprNode
*
pMergeKey
=
(
SOrderByExprNode
*
)
nodesMakeNode
(
QUERY_NODE_ORDER_BY_EXPR
);
if
(
NULL
==
pMergeKey
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
...
...
@@ -919,9 +924,9 @@ static int32_t smaOptCreateMergeKey(SNode* pCol, SNodeList** pMergeKeys) {
return
nodesListMakeStrictAppend
(
pMergeKeys
,
(
SNode
*
)
pMergeKey
);
}
static
int32_t
smaOptRewriteInterval
(
SWindowLogicNode
*
pInterval
,
int32_t
wstrartIndex
,
SNodeList
**
pMergeKeys
)
{
static
int32_t
sma
Index
OptRewriteInterval
(
SWindowLogicNode
*
pInterval
,
int32_t
wstrartIndex
,
SNodeList
**
pMergeKeys
)
{
if
(
wstrartIndex
<
0
)
{
SNode
*
pWStart
=
smaOptCreateWStartTs
();
SNode
*
pWStart
=
sma
Index
OptCreateWStartTs
();
if
(
NULL
==
pWStart
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
...
...
@@ -932,11 +937,11 @@ static int32_t smaOptRewriteInterval(SWindowLogicNode* pInterval, int32_t wstrar
}
wstrartIndex
=
LIST_LENGTH
(
pInterval
->
node
.
pTargets
)
-
1
;
}
return
smaOptCreateMergeKey
(
nodesListGetNode
(
pInterval
->
node
.
pTargets
,
wstrartIndex
),
pMergeKeys
);
return
sma
Index
OptCreateMergeKey
(
nodesListGetNode
(
pInterval
->
node
.
pTargets
,
wstrartIndex
),
pMergeKeys
);
}
static
int32_t
smaOptApplyIndexExt
(
SLogicSubplan
*
pLogicSubplan
,
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
*
pSmaCols
,
int32_t
wstrartIndex
)
{
static
int32_t
sma
Index
OptApplyIndexExt
(
SLogicSubplan
*
pLogicSubplan
,
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
*
pSmaCols
,
int32_t
wstrartIndex
)
{
SWindowLogicNode
*
pInterval
=
(
SWindowLogicNode
*
)
pScan
->
node
.
pParent
;
SNodeList
*
pMergeTargets
=
nodesCloneList
(
pInterval
->
node
.
pTargets
);
if
(
NULL
==
pMergeTargets
)
{
...
...
@@ -945,42 +950,42 @@ static int32_t smaOptApplyIndexExt(SLogicSubplan* pLogicSubplan, SScanLogicNode*
SLogicNode
*
pSmaScan
=
NULL
;
SLogicNode
*
pMerge
=
NULL
;
SNodeList
*
pMergeKeys
=
NULL
;
int32_t
code
=
smaOptRewriteInterval
(
pInterval
,
wstrartIndex
,
&
pMergeKeys
);
int32_t
code
=
sma
Index
OptRewriteInterval
(
pInterval
,
wstrartIndex
,
&
pMergeKeys
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
smaOptCreateSmaScan
(
pScan
,
pIndex
,
pSmaCols
,
&
pSmaScan
);
code
=
sma
Index
OptCreateSmaScan
(
pScan
,
pIndex
,
pSmaCols
,
&
pSmaScan
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
smaOptCreateMerge
(
pScan
->
node
.
pParent
,
pMergeKeys
,
pMergeTargets
,
&
pMerge
);
code
=
sma
Index
OptCreateMerge
(
pScan
->
node
.
pParent
,
pMergeKeys
,
pMergeTargets
,
&
pMerge
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
smaOptRecombinationNode
(
pLogicSubplan
,
pScan
->
node
.
pParent
,
pMerge
,
pSmaScan
);
code
=
sma
Index
OptRecombinationNode
(
pLogicSubplan
,
pScan
->
node
.
pParent
,
pMerge
,
pSmaScan
);
}
return
code
;
}
static
int32_t
smaOptApplyIndex
(
SLogicSubplan
*
pLogicSubplan
,
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
*
pSmaCols
,
int32_t
wstrartIndex
)
{
static
int32_t
sma
Index
OptApplyIndex
(
SLogicSubplan
*
pLogicSubplan
,
SScanLogicNode
*
pScan
,
STableIndexInfo
*
pIndex
,
SNodeList
*
pSmaCols
,
int32_t
wstrartIndex
)
{
SLogicNode
*
pSmaScan
=
NULL
;
int32_t
code
=
smaOptCreateSmaScan
(
pScan
,
pIndex
,
pSmaCols
,
&
pSmaScan
);
int32_t
code
=
sma
Index
OptCreateSmaScan
(
pScan
,
pIndex
,
pSmaCols
,
&
pSmaScan
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
replaceLogicNode
(
pLogicSubplan
,
pScan
->
node
.
pParent
,
pSmaScan
);
}
return
code
;
}
static
void
smaOptDestroySmaIndex
(
void
*
p
)
{
taosMemoryFree
(((
STableIndexInfo
*
)
p
)
->
expr
);
}
static
void
sma
Index
OptDestroySmaIndex
(
void
*
p
)
{
taosMemoryFree
(((
STableIndexInfo
*
)
p
)
->
expr
);
}
static
int32_t
smaOptimizeImpl
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
,
SScanLogicNode
*
pScan
)
{
static
int32_t
sma
Index
OptimizeImpl
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
,
SScanLogicNode
*
pScan
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
nindexes
=
taosArrayGetSize
(
pScan
->
pSmaIndexes
);
for
(
int32_t
i
=
0
;
i
<
nindexes
;
++
i
)
{
STableIndexInfo
*
pIndex
=
taosArrayGet
(
pScan
->
pSmaIndexes
,
i
);
SNodeList
*
pSmaCols
=
NULL
;
int32_t
wstrartIndex
=
-
1
;
code
=
smaOptCouldApplyIndex
(
pScan
,
pIndex
,
&
pSmaCols
,
&
wstrartIndex
);
code
=
sma
Index
OptCouldApplyIndex
(
pScan
,
pIndex
,
&
pSmaCols
,
&
wstrartIndex
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pSmaCols
)
{
code
=
smaOptApplyIndex
(
pLogicSubplan
,
pScan
,
pIndex
,
pSmaCols
,
wstrartIndex
);
taosArrayDestroyEx
(
pScan
->
pSmaIndexes
,
smaOptDestroySmaIndex
);
code
=
sma
Index
OptApplyIndex
(
pLogicSubplan
,
pScan
,
pIndex
,
pSmaCols
,
wstrartIndex
);
taosArrayDestroyEx
(
pScan
->
pSmaIndexes
,
sma
Index
OptDestroySmaIndex
);
pScan
->
pSmaIndexes
=
NULL
;
break
;
}
...
...
@@ -988,12 +993,12 @@ static int32_t smaOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubp
return
code
;
}
static
int32_t
smaOptimize
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
)
{
SScanLogicNode
*
pScan
=
(
SScanLogicNode
*
)
optFindPossibleNode
(
pLogicSubplan
->
pNode
,
smaOptMayBeOptimized
);
static
int32_t
sma
Index
Optimize
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
)
{
SScanLogicNode
*
pScan
=
(
SScanLogicNode
*
)
optFindPossibleNode
(
pLogicSubplan
->
pNode
,
sma
Index
OptMayBeOptimized
);
if
(
NULL
==
pScan
)
{
return
TSDB_CODE_SUCCESS
;
}
return
smaOptimizeImpl
(
pCxt
,
pLogicSubplan
,
pScan
);
return
sma
Index
OptimizeImpl
(
pCxt
,
pLogicSubplan
,
pScan
);
}
static
EDealRes
partTagsOptHasColImpl
(
SNode
*
pNode
,
void
*
pContext
)
{
...
...
@@ -1202,8 +1207,12 @@ static int32_t rewriteTailOptCreateLimit(SNode* pLimit, SNode* pOffset, SNode**
}
static
bool
rewriteTailOptNeedGroupSort
(
SIndefRowsFuncLogicNode
*
pIndef
)
{
return
1
==
LIST_LENGTH
(
pIndef
->
node
.
pChildren
)
&&
QUERY_NODE_LOGIC_PLAN_PARTITION
==
nodeType
(
nodesListGetNode
(
pIndef
->
node
.
pChildren
,
0
));
if
(
1
!=
LIST_LENGTH
(
pIndef
->
node
.
pChildren
))
{
return
false
;
}
SNode
*
pChild
=
nodesListGetNode
(
pIndef
->
node
.
pChildren
,
0
);
return
QUERY_NODE_LOGIC_PLAN_PARTITION
==
nodeType
(
pChild
)
||
(
QUERY_NODE_LOGIC_PLAN_SCAN
==
nodeType
(
pChild
)
&&
NULL
!=
((
SScanLogicNode
*
)
pChild
)
->
pPartTags
);
}
static
int32_t
rewriteTailOptCreateSort
(
SIndefRowsFuncLogicNode
*
pIndef
,
SLogicNode
**
pOutput
)
{
...
...
@@ -1353,14 +1362,14 @@ static int32_t eliminateSetOpOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLo
// clang-format off
static
const
SOptimizeRule
optimizeRuleSet
[]
=
{
{.
pName
=
"
PickScanPath"
,
.
optimizeFunc
=
pickS
canPathOptimize
},
{.
pName
=
"
ScanPath"
,
.
optimizeFunc
=
s
canPathOptimize
},
{.
pName
=
"PushDownCondition"
,
.
optimizeFunc
=
pushDownCondOptimize
},
{.
pName
=
"SortPrimaryKey"
,
.
optimizeFunc
=
sortPrimaryKeyOptimize
},
{.
pName
=
"Sma
"
,
.
optimizeFunc
=
sma
Optimize
},
{.
pName
=
"Sma
Index"
,
.
optimizeFunc
=
smaIndex
Optimize
},
{.
pName
=
"PartitionTags"
,
.
optimizeFunc
=
partTagsOptimize
},
{.
pName
=
"EliminateProject"
,
.
optimizeFunc
=
eliminateProjOptimize
},
{.
pName
=
"EliminateSetOperator"
,
.
optimizeFunc
=
eliminateSetOpOptimize
},
//
{.pName = "RewriteTail", .optimizeFunc = rewriteTailOptimize}
{.
pName
=
"RewriteTail"
,
.
optimizeFunc
=
rewriteTailOptimize
}
};
// clang-format on
...
...
source/libs/planner/src/planSpliter.c
浏览文件 @
732a91c9
...
...
@@ -775,6 +775,7 @@ static int32_t stbSplCreatePartSortNode(SSortLogicNode* pSort, SLogicNode** pOut
pPartSort
->
node
.
pChildren
=
pChildren
;
splSetParent
((
SLogicNode
*
)
pPartSort
);
pPartSort
->
pSortKeys
=
pSortKeys
;
pPartSort
->
groupSort
=
pSort
->
groupSort
;
code
=
stbSplCreateMergeKeys
(
pPartSort
->
pSortKeys
,
pPartSort
->
node
.
pTargets
,
&
pMergeKeys
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录