Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
jobily
TDengine
提交
ac35ae98
T
TDengine
项目概览
jobily
/
TDengine
9 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ac35ae98
编写于
7月 03, 2023
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: add dynamic query ctrl operator
上级
02cec497
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
166 addition
and
46 deletion
+166
-46
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+9
-0
source/libs/executor/inc/dynqueryctrl.h
source/libs/executor/inc/dynqueryctrl.h
+30
-0
source/libs/executor/inc/groupcache.h
source/libs/executor/inc/groupcache.h
+7
-14
source/libs/executor/src/dynqueryctrloperator.c
source/libs/executor/src/dynqueryctrloperator.c
+82
-0
source/libs/executor/src/groupcacheoperator.c
source/libs/executor/src/groupcacheoperator.c
+15
-29
source/libs/executor/src/hashjoinoperator.c
source/libs/executor/src/hashjoinoperator.c
+5
-0
source/libs/nodes/src/nodesMsgFuncs.c
source/libs/nodes/src/nodesMsgFuncs.c
+8
-1
source/libs/planner/src/planOptimizer.c
source/libs/planner/src/planOptimizer.c
+1
-0
source/libs/planner/src/planPhysiCreater.c
source/libs/planner/src/planPhysiCreater.c
+1
-0
source/libs/planner/src/planSpliter.c
source/libs/planner/src/planSpliter.c
+8
-2
未找到文件。
include/libs/nodes/plannodes.h
浏览文件 @
ac35ae98
...
...
@@ -325,6 +325,7 @@ typedef struct SDataBlockDescNode {
typedef
struct
SPhysiNode
{
ENodeType
type
;
bool
dynamicOp
;
EOrder
inputTsOrder
;
EOrder
outputTsOrder
;
SDataBlockDescNode
*
pOutputDataBlockDesc
;
...
...
@@ -443,9 +444,17 @@ typedef struct SGroupCachePhysiNode {
SNodeList
*
pGroupCols
;
}
SGroupCachePhysiNode
;
typedef
struct
SStbJoinDynCtrlInfo
{
int32_t
vgSlot
[
2
];
int32_t
uidSlot
[
2
];
}
SStbJoinDynCtrlInfo
;
typedef
struct
SDynQueryCtrlPhysiNode
{
SPhysiNode
node
;
EDynQueryType
qType
;
union
{
SStbJoinDynCtrlInfo
stbJoin
;
};
}
SDynQueryCtrlPhysiNode
;
typedef
struct
SAggPhysiNode
{
...
...
source/libs/executor/inc/dynqueryctrl.h
0 → 100755
浏览文件 @
ac35ae98
/*
* 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_DYNQUERYCTRL_H
#define TDENGINE_DYNQUERYCTRL_H
#ifdef __cplusplus
extern
"C"
{
#endif
typedef
struct
SDynQueryCtrlOperatorInfo
{
SStbJoinDynCtrlInfo
ctrlInfo
;
}
SDynQueryCtrlOperatorInfo
;
#ifdef __cplusplus
}
#endif
#endif // TDENGINE_DYNQUERYCTRL_H
source/libs/executor/inc/groupcache.h
浏览文件 @
ac35ae98
...
...
@@ -21,17 +21,10 @@ extern "C" {
#define GROUP_CACHE_DEFAULT_PAGE_SIZE 10485760
typedef
struct
SGcSessionCtx
{
SOperatorInfo
*
pDownstream
;
bool
cacheHit
;
bool
needCache
;
SGcBlkBufInfo
*
pLastBlk
;
}
SGcSessionCtx
;
typedef
struct
SGcOperatorParam
{
SOperatorBasicParam
basic
;
int64_t
sessionId
;
int32_t
downstream
Key
;
int32_t
downstream
Idx
;
bool
needCache
;
void
*
pGroupValue
;
int32_t
groupValueSize
;
...
...
@@ -71,18 +64,18 @@ typedef struct SGroupColsInfo {
char
*
pData
;
}
SGroupColsInfo
;
typedef
struct
SGcDownstreamInfo
{
SSHashObj
*
pKey2Idx
;
SOperatorInfo
**
ppDownStream
;
int32_t
downStreamNum
;
}
SGcDownstreamInfo
;
typedef
struct
SGcSessionCtx
{
SOperatorInfo
*
pDownstream
;
bool
cacheHit
;
bool
needCache
;
SGcBlkBufInfo
*
pLastBlk
;
}
SGcSessionCtx
;
typedef
struct
SGroupCacheOperatorInfo
{
SSHashObj
*
pSessionHash
;
SGroupColsInfo
groupColsInfo
;
SArray
*
pBlkBufs
;
SSHashObj
*
pBlkHash
;
SGcDownstreamInfo
downstreamInfo
;
int64_t
pCurrentId
;
SGcSessionCtx
*
pCurrent
;
}
SGroupCacheOperatorInfo
;
...
...
source/libs/executor/src/dynqueryctrloperator.c
0 → 100755
浏览文件 @
ac35ae98
/*
* 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/>.
*/
#include "executorInt.h"
#include "filter.h"
#include "function.h"
#include "operator.h"
#include "os.h"
#include "querynodes.h"
#include "querytask.h"
#include "tcompare.h"
#include "tdatablock.h"
#include "thash.h"
#include "tmsg.h"
#include "ttypes.h"
#include "dynqueryctrl.h"
static
void
destroyDynQueryCtrlOperator
(
void
*
param
)
{
SDynQueryCtrlOperatorInfo
*
pDynCtrlOperator
=
(
SDynQueryCtrlOperatorInfo
*
)
param
;
taosMemoryFreeClear
(
param
);
}
SSDataBlock
*
getBlockFromDynQueryCtrl
(
SOperatorInfo
*
pOperator
)
{
SDynQueryCtrlOperatorInfo
*
pInfo
=
pOperator
->
info
;
while
(
true
)
{
SSDataBlock
*
pBlock
=
pOperator
->
pDownstream
[
0
]
->
fpSet
.
getNextFn
(
pOperator
->
pDownstream
[
0
]);
if
(
NULL
==
pBlock
)
{
break
;
}
addBlkToGroupCache
(
pOperator
,
pBlock
,
&
pRes
);
}
}
SOperatorInfo
*
createDynQueryCtrlOperatorInfo
(
SOperatorInfo
**
pDownstream
,
int32_t
numOfDownstream
,
SDynQueryCtrlPhysiNode
*
pPhyciNode
,
SExecTaskInfo
*
pTaskInfo
)
{
SDynQueryCtrlOperatorInfo
*
pInfo
=
taosMemoryCalloc
(
1
,
sizeof
(
SDynQueryCtrlOperatorInfo
));
SOperatorInfo
*
pOperator
=
taosMemoryCalloc
(
1
,
sizeof
(
SOperatorInfo
));
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
pOperator
==
NULL
||
pInfo
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_error
;
}
code
=
appendDownstream
(
pOperator
,
pDownstream
,
numOfDownstream
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
goto
_error
;
}
memcpy
(
&
pInfo
->
ctrlInfo
,
&
pPhyciNode
->
stbJoin
,
sizeof
(
pPhyciNode
->
stbJoin
));
setOperatorInfo
(
pOperator
,
"DynQueryCtrlOperator"
,
QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL
,
false
,
OP_NOT_OPENED
,
pInfo
,
pTaskInfo
);
pOperator
->
fpSet
=
createOperatorFpSet
(
optrDummyOpenFn
,
getBlockFromDynQueryCtrl
,
NULL
,
destroyDynQueryCtrlOperator
,
optrDefaultBufFn
,
NULL
,
NULL
,
NULL
);
return
pOperator
;
_error:
if
(
pInfo
!=
NULL
)
{
destroyDynQueryCtrlOperator
(
pInfo
);
}
taosMemoryFree
(
pOperator
);
pTaskInfo
->
code
=
code
;
return
NULL
;
}
source/libs/executor/src/groupcacheoperator.c
浏览文件 @
ac35ae98
...
...
@@ -74,14 +74,12 @@ static void destroyGroupCacheOperator(void* param) {
taosArrayDestroyEx
(
pGrpCacheOperator
->
pBlkBufs
,
freeGroupCacheBufPage
);
tSimpleHashCleanup
(
pGrpCacheOperator
->
pSessionHash
);
tSimpleHashCleanup
(
pGrpCacheOperator
->
pBlkHash
);
tSimpleHashCleanup
(
pGrpCacheOperator
->
downstreamInfo
.
pKey2Idx
);
taosMemoryFree
(
pGrpCacheOperator
->
downstreamInfo
.
ppDownStream
);
taosMemoryFreeClear
(
param
);
}
static
FORCE_INLINE
int32_t
addPageToGroupCacheBuf
(
SArray
*
pBlkBufs
)
{
SBufPageInfo
page
;
S
Gc
BufPageInfo
page
;
page
.
pageSize
=
GROUP_CACHE_DEFAULT_PAGE_SIZE
;
page
.
offset
=
0
;
page
.
data
=
taosMemoryMalloc
(
page
.
pageSize
);
...
...
@@ -94,7 +92,7 @@ static FORCE_INLINE int32_t addPageToGroupCacheBuf(SArray* pBlkBufs) {
}
static
FORCE_INLINE
char
*
retrieveBlkFromBlkBufs
(
SArray
*
pBlkBufs
,
SGcBlkBufInfo
*
pBlkInfo
)
{
SBufPageInfo
*
pPage
=
taosArrayGet
(
pBlkBufs
,
pBlkInfo
->
pageId
);
S
Gc
BufPageInfo
*
pPage
=
taosArrayGet
(
pBlkBufs
,
pBlkInfo
->
pageId
);
return
pPage
->
data
+
pBlkInfo
->
offset
;
}
...
...
@@ -105,7 +103,7 @@ static FORCE_INLINE char* moveRetrieveBlkFromBlkBufs(SArray* pBlkBufs, SGcBlkBuf
SGcBlkBufInfo
*
pCurr
=
(
*
ppLastBlk
)
->
next
;
*
ppLastBlk
=
pCurr
;
if
(
pCurr
)
{
SBufPageInfo
*
pPage
=
taosArrayGet
(
pBlkBufs
,
pCurr
->
pageId
);
S
Gc
BufPageInfo
*
pPage
=
taosArrayGet
(
pBlkBufs
,
pCurr
->
pageId
);
return
pPage
->
data
+
pCurr
->
offset
;
}
...
...
@@ -114,7 +112,7 @@ static FORCE_INLINE char* moveRetrieveBlkFromBlkBufs(SArray* pBlkBufs, SGcBlkBuf
static
int32_t
initGroupCacheBufPages
(
SGroupCacheOperatorInfo
*
pInfo
)
{
pInfo
->
pBlkBufs
=
taosArrayInit
(
32
,
sizeof
(
SBufPageInfo
));
pInfo
->
pBlkBufs
=
taosArrayInit
(
32
,
sizeof
(
S
Gc
BufPageInfo
));
if
(
NULL
==
pInfo
->
pBlkBufs
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
...
...
@@ -128,47 +126,35 @@ static int32_t initGroupCacheDownstreamInfo(SGroupCachePhysiNode* pPhyciNode, SO
return
TSDB_CODE_OUT_OF_MEMORY
;
}
memcpy
(
pInfo
->
ppDownStream
,
pDownstream
,
numOfDownstream
*
POINTER_BYTES
);
pInfo
->
pKey2Idx
=
tSimpleHashInit
(
numOfDownstream
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
));
if
(
NULL
==
pInfo
->
pKey2Idx
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
for
(
int32_t
i
=
0
;
i
<
numOfDownstream
;
++
i
)
{
int32_t
keyValue
=
taosArrayGet
(
pPhyciNode
,
i
);
tSimpleHashPut
(
pInfo
->
pKey2Idx
,
&
keyValue
,
sizeof
(
keyValue
),
&
i
,
sizeof
(
i
));
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
initGroupCacheSession
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcOperatorParam
*
pParam
,
SGcSessionCtx
**
ppSession
)
{
static
int32_t
initGroupCacheSession
(
struct
SOperatorInfo
*
pOperator
,
SGcOperatorParam
*
pParam
,
SGcSessionCtx
**
ppSession
)
{
SGcSessionCtx
ctx
=
{
0
};
SGroupCacheOperatorInfo
*
pGCache
=
pOperator
->
info
;
SGroupData
*
pGroup
=
tSimpleHashGet
(
pGCache
->
pBlkHash
,
pParam
->
pGroupValue
,
pParam
->
groupValueSize
);
if
(
pGroup
)
{
ctx
.
cacheHit
=
true
;
ctx
.
pLastBlk
=
pGroup
->
blks
;
}
else
{
int32_t
*
pIdx
=
tSimpleHashGet
(
pGCache
->
downstreamInfo
.
pKey2Idx
,
&
pParam
->
downstreamKey
,
sizeof
(
pParam
->
downstreamKey
));
if
(
NULL
==
pIdx
)
{
qError
(
"Invalid downstream key value: %d"
,
pParam
->
downstreamKey
);
return
TSDB_CODE_INVALID_PARA
;
}
ctx
.
pDownstream
=
pGCache
->
downstreamInfo
.
ppDownStream
[
*
pIdx
];
ctx
.
pDownstream
=
pOperator
->
pDownstream
[
pParam
->
downstreamIdx
];
ctx
.
needCache
=
pParam
->
needCache
;
}
return
TSDB_CODE_SUCCESS
;
}
static
void
getFromSessionCache
(
SExecTaskInfo
*
pTaskInfo
,
SGroupCacheOperatorInfo
*
pGCache
,
SGcOperatorParam
*
pParam
,
SSDataBlock
**
ppRes
,
SGcSessionCtx
**
ppSession
)
{
static
void
getFromSessionCache
(
struct
SOperatorInfo
*
pOperator
,
SGroupCacheOperatorInfo
*
pGCache
,
SGcOperatorParam
*
pParam
,
SSDataBlock
**
ppRes
,
SGcSessionCtx
**
ppSession
)
{
SExecTaskInfo
*
pTaskInfo
=
pOperator
->
pTaskInfo
;
if
(
pParam
->
basic
.
newExec
)
{
int32_t
code
=
initGroupCacheSession
(
p
GCache
,
pParam
,
ppSession
);
int32_t
code
=
initGroupCacheSession
(
p
Operator
,
pParam
,
ppSession
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
pTaskInfo
->
code
=
code
;
T_LONG_JMP
(
pTaskInfo
->
env
,
pTaskInfo
->
code
);
}
if
((
*
ppSession
)
->
pLastBlk
)
{
*
ppRes
=
retrieveBlkFromBlkBufs
(
pGCache
->
pBlkBufs
,
(
*
ppSession
)
->
pLastBlk
);
*
ppRes
=
(
SSDataBlock
*
)
retrieveBlkFromBlkBufs
(
pGCache
->
pBlkBufs
,
(
*
ppSession
)
->
pLastBlk
);
}
else
{
*
ppRes
=
NULL
;
}
...
...
@@ -184,7 +170,7 @@ static void getFromSessionCache(SExecTaskInfo* pTaskInfo, SGroupCacheOperatorInf
*
ppSession
=
pCtx
;
if
(
pCtx
->
cacheHit
)
{
*
ppRes
=
moveRetrieveBlkFromBlkBufs
(
pGCache
->
pBlkBufs
,
&
pCtx
->
pLastBlk
);
*
ppRes
=
(
SSDataBlock
*
)
moveRetrieveBlkFromBlkBufs
(
pGCache
->
pBlkBufs
,
&
pCtx
->
pLastBlk
);
return
;
}
...
...
@@ -223,7 +209,7 @@ static SSDataBlock* getFromGroupCache(struct SOperatorInfo* pOperator, SOperator
return
NULL
;
}
getFromSessionCache
(
p
TaskInfo
,
pGCache
,
pParam
,
&
pRes
,
&
pSession
);
getFromSessionCache
(
p
Operator
,
pGCache
,
pParam
,
&
pRes
,
&
pSession
);
pGCache
->
pCurrent
=
pSession
;
pGCache
->
pCurrentId
=
pParam
->
sessionId
;
...
...
@@ -283,8 +269,8 @@ SOperatorInfo* createGroupCacheOperatorInfo(SOperatorInfo** pDownstream, int32_t
goto
_error
;
}
code
=
initGroupCacheDownstreamInfo
(
pPhyciNode
,
pDownstream
,
numOfDownstream
,
&
pInfo
->
downstreamInfo
);
if
(
code
)
{
code
=
appendDownstream
(
pOperator
,
pDownstream
,
numOfDownstream
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
goto
_error
;
}
...
...
source/libs/executor/src/hashjoinoperator.c
浏览文件 @
ac35ae98
...
...
@@ -810,6 +810,11 @@ SOperatorInfo* createHashJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t n
goto
_error
;
}
code
=
appendDownstream
(
pOperator
,
pDownstream
,
numOfDownstream
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
goto
_error
;
}
pOperator
->
fpSet
=
createOperatorFpSet
(
optrDummyOpenFn
,
doHashJoin
,
NULL
,
destroyHashJoinOperator
,
optrDefaultBufFn
,
NULL
,
NULL
,
NULL
);
return
pOperator
;
...
...
source/libs/nodes/src/nodesMsgFuncs.c
浏览文件 @
ac35ae98
...
...
@@ -1853,7 +1853,8 @@ enum {
PHY_NODE_CODE_LIMIT
,
PHY_NODE_CODE_SLIMIT
,
PHY_NODE_CODE_INPUT_TS_ORDER
,
PHY_NODE_CODE_OUTPUT_TS_ORDER
PHY_NODE_CODE_OUTPUT_TS_ORDER
,
PHY_NODE_CODE_DYNAMIC_OP
,
};
static
int32_t
physiNodeToMsg
(
const
void
*
pObj
,
STlvEncoder
*
pEncoder
)
{
...
...
@@ -1878,6 +1879,9 @@ static int32_t physiNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeEnum
(
pEncoder
,
PHY_NODE_CODE_OUTPUT_TS_ORDER
,
pNode
->
outputTsOrder
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeBool
(
pEncoder
,
PHY_NODE_CODE_DYNAMIC_OP
,
pNode
->
dynamicOp
);
}
return
code
;
}
...
...
@@ -1910,6 +1914,9 @@ static int32_t msgToPhysiNode(STlvDecoder* pDecoder, void* pObj) {
case
PHY_NODE_CODE_OUTPUT_TS_ORDER
:
code
=
tlvDecodeEnum
(
pTlv
,
&
pNode
->
outputTsOrder
,
sizeof
(
pNode
->
outputTsOrder
));
break
;
case
PHY_NODE_CODE_DYNAMIC_OP
:
code
=
tlvDecodeBool
(
pTlv
,
&
pNode
->
dynamicOp
);
break
;
default:
break
;
}
...
...
source/libs/planner/src/planOptimizer.c
浏览文件 @
ac35ae98
...
...
@@ -3210,6 +3210,7 @@ static int32_t stbJoinOptCreateTableScanNodes(SLogicNode* pJoin, SNodeList** ppL
break
;
}
pScan
->
node
.
dynamicOp
=
true
;
pScan
->
scanType
=
SCAN_TYPE_TABLE
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
...
source/libs/planner/src/planPhysiCreater.c
浏览文件 @
ac35ae98
...
...
@@ -366,6 +366,7 @@ static SPhysiNode* makePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode
TSWAP
(
pPhysiNode
->
pLimit
,
pLogicNode
->
pLimit
);
TSWAP
(
pPhysiNode
->
pSlimit
,
pLogicNode
->
pSlimit
);
pPhysiNode
->
dynamicOp
=
pLogicNode
->
dynamicOp
;
pPhysiNode
->
inputTsOrder
=
pLogicNode
->
inputTsOrder
;
pPhysiNode
->
outputTsOrder
=
pLogicNode
->
outputTsOrder
;
...
...
source/libs/planner/src/planSpliter.c
浏览文件 @
ac35ae98
...
...
@@ -1204,7 +1204,11 @@ static int32_t stbSplSplitJoinNodeImpl(SSplitContext* pCxt, SLogicSubplan* pSubp
SNode
*
pChild
=
NULL
;
FOREACH
(
pChild
,
pJoin
->
node
.
pChildren
)
{
if
(
QUERY_NODE_LOGIC_PLAN_SCAN
==
nodeType
(
pChild
))
{
code
=
stbSplSplitMergeScanNode
(
pCxt
,
pSubplan
,
(
SScanLogicNode
*
)
pChild
,
false
);
if
(
pJoin
->
node
.
dynamicOp
)
{
code
=
TSDB_CODE_SUCCESS
;
}
else
{
code
=
stbSplSplitMergeScanNode
(
pCxt
,
pSubplan
,
(
SScanLogicNode
*
)
pChild
,
false
);
}
}
else
if
(
QUERY_NODE_LOGIC_PLAN_JOIN
==
nodeType
(
pChild
))
{
code
=
stbSplSplitJoinNodeImpl
(
pCxt
,
pSubplan
,
(
SJoinLogicNode
*
)
pChild
);
}
else
{
...
...
@@ -1220,7 +1224,9 @@ static int32_t stbSplSplitJoinNodeImpl(SSplitContext* pCxt, SLogicSubplan* pSubp
static
int32_t
stbSplSplitJoinNode
(
SSplitContext
*
pCxt
,
SStableSplitInfo
*
pInfo
)
{
int32_t
code
=
stbSplSplitJoinNodeImpl
(
pCxt
,
pInfo
->
pSubplan
,
(
SJoinLogicNode
*
)
pInfo
->
pSplitNode
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pInfo
->
pSubplan
->
subplanType
=
SUBPLAN_TYPE_MERGE
;
if
(
!
pInfo
->
pSplitNode
->
dynamicOp
)
{
pInfo
->
pSubplan
->
subplanType
=
SUBPLAN_TYPE_MERGE
;
}
SPLIT_FLAG_SET_MASK
(
pInfo
->
pSubplan
->
splitFlag
,
SPLIT_FLAG_STABLE_SPLIT
);
}
return
code
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录