Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
7ba4e6f4
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
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
此差异已折叠。
点击以展开。
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
);
}
...
...
@@ -82,3 +86,112 @@ char* tjsonToString(const SJson* pJson) {
char
*
tjsonToUnformattedString
(
const
SJson
*
pJson
)
{
return
cJSON_PrintUnformatted
((
cJSON
*
)
pJson
);
}
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录