Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
2312f103
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
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看板
提交
2312f103
编写于
7月 14, 2023
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: support concurrent fetch from group cache
上级
6763c6f9
变更
11
展开全部
隐藏空白更改
内联
并排
Showing
11 changed file
with
519 addition
and
149 deletion
+519
-149
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+3
-1
source/libs/executor/inc/executorInt.h
source/libs/executor/inc/executorInt.h
+6
-3
source/libs/executor/inc/groupcache.h
source/libs/executor/inc/groupcache.h
+61
-18
source/libs/executor/src/dynqueryctrloperator.c
source/libs/executor/src/dynqueryctrloperator.c
+12
-11
source/libs/executor/src/exchangeoperator.c
source/libs/executor/src/exchangeoperator.c
+30
-9
source/libs/executor/src/groupcacheoperator.c
source/libs/executor/src/groupcacheoperator.c
+317
-91
source/libs/executor/src/operator.c
source/libs/executor/src/operator.c
+25
-16
source/libs/nodes/src/nodesCodeFuncs.c
source/libs/nodes/src/nodesCodeFuncs.c
+35
-0
source/libs/nodes/src/nodesMsgFuncs.c
source/libs/nodes/src/nodesMsgFuncs.c
+22
-0
source/libs/planner/src/planOptimizer.c
source/libs/planner/src/planOptimizer.c
+6
-0
source/libs/planner/src/planPhysiCreater.c
source/libs/planner/src/planPhysiCreater.c
+2
-0
未找到文件。
include/libs/nodes/plannodes.h
浏览文件 @
2312f103
...
@@ -160,6 +160,8 @@ typedef struct SInterpFuncLogicNode {
...
@@ -160,6 +160,8 @@ typedef struct SInterpFuncLogicNode {
typedef
struct
SGroupCacheLogicNode
{
typedef
struct
SGroupCacheLogicNode
{
SLogicNode
node
;
SLogicNode
node
;
bool
grpColsMayBeNull
;
bool
grpColsMayBeNull
;
bool
grpByUid
;
bool
globalGrp
;
SNodeList
*
pGroupCols
;
SNodeList
*
pGroupCols
;
}
SGroupCacheLogicNode
;
}
SGroupCacheLogicNode
;
...
@@ -441,8 +443,8 @@ typedef struct SHashJoinPhysiNode {
...
@@ -441,8 +443,8 @@ typedef struct SHashJoinPhysiNode {
typedef
struct
SGroupCachePhysiNode
{
typedef
struct
SGroupCachePhysiNode
{
SPhysiNode
node
;
SPhysiNode
node
;
bool
grpColsMayBeNull
;
bool
grpColsMayBeNull
;
SArray
*
pDownstreamKey
;
bool
grpByUid
;
bool
grpByUid
;
bool
globalGrp
;
SNodeList
*
pGroupCols
;
SNodeList
*
pGroupCols
;
}
SGroupCachePhysiNode
;
}
SGroupCachePhysiNode
;
...
...
source/libs/executor/inc/executorInt.h
浏览文件 @
2312f103
...
@@ -109,8 +109,8 @@ typedef struct SGcOperatorParam {
...
@@ -109,8 +109,8 @@ typedef struct SGcOperatorParam {
int64_t
sessionId
;
int64_t
sessionId
;
int32_t
downstreamIdx
;
int32_t
downstreamIdx
;
bool
needCache
;
bool
needCache
;
void
*
pGroupValue
;
int32_t
vgId
;
int
32_t
groupValueSize
;
int
64_t
tbUid
;
}
SGcOperatorParam
;
}
SGcOperatorParam
;
typedef
struct
SExprSupp
{
typedef
struct
SExprSupp
{
...
@@ -158,7 +158,7 @@ typedef struct SExchangeOperatorBasicParam {
...
@@ -158,7 +158,7 @@ typedef struct SExchangeOperatorBasicParam {
typedef
struct
SExchangeOperatorBatchParam
{
typedef
struct
SExchangeOperatorBatchParam
{
bool
multiParams
;
bool
multiParams
;
S
Array
*
pBatchs
;
// SArray<SExchangeOperatorBasicParam>
S
SHashObj
*
pBatchs
;
// SExchangeOperatorBasicParam
}
SExchangeOperatorBatchParam
;
}
SExchangeOperatorBatchParam
;
typedef
struct
SExchangeOperatorParam
{
typedef
struct
SExchangeOperatorParam
{
...
@@ -717,6 +717,9 @@ uint64_t calcGroupId(char* pData, int32_t len);
...
@@ -717,6 +717,9 @@ uint64_t calcGroupId(char* pData, int32_t len);
void
streamOpReleaseState
(
struct
SOperatorInfo
*
pOperator
);
void
streamOpReleaseState
(
struct
SOperatorInfo
*
pOperator
);
void
streamOpReloadState
(
struct
SOperatorInfo
*
pOperator
);
void
streamOpReloadState
(
struct
SOperatorInfo
*
pOperator
);
void
destroyOperatorParamValue
(
void
*
pValues
);
int32_t
mergeOperatorParams
(
SOperatorParam
*
pDst
,
SOperatorParam
*
pSrc
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif
#endif
...
...
source/libs/executor/inc/groupcache.h
浏览文件 @
2312f103
...
@@ -19,21 +19,27 @@
...
@@ -19,21 +19,27 @@
extern
"C"
{
extern
"C"
{
#endif
#endif
#define GROUP_CACHE_DEFAULT_
PAGE_SIZE 1048576
0
#define GROUP_CACHE_DEFAULT_
MAX_FILE_SIZE 10485760
0
#pragma pack(push, 1)
#pragma pack(push, 1)
typedef
struct
SGcBlkBufInfo
{
typedef
struct
SGcBlkBufInfo
{
void
*
prev
;
void
*
next
;
void
*
next
;
uint16_t
pageId
;
int64_t
blkId
;
int32_t
offset
;
int64_t
offset
;
int64_t
bufSize
;
void
*
pBuf
;
uint32_t
fileId
;
}
SGcBlkBufInfo
;
}
SGcBlkBufInfo
;
#pragma pack(pop)
#pragma pack(pop)
typedef
struct
SGcBufPageInfo
{
int32_t
pageSize
;
typedef
struct
SGcVgroupCtx
{
int32_t
offset
;
SArray
*
pTbList
;
char
*
data
;
uint64_t
lastUid
;
}
SGcBufPageInfo
;
int64_t
fileSize
;
uint32_t
fileId
;
}
SGcVgroupCtx
;
typedef
struct
SGroupCacheData
{
typedef
struct
SGroupCacheData
{
TdThreadMutex
mutex
;
TdThreadMutex
mutex
;
...
@@ -41,8 +47,13 @@ typedef struct SGroupCacheData {
...
@@ -41,8 +47,13 @@ typedef struct SGroupCacheData {
bool
fetchDone
;
bool
fetchDone
;
bool
needCache
;
bool
needCache
;
SSDataBlock
*
pBlock
;
SSDataBlock
*
pBlock
;
SGcBlkBufInfo
*
pFirstBlk
;
SGcVgroupCtx
*
pVgCtx
;
SGcBlkBufInfo
*
pLastBlk
;
int32_t
downstreamIdx
;
int32_t
vgId
;
uint32_t
fileId
;
int64_t
startBlkId
;
int64_t
endBlkId
;
int64_t
startOffset
;
}
SGroupCacheData
;
}
SGroupCacheData
;
typedef
struct
SGroupColInfo
{
typedef
struct
SGroupColInfo
{
...
@@ -62,15 +73,22 @@ typedef struct SGroupColsInfo {
...
@@ -62,15 +73,22 @@ typedef struct SGroupColsInfo {
}
SGroupColsInfo
;
}
SGroupColsInfo
;
typedef
struct
SGcNewGroupInfo
{
typedef
struct
SGcNewGroupInfo
{
int64_t
uid
;
int32_t
vgId
;
SOperatorParam
*
pParam
;
int64_t
uid
;
SGroupCacheData
*
pGroup
;
SOperatorParam
*
pParam
;
}
SGcNewGroupInfo
;
}
SGcNewGroupInfo
;
typedef
struct
SGcDownstreamCtx
{
typedef
struct
SGcDownstreamCtx
{
SRWLatch
l
ock
;
SRWLatch
grpL
ock
;
int64_t
fetchSessionId
;
int64_t
fetchSessionId
;
SArray
*
pNewGrpList
;
// SArray<SGcNewGroupInfo>
SArray
*
pNewGrpList
;
// SArray<SGcNewGroupInfo>
SArray
*
pGrpUidList
;
SSHashObj
*
pVgTbHash
;
SHashObj
*
pGrpHash
;
SRWLatch
blkLock
;
SSDataBlock
*
pBaseBlock
;
SArray
*
pFreeBlock
;
int64_t
lastBlkUid
;
}
SGcDownstreamCtx
;
}
SGcDownstreamCtx
;
typedef
struct
SGcSessionCtx
{
typedef
struct
SGcSessionCtx
{
...
@@ -78,7 +96,8 @@ typedef struct SGcSessionCtx {
...
@@ -78,7 +96,8 @@ typedef struct SGcSessionCtx {
bool
needCache
;
bool
needCache
;
SGcOperatorParam
*
pParam
;
SGcOperatorParam
*
pParam
;
SGroupCacheData
*
pGroupData
;
SGroupCacheData
*
pGroupData
;
SGcBlkBufInfo
*
pLastBlk
;
int64_t
lastBlkId
;
int64_t
nextOffset
;
bool
semInit
;
bool
semInit
;
tsem_t
waitSem
;
tsem_t
waitSem
;
}
SGcSessionCtx
;
}
SGcSessionCtx
;
...
@@ -88,14 +107,38 @@ typedef struct SGcExecInfo {
...
@@ -88,14 +107,38 @@ typedef struct SGcExecInfo {
int64_t
*
pDownstreamBlkNum
;
int64_t
*
pDownstreamBlkNum
;
}
SGcExecInfo
;
}
SGcExecInfo
;
typedef
struct
SGcCacheFile
{
uint32_t
grpNum
;
uint32_t
grpDone
;
int64_t
fileSize
;
}
SGcCacheFile
;
typedef
struct
SGcReadBlkInfo
{
SSDataBlock
*
pBlock
;
int64_t
nextOffset
;
}
SGcReadBlkInfo
;
typedef
struct
SGcBlkCacheInfo
{
SRWLatch
dirtyLock
;
SSHashObj
*
pCacheFile
;
SHashObj
*
pDirtyBlk
;
SGcBlkBufInfo
*
pDirtyHead
;
SGcBlkBufInfo
*
pDirtyTail
;
SHashObj
*
pReadBlk
;
int64_t
blkCacheSize
;
}
SGcBlkCacheInfo
;
typedef
struct
SGroupCacheOperatorInfo
{
typedef
struct
SGroupCacheOperatorInfo
{
TdThreadMutex
sessionMutex
;
TdThreadMutex
sessionMutex
;
SSHashObj
*
pSessionHash
;
int64_t
maxCacheSize
;
int64_t
currentBlkId
;
SHashObj
*
pSessionHash
;
SGroupColsInfo
groupColsInfo
;
SGroupColsInfo
groupColsInfo
;
bool
globalGrp
;
bool
grpByUid
;
bool
grpByUid
;
SGcDownstreamCtx
*
pDownstreams
;
SGcDownstreamCtx
*
pDownstreams
;
S
Array
*
pBlkBufs
;
S
GcBlkCacheInfo
blkCache
;
SHashObj
*
p
Blk
Hash
;
SHashObj
*
p
Grp
Hash
;
SGcExecInfo
execInfo
;
SGcExecInfo
execInfo
;
}
SGroupCacheOperatorInfo
;
}
SGroupCacheOperatorInfo
;
...
...
source/libs/executor/src/dynqueryctrloperator.c
浏览文件 @
2312f103
...
@@ -36,7 +36,7 @@ static void destroyDynQueryCtrlOperator(void* param) {
...
@@ -36,7 +36,7 @@ static void destroyDynQueryCtrlOperator(void* param) {
taosMemoryFreeClear
(
param
);
taosMemoryFreeClear
(
param
);
}
}
static
FORCE_INLINE
int32_t
buildGroupCacheOperatorParam
(
SOperatorParam
**
ppRes
,
int32_t
downstreamIdx
,
bool
needCache
,
void
*
pGrpValue
,
int32_t
grpValSize
,
SOperatorParam
*
pChild
)
{
static
FORCE_INLINE
int32_t
buildGroupCacheOperatorParam
(
SOperatorParam
**
ppRes
,
int32_t
downstreamIdx
,
bool
needCache
,
int32_t
vgId
,
int64_t
tbUid
,
SOperatorParam
*
pChild
)
{
*
ppRes
=
taosMemoryMalloc
(
sizeof
(
SOperatorParam
));
*
ppRes
=
taosMemoryMalloc
(
sizeof
(
SOperatorParam
));
if
(
NULL
==
*
ppRes
)
{
if
(
NULL
==
*
ppRes
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
...
@@ -57,8 +57,8 @@ static FORCE_INLINE int32_t buildGroupCacheOperatorParam(SOperatorParam** ppRes,
...
@@ -57,8 +57,8 @@ static FORCE_INLINE int32_t buildGroupCacheOperatorParam(SOperatorParam** ppRes,
pGc
->
sessionId
=
atomic_add_fetch_64
(
&
gSessionId
,
1
);
pGc
->
sessionId
=
atomic_add_fetch_64
(
&
gSessionId
,
1
);
pGc
->
downstreamIdx
=
downstreamIdx
;
pGc
->
downstreamIdx
=
downstreamIdx
;
pGc
->
needCache
=
needCache
;
pGc
->
needCache
=
needCache
;
pGc
->
pGroupValue
=
pGrpValue
;
pGc
->
vgId
=
vgId
;
pGc
->
groupValueSize
=
grpValSize
;
pGc
->
tbUid
=
tbUid
;
(
*
ppRes
)
->
opType
=
QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE
;
(
*
ppRes
)
->
opType
=
QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE
;
(
*
ppRes
)
->
downstreamIdx
=
downstreamIdx
;
(
*
ppRes
)
->
downstreamIdx
=
downstreamIdx
;
...
@@ -78,15 +78,16 @@ static FORCE_INLINE int32_t buildExchangeOperatorParam(SOperatorParam** ppRes, i
...
@@ -78,15 +78,16 @@ static FORCE_INLINE int32_t buildExchangeOperatorParam(SOperatorParam** ppRes, i
if
(
NULL
==
pExc
)
{
if
(
NULL
==
pExc
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
pExc
->
vgId
=
*
pVgId
;
pExc
->
multiParams
=
false
;
pExc
->
srcOpType
=
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN
;
pExc
->
basic
.
vgId
=
*
pVgId
;
pExc
->
uidList
=
taosArrayInit
(
1
,
sizeof
(
int64_t
));
pExc
->
basic
.
srcOpType
=
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN
;
if
(
NULL
==
pExc
->
uidList
)
{
pExc
->
basic
.
uidList
=
taosArrayInit
(
1
,
sizeof
(
int64_t
));
if
(
NULL
==
pExc
->
basic
.
uidList
)
{
taosMemoryFree
(
pExc
);
taosMemoryFree
(
pExc
);
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
taosArrayPush
(
pExc
->
uidList
,
pUid
);
taosArrayPush
(
pExc
->
basic
.
uidList
,
pUid
);
(
*
ppRes
)
->
opType
=
QUERY_NODE_PHYSICAL_PLAN_EXCHANGE
;
(
*
ppRes
)
->
opType
=
QUERY_NODE_PHYSICAL_PLAN_EXCHANGE
;
(
*
ppRes
)
->
downstreamIdx
=
downstreamIdx
;
(
*
ppRes
)
->
downstreamIdx
=
downstreamIdx
;
...
@@ -145,10 +146,10 @@ static int32_t buildStbJoinOperatorParam(SDynQueryCtrlOperatorInfo* pInfo, SStbJ
...
@@ -145,10 +146,10 @@ static int32_t buildStbJoinOperatorParam(SDynQueryCtrlOperatorInfo* pInfo, SStbJ
code
=
buildExchangeOperatorParam
(
&
pExcParam1
,
1
,
rightVg
,
rightUid
,
NULL
);
code
=
buildExchangeOperatorParam
(
&
pExcParam1
,
1
,
rightVg
,
rightUid
,
NULL
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
buildGroupCacheOperatorParam
(
&
pGcParam0
,
0
,
false
,
leftUid
,
pUid0
->
info
.
bytes
,
pExcParam0
);
code
=
buildGroupCacheOperatorParam
(
&
pGcParam0
,
0
,
false
,
*
leftVg
,
*
leftUid
,
pExcParam0
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
buildGroupCacheOperatorParam
(
&
pGcParam1
,
1
,
false
,
rightUid
,
pUid1
->
info
.
bytes
,
pExcParam1
);
code
=
buildGroupCacheOperatorParam
(
&
pGcParam1
,
1
,
false
,
*
rightVg
,
*
rightUid
,
pExcParam1
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
buildMergeJoinOperatorParam
(
ppParam
,
pGcParam0
,
pGcParam1
);
code
=
buildMergeJoinOperatorParam
(
ppParam
,
pGcParam0
,
pGcParam1
);
...
...
source/libs/executor/src/exchangeoperator.c
浏览文件 @
2312f103
...
@@ -745,24 +745,45 @@ _error:
...
@@ -745,24 +745,45 @@ _error:
return
code
;
return
code
;
}
}
int32_t
add
DynamicExchangeSource
(
SOperatorInfo
*
pOperator
)
{
int32_t
add
SingleExchangeSource
(
SOperatorInfo
*
pOperator
,
SExchangeOperatorBasicParam
*
pBasicParam
)
{
SExchangeInfo
*
pExchangeInfo
=
pOperator
->
info
;
SExchangeInfo
*
pExchangeInfo
=
pOperator
->
info
;
SExchangeOperatorParam
*
pParam
=
(
SExchangeOperatorParam
*
)
pOperator
->
pOperatorParam
->
value
;
int32_t
*
pIdx
=
tSimpleHashGet
(
pExchangeInfo
->
pHashSources
,
&
pBasicParam
->
vgId
,
sizeof
(
pBasicParam
->
vgId
));
int32_t
*
pIdx
=
tSimpleHashGet
(
pExchangeInfo
->
pHashSources
,
&
pParam
->
vgId
,
sizeof
(
pParam
->
vgId
));
if
(
NULL
==
pIdx
)
{
if
(
NULL
==
pIdx
)
{
qError
(
"No exchange source for vgId: %d"
,
pParam
->
vgId
);
qError
(
"No exchange source for vgId: %d"
,
pBasicParam
->
vgId
);
pOperator
->
pTaskInfo
->
code
=
TSDB_CODE_INVALID_PARA
;
return
TSDB_CODE_INVALID_PARA
;
T_LONG_JMP
(
pOperator
->
pTaskInfo
->
env
,
pOperator
->
pTaskInfo
->
code
);
}
}
SSourceDataInfo
dataInfo
=
{
0
};
SSourceDataInfo
dataInfo
=
{
0
};
dataInfo
.
status
=
EX_SOURCE_DATA_NOT_READY
;
dataInfo
.
status
=
EX_SOURCE_DATA_NOT_READY
;
dataInfo
.
taskId
=
GET_TASKID
(
pOperator
->
pTaskInfo
);
dataInfo
.
taskId
=
GET_TASKID
(
pOperator
->
pTaskInfo
);
dataInfo
.
index
=
*
pIdx
;
dataInfo
.
index
=
*
pIdx
;
dataInfo
.
pSrcUidList
=
taosArrayDup
(
pParam
->
uidList
,
NULL
);
dataInfo
.
pSrcUidList
=
taosArrayDup
(
p
Basic
Param
->
uidList
,
NULL
);
dataInfo
.
srcOpType
=
pParam
->
srcOpType
;
dataInfo
.
srcOpType
=
p
Basic
Param
->
srcOpType
;
taosArrayPush
(
pExchangeInfo
->
pSourceDataInfo
,
&
dataInfo
);
taosArrayPush
(
pExchangeInfo
->
pSourceDataInfo
,
&
dataInfo
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
addDynamicExchangeSource
(
SOperatorInfo
*
pOperator
)
{
SExchangeInfo
*
pExchangeInfo
=
pOperator
->
info
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SExchangeOperatorBasicParam
*
pBasicParam
=
NULL
;
SExchangeOperatorParam
*
pParam
=
(
SExchangeOperatorParam
*
)
pOperator
->
pOperatorParam
->
value
;
if
(
pParam
->
multiParams
)
{
SExchangeOperatorBatchParam
*
pBatch
=
(
SExchangeOperatorBatchParam
*
)
pOperator
->
pOperatorParam
->
value
;
int32_t
iter
=
0
;
while
(
pBasicParam
=
tSimpleHashIterate
(
pBatch
->
pBatchs
,
pBasicParam
,
&
iter
))
{
code
=
addSingleExchangeSource
(
pOperator
,
pBasicParam
);
if
(
code
)
{
return
code
;
}
}
}
else
{
pBasicParam
=
&
pParam
->
basic
;
code
=
addSingleExchangeSource
(
pOperator
,
pBasicParam
);
}
pOperator
->
pOperatorParam
=
NULL
;
pOperator
->
pOperatorParam
=
NULL
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
...
source/libs/executor/src/groupcacheoperator.c
浏览文件 @
2312f103
此差异已折叠。
点击以展开。
source/libs/executor/src/operator.c
浏览文件 @
2312f103
...
@@ -616,28 +616,37 @@ int32_t mergeOperatorParams(SOperatorParam* pDst, SOperatorParam* pSrc) {
...
@@ -616,28 +616,37 @@ int32_t mergeOperatorParams(SOperatorParam* pDst, SOperatorParam* pSrc) {
SExchangeOperatorParam
*
pDExc
=
pDst
->
value
;
SExchangeOperatorParam
*
pDExc
=
pDst
->
value
;
SExchangeOperatorParam
*
pSExc
=
pSrc
->
value
;
SExchangeOperatorParam
*
pSExc
=
pSrc
->
value
;
if
(
!
pDExc
->
multiParams
)
{
if
(
!
pDExc
->
multiParams
)
{
SExchangeOperatorBatchParam
*
pBatch
=
taosMemoryMalloc
(
sizeof
(
SExchangeOperatorBatchParam
));
if
(
pSExc
->
basic
.
vgId
!=
pDExc
->
basic
.
vgId
)
{
if
(
NULL
==
pBatch
)
{
SExchangeOperatorBatchParam
*
pBatch
=
taosMemoryMalloc
(
sizeof
(
SExchangeOperatorBatchParam
));
return
TSDB_CODE_OUT_OF_MEMORY
;
if
(
NULL
==
pBatch
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pBatch
->
multiParams
=
true
;
pBatch
->
pBatchs
=
tSimpleHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
));
if
(
NULL
==
pBatch
->
pBatchs
)
{
taosMemoryFree
(
pBatch
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
tSimpleHashPut
(
pBatch
->
pBatchs
,
&
pDExc
->
basic
.
vgId
,
sizeof
(
pDExc
->
basic
.
vgId
),
&
pDExc
->
basic
,
sizeof
(
pDExc
->
basic
));
tSimpleHashPut
(
pBatch
->
pBatchs
,
&
pSExc
->
basic
.
vgId
,
sizeof
(
pSExc
->
basic
.
vgId
),
&
pSExc
->
basic
,
sizeof
(
pSExc
->
basic
));
destroyOperatorParamValue
(
pDst
->
value
);
pDst
->
value
=
pBatch
;
}
else
{
taosArrayAddAll
(
pDExc
->
basic
.
uidList
,
pSExc
->
basic
.
uidList
);
}
}
pBatch
->
multiParams
=
true
;
pBatch
->
pBatchs
=
taosArrayInit
(
4
,
sizeof
(
SExchangeOperatorBasicParam
));
if
(
NULL
==
pBatch
->
pBatchs
)
{
taosMemoryFree
(
pBatch
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
taosArrayPush
(
pBatch
->
pBatchs
,
&
pDExc
->
basic
);
taosArrayPush
(
pBatch
->
pBatchs
,
&
pSExc
->
basic
);
destroyOperatorParamValue
(
pDst
->
value
);
pDst
->
value
=
pBatch
;
}
else
{
}
else
{
SExchangeOperatorBatchParam
*
pBatch
=
pDst
->
value
;
SExchangeOperatorBatchParam
*
pBatch
=
pDst
->
value
;
taosArrayPush
(
pBatch
->
pBatchs
,
&
pSExc
->
basic
);
SExchangeOperatorBasicParam
*
pBasic
=
tSimpleHashGet
(
pBatch
->
pBatchs
,
&
pSExc
->
basic
.
vgId
,
sizeof
(
pSExc
->
basic
.
vgId
));
if
(
pBasic
)
{
taosArrayAddAll
(
pBasic
->
uidList
,
pSExc
->
basic
.
uidList
);
}
else
{
tSimpleHashPut
(
pBatch
->
pBatchs
,
&
pSExc
->
basic
.
vgId
,
sizeof
(
pSExc
->
basic
.
vgId
),
&
pSExc
->
basic
,
sizeof
(
pSExc
->
basic
));
}
}
}
break
;
break
;
}
}
default:
default:
qError
(
"invalid optype %d for merge operator params"
,
(
*
ppDst
)
->
opType
);
qError
(
"invalid optype %d for merge operator params"
,
pDst
->
opType
);
return
TSDB_CODE_INVALID_PARA
;
return
TSDB_CODE_INVALID_PARA
;
}
}
...
@@ -678,7 +687,7 @@ int32_t setOperatorParams(struct SOperatorInfo* pOperator, SOperatorParam* pPara
...
@@ -678,7 +687,7 @@ int32_t setOperatorParams(struct SOperatorInfo* pOperator, SOperatorParam* pPara
for
(
int32_t
i
=
0
;
i
<
childrenNum
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
childrenNum
;
++
i
)
{
SOperatorParam
*
pChild
=
*
(
SOperatorParam
**
)
taosArrayGet
(
pOperator
->
pOperatorParam
->
pChildren
,
i
);
SOperatorParam
*
pChild
=
*
(
SOperatorParam
**
)
taosArrayGet
(
pOperator
->
pOperatorParam
->
pChildren
,
i
);
if
(
pOperator
->
pDownstreamParams
[
pChild
->
downstreamIdx
])
{
if
(
pOperator
->
pDownstreamParams
[
pChild
->
downstreamIdx
])
{
int32_t
code
=
mergeOperatorParams
(
&
pOperator
->
pDownstreamParams
[
pChild
->
downstreamIdx
],
pChild
);
int32_t
code
=
mergeOperatorParams
(
pOperator
->
pDownstreamParams
[
pChild
->
downstreamIdx
],
pChild
);
if
(
code
)
{
if
(
code
)
{
return
code
;
return
code
;
}
}
...
...
source/libs/nodes/src/nodesCodeFuncs.c
浏览文件 @
2312f103
...
@@ -1183,6 +1183,8 @@ static int32_t jsonToLogicInterpFuncNode(const SJson* pJson, void* pObj) {
...
@@ -1183,6 +1183,8 @@ static int32_t jsonToLogicInterpFuncNode(const SJson* pJson, void* pObj) {
}
}
static
const
char
*
jkGroupCacheLogicPlanGrpColsMayBeNull
=
"GroupColsMayBeNull"
;
static
const
char
*
jkGroupCacheLogicPlanGrpColsMayBeNull
=
"GroupColsMayBeNull"
;
static
const
char
*
jkGroupCacheLogicPlanGroupByUid
=
"GroupByUid"
;
static
const
char
*
jkGroupCacheLogicPlanGlobalGroup
=
"GlobalGroup"
;
static
const
char
*
jkGroupCacheLogicPlanGroupCols
=
"GroupCols"
;
static
const
char
*
jkGroupCacheLogicPlanGroupCols
=
"GroupCols"
;
static
int32_t
logicGroupCacheNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
static
int32_t
logicGroupCacheNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
...
@@ -1192,6 +1194,12 @@ static int32_t logicGroupCacheNodeToJson(const void* pObj, SJson* pJson) {
...
@@ -1192,6 +1194,12 @@ static int32_t logicGroupCacheNodeToJson(const void* pObj, SJson* pJson) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkGroupCacheLogicPlanGrpColsMayBeNull
,
pNode
->
grpColsMayBeNull
);
code
=
tjsonAddBoolToObject
(
pJson
,
jkGroupCacheLogicPlanGrpColsMayBeNull
,
pNode
->
grpColsMayBeNull
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkGroupCacheLogicPlanGroupByUid
,
pNode
->
grpByUid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkGroupCacheLogicPlanGlobalGroup
,
pNode
->
globalGrp
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkGroupCacheLogicPlanGroupCols
,
pNode
->
pGroupCols
);
code
=
nodeListToJson
(
pJson
,
jkGroupCacheLogicPlanGroupCols
,
pNode
->
pGroupCols
);
}
}
...
@@ -1206,6 +1214,12 @@ static int32_t jsonToLogicGroupCacheNode(const SJson* pJson, void* pObj) {
...
@@ -1206,6 +1214,12 @@ static int32_t jsonToLogicGroupCacheNode(const SJson* pJson, void* pObj) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkGroupCacheLogicPlanGrpColsMayBeNull
,
&
pNode
->
grpColsMayBeNull
);
code
=
tjsonGetBoolValue
(
pJson
,
jkGroupCacheLogicPlanGrpColsMayBeNull
,
&
pNode
->
grpColsMayBeNull
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkGroupCacheLogicPlanGroupByUid
,
&
pNode
->
grpByUid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkGroupCacheLogicPlanGlobalGroup
,
&
pNode
->
globalGrp
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkGroupCacheLogicPlanGroupCols
,
&
pNode
->
pGroupCols
);
code
=
jsonToNodeList
(
pJson
,
jkGroupCacheLogicPlanGroupCols
,
&
pNode
->
pGroupCols
);
}
}
...
@@ -2912,12 +2926,24 @@ static int32_t jsonToPhysiDeleteNode(const SJson* pJson, void* pObj) {
...
@@ -2912,12 +2926,24 @@ static int32_t jsonToPhysiDeleteNode(const SJson* pJson, void* pObj) {
}
}
static
const
char
*
jkGroupCachePhysiPlanGroupCols
=
"GroupColumns"
;
static
const
char
*
jkGroupCachePhysiPlanGroupCols
=
"GroupColumns"
;
static
const
char
*
jkGroupCachePhysiPlanGrpColsMayBeNull
=
"GroupColumnsMayBeNull"
;
static
const
char
*
jkGroupCachePhysiPlanGroupByUid
=
"GroupByUid"
;
static
const
char
*
jkGroupCachePhysiPlanGlobalGroup
=
"GlobalGroup"
;
static
int32_t
physiGroupCacheNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
static
int32_t
physiGroupCacheNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SGroupCachePhysiNode
*
pNode
=
(
const
SGroupCachePhysiNode
*
)
pObj
;
const
SGroupCachePhysiNode
*
pNode
=
(
const
SGroupCachePhysiNode
*
)
pObj
;
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkGroupCachePhysiPlanGrpColsMayBeNull
,
pNode
->
grpColsMayBeNull
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkGroupCachePhysiPlanGroupByUid
,
pNode
->
grpByUid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkGroupCachePhysiPlanGlobalGroup
,
pNode
->
globalGrp
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkGroupCachePhysiPlanGroupCols
,
pNode
->
pGroupCols
);
code
=
nodeListToJson
(
pJson
,
jkGroupCachePhysiPlanGroupCols
,
pNode
->
pGroupCols
);
}
}
...
@@ -2928,6 +2954,15 @@ static int32_t jsonToPhysiGroupCacheNode(const SJson* pJson, void* pObj) {
...
@@ -2928,6 +2954,15 @@ static int32_t jsonToPhysiGroupCacheNode(const SJson* pJson, void* pObj) {
SGroupCachePhysiNode
*
pNode
=
(
SGroupCachePhysiNode
*
)
pObj
;
SGroupCachePhysiNode
*
pNode
=
(
SGroupCachePhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkGroupCachePhysiPlanGrpColsMayBeNull
,
&
pNode
->
grpColsMayBeNull
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkGroupCachePhysiPlanGroupByUid
,
&
pNode
->
grpByUid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkGroupCachePhysiPlanGlobalGroup
,
&
pNode
->
globalGrp
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkGroupCachePhysiPlanGroupCols
,
&
pNode
->
pGroupCols
);
code
=
jsonToNodeList
(
pJson
,
jkGroupCachePhysiPlanGroupCols
,
&
pNode
->
pGroupCols
);
}
}
...
...
source/libs/nodes/src/nodesMsgFuncs.c
浏览文件 @
2312f103
...
@@ -3527,6 +3527,9 @@ static int32_t msgToPhysiDeleteNode(STlvDecoder* pDecoder, void* pObj) {
...
@@ -3527,6 +3527,9 @@ static int32_t msgToPhysiDeleteNode(STlvDecoder* pDecoder, void* pObj) {
enum
{
enum
{
PHY_GROUP_CACHE_CODE_BASE_NODE
=
1
,
PHY_GROUP_CACHE_CODE_BASE_NODE
=
1
,
PHY_GROUP_CACHE_CODE_GROUP_COLS_MAY_BE_NULL
,
PHY_GROUP_CACHE_CODE_GROUP_BY_UID
,
PHY_GROUP_CACHE_CODE_GLOBAL_GROUP
,
PHY_GROUP_CACHE_CODE_GROUP_COLUMNS
PHY_GROUP_CACHE_CODE_GROUP_COLUMNS
};
};
...
@@ -3537,6 +3540,16 @@ static int32_t physiGroupCacheNodeToMsg(const void* pObj, STlvEncoder* pEncoder)
...
@@ -3537,6 +3540,16 @@ static int32_t physiGroupCacheNodeToMsg(const void* pObj, STlvEncoder* pEncoder)
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeObj
(
pEncoder
,
PHY_GROUP_CACHE_CODE_GROUP_COLUMNS
,
nodeListToMsg
,
pNode
->
pGroupCols
);
code
=
tlvEncodeObj
(
pEncoder
,
PHY_GROUP_CACHE_CODE_GROUP_COLUMNS
,
nodeListToMsg
,
pNode
->
pGroupCols
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeBool
(
pEncoder
,
PHY_GROUP_CACHE_CODE_GROUP_COLS_MAY_BE_NULL
,
pNode
->
grpColsMayBeNull
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeBool
(
pEncoder
,
PHY_GROUP_CACHE_CODE_GROUP_BY_UID
,
pNode
->
grpByUid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeBool
(
pEncoder
,
PHY_GROUP_CACHE_CODE_GLOBAL_GROUP
,
pNode
->
globalGrp
);
}
return
code
;
return
code
;
}
}
...
@@ -3553,6 +3566,15 @@ static int32_t msgToPhysiGroupCacheNode(STlvDecoder* pDecoder, void* pObj) {
...
@@ -3553,6 +3566,15 @@ static int32_t msgToPhysiGroupCacheNode(STlvDecoder* pDecoder, void* pObj) {
case
PHY_GROUP_CACHE_CODE_GROUP_COLUMNS
:
case
PHY_GROUP_CACHE_CODE_GROUP_COLUMNS
:
code
=
msgToNodeListFromTlv
(
pTlv
,
(
void
**
)
&
pNode
->
pGroupCols
);
code
=
msgToNodeListFromTlv
(
pTlv
,
(
void
**
)
&
pNode
->
pGroupCols
);
break
;
break
;
case
PHY_GROUP_CACHE_CODE_GROUP_COLS_MAY_BE_NULL
:
code
=
tlvDecodeBool
(
pTlv
,
&
pNode
->
grpColsMayBeNull
);
break
;
case
PHY_GROUP_CACHE_CODE_GROUP_BY_UID
:
code
=
tlvDecodeBool
(
pTlv
,
&
pNode
->
grpByUid
);
break
;
case
PHY_GROUP_CACHE_CODE_GLOBAL_GROUP
:
code
=
tlvDecodeBool
(
pTlv
,
&
pNode
->
globalGrp
);
break
;
default:
default:
break
;
break
;
}
}
...
...
source/libs/planner/src/planOptimizer.c
浏览文件 @
2312f103
...
@@ -3231,6 +3231,7 @@ static int32_t stbJoinOptCreateGroupCacheNode(SNodeList* pChildren, SLogicNode**
...
@@ -3231,6 +3231,7 @@ static int32_t stbJoinOptCreateGroupCacheNode(SNodeList* pChildren, SLogicNode**
pGrpCache
->
node
.
dynamicOp
=
true
;
pGrpCache
->
node
.
dynamicOp
=
true
;
pGrpCache
->
grpColsMayBeNull
=
false
;
pGrpCache
->
grpColsMayBeNull
=
false
;
pGrpCache
->
grpByUid
=
true
;
pGrpCache
->
node
.
pChildren
=
pChildren
;
pGrpCache
->
node
.
pChildren
=
pChildren
;
pGrpCache
->
node
.
pTargets
=
nodesMakeList
();
pGrpCache
->
node
.
pTargets
=
nodesMakeList
();
if
(
NULL
==
pGrpCache
->
node
.
pTargets
)
{
if
(
NULL
==
pGrpCache
->
node
.
pTargets
)
{
...
@@ -3252,11 +3253,16 @@ static int32_t stbJoinOptCreateGroupCacheNode(SNodeList* pChildren, SLogicNode**
...
@@ -3252,11 +3253,16 @@ static int32_t stbJoinOptCreateGroupCacheNode(SNodeList* pChildren, SLogicNode**
}
}
}
}
bool
hasCond
=
false
;
SNode
*
pNode
=
NULL
;
SNode
*
pNode
=
NULL
;
FOREACH
(
pNode
,
pChildren
)
{
FOREACH
(
pNode
,
pChildren
)
{
SScanLogicNode
*
pScan
=
(
SScanLogicNode
*
)
pNode
;
SScanLogicNode
*
pScan
=
(
SScanLogicNode
*
)
pNode
;
if
(
pScan
->
node
.
pConditions
)
{
hasCond
=
true
;
}
pScan
->
node
.
pParent
=
(
SLogicNode
*
)
pGrpCache
;
pScan
->
node
.
pParent
=
(
SLogicNode
*
)
pGrpCache
;
}
}
pGrpCache
->
globalGrp
=
!
hasCond
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
ppLogic
=
(
SLogicNode
*
)
pGrpCache
;
*
ppLogic
=
(
SLogicNode
*
)
pGrpCache
;
...
...
source/libs/planner/src/planPhysiCreater.c
浏览文件 @
2312f103
...
@@ -986,6 +986,8 @@ static int32_t createGroupCachePhysiNode(SPhysiPlanContext* pCxt, SNodeList* pCh
...
@@ -986,6 +986,8 @@ static int32_t createGroupCachePhysiNode(SPhysiPlanContext* pCxt, SNodeList* pCh
}
}
pGrpCache
->
grpColsMayBeNull
=
pLogicNode
->
grpColsMayBeNull
;
pGrpCache
->
grpColsMayBeNull
=
pLogicNode
->
grpColsMayBeNull
;
pGrpCache
->
grpByUid
=
pLogicNode
->
grpByUid
;
pGrpCache
->
globalGrp
=
pLogicNode
->
globalGrp
;
SDataBlockDescNode
*
pChildDesc
=
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
pOutputDataBlockDesc
;
SDataBlockDescNode
*
pChildDesc
=
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
pOutputDataBlockDesc
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录