Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
7ba4e6f4
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
7ba4e6f4
编写于
2月 27, 2022
作者:
X
xiao-yu-wang
提交者:
GitHub
2月 27, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10408 from taosdata/feature/3.0_wxy
TD-13495 physical plan refactoring
上级
8dc88e4d
b02b53eb
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
802 addition
and
126 deletion
+802
-126
include/libs/nodes/nodes.h
include/libs/nodes/nodes.h
+1
-1
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+6
-4
include/libs/nodes/querynodes.h
include/libs/nodes/querynodes.h
+2
-10
include/util/tjson.h
include/util/tjson.h
+21
-2
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+10
-0
source/libs/index/test/utilUT.cc
source/libs/index/test/utilUT.cc
+0
-1
source/libs/nodes/src/nodesCloneFuncs.c
source/libs/nodes/src/nodesCloneFuncs.c
+3
-1
source/libs/nodes/src/nodesCodeFuncs.c
source/libs/nodes/src/nodesCodeFuncs.c
+564
-35
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+2
-2
source/libs/parser/test/mockCatalog.cpp
source/libs/parser/test/mockCatalog.cpp
+3
-2
source/libs/planner/src/plannerImpl.c
source/libs/planner/src/plannerImpl.c
+66
-57
source/libs/planner/test/newPlannerTest.cpp
source/libs/planner/test/newPlannerTest.cpp
+4
-4
source/libs/scalar/src/filter.c
source/libs/scalar/src/filter.c
+3
-3
source/libs/scalar/test/filter/filterTests.cpp
source/libs/scalar/test/filter/filterTests.cpp
+1
-1
source/libs/scalar/test/scalar/scalarTests.cpp
source/libs/scalar/test/scalar/scalarTests.cpp
+1
-1
source/util/src/tjson.c
source/util/src/tjson.c
+114
-1
tests
tests
+1
-1
未找到文件。
include/libs/nodes/nodes.h
浏览文件 @
7ba4e6f4
...
...
@@ -63,7 +63,7 @@ typedef enum ENodeType {
QUERY_NODE_FILL
,
QUERY_NODE_RAW_EXPR
,
// Only be used in parser module.
QUERY_NODE_TARGET
,
QUERY_NODE_
TUPLE
_DESC
,
QUERY_NODE_
DATABLOCK
_DESC
,
QUERY_NODE_SLOT_DESC
,
// Statement nodes are used in parser and planner module.
...
...
include/libs/nodes/plannodes.h
浏览文件 @
7ba4e6f4
...
...
@@ -71,17 +71,18 @@ typedef struct SSlotDescNode {
SDataType
dataType
;
bool
reserve
;
bool
output
;
bool
tag
;
}
SSlotDescNode
;
typedef
struct
S
Tuple
DescNode
{
typedef
struct
S
DataBlock
DescNode
{
ENodeType
type
;
int16_t
tuple
Id
;
int16_t
dataBlock
Id
;
SNodeList
*
pSlots
;
}
S
Tuple
DescNode
;
}
S
DataBlock
DescNode
;
typedef
struct
SPhysiNode
{
ENodeType
type
;
S
TupleDescNode
outputTuple
;
S
DataBlockDescNode
outputDataBlockDesc
;
SNode
*
pConditions
;
SNodeList
*
pChildren
;
struct
SPhysiNode
*
pParent
;
...
...
@@ -104,6 +105,7 @@ typedef struct STableScanPhysiNode {
SScanPhysiNode
scan
;
uint8_t
scanFlag
;
// denotes reversed scan of data or not
STimeWindow
scanRange
;
SNode
*
pScanConditions
;
}
STableScanPhysiNode
;
typedef
STableScanPhysiNode
STableSeqScanPhysiNode
;
...
...
include/libs/nodes/querynodes.h
浏览文件 @
7ba4e6f4
...
...
@@ -58,21 +58,13 @@ typedef struct SColumnNode {
char
tableAlias
[
TSDB_TABLE_NAME_LEN
];
char
colName
[
TSDB_COL_NAME_LEN
];
SNode
*
pProjectRef
;
int16_t
tuple
Id
;
int16_t
dataBlock
Id
;
int16_t
slotId
;
}
SColumnNode
;
// typedef struct SColumnRefNode {
// ENodeType type;
// SDataType dataType;
// int16_t tupleId;
// int16_t slotId;
// int16_t columnId;
// } SColumnRefNode;
typedef
struct
STargetNode
{
ENodeType
type
;
int16_t
tuple
Id
;
int16_t
dataBlock
Id
;
int16_t
slotId
;
SNode
*
pExpr
;
}
STargetNode
;
...
...
include/util/tjson.h
浏览文件 @
7ba4e6f4
...
...
@@ -28,23 +28,42 @@ SJson* tjsonCreateObject();
void
tjsonDelete
(
SJson
*
pJson
);
SJson
*
tjsonAddArrayToObject
(
SJson
*
pJson
,
const
char
*
pName
);
int32_t
tjsonAddIntegerToObject
(
SJson
*
pJson
,
const
char
*
pName
,
const
uint64_t
number
);
int32_t
tjsonAddDoubleToObject
(
SJson
*
pJson
,
const
char
*
pName
,
const
double
number
);
int32_t
tjsonAddBoolToObject
(
SJson
*
pJson
,
const
char
*
pName
,
const
bool
boolean
);
int32_t
tjsonAddStringToObject
(
SJson
*
pJson
,
const
char
*
pName
,
const
char
*
pVal
);
int32_t
tjsonAddItemToObject
(
SJson
*
pJson
,
const
char
*
pName
,
SJson
*
pItem
);
int32_t
tjsonAddItemToArray
(
SJson
*
pJson
,
SJson
*
pItem
);
SJson
*
tjsonGetObjectItem
(
const
SJson
*
pJson
,
const
char
*
pName
);
int32_t
tjsonGetStringValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
char
*
pVal
);
int32_t
tjsonDupStringValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
char
**
pVal
);
int32_t
tjsonGetBigIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int64_t
*
pVal
);
int32_t
tjsonGetIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int32_t
*
pVal
);
int32_t
tjsonGetSmallIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int16_t
*
pVal
);
int32_t
tjsonGetTinyIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int8_t
*
pVal
);
int32_t
tjsonGetUBigIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
uint64_t
*
pVal
);
int32_t
tjsonGetUTinyIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
uint8_t
*
pVal
);
int32_t
tjsonGetBoolValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
bool
*
pVal
);
int32_t
tjsonGetDoubleValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
double
*
pVal
);
int32_t
tjsonGetArraySize
(
const
SJson
*
pJson
);
SJson
*
tjsonGetArrayItem
(
const
SJson
*
pJson
,
int32_t
index
);
typedef
int32_t
(
*
FToJson
)(
const
void
*
pObj
,
SJson
*
pJson
);
int32_t
tjsonAddObject
(
SJson
*
pJson
,
const
char
*
pName
,
FToJson
func
,
const
void
*
pObj
);
int32_t
tjsonAddItem
(
SJson
*
pJson
,
FToJson
func
,
const
void
*
pObj
);
typedef
int32_t
(
*
FFromJson
)(
const
SJson
*
pJson
,
void
*
pObj
);
typedef
int32_t
(
*
FToObject
)(
const
SJson
*
pJson
,
void
*
pObj
);
int32_t
tjsonToObject
(
const
SJson
*
pJson
,
const
char
*
pName
,
FToObject
func
,
void
*
pObj
);
char
*
tjsonToString
(
const
SJson
*
pJson
);
char
*
tjsonToUnformattedString
(
const
SJson
*
pJson
);
SJson
*
tjsonParse
(
const
char
*
pStr
);
#ifdef __cplusplus
}
#endif
...
...
source/libs/function/src/builtins.c
浏览文件 @
7ba4e6f4
...
...
@@ -29,6 +29,16 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
processFunc
=
NULL
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"sum"
,
.
type
=
FUNCTION_TYPE_SUM
,
.
classification
=
FUNC_MGT_AGG_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
processFunc
=
NULL
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"concat"
,
.
type
=
FUNCTION_TYPE_CONCAT
,
...
...
source/libs/index/test/utilUT.cc
浏览文件 @
7ba4e6f4
...
...
@@ -192,7 +192,6 @@ TEST_F(UtilEnv, 03union) {
for
(
int
i
=
0
;
i
<
sizeof
(
arr2
)
/
sizeof
(
arr2
[
0
]);
i
++
)
{
taosArrayPush
(
f
,
&
arr2
[
i
]);
}
uint64_t
arr3
[]
=
{
1
,
12
,
13
,
16
,
17
};
f
=
(
SArray
*
)
taosArrayGetP
(
src
,
2
);
for
(
int
i
=
0
;
i
<
sizeof
(
arr3
)
/
sizeof
(
arr3
[
0
]);
i
++
)
{
...
...
source/libs/nodes/src/nodesCloneFuncs.c
浏览文件 @
7ba4e6f4
...
...
@@ -72,6 +72,8 @@ static SNode* columnNodeCopy(const SColumnNode* pSrc, SColumnNode* pDst) {
COPY_CHAR_ARRAY_FIELD
(
tableAlias
);
COPY_CHAR_ARRAY_FIELD
(
colName
);
// COPY_NODE_FIELD(pProjectRef);
COPY_SCALAR_FIELD
(
dataBlockId
);
COPY_SCALAR_FIELD
(
slotId
);
return
(
SNode
*
)
pDst
;
}
...
...
@@ -143,7 +145,7 @@ static SNode* functionNodeCopy(const SFunctionNode* pSrc, SFunctionNode* pDst) {
}
static
SNode
*
targetNodeCopy
(
const
STargetNode
*
pSrc
,
STargetNode
*
pDst
)
{
COPY_SCALAR_FIELD
(
tuple
Id
);
COPY_SCALAR_FIELD
(
dataBlock
Id
);
COPY_SCALAR_FIELD
(
slotId
);
COPY_NODE_FIELD
(
pExpr
);
return
(
SNode
*
)
pDst
;
...
...
source/libs/nodes/src/nodesCodeFuncs.c
浏览文件 @
7ba4e6f4
...
...
@@ -20,6 +20,9 @@
#include "tjson.h"
static
int32_t
nodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
);
static
int32_t
jsonToNode
(
const
SJson
*
pJson
,
void
*
pObj
);
static
int32_t
jsonToNodeObject
(
const
SJson
*
pJson
,
const
char
*
pName
,
SNode
**
pNode
);
static
int32_t
makeNodeByJson
(
const
SJson
*
pJson
,
SNode
**
pNode
);
static
char
*
nodeName
(
ENodeType
type
)
{
switch
(
type
)
{
...
...
@@ -59,7 +62,7 @@ static char* nodeName(ENodeType type) {
return
"Target"
;
case
QUERY_NODE_RAW_EXPR
:
return
"RawExpr"
;
case
QUERY_NODE_
TUPLE
_DESC
:
case
QUERY_NODE_
DATABLOCK
_DESC
:
return
"TupleDesc"
;
case
QUERY_NODE_SLOT_DESC
:
return
"SlotDesc"
;
...
...
@@ -83,6 +86,10 @@ static char* nodeName(ENodeType type) {
return
"PhysiTableScan"
;
case
QUERY_NODE_PHYSICAL_PLAN_PROJECT
:
return
"PhysiProject"
;
case
QUERY_NODE_PHYSICAL_PLAN_JOIN
:
return
"PhysiJoin"
;
case
QUERY_NODE_PHYSICAL_PLAN_AGG
:
return
"PhysiAgg"
;
default:
break
;
}
...
...
@@ -91,7 +98,7 @@ static char* nodeName(ENodeType type) {
return
tmp
;
}
static
int32_t
addNodeList
(
SJson
*
pJson
,
const
char
*
pName
,
FToJson
func
,
const
SNodeList
*
pList
)
{
static
int32_t
nodeListToJson
(
SJson
*
pJson
,
const
char
*
pName
,
const
SNodeList
*
pList
)
{
if
(
LIST_LENGTH
(
pList
)
>
0
)
{
SJson
*
jList
=
tjsonAddArrayToObject
(
pJson
,
pName
);
if
(
NULL
==
jList
)
{
...
...
@@ -99,7 +106,7 @@ static int32_t addNodeList(SJson* pJson, const char* pName, FToJson func, const
}
SNode
*
pNode
;
FOREACH
(
pNode
,
pList
)
{
int32_t
code
=
tjsonAddItem
(
jList
,
func
,
pNode
);
int32_t
code
=
tjsonAddItem
(
jList
,
nodeToJson
,
pNode
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
return
code
;
}
...
...
@@ -108,6 +115,31 @@ static int32_t addNodeList(SJson* pJson, const char* pName, FToJson func, const
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
jsonToNodeList
(
const
SJson
*
pJson
,
const
char
*
pName
,
SNodeList
**
pList
)
{
const
SJson
*
pJsonArray
=
tjsonGetObjectItem
(
pJson
,
pName
);
int32_t
size
=
(
NULL
==
pJsonArray
?
0
:
tjsonGetArraySize
(
pJsonArray
));
if
(
size
>
0
)
{
*
pList
=
nodesMakeList
();
if
(
NULL
==
*
pList
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
int32_t
code
=
TSDB_CODE_SUCCESS
;
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SJson
*
pJsonItem
=
tjsonGetArrayItem
(
pJsonArray
,
i
);
SNode
*
pNode
=
NULL
;
code
=
makeNodeByJson
(
pJsonItem
,
&
pNode
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListAppend
(
*
pList
,
pNode
);
}
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
break
;
}
}
return
code
;
}
static
const
char
*
jkTableMetaUid
=
"TableMetaUid"
;
static
const
char
*
jkTableMetaSuid
=
"TableMetaSuid"
;
...
...
@@ -132,13 +164,13 @@ static int32_t logicPlanNodeToJson(const void* pObj, SJson* pJson) {
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkLogicPlanId
,
pNode
->
id
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkLogicPlanTargets
,
nodeToJson
,
pNode
->
pTargets
);
code
=
nodeListToJson
(
pJson
,
jkLogicPlanTargets
,
pNode
->
pTargets
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkLogicPlanConditions
,
nodeToJson
,
pNode
->
pConditions
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkLogicPlanChildren
,
nodeToJso
n
,
pNode
->
pChildren
);
code
=
nodeListToJson
(
pJson
,
jkLogicPlanChildre
n
,
pNode
->
pChildren
);
}
return
code
;
...
...
@@ -152,7 +184,7 @@ static int32_t logicScanNodeToJson(const void* pObj, SJson* pJson) {
int32_t
code
=
logicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkScanLogicPlanScanCols
,
nodeToJson
,
pNode
->
pScanCols
);
code
=
nodeListToJson
(
pJson
,
jkScanLogicPlanScanCols
,
pNode
->
pScanCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkScanLogicPlanTableMeta
,
tableMetaToJson
,
pNode
->
pMeta
);
...
...
@@ -168,7 +200,7 @@ static int32_t logicProjectNodeToJson(const void* pObj, SJson* pJson) {
int32_t
code
=
logicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkProjectLogicPlanProjections
,
nodeToJson
,
pNode
->
pProjections
);
code
=
nodeListToJson
(
pJson
,
jkProjectLogicPlanProjections
,
pNode
->
pProjections
);
}
return
code
;
...
...
@@ -191,19 +223,33 @@ static int32_t logicJoinNodeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
const
char
*
jkPhysiPlanOutput
Tuple
=
"OutputTuple
"
;
static
const
char
*
jkPhysiPlanOutput
DataBlockDesc
=
"OutputDataBlockDesc
"
;
static
const
char
*
jkPhysiPlanConditions
=
"Conditions"
;
static
const
char
*
jkPhysiPlanChildren
=
"Children"
;
static
int32_t
physicPlanNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SPhysiNode
*
pNode
=
(
const
SPhysiNode
*
)
pObj
;
int32_t
code
=
tjsonAddObject
(
pJson
,
jkPhysiPlanOutput
Tuple
,
nodeToJson
,
&
pNode
->
outputTuple
);
int32_t
code
=
tjsonAddObject
(
pJson
,
jkPhysiPlanOutput
DataBlockDesc
,
nodeToJson
,
&
pNode
->
outputDataBlockDesc
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkPhysiPlanConditions
,
nodeToJson
,
pNode
->
pConditions
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkPhysiPlanChildren
,
nodeToJson
,
pNode
->
pChildren
);
code
=
nodeListToJson
(
pJson
,
jkPhysiPlanChildren
,
pNode
->
pChildren
);
}
return
code
;
}
static
int32_t
jsonToPhysicPlanNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SPhysiNode
*
pNode
=
(
SPhysiNode
*
)
pObj
;
int32_t
code
=
tjsonToObject
(
pJson
,
jkPhysiPlanOutputDataBlockDesc
,
jsonToNode
,
&
pNode
->
outputDataBlockDesc
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkPhysiPlanConditions
,
&
pNode
->
pConditions
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkPhysiPlanChildren
,
&
pNode
->
pChildren
);
}
return
code
;
...
...
@@ -221,7 +267,7 @@ static int32_t physiScanNodeToJson(const void* pObj, SJson* pJson) {
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkScanPhysiPlanScanCols
,
nodeToJson
,
pNode
->
pScanCols
);
code
=
nodeListToJson
(
pJson
,
jkScanPhysiPlanScanCols
,
pNode
->
pScanCols
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkScanPhysiPlanTableId
,
pNode
->
uid
);
...
...
@@ -242,10 +288,40 @@ static int32_t physiScanNodeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
int32_t
jsonToPhysiScanNode
(
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
=
tjsonGetUBigIntValue
(
pJson
,
jkScanPhysiPlanTableId
,
&
pNode
->
uid
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetTinyIntValue
(
pJson
,
jkScanPhysiPlanTableType
,
&
pNode
->
tableType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetIntValue
(
pJson
,
jkScanPhysiPlanScanOrder
,
&
pNode
->
order
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetIntValue
(
pJson
,
jkScanPhysiPlanScanCount
,
&
pNode
->
count
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetIntValue
(
pJson
,
jkScanPhysiPlanReverseScanCount
,
&
pNode
->
reverse
);
}
return
code
;
}
static
int32_t
physiTagScanNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
return
physiScanNodeToJson
(
pObj
,
pJson
);
}
static
int32_t
jsonToPhysiTagScanNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
return
jsonToPhysiScanNode
(
pJson
,
pObj
);
}
static
const
char
*
jkTableScanPhysiPlanScanFlag
=
"ScanFlag"
;
static
const
char
*
jkTableScanPhysiPlanStartKey
=
"StartKey"
;
static
const
char
*
jkTableScanPhysiPlanEndKey
=
"EndKey"
;
...
...
@@ -267,6 +343,23 @@ static int32_t physiTableScanNodeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
int32_t
jsonToPhysiTableScanNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
STableScanPhysiNode
*
pNode
=
(
STableScanPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysiScanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetUTinyIntValue
(
pJson
,
jkTableScanPhysiPlanScanFlag
,
&
pNode
->
scanFlag
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkTableScanPhysiPlanStartKey
,
&
pNode
->
scanRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkTableScanPhysiPlanEndKey
,
&
pNode
->
scanRange
.
ekey
);
}
return
code
;
}
static
const
char
*
jkProjectPhysiPlanProjections
=
"Projections"
;
static
int32_t
physiProjectNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
...
...
@@ -274,7 +367,96 @@ static int32_t physiProjectNodeToJson(const void* pObj, SJson* pJson) {
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkProjectPhysiPlanProjections
,
nodeToJson
,
pNode
->
pProjections
);
code
=
nodeListToJson
(
pJson
,
jkProjectPhysiPlanProjections
,
pNode
->
pProjections
);
}
return
code
;
}
static
int32_t
jsonToPhysiProjectNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SProjectPhysiNode
*
pNode
=
(
SProjectPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkProjectPhysiPlanProjections
,
&
pNode
->
pProjections
);
}
return
code
;
}
static
const
char
*
jkJoinPhysiPlanJoinType
=
"JoinType"
;
static
const
char
*
jkJoinPhysiPlanOnConditions
=
"OnConditions"
;
static
const
char
*
jkJoinPhysiPlanTargets
=
"Targets"
;
static
int32_t
physiJoinNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SJoinPhysiNode
*
pNode
=
(
const
SJoinPhysiNode
*
)
pObj
;
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkJoinPhysiPlanJoinType
,
pNode
->
joinType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkJoinPhysiPlanOnConditions
,
nodeToJson
,
pNode
->
pOnConditions
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkJoinPhysiPlanTargets
,
pNode
->
pTargets
);
}
return
code
;
}
static
int32_t
jsonToPhysiJoinNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SJoinPhysiNode
*
pNode
=
(
SJoinPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
int32_t
val
;
code
=
tjsonGetIntValue
(
pJson
,
jkJoinPhysiPlanJoinType
,
&
val
);
pNode
->
joinType
=
val
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkJoinPhysiPlanOnConditions
,
&
pNode
->
pOnConditions
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkJoinPhysiPlanTargets
,
&
pNode
->
pTargets
);
}
return
code
;
}
static
const
char
*
jkAggPhysiPlanExprs
=
"Exprs"
;
static
const
char
*
jkAggPhysiPlanGroupKeys
=
"GroupKeys"
;
static
const
char
*
jkAggPhysiPlanAggFuncs
=
"AggFuncs"
;
static
int32_t
physiAggNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SAggPhysiNode
*
pNode
=
(
const
SAggPhysiNode
*
)
pObj
;
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkAggPhysiPlanExprs
,
pNode
->
pExprs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkAggPhysiPlanGroupKeys
,
pNode
->
pGroupKeys
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkAggPhysiPlanAggFuncs
,
pNode
->
pAggFuncs
);
}
return
code
;
}
static
int32_t
jsonToPhysiAggNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SAggPhysiNode
*
pNode
=
(
SAggPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkAggPhysiPlanExprs
,
&
pNode
->
pExprs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkAggPhysiPlanGroupKeys
,
&
pNode
->
pGroupKeys
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkAggPhysiPlanAggFuncs
,
&
pNode
->
pAggFuncs
);
}
return
code
;
...
...
@@ -288,10 +470,10 @@ static int32_t logicAggNodeToJson(const void* pObj, SJson* pJson) {
int32_t
code
=
logicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkAggLogicPlanGroupKeys
,
nodeToJson
,
pNode
->
pGroupKeys
);
code
=
nodeListToJson
(
pJson
,
jkAggLogicPlanGroupKeys
,
pNode
->
pGroupKeys
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkAggLogicPlanAggFuncs
,
nodeToJson
,
pNode
->
pAggFuncs
);
code
=
nodeListToJson
(
pJson
,
jkAggLogicPlanAggFuncs
,
pNode
->
pAggFuncs
);
}
return
code
;
...
...
@@ -319,6 +501,23 @@ static int32_t dataTypeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
int32_t
jsonToDataType
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SDataType
*
pNode
=
(
SDataType
*
)
pObj
;
int32_t
code
=
tjsonGetUTinyIntValue
(
pJson
,
jkDataTypeType
,
&
pNode
->
type
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetUTinyIntValue
(
pJson
,
jkDataTypePrecision
,
&
pNode
->
precision
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetUTinyIntValue
(
pJson
,
jkDataTypeScale
,
&
pNode
->
scale
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetIntValue
(
pJson
,
jkDataTypeDataBytes
,
&
pNode
->
bytes
);
}
return
TSDB_CODE_SUCCESS
;
}
static
const
char
*
jkExprDataType
=
"DataType"
;
static
const
char
*
jkExprAliasName
=
"AliasName"
;
...
...
@@ -333,6 +532,17 @@ static int32_t exprNodeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
int32_t
jsonToExprNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SExprNode
*
pNode
=
(
SExprNode
*
)
pObj
;
int32_t
code
=
tjsonToObject
(
pJson
,
jkExprDataType
,
jsonToDataType
,
&
pNode
->
resType
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetStringValue
(
pJson
,
jkExprAliasName
,
pNode
->
aliasName
);
}
return
code
;
}
static
const
char
*
jkColumnTableId
=
"TableId"
;
static
const
char
*
jkColumnColId
=
"ColId"
;
static
const
char
*
jkColumnColType
=
"ColType"
;
...
...
@@ -340,6 +550,8 @@ static const char* jkColumnDbName = "DbName";
static
const
char
*
jkColumnTableName
=
"TableName"
;
static
const
char
*
jkColumnTableAlias
=
"TableAlias"
;
static
const
char
*
jkColumnColName
=
"ColName"
;
static
const
char
*
jkColumnDataBlockId
=
"DataBlockId"
;
static
const
char
*
jkColumnSlotId
=
"SlotId"
;
static
int32_t
columnNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SColumnNode
*
pNode
=
(
const
SColumnNode
*
)
pObj
;
...
...
@@ -366,6 +578,49 @@ static int32_t columnNodeToJson(const void* pObj, SJson* pJson) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddStringToObject
(
pJson
,
jkColumnColName
,
pNode
->
colName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkColumnDataBlockId
,
pNode
->
dataBlockId
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkColumnSlotId
,
pNode
->
slotId
);
}
return
code
;
}
static
int32_t
jsonToColumnNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SColumnNode
*
pNode
=
(
SColumnNode
*
)
pObj
;
int32_t
code
=
jsonToExprNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetUBigIntValue
(
pJson
,
jkColumnTableId
,
&
pNode
->
tableId
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetSmallIntValue
(
pJson
,
jkColumnColId
,
&
pNode
->
colId
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
int32_t
tmp
;
code
=
tjsonGetIntValue
(
pJson
,
jkColumnColType
,
&
tmp
);
pNode
->
colType
=
tmp
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetStringValue
(
pJson
,
jkColumnDbName
,
pNode
->
dbName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetStringValue
(
pJson
,
jkColumnTableName
,
pNode
->
tableName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetStringValue
(
pJson
,
jkColumnTableAlias
,
pNode
->
tableAlias
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetStringValue
(
pJson
,
jkColumnColName
,
pNode
->
colName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetSmallIntValue
(
pJson
,
jkColumnDataBlockId
,
&
pNode
->
dataBlockId
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetSmallIntValue
(
pJson
,
jkColumnSlotId
,
&
pNode
->
slotId
);
}
return
code
;
}
...
...
@@ -382,7 +637,7 @@ static int32_t valueNodeToJson(const void* pObj, SJson* pJson) {
code
=
tjsonAddStringToObject
(
pJson
,
jkValueLiteral
,
pNode
->
literal
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAdd
Integer
ToObject
(
pJson
,
jkValueDuration
,
pNode
->
isDuration
);
code
=
tjsonAdd
Bool
ToObject
(
pJson
,
jkValueDuration
,
pNode
->
isDuration
);
}
switch
(
pNode
->
node
.
resType
.
type
)
{
case
TSDB_DATA_TYPE_NULL
:
...
...
@@ -424,6 +679,56 @@ static int32_t valueNodeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
int32_t
jsonToValueNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SValueNode
*
pNode
=
(
SValueNode
*
)
pObj
;
int32_t
code
=
jsonToExprNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonDupStringValue
(
pJson
,
jkValueLiteral
,
&
pNode
->
literal
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkValueDuration
,
&
pNode
->
isDuration
);
}
switch
(
pNode
->
node
.
resType
.
type
)
{
case
TSDB_DATA_TYPE_NULL
:
break
;
case
TSDB_DATA_TYPE_BOOL
:
code
=
tjsonGetBoolValue
(
pJson
,
jkValueDuration
,
&
pNode
->
datum
.
b
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
case
TSDB_DATA_TYPE_SMALLINT
:
case
TSDB_DATA_TYPE_INT
:
case
TSDB_DATA_TYPE_BIGINT
:
case
TSDB_DATA_TYPE_TIMESTAMP
:
code
=
tjsonGetBigIntValue
(
pJson
,
jkValueDuration
,
&
pNode
->
datum
.
i
);
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
case
TSDB_DATA_TYPE_USMALLINT
:
case
TSDB_DATA_TYPE_UINT
:
case
TSDB_DATA_TYPE_UBIGINT
:
code
=
tjsonGetUBigIntValue
(
pJson
,
jkValueDuration
,
&
pNode
->
datum
.
u
);
break
;
case
TSDB_DATA_TYPE_FLOAT
:
case
TSDB_DATA_TYPE_DOUBLE
:
code
=
tjsonGetDoubleValue
(
pJson
,
jkValueDuration
,
&
pNode
->
datum
.
d
);
break
;
case
TSDB_DATA_TYPE_BINARY
:
case
TSDB_DATA_TYPE_NCHAR
:
case
TSDB_DATA_TYPE_VARCHAR
:
case
TSDB_DATA_TYPE_VARBINARY
:
code
=
tjsonDupStringValue
(
pJson
,
jkValueLiteral
,
&
pNode
->
datum
.
p
);
break
;
case
TSDB_DATA_TYPE_JSON
:
case
TSDB_DATA_TYPE_DECIMAL
:
case
TSDB_DATA_TYPE_BLOB
:
// todo
default:
break
;
}
return
code
;
}
static
const
char
*
jkOperatorType
=
"OpType"
;
static
const
char
*
jkOperatorLeft
=
"Left"
;
static
const
char
*
jkOperatorRight
=
"Right"
;
...
...
@@ -445,6 +750,25 @@ static int32_t operatorNodeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
int32_t
jsonToOperatorNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SOperatorNode
*
pNode
=
(
SOperatorNode
*
)
pObj
;
int32_t
code
=
jsonToExprNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
int32_t
val
;
code
=
tjsonGetIntValue
(
pJson
,
jkOperatorType
,
&
val
);
pNode
->
opType
=
val
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkOperatorLeft
,
&
pNode
->
pLeft
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkOperatorRight
,
&
pNode
->
pRight
);
}
return
code
;
}
static
const
char
*
jkLogicCondType
=
"CondType"
;
static
const
char
*
jkLogicCondParameters
=
"Parameters"
;
...
...
@@ -456,7 +780,23 @@ static int32_t logicConditionNodeToJson(const void* pObj, SJson* pJson) {
code
=
tjsonAddIntegerToObject
(
pJson
,
jkLogicCondType
,
pNode
->
condType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkLogicCondParameters
,
nodeToJson
,
pNode
->
pParameterList
);
code
=
nodeListToJson
(
pJson
,
jkLogicCondParameters
,
pNode
->
pParameterList
);
}
return
code
;
}
static
int32_t
jsonToLogicConditionNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SLogicConditionNode
*
pNode
=
(
SLogicConditionNode
*
)
pObj
;
int32_t
code
=
jsonToExprNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
int32_t
val
;
code
=
tjsonGetIntValue
(
pJson
,
jkLogicCondType
,
&
val
);
pNode
->
condType
=
val
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkLogicCondParameters
,
&
pNode
->
pParameterList
);
}
return
code
;
...
...
@@ -481,7 +821,27 @@ static int32_t functionNodeToJson(const void* pObj, SJson* pJson) {
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFunctionType
,
pNode
->
funcType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkFunctionParameter
,
nodeToJson
,
pNode
->
pParameterList
);
code
=
nodeListToJson
(
pJson
,
jkFunctionParameter
,
pNode
->
pParameterList
);
}
return
code
;
}
static
int32_t
jsonToFunctionNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SFunctionNode
*
pNode
=
(
SFunctionNode
*
)
pObj
;
int32_t
code
=
jsonToExprNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetStringValue
(
pJson
,
jkFunctionName
,
pNode
->
functionName
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetIntValue
(
pJson
,
jkFunctionId
,
&
pNode
->
funcId
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetIntValue
(
pJson
,
jkFunctionType
,
&
pNode
->
funcType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkFunctionParameter
,
&
pNode
->
pParameterList
);
}
return
code
;
...
...
@@ -495,20 +855,20 @@ static int32_t groupingSetNodeToJson(const void* pObj, SJson* pJson) {
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkGroupingSetType
,
pNode
->
groupingSetType
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkGroupingSetParameter
,
nodeToJson
,
pNode
->
pParameterList
);
code
=
nodeListToJson
(
pJson
,
jkGroupingSetParameter
,
pNode
->
pParameterList
);
}
return
code
;
}
static
const
char
*
jkTarget
TupleId
=
"Tuple
Id"
;
static
const
char
*
jkTarget
DataBlockId
=
"DataBlock
Id"
;
static
const
char
*
jkTargetSlotId
=
"SlotId"
;
static
const
char
*
jkTargetExpr
=
"Expr"
;
static
int32_t
targetNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
STargetNode
*
pNode
=
(
const
STargetNode
*
)
pObj
;
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkTarget
TupleId
,
pNode
->
tuple
Id
);
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkTarget
DataBlockId
,
pNode
->
dataBlock
Id
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkTargetSlotId
,
pNode
->
slotId
);
}
...
...
@@ -519,8 +879,24 @@ static int32_t targetNodeToJson(const void* pObj, SJson* pJson) {
return
code
;
}
static
int32_t
jsonToTargetNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
STargetNode
*
pNode
=
(
STargetNode
*
)
pObj
;
int32_t
code
=
tjsonGetSmallIntValue
(
pJson
,
jkTargetDataBlockId
,
&
pNode
->
dataBlockId
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetSmallIntValue
(
pJson
,
jkTargetSlotId
,
&
pNode
->
slotId
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkTargetExpr
,
&
pNode
->
pExpr
);
}
return
code
;
}
static
const
char
*
jkSlotDescSlotId
=
"SlotId"
;
static
const
char
*
jkSlotDescDataType
=
"DataType"
;
static
const
char
*
jkSlotDescReserve
=
"Reserve"
;
static
const
char
*
jkSlotDescOutput
=
"Output"
;
static
int32_t
slotDescNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SSlotDescNode
*
pNode
=
(
const
SSlotDescNode
*
)
pObj
;
...
...
@@ -529,19 +905,53 @@ static int32_t slotDescNodeToJson(const void* pObj, SJson* pJson) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkSlotDescDataType
,
dataTypeToJson
,
&
pNode
->
dataType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkSlotDescReserve
,
pNode
->
reserve
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddBoolToObject
(
pJson
,
jkSlotDescOutput
,
pNode
->
output
);
}
return
code
;
}
static
const
char
*
jkTupleDescTupleId
=
"TupleId"
;
static
const
char
*
jkTupleDescSlots
=
"Slots"
;
static
int32_t
jsonToSlotDescNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SSlotDescNode
*
pNode
=
(
SSlotDescNode
*
)
pObj
;
static
int32_t
tupleDescNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
STupleDescNode
*
pNode
=
(
const
STupleDescNode
*
)
pObj
;
int32_t
code
=
tjsonGetSmallIntValue
(
pJson
,
jkSlotDescSlotId
,
&
pNode
->
slotId
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonToObject
(
pJson
,
jkSlotDescDataType
,
jsonToDataType
,
&
pNode
->
dataType
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkSlotDescReserve
,
&
pNode
->
reserve
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBoolValue
(
pJson
,
jkSlotDescOutput
,
&
pNode
->
output
);
}
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkTupleDescTupleId
,
pNode
->
tupleId
);
return
code
;
}
static
const
char
*
jkDataBlockDescDataBlockId
=
"DataBlockId"
;
static
const
char
*
jkDataBlockDescSlots
=
"Slots"
;
static
int32_t
dataBlockDescNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SDataBlockDescNode
*
pNode
=
(
const
SDataBlockDescNode
*
)
pObj
;
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkDataBlockDescDataBlockId
,
pNode
->
dataBlockId
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkDataBlockDescSlots
,
pNode
->
pSlots
);
}
return
code
;
}
static
int32_t
jsonToDataBlockDescNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SDataBlockDescNode
*
pNode
=
(
SDataBlockDescNode
*
)
pObj
;
int32_t
code
=
tjsonGetSmallIntValue
(
pJson
,
jkDataBlockDescDataBlockId
,
&
pNode
->
dataBlockId
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkTupleDescSlots
,
nodeToJson
,
pNode
->
pSlots
);
code
=
jsonToNodeList
(
pJson
,
jkDataBlockDescSlots
,
&
pNode
->
pSlots
);
}
return
code
;
...
...
@@ -564,7 +974,7 @@ static int32_t selectStmtTojson(const void* pObj, SJson* pJson) {
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkSelectStmtDistinct
,
pNode
->
isDistinct
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkSelectStmtProjections
,
nodeToJson
,
pNode
->
pProjectionList
);
code
=
nodeListToJson
(
pJson
,
jkSelectStmtProjections
,
pNode
->
pProjectionList
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkSelectStmtFrom
,
nodeToJson
,
pNode
->
pFromTable
);
...
...
@@ -573,19 +983,19 @@ static int32_t selectStmtTojson(const void* pObj, SJson* pJson) {
code
=
tjsonAddObject
(
pJson
,
jkSelectStmtWhere
,
nodeToJson
,
pNode
->
pWhere
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkSelectStmtPartitionBy
,
nodeToJson
,
pNode
->
pPartitionByList
);
code
=
nodeListToJson
(
pJson
,
jkSelectStmtPartitionBy
,
pNode
->
pPartitionByList
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkSelectStmtWindow
,
nodeToJson
,
pNode
->
pWindow
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkSelectStmtGroupBy
,
nodeToJson
,
pNode
->
pGroupByList
);
code
=
nodeListToJson
(
pJson
,
jkSelectStmtGroupBy
,
pNode
->
pGroupByList
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkSelectStmtHaving
,
nodeToJson
,
pNode
->
pHaving
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNodeList
(
pJson
,
jkSelectStmtOrderBy
,
nodeToJson
,
pNode
->
pOrderByList
);
code
=
nodeListToJson
(
pJson
,
jkSelectStmtOrderBy
,
pNode
->
pOrderByList
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkSelectStmtLimit
,
nodeToJson
,
pNode
->
pLimit
);
...
...
@@ -626,8 +1036,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
return
targetNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_RAW_EXPR
:
break
;
case
QUERY_NODE_
TUPLE
_DESC
:
return
tuple
DescNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_
DATABLOCK
_DESC
:
return
dataBlock
DescNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_SLOT_DESC
:
return
slotDescNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_SET_OPERATOR
:
...
...
@@ -650,6 +1060,73 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
return
physiTableScanNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_PROJECT
:
return
physiProjectNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_JOIN
:
return
physiJoinNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_AGG
:
return
physiAggNodeToJson
(
pObj
,
pJson
);
default:
break
;
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
jsonToSpecificNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
switch
(
nodeType
(
pObj
))
{
case
QUERY_NODE_COLUMN
:
return
jsonToColumnNode
(
pJson
,
pObj
);
case
QUERY_NODE_VALUE
:
return
jsonToValueNode
(
pJson
,
pObj
);
case
QUERY_NODE_OPERATOR
:
return
jsonToOperatorNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_CONDITION
:
return
jsonToLogicConditionNode
(
pJson
,
pObj
);
case
QUERY_NODE_FUNCTION
:
return
jsonToFunctionNode
(
pJson
,
pObj
);
// case QUERY_NODE_REAL_TABLE:
// case QUERY_NODE_TEMP_TABLE:
// case QUERY_NODE_JOIN_TABLE:
// break;
// case QUERY_NODE_GROUPING_SET:
// return jsonToGroupingSetNode(pJson, pObj);
// case QUERY_NODE_ORDER_BY_EXPR:
// case QUERY_NODE_LIMIT:
// case QUERY_NODE_STATE_WINDOW:
// case QUERY_NODE_SESSION_WINDOW:
// case QUERY_NODE_INTERVAL_WINDOW:
// case QUERY_NODE_NODE_LIST:
// case QUERY_NODE_FILL:
case
QUERY_NODE_TARGET
:
return
jsonToTargetNode
(
pJson
,
pObj
);
// case QUERY_NODE_RAW_EXPR:
// break;
case
QUERY_NODE_DATABLOCK_DESC
:
return
jsonToDataBlockDescNode
(
pJson
,
pObj
);
case
QUERY_NODE_SLOT_DESC
:
return
jsonToSlotDescNode
(
pJson
,
pObj
);
// case QUERY_NODE_SET_OPERATOR:
// break;
// case QUERY_NODE_SELECT_STMT:
// return jsonToSelectStmt(pJson, pObj);
// case QUERY_NODE_SHOW_STMT:
// break;
// case QUERY_NODE_LOGIC_PLAN_SCAN:
// return jsonToLogicScanNode(pJson, pObj);
// case QUERY_NODE_LOGIC_PLAN_JOIN:
// return jsonToLogicJoinNode(pJson, pObj);
// case QUERY_NODE_LOGIC_PLAN_AGG:
// return jsonToLogicAggNode(pJson, pObj);
// case QUERY_NODE_LOGIC_PLAN_PROJECT:
// return jsonToLogicProjectNode(pJson, pObj);
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
return
jsonToPhysiTagScanNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN
:
return
jsonToPhysiTableScanNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_PROJECT
:
return
jsonToPhysiProjectNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_JOIN
:
return
jsonToPhysiJoinNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_AGG
:
return
jsonToPhysiAggNode
(
pJson
,
pObj
);
default:
break
;
}
...
...
@@ -657,18 +1134,57 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
}
static
const
char
*
jkNodeType
=
"Type"
;
static
const
char
*
jkNodeName
=
"Name"
;
static
int32_t
nodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SNode
*
pNode
=
(
const
SNode
*
)
pObj
;
char
*
pNodeName
=
nodeName
(
nodeType
(
pNode
));
int32_t
code
=
tjsonAddStringToObject
(
pJson
,
jkNodeType
,
pNodeName
);
int32_t
code
=
tjsonAddIntegerToObject
(
pJson
,
jkNodeType
,
pNode
->
type
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddStringToObject
(
pJson
,
jkNodeName
,
nodeName
(
pNode
->
type
));
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
nodeName
(
pNode
->
type
),
specificNodeToJson
,
pNode
);
}
return
code
;
}
static
int32_t
jsonToNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SNode
*
pNode
=
(
SNode
*
)
pObj
;
int32_t
val
=
0
;
int32_t
code
=
tjsonGetIntValue
(
pJson
,
jkNodeType
,
&
val
);
pNode
->
type
=
val
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjson
AddObject
(
pJson
,
pNodeName
,
specificNodeToJson
,
pNode
);
code
=
tjson
ToObject
(
pJson
,
nodeName
(
pNode
->
type
),
jsonToSpecificNode
,
pNode
);
}
return
code
;
}
static
int32_t
makeNodeByJson
(
const
SJson
*
pJson
,
SNode
**
pNode
)
{
int32_t
val
=
0
;
int32_t
code
=
tjsonGetIntValue
(
pJson
,
jkNodeType
,
&
val
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pNode
=
nodesMakeNode
(
val
);
if
(
NULL
==
*
pNode
)
{
return
TSDB_CODE_FAILED
;
}
code
=
jsonToNode
(
pJson
,
*
pNode
);
}
return
code
;
}
static
int32_t
jsonToNodeObject
(
const
SJson
*
pJson
,
const
char
*
pName
,
SNode
**
pNode
)
{
SJson
*
pJsonNode
=
tjsonGetObjectItem
(
pJson
,
pName
);
if
(
NULL
==
pJsonNode
)
{
return
TSDB_CODE_FAILED
;
}
return
makeNodeByJson
(
pJsonNode
,
pNode
);
}
int32_t
nodesNodeToString
(
const
SNode
*
pNode
,
bool
format
,
char
**
pStr
,
int32_t
*
pLen
)
{
if
(
NULL
==
pNode
||
NULL
==
pStr
||
NULL
==
pLen
)
{
return
TSDB_CODE_SUCCESS
;
...
...
@@ -694,5 +1210,18 @@ int32_t nodesNodeToString(const SNode* pNode, bool format, char** pStr, int32_t*
}
int32_t
nodesStringToNode
(
const
char
*
pStr
,
SNode
**
pNode
)
{
if
(
NULL
==
pStr
||
NULL
==
pNode
)
{
return
TSDB_CODE_SUCCESS
;
}
SJson
*
pJson
=
tjsonParse
(
pStr
);
if
(
NULL
==
pJson
)
{
return
TSDB_CODE_FAILED
;
}
int32_t
code
=
makeNodeByJson
(
pJson
,
pNode
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
nodesDestroyNode
(
*
pNode
);
terrno
=
code
;
return
code
;
}
return
TSDB_CODE_SUCCESS
;
}
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
7ba4e6f4
...
...
@@ -81,8 +81,8 @@ SNode* nodesMakeNode(ENodeType type) {
return
makeNode
(
type
,
sizeof
(
SProjectLogicNode
));
case
QUERY_NODE_TARGET
:
return
makeNode
(
type
,
sizeof
(
STargetNode
));
case
QUERY_NODE_
TUPLE
_DESC
:
return
makeNode
(
type
,
sizeof
(
S
Tuple
DescNode
));
case
QUERY_NODE_
DATABLOCK
_DESC
:
return
makeNode
(
type
,
sizeof
(
S
DataBlock
DescNode
));
case
QUERY_NODE_SLOT_DESC
:
return
makeNode
(
type
,
sizeof
(
SSlotDescNode
));
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
...
...
source/libs/parser/test/mockCatalog.cpp
浏览文件 @
7ba4e6f4
...
...
@@ -29,9 +29,10 @@
namespace
{
void
generateTestT1
(
MockCatalogService
*
mcs
)
{
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"test"
,
"t1"
,
TSDB_NORMAL_TABLE
,
4
)
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"test"
,
"t1"
,
TSDB_NORMAL_TABLE
,
6
)
.
setPrecision
(
TSDB_TIME_PRECISION_MILLI
).
setVgid
(
1
).
addColumn
(
"ts"
,
TSDB_DATA_TYPE_TIMESTAMP
)
.
addColumn
(
"c1"
,
TSDB_DATA_TYPE_INT
).
addColumn
(
"c2"
,
TSDB_DATA_TYPE_BINARY
,
20
).
addColumn
(
"c3"
,
TSDB_DATA_TYPE_BIGINT
);
.
addColumn
(
"c1"
,
TSDB_DATA_TYPE_INT
).
addColumn
(
"c2"
,
TSDB_DATA_TYPE_BINARY
,
20
).
addColumn
(
"c3"
,
TSDB_DATA_TYPE_BIGINT
)
.
addColumn
(
"c4"
,
TSDB_DATA_TYPE_DOUBLE
).
addColumn
(
"c5"
,
TSDB_DATA_TYPE_DOUBLE
);
builder
.
done
();
}
...
...
source/libs/planner/src/plannerImpl.c
浏览文件 @
7ba4e6f4
...
...
@@ -159,6 +159,10 @@ static SLogicNode* createScanLogicNode(SPlanContext* pCxt, SSelectStmt* pSelect,
CHECK_ALLOC
(
pScan
->
node
.
pTargets
,
(
SLogicNode
*
)
pScan
);
}
pScan
->
scanType
=
SCAN_TYPE_TABLE
;
pScan
->
scanFlag
=
MAIN_SCAN
;
pScan
->
scanRange
=
TSWINDOW_INITIALIZER
;
return
(
SLogicNode
*
)
pScan
;
}
...
...
@@ -397,14 +401,14 @@ int32_t splitLogicPlan(SSubLogicPlan* pLogicPlan) {
}
typedef
struct
SSlotIndex
{
int16_t
tuple
Id
;
int16_t
dataBlock
Id
;
int16_t
slotId
;
}
SSlotIndex
;
typedef
struct
SPhysiPlanContext
{
int32_t
errCode
;
int16_t
next
Tuple
Id
;
SArray
*
p
Tuple
Helper
;
int16_t
next
DataBlock
Id
;
SArray
*
p
Location
Helper
;
}
SPhysiPlanContext
;
static
int32_t
getSlotKey
(
SNode
*
pNode
,
char
*
pKey
)
{
...
...
@@ -428,31 +432,31 @@ static SNode* createSlotDesc(SPhysiPlanContext* pCxt, const SNode* pNode, int16_
return
(
SNode
*
)
pSlot
;
}
static
SNode
*
createTarget
(
SNode
*
pNode
,
int16_t
tuple
Id
,
int16_t
slotId
)
{
static
SNode
*
createTarget
(
SNode
*
pNode
,
int16_t
dataBlock
Id
,
int16_t
slotId
)
{
STargetNode
*
pTarget
=
(
STargetNode
*
)
nodesMakeNode
(
QUERY_NODE_TARGET
);
if
(
NULL
==
pTarget
)
{
return
NULL
;
}
pTarget
->
tupleId
=
tuple
Id
;
pTarget
->
dataBlockId
=
dataBlock
Id
;
pTarget
->
slotId
=
slotId
;
pTarget
->
pExpr
=
pNode
;
return
(
SNode
*
)
pTarget
;
}
static
int32_t
add
TupleDesc
(
SPhysiPlanContext
*
pCxt
,
SNodeList
*
pList
,
STupleDescNode
*
pTuple
)
{
static
int32_t
add
DataBlockDesc
(
SPhysiPlanContext
*
pCxt
,
SNodeList
*
pList
,
SDataBlockDescNode
*
pDataBlockDesc
)
{
SHashObj
*
pHash
=
NULL
;
if
(
NULL
==
p
Tuple
->
pSlots
)
{
p
Tuple
->
pSlots
=
nodesMakeList
();
CHECK_ALLOC
(
p
Tuple
->
pSlots
,
TSDB_CODE_OUT_OF_MEMORY
);
if
(
NULL
==
p
DataBlockDesc
->
pSlots
)
{
p
DataBlockDesc
->
pSlots
=
nodesMakeList
();
CHECK_ALLOC
(
p
DataBlockDesc
->
pSlots
,
TSDB_CODE_OUT_OF_MEMORY
);
pHash
=
taosHashInit
(
LIST_LENGTH
(
pList
),
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_NO_LOCK
);
CHECK_ALLOC
(
pHash
,
TSDB_CODE_OUT_OF_MEMORY
);
if
(
NULL
==
taosArrayInsert
(
pCxt
->
p
TupleHelper
,
pTuple
->
tuple
Id
,
&
pHash
))
{
if
(
NULL
==
taosArrayInsert
(
pCxt
->
p
LocationHelper
,
pDataBlockDesc
->
dataBlock
Id
,
&
pHash
))
{
taosHashCleanup
(
pHash
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
else
{
pHash
=
taosArrayGetP
(
pCxt
->
p
TupleHelper
,
pTuple
->
tuple
Id
);
pHash
=
taosArrayGetP
(
pCxt
->
p
LocationHelper
,
pDataBlockDesc
->
dataBlock
Id
);
}
SNode
*
pNode
=
NULL
;
...
...
@@ -460,17 +464,17 @@ static int32_t addTupleDesc(SPhysiPlanContext* pCxt, SNodeList* pList, STupleDes
FOREACH
(
pNode
,
pList
)
{
SNode
*
pSlot
=
createSlotDesc
(
pCxt
,
pNode
,
slotId
);
CHECK_ALLOC
(
pSlot
,
TSDB_CODE_OUT_OF_MEMORY
);
if
(
TSDB_CODE_SUCCESS
!=
nodesListAppend
(
p
Tuple
->
pSlots
,
(
SNode
*
)
pSlot
))
{
if
(
TSDB_CODE_SUCCESS
!=
nodesListAppend
(
p
DataBlockDesc
->
pSlots
,
(
SNode
*
)
pSlot
))
{
nodesDestroyNode
(
pSlot
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
SSlotIndex
index
=
{
.
tupleId
=
pTuple
->
tuple
Id
,
.
slotId
=
slotId
};
SSlotIndex
index
=
{
.
dataBlockId
=
pDataBlockDesc
->
dataBlock
Id
,
.
slotId
=
slotId
};
char
name
[
TSDB_TABLE_NAME_LEN
+
TSDB_COL_NAME_LEN
];
int32_t
len
=
getSlotKey
(
pNode
,
name
);
CHECK_CODE
(
taosHashPut
(
pHash
,
name
,
len
,
&
index
,
sizeof
(
SSlotIndex
)),
TSDB_CODE_OUT_OF_MEMORY
);
SNode
*
pTarget
=
createTarget
(
pNode
,
p
Tuple
->
tuple
Id
,
slotId
);
SNode
*
pTarget
=
createTarget
(
pNode
,
p
DataBlockDesc
->
dataBlock
Id
,
slotId
);
CHECK_ALLOC
(
pTarget
,
TSDB_CODE_OUT_OF_MEMORY
);
REPLACE_NODE
(
pTarget
);
...
...
@@ -495,7 +499,7 @@ static EDealRes doSetSlotId(SNode* pNode, void* pContext) {
pIndex
=
taosHashGet
(
pCxt
->
pRightHash
,
name
,
len
);
}
// pIndex is definitely not NULL, otherwise it is a bug
((
SColumnNode
*
)
pNode
)
->
tupleId
=
pIndex
->
tuple
Id
;
((
SColumnNode
*
)
pNode
)
->
dataBlockId
=
pIndex
->
dataBlock
Id
;
((
SColumnNode
*
)
pNode
)
->
slotId
=
pIndex
->
slotId
;
CHECK_ALLOC
(
pNode
,
DEAL_RES_ERROR
);
return
DEAL_RES_IGNORE_CHILD
;
...
...
@@ -503,11 +507,11 @@ static EDealRes doSetSlotId(SNode* pNode, void* pContext) {
return
DEAL_RES_CONTINUE
;
}
static
SNode
*
setNodeSlotId
(
SPhysiPlanContext
*
pCxt
,
int16_t
left
TupleId
,
int16_t
rightTuple
Id
,
SNode
*
pNode
)
{
static
SNode
*
setNodeSlotId
(
SPhysiPlanContext
*
pCxt
,
int16_t
left
DataBlockId
,
int16_t
rightDataBlock
Id
,
SNode
*
pNode
)
{
SNode
*
pRes
=
nodesCloneNode
(
pNode
);
CHECK_ALLOC
(
pRes
,
NULL
);
SSetSlotIdCxt
cxt
=
{
.
errCode
=
TSDB_CODE_SUCCESS
,
.
pLeftHash
=
taosArrayGetP
(
pCxt
->
p
TupleHelper
,
leftTuple
Id
),
.
pRightHash
=
(
right
TupleId
<
0
?
NULL
:
taosArrayGetP
(
pCxt
->
pTupleHelper
,
rightTuple
Id
))
};
SSetSlotIdCxt
cxt
=
{
.
errCode
=
TSDB_CODE_SUCCESS
,
.
pLeftHash
=
taosArrayGetP
(
pCxt
->
p
LocationHelper
,
leftDataBlock
Id
),
.
pRightHash
=
(
right
DataBlockId
<
0
?
NULL
:
taosArrayGetP
(
pCxt
->
pLocationHelper
,
rightDataBlock
Id
))
};
nodesWalkNode
(
pRes
,
doSetSlotId
,
&
cxt
);
if
(
TSDB_CODE_SUCCESS
!=
cxt
.
errCode
)
{
nodesDestroyNode
(
pRes
);
...
...
@@ -516,11 +520,11 @@ static SNode* setNodeSlotId(SPhysiPlanContext* pCxt, int16_t leftTupleId, int16_
return
pRes
;
}
static
SNodeList
*
setListSlotId
(
SPhysiPlanContext
*
pCxt
,
int16_t
left
TupleId
,
int16_t
rightTuple
Id
,
SNodeList
*
pList
)
{
static
SNodeList
*
setListSlotId
(
SPhysiPlanContext
*
pCxt
,
int16_t
left
DataBlockId
,
int16_t
rightDataBlock
Id
,
SNodeList
*
pList
)
{
SNodeList
*
pRes
=
nodesCloneList
(
pList
);
CHECK_ALLOC
(
pRes
,
NULL
);
SSetSlotIdCxt
cxt
=
{
.
errCode
=
TSDB_CODE_SUCCESS
,
.
pLeftHash
=
taosArrayGetP
(
pCxt
->
p
TupleHelper
,
leftTuple
Id
),
.
pRightHash
=
(
right
TupleId
<
0
?
NULL
:
taosArrayGetP
(
pCxt
->
pTupleHelper
,
rightTuple
Id
))
};
SSetSlotIdCxt
cxt
=
{
.
errCode
=
TSDB_CODE_SUCCESS
,
.
pLeftHash
=
taosArrayGetP
(
pCxt
->
p
LocationHelper
,
leftDataBlock
Id
),
.
pRightHash
=
(
right
DataBlockId
<
0
?
NULL
:
taosArrayGetP
(
pCxt
->
pLocationHelper
,
rightDataBlock
Id
))
};
nodesWalkList
(
pRes
,
doSetSlotId
,
&
cxt
);
if
(
TSDB_CODE_SUCCESS
!=
cxt
.
errCode
)
{
nodesDestroyList
(
pRes
);
...
...
@@ -534,27 +538,27 @@ static SPhysiNode* makePhysiNode(SPhysiPlanContext* pCxt, ENodeType type) {
if
(
NULL
==
pPhysiNode
)
{
return
NULL
;
}
pPhysiNode
->
output
Tuple
.
tupleId
=
pCxt
->
nextTuple
Id
++
;
pPhysiNode
->
output
Tuple
.
type
=
QUERY_NODE_TUPLE
_DESC
;
pPhysiNode
->
output
DataBlockDesc
.
dataBlockId
=
pCxt
->
nextDataBlock
Id
++
;
pPhysiNode
->
output
DataBlockDesc
.
type
=
QUERY_NODE_DATABLOCK
_DESC
;
return
pPhysiNode
;
}
static
int32_t
setConditionsSlotId
(
SPhysiPlanContext
*
pCxt
,
const
SLogicNode
*
pLogicNode
,
SPhysiNode
*
pPhysiNode
)
{
if
(
NULL
!=
pLogicNode
->
pConditions
)
{
pPhysiNode
->
pConditions
=
setNodeSlotId
(
pCxt
,
pPhysiNode
->
output
Tuple
.
tuple
Id
,
-
1
,
pLogicNode
->
pConditions
);
pPhysiNode
->
pConditions
=
setNodeSlotId
(
pCxt
,
pPhysiNode
->
output
DataBlockDesc
.
dataBlock
Id
,
-
1
,
pLogicNode
->
pConditions
);
CHECK_ALLOC
(
pPhysiNode
->
pConditions
,
TSDB_CODE_OUT_OF_MEMORY
);
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
setSlotOutput
(
SPhysiPlanContext
*
pCxt
,
SNodeList
*
pTargets
,
S
TupleDescNode
*
pTuple
)
{
SHashObj
*
pHash
=
taosArrayGetP
(
pCxt
->
p
TupleHelper
,
pTuple
->
tuple
Id
);
static
int32_t
setSlotOutput
(
SPhysiPlanContext
*
pCxt
,
SNodeList
*
pTargets
,
S
DataBlockDescNode
*
pDataBlockDesc
)
{
SHashObj
*
pHash
=
taosArrayGetP
(
pCxt
->
p
LocationHelper
,
pDataBlockDesc
->
dataBlock
Id
);
char
name
[
TSDB_TABLE_NAME_LEN
+
TSDB_COL_NAME_LEN
];
SNode
*
pNode
;
FOREACH
(
pNode
,
pTargets
)
{
int32_t
len
=
getSlotKey
(
pNode
,
name
);
SSlotIndex
*
pIndex
=
taosHashGet
(
pHash
,
name
,
len
);
((
SSlotDescNode
*
)
nodesListGetNode
(
p
Tuple
->
pSlots
,
pIndex
->
slotId
))
->
output
=
true
;
((
SSlotDescNode
*
)
nodesListGetNode
(
p
DataBlockDesc
->
pSlots
,
pIndex
->
slotId
))
->
output
=
true
;
}
return
TSDB_CODE_SUCCESS
;
...
...
@@ -565,12 +569,12 @@ static int32_t initScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode* pScanL
pScanPhysiNode
->
pScanCols
=
nodesCloneList
(
pScanLogicNode
->
pScanCols
);
CHECK_ALLOC
(
pScanPhysiNode
->
pScanCols
,
TSDB_CODE_OUT_OF_MEMORY
);
}
//
Tuple
describe also needs to be set without scanning column, such as SELECT COUNT(*) FROM t
CHECK_CODE
(
add
TupleDesc
(
pCxt
,
pScanPhysiNode
->
pScanCols
,
&
pScanPhysiNode
->
node
.
outputTuple
),
TSDB_CODE_OUT_OF_MEMORY
);
//
Data block
describe also needs to be set without scanning column, such as SELECT COUNT(*) FROM t
CHECK_CODE
(
add
DataBlockDesc
(
pCxt
,
pScanPhysiNode
->
pScanCols
,
&
pScanPhysiNode
->
node
.
outputDataBlockDesc
),
TSDB_CODE_OUT_OF_MEMORY
);
CHECK_CODE
(
setConditionsSlotId
(
pCxt
,
(
const
SLogicNode
*
)
pScanLogicNode
,
(
SPhysiNode
*
)
pScanPhysiNode
),
TSDB_CODE_OUT_OF_MEMORY
);
CHECK_CODE
(
setSlotOutput
(
pCxt
,
pScanLogicNode
->
node
.
pTargets
,
&
pScanPhysiNode
->
node
.
output
Tuple
),
TSDB_CODE_OUT_OF_MEMORY
);
CHECK_CODE
(
setSlotOutput
(
pCxt
,
pScanLogicNode
->
node
.
pTargets
,
&
pScanPhysiNode
->
node
.
output
DataBlockDesc
),
TSDB_CODE_OUT_OF_MEMORY
);
pScanPhysiNode
->
uid
=
pScanLogicNode
->
pMeta
->
uid
;
pScanPhysiNode
->
tableType
=
pScanLogicNode
->
pMeta
->
tableType
;
...
...
@@ -612,32 +616,32 @@ static SPhysiNode* createScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode*
return
NULL
;
}
static
SNodeList
*
createJoinOutputCols
(
SPhysiPlanContext
*
pCxt
,
S
TupleDescNode
*
pLeftTuple
,
STupleDescNode
*
pRightTuple
)
{
static
SNodeList
*
createJoinOutputCols
(
SPhysiPlanContext
*
pCxt
,
S
DataBlockDescNode
*
pLeftDesc
,
SDataBlockDescNode
*
pRightDesc
)
{
SNodeList
*
pCols
=
nodesMakeList
();
CHECK_ALLOC
(
pCols
,
NULL
);
SNode
*
pNode
;
FOREACH
(
pNode
,
pLeft
Tuple
->
pSlots
)
{
FOREACH
(
pNode
,
pLeft
Desc
->
pSlots
)
{
SSlotDescNode
*
pSlot
=
(
SSlotDescNode
*
)
pNode
;
SColumnNode
*
pCol
=
(
SColumnNode
*
)
nodesMakeNode
(
QUERY_NODE_COLUMN
);
if
(
NULL
==
pCol
)
{
goto
error
;
}
pCol
->
node
.
resType
=
pSlot
->
dataType
;
pCol
->
tupleId
=
pLeftTuple
->
tuple
Id
;
pCol
->
dataBlockId
=
pLeftDesc
->
dataBlock
Id
;
pCol
->
slotId
=
pSlot
->
slotId
;
pCol
->
colId
=
-
1
;
if
(
TSDB_CODE_SUCCESS
!=
nodesListAppend
(
pCols
,
(
SNode
*
)
pCol
))
{
goto
error
;
}
}
FOREACH
(
pNode
,
pRight
Tuple
->
pSlots
)
{
FOREACH
(
pNode
,
pRight
Desc
->
pSlots
)
{
SSlotDescNode
*
pSlot
=
(
SSlotDescNode
*
)
pNode
;
SColumnNode
*
pCol
=
(
SColumnNode
*
)
nodesMakeNode
(
QUERY_NODE_COLUMN
);
if
(
NULL
==
pCol
)
{
goto
error
;
}
pCol
->
node
.
resType
=
pSlot
->
dataType
;
pCol
->
tupleId
=
pRightTuple
->
tuple
Id
;
pCol
->
dataBlockId
=
pRightDesc
->
dataBlock
Id
;
pCol
->
slotId
=
pSlot
->
slotId
;
pCol
->
colId
=
-
1
;
if
(
TSDB_CODE_SUCCESS
!=
nodesListAppend
(
pCols
,
(
SNode
*
)
pCol
))
{
...
...
@@ -654,18 +658,18 @@ static SPhysiNode* createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChil
SJoinPhysiNode
*
pJoin
=
(
SJoinPhysiNode
*
)
makePhysiNode
(
pCxt
,
QUERY_NODE_PHYSICAL_PLAN_JOIN
);
CHECK_ALLOC
(
pJoin
,
NULL
);
S
TupleDescNode
*
pLeftTuple
=
&
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
outputTuple
;
S
TupleDescNode
*
pRightTuple
=
&
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
1
))
->
outputTuple
;
pJoin
->
pOnConditions
=
setNodeSlotId
(
pCxt
,
pLeft
Tuple
->
tupleId
,
pRightTuple
->
tuple
Id
,
pJoinLogicNode
->
pOnConditions
);
S
DataBlockDescNode
*
pLeftDesc
=
&
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
outputDataBlockDesc
;
S
DataBlockDescNode
*
pRightDesc
=
&
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
1
))
->
outputDataBlockDesc
;
pJoin
->
pOnConditions
=
setNodeSlotId
(
pCxt
,
pLeft
Desc
->
dataBlockId
,
pRightDesc
->
dataBlock
Id
,
pJoinLogicNode
->
pOnConditions
);
CHECK_ALLOC
(
pJoin
->
pOnConditions
,
(
SPhysiNode
*
)
pJoin
);
pJoin
->
pTargets
=
createJoinOutputCols
(
pCxt
,
pLeft
Tuple
,
pRightTuple
);
pJoin
->
pTargets
=
createJoinOutputCols
(
pCxt
,
pLeft
Desc
,
pRightDesc
);
CHECK_ALLOC
(
pJoin
->
pTargets
,
(
SPhysiNode
*
)
pJoin
);
CHECK_CODE
(
add
TupleDesc
(
pCxt
,
pJoin
->
pTargets
,
&
pJoin
->
node
.
outputTuple
),
(
SPhysiNode
*
)
pJoin
);
CHECK_CODE
(
add
DataBlockDesc
(
pCxt
,
pJoin
->
pTargets
,
&
pJoin
->
node
.
outputDataBlockDesc
),
(
SPhysiNode
*
)
pJoin
);
CHECK_CODE
(
setConditionsSlotId
(
pCxt
,
(
const
SLogicNode
*
)
pJoinLogicNode
,
(
SPhysiNode
*
)
pJoin
),
(
SPhysiNode
*
)
pJoin
);
CHECK_CODE
(
setSlotOutput
(
pCxt
,
pJoinLogicNode
->
node
.
pTargets
,
&
pJoin
->
node
.
output
Tuple
),
(
SPhysiNode
*
)
pJoin
);
CHECK_CODE
(
setSlotOutput
(
pCxt
,
pJoinLogicNode
->
node
.
pTargets
,
&
pJoin
->
node
.
output
DataBlockDesc
),
(
SPhysiNode
*
)
pJoin
);
return
(
SPhysiNode
*
)
pJoin
;
}
...
...
@@ -689,9 +693,14 @@ static EDealRes collectAndRewrite(SRewritePrecalcExprsCxt* pCxt, SNode** pNode)
nodesDestroyNode
(
pExpr
);
return
DEAL_RES_ERROR
;
}
SExprNode
*
pToBeRewrittenExpr
=
(
SExprNode
*
)(
*
pNode
);
pCol
->
node
.
resType
=
pToBeRewrittenExpr
->
resType
;
strcpy
(
pCol
->
colName
,
pToBeRewrittenExpr
->
aliasName
);
SExprNode
*
pRewrittenExpr
=
(
SExprNode
*
)
pExpr
;
pCol
->
node
.
resType
=
pRewrittenExpr
->
resType
;
if
(
'\0'
!=
pRewrittenExpr
->
aliasName
[
0
])
{
strcpy
(
pCol
->
colName
,
pRewrittenExpr
->
aliasName
);
}
else
{
snprintf
(
pRewrittenExpr
->
aliasName
,
sizeof
(
pRewrittenExpr
->
aliasName
),
"#expr_%d_%d"
,
pCxt
->
planNodeId
,
pCxt
->
rewriteId
);
strcpy
(
pCol
->
colName
,
pRewrittenExpr
->
aliasName
);
}
nodesDestroyNode
(
*
pNode
);
*
pNode
=
(
SNode
*
)
pCol
;
return
DEAL_RES_IGNORE_CHILD
;
...
...
@@ -758,29 +767,29 @@ static SPhysiNode* createAggPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChild
CHECK_CODE
(
rewritePrecalcExprs
(
pCxt
,
pAggLogicNode
->
pGroupKeys
,
&
pPrecalcExprs
,
&
pGroupKeys
),
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
rewritePrecalcExprs
(
pCxt
,
pAggLogicNode
->
pAggFuncs
,
&
pPrecalcExprs
,
&
pAggFuncs
),
(
SPhysiNode
*
)
pAgg
);
S
TupleDescNode
*
pChildTupe
=
&
(((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
outputTuple
);
// push down expression to output
Tuple
of child node
S
DataBlockDescNode
*
pChildTupe
=
&
(((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
outputDataBlockDesc
);
// push down expression to output
DataBlockDesc
of child node
if
(
NULL
!=
pPrecalcExprs
)
{
pAgg
->
pExprs
=
setListSlotId
(
pCxt
,
pChildTupe
->
tuple
Id
,
-
1
,
pPrecalcExprs
);
pAgg
->
pExprs
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlock
Id
,
-
1
,
pPrecalcExprs
);
CHECK_ALLOC
(
pAgg
->
pExprs
,
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
add
Tuple
Desc
(
pCxt
,
pAgg
->
pExprs
,
pChildTupe
),
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
add
DataBlock
Desc
(
pCxt
,
pAgg
->
pExprs
,
pChildTupe
),
(
SPhysiNode
*
)
pAgg
);
}
if
(
NULL
!=
pGroupKeys
)
{
pAgg
->
pGroupKeys
=
setListSlotId
(
pCxt
,
pChildTupe
->
tuple
Id
,
-
1
,
pGroupKeys
);
pAgg
->
pGroupKeys
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlock
Id
,
-
1
,
pGroupKeys
);
CHECK_ALLOC
(
pAgg
->
pGroupKeys
,
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
add
TupleDesc
(
pCxt
,
pAgg
->
pGroupKeys
,
&
pAgg
->
node
.
outputTuple
),
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
add
DataBlockDesc
(
pCxt
,
pAgg
->
pGroupKeys
,
&
pAgg
->
node
.
outputDataBlockDesc
),
(
SPhysiNode
*
)
pAgg
);
}
if
(
NULL
!=
pAggFuncs
)
{
pAgg
->
pAggFuncs
=
setListSlotId
(
pCxt
,
pChildTupe
->
tuple
Id
,
-
1
,
pAggFuncs
);
pAgg
->
pAggFuncs
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlock
Id
,
-
1
,
pAggFuncs
);
CHECK_ALLOC
(
pAgg
->
pAggFuncs
,
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
add
TupleDesc
(
pCxt
,
pAgg
->
pAggFuncs
,
&
pAgg
->
node
.
outputTuple
),
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
add
DataBlockDesc
(
pCxt
,
pAgg
->
pAggFuncs
,
&
pAgg
->
node
.
outputDataBlockDesc
),
(
SPhysiNode
*
)
pAgg
);
}
CHECK_CODE
(
setConditionsSlotId
(
pCxt
,
(
const
SLogicNode
*
)
pAggLogicNode
,
(
SPhysiNode
*
)
pAgg
),
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
setSlotOutput
(
pCxt
,
pAggLogicNode
->
node
.
pTargets
,
&
pAgg
->
node
.
output
Tuple
),
(
SPhysiNode
*
)
pAgg
);
CHECK_CODE
(
setSlotOutput
(
pCxt
,
pAggLogicNode
->
node
.
pTargets
,
&
pAgg
->
node
.
output
DataBlockDesc
),
(
SPhysiNode
*
)
pAgg
);
return
(
SPhysiNode
*
)
pAgg
;
}
...
...
@@ -789,9 +798,9 @@ static SPhysiNode* createProjectPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pC
SProjectPhysiNode
*
pProject
=
(
SProjectPhysiNode
*
)
makePhysiNode
(
pCxt
,
QUERY_NODE_PHYSICAL_PLAN_PROJECT
);
CHECK_ALLOC
(
pProject
,
NULL
);
pProject
->
pProjections
=
setListSlotId
(
pCxt
,
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
output
Tuple
.
tuple
Id
,
-
1
,
pProjectLogicNode
->
pProjections
);
pProject
->
pProjections
=
setListSlotId
(
pCxt
,
((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
output
DataBlockDesc
.
dataBlock
Id
,
-
1
,
pProjectLogicNode
->
pProjections
);
CHECK_ALLOC
(
pProject
->
pProjections
,
(
SPhysiNode
*
)
pProject
);
CHECK_CODE
(
add
TupleDesc
(
pCxt
,
pProject
->
pProjections
,
&
pProject
->
node
.
outputTuple
),
(
SPhysiNode
*
)
pProject
);
CHECK_CODE
(
add
DataBlockDesc
(
pCxt
,
pProject
->
pProjections
,
&
pProject
->
node
.
outputDataBlockDesc
),
(
SPhysiNode
*
)
pProject
);
CHECK_CODE
(
setConditionsSlotId
(
pCxt
,
(
const
SLogicNode
*
)
pProjectLogicNode
,
(
SPhysiNode
*
)
pProject
),
(
SPhysiNode
*
)
pProject
);
...
...
@@ -840,8 +849,8 @@ static SPhysiNode* createPhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicPl
}
int32_t
createPhysiPlan
(
SLogicNode
*
pLogicNode
,
SPhysiNode
**
pPhyNode
)
{
SPhysiPlanContext
cxt
=
{
.
errCode
=
TSDB_CODE_SUCCESS
,
.
next
TupleId
=
0
,
.
pTuple
Helper
=
taosArrayInit
(
32
,
POINTER_BYTES
)
};
if
(
NULL
==
cxt
.
p
Tuple
Helper
)
{
SPhysiPlanContext
cxt
=
{
.
errCode
=
TSDB_CODE_SUCCESS
,
.
next
DataBlockId
=
0
,
.
pLocation
Helper
=
taosArrayInit
(
32
,
POINTER_BYTES
)
};
if
(
NULL
==
cxt
.
p
Location
Helper
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
*
pPhyNode
=
createPhysiNode
(
&
cxt
,
pLogicNode
);
...
...
source/libs/planner/test/newPlannerTest.cpp
浏览文件 @
7ba4e6f4
...
...
@@ -62,7 +62,7 @@ protected:
return
false
;
}
cout
<<
"sql : ["
<<
cxt_
.
pSql
<<
"]"
<<
endl
;
cout
<<
"
====================
sql : ["
<<
cxt_
.
pSql
<<
"]"
<<
endl
;
cout
<<
"syntax test : "
<<
endl
;
cout
<<
syntaxTreeStr
<<
endl
;
cout
<<
"unformatted logic plan : "
<<
endl
;
...
...
@@ -123,8 +123,8 @@ TEST_F(NewPlannerTest, simple) {
TEST_F
(
NewPlannerTest
,
groupBy
)
{
setDatabase
(
"root"
,
"test"
);
//
bind("SELECT count(*) FROM t1");
//
ASSERT_TRUE(run());
bind
(
"SELECT count(*) FROM t1"
);
ASSERT_TRUE
(
run
());
bind
(
"SELECT c1, count(*) FROM t1 GROUP BY c1"
);
ASSERT_TRUE
(
run
());
...
...
@@ -132,7 +132,7 @@ TEST_F(NewPlannerTest, groupBy) {
bind
(
"SELECT c1 + c3, c1 + count(*) FROM t1 where c2 = 'abc' GROUP BY c1, c3"
);
ASSERT_TRUE
(
run
());
bind
(
"SELECT c1 + c3,
count(*
) FROM t1 where concat(c2, 'wwww') = 'abcwww' GROUP BY c1 + c3"
);
bind
(
"SELECT c1 + c3,
sum(c4 * c5
) FROM t1 where concat(c2, 'wwww') = 'abcwww' GROUP BY c1 + c3"
);
ASSERT_TRUE
(
run
());
}
...
...
source/libs/scalar/src/filter.c
浏览文件 @
7ba4e6f4
...
...
@@ -1455,7 +1455,7 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
for
(
uint32_t
i
=
0
;
i
<
info
->
fields
[
FLD_TYPE_COLUMN
].
num
;
++
i
)
{
SFilterField
*
field
=
&
info
->
fields
[
FLD_TYPE_COLUMN
].
fields
[
i
];
SColumnNode
*
refNode
=
(
SColumnNode
*
)
field
->
desc
;
qDebug
(
"COL%d => [%d][%d]"
,
i
,
refNode
->
tuple
Id
,
refNode
->
slotId
);
qDebug
(
"COL%d => [%d][%d]"
,
i
,
refNode
->
dataBlock
Id
,
refNode
->
slotId
);
}
qDebug
(
"VALUE Field Num:%u"
,
info
->
fields
[
FLD_TYPE_VALUE
].
num
);
...
...
@@ -1485,7 +1485,7 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
SFilterField
*
left
=
FILTER_UNIT_LEFT_FIELD
(
info
,
unit
);
SColumnNode
*
refNode
=
(
SColumnNode
*
)
left
->
desc
;
if
(
unit
->
compare
.
optr
>=
0
&&
unit
->
compare
.
optr
<=
OP_TYPE_JSON_CONTAINS
){
len
=
sprintf
(
str
,
"UNIT[%d] => [%d][%d] %s ["
,
i
,
refNode
->
tuple
Id
,
refNode
->
slotId
,
gOptrStr
[
unit
->
compare
.
optr
].
str
);
len
=
sprintf
(
str
,
"UNIT[%d] => [%d][%d] %s ["
,
i
,
refNode
->
dataBlock
Id
,
refNode
->
slotId
,
gOptrStr
[
unit
->
compare
.
optr
].
str
);
}
if
(
unit
->
right
.
type
==
FLD_TYPE_VALUE
&&
FILTER_UNIT_OPTR
(
unit
)
!=
OP_TYPE_IN
)
{
...
...
@@ -1504,7 +1504,7 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
if
(
unit
->
compare
.
optr2
)
{
strcat
(
str
,
" && "
);
if
(
unit
->
compare
.
optr2
>=
0
&&
unit
->
compare
.
optr2
<=
OP_TYPE_JSON_CONTAINS
){
sprintf
(
str
+
strlen
(
str
),
"[%d][%d] %s ["
,
refNode
->
tuple
Id
,
refNode
->
slotId
,
gOptrStr
[
unit
->
compare
.
optr2
].
str
);
sprintf
(
str
+
strlen
(
str
),
"[%d][%d] %s ["
,
refNode
->
dataBlock
Id
,
refNode
->
slotId
,
gOptrStr
[
unit
->
compare
.
optr2
].
str
);
}
if
(
unit
->
right2
.
type
==
FLD_TYPE_VALUE
&&
FILTER_UNIT_OPTR
(
unit
)
!=
OP_TYPE_IN
)
{
...
...
source/libs/scalar/test/filter/filterTests.cpp
浏览文件 @
7ba4e6f4
...
...
@@ -80,7 +80,7 @@ void flttMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, in
SColumnNode
*
rnode
=
(
SColumnNode
*
)
node
;
rnode
->
node
.
resType
.
type
=
dataType
;
rnode
->
node
.
resType
.
bytes
=
dataBytes
;
rnode
->
tuple
Id
=
0
;
rnode
->
dataBlock
Id
=
0
;
if
(
NULL
==
block
)
{
rnode
->
slotId
=
2
;
...
...
source/libs/scalar/test/scalar/scalarTests.cpp
浏览文件 @
7ba4e6f4
...
...
@@ -79,7 +79,7 @@ void scltMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, in
SColumnNode
*
rnode
=
(
SColumnNode
*
)
node
;
rnode
->
node
.
resType
.
type
=
dataType
;
rnode
->
node
.
resType
.
bytes
=
dataBytes
;
rnode
->
tuple
Id
=
0
;
rnode
->
dataBlock
Id
=
0
;
if
(
NULL
==
*
block
)
{
SSDataBlock
*
res
=
(
SSDataBlock
*
)
calloc
(
1
,
sizeof
(
SSDataBlock
));
...
...
source/util/src/tjson.c
浏览文件 @
7ba4e6f4
...
...
@@ -36,6 +36,10 @@ int32_t tjsonAddDoubleToObject(SJson* pJson, const char* pName, const double num
return
(
NULL
==
cJSON_AddNumberToObject
((
cJSON
*
)
pJson
,
pName
,
number
)
?
TSDB_CODE_FAILED
:
TSDB_CODE_SUCCESS
);
}
int32_t
tjsonAddBoolToObject
(
SJson
*
pJson
,
const
char
*
pName
,
const
bool
boolean
)
{
return
(
NULL
==
cJSON_AddBoolToObject
((
cJSON
*
)
pJson
,
pName
,
boolean
)
?
TSDB_CODE_FAILED
:
TSDB_CODE_SUCCESS
);
}
int32_t
tjsonAddStringToObject
(
SJson
*
pJson
,
const
char
*
pName
,
const
char
*
pVal
)
{
return
(
NULL
==
cJSON_AddStringToObject
((
cJSON
*
)
pJson
,
pName
,
pVal
)
?
TSDB_CODE_FAILED
:
TSDB_CODE_SUCCESS
);
}
...
...
@@ -81,4 +85,113 @@ char* tjsonToString(const SJson* pJson) {
char
*
tjsonToUnformattedString
(
const
SJson
*
pJson
)
{
return
cJSON_PrintUnformatted
((
cJSON
*
)
pJson
);
}
\ No newline at end of file
}
SJson
*
tjsonGetObjectItem
(
const
SJson
*
pJson
,
const
char
*
pName
)
{
return
cJSON_GetObjectItem
(
pJson
,
pName
);
}
int32_t
tjsonGetStringValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
char
*
pVal
)
{
char
*
p
=
cJSON_GetStringValue
(
tjsonGetObjectItem
((
cJSON
*
)
pJson
,
pName
));
if
(
NULL
==
p
)
{
return
TSDB_CODE_FAILED
;
}
strcpy
(
pVal
,
p
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
tjsonDupStringValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
char
**
pVal
)
{
char
*
p
=
cJSON_GetStringValue
(
tjsonGetObjectItem
((
cJSON
*
)
pJson
,
pName
));
if
(
NULL
==
p
)
{
return
TSDB_CODE_FAILED
;
}
*
pVal
=
strdup
(
p
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
tjsonGetBigIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int64_t
*
pVal
)
{
char
*
p
=
cJSON_GetStringValue
(
tjsonGetObjectItem
((
cJSON
*
)
pJson
,
pName
));
if
(
NULL
==
p
)
{
return
TSDB_CODE_FAILED
;
}
char
*
pEnd
=
NULL
;
*
pVal
=
strtol
(
p
,
&
pEnd
,
10
);
return
(
NULL
==
pEnd
?
TSDB_CODE_SUCCESS
:
TSDB_CODE_FAILED
);
}
int32_t
tjsonGetIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int32_t
*
pVal
)
{
int64_t
val
=
0
;
int32_t
code
=
tjsonGetBigIntValue
(
pJson
,
pName
,
&
val
);
*
pVal
=
val
;
return
code
;
}
int32_t
tjsonGetSmallIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int16_t
*
pVal
)
{
int64_t
val
=
0
;
int32_t
code
=
tjsonGetBigIntValue
(
pJson
,
pName
,
&
val
);
*
pVal
=
val
;
return
code
;
}
int32_t
tjsonGetTinyIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int8_t
*
pVal
)
{
int64_t
val
=
0
;
int32_t
code
=
tjsonGetBigIntValue
(
pJson
,
pName
,
&
val
);
*
pVal
=
val
;
return
code
;
}
int32_t
tjsonGetUBigIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
uint64_t
*
pVal
)
{
char
*
p
=
cJSON_GetStringValue
(
tjsonGetObjectItem
((
cJSON
*
)
pJson
,
pName
));
if
(
NULL
==
p
)
{
return
TSDB_CODE_FAILED
;
}
char
*
pEnd
=
NULL
;
*
pVal
=
strtoul
(
p
,
&
pEnd
,
10
);
return
(
NULL
==
pEnd
?
TSDB_CODE_SUCCESS
:
TSDB_CODE_FAILED
);
}
int32_t
tjsonGetUTinyIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
uint8_t
*
pVal
)
{
uint64_t
val
=
0
;
int32_t
code
=
tjsonGetUBigIntValue
(
pJson
,
pName
,
&
val
);
*
pVal
=
val
;
return
code
;
}
int32_t
tjsonGetBoolValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
bool
*
pVal
)
{
const
SJson
*
pObject
=
tjsonGetObjectItem
(
pJson
,
pName
);
if
(
cJSON_IsBool
(
pObject
))
{
return
TSDB_CODE_FAILED
;
}
*
pVal
=
cJSON_IsTrue
(
pObject
)
?
true
:
false
;
return
TSDB_CODE_SUCCESS
;
}
int32_t
tjsonGetDoubleValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
double
*
pVal
)
{
const
SJson
*
pObject
=
tjsonGetObjectItem
(
pJson
,
pName
);
if
(
!
cJSON_IsNumber
(
pObject
))
{
return
TSDB_CODE_FAILED
;
}
*
pVal
=
cJSON_GetNumberValue
(
pObject
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
tjsonGetArraySize
(
const
SJson
*
pJson
)
{
return
cJSON_GetArraySize
(
pJson
);
}
SJson
*
tjsonGetArrayItem
(
const
SJson
*
pJson
,
int32_t
index
)
{
return
cJSON_GetArrayItem
(
pJson
,
index
);
}
int32_t
tjsonToObject
(
const
SJson
*
pJson
,
const
char
*
pName
,
FToObject
func
,
void
*
pObj
)
{
SJson
*
pJsonObj
=
tjsonGetObjectItem
(
pJson
,
pName
);
if
(
NULL
==
pJsonObj
)
{
return
TSDB_CODE_FAILED
;
}
return
func
(
pJsonObj
,
pObj
);
}
SJson
*
tjsonParse
(
const
char
*
pStr
)
{
return
cJSON_Parse
(
pStr
);
}
tests
@
904e6f0e
比较
12233db3
...
904e6f0e
Subproject commit
12233db374f1fe97b327e89a3442c631578ad38d
Subproject commit
904e6f0e152e8fe61edfe0a0a9ae497cfde2a72c
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录