Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
42a4f364
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看板
“e96879c202263c16e3608d335e3745b8e1d846f2”上不存在“projects/snow-sprite/imports.yml”
提交
42a4f364
编写于
8月 11, 2023
作者:
S
slzhou
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'szhou/tag-scan-opt' of github.com:taosdata/TDengine into szhou/tag-scan-opt
上级
3c2bf197
a0c62d21
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
501 addition
and
31 deletion
+501
-31
include/libs/executor/storageapi.h
include/libs/executor/storageapi.h
+13
-1
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+13
-1
source/dnode/vnode/src/inc/vnodeInt.h
source/dnode/vnode/src/inc/vnodeInt.h
+1
-1
source/dnode/vnode/src/meta/metaQuery.c
source/dnode/vnode/src/meta/metaQuery.c
+2
-10
source/dnode/vnode/src/vnd/vnodeInitApi.c
source/dnode/vnode/src/vnd/vnodeInitApi.c
+4
-0
source/libs/executor/inc/executil.h
source/libs/executor/inc/executil.h
+2
-0
source/libs/executor/inc/executorInt.h
source/libs/executor/inc/executorInt.h
+5
-0
source/libs/executor/inc/operator.h
source/libs/executor/inc/operator.h
+1
-1
source/libs/executor/src/executil.c
source/libs/executor/src/executil.c
+1
-3
source/libs/executor/src/operator.c
source/libs/executor/src/operator.c
+10
-9
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+282
-2
source/libs/nodes/src/nodesCloneFuncs.c
source/libs/nodes/src/nodesCloneFuncs.c
+10
-1
source/libs/nodes/src/nodesCodeFuncs.c
source/libs/nodes/src/nodesCodeFuncs.c
+68
-2
source/libs/nodes/src/nodesMsgFuncs.c
source/libs/nodes/src/nodesMsgFuncs.c
+89
-0
未找到文件。
include/libs/executor/storageapi.h
浏览文件 @
42a4f364
...
...
@@ -98,6 +98,16 @@ typedef struct SMTbCursor {
int8_t
paused
;
}
SMTbCursor
;
typedef
struct
SMCtbCursor
{
SMeta
*
pMeta
;
void
*
pCur
;
tb_uid_t
suid
;
void
*
pKey
;
void
*
pVal
;
int
kLen
;
int
vLen
;
}
SMCtbCursor
;
typedef
struct
SRowBuffPos
{
void
*
pRowBuff
;
void
*
pKey
;
...
...
@@ -278,13 +288,15 @@ typedef struct SStoreMeta {
void
(
*
getBasicInfo
)(
void
*
pVnode
,
const
char
**
dbname
,
int32_t
*
vgId
,
int64_t
*
numOfTables
,
int64_t
*
numOfNormalTables
);
// vnodeGetInfo(void *pVnode, const char **dbname, int32_t *vgId) &
// metaGetTbNum(SMeta *pMeta) & metaGetNtbNum(SMeta *pMeta);
int64_t
(
*
getNumOfRowsInMem
)(
void
*
pVnode
);
/**
int32_t vnodeGetCtbIdList(void *pVnode, int64_t suid, SArray *list);
int32_t vnodeGetCtbIdListByFilter(void *pVnode, int64_t suid, SArray *list, bool (*filter)(void *arg), void *arg);
int32_t vnodeGetStbIdList(void *pVnode, int64_t suid, SArray *list);
*/
SMCtbCursor
*
(
*
openCtbCursor
)(
void
*
pVnode
,
tb_uid_t
uid
,
int
lock
);
void
(
*
closeCtbCursor
)(
SMCtbCursor
*
pCtbCur
,
int
lock
);
tb_uid_t
(
*
ctbCursorNext
)(
SMCtbCursor
*
pCur
);
}
SStoreMeta
;
typedef
struct
SStoreMetaReader
{
...
...
include/libs/nodes/plannodes.h
浏览文件 @
42a4f364
...
...
@@ -334,7 +334,19 @@ typedef struct SScanPhysiNode {
bool
groupOrderScan
;
}
SScanPhysiNode
;
typedef
SScanPhysiNode
STagScanPhysiNode
;
typedef
struct
STagScanPhysiNode
{
// SScanPhysiNode scan; //TODO?
SPhysiNode
node
;
SNodeList
*
pScanCols
;
SNodeList
*
pScanPseudoCols
;
uint64_t
uid
;
// unique id of the table
uint64_t
suid
;
int8_t
tableType
;
SName
tableName
;
bool
groupOrderScan
;
bool
onlyMetaCtbIdx
;
//no tbname, tag index not used.
}
STagScanPhysiNode
;
typedef
SScanPhysiNode
SBlockDistScanPhysiNode
;
typedef
struct
SLastRowScanPhysiNode
{
...
...
source/dnode/vnode/src/inc/vnodeInt.h
浏览文件 @
42a4f364
...
...
@@ -167,7 +167,7 @@ int metaAddIndexToSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
int
metaDropIndexFromSTable
(
SMeta
*
pMeta
,
int64_t
version
,
SDropIndexReq
*
pReq
);
int64_t
metaGetTimeSeriesNum
(
SMeta
*
pMeta
);
SMCtbCursor
*
metaOpenCtbCursor
(
SMeta
*
pMeta
,
tb_uid_t
uid
,
int
lock
);
SMCtbCursor
*
metaOpenCtbCursor
(
void
*
pVnode
,
tb_uid_t
uid
,
int
lock
);
void
metaCloseCtbCursor
(
SMCtbCursor
*
pCtbCur
,
int
lock
);
tb_uid_t
metaCtbCursorNext
(
SMCtbCursor
*
pCtbCur
);
SMStbCursor
*
metaOpenStbCursor
(
SMeta
*
pMeta
,
tb_uid_t
uid
);
...
...
source/dnode/vnode/src/meta/metaQuery.c
浏览文件 @
42a4f364
...
...
@@ -408,17 +408,9 @@ _err:
return
NULL
;
}
struct
SMCtbCursor
{
SMeta
*
pMeta
;
TBC
*
pCur
;
tb_uid_t
suid
;
void
*
pKey
;
void
*
pVal
;
int
kLen
;
int
vLen
;
};
SMCtbCursor
*
metaOpenCtbCursor
(
SMeta
*
pMeta
,
tb_uid_t
uid
,
int
lock
)
{
SMCtbCursor
*
metaOpenCtbCursor
(
void
*
pVnode
,
tb_uid_t
uid
,
int
lock
)
{
SMeta
*
pMeta
=
((
SVnode
*
)
pVnode
)
->
pMeta
;
SMCtbCursor
*
pCtbCur
=
NULL
;
SCtbIdxKey
ctbIdxKey
;
int
ret
=
0
;
...
...
source/dnode/vnode/src/vnd/vnodeInitApi.c
浏览文件 @
42a4f364
...
...
@@ -96,6 +96,10 @@ void initMetadataAPI(SStoreMeta* pMeta) {
pMeta
->
metaGetCachedTbGroup
=
metaGetCachedTbGroup
;
pMeta
->
metaPutTbGroupToCache
=
metaPutTbGroupToCache
;
pMeta
->
openCtbCursor
=
metaOpenCtbCursor
;
pMeta
->
closeCtbCursor
=
metaCloseCtbCursor
;
pMeta
->
ctbCursorNext
=
metaCtbCursorNext
;
}
void
initTqAPI
(
SStoreTqReader
*
pTq
)
{
...
...
source/libs/executor/inc/executil.h
浏览文件 @
42a4f364
...
...
@@ -190,4 +190,6 @@ void printDataBlock(SSDataBlock* pBlock, const char* flag);
void
getNextTimeWindow
(
const
SInterval
*
pInterval
,
STimeWindow
*
tw
,
int32_t
order
);
void
getInitialStartTimeWindow
(
SInterval
*
pInterval
,
TSKEY
ts
,
STimeWindow
*
w
,
bool
ascQuery
);
SSDataBlock
*
createTagValBlockForFilter
(
SArray
*
pColList
,
int32_t
numOfTables
,
SArray
*
pUidTagList
,
void
*
pVnode
,
SStorageAPI
*
pStorageAPI
);
#endif // TDENGINE_EXECUTIL_H
source/libs/executor/inc/executorInt.h
浏览文件 @
42a4f364
...
...
@@ -259,6 +259,11 @@ typedef struct STagScanInfo {
SLimitNode
*
pSlimit
;
SReadHandle
readHandle
;
STableListInfo
*
pTableListInfo
;
uint64_t
suid
;
void
*
pCtbCursor
;
SNode
*
pTagCond
;
SNode
*
pTagIndexCond
;
SStorageAPI
*
pStorageAPI
;
}
STagScanInfo
;
typedef
enum
EStreamScanMode
{
...
...
source/libs/executor/inc/operator.h
浏览文件 @
42a4f364
...
...
@@ -81,7 +81,7 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
SOperatorInfo
*
createTableMergeScanOperatorInfo
(
STableScanPhysiNode
*
pTableScanNode
,
SReadHandle
*
readHandle
,
STableListInfo
*
pTableListInfo
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createTagScanOperatorInfo
(
SReadHandle
*
pReadHandle
,
STagScanPhysiNode
*
pPhyNode
,
STableListInfo
*
pTableListInfo
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createTagScanOperatorInfo
(
SReadHandle
*
pReadHandle
,
STagScanPhysiNode
*
pPhyNode
,
STableListInfo
*
pTableListInfo
,
S
Node
*
pTagCond
,
SNode
*
pTagIndexCond
,
S
ExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createSysTableScanOperatorInfo
(
void
*
readHandle
,
SSystemTableScanPhysiNode
*
pScanPhyNode
,
const
char
*
pUser
,
SExecTaskInfo
*
pTaskInfo
);
...
...
source/libs/executor/src/executil.c
浏览文件 @
42a4f364
...
...
@@ -47,8 +47,6 @@ static int32_t optimizeTbnameInCondImpl(void* metaHandle, SArray* list, SNode* p
static
int32_t
getTableList
(
void
*
pVnode
,
SScanPhysiNode
*
pScanNode
,
SNode
*
pTagCond
,
SNode
*
pTagIndexCond
,
STableListInfo
*
pListInfo
,
uint8_t
*
digest
,
const
char
*
idstr
,
SStorageAPI
*
pStorageAPI
);
static
SSDataBlock
*
createTagValBlockForFilter
(
SArray
*
pColList
,
int32_t
numOfTables
,
SArray
*
pUidTagList
,
void
*
pVnode
,
SStorageAPI
*
pStorageAPI
);
static
int64_t
getLimit
(
const
SNode
*
pLimit
)
{
return
NULL
==
pLimit
?
-
1
:
((
SLimitNode
*
)
pLimit
)
->
limit
;
}
static
int64_t
getOffset
(
const
SNode
*
pLimit
)
{
return
NULL
==
pLimit
?
-
1
:
((
SLimitNode
*
)
pLimit
)
->
offset
;
}
...
...
@@ -846,7 +844,7 @@ static int32_t optimizeTbnameInCondImpl(void* pVnode, SArray* pExistedUidList, S
return
-
1
;
}
static
SSDataBlock
*
createTagValBlockForFilter
(
SArray
*
pColList
,
int32_t
numOfTables
,
SArray
*
pUidTagList
,
void
*
pVnode
,
SSDataBlock
*
createTagValBlockForFilter
(
SArray
*
pColList
,
int32_t
numOfTables
,
SArray
*
pUidTagList
,
void
*
pVnode
,
SStorageAPI
*
pStorageAPI
)
{
SSDataBlock
*
pResBlock
=
createDataBlock
();
if
(
pResBlock
==
NULL
)
{
...
...
source/libs/executor/src/operator.c
浏览文件 @
42a4f364
...
...
@@ -370,17 +370,18 @@ SOperatorInfo* createOperator(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, SR
STableCountScanPhysiNode
*
pTblCountScanNode
=
(
STableCountScanPhysiNode
*
)
pPhyNode
;
pOperator
=
createTableCountScanOperatorInfo
(
pHandle
,
pTblCountScanNode
,
pTaskInfo
);
}
else
if
(
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
==
type
)
{
STagScanPhysiNode
*
pScanPhyNode
=
(
STagScanPhysiNode
*
)
pPhyNode
;
STagScanPhysiNode
*
p
Tag
ScanPhyNode
=
(
STagScanPhysiNode
*
)
pPhyNode
;
STableListInfo
*
pTableListInfo
=
tableListCreate
();
int32_t
code
=
createScanTableListInfo
(
pScanPhyNode
,
NULL
,
false
,
pHandle
,
pTableListInfo
,
pTagCond
,
pTagIndexCond
,
pTaskInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
pTaskInfo
->
code
=
code
;
qError
(
"failed to getTableList, code: %s"
,
tstrerror
(
code
));
return
NULL
;
if
(
!
pTagScanPhyNode
->
onlyMetaCtbIdx
)
{
int32_t
code
=
createScanTableListInfo
(
pTagScanPhyNode
,
NULL
,
false
,
pHandle
,
pTableListInfo
,
pTagCond
,
pTagIndexCond
,
pTaskInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
pTaskInfo
->
code
=
code
;
qError
(
"failed to getTableList, code: %s"
,
tstrerror
(
code
));
return
NULL
;
}
}
pOperator
=
createTagScanOperatorInfo
(
pHandle
,
pScanPhyNode
,
pTableListInfo
,
pTaskInfo
);
pOperator
=
createTagScanOperatorInfo
(
pHandle
,
pTagScanPhyNode
,
pTableListInfo
,
pTagCond
,
pTagIndexCond
,
pTaskInfo
);
}
else
if
(
QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN
==
type
)
{
SBlockDistScanPhysiNode
*
pBlockNode
=
(
SBlockDistScanPhysiNode
*
)
pPhyNode
;
STableListInfo
*
pTableListInfo
=
tableListCreate
();
...
...
source/libs/executor/src/scanoperator.c
浏览文件 @
42a4f364
...
...
@@ -2688,6 +2688,277 @@ static void doTagScanOneTable(SOperatorInfo* pOperator, const SSDataBlock* pRes,
}
}
static
void
tagScanFreeUidTag
(
void
*
p
)
{
STUidTagInfo
*
pInfo
=
p
;
if
(
pInfo
->
pTagVal
!=
NULL
)
{
taosMemoryFree
(
pInfo
->
pTagVal
);
}
}
static
int32_t
tagScanCreateResultData
(
SDataType
*
pType
,
int32_t
numOfRows
,
SScalarParam
*
pParam
)
{
SColumnInfoData
*
pColumnData
=
taosMemoryCalloc
(
1
,
sizeof
(
SColumnInfoData
));
if
(
pColumnData
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
terrno
;
}
pColumnData
->
info
.
type
=
pType
->
type
;
pColumnData
->
info
.
bytes
=
pType
->
bytes
;
pColumnData
->
info
.
scale
=
pType
->
scale
;
pColumnData
->
info
.
precision
=
pType
->
precision
;
int32_t
code
=
colInfoDataEnsureCapacity
(
pColumnData
,
numOfRows
,
true
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
terrno
=
code
;
taosMemoryFree
(
pColumnData
);
return
terrno
;
}
pParam
->
columnData
=
pColumnData
;
pParam
->
colAlloced
=
true
;
return
TSDB_CODE_SUCCESS
;
}
typedef
struct
STagScanFilterContext
{
SHashObj
*
colHash
;
int32_t
index
;
SArray
*
cInfoList
;
}
STagScanFilterContext
;
static
EDealRes
tagScanRewriteTagColumn
(
SNode
**
pNode
,
void
*
pContext
)
{
SColumnNode
*
pSColumnNode
=
NULL
;
if
(
QUERY_NODE_COLUMN
==
nodeType
((
*
pNode
)))
{
pSColumnNode
=
*
(
SColumnNode
**
)
pNode
;
}
else
if
(
QUERY_NODE_FUNCTION
==
nodeType
((
*
pNode
)))
{
SFunctionNode
*
pFuncNode
=
*
(
SFunctionNode
**
)(
pNode
);
if
(
pFuncNode
->
funcType
==
FUNCTION_TYPE_TBNAME
)
{
pSColumnNode
=
(
SColumnNode
*
)
nodesMakeNode
(
QUERY_NODE_COLUMN
);
if
(
NULL
==
pSColumnNode
)
{
return
DEAL_RES_ERROR
;
}
pSColumnNode
->
colId
=
-
1
;
pSColumnNode
->
colType
=
COLUMN_TYPE_TBNAME
;
pSColumnNode
->
node
.
resType
.
type
=
TSDB_DATA_TYPE_VARCHAR
;
pSColumnNode
->
node
.
resType
.
bytes
=
TSDB_TABLE_FNAME_LEN
-
1
+
VARSTR_HEADER_SIZE
;
nodesDestroyNode
(
*
pNode
);
*
pNode
=
(
SNode
*
)
pSColumnNode
;
}
else
{
return
DEAL_RES_CONTINUE
;
}
}
else
{
return
DEAL_RES_CONTINUE
;
}
STagScanFilterContext
*
pCtx
=
(
STagScanFilterContext
*
)
pContext
;
void
*
data
=
taosHashGet
(
pCtx
->
colHash
,
&
pSColumnNode
->
colId
,
sizeof
(
pSColumnNode
->
colId
));
if
(
!
data
)
{
taosHashPut
(
pCtx
->
colHash
,
&
pSColumnNode
->
colId
,
sizeof
(
pSColumnNode
->
colId
),
pNode
,
sizeof
((
*
pNode
)));
pSColumnNode
->
slotId
=
pCtx
->
index
++
;
SColumnInfo
cInfo
=
{.
colId
=
pSColumnNode
->
colId
,
.
type
=
pSColumnNode
->
node
.
resType
.
type
,
.
bytes
=
pSColumnNode
->
node
.
resType
.
bytes
};
taosArrayPush
(
pCtx
->
cInfoList
,
&
cInfo
);
}
else
{
SColumnNode
*
col
=
*
(
SColumnNode
**
)
data
;
pSColumnNode
->
slotId
=
col
->
slotId
;
}
return
DEAL_RES_CONTINUE
;
}
static
void
tagScanFilterByTagCond
(
SArray
*
aUidTags
,
SNode
*
pTagCond
,
SArray
*
aFilterIdxs
,
void
*
pVnode
,
SStorageAPI
*
pAPI
)
{
int32_t
code
=
0
;
int32_t
numOfTables
=
taosArrayGetSize
(
aUidTags
);
STagScanFilterContext
ctx
=
{
0
};
ctx
.
colHash
=
taosHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_SMALLINT
),
false
,
HASH_NO_LOCK
);
ctx
.
cInfoList
=
taosArrayInit
(
4
,
sizeof
(
SColumnInfo
));
nodesRewriteExprPostOrder
(
&
pTagCond
,
tagScanRewriteTagColumn
,
(
void
*
)
&
ctx
);
SSDataBlock
*
pResBlock
=
createTagValBlockForFilter
(
ctx
.
cInfoList
,
numOfTables
,
aUidTags
,
pVnode
,
pAPI
);
SArray
*
pBlockList
=
taosArrayInit
(
1
,
POINTER_BYTES
);
taosArrayPush
(
pBlockList
,
&
pResBlock
);
SDataType
type
=
{.
type
=
TSDB_DATA_TYPE_BOOL
,
.
bytes
=
sizeof
(
bool
)};
SScalarParam
output
=
{
0
};
tagScanCreateResultData
(
&
type
,
numOfTables
,
&
output
);
scalarCalculate
(
pTagCond
,
pBlockList
,
&
output
);
bool
*
result
=
(
bool
*
)
output
.
columnData
->
pData
;
for
(
int32_t
i
=
0
;
i
<
numOfTables
;
++
i
)
{
if
(
result
[
i
])
{
taosArrayPush
(
aFilterIdxs
,
&
i
);
}
}
colDataDestroy
(
output
.
columnData
);
taosMemoryFreeClear
(
output
.
columnData
);
blockDataDestroy
(
pResBlock
);
taosArrayDestroy
(
pBlockList
);
taosHashCleanup
(
ctx
.
colHash
);
taosArrayDestroy
(
ctx
.
cInfoList
);
}
static
void
tagScanFillOneCellWithTag
(
const
STUidTagInfo
*
pUidTagInfo
,
SExprInfo
*
pExprInfo
,
SColumnInfoData
*
pColInfo
,
int
rowIndex
,
const
SStorageAPI
*
pAPI
,
void
*
pVnode
)
{
if
(
fmIsScanPseudoColumnFunc
(
pExprInfo
->
pExpr
->
_function
.
functionId
))
{
// tbname
char
str
[
TSDB_TABLE_FNAME_LEN
+
VARSTR_HEADER_SIZE
]
=
{
0
};
// if (pUidTagInfo->name != NULL) {
// STR_TO_VARSTR(str, pUidTagInfo->name);
// } else { // name is not retrieved during filter
// pAPI->metaFn.getTableNameByUid(pVnode, pUidTagInfo->uid, str);
// }
STR_TO_VARSTR
(
str
,
"zsl"
);
colDataSetVal
(
pColInfo
,
rowIndex
,
str
,
false
);
}
else
{
STagVal
tagVal
=
{
0
};
tagVal
.
cid
=
pExprInfo
->
base
.
pParam
[
0
].
pCol
->
colId
;
if
(
pUidTagInfo
->
pTagVal
==
NULL
)
{
colDataSetNULL
(
pColInfo
,
rowIndex
);
}
else
{
const
char
*
p
=
pAPI
->
metaFn
.
extractTagVal
(
pUidTagInfo
->
pTagVal
,
pColInfo
->
info
.
type
,
&
tagVal
);
if
(
p
==
NULL
||
(
pColInfo
->
info
.
type
==
TSDB_DATA_TYPE_JSON
&&
((
STag
*
)
p
)
->
nTag
==
0
))
{
colDataSetNULL
(
pColInfo
,
rowIndex
);
}
else
if
(
pColInfo
->
info
.
type
==
TSDB_DATA_TYPE_JSON
)
{
colDataSetVal
(
pColInfo
,
rowIndex
,
p
,
false
);
}
else
if
(
IS_VAR_DATA_TYPE
(
pColInfo
->
info
.
type
))
{
char
*
tmp
=
taosMemoryMalloc
(
tagVal
.
nData
+
VARSTR_HEADER_SIZE
+
1
);
varDataSetLen
(
tmp
,
tagVal
.
nData
);
memcpy
(
tmp
+
VARSTR_HEADER_SIZE
,
tagVal
.
pData
,
tagVal
.
nData
);
colDataSetVal
(
pColInfo
,
rowIndex
,
tmp
,
false
);
taosMemoryFree
(
tmp
);
}
else
{
colDataSetVal
(
pColInfo
,
rowIndex
,
(
const
char
*
)
&
tagVal
.
i64
,
false
);
}
}
}
}
static
int32_t
tagScanFillResultBlock
(
SOperatorInfo
*
pOperator
,
SSDataBlock
*
pRes
,
SArray
*
aUidTags
,
SArray
*
aFilterIdxs
,
SStorageAPI
*
pAPI
)
{
STagScanInfo
*
pInfo
=
pOperator
->
info
;
SExprInfo
*
pExprInfo
=
&
pOperator
->
exprSupp
.
pExprInfo
[
0
];
size_t
szTables
=
taosArrayGetSize
(
aFilterIdxs
);
for
(
int
i
=
0
;
i
<
szTables
;
++
i
)
{
int32_t
idx
=
*
(
int32_t
*
)
taosArrayGet
(
aFilterIdxs
,
i
);
STUidTagInfo
*
pUidTagInfo
=
taosArrayGet
(
aUidTags
,
idx
);
for
(
int32_t
j
=
0
;
j
<
pOperator
->
exprSupp
.
numOfExprs
;
++
j
)
{
SColumnInfoData
*
pDst
=
taosArrayGet
(
pRes
->
pDataBlock
,
pExprInfo
[
j
].
base
.
resSchema
.
slotId
);
tagScanFillOneCellWithTag
(
pUidTagInfo
,
&
pExprInfo
[
j
],
pDst
,
i
,
pAPI
,
pInfo
->
readHandle
.
vnode
);
}
}
return
0
;
}
#if 0
static int32_t tagScanFillResultBlock(SOperatorInfo* pOperator, SSDataBlock* pRes, SArray* aUidTags,
SStorageAPI* pAPI) {
STagScanInfo* pInfo = pOperator->info;
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[0];
int32_t nTbls = taosArrayGetSize(aUidTags);
for (int i = 0; i < nTbls; ++i) {
STUidTagInfo* pUidTagInfo = taosArrayGet(aUidTags, i);
for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
SColumnInfoData* pDst = taosArrayGet(pRes->pDataBlock, pExprInfo[j].base.resSchema.slotId);
// refactor later
if (fmIsScanPseudoColumnFunc(pExprInfo[j].pExpr->_function.functionId)) {
char str[512];
STR_TO_VARSTR(str, "zsl");
colDataSetVal(pDst, (i), str, false);
} else { // it is a tag value
STagVal val = {0};
val.cid = pExprInfo[j].base.pParam[0].pCol->colId;
const char* p = pAPI->metaFn.extractTagVal(pUidTagInfo->pTagVal, pDst->info.type, &val);
char* data = NULL;
if (pDst->info.type != TSDB_DATA_TYPE_JSON && p != NULL) {
data = tTagValToData((const STagVal*)p, false);
} else {
data = (char*)p;
}
colDataSetVal(pDst, i, data,
(data == NULL) || (pDst->info.type == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(data)));
if (pDst->info.type != TSDB_DATA_TYPE_JSON && p != NULL && IS_VAR_DATA_TYPE(((const STagVal*)p)->type) &&
data != NULL) {
taosMemoryFree(data);
}
}
}
}
return 0;
}
#endif
static
SSDataBlock
*
doTagScanFromCtbIdx
(
SOperatorInfo
*
pOperator
)
{
if
(
pOperator
->
status
==
OP_EXEC_DONE
)
{
return
NULL
;
}
SExecTaskInfo
*
pTaskInfo
=
pOperator
->
pTaskInfo
;
SStorageAPI
*
pAPI
=
&
pTaskInfo
->
storageAPI
;
STagScanInfo
*
pInfo
=
pOperator
->
info
;
SSDataBlock
*
pRes
=
pInfo
->
pRes
;
blockDataCleanup
(
pRes
);
int32_t
count
=
0
;
if
(
pInfo
->
pCtbCursor
==
NULL
)
{
pInfo
->
pCtbCursor
=
pAPI
->
metaFn
.
openCtbCursor
(
pInfo
->
readHandle
.
vnode
,
pInfo
->
suid
,
1
);
}
SArray
*
aUidTags
=
taosArrayInit
(
pOperator
->
resultInfo
.
capacity
,
sizeof
(
STUidTagInfo
));
SArray
*
aFilterIdxs
=
taosArrayInit
(
pOperator
->
resultInfo
.
capacity
,
sizeof
(
int32_t
));
while
(
1
)
{
while
(
count
<
pOperator
->
resultInfo
.
capacity
)
{
SMCtbCursor
*
pCur
=
pInfo
->
pCtbCursor
;
tb_uid_t
uid
=
pAPI
->
metaFn
.
ctbCursorNext
(
pInfo
->
pCtbCursor
);
if
(
uid
==
0
)
{
break
;
}
STUidTagInfo
info
=
{.
uid
=
uid
,
.
pTagVal
=
pCur
->
pVal
};
info
.
pTagVal
=
taosMemoryMalloc
(
pCur
->
vLen
);
memcpy
(
info
.
pTagVal
,
pCur
->
pVal
,
pCur
->
vLen
);
taosArrayPush
(
aUidTags
,
&
info
);
}
int32_t
numTables
=
taosArrayGetSize
(
aUidTags
);
if
(
numTables
==
0
)
{
break
;
}
tagScanFilterByTagCond
(
aUidTags
,
pInfo
->
pTagCond
,
pInfo
->
readHandle
.
vnode
,
aFilterIdxs
,
pAPI
);
tagScanFillResultBlock
(
pOperator
,
pRes
,
aUidTags
,
aFilterIdxs
,
pAPI
);
count
=
taosArrayGetSize
(
aFilterIdxs
);
if
(
count
!=
0
)
{
break
;
}
taosArrayClearEx
(
aUidTags
,
tagScanFreeUidTag
);
taosArrayClear
(
aFilterIdxs
);
}
taosArrayDestroy
(
aFilterIdxs
);
taosArrayDestroyEx
(
aUidTags
,
tagScanFreeUidTag
);
pOperator
->
resultInfo
.
totalRows
+=
count
;
return
(
pRes
->
info
.
rows
==
0
)
?
NULL
:
pInfo
->
pRes
;
}
static
SSDataBlock
*
doTagScan
(
SOperatorInfo
*
pOperator
)
{
if
(
pOperator
->
status
==
OP_EXEC_DONE
)
{
return
NULL
;
...
...
@@ -2746,6 +3017,9 @@ static SSDataBlock* doTagScan(SOperatorInfo* pOperator) {
static
void
destroyTagScanOperatorInfo
(
void
*
param
)
{
STagScanInfo
*
pInfo
=
(
STagScanInfo
*
)
param
;
if
(
pInfo
->
pCtbCursor
!=
NULL
)
{
pInfo
->
pStorageAPI
->
metaFn
.
closeCtbCursor
(
pInfo
->
pCtbCursor
,
1
);
}
pInfo
->
pRes
=
blockDataDestroy
(
pInfo
->
pRes
);
taosArrayDestroy
(
pInfo
->
matchInfo
.
pList
);
pInfo
->
pTableListInfo
=
tableListDestroy
(
pInfo
->
pTableListInfo
);
...
...
@@ -2753,7 +3027,7 @@ static void destroyTagScanOperatorInfo(void* param) {
}
SOperatorInfo
*
createTagScanOperatorInfo
(
SReadHandle
*
pReadHandle
,
STagScanPhysiNode
*
pPhyNode
,
STableListInfo
*
pTableListInfo
,
SExecTaskInfo
*
pTaskInfo
)
{
STableListInfo
*
pTableListInfo
,
S
Node
*
pTagCond
,
SNode
*
pTagIndexCond
,
S
ExecTaskInfo
*
pTaskInfo
)
{
STagScanInfo
*
pInfo
=
taosMemoryCalloc
(
1
,
sizeof
(
STagScanInfo
));
SOperatorInfo
*
pOperator
=
taosMemoryCalloc
(
1
,
sizeof
(
SOperatorInfo
));
if
(
pInfo
==
NULL
||
pOperator
==
NULL
)
{
...
...
@@ -2775,6 +3049,11 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
goto
_error
;
}
pInfo
->
pTagCond
=
pTagCond
;
pInfo
->
pTagIndexCond
=
pTagIndexCond
;
pInfo
->
suid
=
pPhyNode
->
suid
;
pInfo
->
pStorageAPI
=
&
pTaskInfo
->
storageAPI
;
pInfo
->
pTableListInfo
=
pTableListInfo
;
pInfo
->
pRes
=
createDataBlockFromDescNode
(
pDescNode
);
pInfo
->
readHandle
=
*
pReadHandle
;
...
...
@@ -2786,8 +3065,9 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
initResultSizeInfo
(
&
pOperator
->
resultInfo
,
4096
);
blockDataEnsureCapacity
(
pInfo
->
pRes
,
pOperator
->
resultInfo
.
capacity
);
__optr_fn_t
tagScanNextFn
=
(
pPhyNode
->
onlyMetaCtbIdx
)
?
doTagScanFromCtbIdx
:
doTagScan
;
pOperator
->
fpSet
=
createOperatorFpSet
(
optrDummyOpenFn
,
doTagSca
n
,
NULL
,
destroyTagScanOperatorInfo
,
optrDefaultBufFn
,
NULL
);
createOperatorFpSet
(
optrDummyOpenFn
,
tagScanNextF
n
,
NULL
,
destroyTagScanOperatorInfo
,
optrDefaultBufFn
,
NULL
);
return
pOperator
;
...
...
source/libs/nodes/src/nodesCloneFuncs.c
浏览文件 @
42a4f364
...
...
@@ -564,7 +564,16 @@ static int32_t physiScanCopy(const SScanPhysiNode* pSrc, SScanPhysiNode* pDst) {
}
static
int32_t
physiTagScanCopy
(
const
STagScanPhysiNode
*
pSrc
,
STagScanPhysiNode
*
pDst
)
{
return
physiScanCopy
(
pSrc
,
pDst
);
COPY_BASE_OBJECT_FIELD
(
node
,
physiNodeCopy
);
CLONE_NODE_LIST_FIELD
(
pScanCols
);
CLONE_NODE_LIST_FIELD
(
pScanPseudoCols
);
COPY_SCALAR_FIELD
(
uid
);
COPY_SCALAR_FIELD
(
suid
);
COPY_SCALAR_FIELD
(
tableType
);
COPY_OBJECT_FIELD
(
tableName
,
sizeof
(
SName
));
COPY_SCALAR_FIELD
(
groupOrderScan
);
COPY_SCALAR_FIELD
(
onlyMetaCtbIdx
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
physiTableScanCopy
(
const
STableScanPhysiNode
*
pSrc
,
STableScanPhysiNode
*
pDst
)
{
...
...
source/libs/nodes/src/nodesCodeFuncs.c
浏览文件 @
42a4f364
...
...
@@ -1562,7 +1562,7 @@ static const char* jkScanPhysiPlanTableName = "TableName";
static
const
char
*
jkScanPhysiPlanGroupOrderScan
=
"GroupOrderScan"
;
static
int32_t
physiScanNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
S
TagScanPhysiNode
*
pNode
=
(
const
STag
ScanPhysiNode
*
)
pObj
;
const
S
ScanPhysiNode
*
pNode
=
(
const
S
ScanPhysiNode
*
)
pObj
;
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
...
@@ -1591,7 +1591,7 @@ static int32_t physiScanNodeToJson(const void* pObj, SJson* pJson) {
}
static
int32_t
jsonToPhysiScanNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
S
TagScanPhysiNode
*
pNode
=
(
STag
ScanPhysiNode
*
)
pObj
;
S
ScanPhysiNode
*
pNode
=
(
S
ScanPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
...
@@ -1619,6 +1619,70 @@ static int32_t jsonToPhysiScanNode(const SJson* pJson, void* pObj) {
return
code
;
}
static
const
char
*
jkTagScanPhysiOnlyMetaCtbIdx
=
"OnlyMetaCtbIdx"
;
static
int32_t
physiTagScanNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
STagScanPhysiNode
*
pNode
=
(
const
STagScanPhysiNode
*
)
pObj
;
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkScanPhysiPlanScanCols
,
pNode
->
pScanCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkScanPhysiPlanScanPseudoCols
,
pNode
->
pScanPseudoCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkScanPhysiPlanTableId
,
pNode
->
uid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkScanPhysiPlanSTableId
,
pNode
->
suid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkScanPhysiPlanTableType
,
pNode
->
tableType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkScanPhysiPlanTableName
,
nameToJson
,
&
pNode
->
tableName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkScanPhysiPlanGroupOrderScan
,
pNode
->
groupOrderScan
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkTagScanPhysiOnlyMetaCtbIdx
,
pNode
->
onlyMetaCtbIdx
);
}
return
code
;
}
static
int32_t
jsonToPhysiTagScanNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
STagScanPhysiNode
*
pNode
=
(
STagScanPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkScanPhysiPlanScanCols
,
&
pNode
->
pScanCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkScanPhysiPlanScanPseudoCols
,
&
pNode
->
pScanPseudoCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetUBigIntValue
(
pJson
,
jkScanPhysiPlanTableId
,
&
pNode
->
uid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetUBigIntValue
(
pJson
,
jkScanPhysiPlanSTableId
,
&
pNode
->
suid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetTinyIntValue
(
pJson
,
jkScanPhysiPlanTableType
,
&
pNode
->
tableType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonToObject
(
pJson
,
jkScanPhysiPlanTableName
,
jsonToName
,
&
pNode
->
tableName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkScanPhysiPlanGroupOrderScan
,
&
pNode
->
groupOrderScan
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkTagScanPhysiOnlyMetaCtbIdx
,
&
pNode
->
onlyMetaCtbIdx
);
}
return
code
;
}
static
const
char
*
jkLastRowScanPhysiPlanGroupTags
=
"GroupTags"
;
static
const
char
*
jkLastRowScanPhysiPlanGroupSort
=
"GroupSort"
;
...
...
@@ -6590,6 +6654,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
case
QUERY_NODE_LOGIC_PLAN
:
return
logicPlanToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
return
physiTableScanNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN
:
return
physiScanNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN
:
...
...
@@ -6908,6 +6973,7 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
case
QUERY_NODE_LOGIC_PLAN
:
return
jsonToLogicPlan
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
return
jsonToPhysiTagScanNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN
:
case
QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN
:
return
jsonToPhysiScanNode
(
pJson
,
pObj
);
...
...
source/libs/nodes/src/nodesMsgFuncs.c
浏览文件 @
42a4f364
...
...
@@ -2003,6 +2003,91 @@ static int32_t msgToPhysiScanNode(STlvDecoder* pDecoder, void* pObj) {
return
code
;
}
enum
{
PHY_TAG_SCAN_CODE_BASE_NODE
=
1
,
PHY_TAG_SCAN_CODE_SCAN_COLS
,
PHY_TAG_SCAN_CODE_SCAN_PSEUDO_COLS
,
PHY_TAG_SCAN_CODE_BASE_UID
,
PHY_TAG_SCAN_CODE_BASE_SUID
,
PHY_TAG_SCAN_CODE_BASE_TABLE_TYPE
,
PHY_TAG_SCAN_CODE_BASE_TABLE_NAME
,
PHY_TAG_SCAN_CODE_BASE_GROUP_ORDER_SCAN
,
PHY_TAG_SCAN_CODE_ONLY_META_CTB_IDX
};
static
int32_t
physiTagScanNodeToMsg
(
const
void
*
pObj
,
STlvEncoder
*
pEncoder
)
{
const
STagScanPhysiNode
*
pNode
=
(
const
STagScanPhysiNode
*
)
pObj
;
int32_t
code
=
tlvEncodeObj
(
pEncoder
,
PHY_TAG_SCAN_CODE_BASE_NODE
,
physiNodeToMsg
,
&
pNode
->
node
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeObj
(
pEncoder
,
PHY_TAG_SCAN_CODE_SCAN_COLS
,
nodeListToMsg
,
pNode
->
pScanCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeObj
(
pEncoder
,
PHY_TAG_SCAN_CODE_SCAN_PSEUDO_COLS
,
nodeListToMsg
,
pNode
->
pScanPseudoCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeU64
(
pEncoder
,
PHY_TAG_SCAN_CODE_BASE_UID
,
pNode
->
uid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeU64
(
pEncoder
,
PHY_TAG_SCAN_CODE_BASE_SUID
,
pNode
->
suid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeI8
(
pEncoder
,
PHY_TAG_SCAN_CODE_BASE_TABLE_TYPE
,
pNode
->
tableType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeObj
(
pEncoder
,
PHY_TAG_SCAN_CODE_BASE_TABLE_NAME
,
nameToMsg
,
&
pNode
->
tableName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeBool
(
pEncoder
,
PHY_TAG_SCAN_CODE_BASE_GROUP_ORDER_SCAN
,
pNode
->
groupOrderScan
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tlvEncodeBool
(
pEncoder
,
PHY_TAG_SCAN_CODE_ONLY_META_CTB_IDX
,
pNode
->
onlyMetaCtbIdx
);
}
return
code
;
}
static
int32_t
msgToPhysiTagScanNode
(
STlvDecoder
*
pDecoder
,
void
*
pObj
)
{
STagScanPhysiNode
*
pNode
=
(
STagScanPhysiNode
*
)
pObj
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
STlv
*
pTlv
=
NULL
;
tlvForEach
(
pDecoder
,
pTlv
,
code
)
{
switch
(
pTlv
->
type
)
{
case
PHY_TAG_SCAN_CODE_BASE_NODE
:
code
=
tlvDecodeObjFromTlv
(
pTlv
,
msgToPhysiNode
,
&
pNode
->
node
);
break
;
case
PHY_TAG_SCAN_CODE_SCAN_COLS
:
code
=
msgToNodeListFromTlv
(
pTlv
,
(
void
**
)
&
pNode
->
pScanCols
);
break
;
case
PHY_TAG_SCAN_CODE_SCAN_PSEUDO_COLS
:
code
=
msgToNodeListFromTlv
(
pTlv
,
(
void
**
)
&
pNode
->
pScanPseudoCols
);
break
;
case
PHY_TAG_SCAN_CODE_BASE_UID
:
code
=
tlvDecodeU64
(
pTlv
,
&
pNode
->
uid
);
break
;
case
PHY_TAG_SCAN_CODE_BASE_SUID
:
code
=
tlvDecodeU64
(
pTlv
,
&
pNode
->
suid
);
break
;
case
PHY_TAG_SCAN_CODE_BASE_TABLE_TYPE
:
code
=
tlvDecodeI8
(
pTlv
,
&
pNode
->
tableType
);
break
;
case
PHY_TAG_SCAN_CODE_BASE_TABLE_NAME
:
code
=
tlvDecodeObjFromTlv
(
pTlv
,
msgToName
,
&
pNode
->
tableName
);
break
;
case
PHY_TAG_SCAN_CODE_BASE_GROUP_ORDER_SCAN
:
code
=
tlvDecodeBool
(
pTlv
,
&
pNode
->
groupOrderScan
);
break
;
case
PHY_TAG_SCAN_CODE_ONLY_META_CTB_IDX
:
code
=
tlvDecodeBool
(
pTlv
,
&
pNode
->
onlyMetaCtbIdx
);
break
;
default:
break
;
}
}
return
code
;
}
enum
{
PHY_LAST_ROW_SCAN_CODE_SCAN
=
1
,
PHY_LAST_ROW_SCAN_CODE_GROUP_TAGS
,
...
...
@@ -3726,6 +3811,8 @@ static int32_t specificNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
code
=
caseWhenNodeToMsg
(
pObj
,
pEncoder
);
break
;
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
code
=
physiTagScanNodeToMsg
(
pObj
,
pEncoder
);
break
;
case
QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN
:
code
=
physiScanNodeToMsg
(
pObj
,
pEncoder
);
break
;
...
...
@@ -3869,6 +3956,8 @@ static int32_t msgToSpecificNode(STlvDecoder* pDecoder, void* pObj) {
code
=
msgToCaseWhenNode
(
pDecoder
,
pObj
);
break
;
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
code
=
msgToPhysiTagScanNode
(
pDecoder
,
pObj
);
break
;
case
QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN
:
code
=
msgToPhysiScanNode
(
pDecoder
,
pObj
);
break
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录