Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
ce263507
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
Star
22019
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看板
提交
ce263507
编写于
6月 26, 2023
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: add uid/vgid functions
上级
9972aa81
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
175 addition
and
76 deletion
+175
-76
include/libs/function/functionMgt.h
include/libs/function/functionMgt.h
+2
-0
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+4
-3
include/libs/scalar/scalar.h
include/libs/scalar/scalar.h
+2
-0
source/libs/executor/src/hashjoinoperator.c
source/libs/executor/src/hashjoinoperator.c
+1
-1
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+5
-1
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+36
-0
source/libs/nodes/src/nodesCloneFuncs.c
source/libs/nodes/src/nodesCloneFuncs.c
+4
-3
source/libs/nodes/src/nodesCodeFuncs.c
source/libs/nodes/src/nodesCodeFuncs.c
+8
-8
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+3
-3
source/libs/planner/src/planLogicCreater.c
source/libs/planner/src/planLogicCreater.c
+2
-2
source/libs/planner/src/planOptimizer.c
source/libs/planner/src/planOptimizer.c
+76
-48
source/libs/planner/src/planPhysiCreater.c
source/libs/planner/src/planPhysiCreater.c
+7
-7
source/libs/scalar/src/sclfunc.c
source/libs/scalar/src/sclfunc.c
+25
-0
未找到文件。
include/libs/function/functionMgt.h
浏览文件 @
ce263507
...
@@ -122,6 +122,8 @@ typedef enum EFunctionType {
...
@@ -122,6 +122,8 @@ typedef enum EFunctionType {
FUNCTION_TYPE_IROWTS
,
FUNCTION_TYPE_IROWTS
,
FUNCTION_TYPE_ISFILLED
,
FUNCTION_TYPE_ISFILLED
,
FUNCTION_TYPE_TAGS
,
FUNCTION_TYPE_TAGS
,
FUNCTION_TYPE_TBUID
,
FUNCTION_TYPE_VGID
,
// internal function
// internal function
FUNCTION_TYPE_SELECT_VALUE
=
3750
,
FUNCTION_TYPE_SELECT_VALUE
=
3750
,
...
...
include/libs/nodes/plannodes.h
浏览文件 @
ce263507
...
@@ -110,10 +110,11 @@ typedef struct SScanLogicNode {
...
@@ -110,10 +110,11 @@ typedef struct SScanLogicNode {
typedef
struct
SJoinLogicNode
{
typedef
struct
SJoinLogicNode
{
SLogicNode
node
;
SLogicNode
node
;
EJoinType
joinType
;
EJoinType
joinType
;
SNode
*
pMergeCondition
;
SNode
*
pPrimKeyEqCond
;
SNode
*
pOnConditions
;
SNode
*
pColEqCond
;
SNode
*
pTagEqCond
;
SNode
*
pOtherOnCond
;
bool
isSingleTableJoin
;
bool
isSingleTableJoin
;
SNode
*
pColEqualOnConditions
;
}
SJoinLogicNode
;
}
SJoinLogicNode
;
typedef
struct
SAggLogicNode
{
typedef
struct
SAggLogicNode
{
...
...
include/libs/scalar/scalar.h
浏览文件 @
ce263507
...
@@ -95,6 +95,8 @@ int32_t qStartTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p
...
@@ -95,6 +95,8 @@ int32_t qStartTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p
int32_t
qEndTsFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
qEndTsFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
qTbnameFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
qTbnameFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
qTbUidFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
qVgIdFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
/* Aggregation functions */
/* Aggregation functions */
int32_t
countScalarFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
countScalarFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
...
...
source/libs/executor/src/hashjoinoperator.c
浏览文件 @
ce263507
...
@@ -575,7 +575,7 @@ static int32_t addRowToHashImpl(SHJoinOperatorInfo* pJoin, SGroupData* pGroup, S
...
@@ -575,7 +575,7 @@ static int32_t addRowToHashImpl(SHJoinOperatorInfo* pJoin, SGroupData* pGroup, S
}
}
}
}
int32_t
code
=
get
HJoinValBufSize
(
pJoin
->
pRowBufs
,
get
JoinValBufSize
(
pTable
,
rowIdx
),
&
pTable
->
valData
,
pRow
);
int32_t
code
=
get
ValBufFromPages
(
pJoin
->
pRowBufs
,
getH
JoinValBufSize
(
pTable
,
rowIdx
),
&
pTable
->
valData
,
pRow
);
if
(
code
)
{
if
(
code
)
{
return
code
;
return
code
;
}
}
...
...
source/libs/executor/src/scanoperator.c
浏览文件 @
ce263507
...
@@ -2503,9 +2503,13 @@ static void doTagScanOneTable(SOperatorInfo* pOperator, const SSDataBlock* pRes,
...
@@ -2503,9 +2503,13 @@ static void doTagScanOneTable(SOperatorInfo* pOperator, const SSDataBlock* pRes,
SColumnInfoData
*
pDst
=
taosArrayGet
(
pRes
->
pDataBlock
,
pExprInfo
[
j
].
base
.
resSchema
.
slotId
);
SColumnInfoData
*
pDst
=
taosArrayGet
(
pRes
->
pDataBlock
,
pExprInfo
[
j
].
base
.
resSchema
.
slotId
);
// refactor later
// refactor later
if
(
fmIsScanPseudoColumnFunc
(
pExprInfo
[
j
].
pExpr
->
_function
.
functionId
)
)
{
if
(
FUNCTION_TYPE_TBNAME
==
pExprInfo
[
j
].
pExpr
->
_function
.
functionType
)
{
STR_TO_VARSTR
(
str
,
(
*
mr
).
me
.
name
);
STR_TO_VARSTR
(
str
,
(
*
mr
).
me
.
name
);
colDataSetVal
(
pDst
,
(
count
),
str
,
false
);
colDataSetVal
(
pDst
,
(
count
),
str
,
false
);
}
else
if
(
FUNCTION_TYPE_TBUID
==
pExprInfo
[
j
].
pExpr
->
_function
.
functionType
)
{
colDataSetVal
(
pDst
,
(
count
),
(
char
*
)
&
(
*
mr
).
me
.
uid
,
false
);
}
else
if
(
FUNCTION_TYPE_VGID
==
pExprInfo
[
j
].
pExpr
->
_function
.
functionType
)
{
colDataSetVal
(
pDst
,
(
count
),
(
char
*
)
&
pTaskInfo
->
id
.
vgId
,
false
);
}
else
{
// it is a tag value
}
else
{
// it is a tag value
STagVal
val
=
{
0
};
STagVal
val
=
{
0
};
val
.
cid
=
pExprInfo
[
j
].
base
.
pParam
[
0
].
pCol
->
colId
;
val
.
cid
=
pExprInfo
[
j
].
base
.
pParam
[
0
].
pCol
->
colId
;
...
...
source/libs/function/src/builtins.c
浏览文件 @
ce263507
...
@@ -679,6 +679,21 @@ static int32_t translateTbnameColumn(SFunctionNode* pFunc, char* pErrBuf, int32_
...
@@ -679,6 +679,21 @@ static int32_t translateTbnameColumn(SFunctionNode* pFunc, char* pErrBuf, int32_
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
translateTbUidColumn
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
// pseudo column do not need to check parameters
pFunc
->
node
.
resType
=
(
SDataType
){.
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
,
.
type
=
TSDB_DATA_TYPE_BIGINT
};
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
translateVgIdColumn
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
// pseudo column do not need to check parameters
pFunc
->
node
.
resType
=
(
SDataType
){.
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_INT
].
bytes
,
.
type
=
TSDB_DATA_TYPE_INT
};
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
translateTopBot
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
static
int32_t
translateTopBot
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
)
{
int32_t
numOfParams
=
LIST_LENGTH
(
pFunc
->
pParameterList
);
int32_t
numOfParams
=
LIST_LENGTH
(
pFunc
->
pParameterList
);
if
(
2
!=
numOfParams
)
{
if
(
2
!=
numOfParams
)
{
...
@@ -3517,6 +3532,27 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -3517,6 +3532,27 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
sprocessFunc
=
containsProperlyFunction
,
.
sprocessFunc
=
containsProperlyFunction
,
.
finalizeFunc
=
NULL
.
finalizeFunc
=
NULL
},
},
{
.
name
=
"_tbuid"
,
.
type
=
FUNCTION_TYPE_TBUID
,
.
classification
=
FUNC_MGT_PSEUDO_COLUMN_FUNC
|
FUNC_MGT_SCAN_PC_FUNC
|
FUNC_MGT_KEEP_ORDER_FUNC
,
.
translateFunc
=
translateTbUidColumn
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
qTbUidFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"_vgid"
,
.
type
=
FUNCTION_TYPE_VGID
,
.
classification
=
FUNC_MGT_PSEUDO_COLUMN_FUNC
|
FUNC_MGT_SCAN_PC_FUNC
|
FUNC_MGT_KEEP_ORDER_FUNC
,
.
translateFunc
=
translateVgIdColumn
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
qVgIdFunction
,
.
finalizeFunc
=
NULL
},
};
};
// clang-format on
// clang-format on
...
...
source/libs/nodes/src/nodesCloneFuncs.c
浏览文件 @
ce263507
...
@@ -403,9 +403,10 @@ static int32_t logicScanCopy(const SScanLogicNode* pSrc, SScanLogicNode* pDst) {
...
@@ -403,9 +403,10 @@ static int32_t logicScanCopy(const SScanLogicNode* pSrc, SScanLogicNode* pDst) {
static
int32_t
logicJoinCopy
(
const
SJoinLogicNode
*
pSrc
,
SJoinLogicNode
*
pDst
)
{
static
int32_t
logicJoinCopy
(
const
SJoinLogicNode
*
pSrc
,
SJoinLogicNode
*
pDst
)
{
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
COPY_SCALAR_FIELD
(
joinType
);
COPY_SCALAR_FIELD
(
joinType
);
CLONE_NODE_FIELD
(
pMergeCondition
);
CLONE_NODE_FIELD
(
pPrimKeyEqCond
);
CLONE_NODE_FIELD
(
pOnConditions
);
CLONE_NODE_FIELD
(
pColEqCond
);
CLONE_NODE_FIELD
(
pColEqualOnConditions
);
CLONE_NODE_FIELD
(
pTagEqCond
);
CLONE_NODE_FIELD
(
pOtherOnCond
);
COPY_SCALAR_FIELD
(
isSingleTableJoin
);
COPY_SCALAR_FIELD
(
isSingleTableJoin
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
...
source/libs/nodes/src/nodesCodeFuncs.c
浏览文件 @
ce263507
...
@@ -1427,8 +1427,8 @@ static int32_t jsonToLogicPlan(const SJson* pJson, void* pObj) {
...
@@ -1427,8 +1427,8 @@ static int32_t jsonToLogicPlan(const SJson* pJson, void* pObj) {
static
const
char
*
jkJoinLogicPlanJoinType
=
"JoinType"
;
static
const
char
*
jkJoinLogicPlanJoinType
=
"JoinType"
;
static
const
char
*
jkJoinLogicPlanOnConditions
=
"OnConditions"
;
static
const
char
*
jkJoinLogicPlanOnConditions
=
"OnConditions"
;
static
const
char
*
jkJoinLogicPlan
MergeCondition
=
"MergeConditions
"
;
static
const
char
*
jkJoinLogicPlan
PrimKeyEqCondition
=
"PrimKeyEqCond
"
;
static
const
char
*
jkJoinLogicPlanColEq
ualOnConditions
=
"ColumnEqualOnConditions
"
;
static
const
char
*
jkJoinLogicPlanColEq
Condition
=
"ColumnEqCond
"
;
static
int32_t
logicJoinNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
static
int32_t
logicJoinNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SJoinLogicNode
*
pNode
=
(
const
SJoinLogicNode
*
)
pObj
;
const
SJoinLogicNode
*
pNode
=
(
const
SJoinLogicNode
*
)
pObj
;
...
@@ -1438,13 +1438,13 @@ static int32_t logicJoinNodeToJson(const void* pObj, SJson* pJson) {
...
@@ -1438,13 +1438,13 @@ static int32_t logicJoinNodeToJson(const void* pObj, SJson* pJson) {
code
=
tjsonAddIntegerToObject
(
pJson
,
jkJoinLogicPlanJoinType
,
pNode
->
joinType
);
code
=
tjsonAddIntegerToObject
(
pJson
,
jkJoinLogicPlanJoinType
,
pNode
->
joinType
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkJoinLogicPlan
MergeCondition
,
nodeToJson
,
pNode
->
pMergeCondition
);
code
=
tjsonAddObject
(
pJson
,
jkJoinLogicPlan
PrimKeyEqCondition
,
nodeToJson
,
pNode
->
pPrimKeyEqCond
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkJoinLogicPlanOnConditions
,
nodeToJson
,
pNode
->
pO
nConditions
);
code
=
tjsonAddObject
(
pJson
,
jkJoinLogicPlanOnConditions
,
nodeToJson
,
pNode
->
pO
therOnCond
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkJoinLogicPlanColEq
ualOnConditions
,
nodeToJson
,
pNode
->
pColEqualOnConditions
);
code
=
tjsonAddObject
(
pJson
,
jkJoinLogicPlanColEq
Condition
,
nodeToJson
,
pNode
->
pColEqCond
);
}
}
return
code
;
return
code
;
}
}
...
@@ -1457,13 +1457,13 @@ static int32_t jsonToLogicJoinNode(const SJson* pJson, void* pObj) {
...
@@ -1457,13 +1457,13 @@ static int32_t jsonToLogicJoinNode(const SJson* pJson, void* pObj) {
tjsonGetNumberValue
(
pJson
,
jkJoinLogicPlanJoinType
,
pNode
->
joinType
,
code
);
tjsonGetNumberValue
(
pJson
,
jkJoinLogicPlanJoinType
,
pNode
->
joinType
,
code
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkJoinLogicPlan
MergeCondition
,
&
pNode
->
pMergeCondition
);
code
=
jsonToNodeObject
(
pJson
,
jkJoinLogicPlan
PrimKeyEqCondition
,
&
pNode
->
pPrimKeyEqCond
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkJoinLogicPlanOnConditions
,
&
pNode
->
pO
nConditions
);
code
=
jsonToNodeObject
(
pJson
,
jkJoinLogicPlanOnConditions
,
&
pNode
->
pO
therOnCond
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkJoinLogicPlanColEq
ualOnConditions
,
&
pNode
->
pColEqualOnConditions
);
code
=
jsonToNodeObject
(
pJson
,
jkJoinLogicPlanColEq
Condition
,
&
pNode
->
pColEqCond
);
}
}
return
code
;
return
code
;
}
}
...
...
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
ce263507
...
@@ -1090,9 +1090,9 @@ void nodesDestroyNode(SNode* pNode) {
...
@@ -1090,9 +1090,9 @@ void nodesDestroyNode(SNode* pNode) {
case
QUERY_NODE_LOGIC_PLAN_JOIN
:
{
case
QUERY_NODE_LOGIC_PLAN_JOIN
:
{
SJoinLogicNode
*
pLogicNode
=
(
SJoinLogicNode
*
)
pNode
;
SJoinLogicNode
*
pLogicNode
=
(
SJoinLogicNode
*
)
pNode
;
destroyLogicNode
((
SLogicNode
*
)
pLogicNode
);
destroyLogicNode
((
SLogicNode
*
)
pLogicNode
);
nodesDestroyNode
(
pLogicNode
->
p
MergeCondition
);
nodesDestroyNode
(
pLogicNode
->
p
PrimKeyEqCond
);
nodesDestroyNode
(
pLogicNode
->
pO
nConditions
);
nodesDestroyNode
(
pLogicNode
->
pO
therOnCond
);
nodesDestroyNode
(
pLogicNode
->
pColEq
ualOnConditions
);
nodesDestroyNode
(
pLogicNode
->
pColEq
Cond
);
break
;
break
;
}
}
case
QUERY_NODE_LOGIC_PLAN_AGG
:
{
case
QUERY_NODE_LOGIC_PLAN_AGG
:
{
...
...
source/libs/planner/src/planLogicCreater.c
浏览文件 @
ce263507
...
@@ -467,8 +467,8 @@ static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
...
@@ -467,8 +467,8 @@ static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
// set on conditions
// set on conditions
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinTable
->
pOnCond
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinTable
->
pOnCond
)
{
pJoin
->
pO
nConditions
=
nodesCloneNode
(
pJoinTable
->
pOnCond
);
pJoin
->
pO
therOnCond
=
nodesCloneNode
(
pJoinTable
->
pOnCond
);
if
(
NULL
==
pJoin
->
pO
nConditions
)
{
if
(
NULL
==
pJoin
->
pO
therOnCond
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
}
}
}
...
...
source/libs/planner/src/planOptimizer.c
浏览文件 @
ce263507
...
@@ -615,7 +615,7 @@ static int32_t pushDownCondOptPartCond(SJoinLogicNode* pJoin, SNode** pOnCond, S
...
@@ -615,7 +615,7 @@ static int32_t pushDownCondOptPartCond(SJoinLogicNode* pJoin, SNode** pOnCond, S
}
}
static
int32_t
pushDownCondOptPushCondToOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SNode
**
pCond
)
{
static
int32_t
pushDownCondOptPushCondToOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SNode
**
pCond
)
{
return
pushDownCondOptAppendCond
(
&
pJoin
->
pO
nConditions
,
pCond
);
return
pushDownCondOptAppendCond
(
&
pJoin
->
pO
therOnCond
,
pCond
);
}
}
static
int32_t
pushDownCondOptPushCondToChild
(
SOptimizeContext
*
pCxt
,
SLogicNode
*
pChild
,
SNode
**
pCond
)
{
static
int32_t
pushDownCondOptPushCondToChild
(
SOptimizeContext
*
pCxt
,
SLogicNode
*
pChild
,
SNode
**
pCond
)
{
...
@@ -674,24 +674,24 @@ static bool pushDownCondOptContainPriKeyEqualCond(SJoinLogicNode* pJoin, SNode*
...
@@ -674,24 +674,24 @@ static bool pushDownCondOptContainPriKeyEqualCond(SJoinLogicNode* pJoin, SNode*
}
}
static
int32_t
pushDownCondOptCheckJoinOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
static
int32_t
pushDownCondOptCheckJoinOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
if
(
NULL
==
pJoin
->
pO
nConditions
)
{
if
(
NULL
==
pJoin
->
pO
therOnCond
)
{
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_NOT_SUPPORT_CROSS_JOIN
);
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_NOT_SUPPORT_CROSS_JOIN
);
}
}
if
(
!
pushDownCondOptContainPriKeyEqualCond
(
pJoin
,
pJoin
->
pO
nConditions
))
{
if
(
!
pushDownCondOptContainPriKeyEqualCond
(
pJoin
,
pJoin
->
pO
therOnCond
))
{
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_EXPECTED_TS_EQUAL
);
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_EXPECTED_TS_EQUAL
);
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
pushDownCondOptPartJoinOnCondLogicCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pp
Merge
Cond
,
SNode
**
ppOnCond
)
{
static
int32_t
pushDownCondOptPartJoinOnCondLogicCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pp
PrimKeyEq
Cond
,
SNode
**
ppOnCond
)
{
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)(
pJoin
->
pO
nConditions
);
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)(
pJoin
->
pO
therOnCond
);
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SNodeList
*
pOnConds
=
NULL
;
SNodeList
*
pOnConds
=
NULL
;
SNode
*
pCond
=
NULL
;
SNode
*
pCond
=
NULL
;
FOREACH
(
pCond
,
pLogicCond
->
pParameterList
)
{
FOREACH
(
pCond
,
pLogicCond
->
pParameterList
)
{
if
(
pushDownCondOptIsPriKeyEqualCond
(
pJoin
,
pCond
))
{
if
(
pushDownCondOptIsPriKeyEqualCond
(
pJoin
,
pCond
))
{
*
pp
Merge
Cond
=
nodesCloneNode
(
pCond
);
*
pp
PrimKeyEq
Cond
=
nodesCloneNode
(
pCond
);
}
else
{
}
else
{
code
=
nodesListMakeAppend
(
&
pOnConds
,
nodesCloneNode
(
pCond
));
code
=
nodesListMakeAppend
(
&
pOnConds
,
nodesCloneNode
(
pCond
));
}
}
...
@@ -702,10 +702,10 @@ static int32_t pushDownCondOptPartJoinOnCondLogicCond(SJoinLogicNode* pJoin, SNo
...
@@ -702,10 +702,10 @@ static int32_t pushDownCondOptPartJoinOnCondLogicCond(SJoinLogicNode* pJoin, SNo
code
=
nodesMergeConds
(
&
pTempOnCond
,
&
pOnConds
);
code
=
nodesMergeConds
(
&
pTempOnCond
,
&
pOnConds
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
*
pp
Merge
Cond
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
*
pp
PrimKeyEq
Cond
)
{
*
ppOnCond
=
pTempOnCond
;
*
ppOnCond
=
pTempOnCond
;
nodesDestroyNode
(
pJoin
->
pO
nConditions
);
nodesDestroyNode
(
pJoin
->
pO
therOnCond
);
pJoin
->
pO
nConditions
=
NULL
;
pJoin
->
pO
therOnCond
=
NULL
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
{
}
else
{
nodesDestroyList
(
pOnConds
);
nodesDestroyList
(
pOnConds
);
...
@@ -714,35 +714,35 @@ static int32_t pushDownCondOptPartJoinOnCondLogicCond(SJoinLogicNode* pJoin, SNo
...
@@ -714,35 +714,35 @@ static int32_t pushDownCondOptPartJoinOnCondLogicCond(SJoinLogicNode* pJoin, SNo
}
}
}
}
static
int32_t
pushDownCondOptPartJoinOnCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pp
Merge
Cond
,
SNode
**
ppOnCond
)
{
static
int32_t
pushDownCondOptPartJoinOnCond
(
SJoinLogicNode
*
pJoin
,
SNode
**
pp
PrimKeyEq
Cond
,
SNode
**
ppOnCond
)
{
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pJoin
->
pO
nConditions
)
&&
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pJoin
->
pO
therOnCond
)
&&
LOGIC_COND_TYPE_AND
==
((
SLogicConditionNode
*
)(
pJoin
->
pO
nConditions
))
->
condType
)
{
LOGIC_COND_TYPE_AND
==
((
SLogicConditionNode
*
)(
pJoin
->
pO
therOnCond
))
->
condType
)
{
return
pushDownCondOptPartJoinOnCondLogicCond
(
pJoin
,
pp
Merge
Cond
,
ppOnCond
);
return
pushDownCondOptPartJoinOnCondLogicCond
(
pJoin
,
pp
PrimKeyEq
Cond
,
ppOnCond
);
}
}
if
(
pushDownCondOptIsPriKeyEqualCond
(
pJoin
,
pJoin
->
pO
nConditions
))
{
if
(
pushDownCondOptIsPriKeyEqualCond
(
pJoin
,
pJoin
->
pO
therOnCond
))
{
*
pp
MergeCond
=
nodesCloneNode
(
pJoin
->
pOnConditions
);
*
pp
PrimKeyEqCond
=
nodesCloneNode
(
pJoin
->
pOtherOnCond
);
*
ppOnCond
=
NULL
;
*
ppOnCond
=
NULL
;
nodesDestroyNode
(
pJoin
->
pO
nConditions
);
nodesDestroyNode
(
pJoin
->
pO
therOnCond
);
pJoin
->
pO
nConditions
=
NULL
;
pJoin
->
pO
therOnCond
=
NULL
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
{
}
else
{
return
TSDB_CODE_PLAN_INTERNAL_ERROR
;
return
TSDB_CODE_PLAN_INTERNAL_ERROR
;
}
}
}
}
static
int32_t
pushDownCondOptJoinExtract
Merge
Cond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
static
int32_t
pushDownCondOptJoinExtractCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
int32_t
code
=
pushDownCondOptCheckJoinOnCond
(
pCxt
,
pJoin
);
int32_t
code
=
pushDownCondOptCheckJoinOnCond
(
pCxt
,
pJoin
);
SNode
*
p
JoinMerge
Cond
=
NULL
;
SNode
*
p
PrimKeyEq
Cond
=
NULL
;
SNode
*
pJoinOnCond
=
NULL
;
SNode
*
pJoinOnCond
=
NULL
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
pushDownCondOptPartJoinOnCond
(
pJoin
,
&
p
JoinMerge
Cond
,
&
pJoinOnCond
);
code
=
pushDownCondOptPartJoinOnCond
(
pJoin
,
&
p
PrimKeyEq
Cond
,
&
pJoinOnCond
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pJoin
->
p
MergeCondition
=
pJoinMerge
Cond
;
pJoin
->
p
PrimKeyEqCond
=
pPrimKeyEq
Cond
;
pJoin
->
pO
nConditions
=
pJoinOnCond
;
pJoin
->
pO
therOnCond
=
pJoinOnCond
;
}
else
{
}
else
{
nodesDestroyNode
(
p
JoinMerge
Cond
);
nodesDestroyNode
(
p
PrimKeyEq
Cond
);
nodesDestroyNode
(
pJoinOnCond
);
nodesDestroyNode
(
pJoinOnCond
);
}
}
return
code
;
return
code
;
...
@@ -756,7 +756,7 @@ static bool pushDownCondOptIsTableColumn(SNode* pNode, SNodeList* pTableCols) {
...
@@ -756,7 +756,7 @@ static bool pushDownCondOptIsTableColumn(SNode* pNode, SNodeList* pTableCols) {
return
pushDownCondOptBelongThisTable
(
pNode
,
pTableCols
);
return
pushDownCondOptBelongThisTable
(
pNode
,
pTableCols
);
}
}
static
bool
pushDownCondOptIsColEqualOnCond
(
SJoinLogicNode
*
pJoin
,
SNode
*
pCond
)
{
static
bool
pushDownCondOptIsColEqualOnCond
(
SJoinLogicNode
*
pJoin
,
SNode
*
pCond
,
bool
*
allTags
)
{
if
(
QUERY_NODE_OPERATOR
!=
nodeType
(
pCond
))
{
if
(
QUERY_NODE_OPERATOR
!=
nodeType
(
pCond
))
{
return
false
;
return
false
;
}
}
...
@@ -775,53 +775,75 @@ static bool pushDownCondOptIsColEqualOnCond(SJoinLogicNode* pJoin, SNode* pCond)
...
@@ -775,53 +775,75 @@ static bool pushDownCondOptIsColEqualOnCond(SJoinLogicNode* pJoin, SNode* pCond)
}
}
SNodeList
*
pLeftCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
0
))
->
pTargets
;
SNodeList
*
pLeftCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
0
))
->
pTargets
;
SNodeList
*
pRightCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
))
->
pTargets
;
SNodeList
*
pRightCols
=
((
SLogicNode
*
)
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
))
->
pTargets
;
bool
isEqual
=
false
;
if
(
pushDownCondOptIsTableColumn
(
pOper
->
pLeft
,
pLeftCols
))
{
if
(
pushDownCondOptIsTableColumn
(
pOper
->
pLeft
,
pLeftCols
))
{
return
pushDownCondOptIsTableColumn
(
pOper
->
pRight
,
pRightCols
);
isEqual
=
pushDownCondOptIsTableColumn
(
pOper
->
pRight
,
pRightCols
);
}
else
if
(
pushDownCondOptIsTableColumn
(
pOper
->
pLeft
,
pRightCols
))
{
}
else
if
(
pushDownCondOptIsTableColumn
(
pOper
->
pLeft
,
pRightCols
))
{
return
pushDownCondOptIsTableColumn
(
pOper
->
pRight
,
pLeftCols
);
isEqual
=
pushDownCondOptIsTableColumn
(
pOper
->
pRight
,
pLeftCols
);
}
}
return
false
;
if
(
isEqual
)
{
*
allTags
=
(
COLUMN_TYPE_TAG
==
pLeft
->
colType
)
&&
(
COLUMN_TYPE_TAG
==
pRight
->
colType
);
}
return
isEqual
;
}
}
static
int32_t
pushDownCondOptJoinExtract
Col
EqualOnLogicCond
(
SJoinLogicNode
*
pJoin
)
{
static
int32_t
pushDownCondOptJoinExtractEqualOnLogicCond
(
SJoinLogicNode
*
pJoin
)
{
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)(
pJoin
->
pO
nConditions
);
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)(
pJoin
->
pO
therOnCond
);
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SNodeList
*
pEqualOnConds
=
NULL
;
SNodeList
*
pColEqOnConds
=
NULL
;
SNodeList
*
pTagEqOnConds
=
NULL
;
SNode
*
pCond
=
NULL
;
SNode
*
pCond
=
NULL
;
bool
allTags
=
false
;
FOREACH
(
pCond
,
pLogicCond
->
pParameterList
)
{
FOREACH
(
pCond
,
pLogicCond
->
pParameterList
)
{
if
(
pushDownCondOptIsColEqualOnCond
(
pJoin
,
pCond
))
{
if
(
pushDownCondOptIsColEqualOnCond
(
pJoin
,
pCond
,
&
allTags
))
{
code
=
nodesListMakeAppend
(
&
pEqualOnConds
,
nodesCloneNode
(
pCond
));
if
(
allTags
)
{
code
=
nodesListMakeAppend
(
&
pTagEqOnConds
,
nodesCloneNode
(
pCond
));
}
else
{
code
=
nodesListMakeAppend
(
&
pColEqOnConds
,
nodesCloneNode
(
pCond
));
}
}
}
}
}
SNode
*
pTempTagEqCond
=
NULL
;
SNode
*
pTempTagEqCond
=
NULL
;
SNode
*
pTempColEqCond
=
NULL
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesMergeConds
(
&
pTempColEqCond
,
&
pColEqOnConds
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesMergeConds
(
&
pTempTagEqCond
,
&
p
Equal
OnConds
);
code
=
nodesMergeConds
(
&
pTempTagEqCond
,
&
p
TagEq
OnConds
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pJoin
->
pColEqualOnConditions
=
pTempTagEqCond
;
pJoin
->
pColEqCond
=
pTempColEqCond
;
pJoin
->
pTagEqCond
=
pTempTagEqCond
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
{
}
else
{
nodesDestroyList
(
pEqualOnConds
);
nodesDestroyList
(
pColEqOnConds
);
nodesDestroyList
(
pTagEqOnConds
);
return
TSDB_CODE_PLAN_INTERNAL_ERROR
;
return
TSDB_CODE_PLAN_INTERNAL_ERROR
;
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
pushDownCondOptJoinExtractColEqualOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
static
int32_t
pushDownCondOptJoinExtractEqualOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
if
(
NULL
==
pJoin
->
pOnConditions
)
{
if
(
NULL
==
pJoin
->
pOtherOnCond
)
{
pJoin
->
pColEqualOnConditions
=
NULL
;
pJoin
->
pColEqCond
=
NULL
;
pJoin
->
pTagEqCond
=
NULL
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pJoin
->
pO
nConditions
)
&&
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pJoin
->
pO
therOnCond
)
&&
LOGIC_COND_TYPE_AND
==
((
SLogicConditionNode
*
)(
pJoin
->
pO
nConditions
))
->
condType
)
{
LOGIC_COND_TYPE_AND
==
((
SLogicConditionNode
*
)(
pJoin
->
pO
therOnCond
))
->
condType
)
{
return
pushDownCondOptJoinExtract
Col
EqualOnLogicCond
(
pJoin
);
return
pushDownCondOptJoinExtractEqualOnLogicCond
(
pJoin
);
}
}
if
(
pushDownCondOptIsColEqualOnCond
(
pJoin
,
pJoin
->
pOnConditions
))
{
bool
allTags
=
false
;
pJoin
->
pColEqualOnConditions
=
nodesCloneNode
(
pJoin
->
pOnConditions
);
if
(
pushDownCondOptIsColEqualOnCond
(
pJoin
,
pJoin
->
pOtherOnCond
,
&
allTags
))
{
if
(
allTags
)
{
pJoin
->
pTagEqCond
=
nodesCloneNode
(
pJoin
->
pOtherOnCond
);
}
else
{
pJoin
->
pColEqCond
=
nodesCloneNode
(
pJoin
->
pOtherOnCond
);
}
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -833,7 +855,7 @@ static int32_t pushDownCondOptDealJoin(SOptimizeContext* pCxt, SJoinLogicNode* p
...
@@ -833,7 +855,7 @@ static int32_t pushDownCondOptDealJoin(SOptimizeContext* pCxt, SJoinLogicNode* p
}
}
if
(
NULL
==
pJoin
->
node
.
pConditions
)
{
if
(
NULL
==
pJoin
->
node
.
pConditions
)
{
int32_t
code
=
pushDownCondOptJoinExtract
Merge
Cond
(
pCxt
,
pJoin
);
int32_t
code
=
pushDownCondOptJoinExtractCond
(
pCxt
,
pJoin
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
OPTIMIZE_FLAG_SET_MASK
(
pJoin
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_PUSH_DOWN_CONDE
);
OPTIMIZE_FLAG_SET_MASK
(
pJoin
->
node
.
optimizedFlag
,
OPTIMIZE_FLAG_PUSH_DOWN_CONDE
);
pCxt
->
optimized
=
true
;
pCxt
->
optimized
=
true
;
...
@@ -858,11 +880,11 @@ static int32_t pushDownCondOptDealJoin(SOptimizeContext* pCxt, SJoinLogicNode* p
...
@@ -858,11 +880,11 @@ static int32_t pushDownCondOptDealJoin(SOptimizeContext* pCxt, SJoinLogicNode* p
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
pushDownCondOptJoinExtract
Merge
Cond
(
pCxt
,
pJoin
);
code
=
pushDownCondOptJoinExtractCond
(
pCxt
,
pJoin
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
pushDownCondOptJoinExtract
Col
EqualOnCond
(
pCxt
,
pJoin
);
code
=
pushDownCondOptJoinExtractEqualOnCond
(
pCxt
,
pJoin
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
@@ -1792,10 +1814,16 @@ static bool eliminateProjOptCanChildConditionUseChildTargets(SLogicNode* pChild,
...
@@ -1792,10 +1814,16 @@ static bool eliminateProjOptCanChildConditionUseChildTargets(SLogicNode* pChild,
nodesWalkExpr
(
pChild
->
pConditions
,
eliminateProjOptCanUseNewChildTargetsImpl
,
&
cxt
);
nodesWalkExpr
(
pChild
->
pConditions
,
eliminateProjOptCanUseNewChildTargetsImpl
,
&
cxt
);
if
(
!
cxt
.
canUse
)
return
false
;
if
(
!
cxt
.
canUse
)
return
false
;
}
}
if
(
QUERY_NODE_LOGIC_PLAN_JOIN
==
nodeType
(
pChild
)
&&
NULL
!=
((
SJoinLogicNode
*
)
pChild
)
->
pOnConditions
)
{
if
(
QUERY_NODE_LOGIC_PLAN_JOIN
==
nodeType
(
pChild
))
{
SJoinLogicNode
*
pJoinLogicNode
=
(
SJoinLogicNode
*
)
pChild
;
SJoinLogicNode
*
pJoinLogicNode
=
(
SJoinLogicNode
*
)
pChild
;
CheckNewChildTargetsCxt
cxt
=
{.
pNewChildTargets
=
pNewChildTargets
,
.
canUse
=
false
};
CheckNewChildTargetsCxt
cxt
=
{.
pNewChildTargets
=
pNewChildTargets
,
.
canUse
=
false
};
nodesWalkExpr
(
pJoinLogicNode
->
pOnConditions
,
eliminateProjOptCanUseNewChildTargetsImpl
,
&
cxt
);
nodesWalkExpr
(
pJoinLogicNode
->
pPrimKeyEqCond
,
eliminateProjOptCanUseNewChildTargetsImpl
,
&
cxt
);
if
(
!
cxt
.
canUse
)
return
false
;
nodesWalkExpr
(
pJoinLogicNode
->
pColEqCond
,
eliminateProjOptCanUseNewChildTargetsImpl
,
&
cxt
);
if
(
!
cxt
.
canUse
)
return
false
;
nodesWalkExpr
(
pJoinLogicNode
->
pTagEqCond
,
eliminateProjOptCanUseNewChildTargetsImpl
,
&
cxt
);
if
(
!
cxt
.
canUse
)
return
false
;
nodesWalkExpr
(
pJoinLogicNode
->
pOtherOnCond
,
eliminateProjOptCanUseNewChildTargetsImpl
,
&
cxt
);
if
(
!
cxt
.
canUse
)
return
false
;
if
(
!
cxt
.
canUse
)
return
false
;
}
}
return
true
;
return
true
;
...
...
source/libs/planner/src/planPhysiCreater.c
浏览文件 @
ce263507
...
@@ -679,7 +679,7 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
...
@@ -679,7 +679,7 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
pJoin
->
joinType
=
pJoinLogicNode
->
joinType
;
pJoin
->
joinType
=
pJoinLogicNode
->
joinType
;
pJoin
->
node
.
inputTsOrder
=
pJoinLogicNode
->
node
.
inputTsOrder
;
pJoin
->
node
.
inputTsOrder
=
pJoinLogicNode
->
node
.
inputTsOrder
;
setNodeSlotId
(
pCxt
,
pLeftDesc
->
dataBlockId
,
pRightDesc
->
dataBlockId
,
pJoinLogicNode
->
p
MergeCondition
,
setNodeSlotId
(
pCxt
,
pLeftDesc
->
dataBlockId
,
pRightDesc
->
dataBlockId
,
pJoinLogicNode
->
p
PrimKeyEqCond
,
&
pJoin
->
pMergeCondition
);
&
pJoin
->
pMergeCondition
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
setListSlotId
(
pCxt
,
pLeftDesc
->
dataBlockId
,
pRightDesc
->
dataBlockId
,
pJoinLogicNode
->
node
.
pTargets
,
code
=
setListSlotId
(
pCxt
,
pLeftDesc
->
dataBlockId
,
pRightDesc
->
dataBlockId
,
pJoinLogicNode
->
node
.
pTargets
,
...
@@ -689,12 +689,12 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
...
@@ -689,12 +689,12 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
code
=
addDataBlockSlots
(
pCxt
,
pJoin
->
pTargets
,
pJoin
->
node
.
pOutputDataBlockDesc
);
code
=
addDataBlockSlots
(
pCxt
,
pJoin
->
pTargets
,
pJoin
->
node
.
pOutputDataBlockDesc
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinLogicNode
->
pO
nConditions
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinLogicNode
->
pO
therOnCond
)
{
SNodeList
*
pCondCols
=
nodesMakeList
();
SNodeList
*
pCondCols
=
nodesMakeList
();
if
(
NULL
==
pCondCols
)
{
if
(
NULL
==
pCondCols
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
else
{
}
else
{
code
=
nodesCollectColumnsFromNode
(
pJoinLogicNode
->
pO
nConditions
,
NULL
,
COLLECT_COL_TYPE_ALL
,
&
pCondCols
);
code
=
nodesCollectColumnsFromNode
(
pJoinLogicNode
->
pO
therOnCond
,
NULL
,
COLLECT_COL_TYPE_ALL
,
&
pCondCols
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addDataBlockSlots
(
pCxt
,
pCondCols
,
pJoin
->
node
.
pOutputDataBlockDesc
);
code
=
addDataBlockSlots
(
pCxt
,
pCondCols
,
pJoin
->
node
.
pOutputDataBlockDesc
);
...
@@ -702,13 +702,13 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
...
@@ -702,13 +702,13 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
nodesDestroyList
(
pCondCols
);
nodesDestroyList
(
pCondCols
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinLogicNode
->
pO
nConditions
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinLogicNode
->
pO
therOnCond
)
{
code
=
setNodeSlotId
(
pCxt
,
((
SPhysiNode
*
)
pJoin
)
->
pOutputDataBlockDesc
->
dataBlockId
,
-
1
,
code
=
setNodeSlotId
(
pCxt
,
((
SPhysiNode
*
)
pJoin
)
->
pOutputDataBlockDesc
->
dataBlockId
,
-
1
,
pJoinLogicNode
->
pO
nConditions
,
&
pJoin
->
pOnConditions
);
pJoinLogicNode
->
pO
therOnCond
,
&
pJoin
->
pOnConditions
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinLogicNode
->
pColEq
ualOnConditions
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pJoinLogicNode
->
pColEq
Cond
)
{
code
=
setNodeSlotId
(
pCxt
,
pLeftDesc
->
dataBlockId
,
pRightDesc
->
dataBlockId
,
pJoinLogicNode
->
pColEq
ualOnConditions
,
&
pJoin
->
pColEqualOnConditions
);
code
=
setNodeSlotId
(
pCxt
,
pLeftDesc
->
dataBlockId
,
pRightDesc
->
dataBlockId
,
pJoinLogicNode
->
pColEq
Cond
,
&
pJoin
->
pColEqualOnConditions
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
setConditionsSlotId
(
pCxt
,
(
const
SLogicNode
*
)
pJoinLogicNode
,
(
SPhysiNode
*
)
pJoin
);
code
=
setConditionsSlotId
(
pCxt
,
(
const
SLogicNode
*
)
pJoinLogicNode
,
(
SPhysiNode
*
)
pJoin
);
...
...
source/libs/scalar/src/sclfunc.c
浏览文件 @
ce263507
...
@@ -1706,6 +1706,31 @@ int32_t qTbnameFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pO
...
@@ -1706,6 +1706,31 @@ int32_t qTbnameFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pO
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
qTbUidFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
char
*
p
=
colDataGetNumData
(
pInput
->
columnData
,
0
);
int32_t
code
=
colDataSetNItems
(
pOutput
->
columnData
,
pOutput
->
numOfRows
,
p
,
pInput
->
numOfRows
,
true
);
if
(
code
)
{
return
code
;
}
pOutput
->
numOfRows
+=
pInput
->
numOfRows
;
return
TSDB_CODE_SUCCESS
;
}
int32_t
qVgIdFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
char
*
p
=
colDataGetNumData
(
pInput
->
columnData
,
0
);
int32_t
code
=
colDataSetNItems
(
pOutput
->
columnData
,
pOutput
->
numOfRows
,
p
,
pInput
->
numOfRows
,
true
);
if
(
code
)
{
return
code
;
}
pOutput
->
numOfRows
+=
pInput
->
numOfRows
;
return
TSDB_CODE_SUCCESS
;
}
/** Aggregation functions **/
/** Aggregation functions **/
int32_t
countScalarFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
int32_t
countScalarFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
SColumnInfoData
*
pInputData
=
pInput
->
columnData
;
SColumnInfoData
*
pInputData
=
pInput
->
columnData
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录