Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
408929ec
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
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看板
未验证
提交
408929ec
编写于
4月 30, 2022
作者:
X
Xiaoyu Wang
提交者:
GitHub
4月 30, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #12074 from taosdata/feature/3.0_wxy
feat: fill physical plan
上级
5a7796ee
cdfe9929
变更
23
展开全部
显示空白变更内容
内联
并排
Showing
23 changed file
with
966 addition
and
544 deletion
+966
-544
include/common/taosdef.h
include/common/taosdef.h
+8
-7
include/libs/nodes/nodes.h
include/libs/nodes/nodes.h
+2
-0
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+21
-4
include/libs/nodes/querynodes.h
include/libs/nodes/querynodes.h
+12
-10
include/util/taoserror.h
include/util/taoserror.h
+3
-0
source/libs/command/src/explain.c
source/libs/command/src/explain.c
+178
-168
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+14
-16
source/libs/nodes/src/nodesCloneFuncs.c
source/libs/nodes/src/nodesCloneFuncs.c
+11
-1
source/libs/nodes/src/nodesCodeFuncs.c
source/libs/nodes/src/nodesCodeFuncs.c
+142
-5
source/libs/nodes/src/nodesTraverseFuncs.c
source/libs/nodes/src/nodesTraverseFuncs.c
+21
-10
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+14
-11
source/libs/parser/src/parAstCreater.c
source/libs/parser/src/parAstCreater.c
+6
-0
source/libs/parser/src/parTokenizer.c
source/libs/parser/src/parTokenizer.c
+184
-184
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+135
-27
source/libs/parser/src/parUtil.c
source/libs/parser/src/parUtil.c
+2
-1
source/libs/parser/test/parSelectTest.cpp
source/libs/parser/test/parSelectTest.cpp
+68
-58
source/libs/planner/inc/planInt.h
source/libs/planner/inc/planInt.h
+3
-0
source/libs/planner/src/planLogicCreater.c
source/libs/planner/src/planLogicCreater.c
+38
-11
source/libs/planner/src/planOptimizer.c
source/libs/planner/src/planOptimizer.c
+4
-8
source/libs/planner/src/planPhysiCreater.c
source/libs/planner/src/planPhysiCreater.c
+43
-7
source/libs/planner/src/planUtil.c
source/libs/planner/src/planUtil.c
+36
-0
source/libs/planner/test/planBasicTest.cpp
source/libs/planner/test/planBasicTest.cpp
+14
-12
source/libs/planner/test/planIntervalTest.cpp
source/libs/planner/test/planIntervalTest.cpp
+7
-4
未找到文件。
include/common/taosdef.h
浏览文件 @
408929ec
...
@@ -28,6 +28,7 @@ typedef int64_t tb_uid_t;
...
@@ -28,6 +28,7 @@ typedef int64_t tb_uid_t;
#define TSWINDOW_INITIALIZER ((STimeWindow){INT64_MIN, INT64_MAX})
#define TSWINDOW_INITIALIZER ((STimeWindow){INT64_MIN, INT64_MAX})
#define TSWINDOW_DESC_INITIALIZER ((STimeWindow){INT64_MAX, INT64_MIN})
#define TSWINDOW_DESC_INITIALIZER ((STimeWindow){INT64_MAX, INT64_MIN})
#define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX))
#define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX))
#define TSWINDOW_IS_EQUAL(t1, t2) (((t1).skey == (t2).skey) && ((t1).ekey == (t2).ekey))
typedef
enum
{
typedef
enum
{
TSDB_SUPER_TABLE
=
1
,
// super table
TSDB_SUPER_TABLE
=
1
,
// super table
...
...
include/libs/nodes/nodes.h
浏览文件 @
408929ec
...
@@ -185,6 +185,7 @@ typedef enum ENodeType {
...
@@ -185,6 +185,7 @@ typedef enum ENodeType {
QUERY_NODE_LOGIC_PLAN_VNODE_MODIF
,
QUERY_NODE_LOGIC_PLAN_VNODE_MODIF
,
QUERY_NODE_LOGIC_PLAN_EXCHANGE
,
QUERY_NODE_LOGIC_PLAN_EXCHANGE
,
QUERY_NODE_LOGIC_PLAN_WINDOW
,
QUERY_NODE_LOGIC_PLAN_WINDOW
,
QUERY_NODE_LOGIC_PLAN_FILL
,
QUERY_NODE_LOGIC_PLAN_SORT
,
QUERY_NODE_LOGIC_PLAN_SORT
,
QUERY_NODE_LOGIC_PLAN_PARTITION
,
QUERY_NODE_LOGIC_PLAN_PARTITION
,
QUERY_NODE_LOGIC_SUBPLAN
,
QUERY_NODE_LOGIC_SUBPLAN
,
...
@@ -202,6 +203,7 @@ typedef enum ENodeType {
...
@@ -202,6 +203,7 @@ typedef enum ENodeType {
QUERY_NODE_PHYSICAL_PLAN_EXCHANGE
,
QUERY_NODE_PHYSICAL_PLAN_EXCHANGE
,
QUERY_NODE_PHYSICAL_PLAN_SORT
,
QUERY_NODE_PHYSICAL_PLAN_SORT
,
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
,
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
,
QUERY_NODE_PHYSICAL_PLAN_FILL
,
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
,
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
,
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
,
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
,
QUERY_NODE_PHYSICAL_PLAN_PARTITION
,
QUERY_NODE_PHYSICAL_PLAN_PARTITION
,
...
...
include/libs/nodes/plannodes.h
浏览文件 @
408929ec
...
@@ -102,7 +102,6 @@ typedef struct SWindowLogicNode {
...
@@ -102,7 +102,6 @@ typedef struct SWindowLogicNode {
int64_t
sliding
;
int64_t
sliding
;
int8_t
intervalUnit
;
int8_t
intervalUnit
;
int8_t
slidingUnit
;
int8_t
slidingUnit
;
SFillNode
*
pFill
;
int64_t
sessionGap
;
int64_t
sessionGap
;
SNode
*
pTspk
;
SNode
*
pTspk
;
SNode
*
pStateExpr
;
SNode
*
pStateExpr
;
...
@@ -110,6 +109,14 @@ typedef struct SWindowLogicNode {
...
@@ -110,6 +109,14 @@ typedef struct SWindowLogicNode {
int64_t
watermark
;
int64_t
watermark
;
}
SWindowLogicNode
;
}
SWindowLogicNode
;
typedef
struct
SFillLogicNode
{
SLogicNode
node
;
EFillMode
mode
;
SNode
*
pWStartTs
;
SNode
*
pValues
;
// SNodeListNode
STimeWindow
timeRange
;
}
SFillLogicNode
;
typedef
struct
SSortLogicNode
{
typedef
struct
SSortLogicNode
{
SLogicNode
node
;
SLogicNode
node
;
SNodeList
*
pSortKeys
;
SNodeList
*
pSortKeys
;
...
@@ -223,10 +230,12 @@ typedef struct SProjectPhysiNode {
...
@@ -223,10 +230,12 @@ typedef struct SProjectPhysiNode {
typedef
struct
SJoinPhysiNode
{
typedef
struct
SJoinPhysiNode
{
SPhysiNode
node
;
SPhysiNode
node
;
EJoinType
joinType
;
EJoinType
joinType
;
SNode
*
pOnConditions
;
// in or out tuple ?
SNode
*
pOnConditions
;
SNodeList
*
pTargets
;
SNodeList
*
pTargets
;
}
SJoinPhysiNode
;
}
SJoinPhysiNode
;
typedef
SJoinPhysiNode
SSortMergeJoinPhysiNode
;
typedef
struct
SAggPhysiNode
{
typedef
struct
SAggPhysiNode
{
SPhysiNode
node
;
SPhysiNode
node
;
SNodeList
*
pExprs
;
// these are expression list of group_by_clause and parameter expression of aggregate function
SNodeList
*
pExprs
;
// these are expression list of group_by_clause and parameter expression of aggregate function
...
@@ -263,9 +272,17 @@ typedef struct SIntervalPhysiNode {
...
@@ -263,9 +272,17 @@ typedef struct SIntervalPhysiNode {
int64_t
sliding
;
int64_t
sliding
;
int8_t
intervalUnit
;
int8_t
intervalUnit
;
int8_t
slidingUnit
;
int8_t
slidingUnit
;
SFillNode
*
pFill
;
}
SIntervalPhysiNode
;
}
SIntervalPhysiNode
;
typedef
struct
SFillPhysiNode
{
SPhysiNode
node
;
EFillMode
mode
;
SNode
*
pWStartTs
;
// SColumnNode
SNode
*
pValues
;
// SNodeListNode
SNodeList
*
pTargets
;
STimeWindow
timeRange
;
}
SFillPhysiNode
;
typedef
struct
SMultiTableIntervalPhysiNode
{
typedef
struct
SMultiTableIntervalPhysiNode
{
SIntervalPhysiNode
interval
;
SIntervalPhysiNode
interval
;
SNodeList
*
pPartitionKeys
;
SNodeList
*
pPartitionKeys
;
...
...
include/libs/nodes/querynodes.h
浏览文件 @
408929ec
...
@@ -212,6 +212,8 @@ typedef struct SFillNode {
...
@@ -212,6 +212,8 @@ typedef struct SFillNode {
ENodeType
type
;
// QUERY_NODE_FILL
ENodeType
type
;
// QUERY_NODE_FILL
EFillMode
mode
;
EFillMode
mode
;
SNode
*
pValues
;
// SNodeListNode
SNode
*
pValues
;
// SNodeListNode
SNode
*
pWStartTs
;
// _wstartts pseudo column
STimeWindow
timeRange
;
}
SFillNode
;
}
SFillNode
;
typedef
struct
SSelectStmt
{
typedef
struct
SSelectStmt
{
...
@@ -300,7 +302,7 @@ int32_t nodesCollectColumns(SSelectStmt* pSelect, ESqlClause clause, const char*
...
@@ -300,7 +302,7 @@ int32_t nodesCollectColumns(SSelectStmt* pSelect, ESqlClause clause, const char*
SNodeList
**
pCols
);
SNodeList
**
pCols
);
typedef
bool
(
*
FFuncClassifier
)(
int32_t
funcId
);
typedef
bool
(
*
FFuncClassifier
)(
int32_t
funcId
);
int32_t
nodesCollectFuncs
(
SSelectStmt
*
pSelect
,
FFuncClassifier
classifier
,
SNodeList
**
pFuncs
);
int32_t
nodesCollectFuncs
(
SSelectStmt
*
pSelect
,
ESqlClause
clause
,
FFuncClassifier
classifier
,
SNodeList
**
pFuncs
);
int32_t
nodesCollectSpecialNodes
(
SSelectStmt
*
pSelect
,
ESqlClause
clause
,
ENodeType
type
,
SNodeList
**
pNodes
);
int32_t
nodesCollectSpecialNodes
(
SSelectStmt
*
pSelect
,
ESqlClause
clause
,
ENodeType
type
,
SNodeList
**
pNodes
);
...
@@ -315,7 +317,7 @@ bool nodesIsTimeorderQuery(const SNode* pQuery);
...
@@ -315,7 +317,7 @@ bool nodesIsTimeorderQuery(const SNode* pQuery);
bool
nodesIsTimelineQuery
(
const
SNode
*
pQuery
);
bool
nodesIsTimelineQuery
(
const
SNode
*
pQuery
);
void
*
nodesGetValueFromNode
(
SValueNode
*
pNode
);
void
*
nodesGetValueFromNode
(
SValueNode
*
pNode
);
int32_t
nodesSetValueNodeValue
(
SValueNode
*
pNode
,
void
*
value
);
int32_t
nodesSetValueNodeValue
(
SValueNode
*
pNode
,
void
*
value
);
char
*
nodesGetStrValueFromNode
(
SValueNode
*
pNode
);
char
*
nodesGetStrValueFromNode
(
SValueNode
*
pNode
);
char
*
getFillModeString
(
EFillMode
mode
);
char
*
getFillModeString
(
EFillMode
mode
);
void
valueNodeToVariant
(
const
SValueNode
*
pNode
,
SVariant
*
pVal
);
void
valueNodeToVariant
(
const
SValueNode
*
pNode
,
SVariant
*
pVal
);
...
...
include/util/taoserror.h
浏览文件 @
408929ec
...
@@ -619,9 +619,12 @@ int32_t* taosGetErrno();
...
@@ -619,9 +619,12 @@ int32_t* taosGetErrno();
#define TSDB_CODE_PAR_SLIMIT_LEAK_PARTITION_BY TAOS_DEF_ERROR_CODE(0, 0x2638)
#define TSDB_CODE_PAR_SLIMIT_LEAK_PARTITION_BY TAOS_DEF_ERROR_CODE(0, 0x2638)
#define TSDB_CODE_PAR_INVALID_TOPIC_QUERY TAOS_DEF_ERROR_CODE(0, 0x2639)
#define TSDB_CODE_PAR_INVALID_TOPIC_QUERY TAOS_DEF_ERROR_CODE(0, 0x2639)
#define TSDB_CODE_PAR_INVALID_DROP_STABLE TAOS_DEF_ERROR_CODE(0, 0x263A)
#define TSDB_CODE_PAR_INVALID_DROP_STABLE TAOS_DEF_ERROR_CODE(0, 0x263A)
#define TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE TAOS_DEF_ERROR_CODE(0, 0x263B)
//planner
//planner
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
#define TSDB_CODE_PLAN_EXPECTED_TS_EQUAL TAOS_DEF_ERROR_CODE(0, 0x2701)
#define TSDB_CODE_PLAN_NOT_SUPPORT_CROSS_JOIN TAOS_DEF_ERROR_CODE(0, 0x2702)
//function
//function
#define TSDB_CODE_FUNC_FUNTION_ERROR TAOS_DEF_ERROR_CODE(0, 0x2800)
#define TSDB_CODE_FUNC_FUNTION_ERROR TAOS_DEF_ERROR_CODE(0, 0x2800)
...
...
source/libs/command/src/explain.c
浏览文件 @
408929ec
此差异已折叠。
点击以展开。
source/libs/executor/src/executorimpl.c
浏览文件 @
408929ec
...
@@ -41,8 +41,6 @@
...
@@ -41,8 +41,6 @@
#define SET_MAIN_SCAN_FLAG(runtime) ((runtime)->scanFlag = MAIN_SCAN)
#define SET_MAIN_SCAN_FLAG(runtime) ((runtime)->scanFlag = MAIN_SCAN)
#define SET_REVERSE_SCAN_FLAG(runtime) ((runtime)->scanFlag = REVERSE_SCAN)
#define SET_REVERSE_SCAN_FLAG(runtime) ((runtime)->scanFlag = REVERSE_SCAN)
#define TSWINDOW_IS_EQUAL(t1, t2) (((t1).skey == (t2).skey) && ((t1).ekey == (t2).ekey))
#define SDATA_BLOCK_INITIALIZER \
#define SDATA_BLOCK_INITIALIZER \
(SDataBlockInfo) { {0}, 0 }
(SDataBlockInfo) { {0}, 0 }
...
@@ -3962,8 +3960,7 @@ static SSDataBlock* concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SEx
...
@@ -3962,8 +3960,7 @@ static SSDataBlock* concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SEx
}
}
SRetrieveTableRsp
*
pTableRsp
=
pDataInfo
->
pRsp
;
SRetrieveTableRsp
*
pTableRsp
=
pDataInfo
->
pRsp
;
code
=
code
=
setSDataBlockFromFetchRsp
(
pExchangeInfo
->
pResult
,
pLoadInfo
,
pTableRsp
->
numOfRows
,
pTableRsp
->
data
,
setSDataBlockFromFetchRsp
(
pExchangeInfo
->
pResult
,
pLoadInfo
,
pTableRsp
->
numOfRows
,
pTableRsp
->
data
,
pTableRsp
->
compLen
,
pTableRsp
->
numOfCols
,
startTs
,
&
pDataInfo
->
totalRows
,
NULL
);
pTableRsp
->
compLen
,
pTableRsp
->
numOfCols
,
startTs
,
&
pDataInfo
->
totalRows
,
NULL
);
if
(
code
!=
0
)
{
if
(
code
!=
0
)
{
goto
_error
;
goto
_error
;
...
@@ -4784,8 +4781,8 @@ static int32_t doOpenAggregateOptr(SOperatorInfo* pOperator) {
...
@@ -4784,8 +4781,8 @@ static int32_t doOpenAggregateOptr(SOperatorInfo* pOperator) {
// there is an scalar expression that needs to be calculated before apply the group aggregation.
// there is an scalar expression that needs to be calculated before apply the group aggregation.
if
(
pAggInfo
->
pScalarExprInfo
!=
NULL
)
{
if
(
pAggInfo
->
pScalarExprInfo
!=
NULL
)
{
int32_t
code
=
projectApplyFunctions
(
pAggInfo
->
pScalarExprInfo
,
pBlock
,
pBlock
,
pAggInfo
->
pScalarCtx
,
pAggInfo
->
numOfScalarExpr
,
int32_t
code
=
projectApplyFunctions
(
pAggInfo
->
pScalarExprInfo
,
pBlock
,
pBlock
,
pAggInfo
->
pScalarCtx
,
NULL
);
pAggInfo
->
numOfScalarExpr
,
NULL
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
pTaskInfo
->
code
=
code
;
pTaskInfo
->
code
=
code
;
longjmp
(
pTaskInfo
->
env
,
pTaskInfo
->
code
);
longjmp
(
pTaskInfo
->
env
,
pTaskInfo
->
code
);
...
@@ -6543,8 +6540,8 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
...
@@ -6543,8 +6540,8 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
int32_t
numOfCols
=
0
;
int32_t
numOfCols
=
0
;
SArray
*
pCols
=
extractColMatchInfo
(
pScanPhyNode
->
pScanCols
,
pScanPhyNode
->
node
.
pOutputDataBlockDesc
,
&
numOfCols
);
SArray
*
pCols
=
extractColMatchInfo
(
pScanPhyNode
->
pScanCols
,
pScanPhyNode
->
node
.
pOutputDataBlockDesc
,
&
numOfCols
);
SOperatorInfo
*
pOperator
=
SOperatorInfo
*
pOperator
=
createStreamScanOperatorInfo
(
pHandle
->
reader
,
pResBlock
,
pCols
,
tableIdList
,
pTaskInfo
,
createStreamScanOperatorInfo
(
pHandle
->
reader
,
pResBlock
,
pCols
,
tableIdList
,
pTaskInfo
,
pScanPhyNode
->
node
.
pConditions
);
pScanPhyNode
->
node
.
pConditions
);
taosArrayDestroy
(
tableIdList
);
taosArrayDestroy
(
tableIdList
);
return
pOperator
;
return
pOperator
;
}
else
if
(
QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN
==
type
)
{
}
else
if
(
QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN
==
type
)
{
...
@@ -6625,10 +6622,11 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
...
@@ -6625,10 +6622,11 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
pOptr
=
createIntervalOperatorInfo
(
ops
[
0
],
pExprInfo
,
num
,
pResBlock
,
&
interval
,
primaryTsSlotId
,
&
as
,
pOptr
=
createIntervalOperatorInfo
(
ops
[
0
],
pExprInfo
,
num
,
pResBlock
,
&
interval
,
primaryTsSlotId
,
&
as
,
pTableGroupInfo
,
pTaskInfo
);
pTableGroupInfo
,
pTaskInfo
);
if
(
pIntervalPhyNode
->
pFill
!=
NULL
)
{
// if (pIntervalPhyNode->pFill != NULL) {
pOptr
=
createFillOperatorInfo
(
pOptr
,
pExprInfo
,
num
,
&
interval
,
pResBlock
,
pIntervalPhyNode
->
pFill
->
mode
,
NULL
,
// pOptr = createFillOperatorInfo(pOptr, pExprInfo, num, &interval, pResBlock, pIntervalPhyNode->pFill->mode,
false
,
pTaskInfo
);
// NULL,
}
// false, pTaskInfo);
// }
}
else
if
(
QUERY_NODE_PHYSICAL_PLAN_SORT
==
type
)
{
}
else
if
(
QUERY_NODE_PHYSICAL_PLAN_SORT
==
type
)
{
SSortPhysiNode
*
pSortPhyNode
=
(
SSortPhysiNode
*
)
pPhyNode
;
SSortPhysiNode
*
pSortPhyNode
=
(
SSortPhysiNode
*
)
pPhyNode
;
...
...
source/libs/nodes/src/nodesCloneFuncs.c
浏览文件 @
408929ec
...
@@ -191,6 +191,7 @@ static SNode* nodeListNodeCopy(const SNodeListNode* pSrc, SNodeListNode* pDst) {
...
@@ -191,6 +191,7 @@ static SNode* nodeListNodeCopy(const SNodeListNode* pSrc, SNodeListNode* pDst) {
static
SNode
*
fillNodeCopy
(
const
SFillNode
*
pSrc
,
SFillNode
*
pDst
)
{
static
SNode
*
fillNodeCopy
(
const
SFillNode
*
pSrc
,
SFillNode
*
pDst
)
{
COPY_SCALAR_FIELD
(
mode
);
COPY_SCALAR_FIELD
(
mode
);
CLONE_NODE_FIELD
(
pValues
);
CLONE_NODE_FIELD
(
pValues
);
CLONE_NODE_FIELD
(
pWStartTs
);
return
(
SNode
*
)
pDst
;
return
(
SNode
*
)
pDst
;
}
}
...
@@ -269,11 +270,18 @@ static SNode* logicWindowCopy(const SWindowLogicNode* pSrc, SWindowLogicNode* pD
...
@@ -269,11 +270,18 @@ static SNode* logicWindowCopy(const SWindowLogicNode* pSrc, SWindowLogicNode* pD
COPY_ALL_SCALAR_FIELDS
;
COPY_ALL_SCALAR_FIELDS
;
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
CLONE_NODE_LIST_FIELD
(
pFuncs
);
CLONE_NODE_LIST_FIELD
(
pFuncs
);
CLONE_NODE_FIELD
(
pFill
);
CLONE_NODE_FIELD
(
pTspk
);
CLONE_NODE_FIELD
(
pTspk
);
return
(
SNode
*
)
pDst
;
return
(
SNode
*
)
pDst
;
}
}
static
SNode
*
logicFillCopy
(
const
SFillLogicNode
*
pSrc
,
SFillLogicNode
*
pDst
)
{
COPY_ALL_SCALAR_FIELDS
;
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
CLONE_NODE_FIELD
(
pWStartTs
);
CLONE_NODE_FIELD
(
pValues
);
return
(
SNode
*
)
pDst
;
}
static
SNode
*
logicSortCopy
(
const
SSortLogicNode
*
pSrc
,
SSortLogicNode
*
pDst
)
{
static
SNode
*
logicSortCopy
(
const
SSortLogicNode
*
pSrc
,
SSortLogicNode
*
pDst
)
{
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
CLONE_NODE_LIST_FIELD
(
pSortKeys
);
CLONE_NODE_LIST_FIELD
(
pSortKeys
);
...
@@ -370,6 +378,8 @@ SNodeptr nodesCloneNode(const SNodeptr pNode) {
...
@@ -370,6 +378,8 @@ SNodeptr nodesCloneNode(const SNodeptr pNode) {
return
logicExchangeCopy
((
const
SExchangeLogicNode
*
)
pNode
,
(
SExchangeLogicNode
*
)
pDst
);
return
logicExchangeCopy
((
const
SExchangeLogicNode
*
)
pNode
,
(
SExchangeLogicNode
*
)
pDst
);
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
return
logicWindowCopy
((
const
SWindowLogicNode
*
)
pNode
,
(
SWindowLogicNode
*
)
pDst
);
return
logicWindowCopy
((
const
SWindowLogicNode
*
)
pNode
,
(
SWindowLogicNode
*
)
pDst
);
case
QUERY_NODE_LOGIC_PLAN_FILL
:
return
logicFillCopy
((
const
SFillLogicNode
*
)
pNode
,
(
SFillLogicNode
*
)
pDst
);
case
QUERY_NODE_LOGIC_PLAN_SORT
:
case
QUERY_NODE_LOGIC_PLAN_SORT
:
return
logicSortCopy
((
const
SSortLogicNode
*
)
pNode
,
(
SSortLogicNode
*
)
pDst
);
return
logicSortCopy
((
const
SSortLogicNode
*
)
pNode
,
(
SSortLogicNode
*
)
pDst
);
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
...
...
source/libs/nodes/src/nodesCodeFuncs.c
浏览文件 @
408929ec
...
@@ -192,6 +192,8 @@ const char* nodesNodeName(ENodeType type) {
...
@@ -192,6 +192,8 @@ const char* nodesNodeName(ENodeType type) {
return
"LogicExchange"
;
return
"LogicExchange"
;
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
return
"LogicWindow"
;
return
"LogicWindow"
;
case
QUERY_NODE_LOGIC_PLAN_FILL
:
return
"LogicFill"
;
case
QUERY_NODE_LOGIC_PLAN_SORT
:
case
QUERY_NODE_LOGIC_PLAN_SORT
:
return
"LogicSort"
;
return
"LogicSort"
;
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
...
@@ -222,6 +224,8 @@ const char* nodesNodeName(ENodeType type) {
...
@@ -222,6 +224,8 @@ const char* nodesNodeName(ENodeType type) {
return
"PhysiSort"
;
return
"PhysiSort"
;
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
return
"PhysiInterval"
;
return
"PhysiInterval"
;
case
QUERY_NODE_PHYSICAL_PLAN_FILL
:
return
"PhysiFill"
;
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
return
"PhysiSessionWindow"
;
return
"PhysiSessionWindow"
;
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
...
@@ -564,6 +568,58 @@ static int32_t jsonToLogicProjectNode(const SJson* pJson, void* pObj) {
...
@@ -564,6 +568,58 @@ static int32_t jsonToLogicProjectNode(const SJson* pJson, void* pObj) {
return
code
;
return
code
;
}
}
static
const
char
*
jkFillLogicPlanMode
=
"Mode"
;
static
const
char
*
jkFillLogicPlanWStartTs
=
"WStartTs"
;
static
const
char
*
jkFillLogicPlanValues
=
"Values"
;
static
const
char
*
jkFillLogicPlanStartTime
=
"StartTime"
;
static
const
char
*
jkFillLogicPlanEndTime
=
"EndTime"
;
static
int32_t
logicFillNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SFillLogicNode
*
pNode
=
(
const
SFillLogicNode
*
)
pObj
;
int32_t
code
=
logicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillLogicPlanMode
,
pNode
->
mode
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkFillLogicPlanWStartTs
,
nodeToJson
,
pNode
->
pWStartTs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkFillLogicPlanValues
,
nodeToJson
,
pNode
->
pValues
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillLogicPlanStartTime
,
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillLogicPlanEndTime
,
pNode
->
timeRange
.
ekey
);
}
return
code
;
}
static
int32_t
jsonToLogicFillNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SFillLogicNode
*
pNode
=
(
SFillLogicNode
*
)
pObj
;
int32_t
code
=
jsonToLogicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetNumberValue
(
pJson
,
jkFillLogicPlanMode
,
pNode
->
mode
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkFillLogicPlanWStartTs
,
&
pNode
->
pWStartTs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkFillLogicPlanValues
,
&
pNode
->
pValues
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkFillLogicPlanStartTime
,
&
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkFillLogicPlanEndTime
,
&
pNode
->
timeRange
.
ekey
);
}
return
code
;
}
static
const
char
*
jkSortLogicPlanSortKeys
=
"SortKeys"
;
static
const
char
*
jkSortLogicPlanSortKeys
=
"SortKeys"
;
static
int32_t
logicSortNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
static
int32_t
logicSortNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
...
@@ -1382,7 +1438,6 @@ static const char* jkIntervalPhysiPlanOffset = "Offset";
...
@@ -1382,7 +1438,6 @@ static const char* jkIntervalPhysiPlanOffset = "Offset";
static
const
char
*
jkIntervalPhysiPlanSliding
=
"Sliding"
;
static
const
char
*
jkIntervalPhysiPlanSliding
=
"Sliding"
;
static
const
char
*
jkIntervalPhysiPlanIntervalUnit
=
"intervalUnit"
;
static
const
char
*
jkIntervalPhysiPlanIntervalUnit
=
"intervalUnit"
;
static
const
char
*
jkIntervalPhysiPlanSlidingUnit
=
"slidingUnit"
;
static
const
char
*
jkIntervalPhysiPlanSlidingUnit
=
"slidingUnit"
;
static
const
char
*
jkIntervalPhysiPlanFill
=
"Fill"
;
static
int32_t
physiIntervalNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
static
int32_t
physiIntervalNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SIntervalPhysiNode
*
pNode
=
(
const
SIntervalPhysiNode
*
)
pObj
;
const
SIntervalPhysiNode
*
pNode
=
(
const
SIntervalPhysiNode
*
)
pObj
;
...
@@ -1403,9 +1458,6 @@ static int32_t physiIntervalNodeToJson(const void* pObj, SJson* pJson) {
...
@@ -1403,9 +1458,6 @@ static int32_t physiIntervalNodeToJson(const void* pObj, SJson* pJson) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkIntervalPhysiPlanSlidingUnit
,
pNode
->
slidingUnit
);
code
=
tjsonAddIntegerToObject
(
pJson
,
jkIntervalPhysiPlanSlidingUnit
,
pNode
->
slidingUnit
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkIntervalPhysiPlanFill
,
nodeToJson
,
pNode
->
pFill
);
}
return
code
;
return
code
;
}
}
...
@@ -1429,8 +1481,64 @@ static int32_t jsonToPhysiIntervalNode(const SJson* pJson, void* pObj) {
...
@@ -1429,8 +1481,64 @@ static int32_t jsonToPhysiIntervalNode(const SJson* pJson, void* pObj) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetTinyIntValue
(
pJson
,
jkIntervalPhysiPlanSlidingUnit
,
&
pNode
->
slidingUnit
);
code
=
tjsonGetTinyIntValue
(
pJson
,
jkIntervalPhysiPlanSlidingUnit
,
&
pNode
->
slidingUnit
);
}
}
return
code
;
}
static
const
char
*
jkFillPhysiPlanMode
=
"Mode"
;
static
const
char
*
jkFillPhysiPlanWStartTs
=
"WStartTs"
;
static
const
char
*
jkFillPhysiPlanValues
=
"Values"
;
static
const
char
*
jkFillPhysiPlanTargets
=
"Targets"
;
static
const
char
*
jkFillPhysiPlanStartTime
=
"StartTime"
;
static
const
char
*
jkFillPhysiPlanEndTime
=
"EndTime"
;
static
int32_t
physiFillNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SFillPhysiNode
*
pNode
=
(
const
SFillPhysiNode
*
)
pObj
;
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillPhysiPlanMode
,
pNode
->
mode
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkFillPhysiPlanWStartTs
,
nodeToJson
,
pNode
->
pWStartTs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkFillPhysiPlanValues
,
nodeToJson
,
pNode
->
pValues
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkFillPhysiPlanTargets
,
pNode
->
pTargets
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillPhysiPlanStartTime
,
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkIntervalPhysiPlanFill
,
(
SNode
**
)
&
pNode
->
pFill
);
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillPhysiPlanEndTime
,
pNode
->
timeRange
.
ekey
);
}
return
code
;
}
static
int32_t
jsonToPhysiFillNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SFillPhysiNode
*
pNode
=
(
SFillPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysiWindowNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetNumberValue
(
pJson
,
jkFillPhysiPlanMode
,
pNode
->
mode
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkFillPhysiPlanWStartTs
,
&
pNode
->
pWStartTs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkFillPhysiPlanValues
,
&
pNode
->
pValues
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkFillPhysiPlanTargets
,
&
pNode
->
pTargets
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkFillPhysiPlanStartTime
,
&
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkFillPhysiPlanEndTime
,
&
pNode
->
timeRange
.
ekey
);
}
}
return
code
;
return
code
;
...
@@ -2328,6 +2436,9 @@ static int32_t jsonToNodeListNode(const SJson* pJson, void* pObj) {
...
@@ -2328,6 +2436,9 @@ static int32_t jsonToNodeListNode(const SJson* pJson, void* pObj) {
static
const
char
*
jkFillMode
=
"Mode"
;
static
const
char
*
jkFillMode
=
"Mode"
;
static
const
char
*
jkFillValues
=
"Values"
;
static
const
char
*
jkFillValues
=
"Values"
;
static
const
char
*
jkFillWStartTs
=
"WStartTs"
;
static
const
char
*
jkFillStartTime
=
"StartTime"
;
static
const
char
*
jkFillEndTime
=
"EndTime"
;
static
int32_t
fillNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
static
int32_t
fillNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SFillNode
*
pNode
=
(
const
SFillNode
*
)
pObj
;
const
SFillNode
*
pNode
=
(
const
SFillNode
*
)
pObj
;
...
@@ -2336,6 +2447,15 @@ static int32_t fillNodeToJson(const void* pObj, SJson* pJson) {
...
@@ -2336,6 +2447,15 @@ static int32_t fillNodeToJson(const void* pObj, SJson* pJson) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkFillValues
,
nodeToJson
,
pNode
->
pValues
);
code
=
tjsonAddObject
(
pJson
,
jkFillValues
,
nodeToJson
,
pNode
->
pValues
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkFillWStartTs
,
nodeToJson
,
pNode
->
pWStartTs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillStartTime
,
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkFillEndTime
,
pNode
->
timeRange
.
ekey
);
}
return
code
;
return
code
;
}
}
...
@@ -2347,6 +2467,15 @@ static int32_t jsonToFillNode(const SJson* pJson, void* pObj) {
...
@@ -2347,6 +2467,15 @@ static int32_t jsonToFillNode(const SJson* pJson, void* pObj) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkFillValues
,
&
pNode
->
pValues
);
code
=
jsonToNodeObject
(
pJson
,
jkFillValues
,
&
pNode
->
pValues
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkFillWStartTs
,
&
pNode
->
pWStartTs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkFillStartTime
,
&
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkFillEndTime
,
&
pNode
->
timeRange
.
ekey
);
}
return
code
;
return
code
;
}
}
...
@@ -2707,6 +2836,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
...
@@ -2707,6 +2836,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
return
logicProjectNodeToJson
(
pObj
,
pJson
);
return
logicProjectNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_LOGIC_PLAN_VNODE_MODIF
:
case
QUERY_NODE_LOGIC_PLAN_VNODE_MODIF
:
break
;
break
;
case
QUERY_NODE_LOGIC_PLAN_FILL
:
return
logicFillNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_LOGIC_PLAN_SORT
:
case
QUERY_NODE_LOGIC_PLAN_SORT
:
return
logicSortNodeToJson
(
pObj
,
pJson
);
return
logicSortNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
...
@@ -2735,6 +2866,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
...
@@ -2735,6 +2866,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
return
physiSortNodeToJson
(
pObj
,
pJson
);
return
physiSortNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
return
physiIntervalNodeToJson
(
pObj
,
pJson
);
return
physiIntervalNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_FILL
:
return
physiFillNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
return
physiSessionWindowNodeToJson
(
pObj
,
pJson
);
return
physiSessionWindowNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
...
@@ -2795,6 +2928,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
...
@@ -2795,6 +2928,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
return
jsonToLogicScanNode
(
pJson
,
pObj
);
return
jsonToLogicScanNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_PLAN_PROJECT
:
case
QUERY_NODE_LOGIC_PLAN_PROJECT
:
return
jsonToLogicProjectNode
(
pJson
,
pObj
);
return
jsonToLogicProjectNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_PLAN_FILL
:
return
jsonToLogicFillNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_PLAN_SORT
:
case
QUERY_NODE_LOGIC_PLAN_SORT
:
return
jsonToLogicSortNode
(
pJson
,
pObj
);
return
jsonToLogicSortNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
...
@@ -2821,6 +2956,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
...
@@ -2821,6 +2956,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
return
jsonToPhysiSortNode
(
pJson
,
pObj
);
return
jsonToPhysiSortNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
return
jsonToPhysiIntervalNode
(
pJson
,
pObj
);
return
jsonToPhysiIntervalNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_FILL
:
return
jsonToPhysiFillNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
return
jsonToPhysiSessionWindowNode
(
pJson
,
pObj
);
return
jsonToPhysiSessionWindowNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
...
...
source/libs/nodes/src/nodesTraverseFuncs.c
浏览文件 @
408929ec
...
@@ -132,9 +132,14 @@ static EDealRes dispatchExpr(SNode* pNode, ETraversalOrder order, FNodeWalker wa
...
@@ -132,9 +132,14 @@ static EDealRes dispatchExpr(SNode* pNode, ETraversalOrder order, FNodeWalker wa
case
QUERY_NODE_NODE_LIST
:
case
QUERY_NODE_NODE_LIST
:
res
=
walkExprs
(((
SNodeListNode
*
)
pNode
)
->
pNodeList
,
order
,
walker
,
pContext
);
res
=
walkExprs
(((
SNodeListNode
*
)
pNode
)
->
pNodeList
,
order
,
walker
,
pContext
);
break
;
break
;
case
QUERY_NODE_FILL
:
case
QUERY_NODE_FILL
:
{
res
=
walkExpr
(((
SFillNode
*
)
pNode
)
->
pValues
,
order
,
walker
,
pContext
);
SFillNode
*
pFill
=
(
SFillNode
*
)
pNode
;
res
=
walkExpr
(
pFill
->
pValues
,
order
,
walker
,
pContext
);
if
(
DEAL_RES_ERROR
!=
res
&&
DEAL_RES_END
!=
res
)
{
res
=
walkExpr
(
pFill
->
pWStartTs
,
order
,
walker
,
pContext
);
}
break
;
break
;
}
case
QUERY_NODE_RAW_EXPR
:
case
QUERY_NODE_RAW_EXPR
:
res
=
walkExpr
(((
SRawExprNode
*
)
pNode
)
->
pNode
,
order
,
walker
,
pContext
);
res
=
walkExpr
(((
SRawExprNode
*
)
pNode
)
->
pNode
,
order
,
walker
,
pContext
);
break
;
break
;
...
@@ -272,9 +277,14 @@ static EDealRes rewriteExpr(SNode** pRawNode, ETraversalOrder order, FNodeRewrit
...
@@ -272,9 +277,14 @@ static EDealRes rewriteExpr(SNode** pRawNode, ETraversalOrder order, FNodeRewrit
case
QUERY_NODE_NODE_LIST
:
case
QUERY_NODE_NODE_LIST
:
res
=
rewriteExprs
(((
SNodeListNode
*
)
pNode
)
->
pNodeList
,
order
,
rewriter
,
pContext
);
res
=
rewriteExprs
(((
SNodeListNode
*
)
pNode
)
->
pNodeList
,
order
,
rewriter
,
pContext
);
break
;
break
;
case
QUERY_NODE_FILL
:
case
QUERY_NODE_FILL
:
{
res
=
rewriteExpr
(
&
(((
SFillNode
*
)
pNode
)
->
pValues
),
order
,
rewriter
,
pContext
);
SFillNode
*
pFill
=
(
SFillNode
*
)
pNode
;
res
=
rewriteExpr
(
&
pFill
->
pValues
,
order
,
rewriter
,
pContext
);
if
(
DEAL_RES_ERROR
!=
res
&&
DEAL_RES_END
!=
res
)
{
res
=
rewriteExpr
(
&
(
pFill
->
pWStartTs
),
order
,
rewriter
,
pContext
);
}
break
;
break
;
}
case
QUERY_NODE_RAW_EXPR
:
case
QUERY_NODE_RAW_EXPR
:
res
=
rewriteExpr
(
&
(((
SRawExprNode
*
)
pNode
)
->
pNode
),
order
,
rewriter
,
pContext
);
res
=
rewriteExpr
(
&
(((
SRawExprNode
*
)
pNode
)
->
pNode
),
order
,
rewriter
,
pContext
);
break
;
break
;
...
@@ -333,6 +343,9 @@ void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker wa
...
@@ -333,6 +343,9 @@ void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker wa
case
SQL_CLAUSE_PARTITION_BY
:
case
SQL_CLAUSE_PARTITION_BY
:
nodesWalkExpr
(
pSelect
->
pWindow
,
walker
,
pContext
);
nodesWalkExpr
(
pSelect
->
pWindow
,
walker
,
pContext
);
case
SQL_CLAUSE_WINDOW
:
case
SQL_CLAUSE_WINDOW
:
if
(
NULL
!=
pSelect
->
pWindow
&&
QUERY_NODE_INTERVAL_WINDOW
==
nodeType
(
pSelect
->
pWindow
))
{
nodesWalkExpr
(((
SIntervalWindowNode
*
)
pSelect
->
pWindow
)
->
pFill
,
walker
,
pContext
);
}
nodesWalkExprs
(
pSelect
->
pGroupByList
,
walker
,
pContext
);
nodesWalkExprs
(
pSelect
->
pGroupByList
,
walker
,
pContext
);
case
SQL_CLAUSE_GROUP_BY
:
case
SQL_CLAUSE_GROUP_BY
:
nodesWalkExpr
(
pSelect
->
pHaving
,
walker
,
pContext
);
nodesWalkExpr
(
pSelect
->
pHaving
,
walker
,
pContext
);
...
@@ -362,6 +375,9 @@ void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewrit
...
@@ -362,6 +375,9 @@ void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewrit
case
SQL_CLAUSE_PARTITION_BY
:
case
SQL_CLAUSE_PARTITION_BY
:
nodesRewriteExpr
(
&
(
pSelect
->
pWindow
),
rewriter
,
pContext
);
nodesRewriteExpr
(
&
(
pSelect
->
pWindow
),
rewriter
,
pContext
);
case
SQL_CLAUSE_WINDOW
:
case
SQL_CLAUSE_WINDOW
:
if
(
NULL
!=
pSelect
->
pWindow
&&
QUERY_NODE_INTERVAL_WINDOW
==
nodeType
(
pSelect
->
pWindow
))
{
nodesRewriteExpr
(
&
(((
SIntervalWindowNode
*
)
pSelect
->
pWindow
)
->
pFill
),
rewriter
,
pContext
);
}
nodesRewriteExprs
(
pSelect
->
pGroupByList
,
rewriter
,
pContext
);
nodesRewriteExprs
(
pSelect
->
pGroupByList
,
rewriter
,
pContext
);
case
SQL_CLAUSE_GROUP_BY
:
case
SQL_CLAUSE_GROUP_BY
:
nodesRewriteExpr
(
&
(
pSelect
->
pHaving
),
rewriter
,
pContext
);
nodesRewriteExpr
(
&
(
pSelect
->
pHaving
),
rewriter
,
pContext
);
...
@@ -496,14 +512,9 @@ static EDealRes dispatchPhysiPlan(SNode* pNode, ETraversalOrder order, FNodeWalk
...
@@ -496,14 +512,9 @@ static EDealRes dispatchPhysiPlan(SNode* pNode, ETraversalOrder order, FNodeWalk
}
}
break
;
break
;
}
}
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
{
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
SIntervalPhysiNode
*
pInterval
=
(
SIntervalPhysiNode
*
)
pNode
;
res
=
walkWindowPhysi
((
SWinodwPhysiNode
*
)
pNode
,
order
,
walker
,
pContext
);
res
=
walkWindowPhysi
((
SWinodwPhysiNode
*
)
pNode
,
order
,
walker
,
pContext
);
if
(
DEAL_RES_ERROR
!=
res
&&
DEAL_RES_END
!=
res
)
{
res
=
walkPhysiPlan
((
SNode
*
)
pInterval
->
pFill
,
order
,
walker
,
pContext
);
}
break
;
break
;
}
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
res
=
walkWindowPhysi
((
SWinodwPhysiNode
*
)
pNode
,
order
,
walker
,
pContext
);
res
=
walkWindowPhysi
((
SWinodwPhysiNode
*
)
pNode
,
order
,
walker
,
pContext
);
break
;
break
;
...
...
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
408929ec
...
@@ -213,6 +213,8 @@ SNodeptr nodesMakeNode(ENodeType type) {
...
@@ -213,6 +213,8 @@ SNodeptr nodesMakeNode(ENodeType type) {
return
makeNode
(
type
,
sizeof
(
SExchangeLogicNode
));
return
makeNode
(
type
,
sizeof
(
SExchangeLogicNode
));
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
return
makeNode
(
type
,
sizeof
(
SWindowLogicNode
));
return
makeNode
(
type
,
sizeof
(
SWindowLogicNode
));
case
QUERY_NODE_LOGIC_PLAN_FILL
:
return
makeNode
(
type
,
sizeof
(
SFillLogicNode
));
case
QUERY_NODE_LOGIC_PLAN_SORT
:
case
QUERY_NODE_LOGIC_PLAN_SORT
:
return
makeNode
(
type
,
sizeof
(
SSortLogicNode
));
return
makeNode
(
type
,
sizeof
(
SSortLogicNode
));
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
...
@@ -243,6 +245,8 @@ SNodeptr nodesMakeNode(ENodeType type) {
...
@@ -243,6 +245,8 @@ SNodeptr nodesMakeNode(ENodeType type) {
return
makeNode
(
type
,
sizeof
(
SSortPhysiNode
));
return
makeNode
(
type
,
sizeof
(
SSortPhysiNode
));
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
return
makeNode
(
type
,
sizeof
(
SIntervalPhysiNode
));
return
makeNode
(
type
,
sizeof
(
SIntervalPhysiNode
));
case
QUERY_NODE_PHYSICAL_PLAN_FILL
:
return
makeNode
(
type
,
sizeof
(
SFillPhysiNode
));
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
return
makeNode
(
type
,
sizeof
(
SSessionWinodwPhysiNode
));
return
makeNode
(
type
,
sizeof
(
SSessionWinodwPhysiNode
));
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
...
@@ -373,9 +377,12 @@ void nodesDestroyNode(SNodeptr pNode) {
...
@@ -373,9 +377,12 @@ void nodesDestroyNode(SNodeptr pNode) {
case
QUERY_NODE_NODE_LIST
:
case
QUERY_NODE_NODE_LIST
:
nodesDestroyList
(((
SNodeListNode
*
)
pNode
)
->
pNodeList
);
nodesDestroyList
(((
SNodeListNode
*
)
pNode
)
->
pNodeList
);
break
;
break
;
case
QUERY_NODE_FILL
:
case
QUERY_NODE_FILL
:
{
nodesDestroyNode
(((
SFillNode
*
)
pNode
)
->
pValues
);
SFillNode
*
pFill
=
(
SFillNode
*
)
pNode
;
nodesDestroyNode
(
pFill
->
pValues
);
nodesDestroyNode
(
pFill
->
pWStartTs
);
break
;
break
;
}
case
QUERY_NODE_RAW_EXPR
:
case
QUERY_NODE_RAW_EXPR
:
nodesDestroyNode
(((
SRawExprNode
*
)
pNode
)
->
pNode
);
nodesDestroyNode
(((
SRawExprNode
*
)
pNode
)
->
pNode
);
break
;
break
;
...
@@ -554,7 +561,6 @@ void nodesDestroyNode(SNodeptr pNode) {
...
@@ -554,7 +561,6 @@ void nodesDestroyNode(SNodeptr pNode) {
SWindowLogicNode
*
pLogicNode
=
(
SWindowLogicNode
*
)
pNode
;
SWindowLogicNode
*
pLogicNode
=
(
SWindowLogicNode
*
)
pNode
;
destroyLogicNode
((
SLogicNode
*
)
pLogicNode
);
destroyLogicNode
((
SLogicNode
*
)
pLogicNode
);
nodesDestroyList
(
pLogicNode
->
pFuncs
);
nodesDestroyList
(
pLogicNode
->
pFuncs
);
nodesDestroyNode
(
pLogicNode
->
pFill
);
nodesDestroyNode
(
pLogicNode
->
pTspk
);
nodesDestroyNode
(
pLogicNode
->
pTspk
);
break
;
break
;
}
}
...
@@ -630,12 +636,9 @@ void nodesDestroyNode(SNodeptr pNode) {
...
@@ -630,12 +636,9 @@ void nodesDestroyNode(SNodeptr pNode) {
nodesDestroyNode
(
pPhyNode
->
pSortKeys
);
nodesDestroyNode
(
pPhyNode
->
pSortKeys
);
break
;
break
;
}
}
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
{
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
SIntervalPhysiNode
*
pPhyNode
=
(
SIntervalPhysiNode
*
)
pNode
;
destroyWinodwPhysiNode
((
SWinodwPhysiNode
*
)
pNode
);
destroyWinodwPhysiNode
((
SWinodwPhysiNode
*
)
pPhyNode
);
nodesDestroyNode
(
pPhyNode
->
pFill
);
break
;
break
;
}
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
destroyWinodwPhysiNode
((
SWinodwPhysiNode
*
)
pNode
);
destroyWinodwPhysiNode
((
SWinodwPhysiNode
*
)
pNode
);
break
;
break
;
...
@@ -894,7 +897,7 @@ void* nodesGetValueFromNode(SValueNode* pNode) {
...
@@ -894,7 +897,7 @@ void* nodesGetValueFromNode(SValueNode* pNode) {
return
NULL
;
return
NULL
;
}
}
int32_t
nodesSetValueNodeValue
(
SValueNode
*
pNode
,
void
*
value
)
{
int32_t
nodesSetValueNodeValue
(
SValueNode
*
pNode
,
void
*
value
)
{
switch
(
pNode
->
node
.
resType
.
type
)
{
switch
(
pNode
->
node
.
resType
.
type
)
{
case
TSDB_DATA_TYPE_BOOL
:
case
TSDB_DATA_TYPE_BOOL
:
pNode
->
datum
.
b
=
*
(
bool
*
)
value
;
pNode
->
datum
.
b
=
*
(
bool
*
)
value
;
...
@@ -1192,7 +1195,7 @@ static EDealRes collectFuncs(SNode* pNode, void* pContext) {
...
@@ -1192,7 +1195,7 @@ static EDealRes collectFuncs(SNode* pNode, void* pContext) {
return
DEAL_RES_CONTINUE
;
return
DEAL_RES_CONTINUE
;
}
}
int32_t
nodesCollectFuncs
(
SSelectStmt
*
pSelect
,
FFuncClassifier
classifier
,
SNodeList
**
pFuncs
)
{
int32_t
nodesCollectFuncs
(
SSelectStmt
*
pSelect
,
ESqlClause
clause
,
FFuncClassifier
classifier
,
SNodeList
**
pFuncs
)
{
if
(
NULL
==
pSelect
||
NULL
==
pFuncs
)
{
if
(
NULL
==
pSelect
||
NULL
==
pFuncs
)
{
return
TSDB_CODE_FAILED
;
return
TSDB_CODE_FAILED
;
}
}
...
@@ -1203,7 +1206,7 @@ int32_t nodesCollectFuncs(SSelectStmt* pSelect, FFuncClassifier classifier, SNod
...
@@ -1203,7 +1206,7 @@ int32_t nodesCollectFuncs(SSelectStmt* pSelect, FFuncClassifier classifier, SNod
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
*
pFuncs
=
NULL
;
*
pFuncs
=
NULL
;
nodesWalkSelectStmt
(
pSelect
,
SQL_CLAUSE_GROUP_BY
,
collectFuncs
,
&
cxt
);
nodesWalkSelectStmt
(
pSelect
,
clause
,
collectFuncs
,
&
cxt
);
if
(
TSDB_CODE_SUCCESS
!=
cxt
.
errCode
)
{
if
(
TSDB_CODE_SUCCESS
!=
cxt
.
errCode
)
{
nodesDestroyList
(
cxt
.
pFuncs
);
nodesDestroyList
(
cxt
.
pFuncs
);
return
cxt
.
errCode
;
return
cxt
.
errCode
;
...
...
source/libs/parser/src/parAstCreater.c
浏览文件 @
408929ec
...
@@ -501,6 +501,12 @@ SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) {
...
@@ -501,6 +501,12 @@ SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) {
CHECK_OUT_OF_MEM
(
fill
);
CHECK_OUT_OF_MEM
(
fill
);
fill
->
mode
=
mode
;
fill
->
mode
=
mode
;
fill
->
pValues
=
pValues
;
fill
->
pValues
=
pValues
;
fill
->
pWStartTs
=
nodesMakeNode
(
QUERY_NODE_FUNCTION
);
if
(
NULL
==
fill
->
pWStartTs
)
{
nodesDestroyNode
(
fill
);
CHECK_OUT_OF_MEM
(
fill
->
pWStartTs
);
}
strcpy
(((
SFunctionNode
*
)
fill
->
pWStartTs
)
->
functionName
,
"_wstartts"
);
return
(
SNode
*
)
fill
;
return
(
SNode
*
)
fill
;
}
}
...
...
source/libs/parser/src/parTokenizer.c
浏览文件 @
408929ec
...
@@ -26,6 +26,7 @@ typedef struct SKeyword {
...
@@ -26,6 +26,7 @@ typedef struct SKeyword {
uint8_t
len
;
// length
uint8_t
len
;
// length
}
SKeyword
;
}
SKeyword
;
// clang-format off
// keywords in sql string
// keywords in sql string
static
SKeyword
keywordTable
[]
=
{
static
SKeyword
keywordTable
[]
=
{
{
"ACCOUNT"
,
TK_ACCOUNT
},
{
"ACCOUNT"
,
TK_ACCOUNT
},
...
@@ -43,7 +44,6 @@ static SKeyword keywordTable[] = {
...
@@ -43,7 +44,6 @@ static SKeyword keywordTable[] = {
{
"BETWEEN"
,
TK_BETWEEN
},
{
"BETWEEN"
,
TK_BETWEEN
},
{
"BINARY"
,
TK_BINARY
},
{
"BINARY"
,
TK_BINARY
},
{
"BIGINT"
,
TK_BIGINT
},
{
"BIGINT"
,
TK_BIGINT
},
// {"BLOCKS", TK_BLOCKS},
{
"BNODE"
,
TK_BNODE
},
{
"BNODE"
,
TK_BNODE
},
{
"BNODES"
,
TK_BNODES
},
{
"BNODES"
,
TK_BNODES
},
{
"BOOL"
,
TK_BOOL
},
{
"BOOL"
,
TK_BOOL
},
...
@@ -120,6 +120,7 @@ static SKeyword keywordTable[] = {
...
@@ -120,6 +120,7 @@ static SKeyword keywordTable[] = {
{
"MODIFY"
,
TK_MODIFY
},
{
"MODIFY"
,
TK_MODIFY
},
{
"MODULES"
,
TK_MODULES
},
{
"MODULES"
,
TK_MODULES
},
{
"NCHAR"
,
TK_NCHAR
},
{
"NCHAR"
,
TK_NCHAR
},
{
"NEXT"
,
TK_NEXT
},
{
"NMATCH"
,
TK_NMATCH
},
{
"NMATCH"
,
TK_NMATCH
},
{
"NONE"
,
TK_NONE
},
{
"NONE"
,
TK_NONE
},
{
"NOT"
,
TK_NOT
},
{
"NOT"
,
TK_NOT
},
...
@@ -145,7 +146,6 @@ static SKeyword keywordTable[] = {
...
@@ -145,7 +146,6 @@ static SKeyword keywordTable[] = {
{
"QTIME"
,
TK_QTIME
},
{
"QTIME"
,
TK_QTIME
},
{
"QUERIES"
,
TK_QUERIES
},
{
"QUERIES"
,
TK_QUERIES
},
{
"QUERY"
,
TK_QUERY
},
{
"QUERY"
,
TK_QUERY
},
// {"QUORUM", TK_QUORUM},
{
"RATIO"
,
TK_RATIO
},
{
"RATIO"
,
TK_RATIO
},
{
"REPLICA"
,
TK_REPLICA
},
{
"REPLICA"
,
TK_REPLICA
},
{
"RESET"
,
TK_RESET
},
{
"RESET"
,
TK_RESET
},
...
@@ -172,7 +172,6 @@ static SKeyword keywordTable[] = {
...
@@ -172,7 +172,6 @@ static SKeyword keywordTable[] = {
{
"STORAGE"
,
TK_STORAGE
},
{
"STORAGE"
,
TK_STORAGE
},
{
"STREAM"
,
TK_STREAM
},
{
"STREAM"
,
TK_STREAM
},
{
"STREAMS"
,
TK_STREAMS
},
{
"STREAMS"
,
TK_STREAMS
},
// {"STREAM_MODE", TK_STREAM_MODE},
{
"STRICT"
,
TK_STRICT
},
{
"STRICT"
,
TK_STRICT
},
{
"SYNCDB"
,
TK_SYNCDB
},
{
"SYNCDB"
,
TK_SYNCDB
},
{
"TABLE"
,
TK_TABLE
},
{
"TABLE"
,
TK_TABLE
},
...
@@ -279,6 +278,7 @@ static SKeyword keywordTable[] = {
...
@@ -279,6 +278,7 @@ static SKeyword keywordTable[] = {
// {"PARTITIONS", TK_PARTITIONS},
// {"PARTITIONS", TK_PARTITIONS},
// {"MODE", TK_MODE},
// {"MODE", TK_MODE},
};
};
// clang-format on
static
const
char
isIdChar
[]
=
{
static
const
char
isIdChar
[]
=
{
/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
408929ec
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
#include "catalog.h"
#include "catalog.h"
#include "cmdnodes.h"
#include "cmdnodes.h"
#include "filter.h"
#include "functionMgt.h"
#include "functionMgt.h"
#include "parUtil.h"
#include "parUtil.h"
#include "scalar.h"
#include "scalar.h"
...
@@ -468,19 +469,19 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
...
@@ -468,19 +469,19 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
pVal
->
datum
.
b
=
(
0
==
strcasecmp
(
pVal
->
literal
,
"true"
));
pVal
->
datum
.
b
=
(
0
==
strcasecmp
(
pVal
->
literal
,
"true"
));
*
(
bool
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
b
;
*
(
bool
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
b
;
break
;
break
;
case
TSDB_DATA_TYPE_TINYINT
:{
case
TSDB_DATA_TYPE_TINYINT
:
{
char
*
endPtr
=
NULL
;
char
*
endPtr
=
NULL
;
pVal
->
datum
.
i
=
strtoll
(
pVal
->
literal
,
&
endPtr
,
10
);
pVal
->
datum
.
i
=
strtoll
(
pVal
->
literal
,
&
endPtr
,
10
);
*
(
int8_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
*
(
int8_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_SMALLINT
:{
case
TSDB_DATA_TYPE_SMALLINT
:
{
char
*
endPtr
=
NULL
;
char
*
endPtr
=
NULL
;
pVal
->
datum
.
i
=
strtoll
(
pVal
->
literal
,
&
endPtr
,
10
);
pVal
->
datum
.
i
=
strtoll
(
pVal
->
literal
,
&
endPtr
,
10
);
*
(
int16_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
*
(
int16_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_INT
:{
case
TSDB_DATA_TYPE_INT
:
{
char
*
endPtr
=
NULL
;
char
*
endPtr
=
NULL
;
pVal
->
datum
.
i
=
strtoll
(
pVal
->
literal
,
&
endPtr
,
10
);
pVal
->
datum
.
i
=
strtoll
(
pVal
->
literal
,
&
endPtr
,
10
);
*
(
int32_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
*
(
int32_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
...
@@ -492,19 +493,19 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
...
@@ -492,19 +493,19 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
*
(
int64_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
*
(
int64_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
i
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_UTINYINT
:{
case
TSDB_DATA_TYPE_UTINYINT
:
{
char
*
endPtr
=
NULL
;
char
*
endPtr
=
NULL
;
pVal
->
datum
.
u
=
strtoull
(
pVal
->
literal
,
&
endPtr
,
10
);
pVal
->
datum
.
u
=
strtoull
(
pVal
->
literal
,
&
endPtr
,
10
);
*
(
uint8_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
*
(
uint8_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_USMALLINT
:{
case
TSDB_DATA_TYPE_USMALLINT
:
{
char
*
endPtr
=
NULL
;
char
*
endPtr
=
NULL
;
pVal
->
datum
.
u
=
strtoull
(
pVal
->
literal
,
&
endPtr
,
10
);
pVal
->
datum
.
u
=
strtoull
(
pVal
->
literal
,
&
endPtr
,
10
);
*
(
uint16_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
*
(
uint16_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_UINT
:{
case
TSDB_DATA_TYPE_UINT
:
{
char
*
endPtr
=
NULL
;
char
*
endPtr
=
NULL
;
pVal
->
datum
.
u
=
strtoull
(
pVal
->
literal
,
&
endPtr
,
10
);
pVal
->
datum
.
u
=
strtoull
(
pVal
->
literal
,
&
endPtr
,
10
);
*
(
uint32_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
*
(
uint32_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
...
@@ -516,7 +517,7 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
...
@@ -516,7 +517,7 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
*
(
uint64_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
*
(
uint64_t
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
u
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_FLOAT
:{
case
TSDB_DATA_TYPE_FLOAT
:
{
char
*
endPtr
=
NULL
;
char
*
endPtr
=
NULL
;
pVal
->
datum
.
d
=
strtold
(
pVal
->
literal
,
&
endPtr
);
pVal
->
datum
.
d
=
strtold
(
pVal
->
literal
,
&
endPtr
);
*
(
float
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
d
;
*
(
float
*
)
&
pVal
->
typeData
=
pVal
->
datum
.
d
;
...
@@ -1244,6 +1245,113 @@ static int32_t translateGroupBy(STranslateContext* pCxt, SSelectStmt* pSelect) {
...
@@ -1244,6 +1245,113 @@ static int32_t translateGroupBy(STranslateContext* pCxt, SSelectStmt* pSelect) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
EDealRes
isPrimaryKeyCondImpl
(
SNode
*
pNode
,
void
*
pContext
)
{
if
(
QUERY_NODE_COLUMN
==
nodeType
(
pNode
))
{
*
((
bool
*
)
pContext
)
=
((
PRIMARYKEY_TIMESTAMP_COL_ID
==
((
SColumnNode
*
)
pNode
)
->
colId
)
?
true
:
false
);
return
*
((
bool
*
)
pContext
)
?
DEAL_RES_CONTINUE
:
DEAL_RES_END
;
}
return
DEAL_RES_CONTINUE
;
}
static
bool
isPrimaryKeyCond
(
SNode
*
pNode
)
{
bool
isPrimaryKeyCond
=
false
;
nodesWalkExpr
(
pNode
,
isPrimaryKeyCondImpl
,
&
isPrimaryKeyCond
);
return
isPrimaryKeyCond
;
}
static
int32_t
getTimeRangeFromLogicCond
(
STranslateContext
*
pCxt
,
SLogicConditionNode
*
pLogicCond
,
STimeWindow
*
pTimeRange
)
{
SNodeList
*
pPrimaryKeyConds
=
NULL
;
SNode
*
pCond
=
NULL
;
FOREACH
(
pCond
,
pLogicCond
->
pParameterList
)
{
if
(
isPrimaryKeyCond
(
pCond
))
{
if
(
TSDB_CODE_SUCCESS
!=
nodesListMakeAppend
(
&
pPrimaryKeyConds
,
pCond
))
{
nodesClearList
(
pPrimaryKeyConds
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
}
if
(
NULL
==
pPrimaryKeyConds
)
{
*
pTimeRange
=
TSWINDOW_INITIALIZER
;
return
TSDB_CODE_SUCCESS
;
}
SLogicConditionNode
*
pPrimaryKeyLogicCond
=
nodesMakeNode
(
QUERY_NODE_LOGIC_CONDITION
);
if
(
NULL
==
pPrimaryKeyLogicCond
)
{
nodesClearList
(
pPrimaryKeyConds
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pPrimaryKeyLogicCond
->
condType
=
LOGIC_COND_TYPE_AND
;
pPrimaryKeyLogicCond
->
pParameterList
=
pPrimaryKeyConds
;
bool
isStrict
=
false
;
int32_t
code
=
filterGetTimeRange
((
SNode
*
)
pPrimaryKeyLogicCond
,
pTimeRange
,
&
isStrict
);
nodesClearList
(
pPrimaryKeyConds
);
pPrimaryKeyLogicCond
->
pParameterList
=
NULL
;
nodesDestroyNode
(
pPrimaryKeyLogicCond
);
return
code
;
}
static
int32_t
getTimeRange
(
STranslateContext
*
pCxt
,
SNode
*
pWhere
,
STimeWindow
*
pTimeRange
)
{
if
(
NULL
==
pWhere
)
{
*
pTimeRange
=
TSWINDOW_INITIALIZER
;
return
TSDB_CODE_SUCCESS
;
}
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pWhere
)
&&
LOGIC_COND_TYPE_AND
==
((
SLogicConditionNode
*
)
pWhere
)
->
condType
)
{
return
getTimeRangeFromLogicCond
(
pCxt
,
(
SLogicConditionNode
*
)
pWhere
,
pTimeRange
);
}
if
(
isPrimaryKeyCond
(
pWhere
))
{
bool
isStrict
=
false
;
return
filterGetTimeRange
(
pWhere
,
pTimeRange
,
&
isStrict
);
}
else
{
*
pTimeRange
=
TSWINDOW_INITIALIZER
;
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
checkFill
(
STranslateContext
*
pCxt
,
SIntervalWindowNode
*
pInterval
)
{
SFillNode
*
pFill
=
(
SFillNode
*
)
pInterval
->
pFill
;
if
(
TSWINDOW_IS_EQUAL
(
pFill
->
timeRange
,
TSWINDOW_INITIALIZER
)
||
TSWINDOW_IS_EQUAL
(
pFill
->
timeRange
,
TSWINDOW_DESC_INITIALIZER
))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE
);
}
int64_t
timeRange
=
TABS
(
pFill
->
timeRange
.
skey
-
pFill
->
timeRange
.
ekey
);
int64_t
intervalRange
=
0
;
SValueNode
*
pInter
=
(
SValueNode
*
)
pInterval
->
pInterval
;
if
(
TIME_IS_VAR_DURATION
(
pInter
->
unit
))
{
int64_t
f
=
1
;
if
(
pInter
->
unit
==
'n'
)
{
f
=
30L
*
MILLISECOND_PER_DAY
;
}
else
if
(
pInter
->
unit
==
'y'
)
{
f
=
365L
*
MILLISECOND_PER_DAY
;
}
intervalRange
=
pInter
->
datum
.
i
*
f
;
}
else
{
intervalRange
=
pInter
->
datum
.
i
;
}
if
((
timeRange
==
0
)
||
(
timeRange
/
intervalRange
)
>=
MAX_INTERVAL_TIME_WINDOW
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE
);
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
translateFill
(
STranslateContext
*
pCxt
,
SNode
*
pWhere
,
SIntervalWindowNode
*
pInterval
)
{
if
(
NULL
==
pInterval
->
pFill
)
{
return
TSDB_CODE_SUCCESS
;
}
int32_t
code
=
getTimeRange
(
pCxt
,
pWhere
,
&
(((
SFillNode
*
)
pInterval
->
pFill
)
->
timeRange
));
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkFill
(
pCxt
,
pInterval
);
}
return
code
;
}
static
int64_t
getMonthsFromTimeVal
(
int64_t
val
,
int32_t
fromPrecision
,
char
unit
)
{
static
int64_t
getMonthsFromTimeVal
(
int64_t
val
,
int32_t
fromPrecision
,
char
unit
)
{
int64_t
days
=
convertTimeFromPrecisionToUnit
(
val
,
fromPrecision
,
'd'
);
int64_t
days
=
convertTimeFromPrecisionToUnit
(
val
,
fromPrecision
,
'd'
);
switch
(
unit
)
{
switch
(
unit
)
{
...
@@ -1266,7 +1374,7 @@ static int64_t getMonthsFromTimeVal(int64_t val, int32_t fromPrecision, char uni
...
@@ -1266,7 +1374,7 @@ static int64_t getMonthsFromTimeVal(int64_t val, int32_t fromPrecision, char uni
return
-
1
;
return
-
1
;
}
}
static
int32_t
checkIntervalWindow
(
STranslateContext
*
pCxt
,
SIntervalWindowNode
*
pInterval
)
{
static
int32_t
checkIntervalWindow
(
STranslateContext
*
pCxt
,
S
Node
*
pWhere
,
S
IntervalWindowNode
*
pInterval
)
{
uint8_t
precision
=
((
SColumnNode
*
)
pInterval
->
pCol
)
->
node
.
resType
.
precision
;
uint8_t
precision
=
((
SColumnNode
*
)
pInterval
->
pCol
)
->
node
.
resType
.
precision
;
SValueNode
*
pInter
=
(
SValueNode
*
)
pInterval
->
pInterval
;
SValueNode
*
pInter
=
(
SValueNode
*
)
pInterval
->
pInterval
;
...
@@ -1308,7 +1416,7 @@ static int32_t checkIntervalWindow(STranslateContext* pCxt, SIntervalWindowNode*
...
@@ -1308,7 +1416,7 @@ static int32_t checkIntervalWindow(STranslateContext* pCxt, SIntervalWindowNode*
}
}
}
}
return
TSDB_CODE_SUCCESS
;
return
translateFill
(
pCxt
,
pWhere
,
pInterval
)
;
}
}
static
EDealRes
checkStateExpr
(
SNode
*
pNode
,
void
*
pContext
)
{
static
EDealRes
checkStateExpr
(
SNode
*
pNode
,
void
*
pContext
)
{
...
@@ -1345,28 +1453,28 @@ static int32_t checkSessionWindow(STranslateContext* pCxt, SSessionWindowNode* p
...
@@ -1345,28 +1453,28 @@ static int32_t checkSessionWindow(STranslateContext* pCxt, SSessionWindowNode* p
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
checkWindow
(
STranslateContext
*
pCxt
,
S
Node
*
pWindow
)
{
static
int32_t
checkWindow
(
STranslateContext
*
pCxt
,
S
SelectStmt
*
pSelect
)
{
switch
(
nodeType
(
pWindow
))
{
switch
(
nodeType
(
p
Select
->
p
Window
))
{
case
QUERY_NODE_STATE_WINDOW
:
case
QUERY_NODE_STATE_WINDOW
:
return
checkStateWindow
(
pCxt
,
(
SStateWindowNode
*
)
pWindow
);
return
checkStateWindow
(
pCxt
,
(
SStateWindowNode
*
)
p
Select
->
p
Window
);
case
QUERY_NODE_SESSION_WINDOW
:
case
QUERY_NODE_SESSION_WINDOW
:
return
checkSessionWindow
(
pCxt
,
(
SSessionWindowNode
*
)
pWindow
);
return
checkSessionWindow
(
pCxt
,
(
SSessionWindowNode
*
)
p
Select
->
p
Window
);
case
QUERY_NODE_INTERVAL_WINDOW
:
case
QUERY_NODE_INTERVAL_WINDOW
:
return
checkIntervalWindow
(
pCxt
,
(
SIntervalWindowNode
*
)
pWindow
);
return
checkIntervalWindow
(
pCxt
,
pSelect
->
pWhere
,
(
SIntervalWindowNode
*
)
pSelect
->
pWindow
);
default:
default:
break
;
break
;
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
translateWindow
(
STranslateContext
*
pCxt
,
S
Node
*
pWindow
)
{
static
int32_t
translateWindow
(
STranslateContext
*
pCxt
,
S
SelectStmt
*
pSelect
)
{
if
(
NULL
==
pWindow
)
{
if
(
NULL
==
p
Select
->
p
Window
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
pCxt
->
currClause
=
SQL_CLAUSE_WINDOW
;
pCxt
->
currClause
=
SQL_CLAUSE_WINDOW
;
int32_t
code
=
translateExpr
(
pCxt
,
pWindow
);
int32_t
code
=
translateExpr
(
pCxt
,
p
Select
->
p
Window
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkWindow
(
pCxt
,
p
Window
);
code
=
checkWindow
(
pCxt
,
p
Select
);
}
}
return
code
;
return
code
;
}
}
...
@@ -1485,7 +1593,7 @@ static int32_t translateSelect(STranslateContext* pCxt, SSelectStmt* pSelect) {
...
@@ -1485,7 +1593,7 @@ static int32_t translateSelect(STranslateContext* pCxt, SSelectStmt* pSelect) {
code
=
translatePartitionBy
(
pCxt
,
pSelect
->
pPartitionByList
);
code
=
translatePartitionBy
(
pCxt
,
pSelect
->
pPartitionByList
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
translateWindow
(
pCxt
,
pSelect
->
pWindow
);
code
=
translateWindow
(
pCxt
,
pSelect
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
translateGroupBy
(
pCxt
,
pSelect
);
code
=
translateGroupBy
(
pCxt
,
pSelect
);
...
...
source/libs/parser/src/parUtil.c
浏览文件 @
408929ec
...
@@ -128,6 +128,8 @@ static char* getSyntaxErrFormat(int32_t errCode) {
...
@@ -128,6 +128,8 @@ static char* getSyntaxErrFormat(int32_t errCode) {
return
"Invalid topic query"
;
return
"Invalid topic query"
;
case
TSDB_CODE_PAR_INVALID_DROP_STABLE
:
case
TSDB_CODE_PAR_INVALID_DROP_STABLE
:
return
"Cannot drop super table in batch"
;
return
"Cannot drop super table in batch"
;
case
TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE
:
return
"start(end) time of query range required or time range too large"
;
case
TSDB_CODE_OUT_OF_MEMORY
:
case
TSDB_CODE_OUT_OF_MEMORY
:
return
"Out of memory"
;
return
"Out of memory"
;
default:
default:
...
@@ -140,7 +142,6 @@ int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...) {
...
@@ -140,7 +142,6 @@ int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...) {
va_start
(
vArgList
,
errCode
);
va_start
(
vArgList
,
errCode
);
vsnprintf
(
pBuf
->
buf
,
pBuf
->
len
,
getSyntaxErrFormat
(
errCode
),
vArgList
);
vsnprintf
(
pBuf
->
buf
,
pBuf
->
len
,
getSyntaxErrFormat
(
errCode
),
vArgList
);
va_end
(
vArgList
);
va_end
(
vArgList
);
terrno
=
errCode
;
return
errCode
;
return
errCode
;
}
}
...
...
source/libs/parser/test/parSelectTest.cpp
浏览文件 @
408929ec
...
@@ -24,170 +24,180 @@ class ParserSelectTest : public ParserTestBase {};
...
@@ -24,170 +24,180 @@ class ParserSelectTest : public ParserTestBase {};
TEST_F
(
ParserSelectTest
,
basic
)
{
TEST_F
(
ParserSelectTest
,
basic
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select * from
t1"
);
run
(
"
SELECT * FROM
t1"
);
run
(
"
select * from
test.t1"
);
run
(
"
SELECT * FROM
test.t1"
);
run
(
"
select ts, c1 from
t1"
);
run
(
"
SELECT ts, c1 FROM
t1"
);
run
(
"
select ts, t.c1 from (select * from
t1) t"
);
run
(
"
SELECT ts, t.c1 FROM (SELECT * FROM
t1) t"
);
run
(
"
select * from t1 tt1, t1 tt2 where
tt1.c1 = tt2.c1"
);
run
(
"
SELECT * FROM t1 tt1, t1 tt2 WHERE
tt1.c1 = tt2.c1"
);
}
}
TEST_F
(
ParserSelectTest
,
constant
)
{
TEST_F
(
ParserSelectTest
,
constant
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select 123, 20.4, 'abc',
\"
wxy
\"
, timestamp '2022-02-09 17:30:20', true, false, 10s from
t1"
);
run
(
"
SELECT 123, 20.4, 'abc',
\"
wxy
\"
, timestamp '2022-02-09 17:30:20', true, false, 10s FROM
t1"
);
run
(
"
select
1234567890123456789012345678901234567890, 20.1234567890123456789012345678901234567890, 'abc',
\"
wxy
\"
, "
run
(
"
SELECT
1234567890123456789012345678901234567890, 20.1234567890123456789012345678901234567890, 'abc',
\"
wxy
\"
, "
"timestamp '2022-02-09 17:30:20', true, false, 15s
from
t1"
);
"timestamp '2022-02-09 17:30:20', true, false, 15s
FROM
t1"
);
run
(
"
select 123 + 45 from t1 where
2 - 1"
);
run
(
"
SELECT 123 + 45 FROM t1 WHERE
2 - 1"
);
}
}
TEST_F
(
ParserSelectTest
,
expression
)
{
TEST_F
(
ParserSelectTest
,
expression
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select ts + 10s, c1 + 10, concat(c2, 'abc') from
t1"
);
run
(
"
SELECT ts + 10s, c1 + 10, concat(c2, 'abc') FROM
t1"
);
run
(
"
select ts > 0, c1 < 20 and c2 = 'qaz' from
t1"
);
run
(
"
SELECT ts > 0, c1 < 20 and c2 = 'qaz' FROM
t1"
);
run
(
"
select ts > 0, c1 between 10 and 20 and c2 = 'qaz' from
t1"
);
run
(
"
SELECT ts > 0, c1 between 10 and 20 and c2 = 'qaz' FROM
t1"
);
}
}
TEST_F
(
ParserSelectTest
,
condition
)
{
TEST_F
(
ParserSelectTest
,
condition
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select c1 from t1 where
ts in (true, false)"
);
run
(
"
SELECT c1 FROM t1 WHERE
ts in (true, false)"
);
run
(
"
select * from t1 where
c1 > 10 and c1 is not null"
);
run
(
"
SELECT * FROM t1 WHERE
c1 > 10 and c1 is not null"
);
}
}
TEST_F
(
ParserSelectTest
,
pseudoColumn
)
{
TEST_F
(
ParserSelectTest
,
pseudoColumn
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select _wstartts, _wendts, count(*) from t1 interval
(10s)"
);
run
(
"
SELECT _wstartts, _wendts, COUNT(*) FROM t1 INTERVAL
(10s)"
);
}
}
TEST_F
(
ParserSelectTest
,
multiResFunc
)
{
TEST_F
(
ParserSelectTest
,
multiResFunc
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select last(*), first(*), last_row(*) from
t1"
);
run
(
"
SELECT last(*), first(*), last_row(*) FROM
t1"
);
run
(
"
select last(c1, c2), first(t1.*), last_row(c3) from
t1"
);
run
(
"
SELECT last(c1, c2), first(t1.*), last_row(c3) FROM
t1"
);
run
(
"
select last(t2.*), first(t1.c1, t2.*), last_row(t1.*, t2.*) from st1s1 t1, st1s2 t2 where
t1.ts = t2.ts"
);
run
(
"
SELECT last(t2.*), first(t1.c1, t2.*), last_row(t1.*, t2.*) FROM st1s1 t1, st1s2 t2 WHERE
t1.ts = t2.ts"
);
}
}
TEST_F
(
ParserSelectTest
,
timelineFunc
)
{
TEST_F
(
ParserSelectTest
,
timelineFunc
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select last(*), first(*) from
t1"
);
run
(
"
SELECT last(*), first(*) FROM
t1"
);
run
(
"
select last(*), first(*) from
t1 group by c1"
);
run
(
"
SELECT last(*), first(*) FROM
t1 group by c1"
);
run
(
"
select last(*), first(*) from t1 interval
(10s)"
);
run
(
"
SELECT last(*), first(*) FROM t1 INTERVAL
(10s)"
);
run
(
"
select diff(c1) from
t1"
);
run
(
"
SELECT diff(c1) FROM
t1"
);
}
}
TEST_F
(
ParserSelectTest
,
clause
)
{
TEST_F
(
ParserSelectTest
,
clause
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
// group by clause
// group by clause
run
(
"
select count(*) cnt from t1 where
c1 > 0"
);
run
(
"
SELECT COUNT(*) cnt FROM t1 WHERE
c1 > 0"
);
run
(
"
select count(*), c2 cnt from t1 where
c1 > 0 group by c2"
);
run
(
"
SELECT COUNT(*), c2 cnt FROM t1 WHERE
c1 > 0 group by c2"
);
run
(
"
select count(*) cnt from t1 where c1 > 0 group by c2 having count
(c1) > 10"
);
run
(
"
SELECT COUNT(*) cnt FROM t1 WHERE c1 > 0 group by c2 having COUNT
(c1) > 10"
);
run
(
"
select count(*), c1, c2 + 10, c1 + c2 cnt from t1 where
c1 > 0 group by c2, c1"
);
run
(
"
SELECT COUNT(*), c1, c2 + 10, c1 + c2 cnt FROM t1 WHERE
c1 > 0 group by c2, c1"
);
run
(
"
select count(*), c1 + 10, c2 cnt from t1 where
c1 > 0 group by c1 + 10, c2"
);
run
(
"
SELECT COUNT(*), c1 + 10, c2 cnt FROM t1 WHERE
c1 > 0 group by c1 + 10, c2"
);
// order by clause
// order by clause
run
(
"
select count(*) cnt from t1 where
c1 > 0 group by c2 order by cnt"
);
run
(
"
SELECT COUNT(*) cnt FROM t1 WHERE
c1 > 0 group by c2 order by cnt"
);
run
(
"
select count(*) cnt from t1 where
c1 > 0 group by c2 order by 1"
);
run
(
"
SELECT COUNT(*) cnt FROM t1 WHERE
c1 > 0 group by c2 order by 1"
);
// distinct clause
// distinct clause
// run("
select distinct c1, c2 from t1 where
c1 > 0 order by c1");
// run("
SELECT distinct c1, c2 FROM t1 WHERE
c1 > 0 order by c1");
// run("
select distinct c1 + 10, c2 from t1 where
c1 > 0 order by c1 + 10, c2");
// run("
SELECT distinct c1 + 10, c2 FROM t1 WHERE
c1 > 0 order by c1 + 10, c2");
// run("
select distinct c1 + 10 cc1, c2 cc2 from t1 where
c1 > 0 order by cc1, c2");
// run("
SELECT distinct c1 + 10 cc1, c2 cc2 FROM t1 WHERE
c1 > 0 order by cc1, c2");
// run("
select distinct count(c2) from t1 where c1 > 0 group by c1 order by count
(c2)");
// run("
SELECT distinct COUNT(c2) FROM t1 WHERE c1 > 0 group by c1 order by COUNT
(c2)");
}
}
TEST_F
(
ParserSelectTest
,
window
)
{
// INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [FILL(fill_mod_and_val)]
// fill_mod_and_val = { NONE | PREV | NULL | LINEAR | NEXT | value_mod }
// value_mod = VALUE , val ...
TEST_F
(
ParserSelectTest
,
interval
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
// INTERVAL(interval_val)
run
(
"select count(*) from t1 interval(10s)"
);
run
(
"SELECT COUNT(*) FROM t1 INTERVAL(10s)"
);
// INTERVAL(interval_val, interval_offset)
run
(
"SELECT COUNT(*) FROM t1 INTERVAL(10s, 5s)"
);
// INTERVAL(interval_val, interval_offset) SLIDING (sliding_val)
run
(
"SELECT COUNT(*) FROM t1 INTERVAL(10s, 5s) SLIDING(7s)"
);
// INTERVAL(interval_val) FILL(NONE)
run
(
"SELECT COUNT(*) FROM t1 WHERE ts > TIMESTAMP '2022-04-01 00:00:00' and ts < TIMESTAMP '2022-04-30 23:59:59' "
"INTERVAL(10s) FILL(NONE)"
);
}
}
TEST_F
(
ParserSelectTest
,
semanticError
)
{
TEST_F
(
ParserSelectTest
,
semanticError
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
// TSDB_CODE_PAR_INVALID_COLUMN
// TSDB_CODE_PAR_INVALID_COLUMN
run
(
"
select c1, cc1 from
t1"
,
TSDB_CODE_PAR_INVALID_COLUMN
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT c1, cc1 FROM
t1"
,
TSDB_CODE_PAR_INVALID_COLUMN
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select t1.c1, t1.cc1 from
t1"
,
TSDB_CODE_PAR_INVALID_COLUMN
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT t1.c1, t1.cc1 FROM
t1"
,
TSDB_CODE_PAR_INVALID_COLUMN
,
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_TABLE_NOT_EXIST
// TSDB_CODE_PAR_TABLE_NOT_EXIST
run
(
"
select * from
t10"
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT * FROM
t10"
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select * from
test.t10"
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT * FROM
test.t10"
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select t2.c1 from
t1"
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT t2.c1 FROM
t1"
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_AMBIGUOUS_COLUMN
// TSDB_CODE_PAR_AMBIGUOUS_COLUMN
run
(
"
select c2 from t1 tt1, t1 tt2 where
tt1.c1 = tt2.c1"
,
TSDB_CODE_PAR_AMBIGUOUS_COLUMN
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT c2 FROM t1 tt1, t1 tt2 WHERE
tt1.c1 = tt2.c1"
,
TSDB_CODE_PAR_AMBIGUOUS_COLUMN
,
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_WRONG_VALUE_TYPE
// TSDB_CODE_PAR_WRONG_VALUE_TYPE
run
(
"
select timestamp '2010' from
t1"
,
TSDB_CODE_PAR_WRONG_VALUE_TYPE
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT timestamp '2010' FROM
t1"
,
TSDB_CODE_PAR_WRONG_VALUE_TYPE
,
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
// TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
run
(
"
select c2 from t1 tt1 join t1 tt2 on count
(*) > 0"
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
,
run
(
"
SELECT c2 FROM t1 tt1 join t1 tt2 on COUNT
(*) > 0"
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
,
PARSER_STAGE_TRANSLATE
);
PARSER_STAGE_TRANSLATE
);
run
(
"
select c2 from t1 where count
(*) > 0"
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT c2 FROM t1 WHERE COUNT
(*) > 0"
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select c2 from t1 group by count
(*)"
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT c2 FROM t1 group by COUNT
(*)"
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
,
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT
// TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT
run
(
"
select c2 from
t1 order by 0"
,
TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT c2 FROM
t1 order by 0"
,
TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select c2 from
t1 order by 2"
,
TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT c2 FROM
t1 order by 2"
,
TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT
,
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
// TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
run
(
"
select count(*) cnt from
t1 having c1 > 0"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT COUNT(*) cnt FROM
t1 having c1 > 0"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select count(*) cnt from
t1 group by c2 having c1 > 0"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
run
(
"
SELECT COUNT(*) cnt FROM
t1 group by c2 having c1 > 0"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
PARSER_STAGE_TRANSLATE
);
run
(
"
select count(*), c1 cnt from
t1 group by c2 having c2 > 0"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
run
(
"
SELECT COUNT(*), c1 cnt FROM
t1 group by c2 having c2 > 0"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
PARSER_STAGE_TRANSLATE
);
run
(
"
select count(*) cnt from
t1 group by c2 having c2 > 0 order by c1"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
run
(
"
SELECT COUNT(*) cnt FROM
t1 group by c2 having c2 > 0 order by c1"
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_NOT_SINGLE_GROUP
// TSDB_CODE_PAR_NOT_SINGLE_GROUP
run
(
"
select count(*), c1 from
t1"
,
TSDB_CODE_PAR_NOT_SINGLE_GROUP
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT COUNT(*), c1 FROM
t1"
,
TSDB_CODE_PAR_NOT_SINGLE_GROUP
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select count(*) from
t1 order by c1"
,
TSDB_CODE_PAR_NOT_SINGLE_GROUP
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT COUNT(*) FROM
t1 order by c1"
,
TSDB_CODE_PAR_NOT_SINGLE_GROUP
,
PARSER_STAGE_TRANSLATE
);
run
(
"
select c1 from t1 order by count
(*)"
,
TSDB_CODE_PAR_NOT_SINGLE_GROUP
,
PARSER_STAGE_TRANSLATE
);
run
(
"
SELECT c1 FROM t1 order by COUNT
(*)"
,
TSDB_CODE_PAR_NOT_SINGLE_GROUP
,
PARSER_STAGE_TRANSLATE
);
// TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
// TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
run
(
"
select distinct c1, c2 from t1 where
c1 > 0 order by ts"
,
TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
,
run
(
"
SELECT distinct c1, c2 FROM t1 WHERE
c1 > 0 order by ts"
,
TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
PARSER_STAGE_TRANSLATE
);
run
(
"
select distinct c1 from t1 where c1 > 0 order by count
(c2)"
,
TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
,
run
(
"
SELECT distinct c1 FROM t1 WHERE c1 > 0 order by COUNT
(c2)"
,
TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
PARSER_STAGE_TRANSLATE
);
run
(
"
select distinct c2 from t1 where c1 > 0 order by count
(c2)"
,
TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
,
run
(
"
SELECT distinct c2 FROM t1 WHERE c1 > 0 order by COUNT
(c2)"
,
TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
,
PARSER_STAGE_TRANSLATE
);
PARSER_STAGE_TRANSLATE
);
}
}
...
...
source/libs/planner/inc/planInt.h
浏览文件 @
408929ec
...
@@ -21,6 +21,7 @@ extern "C" {
...
@@ -21,6 +21,7 @@ extern "C" {
#endif
#endif
#include "planner.h"
#include "planner.h"
#include "taoserror.h"
#define QUERY_POLICY_VNODE 1
#define QUERY_POLICY_VNODE 1
#define QUERY_POLICY_HYBRID 2
#define QUERY_POLICY_HYBRID 2
...
@@ -33,6 +34,8 @@ extern "C" {
...
@@ -33,6 +34,8 @@ extern "C" {
#define planDebug(param, ...) qDebug("PLAN: " param, __VA_ARGS__)
#define planDebug(param, ...) qDebug("PLAN: " param, __VA_ARGS__)
#define planTrace(param, ...) qTrace("PLAN: " param, __VA_ARGS__)
#define planTrace(param, ...) qTrace("PLAN: " param, __VA_ARGS__)
int32_t
generateUsageErrMsg
(
char
*
pBuf
,
int32_t
len
,
int32_t
errCode
,
...);
int32_t
createLogicPlan
(
SPlanContext
*
pCxt
,
SLogicNode
**
pLogicNode
);
int32_t
createLogicPlan
(
SPlanContext
*
pCxt
,
SLogicNode
**
pLogicNode
);
int32_t
optimizeLogicPlan
(
SPlanContext
*
pCxt
,
SLogicNode
*
pLogicNode
);
int32_t
optimizeLogicPlan
(
SPlanContext
*
pCxt
,
SLogicNode
*
pLogicNode
);
int32_t
splitLogicPlan
(
SPlanContext
*
pCxt
,
SLogicNode
*
pLogicNode
,
SLogicSubplan
**
pLogicSubplan
);
int32_t
splitLogicPlan
(
SPlanContext
*
pCxt
,
SLogicNode
*
pLogicNode
,
SLogicSubplan
**
pLogicSubplan
);
...
...
source/libs/planner/src/planLogicCreater.c
浏览文件 @
408929ec
...
@@ -274,7 +274,7 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
...
@@ -274,7 +274,7 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesCollectFuncs
(
pSelect
,
fmIsScanPseudoColumnFunc
,
&
pScan
->
pScanPseudoCols
);
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_FROM
,
fmIsScanPseudoColumnFunc
,
&
pScan
->
pScanPseudoCols
);
}
}
pScan
->
scanType
=
getScanType
(
pCxt
,
pScan
->
pScanPseudoCols
,
pScan
->
pScanCols
,
pScan
->
pMeta
);
pScan
->
scanType
=
getScanType
(
pCxt
,
pScan
->
pScanPseudoCols
,
pScan
->
pScanCols
,
pScan
->
pMeta
);
...
@@ -440,7 +440,7 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
...
@@ -440,7 +440,7 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
}
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
pSelect
->
hasAggFuncs
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
pSelect
->
hasAggFuncs
)
{
code
=
nodesCollectFuncs
(
pSelect
,
fmIsAggFunc
,
&
pAgg
->
pAggFuncs
);
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_GROUP_BY
,
fmIsAggFunc
,
&
pAgg
->
pAggFuncs
);
}
}
// rewrite the expression in subsequent clauses
// rewrite the expression in subsequent clauses
...
@@ -474,7 +474,7 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
...
@@ -474,7 +474,7 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
static
int32_t
createWindowLogicNodeFinalize
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SWindowLogicNode
*
pWindow
,
static
int32_t
createWindowLogicNodeFinalize
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SWindowLogicNode
*
pWindow
,
SLogicNode
**
pLogicNode
)
{
SLogicNode
**
pLogicNode
)
{
int32_t
code
=
nodesCollectFuncs
(
pSelect
,
fmIsWindowClauseFunc
,
&
pWindow
->
pFuncs
);
int32_t
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_WINDOW
,
fmIsWindowClauseFunc
,
&
pWindow
->
pFuncs
);
if
(
pCxt
->
pPlanCxt
->
streamQuery
)
{
if
(
pCxt
->
pPlanCxt
->
streamQuery
)
{
pWindow
->
triggerType
=
pCxt
->
pPlanCxt
->
triggerType
;
pWindow
->
triggerType
=
pCxt
->
pPlanCxt
->
triggerType
;
...
@@ -559,14 +559,6 @@ static int32_t createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SInterva
...
@@ -559,14 +559,6 @@ static int32_t createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SInterva
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
if
(
NULL
!=
pInterval
->
pFill
)
{
pWindow
->
pFill
=
nodesCloneNode
(
pInterval
->
pFill
);
if
(
NULL
==
pWindow
->
pFill
)
{
nodesDestroyNode
(
pWindow
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
return
createWindowLogicNodeFinalize
(
pCxt
,
pSelect
,
pWindow
,
pLogicNode
);
return
createWindowLogicNodeFinalize
(
pCxt
,
pSelect
,
pWindow
,
pLogicNode
);
}
}
...
@@ -589,6 +581,38 @@ static int32_t createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele
...
@@ -589,6 +581,38 @@ static int32_t createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele
return
TSDB_CODE_FAILED
;
return
TSDB_CODE_FAILED
;
}
}
static
int32_t
createFillLogicNode
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SLogicNode
**
pLogicNode
)
{
if
(
NULL
==
pSelect
->
pWindow
||
QUERY_NODE_INTERVAL_WINDOW
!=
nodeType
(
pSelect
->
pWindow
)
||
NULL
==
((
SIntervalWindowNode
*
)
pSelect
->
pWindow
)
->
pFill
)
{
return
TSDB_CODE_SUCCESS
;
}
SFillNode
*
pFillNode
=
(
SFillNode
*
)(((
SIntervalWindowNode
*
)
pSelect
->
pWindow
)
->
pFill
);
SFillLogicNode
*
pFill
=
nodesMakeNode
(
QUERY_NODE_LOGIC_PLAN_FILL
);
if
(
NULL
==
pFill
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
int32_t
code
=
nodesCollectColumns
(
pSelect
,
SQL_CLAUSE_WINDOW
,
NULL
,
COLLECT_COL_TYPE_ALL
,
&
pFill
->
node
.
pTargets
);
pFill
->
mode
=
pFillNode
->
mode
;
pFill
->
timeRange
=
pFillNode
->
timeRange
;
pFill
->
pValues
=
nodesCloneNode
(
pFillNode
->
pValues
);
pFill
->
pWStartTs
=
nodesCloneNode
(
pFillNode
->
pWStartTs
);
if
((
NULL
!=
pFillNode
->
pValues
&&
NULL
==
pFill
->
pValues
)
||
NULL
==
pFill
->
pWStartTs
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pLogicNode
=
(
SLogicNode
*
)
pFill
;
}
else
{
nodesDestroyNode
(
pFill
);
}
return
code
;
}
static
int32_t
createSortLogicNode
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SLogicNode
**
pLogicNode
)
{
static
int32_t
createSortLogicNode
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SLogicNode
**
pLogicNode
)
{
if
(
NULL
==
pSelect
->
pOrderByList
)
{
if
(
NULL
==
pSelect
->
pOrderByList
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -753,6 +777,9 @@ static int32_t createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele
...
@@ -753,6 +777,9 @@ static int32_t createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createChildLogicNode
(
pCxt
,
pSelect
,
createWindowLogicNode
,
&
pRoot
);
code
=
createChildLogicNode
(
pCxt
,
pSelect
,
createWindowLogicNode
,
&
pRoot
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createChildLogicNode
(
pCxt
,
pSelect
,
createFillLogicNode
,
&
pRoot
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createChildLogicNode
(
pCxt
,
pSelect
,
createAggLogicNode
,
&
pRoot
);
code
=
createChildLogicNode
(
pCxt
,
pSelect
,
createAggLogicNode
,
&
pRoot
);
}
}
...
...
source/libs/planner/src/planOptimizer.c
浏览文件 @
408929ec
...
@@ -554,22 +554,19 @@ static bool cpdIsPrimaryKeyEqualCond(SJoinLogicNode* pJoin, SNode* pCond) {
...
@@ -554,22 +554,19 @@ static bool cpdIsPrimaryKeyEqualCond(SJoinLogicNode* pJoin, SNode* pCond) {
static
int32_t
cpdCheckOpCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SNode
*
pOnCond
)
{
static
int32_t
cpdCheckOpCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SNode
*
pOnCond
)
{
if
(
!
cpdIsPrimaryKeyEqualCond
(
pJoin
,
pOnCond
))
{
if
(
!
cpdIsPrimaryKeyEqualCond
(
pJoin
,
pOnCond
))
{
snprintf
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
"l.ts = r.ts is expected in join expression"
);
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_EXPECTED_TS_EQUAL
);
return
TSDB_CODE_FAILED
;
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
cpdCheckLogicCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SLogicConditionNode
*
pOnCond
)
{
static
int32_t
cpdCheckLogicCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
,
SLogicConditionNode
*
pOnCond
)
{
if
(
LOGIC_COND_TYPE_AND
!=
pOnCond
->
condType
)
{
if
(
LOGIC_COND_TYPE_AND
!=
pOnCond
->
condType
)
{
snprintf
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
"l.ts = r.ts is expected in join expression"
);
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_EXPECTED_TS_EQUAL
);
return
TSDB_CODE_FAILED
;
}
}
SNode
*
pCond
=
NULL
;
SNode
*
pCond
=
NULL
;
FOREACH
(
pCond
,
pOnCond
->
pParameterList
)
{
FOREACH
(
pCond
,
pOnCond
->
pParameterList
)
{
if
(
!
cpdIsPrimaryKeyEqualCond
(
pJoin
,
pCond
))
{
if
(
!
cpdIsPrimaryKeyEqualCond
(
pJoin
,
pCond
))
{
snprintf
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
"l.ts = r.ts is expected in join expression"
);
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_EXPECTED_TS_EQUAL
);
return
TSDB_CODE_FAILED
;
}
}
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -577,8 +574,7 @@ static int32_t cpdCheckLogicCond(SOptimizeContext* pCxt, SJoinLogicNode* pJoin,
...
@@ -577,8 +574,7 @@ static int32_t cpdCheckLogicCond(SOptimizeContext* pCxt, SJoinLogicNode* pJoin,
static
int32_t
cpdCheckJoinOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
static
int32_t
cpdCheckJoinOnCond
(
SOptimizeContext
*
pCxt
,
SJoinLogicNode
*
pJoin
)
{
if
(
NULL
==
pJoin
->
pOnConditions
)
{
if
(
NULL
==
pJoin
->
pOnConditions
)
{
snprintf
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
"not support cross join"
);
return
generateUsageErrMsg
(
pCxt
->
pPlanCxt
->
pMsg
,
pCxt
->
pPlanCxt
->
msgLen
,
TSDB_CODE_PLAN_NOT_SUPPORT_CROSS_JOIN
);
return
TSDB_CODE_FAILED
;
}
}
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pJoin
->
pOnConditions
))
{
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
pJoin
->
pOnConditions
))
{
return
cpdCheckLogicCond
(
pCxt
,
pJoin
,
(
SLogicConditionNode
*
)
pJoin
->
pOnConditions
);
return
cpdCheckLogicCond
(
pCxt
,
pJoin
,
(
SLogicConditionNode
*
)
pJoin
->
pOnConditions
);
...
...
source/libs/planner/src/planPhysiCreater.c
浏览文件 @
408929ec
...
@@ -17,8 +17,8 @@
...
@@ -17,8 +17,8 @@
#include "catalog.h"
#include "catalog.h"
#include "functionMgt.h"
#include "functionMgt.h"
#include "tglobal.h"
#include "systable.h"
#include "systable.h"
#include "tglobal.h"
typedef
struct
SSlotIdInfo
{
typedef
struct
SSlotIdInfo
{
int16_t
slotId
;
int16_t
slotId
;
...
@@ -880,12 +880,6 @@ static int32_t createIntervalPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChil
...
@@ -880,12 +880,6 @@ static int32_t createIntervalPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChil
pInterval
->
intervalUnit
=
pWindowLogicNode
->
intervalUnit
;
pInterval
->
intervalUnit
=
pWindowLogicNode
->
intervalUnit
;
pInterval
->
slidingUnit
=
pWindowLogicNode
->
slidingUnit
;
pInterval
->
slidingUnit
=
pWindowLogicNode
->
slidingUnit
;
pInterval
->
pFill
=
nodesCloneNode
(
pWindowLogicNode
->
pFill
);
if
(
NULL
!=
pWindowLogicNode
->
pFill
&&
NULL
==
pInterval
->
pFill
)
{
nodesDestroyNode
(
pInterval
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
return
createWindowPhysiNodeFinalize
(
pCxt
,
pChildren
,
&
pInterval
->
window
,
pWindowLogicNode
,
pPhyNode
);
return
createWindowPhysiNodeFinalize
(
pCxt
,
pChildren
,
&
pInterval
->
window
,
pWindowLogicNode
,
pPhyNode
);
}
}
...
@@ -1035,6 +1029,46 @@ static int32_t createPartitionPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChi
...
@@ -1035,6 +1029,46 @@ static int32_t createPartitionPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChi
return
code
;
return
code
;
}
}
static
int32_t
createFillPhysiNode
(
SPhysiPlanContext
*
pCxt
,
SNodeList
*
pChildren
,
SFillLogicNode
*
pFillNode
,
SPhysiNode
**
pPhyNode
)
{
SFillPhysiNode
*
pFill
=
(
SFillPhysiNode
*
)
makePhysiNode
(
pCxt
,
getPrecision
(
pChildren
),
(
SLogicNode
*
)
pFillNode
,
QUERY_NODE_PHYSICAL_PLAN_FILL
);
if
(
NULL
==
pFill
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pFill
->
mode
=
pFillNode
->
mode
;
pFill
->
timeRange
=
pFillNode
->
timeRange
;
SDataBlockDescNode
*
pChildTupe
=
(((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
pOutputDataBlockDesc
);
int32_t
code
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
pFillNode
->
node
.
pTargets
,
&
pFill
->
pTargets
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addDataBlockSlots
(
pCxt
,
pFill
->
pTargets
,
pFill
->
node
.
pOutputDataBlockDesc
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pFill
->
pWStartTs
=
nodesCloneNode
(
pFillNode
->
pWStartTs
);
if
(
NULL
==
pFill
->
pWStartTs
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pFillNode
->
pValues
)
{
pFill
->
pValues
=
nodesCloneNode
(
pFillNode
->
pValues
);
if
(
NULL
==
pFill
->
pValues
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pPhyNode
=
(
SPhysiNode
*
)
pFill
;
}
else
{
nodesDestroyNode
(
pFill
);
}
return
code
;
}
static
int32_t
doCreatePhysiNode
(
SPhysiPlanContext
*
pCxt
,
SLogicNode
*
pLogicNode
,
SSubplan
*
pSubplan
,
static
int32_t
doCreatePhysiNode
(
SPhysiPlanContext
*
pCxt
,
SLogicNode
*
pLogicNode
,
SSubplan
*
pSubplan
,
SNodeList
*
pChildren
,
SPhysiNode
**
pPhyNode
)
{
SNodeList
*
pChildren
,
SPhysiNode
**
pPhyNode
)
{
switch
(
nodeType
(
pLogicNode
))
{
switch
(
nodeType
(
pLogicNode
))
{
...
@@ -1054,6 +1088,8 @@ static int32_t doCreatePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode
...
@@ -1054,6 +1088,8 @@ static int32_t doCreatePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode
return
createSortPhysiNode
(
pCxt
,
pChildren
,
(
SSortLogicNode
*
)
pLogicNode
,
pPhyNode
);
return
createSortPhysiNode
(
pCxt
,
pChildren
,
(
SSortLogicNode
*
)
pLogicNode
,
pPhyNode
);
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
return
createPartitionPhysiNode
(
pCxt
,
pChildren
,
(
SPartitionLogicNode
*
)
pLogicNode
,
pPhyNode
);
return
createPartitionPhysiNode
(
pCxt
,
pChildren
,
(
SPartitionLogicNode
*
)
pLogicNode
,
pPhyNode
);
case
QUERY_NODE_LOGIC_PLAN_FILL
:
return
createFillPhysiNode
(
pCxt
,
pChildren
,
(
SFillLogicNode
*
)
pLogicNode
,
pPhyNode
);
default:
default:
break
;
break
;
}
}
...
...
source/libs/planner/src/planUtil.c
0 → 100644
浏览文件 @
408929ec
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "planInt.h"
static
char
*
getUsageErrFormat
(
int32_t
errCode
)
{
switch
(
errCode
)
{
case
TSDB_CODE_PLAN_EXPECTED_TS_EQUAL
:
return
"l.ts = r.ts is expected in join expression"
;
case
TSDB_CODE_PLAN_NOT_SUPPORT_CROSS_JOIN
:
return
"not support cross join"
;
default:
break
;
}
return
"Unknown error"
;
}
int32_t
generateUsageErrMsg
(
char
*
pBuf
,
int32_t
len
,
int32_t
errCode
,
...)
{
va_list
vArgList
;
va_start
(
vArgList
,
errCode
);
vsnprintf
(
pBuf
,
len
,
getUsageErrFormat
(
errCode
),
vArgList
);
va_end
(
vArgList
);
return
errCode
;
}
source/libs/planner/test/planBasicTest.cpp
浏览文件 @
408929ec
/*
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
*
* This program is free software: you can use, redistribute,
and
/or modify
* This program is free software: you can use, redistribute,
AND
/or modify
* it under the terms of the GNU Affero General Public License, version 3
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
* or later ("AGPL"), as published by the Free Software Foundation.
*
*
...
@@ -20,30 +20,32 @@ using namespace std;
...
@@ -20,30 +20,32 @@ using namespace std;
class
PlanBasicTest
:
public
PlannerTestBase
{};
class
PlanBasicTest
:
public
PlannerTestBase
{};
TEST_F
(
PlanBasicTest
,
select
)
{
TEST_F
(
PlanBasicTest
,
select
Clause
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select * from
t1"
);
run
(
"
SELECT * FROM
t1"
);
run
(
"
select 1 from
t1"
);
run
(
"
SELECT 1 FROM
t1"
);
run
(
"
select * from
st1"
);
run
(
"
SELECT * FROM
st1"
);
run
(
"
select 1 from
st1"
);
run
(
"
SELECT 1 FROM
st1"
);
}
}
TEST_F
(
PlanBasicTest
,
where
)
{
TEST_F
(
PlanBasicTest
,
where
Clause
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"select * from t1 where c1 > 10"
);
run
(
"SELECT * FROM t1 WHERE c1 > 10"
);
run
(
"SELECT * FROM t1 WHERE ts > TIMESTAMP '2022-04-01 00:00:00' and ts < TIMESTAMP '2022-04-30 23:59:59'"
);
}
}
TEST_F
(
PlanBasicTest
,
join
)
{
TEST_F
(
PlanBasicTest
,
join
Clause
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select t1.c1, t2.c2 from st1s1 t1, st1s2 t2 where
t1.ts = t2.ts"
);
run
(
"
SELECT t1.c1, t2.c2 FROM st1s1 t1, st1s2 t2 WHERE
t1.ts = t2.ts"
);
run
(
"
select t1.c1, t2.c2 from st1s1 t1 join st1s2 t2 on
t1.ts = t2.ts"
);
run
(
"
SELECT t1.c1, t2.c2 FROM st1s1 t1 JOIN st1s2 t2 ON
t1.ts = t2.ts"
);
}
}
TEST_F
(
PlanBasicTest
,
func
)
{
TEST_F
(
PlanBasicTest
,
func
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select diff(c1) from
t1"
);
run
(
"
SELECT DIFF(c1) FROM
t1"
);
}
}
source/libs/planner/test/planIntervalTest.cpp
浏览文件 @
408929ec
...
@@ -23,19 +23,22 @@ class PlanIntervalTest : public PlannerTestBase {};
...
@@ -23,19 +23,22 @@ class PlanIntervalTest : public PlannerTestBase {};
TEST_F
(
PlanIntervalTest
,
basic
)
{
TEST_F
(
PlanIntervalTest
,
basic
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select count(*) from t1 interval
(10s)"
);
run
(
"
SELECT COUNT(*) FROM t1 INTERVAL
(10s)"
);
}
}
TEST_F
(
PlanIntervalTest
,
pseudoCol
)
{
TEST_F
(
PlanIntervalTest
,
pseudoCol
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"
select _wstartts, _wduration, _wendts, count(*) from t1 interval
(10s)"
);
run
(
"
SELECT _WSTARTTS, _WDURATION, _WENDTS, COUNT(*) FROM t1 INTERVAL
(10s)"
);
}
}
TEST_F
(
PlanIntervalTest
,
fill
)
{
TEST_F
(
PlanIntervalTest
,
fill
)
{
useDb
(
"root"
,
"test"
);
useDb
(
"root"
,
"test"
);
run
(
"select count(*) from t1 interval(10s) fill(linear)"
);
run
(
"SELECT COUNT(*) FROM t1 WHERE ts > TIMESTAMP '2022-04-01 00:00:00' and ts < TIMESTAMP '2022-04-30 23:59:59' "
"INTERVAL(10s) FILL(LINEAR)"
);
run
(
"select count(*), sum(c1) from t1 interval(10s) fill(value, 10, 20)"
);
run
(
"SELECT COUNT(*), SUM(c1) FROM t1 "
"WHERE ts > TIMESTAMP '2022-04-01 00:00:00' and ts < TIMESTAMP '2022-04-30 23:59:59' "
"INTERVAL(10s) FILL(VALUE, 10, 20)"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录