Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
0e905bb3
T
TDengine
项目概览
taosdata
/
TDengine
接近 2 年 前同步成功
通知
1191
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看板
提交
0e905bb3
编写于
6月 19, 2022
作者:
S
shenglian zhou
浏览文件
操作
浏览文件
下载
差异文件
Merge branch '3.0' of github.com:taosdata/TDengine into szhou/feature/project-elimation
上级
8c402d2a
c963f92d
变更
55
展开全部
隐藏空白更改
内联
并排
Showing
55 changed file
with
3375 addition
and
2183 deletion
+3375
-2183
include/common/tmsg.h
include/common/tmsg.h
+4
-1
include/common/tmsgdef.h
include/common/tmsgdef.h
+1
-1
include/common/ttokendef.h
include/common/ttokendef.h
+16
-14
include/libs/function/functionMgt.h
include/libs/function/functionMgt.h
+1
-0
include/libs/nodes/cmdnodes.h
include/libs/nodes/cmdnodes.h
+2
-0
include/libs/nodes/nodes.h
include/libs/nodes/nodes.h
+2
-0
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+20
-3
include/libs/nodes/querynodes.h
include/libs/nodes/querynodes.h
+4
-0
source/common/src/systable.c
source/common/src/systable.c
+2
-2
source/common/src/tmsg.c
source/common/src/tmsg.c
+17
-7
source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
+1
-0
source/dnode/mnode/impl/src/mndMain.c
source/dnode/mnode/impl/src/mndMain.c
+38
-0
source/dnode/mnode/impl/src/mndStb.c
source/dnode/mnode/impl/src/mndStb.c
+27
-24
source/dnode/vnode/inc/vnode.h
source/dnode/vnode/inc/vnode.h
+4
-0
source/dnode/vnode/src/inc/vnodeInt.h
source/dnode/vnode/src/inc/vnodeInt.h
+2
-0
source/dnode/vnode/src/meta/metaEntry.c
source/dnode/vnode/src/meta/metaEntry.c
+17
-0
source/dnode/vnode/src/meta/metaQuery.c
source/dnode/vnode/src/meta/metaQuery.c
+35
-1
source/dnode/vnode/src/meta/metaTable.c
source/dnode/vnode/src/meta/metaTable.c
+141
-27
source/dnode/vnode/src/vnd/vnodeSvr.c
source/dnode/vnode/src/vnd/vnodeSvr.c
+25
-1
source/libs/command/src/explain.c
source/libs/command/src/explain.c
+2
-2
source/libs/executor/inc/executorimpl.h
source/libs/executor/inc/executorimpl.h
+10
-5
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+1
-1
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+37
-14
source/libs/executor/src/timewindowoperator.c
source/libs/executor/src/timewindowoperator.c
+244
-78
source/libs/function/inc/builtins.h
source/libs/function/inc/builtins.h
+16
-14
source/libs/function/inc/functionMgtInt.h
source/libs/function/inc/functionMgtInt.h
+0
-2
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+11
-2
source/libs/function/src/builtinsimpl.c
source/libs/function/src/builtinsimpl.c
+54
-60
source/libs/function/src/functionMgt.c
source/libs/function/src/functionMgt.c
+62
-29
source/libs/nodes/src/nodesCloneFuncs.c
source/libs/nodes/src/nodesCloneFuncs.c
+13
-1
source/libs/nodes/src/nodesCodeFuncs.c
source/libs/nodes/src/nodesCodeFuncs.c
+122
-6
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+22
-2
source/libs/parser/inc/parAst.h
source/libs/parser/inc/parAst.h
+4
-0
source/libs/parser/inc/sql.y
source/libs/parser/inc/sql.y
+14
-5
source/libs/parser/src/parAstCreater.c
source/libs/parser/src/parAstCreater.c
+43
-3
source/libs/parser/src/parInsert.c
source/libs/parser/src/parInsert.c
+1
-0
source/libs/parser/src/parTokenizer.c
source/libs/parser/src/parTokenizer.c
+2
-1
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+44
-19
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+1861
-1823
source/libs/parser/test/parInitialATest.cpp
source/libs/parser/test/parInitialATest.cpp
+8
-7
source/libs/parser/test/parInitialCTest.cpp
source/libs/parser/test/parInitialCTest.cpp
+3
-3
source/libs/parser/test/parSelectTest.cpp
source/libs/parser/test/parSelectTest.cpp
+18
-0
source/libs/planner/src/planLogicCreater.c
source/libs/planner/src/planLogicCreater.c
+53
-9
source/libs/planner/src/planPhysiCreater.c
source/libs/planner/src/planPhysiCreater.c
+52
-5
source/libs/planner/src/planSpliter.c
source/libs/planner/src/planSpliter.c
+41
-3
source/libs/planner/test/planBasicTest.cpp
source/libs/planner/test/planBasicTest.cpp
+10
-0
source/libs/tdb/inc/tdb.h
source/libs/tdb/inc/tdb.h
+1
-0
source/libs/tdb/src/db/tdbBtree.c
source/libs/tdb/src/db/tdbBtree.c
+46
-0
source/libs/tdb/src/db/tdbTable.c
source/libs/tdb/src/db/tdbTable.c
+4
-0
source/libs/tdb/src/inc/tdbInt.h
source/libs/tdb/src/inc/tdbInt.h
+1
-0
tests/script/tsim/stable/alter_comment.sim
tests/script/tsim/stable/alter_comment.sim
+1
-1
tests/script/tsim/stream/session0.sim
tests/script/tsim/stream/session0.sim
+7
-6
tests/script/tsim/stream/triggerSession0.sim
tests/script/tsim/stream/triggerSession0.sim
+1
-1
tests/system-test/2-query/ttl_comment.py
tests/system-test/2-query/ttl_comment.py
+206
-0
tests/system-test/fulltest.sh
tests/system-test/fulltest.sh
+1
-0
未找到文件。
include/common/tmsg.h
浏览文件 @
0e905bb3
...
...
@@ -1817,6 +1817,8 @@ typedef struct SVCreateTbReq {
tb_uid_t
uid
;
int64_t
ctime
;
int32_t
ttl
;
int32_t
commentLen
;
char
*
comment
;
int8_t
type
;
union
{
struct
{
...
...
@@ -1834,6 +1836,7 @@ int tDecodeSVCreateTbReq(SDecoder* pCoder, SVCreateTbReq* pReq);
static
FORCE_INLINE
void
tdDestroySVCreateTbReq
(
SVCreateTbReq
*
req
)
{
taosMemoryFreeClear
(
req
->
name
);
taosMemoryFreeClear
(
req
->
comment
);
if
(
req
->
type
==
TSDB_CHILD_TABLE
)
{
taosMemoryFreeClear
(
req
->
ctb
.
pTag
);
}
else
if
(
req
->
type
==
TSDB_NORMAL_TABLE
)
{
...
...
@@ -1930,7 +1933,7 @@ typedef struct {
// TSDB_ALTER_TABLE_UPDATE_OPTIONS
int8_t
updateTTL
;
int32_t
newTTL
;
int
8_t
updateComment
;
int
32_t
newCommentLen
;
char
*
newComment
;
}
SVAlterTbReq
;
...
...
include/common/tmsgdef.h
浏览文件 @
0e905bb3
...
...
@@ -198,7 +198,7 @@ enum {
TD_DEF_MSG_TYPE
(
TDMT_VND_ALTER_CONFIRM
,
"alter-confirm"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_ALTER_HASHRANGE
,
"alter-hashrange"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_COMPACT
,
"compact"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_VND_DROP_TTL_TABLE
,
"drop-ttl-stb"
,
NULL
,
NULL
)
TD_NEW_MSG_SEG
(
TDMT_QND_MSG
)
//shared by snode and vnode
...
...
include/common/ttokendef.h
浏览文件 @
0e905bb3
...
...
@@ -241,20 +241,22 @@
#define TK_LINEAR 223
#define TK_NEXT 224
#define TK_HAVING 225
#define TK_ORDER 226
#define TK_SLIMIT 227
#define TK_SOFFSET 228
#define TK_LIMIT 229
#define TK_OFFSET 230
#define TK_ASC 231
#define TK_NULLS 232
#define TK_ID 233
#define TK_NK_BITNOT 234
#define TK_INSERT 235
#define TK_VALUES 236
#define TK_IMPORT 237
#define TK_NK_SEMI 238
#define TK_FILE 239
#define TK_RANGE 226
#define TK_EVERY 227
#define TK_ORDER 228
#define TK_SLIMIT 229
#define TK_SOFFSET 230
#define TK_LIMIT 231
#define TK_OFFSET 232
#define TK_ASC 233
#define TK_NULLS 234
#define TK_ID 235
#define TK_NK_BITNOT 236
#define TK_INSERT 237
#define TK_VALUES 238
#define TK_IMPORT 239
#define TK_NK_SEMI 240
#define TK_FILE 241
#define TK_NK_SPACE 300
#define TK_NK_COMMENT 301
...
...
include/libs/function/functionMgt.h
浏览文件 @
0e905bb3
...
...
@@ -189,6 +189,7 @@ bool fmIsForbidStreamFunc(int32_t funcId);
bool
fmIsForbidWindowFunc
(
int32_t
funcId
);
bool
fmIsForbidGroupByFunc
(
int32_t
funcId
);
bool
fmIsIntervalInterpoFunc
(
int32_t
funcId
);
bool
fmIsInterpFunc
(
int32_t
funcId
);
int32_t
fmGetDistMethod
(
const
SFunctionNode
*
pFunc
,
SFunctionNode
**
pPartialFunc
,
SFunctionNode
**
pMergeFunc
);
...
...
include/libs/nodes/cmdnodes.h
浏览文件 @
0e905bb3
...
...
@@ -87,6 +87,7 @@ typedef struct SAlterDatabaseStmt {
typedef
struct
STableOptions
{
ENodeType
type
;
bool
commentNull
;
char
comment
[
TSDB_TB_COMMENT_LEN
];
SNodeList
*
pMaxDelay
;
int64_t
maxDelay1
;
...
...
@@ -126,6 +127,7 @@ typedef struct SCreateSubTableClause {
bool
ignoreExists
;
SNodeList
*
pSpecificTags
;
SNodeList
*
pValsOfTags
;
STableOptions
*
pOptions
;
}
SCreateSubTableClause
;
typedef
struct
SCreateMultiTableStmt
{
...
...
include/libs/nodes/nodes.h
浏览文件 @
0e905bb3
...
...
@@ -205,6 +205,7 @@ typedef enum ENodeType {
QUERY_NODE_LOGIC_PLAN_SORT
,
QUERY_NODE_LOGIC_PLAN_PARTITION
,
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
,
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
,
QUERY_NODE_LOGIC_SUBPLAN
,
QUERY_NODE_LOGIC_PLAN
,
...
...
@@ -236,6 +237,7 @@ typedef enum ENodeType {
QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE
,
QUERY_NODE_PHYSICAL_PLAN_PARTITION
,
QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC
,
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC
,
QUERY_NODE_PHYSICAL_PLAN_DISPATCH
,
QUERY_NODE_PHYSICAL_PLAN_INSERT
,
QUERY_NODE_PHYSICAL_PLAN_DELETE
,
...
...
include/libs/nodes/plannodes.h
浏览文件 @
0e905bb3
...
...
@@ -98,9 +98,16 @@ typedef struct SProjectLogicNode {
typedef
struct
SIndefRowsFuncLogicNode
{
SLogicNode
node
;
SNodeList
*
p
Vector
Funcs
;
SNodeList
*
pFuncs
;
}
SIndefRowsFuncLogicNode
;
typedef
struct
SInterpFuncLogicNode
{
SLogicNode
node
;
SNodeList
*
pFuncs
;
STimeWindow
timeRange
;
int64_t
interval
;
}
SInterpFuncLogicNode
;
typedef
enum
EModifyTableType
{
MODIFY_TABLE_TYPE_INSERT
=
1
,
MODIFY_TABLE_TYPE_DELETE
}
EModifyTableType
;
typedef
struct
SVnodeModifyLogicNode
{
...
...
@@ -154,6 +161,7 @@ typedef struct SWindowLogicNode {
int8_t
slidingUnit
;
int64_t
sessionGap
;
SNode
*
pTspk
;
SNode
*
pTsEnd
;
SNode
*
pStateExpr
;
int8_t
triggerType
;
int64_t
watermark
;
...
...
@@ -292,9 +300,17 @@ typedef struct SProjectPhysiNode {
typedef
struct
SIndefRowsFuncPhysiNode
{
SPhysiNode
node
;
SNodeList
*
pExprs
;
SNodeList
*
p
Vector
Funcs
;
SNodeList
*
pFuncs
;
}
SIndefRowsFuncPhysiNode
;
typedef
struct
SInterpFuncPhysiNode
{
SPhysiNode
node
;
SNodeList
*
pExprs
;
SNodeList
*
pFuncs
;
STimeWindow
timeRange
;
int64_t
interval
;
}
SInterpFuncPhysiNode
;
typedef
struct
SJoinPhysiNode
{
SPhysiNode
node
;
EJoinType
joinType
;
...
...
@@ -337,7 +353,8 @@ typedef struct SWinodwPhysiNode {
SPhysiNode
node
;
SNodeList
*
pExprs
;
// these are expression list of parameter expression of function
SNodeList
*
pFuncs
;
SNode
*
pTspk
;
// timestamp primary key
SNode
*
pTspk
;
// timestamp primary key
SNode
*
pTsEnd
;
// window end timestamp
int8_t
triggerType
;
int64_t
watermark
;
double
filesFactor
;
...
...
include/libs/nodes/querynodes.h
浏览文件 @
0e905bb3
...
...
@@ -240,6 +240,9 @@ typedef struct SSelectStmt {
SNode
*
pWindow
;
SNodeList
*
pGroupByList
;
// SGroupingSetNode
SNode
*
pHaving
;
SNode
*
pRange
;
SNode
*
pEvery
;
SNode
*
pFill
;
SNodeList
*
pOrderByList
;
// SOrderByExprNode
SLimitNode
*
pLimit
;
SLimitNode
*
pSlimit
;
...
...
@@ -254,6 +257,7 @@ typedef struct SSelectStmt {
bool
hasSelectValFunc
;
bool
hasUniqueFunc
;
bool
hasTailFunc
;
bool
hasInterpFunc
;
}
SSelectStmt
;
typedef
enum
ESetOperatorType
{
SET_OP_TYPE_UNION_ALL
=
1
,
SET_OP_TYPE_UNION
}
ESetOperatorType
;
...
...
source/common/src/systable.c
浏览文件 @
0e905bb3
...
...
@@ -124,7 +124,7 @@ static const SSysDbTableSchema userStbsSchema[] = {
{.
name
=
"columns"
,
.
bytes
=
4
,
.
type
=
TSDB_DATA_TYPE_INT
},
{.
name
=
"tags"
,
.
bytes
=
4
,
.
type
=
TSDB_DATA_TYPE_INT
},
{.
name
=
"last_update"
,
.
bytes
=
8
,
.
type
=
TSDB_DATA_TYPE_TIMESTAMP
},
{.
name
=
"table_comment"
,
.
bytes
=
1024
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
},
{.
name
=
"table_comment"
,
.
bytes
=
TSDB_TB_COMMENT_LEN
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
},
};
static
const
SSysDbTableSchema
streamSchema
[]
=
{
...
...
@@ -148,7 +148,7 @@ static const SSysDbTableSchema userTblsSchema[] = {
{.
name
=
"uid"
,
.
bytes
=
8
,
.
type
=
TSDB_DATA_TYPE_BIGINT
},
{.
name
=
"vgroup_id"
,
.
bytes
=
4
,
.
type
=
TSDB_DATA_TYPE_INT
},
{.
name
=
"ttl"
,
.
bytes
=
4
,
.
type
=
TSDB_DATA_TYPE_INT
},
{.
name
=
"table_comment"
,
.
bytes
=
512
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
},
{.
name
=
"table_comment"
,
.
bytes
=
TSDB_TB_COMMENT_LEN
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
},
{.
name
=
"type"
,
.
bytes
=
20
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
},
};
...
...
source/common/src/tmsg.c
浏览文件 @
0e905bb3
...
...
@@ -524,7 +524,7 @@ int32_t tSerializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pReq
}
if
(
pReq
->
commentLen
>
0
)
{
if
(
tEncode
Binary
(
&
encoder
,
pReq
->
comment
,
pReq
->
commentLen
)
<
0
)
return
-
1
;
if
(
tEncode
CStr
(
&
encoder
,
pReq
->
comment
)
<
0
)
return
-
1
;
}
if
(
pReq
->
ast1Len
>
0
)
{
if
(
tEncodeBinary
(
&
encoder
,
pReq
->
pAst1
,
pReq
->
ast1Len
)
<
0
)
return
-
1
;
...
...
@@ -589,7 +589,7 @@ int32_t tDeserializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pR
}
if
(
pReq
->
commentLen
>
0
)
{
pReq
->
comment
=
taosMemoryMalloc
(
pReq
->
commentLen
);
pReq
->
comment
=
taosMemoryMalloc
(
pReq
->
commentLen
+
1
);
if
(
pReq
->
comment
==
NULL
)
return
-
1
;
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
comment
)
<
0
)
return
-
1
;
}
...
...
@@ -707,7 +707,7 @@ int32_t tDeserializeSMAlterStbReq(void *buf, int32_t bufLen, SMAlterStbReq *pReq
if
(
tDecodeI32
(
&
decoder
,
&
pReq
->
ttl
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
&
decoder
,
&
pReq
->
commentLen
)
<
0
)
return
-
1
;
if
(
pReq
->
commentLen
>
0
)
{
pReq
->
comment
=
taosMemoryMalloc
(
pReq
->
commentLen
);
pReq
->
comment
=
taosMemoryMalloc
(
pReq
->
commentLen
+
1
);
if
(
pReq
->
comment
==
NULL
)
return
-
1
;
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
comment
)
<
0
)
return
-
1
;
}
...
...
@@ -4374,6 +4374,10 @@ int tEncodeSVCreateTbReq(SEncoder *pCoder, const SVCreateTbReq *pReq) {
if
(
tEncodeI64
(
pCoder
,
pReq
->
ctime
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pCoder
,
pReq
->
ttl
)
<
0
)
return
-
1
;
if
(
tEncodeI8
(
pCoder
,
pReq
->
type
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pCoder
,
pReq
->
commentLen
)
<
0
)
return
-
1
;
if
(
pReq
->
commentLen
>
0
)
{
if
(
tEncodeCStr
(
pCoder
,
pReq
->
comment
)
<
0
)
return
-
1
;
}
if
(
pReq
->
type
==
TSDB_CHILD_TABLE
)
{
if
(
tEncodeI64
(
pCoder
,
pReq
->
ctb
.
suid
)
<
0
)
return
-
1
;
...
...
@@ -4397,6 +4401,12 @@ int tDecodeSVCreateTbReq(SDecoder *pCoder, SVCreateTbReq *pReq) {
if
(
tDecodeI64
(
pCoder
,
&
pReq
->
ctime
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pCoder
,
&
pReq
->
ttl
)
<
0
)
return
-
1
;
if
(
tDecodeI8
(
pCoder
,
&
pReq
->
type
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pCoder
,
&
pReq
->
commentLen
)
<
0
)
return
-
1
;
if
(
pReq
->
commentLen
>
0
)
{
pReq
->
comment
=
taosMemoryMalloc
(
pReq
->
commentLen
+
1
);
if
(
pReq
->
comment
==
NULL
)
return
-
1
;
if
(
tDecodeCStrTo
(
pCoder
,
pReq
->
comment
)
<
0
)
return
-
1
;
}
if
(
pReq
->
type
==
TSDB_CHILD_TABLE
)
{
if
(
tDecodeI64
(
pCoder
,
&
pReq
->
ctb
.
suid
)
<
0
)
return
-
1
;
...
...
@@ -4750,8 +4760,8 @@ int32_t tEncodeSVAlterTbReq(SEncoder *pEncoder, const SVAlterTbReq *pReq) {
if
(
pReq
->
updateTTL
)
{
if
(
tEncodeI32v
(
pEncoder
,
pReq
->
newTTL
)
<
0
)
return
-
1
;
}
if
(
tEncodeI
8
(
pEncoder
,
pReq
->
updateComment
)
<
0
)
return
-
1
;
if
(
pReq
->
updateComment
)
{
if
(
tEncodeI
32v
(
pEncoder
,
pReq
->
newCommentLen
)
<
0
)
return
-
1
;
if
(
pReq
->
newCommentLen
>
0
)
{
if
(
tEncodeCStr
(
pEncoder
,
pReq
->
newComment
)
<
0
)
return
-
1
;
}
break
;
...
...
@@ -4798,8 +4808,8 @@ int32_t tDecodeSVAlterTbReq(SDecoder *pDecoder, SVAlterTbReq *pReq) {
if
(
pReq
->
updateTTL
)
{
if
(
tDecodeI32v
(
pDecoder
,
&
pReq
->
newTTL
)
<
0
)
return
-
1
;
}
if
(
tDecodeI
8
(
pDecoder
,
&
pReq
->
updateComment
)
<
0
)
return
-
1
;
if
(
pReq
->
updateComment
)
{
if
(
tDecodeI
32v
(
pDecoder
,
&
pReq
->
newCommentLen
)
<
0
)
return
-
1
;
if
(
pReq
->
newCommentLen
>
0
)
{
if
(
tDecodeCStr
(
pDecoder
,
&
pReq
->
newComment
)
<
0
)
return
-
1
;
}
break
;
...
...
source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
浏览文件 @
0e905bb3
...
...
@@ -334,6 +334,7 @@ SArray *vmGetMsgHandles() {
if
(
dmSetMgmtHandle
(
pArray
,
TDMT_VND_CANCEL_TASK
,
vmPutMsgToFetchQueue
,
0
)
==
NULL
)
goto
_OVER
;
if
(
dmSetMgmtHandle
(
pArray
,
TDMT_VND_DROP_TASK
,
vmPutMsgToFetchQueue
,
0
)
==
NULL
)
goto
_OVER
;
if
(
dmSetMgmtHandle
(
pArray
,
TDMT_VND_CREATE_STB
,
vmPutMsgToWriteQueue
,
0
)
==
NULL
)
goto
_OVER
;
if
(
dmSetMgmtHandle
(
pArray
,
TDMT_VND_DROP_TTL_TABLE
,
vmPutMsgToWriteQueue
,
0
)
==
NULL
)
goto
_OVER
;
if
(
dmSetMgmtHandle
(
pArray
,
TDMT_VND_ALTER_STB
,
vmPutMsgToWriteQueue
,
0
)
==
NULL
)
goto
_OVER
;
if
(
dmSetMgmtHandle
(
pArray
,
TDMT_VND_DROP_STB
,
vmPutMsgToWriteQueue
,
0
)
==
NULL
)
goto
_OVER
;
if
(
dmSetMgmtHandle
(
pArray
,
TDMT_VND_CREATE_TABLE
,
vmPutMsgToWriteQueue
,
0
)
==
NULL
)
goto
_OVER
;
...
...
source/dnode/mnode/impl/src/mndMain.c
浏览文件 @
0e905bb3
...
...
@@ -77,12 +77,50 @@ static void mndPullupTelem(SMnode *pMnode) {
tmsgPutToQueue
(
&
pMnode
->
msgCb
,
READ_QUEUE
,
&
rpcMsg
);
}
static
void
mndPushTtlTime
(
SMnode
*
pMnode
)
{
SSdb
*
pSdb
=
pMnode
->
pSdb
;
SVgObj
*
pVgroup
=
NULL
;
void
*
pIter
=
NULL
;
while
(
1
)
{
pIter
=
sdbFetch
(
pSdb
,
SDB_VGROUP
,
pIter
,
(
void
**
)
&
pVgroup
);
if
(
pIter
==
NULL
)
break
;
int32_t
contLen
=
sizeof
(
SMsgHead
)
+
sizeof
(
int32_t
);
SMsgHead
*
pHead
=
rpcMallocCont
(
contLen
);
if
(
pHead
==
NULL
)
{
mError
(
"ttl time malloc err. contLen:%d"
,
contLen
);
sdbRelease
(
pSdb
,
pVgroup
);
continue
;
}
pHead
->
contLen
=
htonl
(
contLen
);
pHead
->
vgId
=
htonl
(
pVgroup
->
vgId
);
int32_t
t
=
taosGetTimestampSec
();
*
(
int32_t
*
)(
POINTER_SHIFT
(
pHead
,
sizeof
(
SMsgHead
)))
=
htonl
(
t
);
SRpcMsg
rpcMsg
=
{.
msgType
=
TDMT_VND_DROP_TTL_TABLE
,
.
pCont
=
pHead
,
.
contLen
=
contLen
};
SEpSet
epSet
=
mndGetVgroupEpset
(
pMnode
,
pVgroup
);
int32_t
code
=
tmsgSendReq
(
&
epSet
,
&
rpcMsg
);
if
(
code
!=
0
){
mError
(
"ttl time seed err. code:%d"
,
code
);
}
mError
(
"ttl time seed succ. time:%d"
,
t
);
sdbRelease
(
pSdb
,
pVgroup
);
}
}
static
void
*
mndThreadFp
(
void
*
param
)
{
SMnode
*
pMnode
=
param
;
int64_t
lastTime
=
0
;
setThreadName
(
"mnode-timer"
);
while
(
1
)
{
if
(
lastTime
%
(
864000
)
==
0
)
{
// sleep 1 day for ttl
mndPushTtlTime
(
pMnode
);
}
lastTime
++
;
taosMsleep
(
100
);
if
(
mndGetStop
(
pMnode
))
break
;
...
...
source/dnode/mnode/impl/src/mndStb.c
浏览文件 @
0e905bb3
...
...
@@ -117,7 +117,7 @@ SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
}
if
(
pStb
->
commentLen
>
0
)
{
SDB_SET_BINARY
(
pRaw
,
dataPos
,
pStb
->
comment
,
pStb
->
commentLen
,
_OVER
)
SDB_SET_BINARY
(
pRaw
,
dataPos
,
pStb
->
comment
,
pStb
->
commentLen
+
1
,
_OVER
)
}
if
(
pStb
->
ast1Len
>
0
)
{
SDB_SET_BINARY
(
pRaw
,
dataPos
,
pStb
->
pAst1
,
pStb
->
ast1Len
,
_OVER
)
...
...
@@ -204,9 +204,9 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
}
if
(
pStb
->
commentLen
>
0
)
{
pStb
->
comment
=
taosMemoryCalloc
(
pStb
->
commentLen
,
1
);
pStb
->
comment
=
taosMemoryCalloc
(
pStb
->
commentLen
+
1
,
1
);
if
(
pStb
->
comment
==
NULL
)
goto
_OVER
;
SDB_GET_BINARY
(
pRaw
,
dataPos
,
pStb
->
comment
,
pStb
->
commentLen
,
_OVER
)
SDB_GET_BINARY
(
pRaw
,
dataPos
,
pStb
->
comment
,
pStb
->
commentLen
+
1
,
_OVER
)
}
if
(
pStb
->
ast1Len
>
0
)
{
pStb
->
pAst1
=
taosMemoryCalloc
(
pStb
->
ast1Len
,
1
);
...
...
@@ -280,8 +280,8 @@ static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
}
}
if
(
pOld
->
commentLen
<
pNew
->
commentLen
)
{
void
*
comment
=
taosMemoryMalloc
(
pNew
->
commentLen
);
if
(
pOld
->
commentLen
<
pNew
->
commentLen
&&
pNew
->
commentLen
>
0
)
{
void
*
comment
=
taosMemoryMalloc
(
pNew
->
commentLen
+
1
);
if
(
comment
!=
NULL
)
{
taosMemoryFree
(
pOld
->
comment
);
pOld
->
comment
=
comment
;
...
...
@@ -291,6 +291,7 @@ static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
taosWUnLockLatch
(
&
pOld
->
lock
);
}
}
pOld
->
commentLen
=
pNew
->
commentLen
;
if
(
pOld
->
ast1Len
<
pNew
->
ast1Len
)
{
void
*
pAst1
=
taosMemoryMalloc
(
pNew
->
ast1Len
);
...
...
@@ -330,8 +331,8 @@ static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
pOld
->
numOfTags
=
pNew
->
numOfTags
;
memcpy
(
pOld
->
pTags
,
pNew
->
pTags
,
pOld
->
numOfTags
*
sizeof
(
SSchema
));
}
if
(
pNew
->
commentLen
!=
0
)
{
memcpy
(
pOld
->
comment
,
pNew
->
comment
,
pNew
->
commentLen
);
if
(
pNew
->
commentLen
>
0
)
{
memcpy
(
pOld
->
comment
,
pNew
->
comment
,
pNew
->
commentLen
+
1
);
}
if
(
pNew
->
ast1Len
!=
0
)
{
memcpy
(
pOld
->
pAst1
,
pNew
->
pAst1
,
pNew
->
ast1Len
);
...
...
@@ -676,12 +677,12 @@ int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreat
pDst
->
numOfTags
=
pCreate
->
numOfTags
;
pDst
->
commentLen
=
pCreate
->
commentLen
;
if
(
pDst
->
commentLen
>
0
)
{
pDst
->
comment
=
taosMemoryCalloc
(
pDst
->
commentLen
,
1
);
pDst
->
comment
=
taosMemoryCalloc
(
pDst
->
commentLen
+
1
,
1
);
if
(
pDst
->
comment
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
}
memcpy
(
pDst
->
comment
,
pCreate
->
comment
,
pDst
->
commentLen
);
memcpy
(
pDst
->
comment
,
pCreate
->
comment
,
pDst
->
commentLen
+
1
);
}
pDst
->
ast1Len
=
pCreate
->
ast1Len
;
...
...
@@ -835,7 +836,7 @@ _OVER:
}
static
int32_t
mndCheckAlterStbReq
(
SMAlterStbReq
*
pAlter
)
{
if
(
pAlter
->
commentLen
!
=
0
||
pAlter
->
ttl
!=
0
)
return
0
;
if
(
pAlter
->
commentLen
>
=
0
||
pAlter
->
ttl
!=
0
)
return
0
;
if
(
pAlter
->
numOfFields
<
1
||
pAlter
->
numOfFields
!=
(
int32_t
)
taosArrayGetSize
(
pAlter
->
pFields
))
{
terrno
=
TSDB_CODE_MND_INVALID_STB_OPTION
;
...
...
@@ -890,13 +891,16 @@ static int32_t mndUpdateStbCommentAndTTL(const SStbObj *pOld, SStbObj *pNew, cha
int32_t
ttl
)
{
if
(
commentLen
>
0
)
{
pNew
->
commentLen
=
commentLen
;
pNew
->
comment
=
taosMemoryCalloc
(
1
,
commentLen
);
pNew
->
comment
=
taosMemoryCalloc
(
1
,
commentLen
+
1
);
if
(
pNew
->
comment
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
}
memcpy
(
pNew
->
comment
,
pComment
,
commentLen
);
memcpy
(
pNew
->
comment
,
pComment
,
commentLen
+
1
);
}
else
if
(
commentLen
==
0
){
pNew
->
commentLen
=
0
;
}
if
(
ttl
>=
0
)
{
pNew
->
ttl
=
ttl
;
}
...
...
@@ -1206,7 +1210,6 @@ static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj
sdbRelease
(
pSdb
,
pVgroup
);
return
-
1
;
}
STransAction
action
=
{
0
};
action
.
epSet
=
mndGetVgroupEpset
(
pMnode
,
pVgroup
);
action
.
pCont
=
pReq
;
...
...
@@ -1841,17 +1844,17 @@ static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pStb
->
updateTime
,
false
);
// number of tables
char
*
p
=
taosMemoryCalloc
(
1
,
pStb
->
commentLen
+
1
+
VARSTR_HEADER_SIZE
);
// check malloc failures
if
(
p
!=
NULL
)
{
if
(
pStb
->
commentLen
!=
0
)
{
STR_TO_VARSTR
(
p
,
pStb
->
comment
);
}
else
{
STR_TO_VARSTR
(
p
,
""
);
}
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
p
,
false
);
taosMemoryFree
(
p
);
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
);
if
(
p
Stb
->
commentLen
>
0
)
{
char
comment
[
TSDB_TB_COMMENT_LEN
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_TO_VARSTR
(
comment
,
pStb
->
comment
);
colDataAppend
(
pColInfo
,
numOfRows
,
comment
,
false
);
}
else
if
(
pStb
->
commentLen
==
0
)
{
char
comment
[
VARSTR_HEADER_SIZE
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_TO_VARSTR
(
comment
,
""
);
colDataAppend
(
pColInfo
,
numOfRows
,
comment
,
false
);
}
else
{
colDataAppendNULL
(
pColInfo
,
numOfRows
);
}
numOfRows
++
;
...
...
source/dnode/vnode/inc/vnode.h
浏览文件 @
0e905bb3
...
...
@@ -210,12 +210,16 @@ struct SMetaEntry {
struct
{
int64_t
ctime
;
int32_t
ttlDays
;
int32_t
commentLen
;
char
*
comment
;
tb_uid_t
suid
;
uint8_t
*
pTags
;
}
ctbEntry
;
struct
{
int64_t
ctime
;
int32_t
ttlDays
;
int32_t
commentLen
;
char
*
comment
;
int32_t
ncid
;
// next column id
SSchemaWrapper
schemaRow
;
}
ntbEntry
;
...
...
source/dnode/vnode/src/inc/vnodeInt.h
浏览文件 @
0e905bb3
...
...
@@ -87,6 +87,7 @@ int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* p
int
metaDropSTable
(
SMeta
*
pMeta
,
int64_t
verison
,
SVDropStbReq
*
pReq
);
int
metaCreateTable
(
SMeta
*
pMeta
,
int64_t
version
,
SVCreateTbReq
*
pReq
);
int
metaDropTable
(
SMeta
*
pMeta
,
int64_t
version
,
SVDropTbReq
*
pReq
,
SArray
*
tbUids
);
int
metaTtlDropTable
(
SMeta
*
pMeta
,
int64_t
ttl
,
SArray
*
tbUids
);
int
metaAlterTable
(
SMeta
*
pMeta
,
int64_t
version
,
SVAlterTbReq
*
pReq
,
STableMetaRsp
*
pMetaRsp
);
SSchemaWrapper
*
metaGetTableSchema
(
SMeta
*
pMeta
,
tb_uid_t
uid
,
int32_t
sver
,
bool
isinline
);
STSchema
*
metaGetTbTSchema
(
SMeta
*
pMeta
,
tb_uid_t
uid
,
int32_t
sver
);
...
...
@@ -105,6 +106,7 @@ int32_t metaSnapshotReaderClose(SMetaSnapshotReader* pReader);
int32_t
metaSnapshotRead
(
SMetaSnapshotReader
*
pReader
,
void
**
ppData
,
uint32_t
*
nData
);
void
*
metaGetIdx
(
SMeta
*
pMeta
);
void
*
metaGetIvtIdx
(
SMeta
*
pMeta
);
int
metaTtlSmaller
(
SMeta
*
pMeta
,
uint64_t
time
,
SArray
*
uidList
);
int32_t
metaCreateTSma
(
SMeta
*
pMeta
,
int64_t
version
,
SSmaCfg
*
pCfg
);
int32_t
metaDropTSma
(
SMeta
*
pMeta
,
int64_t
indexUid
);
...
...
source/dnode/vnode/src/meta/metaEntry.c
浏览文件 @
0e905bb3
...
...
@@ -29,12 +29,20 @@ int metaEncodeEntry(SEncoder *pCoder, const SMetaEntry *pME) {
}
else
if
(
pME
->
type
==
TSDB_CHILD_TABLE
)
{
if
(
tEncodeI64
(
pCoder
,
pME
->
ctbEntry
.
ctime
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pCoder
,
pME
->
ctbEntry
.
ttlDays
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pCoder
,
pME
->
ctbEntry
.
commentLen
)
<
0
)
return
-
1
;
if
(
pME
->
ctbEntry
.
commentLen
>
0
){
if
(
tEncodeCStr
(
pCoder
,
pME
->
ctbEntry
.
comment
)
<
0
)
return
-
1
;
}
if
(
tEncodeI64
(
pCoder
,
pME
->
ctbEntry
.
suid
)
<
0
)
return
-
1
;
debugCheckTags
((
STag
*
)
pME
->
ctbEntry
.
pTags
);
// TODO: remove after debug
if
(
tEncodeTag
(
pCoder
,
(
const
STag
*
)
pME
->
ctbEntry
.
pTags
)
<
0
)
return
-
1
;
}
else
if
(
pME
->
type
==
TSDB_NORMAL_TABLE
)
{
if
(
tEncodeI64
(
pCoder
,
pME
->
ntbEntry
.
ctime
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pCoder
,
pME
->
ntbEntry
.
ttlDays
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pCoder
,
pME
->
ntbEntry
.
commentLen
)
<
0
)
return
-
1
;
if
(
pME
->
ntbEntry
.
commentLen
>
0
){
if
(
tEncodeCStr
(
pCoder
,
pME
->
ntbEntry
.
comment
)
<
0
)
return
-
1
;
}
if
(
tEncodeI32v
(
pCoder
,
pME
->
ntbEntry
.
ncid
)
<
0
)
return
-
1
;
if
(
tEncodeSSchemaWrapper
(
pCoder
,
&
pME
->
ntbEntry
.
schemaRow
)
<
0
)
return
-
1
;
}
else
if
(
pME
->
type
==
TSDB_TSMA_TABLE
)
{
...
...
@@ -61,12 +69,21 @@ int metaDecodeEntry(SDecoder *pCoder, SMetaEntry *pME) {
}
else
if
(
pME
->
type
==
TSDB_CHILD_TABLE
)
{
if
(
tDecodeI64
(
pCoder
,
&
pME
->
ctbEntry
.
ctime
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pCoder
,
&
pME
->
ctbEntry
.
ttlDays
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pCoder
,
&
pME
->
ctbEntry
.
commentLen
)
<
0
)
return
-
1
;
if
(
pME
->
ctbEntry
.
commentLen
>
0
){
if
(
tDecodeCStr
(
pCoder
,
&
pME
->
ctbEntry
.
comment
)
<
0
)
return
-
1
;
}
if
(
tDecodeI64
(
pCoder
,
&
pME
->
ctbEntry
.
suid
)
<
0
)
return
-
1
;
if
(
tDecodeTag
(
pCoder
,
(
STag
**
)
&
pME
->
ctbEntry
.
pTags
)
<
0
)
return
-
1
;
// (TODO)
debugCheckTags
((
STag
*
)
pME
->
ctbEntry
.
pTags
);
// TODO: remove after debug
}
else
if
(
pME
->
type
==
TSDB_NORMAL_TABLE
)
{
if
(
tDecodeI64
(
pCoder
,
&
pME
->
ntbEntry
.
ctime
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pCoder
,
&
pME
->
ntbEntry
.
ttlDays
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pCoder
,
&
pME
->
ntbEntry
.
commentLen
)
<
0
)
return
-
1
;
if
(
pME
->
ntbEntry
.
commentLen
>
0
){
if
(
tDecodeCStr
(
pCoder
,
&
pME
->
ntbEntry
.
comment
)
<
0
)
return
-
1
;
}
if
(
tDecodeI32v
(
pCoder
,
&
pME
->
ntbEntry
.
ncid
)
<
0
)
return
-
1
;
if
(
tDecodeSSchemaWrapperEx
(
pCoder
,
&
pME
->
ntbEntry
.
schemaRow
)
<
0
)
return
-
1
;
}
else
if
(
pME
->
type
==
TSDB_TSMA_TABLE
)
{
...
...
source/dnode/vnode/src/meta/metaQuery.c
浏览文件 @
0e905bb3
...
...
@@ -95,7 +95,7 @@ tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name) {
metaULock
(
pMeta
);
return
0
;
return
uid
;
}
int
metaReadNext
(
SMetaReader
*
pReader
)
{
...
...
@@ -218,6 +218,40 @@ _err:
return
NULL
;
}
int
metaTtlSmaller
(
SMeta
*
pMeta
,
uint64_t
ttl
,
SArray
*
uidList
){
metaRLock
(
pMeta
);
TBC
*
pCur
;
int
ret
=
tdbTbcOpen
(
pMeta
->
pTtlIdx
,
&
pCur
,
NULL
);
if
(
ret
<
0
)
{
metaULock
(
pMeta
);
return
ret
;
}
STtlIdxKey
ttlKey
=
{
0
};
ttlKey
.
dtime
=
ttl
;
ttlKey
.
uid
=
INT64_MAX
;
int
c
=
0
;
tdbTbcMoveTo
(
pCur
,
&
ttlKey
,
sizeof
(
ttlKey
),
&
c
);
if
(
c
<
0
)
{
tdbTbcMoveToPrev
(
pCur
);
}
void
*
pKey
=
NULL
;
int
kLen
=
0
;
while
(
1
){
ret
=
tdbTbcPrev
(
pCur
,
&
pKey
,
&
kLen
,
NULL
,
NULL
);
if
(
ret
<
0
)
{
break
;
}
ttlKey
=
*
(
STtlIdxKey
*
)
pKey
;
taosArrayPush
(
uidList
,
&
ttlKey
.
uid
);
}
tdbTbcClose
(
pCur
);
tdbFree
(
pKey
);
return
0
;
}
struct
SMCtbCursor
{
SMeta
*
pMeta
;
TBC
*
pCur
;
...
...
source/dnode/vnode/src/meta/metaTable.c
浏览文件 @
0e905bb3
...
...
@@ -320,11 +320,15 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq) {
if
(
me
.
type
==
TSDB_CHILD_TABLE
)
{
me
.
ctbEntry
.
ctime
=
pReq
->
ctime
;
me
.
ctbEntry
.
ttlDays
=
pReq
->
ttl
;
me
.
ctbEntry
.
commentLen
=
pReq
->
commentLen
;
me
.
ctbEntry
.
comment
=
pReq
->
comment
;
me
.
ctbEntry
.
suid
=
pReq
->
ctb
.
suid
;
me
.
ctbEntry
.
pTags
=
pReq
->
ctb
.
pTag
;
}
else
{
me
.
ntbEntry
.
ctime
=
pReq
->
ctime
;
me
.
ntbEntry
.
ttlDays
=
pReq
->
ttl
;
me
.
ntbEntry
.
commentLen
=
pReq
->
commentLen
;
me
.
ntbEntry
.
comment
=
pReq
->
comment
;
me
.
ntbEntry
.
schemaRow
=
pReq
->
ntb
.
schemaRow
;
me
.
ntbEntry
.
ncid
=
me
.
ntbEntry
.
schemaRow
.
pSchema
[
me
.
ntbEntry
.
schemaRow
.
nCols
-
1
].
colId
+
1
;
}
...
...
@@ -359,7 +363,7 @@ int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUi
metaDropTableByUid
(
pMeta
,
uid
,
&
type
);
metaULock
(
pMeta
);
if
(
type
==
TSDB_CHILD_TABLE
&&
tbUids
)
{
if
(
(
type
==
TSDB_CHILD_TABLE
||
type
==
TSDB_NORMAL_TABLE
)
&&
tbUids
)
{
taosArrayPush
(
tbUids
,
&
uid
);
}
...
...
@@ -367,16 +371,57 @@ int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUi
return
0
;
}
int
metaTtlDropTable
(
SMeta
*
pMeta
,
int64_t
ttl
,
SArray
*
tbUids
)
{
metaWLock
(
pMeta
);
int
ret
=
metaTtlSmaller
(
pMeta
,
ttl
,
tbUids
);
if
(
ret
!=
0
){
return
ret
;
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
tbUids
);
++
i
)
{
tb_uid_t
*
uid
=
(
tb_uid_t
*
)
taosArrayGet
(
tbUids
,
i
);
metaDropTableByUid
(
pMeta
,
*
uid
,
NULL
);
}
metaULock
(
pMeta
);
return
0
;
}
static
void
metaBuildTtlIdxKey
(
STtlIdxKey
*
ttlKey
,
const
SMetaEntry
*
pME
){
int32_t
ttlDays
;
int64_t
ctime
;
if
(
pME
->
type
==
TSDB_CHILD_TABLE
)
{
ctime
=
pME
->
ctbEntry
.
ctime
;
ttlDays
=
pME
->
ctbEntry
.
ttlDays
;
}
else
if
(
pME
->
type
==
TSDB_NORMAL_TABLE
)
{
ctime
=
pME
->
ntbEntry
.
ctime
;
ttlDays
=
pME
->
ntbEntry
.
ttlDays
;
}
else
{
ASSERT
(
0
);
}
if
(
ttlDays
<=
0
)
return
;
ttlKey
->
dtime
=
ctime
/
1000
+
ttlDays
*
24
*
60
*
60
;
// ttlKey->dtime = ctime / 1000 + ttlDays;
ttlKey
->
uid
=
pME
->
uid
;
}
static
int
metaDeleteTtlIdx
(
SMeta
*
pMeta
,
const
SMetaEntry
*
pME
)
{
STtlIdxKey
ttlKey
=
{
0
};
metaBuildTtlIdxKey
(
&
ttlKey
,
pME
);
if
(
ttlKey
.
dtime
==
0
)
return
0
;
return
tdbTbDelete
(
pMeta
->
pTtlIdx
,
&
ttlKey
,
sizeof
(
ttlKey
),
&
pMeta
->
txn
);
}
static
int
metaDropTableByUid
(
SMeta
*
pMeta
,
tb_uid_t
uid
,
int
*
type
)
{
void
*
pData
=
NULL
;
int
nData
=
0
;
int
rc
=
0
;
int64_t
version
;
SMetaEntry
e
=
{
0
};
SDecoder
dc
=
{
0
};
rc
=
tdbTbGet
(
pMeta
->
pUidIdx
,
&
uid
,
sizeof
(
uid
),
&
pData
,
&
nData
);
version
=
*
(
int64_t
*
)
pData
;
int64_t
version
=
*
(
int64_t
*
)
pData
;
tdbTbGet
(
pMeta
->
pTbDb
,
&
(
STbDbKey
){.
version
=
version
,
.
uid
=
uid
},
sizeof
(
STbDbKey
),
&
pData
,
&
nData
);
...
...
@@ -388,15 +433,17 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
tdbTbDelete
(
pMeta
->
pTbDb
,
&
(
STbDbKey
){.
version
=
version
,
.
uid
=
uid
},
sizeof
(
STbDbKey
),
&
pMeta
->
txn
);
tdbTbDelete
(
pMeta
->
pNameIdx
,
e
.
name
,
strlen
(
e
.
name
)
+
1
,
&
pMeta
->
txn
);
tdbTbDelete
(
pMeta
->
pUidIdx
,
&
uid
,
sizeof
(
uid
),
&
pMeta
->
txn
);
if
(
e
.
type
!=
TSDB_SUPER_TABLE
)
metaDeleteTtlIdx
(
pMeta
,
&
e
);
if
(
e
.
type
==
TSDB_CHILD_TABLE
)
{
tdbTbDelete
(
pMeta
->
pCtbIdx
,
&
(
SCtbIdxKey
){.
suid
=
e
.
ctbEntry
.
suid
,
.
uid
=
uid
},
sizeof
(
SCtbIdxKey
),
&
pMeta
->
txn
);
}
else
if
(
e
.
type
==
TSDB_NORMAL_TABLE
)
{
// drop schema.db (todo)
// drop ttl.idx (todo)
}
else
if
(
e
.
type
==
TSDB_SUPER_TABLE
)
{
// drop schema.db (todo)
}
metaError
(
"ttl drop table:%s"
,
e
.
name
);
tDecoderClear
(
&
dc
);
tdbFree
(
pData
);
...
...
@@ -545,16 +592,20 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
metaUpdateMetaRsp
(
uid
,
pAlterTbReq
->
tbName
,
pSchema
,
pMetaRsp
);
if
(
entry
.
pBuf
)
taosMemoryFree
(
entry
.
pBuf
);
if
(
pNewSchema
)
taosMemoryFree
(
pNewSchema
);
tDecoderClear
(
&
dc
);
tdbTbcClose
(
pTbDbc
);
tdbTbcClose
(
pUidIdxc
);
tDecoderClear
(
&
dc
);
return
0
;
_err:
tDecoderClear
(
&
dc
);
if
(
entry
.
pBuf
)
taosMemoryFree
(
entry
.
pBuf
);
tdbTbcClose
(
pTbDbc
);
tdbTbcClose
(
pUidIdxc
);
tDecoderClear
(
&
dc
);
return
-
1
;
}
...
...
@@ -706,8 +757,87 @@ _err:
}
static
int
metaUpdateTableOptions
(
SMeta
*
pMeta
,
int64_t
version
,
SVAlterTbReq
*
pAlterTbReq
)
{
// TODO
ASSERT
(
0
);
void
*
pVal
=
NULL
;
int
nVal
=
0
;
const
void
*
pData
=
NULL
;
int
nData
=
0
;
int
ret
=
0
;
tb_uid_t
uid
;
int64_t
oversion
;
SMetaEntry
entry
=
{
0
};
int
c
=
0
;
// search name index
ret
=
tdbTbGet
(
pMeta
->
pNameIdx
,
pAlterTbReq
->
tbName
,
strlen
(
pAlterTbReq
->
tbName
)
+
1
,
&
pVal
,
&
nVal
);
if
(
ret
<
0
)
{
terrno
=
TSDB_CODE_VND_TABLE_NOT_EXIST
;
return
-
1
;
}
uid
=
*
(
tb_uid_t
*
)
pVal
;
tdbFree
(
pVal
);
pVal
=
NULL
;
// search uid index
TBC
*
pUidIdxc
=
NULL
;
tdbTbcOpen
(
pMeta
->
pUidIdx
,
&
pUidIdxc
,
&
pMeta
->
txn
);
tdbTbcMoveTo
(
pUidIdxc
,
&
uid
,
sizeof
(
uid
),
&
c
);
ASSERT
(
c
==
0
);
tdbTbcGet
(
pUidIdxc
,
NULL
,
NULL
,
&
pData
,
&
nData
);
oversion
=
*
(
int64_t
*
)
pData
;
// search table.db
TBC
*
pTbDbc
=
NULL
;
tdbTbcOpen
(
pMeta
->
pTbDb
,
&
pTbDbc
,
&
pMeta
->
txn
);
tdbTbcMoveTo
(
pTbDbc
,
&
((
STbDbKey
){.
uid
=
uid
,
.
version
=
oversion
}),
sizeof
(
STbDbKey
),
&
c
);
ASSERT
(
c
==
0
);
tdbTbcGet
(
pTbDbc
,
NULL
,
NULL
,
&
pData
,
&
nData
);
// get table entry
SDecoder
dc
=
{
0
};
entry
.
pBuf
=
taosMemoryMalloc
(
nData
);
memcpy
(
entry
.
pBuf
,
pData
,
nData
);
tDecoderInit
(
&
dc
,
entry
.
pBuf
,
nData
);
ret
=
metaDecodeEntry
(
&
dc
,
&
entry
);
ASSERT
(
ret
==
0
);
entry
.
version
=
version
;
metaWLock
(
pMeta
);
// build SMetaEntry
if
(
entry
.
type
==
TSDB_CHILD_TABLE
)
{
if
(
pAlterTbReq
->
updateTTL
)
{
metaDeleteTtlIdx
(
pMeta
,
&
entry
);
entry
.
ctbEntry
.
ttlDays
=
pAlterTbReq
->
newTTL
;
metaUpdateTtlIdx
(
pMeta
,
&
entry
);
}
if
(
pAlterTbReq
->
newCommentLen
>=
0
)
{
entry
.
ctbEntry
.
commentLen
=
pAlterTbReq
->
newCommentLen
;
entry
.
ctbEntry
.
comment
=
pAlterTbReq
->
newComment
;
}
}
else
{
if
(
pAlterTbReq
->
updateTTL
)
{
metaDeleteTtlIdx
(
pMeta
,
&
entry
);
entry
.
ntbEntry
.
ttlDays
=
pAlterTbReq
->
newTTL
;
metaUpdateTtlIdx
(
pMeta
,
&
entry
);
}
if
(
pAlterTbReq
->
newCommentLen
>=
0
)
{
entry
.
ntbEntry
.
commentLen
=
pAlterTbReq
->
newCommentLen
;
entry
.
ntbEntry
.
comment
=
pAlterTbReq
->
newComment
;
}
}
// save to table db
metaSaveToTbDb
(
pMeta
,
&
entry
);
tdbTbcUpsert
(
pUidIdxc
,
&
entry
.
uid
,
sizeof
(
tb_uid_t
),
&
version
,
sizeof
(
version
),
0
);
metaULock
(
pMeta
);
tdbTbcClose
(
pTbDbc
);
tdbTbcClose
(
pUidIdxc
);
tDecoderClear
(
&
dc
);
if
(
entry
.
pBuf
)
taosMemoryFree
(
entry
.
pBuf
);
return
0
;
}
...
...
@@ -786,25 +916,9 @@ static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME) {
}
static
int
metaUpdateTtlIdx
(
SMeta
*
pMeta
,
const
SMetaEntry
*
pME
)
{
int32_t
ttlDays
;
int64_t
ctime
;
STtlIdxKey
ttlKey
;
if
(
pME
->
type
==
TSDB_CHILD_TABLE
)
{
ctime
=
pME
->
ctbEntry
.
ctime
;
ttlDays
=
pME
->
ctbEntry
.
ttlDays
;
}
else
if
(
pME
->
type
==
TSDB_NORMAL_TABLE
)
{
ctime
=
pME
->
ntbEntry
.
ctime
;
ttlDays
=
pME
->
ntbEntry
.
ttlDays
;
}
else
{
ASSERT
(
0
);
}
if
(
ttlDays
<=
0
)
return
0
;
ttlKey
.
dtime
=
ctime
+
ttlDays
*
24
*
60
*
60
;
ttlKey
.
uid
=
pME
->
uid
;
STtlIdxKey
ttlKey
=
{
0
};
metaBuildTtlIdxKey
(
&
ttlKey
,
pME
);
if
(
ttlKey
.
dtime
==
0
)
return
0
;
return
tdbTbInsert
(
pMeta
->
pTtlIdx
,
&
ttlKey
,
sizeof
(
ttlKey
),
NULL
,
0
,
&
pMeta
->
txn
);
}
...
...
source/dnode/vnode/src/vnd/vnodeSvr.c
浏览文件 @
0e905bb3
...
...
@@ -26,6 +26,7 @@ static int32_t vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *
static
int32_t
vnodeProcessAlterConfirmReq
(
SVnode
*
pVnode
,
int64_t
version
,
void
*
pReq
,
int32_t
len
,
SRpcMsg
*
pRsp
);
static
int32_t
vnodeProcessAlterHasnRangeReq
(
SVnode
*
pVnode
,
int64_t
version
,
void
*
pReq
,
int32_t
len
,
SRpcMsg
*
pRsp
);
static
int32_t
vnodeProcessWriteMsg
(
SVnode
*
pVnode
,
int64_t
version
,
SRpcMsg
*
pMsg
,
SRpcMsg
*
pRsp
);
static
int32_t
vnodeProcessDropTtlTbReq
(
SVnode
*
pVnode
,
int64_t
version
,
void
*
pReq
,
int32_t
len
,
SRpcMsg
*
pRsp
);
int32_t
vnodePreprocessReq
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
)
{
int32_t
code
=
0
;
...
...
@@ -105,7 +106,7 @@ int32_t vnodeProcessWriteReq(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
int32_t
len
;
int32_t
ret
;
v
Trace
(
"vgId:%d, start to process write request %s, index:%"
PRId64
,
TD_VID
(
pVnode
),
TMSG_INFO
(
pMsg
->
msgType
),
v
Error
(
"vgId:%d, start to process write request %s, index:%"
PRId64
,
TD_VID
(
pVnode
),
TMSG_INFO
(
pMsg
->
msgType
),
version
);
pVnode
->
state
.
applied
=
version
;
...
...
@@ -134,6 +135,9 @@ int32_t vnodeProcessWriteReq(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
case
TDMT_VND_DROP_TABLE
:
if
(
vnodeProcessDropTbReq
(
pVnode
,
version
,
pReq
,
len
,
pRsp
)
<
0
)
goto
_err
;
break
;
case
TDMT_VND_DROP_TTL_TABLE
:
if
(
vnodeProcessDropTtlTbReq
(
pVnode
,
version
,
pReq
,
len
,
pRsp
)
<
0
)
goto
_err
;
break
;
case
TDMT_VND_CREATE_SMA
:
{
if
(
vnodeProcessCreateTSmaReq
(
pVnode
,
version
,
pReq
,
len
,
pRsp
)
<
0
)
goto
_err
;
}
break
;
...
...
@@ -300,6 +304,26 @@ void vnodeUpdateMetaRsp(SVnode *pVnode, STableMetaRsp *pMetaRsp) {
pMetaRsp
->
precision
=
pVnode
->
config
.
tsdbCfg
.
precision
;
}
static
int32_t
vnodeProcessDropTtlTbReq
(
SVnode
*
pVnode
,
int64_t
version
,
void
*
pReq
,
int32_t
len
,
SRpcMsg
*
pRsp
){
SArray
*
tbUids
=
taosArrayInit
(
8
,
sizeof
(
int64_t
));
if
(
tbUids
==
NULL
)
return
TSDB_CODE_OUT_OF_MEMORY
;
int32_t
t
=
ntohl
(
*
(
int32_t
*
)
pReq
);
vError
(
"rec ttl time:%d"
,
t
);
int32_t
ret
=
metaTtlDropTable
(
pVnode
->
pMeta
,
t
,
tbUids
);
if
(
ret
!=
0
){
goto
end
;
}
if
(
taosArrayGetSize
(
tbUids
)
>
0
){
tqUpdateTbUidList
(
pVnode
->
pTq
,
tbUids
,
false
);
}
end:
taosArrayDestroy
(
tbUids
);
return
ret
;
}
static
int32_t
vnodeProcessCreateStbReq
(
SVnode
*
pVnode
,
int64_t
version
,
void
*
pReq
,
int32_t
len
,
SRpcMsg
*
pRsp
)
{
SVCreateStbReq
req
=
{
0
};
SDecoder
coder
;
...
...
source/libs/command/src/explain.c
浏览文件 @
0e905bb3
...
...
@@ -631,8 +631,8 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
QRY_ERR_RET
(
qExplainBufAppendExecInfo
(
pResNode
->
pExecInfo
,
tbuf
,
&
tlen
));
EXPLAIN_ROW_APPEND
(
EXPLAIN_BLANK_FORMAT
);
}
if
(
pIndefNode
->
p
Vector
Funcs
)
{
EXPLAIN_ROW_APPEND
(
EXPLAIN_FUNCTIONS_FORMAT
,
pIndefNode
->
p
Vector
Funcs
->
length
);
if
(
pIndefNode
->
pFuncs
)
{
EXPLAIN_ROW_APPEND
(
EXPLAIN_FUNCTIONS_FORMAT
,
pIndefNode
->
pFuncs
->
length
);
EXPLAIN_ROW_APPEND
(
EXPLAIN_BLANK_FORMAT
);
}
EXPLAIN_ROW_APPEND
(
EXPLAIN_WIDTH_FORMAT
,
pIndefNode
->
node
.
pOutputDataBlockDesc
->
totalRowSize
);
...
...
source/libs/executor/inc/executorimpl.h
浏览文件 @
0e905bb3
...
...
@@ -423,6 +423,7 @@ typedef struct SStreamFinalIntervalOperatorInfo {
SArray
*
pChildren
;
SSDataBlock
*
pUpdateRes
;
SPhysiNode
*
pPhyNode
;
// create new child
bool
isFinal
;
}
SStreamFinalIntervalOperatorInfo
;
typedef
struct
SAggOperatorInfo
{
...
...
@@ -547,14 +548,18 @@ typedef struct SStreamSessionAggOperatorInfo {
SGroupResInfo
groupResInfo
;
int64_t
gap
;
// session window gap
int32_t
primaryTsIndex
;
// primary timestamp slot id
int32_t
endTsIndex
;
// window end timestamp slot id
int32_t
order
;
// current SSDataBlock scan order
STimeWindowAggSupp
twAggSup
;
SSDataBlock
*
pWinBlock
;
// window result
SqlFunctionCtx
*
pDummyCtx
;
// for combine
SSDataBlock
*
pDelRes
;
SSDataBlock
*
pDelRes
;
// delete result
SSDataBlock
*
pUpdateRes
;
// update window
SHashObj
*
pStDeleted
;
void
*
pDelIterator
;
SArray
*
pChildren
;
// cache for children's result; final stream operator
SPhysiNode
*
pPhyNode
;
// create new child
bool
isFinal
;
}
SStreamSessionAggOperatorInfo
;
typedef
struct
STimeSliceOperatorInfo
{
...
...
@@ -813,10 +818,10 @@ int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order);
int32_t
initStreamAggSupporter
(
SStreamAggSupporter
*
pSup
,
const
char
*
pKey
,
SqlFunctionCtx
*
pCtx
,
int32_t
numOfOutput
,
int32_t
size
);
SResultRow
*
getNewResultRow
(
SDiskbasedBuf
*
pResultBuf
,
int64_t
tableGroupId
,
int32_t
interBufSize
);
SResultWindowInfo
*
getSessionTimeWindow
(
SStreamAggSupporter
*
pAggSup
,
TSKEY
ts
,
uint64_t
groupId
,
int64_t
gap
,
int32_t
*
pIndex
);
int32_t
updateSessionWindowInfo
(
SResultWindowInfo
*
pWinInfo
,
TSKEY
*
pTs
,
int32_t
rows
,
int32_t
start
,
int64_t
gap
,
SHashObj
*
pStDeleted
);
SResultWindowInfo
*
getSessionTimeWindow
(
SStreamAggSupporter
*
pAggSup
,
TSKEY
startTs
,
TSKEY
endTs
,
uint64_t
groupId
,
int64_t
gap
,
int32_t
*
pIndex
);
int32_t
updateSessionWindowInfo
(
SResultWindowInfo
*
pWinInfo
,
TSKEY
*
pStartTs
,
TSKEY
*
pEndTs
,
int32_t
rows
,
int32_t
start
,
int64_t
gap
,
SHashObj
*
pStDeleted
);
bool
functionNeedToExecute
(
SqlFunctionCtx
*
pCtx
);
int32_t
compareTimeWindow
(
const
void
*
p1
,
const
void
*
p2
,
const
void
*
param
);
...
...
source/libs/executor/src/executorimpl.c
浏览文件 @
0e905bb3
...
...
@@ -3716,7 +3716,7 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy
SIndefRowsFuncPhysiNode
*
pPhyNode
=
(
SIndefRowsFuncPhysiNode
*
)
pNode
;
int32_t
numOfExpr
=
0
;
SExprInfo
*
pExprInfo
=
createExprInfo
(
pPhyNode
->
p
Vector
Funcs
,
NULL
,
&
numOfExpr
);
SExprInfo
*
pExprInfo
=
createExprInfo
(
pPhyNode
->
pFuncs
,
NULL
,
&
numOfExpr
);
if
(
pPhyNode
->
pExprs
!=
NULL
)
{
SExprSupp
*
pSup1
=
&
pInfo
->
scalarSup
;
...
...
source/libs/executor/src/scanoperator.c
浏览文件 @
0e905bb3
...
...
@@ -706,11 +706,12 @@ static bool prepareDataScan(SStreamBlockScanInfo* pInfo) {
SStreamAggSupporter
*
pAggSup
=
pInfo
->
sessionSup
.
pStreamAggSup
;
int64_t
gap
=
pInfo
->
sessionSup
.
gap
;
int32_t
winIndex
=
0
;
SResultWindowInfo
*
pCurWin
=
getSessionTimeWindow
(
pAggSup
,
tsCols
[
pInfo
->
updateResIndex
],
pSDB
->
info
.
groupId
,
gap
,
&
winIndex
);
SResultWindowInfo
*
pCurWin
=
getSessionTimeWindow
(
pAggSup
,
tsCols
[
pInfo
->
updateResIndex
],
INT64_MIN
,
pSDB
->
info
.
groupId
,
gap
,
&
winIndex
);
win
=
pCurWin
->
win
;
pInfo
->
updateResIndex
+=
updateSessionWindowInfo
(
pCurWin
,
tsCols
,
pSDB
->
info
.
rows
,
pInfo
->
updateResIndex
,
gap
,
NULL
);
updateSessionWindowInfo
(
pCurWin
,
tsCols
,
NULL
,
pSDB
->
info
.
rows
,
pInfo
->
updateResIndex
,
gap
,
NULL
);
}
else
{
win
=
getActiveTimeWindow
(
NULL
,
&
dumyInfo
,
tsCols
[
pInfo
->
updateResIndex
],
&
pInfo
->
interval
,
pInfo
->
interval
.
precision
,
NULL
);
...
...
@@ -1368,12 +1369,6 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
6
);
colDataAppend
(
pColInfoData
,
numOfRows
,
(
char
*
)
&
vgId
,
false
);
// table comment
// todo: set the correct comment
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
8
);
colDataAppendNULL
(
pColInfoData
,
numOfRows
);
char
str
[
256
]
=
{
0
};
int32_t
tableType
=
pInfo
->
pCur
->
mr
.
me
.
type
;
if
(
tableType
==
TSDB_CHILD_TABLE
)
{
// create time
...
...
@@ -1390,11 +1385,25 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
colDataAppend
(
pColInfoData
,
numOfRows
,
(
char
*
)
&
mr
.
me
.
stbEntry
.
schemaRow
.
nCols
,
false
);
// super table name
STR_TO_VARSTR
(
str
,
mr
.
me
.
name
);
STR_TO_VARSTR
(
n
,
mr
.
me
.
name
);
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
4
);
colDataAppend
(
pColInfoData
,
numOfRows
,
str
,
false
);
colDataAppend
(
pColInfoData
,
numOfRows
,
n
,
false
);
metaReaderClear
(
&
mr
);
// table comment
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
8
);
if
(
pInfo
->
pCur
->
mr
.
me
.
ctbEntry
.
commentLen
>
0
)
{
char
comment
[
TSDB_TB_COMMENT_LEN
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_TO_VARSTR
(
comment
,
pInfo
->
pCur
->
mr
.
me
.
ctbEntry
.
comment
);
colDataAppend
(
pColInfoData
,
numOfRows
,
comment
,
false
);
}
else
if
(
pInfo
->
pCur
->
mr
.
me
.
ctbEntry
.
commentLen
==
0
)
{
char
comment
[
VARSTR_HEADER_SIZE
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_TO_VARSTR
(
comment
,
""
);
colDataAppend
(
pColInfoData
,
numOfRows
,
comment
,
false
);
}
else
{
colDataAppendNULL
(
pColInfoData
,
numOfRows
);
}
// uid
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
5
);
colDataAppend
(
pColInfoData
,
numOfRows
,
(
char
*
)
&
pInfo
->
pCur
->
mr
.
me
.
uid
,
false
);
...
...
@@ -1403,7 +1412,7 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
7
);
colDataAppend
(
pColInfoData
,
numOfRows
,
(
char
*
)
&
pInfo
->
pCur
->
mr
.
me
.
ctbEntry
.
ttlDays
,
false
);
STR_TO_VARSTR
(
str
,
"CHILD_TABLE"
);
STR_TO_VARSTR
(
n
,
"CHILD_TABLE"
);
}
else
if
(
tableType
==
TSDB_NORMAL_TABLE
)
{
// create time
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
2
);
...
...
@@ -1417,6 +1426,20 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
4
);
colDataAppendNULL
(
pColInfoData
,
numOfRows
);
// table comment
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
8
);
if
(
pInfo
->
pCur
->
mr
.
me
.
ntbEntry
.
commentLen
>
0
)
{
char
comment
[
TSDB_TB_COMMENT_LEN
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_TO_VARSTR
(
comment
,
pInfo
->
pCur
->
mr
.
me
.
ntbEntry
.
comment
);
colDataAppend
(
pColInfoData
,
numOfRows
,
comment
,
false
);
}
else
if
(
pInfo
->
pCur
->
mr
.
me
.
ntbEntry
.
commentLen
==
0
)
{
char
comment
[
VARSTR_HEADER_SIZE
+
VARSTR_HEADER_SIZE
]
=
{
0
};
STR_TO_VARSTR
(
comment
,
""
);
colDataAppend
(
pColInfoData
,
numOfRows
,
comment
,
false
);
}
else
{
colDataAppendNULL
(
pColInfoData
,
numOfRows
);
}
// uid
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
5
);
colDataAppend
(
pColInfoData
,
numOfRows
,
(
char
*
)
&
pInfo
->
pCur
->
mr
.
me
.
uid
,
false
);
...
...
@@ -1425,11 +1448,11 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
7
);
colDataAppend
(
pColInfoData
,
numOfRows
,
(
char
*
)
&
pInfo
->
pCur
->
mr
.
me
.
ntbEntry
.
ttlDays
,
false
);
STR_TO_VARSTR
(
str
,
"NORMAL_TABLE"
);
STR_TO_VARSTR
(
n
,
"NORMAL_TABLE"
);
}
pColInfoData
=
taosArrayGet
(
p
->
pDataBlock
,
9
);
colDataAppend
(
pColInfoData
,
numOfRows
,
str
,
false
);
colDataAppend
(
pColInfoData
,
numOfRows
,
n
,
false
);
if
(
++
numOfRows
>=
pOperator
->
resultInfo
.
capacity
)
{
break
;
...
...
source/libs/executor/src/timewindowoperator.c
浏览文件 @
0e905bb3
此差异已折叠。
点击以展开。
source/libs/function/inc/builtins.h
浏览文件 @
0e905bb3
...
...
@@ -24,22 +24,24 @@ extern "C" {
typedef
int32_t
(
*
FTranslateFunc
)(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
);
typedef
EFuncDataRequired
(
*
FFuncDataRequired
)(
SFunctionNode
*
pFunc
,
STimeWindow
*
pTimeWindow
);
typedef
int32_t
(
*
FCreateMergeFuncParameters
)(
SNodeList
*
pRawParameters
,
SNode
*
pPartialRes
,
SNodeList
**
pParameters
);
typedef
struct
SBuiltinFuncDefinition
{
const
char
*
name
;
EFunctionType
type
;
uint64_t
classification
;
FTranslateFunc
translateFunc
;
FFuncDataRequired
dataRequiredFunc
;
FExecGetEnv
getEnvFunc
;
FExecInit
initFunc
;
FExecProcess
processFunc
;
FScalarExecProcess
sprocessFunc
;
FExecFinalize
finalizeFunc
;
FExecProcess
invertFunc
;
FExecCombine
combineFunc
;
const
char
*
pPartialFunc
;
const
char
*
pMergeFunc
;
const
char
*
name
;
EFunctionType
type
;
uint64_t
classification
;
FTranslateFunc
translateFunc
;
FFuncDataRequired
dataRequiredFunc
;
FExecGetEnv
getEnvFunc
;
FExecInit
initFunc
;
FExecProcess
processFunc
;
FScalarExecProcess
sprocessFunc
;
FExecFinalize
finalizeFunc
;
FExecProcess
invertFunc
;
FExecCombine
combineFunc
;
const
char
*
pPartialFunc
;
const
char
*
pMergeFunc
;
FCreateMergeFuncParameters
createMergeParaFuc
;
}
SBuiltinFuncDefinition
;
extern
const
SBuiltinFuncDefinition
funcMgtBuiltins
[];
...
...
source/libs/function/inc/functionMgtInt.h
浏览文件 @
0e905bb3
...
...
@@ -51,8 +51,6 @@ extern "C" {
#define FUNC_UDF_ID_START 5000
extern
const
int
funcMgtUdfNum
;
#ifdef __cplusplus
}
#endif
...
...
source/libs/function/src/builtins.c
浏览文件 @
0e905bb3
...
...
@@ -419,6 +419,14 @@ static int32_t translateTopBot(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
return
TSDB_CODE_SUCCESS
;
}
int32_t
topCreateMergePara
(
SNodeList
*
pRawParameters
,
SNode
*
pPartialRes
,
SNodeList
**
pParameters
)
{
int32_t
code
=
nodesListMakeAppend
(
pParameters
,
pPartialRes
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListStrictAppend
(
*
pParameters
,
nodesCloneNode
(
nodesListGetNode
(
pRawParameters
,
1
)));
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
translateTopBotImpl
(
SFunctionNode
*
pFunc
,
char
*
pErrBuf
,
int32_t
len
,
bool
isPartial
)
{
int32_t
numOfParams
=
LIST_LENGTH
(
pFunc
->
pParameterList
);
...
...
@@ -1728,7 +1736,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
finalizeFunc
=
topBotFinalize
,
.
combineFunc
=
topCombine
,
.
pPartialFunc
=
"_top_partial"
,
.
pMergeFunc
=
"_top_merge"
.
pMergeFunc
=
"_top_merge"
,
// .createMergeParaFuc = topCreateMergePara
},
{
.
name
=
"_top_partial"
,
...
...
@@ -1872,7 +1881,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.
name
=
"interp"
,
.
type
=
FUNCTION_TYPE_INTERP
,
.
classification
=
FUNC_MGT_
AGG_FUNC
|
FUNC_MGT_
TIMELINE_FUNC
|
FUNC_MGT_INTERVAL_INTERPO_FUNC
,
.
classification
=
FUNC_MGT_TIMELINE_FUNC
|
FUNC_MGT_INTERVAL_INTERPO_FUNC
,
.
translateFunc
=
translateFirstLast
,
.
getEnvFunc
=
getSelectivityFuncEnv
,
.
initFunc
=
functionSetup
,
...
...
source/libs/function/src/builtinsimpl.c
浏览文件 @
0e905bb3
...
...
@@ -794,8 +794,8 @@ int32_t avgFunctionMerge(SqlFunctionCtx* pCtx) {
SAvgRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
SAvgRes
*
pInputInfo
=
(
SAvgRes
*
)
varDataVal
(
data
);
avgTransferInfo
(
pInputInfo
,
pInfo
);
...
...
@@ -908,9 +908,9 @@ int32_t avgFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t
avgPartialFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SAvgRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getAvgInfoSize
();
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
SAvgRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getAvgInfoSize
();
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
memcpy
(
varDataVal
(
res
),
pInfo
,
resultBytes
);
varDataSetLen
(
res
,
resultBytes
);
...
...
@@ -1418,7 +1418,7 @@ int32_t minmaxFunctionFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
void
setNullSelectivityValue
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
rowIndex
)
{
for
(
int32_t
j
=
0
;
j
<
pCtx
->
subsidiaries
.
num
;
++
j
)
{
SqlFunctionCtx
*
pc
=
pCtx
->
subsidiaries
.
pCtx
[
j
];
int32_t
dstSlotId
=
pc
->
pExpr
->
base
.
resSchema
.
slotId
;
int32_t
dstSlotId
=
pc
->
pExpr
->
base
.
resSchema
.
slotId
;
SColumnInfoData
*
pDstCol
=
taosArrayGet
(
pBlock
->
pDataBlock
,
dstSlotId
);
colDataAppendNULL
(
pDstCol
,
rowIndex
);
...
...
@@ -1663,8 +1663,8 @@ int32_t stddevFunctionMerge(SqlFunctionCtx* pCtx) {
SStddevRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
SStddevRes
*
pInputInfo
=
(
SStddevRes
*
)
varDataVal
(
data
);
stddevTransferInfo
(
pInputInfo
,
pInfo
);
...
...
@@ -1756,9 +1756,9 @@ int32_t stddevFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t
stddevPartialFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SStddevRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getStddevInfoSize
();
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
SStddevRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getStddevInfoSize
();
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
memcpy
(
varDataVal
(
res
),
pInfo
,
resultBytes
);
varDataSetLen
(
res
,
resultBytes
);
...
...
@@ -2360,12 +2360,10 @@ int32_t apercentileCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx)
return
TSDB_CODE_SUCCESS
;
}
int32_t
getFirstLastInfoSize
(
int32_t
resBytes
)
{
return
sizeof
(
SFirstLastRes
)
+
resBytes
+
sizeof
(
int64_t
);
}
int32_t
getFirstLastInfoSize
(
int32_t
resBytes
)
{
return
sizeof
(
SFirstLastRes
)
+
resBytes
+
sizeof
(
int64_t
);
}
bool
getFirstLastFuncEnv
(
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
)
{
SColumnNode
*
pNode
=
(
SColumnNode
*
)
nodesListGetNode
(
pFunc
->
pParameterList
,
0
);
SColumnNode
*
pNode
=
(
SColumnNode
*
)
nodesListGetNode
(
pFunc
->
pParameterList
,
0
);
pEnv
->
calcMemSize
=
sizeof
(
SFirstLastRes
)
+
pNode
->
node
.
resType
.
bytes
+
sizeof
(
int64_t
);
return
true
;
}
...
...
@@ -2390,14 +2388,14 @@ int32_t firstFunction(SqlFunctionCtx* pCtx) {
int32_t
numOfElems
=
0
;
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SFirstLastRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
SFirstLastRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
SInputColumnInfoData
*
pInput
=
&
pCtx
->
input
;
SColumnInfoData
*
pInputCol
=
pInput
->
pData
[
0
];
int32_t
type
=
pInputCol
->
info
.
type
;
int32_t
type
=
pInputCol
->
info
.
type
;
int32_t
bytes
=
pInputCol
->
info
.
bytes
;
pInfo
->
bytes
=
bytes
;
pInfo
->
bytes
=
bytes
;
// All null data column, return directly.
if
(
pInput
->
colDataAggIsSet
&&
(
pInput
->
pColumnDataAgg
[
0
]
->
numOfNull
==
pInput
->
totalRows
))
{
...
...
@@ -2488,14 +2486,14 @@ int32_t lastFunction(SqlFunctionCtx* pCtx) {
int32_t
numOfElems
=
0
;
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SFirstLastRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
SFirstLastRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
SInputColumnInfoData
*
pInput
=
&
pCtx
->
input
;
SColumnInfoData
*
pInputCol
=
pInput
->
pData
[
0
];
int32_t
type
=
pInputCol
->
info
.
type
;
int32_t
type
=
pInputCol
->
info
.
type
;
int32_t
bytes
=
pInputCol
->
info
.
bytes
;
pInfo
->
bytes
=
bytes
;
pInfo
->
bytes
=
bytes
;
// All null data column, return directly.
if
(
pInput
->
colDataAggIsSet
&&
(
pInput
->
pColumnDataAgg
[
0
]
->
numOfNull
==
pInput
->
totalRows
))
{
...
...
@@ -2567,8 +2565,8 @@ static void firstLastTransferInfo(SFirstLastRes* pInput, SFirstLastRes* pOutput,
return
;
}
pOutput
->
bytes
=
pInput
->
bytes
;
TSKEY
*
tsIn
=
(
TSKEY
*
)(
pInput
->
buf
+
pInput
->
bytes
);
TSKEY
*
tsOut
=
(
TSKEY
*
)(
pOutput
->
buf
+
pInput
->
bytes
);
TSKEY
*
tsIn
=
(
TSKEY
*
)(
pInput
->
buf
+
pInput
->
bytes
);
TSKEY
*
tsOut
=
(
TSKEY
*
)(
pOutput
->
buf
+
pInput
->
bytes
);
if
(
pOutput
->
hasResult
)
{
if
(
isFirst
)
{
if
(
*
tsIn
>
*
tsOut
)
{
...
...
@@ -2586,16 +2584,16 @@ static void firstLastTransferInfo(SFirstLastRes* pInput, SFirstLastRes* pOutput,
return
;
}
static
int32_t
firstLastFunctionMergeImpl
(
SqlFunctionCtx
*
pCtx
,
bool
isFirstQuery
)
{
static
int32_t
firstLastFunctionMergeImpl
(
SqlFunctionCtx
*
pCtx
,
bool
isFirstQuery
)
{
SInputColumnInfoData
*
pInput
=
&
pCtx
->
input
;
SColumnInfoData
*
pCol
=
pInput
->
pData
[
0
];
SColumnInfoData
*
pCol
=
pInput
->
pData
[
0
];
ASSERT
(
pCol
->
info
.
type
==
TSDB_DATA_TYPE_BINARY
);
SFirstLastRes
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
SFirstLastRes
*
pInputInfo
=
(
SFirstLastRes
*
)
varDataVal
(
data
);
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
SFirstLastRes
*
pInputInfo
=
(
SFirstLastRes
*
)
varDataVal
(
data
);
firstLastTransferInfo
(
pInputInfo
,
pInfo
,
isFirstQuery
);
...
...
@@ -2604,13 +2602,9 @@ static int32_t firstLastFunctionMergeImpl(SqlFunctionCtx *pCtx, bool isFirstQuer
return
TSDB_CODE_SUCCESS
;
}
int32_t
firstFunctionMerge
(
SqlFunctionCtx
*
pCtx
)
{
return
firstLastFunctionMergeImpl
(
pCtx
,
true
);
}
int32_t
firstFunctionMerge
(
SqlFunctionCtx
*
pCtx
)
{
return
firstLastFunctionMergeImpl
(
pCtx
,
true
);
}
int32_t
lastFunctionMerge
(
SqlFunctionCtx
*
pCtx
)
{
return
firstLastFunctionMergeImpl
(
pCtx
,
false
);
}
int32_t
lastFunctionMerge
(
SqlFunctionCtx
*
pCtx
)
{
return
firstLastFunctionMergeImpl
(
pCtx
,
false
);
}
int32_t
firstLastFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
int32_t
slotId
=
pCtx
->
pExpr
->
base
.
resSchema
.
slotId
;
...
...
@@ -2627,9 +2621,9 @@ int32_t firstLastFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t
firstLastPartialFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SResultRowEntryInfo
*
pEntryInfo
=
GET_RES_INFO
(
pCtx
);
SFirstLastRes
*
pRes
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getFirstLastInfoSize
(
pRes
->
bytes
);
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
SFirstLastRes
*
pRes
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getFirstLastInfoSize
(
pRes
->
bytes
);
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
memcpy
(
varDataVal
(
res
),
pRes
,
resultBytes
);
varDataSetLen
(
res
,
resultBytes
);
...
...
@@ -3369,8 +3363,8 @@ int32_t spreadFunctionMerge(SqlFunctionCtx* pCtx) {
SSpreadInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
int32_t
start
=
pInput
->
startRowIndex
;
char
*
data
=
colDataGetData
(
pCol
,
start
);
SSpreadInfo
*
pInputInfo
=
(
SSpreadInfo
*
)
varDataVal
(
data
);
spreadTransferInfo
(
pInputInfo
,
pInfo
);
...
...
@@ -3390,9 +3384,9 @@ int32_t spreadFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t
spreadPartialFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SSpreadInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getSpreadInfoSize
();
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
SSpreadInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
int32_t
resultBytes
=
getSpreadInfoSize
();
char
*
res
=
taosMemoryCalloc
(
resultBytes
+
VARSTR_HEADER_SIZE
,
sizeof
(
char
));
memcpy
(
varDataVal
(
res
),
pInfo
,
resultBytes
);
varDataSetLen
(
res
,
resultBytes
);
...
...
@@ -3484,8 +3478,8 @@ int32_t elapsedFunction(SqlFunctionCtx* pCtx) {
SColumnInfoData
*
pCol
=
pInput
->
pData
[
0
];
int32_t
start
=
pInput
->
startRowIndex
;
TSKEY
*
ptsList
=
(
int64_t
*
)
colDataGetData
(
pCol
,
0
);
int32_t
start
=
pInput
->
startRowIndex
;
TSKEY
*
ptsList
=
(
int64_t
*
)
colDataGetData
(
pCol
,
0
);
if
(
pCtx
->
order
==
TSDB_ORDER_DESC
)
{
if
(
pCtx
->
start
.
key
==
INT64_MIN
)
{
pInfo
->
max
=
...
...
@@ -5176,11 +5170,11 @@ int32_t blockDistFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
}
typedef
struct
SDerivInfo
{
double
prevValue
;
// previous value
TSKEY
prevTs
;
// previous timestamp
bool
ignoreNegative
;
// ignore the negative value
int64_t
tsWindow
;
// time window for derivative
bool
valueSet
;
// the value has been set already
double
prevValue
;
// previous value
TSKEY
prevTs
;
// previous timestamp
bool
ignoreNegative
;
// ignore the negative value
int64_t
tsWindow
;
// time window for derivative
bool
valueSet
;
// the value has been set already
}
SDerivInfo
;
bool
getDerivativeFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
)
{
...
...
@@ -5188,7 +5182,7 @@ bool getDerivativeFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
return
true
;
}
bool
derivativeFuncSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResInfo
)
{
bool
derivativeFuncSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResInfo
)
{
if
(
!
functionSetup
(
pCtx
,
pResInfo
))
{
return
false
;
// not initialized since it has been initialized
}
...
...
@@ -5196,25 +5190,25 @@ bool derivativeFuncSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
SDerivInfo
*
pDerivInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
pDerivInfo
->
ignoreNegative
=
pCtx
->
param
[
2
].
param
.
i
;
pDerivInfo
->
prevTs
=
-
1
;
pDerivInfo
->
prevTs
=
-
1
;
pDerivInfo
->
tsWindow
=
pCtx
->
param
[
1
].
param
.
i
;
pDerivInfo
->
valueSet
=
false
;
return
true
;
}
int32_t
derivativeFunction
(
SqlFunctionCtx
*
pCtx
)
{
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SDerivInfo
*
pDerivInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
int32_t
derivativeFunction
(
SqlFunctionCtx
*
pCtx
)
{
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SDerivInfo
*
pDerivInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
SInputColumnInfoData
*
pInput
=
&
pCtx
->
input
;
SColumnInfoData
*
pInputCol
=
pInput
->
pData
[
0
];
SColumnInfoData
*
pInputCol
=
pInput
->
pData
[
0
];
int32_t
numOfElems
=
0
;
int32_t
numOfElems
=
0
;
SColumnInfoData
*
pOutput
=
(
SColumnInfoData
*
)
pCtx
->
pOutput
;
SColumnInfoData
*
pTsOutput
=
pCtx
->
pTsOutput
;
int32_t
i
=
pInput
->
startRowIndex
;
TSKEY
*
tsList
=
(
int64_t
*
)
pInput
->
pPTS
->
pData
;
TSKEY
*
tsList
=
(
int64_t
*
)
pInput
->
pPTS
->
pData
;
double
v
=
0
;
...
...
@@ -5224,7 +5218,7 @@ int32_t derivativeFunction(SqlFunctionCtx *pCtx) {
continue
;
}
char
*
d
=
(
char
*
)
pInputCol
->
pData
+
pInputCol
->
info
.
bytes
*
i
;
char
*
d
=
(
char
*
)
pInputCol
->
pData
+
pInputCol
->
info
.
bytes
*
i
;
GET_TYPED_DATA
(
v
,
double
,
pInputCol
->
info
.
type
,
d
);
int32_t
pos
=
pCtx
->
offset
+
numOfElems
;
...
...
@@ -5251,7 +5245,7 @@ int32_t derivativeFunction(SqlFunctionCtx *pCtx) {
continue
;
}
char
*
d
=
(
char
*
)
pInputCol
->
pData
+
pInputCol
->
info
.
bytes
*
i
;
char
*
d
=
(
char
*
)
pInputCol
->
pData
+
pInputCol
->
info
.
bytes
*
i
;
GET_TYPED_DATA
(
v
,
double
,
pInputCol
->
info
.
type
,
d
);
int32_t
pos
=
pCtx
->
offset
+
numOfElems
;
...
...
@@ -5277,7 +5271,7 @@ int32_t derivativeFunction(SqlFunctionCtx *pCtx) {
return
numOfElems
;
}
int32_t
interpFunction
(
SqlFunctionCtx
*
pCtx
)
{
int32_t
interpFunction
(
SqlFunctionCtx
*
pCtx
)
{
#if 0
int32_t fillType = (int32_t) pCtx->param[2].i64;
//bool ascQuery = (pCtx->order == TSDB_ORDER_ASC);
...
...
source/libs/function/src/functionMgt.c
浏览文件 @
0e905bb3
...
...
@@ -70,11 +70,21 @@ int32_t fmFuncMgtInit() {
}
int32_t
fmGetFuncInfo
(
SFunctionNode
*
pFunc
,
char
*
pMsg
,
int32_t
msgLen
)
{
void
*
pVal
=
taosHashGet
(
gFunMgtService
.
pFuncNameHashTable
,
pFunc
->
functionName
,
strlen
(
pFunc
->
functionName
));
if
(
NULL
!=
pVal
)
{
pFunc
->
funcId
=
*
(
int32_t
*
)
pVal
;
pFunc
->
funcType
=
funcMgtBuiltins
[
pFunc
->
funcId
].
type
;
return
funcMgtBuiltins
[
pFunc
->
funcId
].
translateFunc
(
pFunc
,
pMsg
,
msgLen
);
if
(
NULL
!=
gFunMgtService
.
pFuncNameHashTable
)
{
void
*
pVal
=
taosHashGet
(
gFunMgtService
.
pFuncNameHashTable
,
pFunc
->
functionName
,
strlen
(
pFunc
->
functionName
));
if
(
NULL
!=
pVal
)
{
pFunc
->
funcId
=
*
(
int32_t
*
)
pVal
;
pFunc
->
funcType
=
funcMgtBuiltins
[
pFunc
->
funcId
].
type
;
return
funcMgtBuiltins
[
pFunc
->
funcId
].
translateFunc
(
pFunc
,
pMsg
,
msgLen
);
}
return
TSDB_CODE_FUNC_NOT_BUILTIN_FUNTION
;
}
for
(
int32_t
i
=
0
;
i
<
funcMgtBuiltinsNum
;
++
i
)
{
if
(
0
==
strcmp
(
funcMgtBuiltins
[
i
].
name
,
pFunc
->
functionName
))
{
pFunc
->
funcId
=
i
;
pFunc
->
funcType
=
funcMgtBuiltins
[
pFunc
->
funcId
].
type
;
return
funcMgtBuiltins
[
pFunc
->
funcId
].
translateFunc
(
pFunc
,
pMsg
,
msgLen
);
}
}
return
TSDB_CODE_FUNC_NOT_BUILTIN_FUNTION
;
}
...
...
@@ -169,6 +179,13 @@ bool fmIsForbidWindowFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId
bool
fmIsForbidGroupByFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_FORBID_GROUP_BY_FUNC
);
}
bool
fmIsInterpFunc
(
int32_t
funcId
)
{
if
(
funcId
<
0
||
funcId
>=
funcMgtBuiltinsNum
)
{
return
false
;
}
return
FUNCTION_TYPE_INTERP
==
funcMgtBuiltins
[
funcId
].
type
;
}
void
fmFuncMgtDestroy
()
{
void
*
m
=
gFunMgtService
.
pFuncNameHashTable
;
if
(
m
!=
NULL
&&
atomic_val_compare_exchange_ptr
((
void
**
)
&
gFunMgtService
.
pFuncNameHashTable
,
m
,
0
)
==
m
)
{
...
...
@@ -233,17 +250,7 @@ bool fmIsSameInOutType(int32_t funcId) {
static
int32_t
getFuncInfo
(
SFunctionNode
*
pFunc
)
{
char
msg
[
64
]
=
{
0
};
if
(
NULL
!=
gFunMgtService
.
pFuncNameHashTable
)
{
return
fmGetFuncInfo
(
pFunc
,
msg
,
sizeof
(
msg
));
}
for
(
int32_t
i
=
0
;
i
<
funcMgtBuiltinsNum
;
++
i
)
{
if
(
0
==
strcmp
(
funcMgtBuiltins
[
i
].
name
,
pFunc
->
functionName
))
{
pFunc
->
funcId
=
i
;
pFunc
->
funcType
=
funcMgtBuiltins
[
pFunc
->
funcId
].
type
;
return
funcMgtBuiltins
[
pFunc
->
funcId
].
translateFunc
(
pFunc
,
msg
,
sizeof
(
msg
));
}
}
return
TSDB_CODE_FUNC_NOT_BUILTIN_FUNTION
;
return
fmGetFuncInfo
(
pFunc
,
msg
,
sizeof
(
msg
));
}
static
SFunctionNode
*
createFunction
(
const
char
*
pName
,
SNodeList
*
pParameterList
)
{
...
...
@@ -261,14 +268,14 @@ static SFunctionNode* createFunction(const char* pName, SNodeList* pParameterLis
return
pFunc
;
}
static
S
Column
Node
*
createColumnByFunc
(
const
SFunctionNode
*
pFunc
)
{
static
SNode
*
createColumnByFunc
(
const
SFunctionNode
*
pFunc
)
{
SColumnNode
*
pCol
=
(
SColumnNode
*
)
nodesMakeNode
(
QUERY_NODE_COLUMN
);
if
(
NULL
==
pCol
)
{
return
NULL
;
}
strcpy
(
pCol
->
colName
,
pFunc
->
node
.
aliasName
);
pCol
->
node
.
resType
=
pFunc
->
node
.
resType
;
return
pCol
;
return
(
SNode
*
)
pCol
;
}
bool
fmIsDistExecFunc
(
int32_t
funcId
)
{
...
...
@@ -296,21 +303,47 @@ static int32_t createPartialFunction(const SFunctionNode* pSrcFunc, SFunctionNod
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
createMergeFuncPara
(
const
SFunctionNode
*
pSrcFunc
,
const
SFunctionNode
*
pPartialFunc
,
SNodeList
**
pParameterList
)
{
SNode
*
pRes
=
createColumnByFunc
(
pPartialFunc
);
if
(
NULL
!=
funcMgtBuiltins
[
pSrcFunc
->
funcId
].
createMergeParaFuc
)
{
return
funcMgtBuiltins
[
pSrcFunc
->
funcId
].
createMergeParaFuc
(
pSrcFunc
->
pParameterList
,
pRes
,
pParameterList
);
}
else
{
return
nodesListMakeStrictAppend
(
pParameterList
,
pRes
);
}
}
static
int32_t
createMergeFunction
(
const
SFunctionNode
*
pSrcFunc
,
const
SFunctionNode
*
pPartialFunc
,
SFunctionNode
**
pMergeFunc
)
{
SNodeList
*
pParameterList
=
NULL
;
nodesListMakeStrictAppend
(
&
pParameterList
,
(
SNode
*
)
createColumnByFunc
(
pPartialFunc
));
*
pMergeFunc
=
createFunction
(
funcMgtBuiltins
[
pSrcFunc
->
funcId
].
pMergeFunc
,
pParameterList
);
if
(
NULL
==
*
pMergeFunc
)
{
nodesDestroyList
(
pParameterList
);
return
TSDB_CODE_OUT_OF_MEMORY
;
SNodeList
*
pParameterList
=
NULL
;
SFunctionNode
*
pFunc
=
NULL
;
int32_t
code
=
createMergeFuncPara
(
pSrcFunc
,
pPartialFunc
,
&
pParameterList
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pFunc
=
createFunction
(
funcMgtBuiltins
[
pSrcFunc
->
funcId
].
pMergeFunc
,
pParameterList
);
if
(
NULL
==
pFunc
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
}
// overwrite function restype set by translate function
if
(
fmIsSameInOutType
(
pSrcFunc
->
funcId
))
{
(
*
pMergeFunc
)
->
node
.
resType
=
pSrcFunc
->
node
.
resType
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
// overwrite function restype set by translate function
if
(
fmIsSameInOutType
(
pSrcFunc
->
funcId
))
{
pFunc
->
node
.
resType
=
pSrcFunc
->
node
.
resType
;
}
strcpy
(
pFunc
->
node
.
aliasName
,
pSrcFunc
->
node
.
aliasName
);
}
strcpy
((
*
pMergeFunc
)
->
node
.
aliasName
,
pSrcFunc
->
node
.
aliasName
);
return
TSDB_CODE_SUCCESS
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pMergeFunc
=
pFunc
;
}
else
{
if
(
NULL
!=
pFunc
)
{
pFunc
->
pParameterList
=
NULL
;
nodesDestroyNode
((
SNode
*
)
pFunc
);
}
nodesDestroyList
(
pParameterList
);
}
return
code
;
}
int32_t
fmGetDistMethod
(
const
SFunctionNode
*
pFunc
,
SFunctionNode
**
pPartialFunc
,
SFunctionNode
**
pMergeFunc
)
{
...
...
source/libs/nodes/src/nodesCloneFuncs.c
浏览文件 @
0e905bb3
...
...
@@ -423,6 +423,7 @@ static SNode* logicWindowCopy(const SWindowLogicNode* pSrc, SWindowLogicNode* pD
COPY_SCALAR_FIELD
(
slidingUnit
);
COPY_SCALAR_FIELD
(
sessionGap
);
CLONE_NODE_FIELD
(
pTspk
);
CLONE_NODE_FIELD
(
pTsEnd
);
CLONE_NODE_FIELD
(
pStateExpr
);
COPY_SCALAR_FIELD
(
triggerType
);
COPY_SCALAR_FIELD
(
watermark
);
...
...
@@ -454,7 +455,15 @@ static SNode* logicPartitionCopy(const SPartitionLogicNode* pSrc, SPartitionLogi
static
SNode
*
logicIndefRowsFuncCopy
(
const
SIndefRowsFuncLogicNode
*
pSrc
,
SIndefRowsFuncLogicNode
*
pDst
)
{
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
CLONE_NODE_LIST_FIELD
(
pVectorFuncs
);
CLONE_NODE_LIST_FIELD
(
pFuncs
);
return
(
SNode
*
)
pDst
;
}
static
SNode
*
logicInterpFuncCopy
(
const
SInterpFuncLogicNode
*
pSrc
,
SInterpFuncLogicNode
*
pDst
)
{
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
CLONE_NODE_LIST_FIELD
(
pFuncs
);
COPY_OBJECT_FIELD
(
timeRange
,
sizeof
(
STimeWindow
));
COPY_SCALAR_FIELD
(
interval
);
return
(
SNode
*
)
pDst
;
}
...
...
@@ -522,6 +531,7 @@ static SNode* physiWindowCopy(const SWinodwPhysiNode* pSrc, SWinodwPhysiNode* pD
CLONE_NODE_LIST_FIELD
(
pExprs
);
CLONE_NODE_LIST_FIELD
(
pFuncs
);
CLONE_NODE_FIELD
(
pTspk
);
CLONE_NODE_FIELD
(
pTsEnd
);
COPY_SCALAR_FIELD
(
triggerType
);
COPY_SCALAR_FIELD
(
watermark
);
COPY_SCALAR_FIELD
(
filesFactor
);
...
...
@@ -668,6 +678,8 @@ SNode* nodesCloneNode(const SNode* pNode) {
return
logicPartitionCopy
((
const
SPartitionLogicNode
*
)
pNode
,
(
SPartitionLogicNode
*
)
pDst
);
case
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
:
return
logicIndefRowsFuncCopy
((
const
SIndefRowsFuncLogicNode
*
)
pNode
,
(
SIndefRowsFuncLogicNode
*
)
pDst
);
case
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
:
return
logicInterpFuncCopy
((
const
SInterpFuncLogicNode
*
)
pNode
,
(
SInterpFuncLogicNode
*
)
pDst
);
case
QUERY_NODE_LOGIC_SUBPLAN
:
return
logicSubplanCopy
((
const
SLogicSubplan
*
)
pNode
,
(
SLogicSubplan
*
)
pDst
);
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
...
...
source/libs/nodes/src/nodesCodeFuncs.c
浏览文件 @
0e905bb3
...
...
@@ -202,6 +202,8 @@ const char* nodesNodeName(ENodeType type) {
return
"LogicPartition"
;
case
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
:
return
"LogicIndefRowsFunc"
;
case
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
:
return
"LogicInterpFunc"
;
case
QUERY_NODE_LOGIC_SUBPLAN
:
return
"LogicSubplan"
;
case
QUERY_NODE_LOGIC_PLAN
:
...
...
@@ -258,6 +260,8 @@ const char* nodesNodeName(ENodeType type) {
return
"PhysiPartition"
;
case
QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC
:
return
"PhysiIndefRowsFunc"
;
case
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC
:
return
"PhysiInterpFunc"
;
case
QUERY_NODE_PHYSICAL_PLAN_DISPATCH
:
return
"PhysiDispatch"
;
case
QUERY_NODE_PHYSICAL_PLAN_INSERT
:
...
...
@@ -935,14 +939,14 @@ static int32_t jsonToLogicPartitionNode(const SJson* pJson, void* pObj) {
return
code
;
}
static
const
char
*
jkIndefRowsFuncLogicPlan
VectorFuncs
=
"Vector
Funcs"
;
static
const
char
*
jkIndefRowsFuncLogicPlan
Funcs
=
"
Funcs"
;
static
int32_t
logicIndefRowsFuncNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SIndefRowsFuncLogicNode
*
pNode
=
(
const
SIndefRowsFuncLogicNode
*
)
pObj
;
int32_t
code
=
logicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkIndefRowsFuncLogicPlan
VectorFuncs
,
pNode
->
pVector
Funcs
);
code
=
nodeListToJson
(
pJson
,
jkIndefRowsFuncLogicPlan
Funcs
,
pNode
->
p
Funcs
);
}
return
code
;
...
...
@@ -953,7 +957,52 @@ static int32_t jsonToLogicIndefRowsFuncNode(const SJson* pJson, void* pObj) {
int32_t
code
=
jsonToLogicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkIndefRowsFuncLogicPlanVectorFuncs
,
&
pNode
->
pVectorFuncs
);
code
=
jsonToNodeList
(
pJson
,
jkIndefRowsFuncLogicPlanFuncs
,
&
pNode
->
pFuncs
);
}
return
code
;
}
static
const
char
*
jkInterpFuncLogicPlanFuncs
=
"Funcs"
;
static
const
char
*
jkInterpFuncLogicPlanStartTime
=
"StartTime"
;
static
const
char
*
jkInterpFuncLogicPlanEndTime
=
"EndTime"
;
static
const
char
*
jkInterpFuncLogicPlanInterval
=
"Interval"
;
static
int32_t
logicInterpFuncNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SInterpFuncLogicNode
*
pNode
=
(
const
SInterpFuncLogicNode
*
)
pObj
;
int32_t
code
=
logicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkInterpFuncLogicPlanFuncs
,
pNode
->
pFuncs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkInterpFuncLogicPlanStartTime
,
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkInterpFuncLogicPlanEndTime
,
pNode
->
timeRange
.
ekey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkInterpFuncLogicPlanInterval
,
pNode
->
interval
);
}
return
code
;
}
static
int32_t
jsonToLogicInterpFuncNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SInterpFuncLogicNode
*
pNode
=
(
SInterpFuncLogicNode
*
)
pObj
;
int32_t
code
=
jsonToLogicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkInterpFuncLogicPlanFuncs
,
&
pNode
->
pFuncs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkInterpFuncLogicPlanStartTime
,
&
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkInterpFuncLogicPlanEndTime
,
&
pNode
->
timeRange
.
ekey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkInterpFuncLogicPlanInterval
,
&
pNode
->
interval
);
}
return
code
;
...
...
@@ -1784,6 +1833,7 @@ static int32_t jsonToPhysiSortNode(const SJson* pJson, void* pObj) {
static
const
char
*
jkWindowPhysiPlanExprs
=
"Exprs"
;
static
const
char
*
jkWindowPhysiPlanFuncs
=
"Funcs"
;
static
const
char
*
jkWindowPhysiPlanTsPk
=
"TsPk"
;
static
const
char
*
jkWindowPhysiPlanTsEnd
=
"TsEnd"
;
static
const
char
*
jkWindowPhysiPlanTriggerType
=
"TriggerType"
;
static
const
char
*
jkWindowPhysiPlanWatermark
=
"Watermark"
;
static
const
char
*
jkWindowPhysiPlanFilesFactor
=
"FilesFactor"
;
...
...
@@ -1801,6 +1851,9 @@ static int32_t physiWindowNodeToJson(const void* pObj, SJson* pJson) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkWindowPhysiPlanTsPk
,
nodeToJson
,
pNode
->
pTspk
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddObject
(
pJson
,
jkWindowPhysiPlanTsEnd
,
nodeToJson
,
pNode
->
pTsEnd
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkWindowPhysiPlanTriggerType
,
pNode
->
triggerType
);
}
...
...
@@ -1827,6 +1880,9 @@ static int32_t jsonToPhysiWindowNode(const SJson* pJson, void* pObj) {
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkWindowPhysiPlanTsPk
,
(
SNode
**
)
&
pNode
->
pTspk
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeObject
(
pJson
,
jkWindowPhysiPlanTsEnd
,
(
SNode
**
)
&
pNode
->
pTsEnd
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
tjsonGetNumberValue
(
pJson
,
jkWindowPhysiPlanTriggerType
,
pNode
->
triggerType
,
code
);
;
...
...
@@ -2042,7 +2098,7 @@ static int32_t jsonToPhysiPartitionNode(const SJson* pJson, void* pObj) {
}
static
const
char
*
jkIndefRowsFuncPhysiPlanExprs
=
"Exprs"
;
static
const
char
*
jkIndefRowsFuncPhysiPlan
VectorFuncs
=
"Vector
Funcs"
;
static
const
char
*
jkIndefRowsFuncPhysiPlan
Funcs
=
"
Funcs"
;
static
int32_t
physiIndefRowsFuncNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SIndefRowsFuncPhysiNode
*
pNode
=
(
const
SIndefRowsFuncPhysiNode
*
)
pObj
;
...
...
@@ -2052,7 +2108,7 @@ static int32_t physiIndefRowsFuncNodeToJson(const void* pObj, SJson* pJson) {
code
=
nodeListToJson
(
pJson
,
jkIndefRowsFuncPhysiPlanExprs
,
pNode
->
pExprs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkIndefRowsFuncPhysiPlan
VectorFuncs
,
pNode
->
pVector
Funcs
);
code
=
nodeListToJson
(
pJson
,
jkIndefRowsFuncPhysiPlan
Funcs
,
pNode
->
p
Funcs
);
}
return
code
;
...
...
@@ -2066,7 +2122,59 @@ static int32_t jsonToPhysiIndefRowsFuncNode(const SJson* pJson, void* pObj) {
code
=
jsonToNodeList
(
pJson
,
jkIndefRowsFuncPhysiPlanExprs
,
&
pNode
->
pExprs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkIndefRowsFuncPhysiPlanVectorFuncs
,
&
pNode
->
pVectorFuncs
);
code
=
jsonToNodeList
(
pJson
,
jkIndefRowsFuncPhysiPlanFuncs
,
&
pNode
->
pFuncs
);
}
return
code
;
}
static
const
char
*
jkInterpFuncPhysiPlanExprs
=
"Exprs"
;
static
const
char
*
jkInterpFuncPhysiPlanFuncs
=
"Funcs"
;
static
const
char
*
jkInterpFuncPhysiPlanStartTime
=
"StartTime"
;
static
const
char
*
jkInterpFuncPhysiPlanEndTime
=
"EndTime"
;
static
const
char
*
jkInterpFuncPhysiPlanInterval
=
"Interval"
;
static
int32_t
physiInterpFuncNodeToJson
(
const
void
*
pObj
,
SJson
*
pJson
)
{
const
SInterpFuncPhysiNode
*
pNode
=
(
const
SInterpFuncPhysiNode
*
)
pObj
;
int32_t
code
=
physicPlanNodeToJson
(
pObj
,
pJson
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkInterpFuncPhysiPlanExprs
,
pNode
->
pExprs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodeListToJson
(
pJson
,
jkInterpFuncPhysiPlanFuncs
,
pNode
->
pFuncs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkInterpFuncPhysiPlanStartTime
,
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkInterpFuncPhysiPlanEndTime
,
pNode
->
timeRange
.
ekey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonAddIntegerToObject
(
pJson
,
jkInterpFuncPhysiPlanInterval
,
pNode
->
interval
);
}
return
code
;
}
static
int32_t
jsonToPhysiInterpFuncNode
(
const
SJson
*
pJson
,
void
*
pObj
)
{
SInterpFuncPhysiNode
*
pNode
=
(
SInterpFuncPhysiNode
*
)
pObj
;
int32_t
code
=
jsonToPhysicPlanNode
(
pJson
,
pObj
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkInterpFuncPhysiPlanExprs
,
&
pNode
->
pExprs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
jsonToNodeList
(
pJson
,
jkInterpFuncPhysiPlanFuncs
,
&
pNode
->
pFuncs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkInterpFuncPhysiPlanStartTime
,
&
pNode
->
timeRange
.
skey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkInterpFuncPhysiPlanEndTime
,
&
pNode
->
timeRange
.
ekey
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
tjsonGetBigIntValue
(
pJson
,
jkInterpFuncPhysiPlanInterval
,
&
pNode
->
interval
);
}
return
code
;
...
...
@@ -3968,6 +4076,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
return
logicPartitionNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
:
return
logicIndefRowsFuncNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
:
return
logicInterpFuncNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_LOGIC_SUBPLAN
:
return
logicSubplanToJson
(
pObj
,
pJson
);
case
QUERY_NODE_LOGIC_PLAN
:
...
...
@@ -4013,6 +4123,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
return
physiPartitionNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC
:
return
physiIndefRowsFuncNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC
:
return
physiInterpFuncNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_DISPATCH
:
return
physiDispatchNodeToJson
(
pObj
,
pJson
);
case
QUERY_NODE_PHYSICAL_PLAN_INSERT
:
...
...
@@ -4104,6 +4216,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
return
jsonToLogicPartitionNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
:
return
jsonToLogicIndefRowsFuncNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
:
return
jsonToLogicInterpFuncNode
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_SUBPLAN
:
return
jsonToLogicSubplan
(
pJson
,
pObj
);
case
QUERY_NODE_LOGIC_PLAN
:
...
...
@@ -4149,6 +4263,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
return
jsonToPhysiPartitionNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC
:
return
jsonToPhysiIndefRowsFuncNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC
:
return
jsonToPhysiInterpFuncNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_DISPATCH
:
return
jsonToPhysiDispatchNode
(
pJson
,
pObj
);
case
QUERY_NODE_PHYSICAL_PLAN_DELETE
:
...
...
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
0e905bb3
...
...
@@ -250,6 +250,8 @@ SNode* nodesMakeNode(ENodeType type) {
return
makeNode
(
type
,
sizeof
(
SPartitionLogicNode
));
case
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
:
return
makeNode
(
type
,
sizeof
(
SIndefRowsFuncLogicNode
));
case
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
:
return
makeNode
(
type
,
sizeof
(
SInterpFuncLogicNode
));
case
QUERY_NODE_LOGIC_SUBPLAN
:
return
makeNode
(
type
,
sizeof
(
SLogicSubplan
));
case
QUERY_NODE_LOGIC_PLAN
:
...
...
@@ -308,6 +310,8 @@ SNode* nodesMakeNode(ENodeType type) {
return
makeNode
(
type
,
sizeof
(
SPartitionPhysiNode
));
case
QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC
:
return
makeNode
(
type
,
sizeof
(
SIndefRowsFuncPhysiNode
));
case
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC
:
return
makeNode
(
type
,
sizeof
(
SInterpFuncLogicNode
));
case
QUERY_NODE_PHYSICAL_PLAN_DISPATCH
:
return
makeNode
(
type
,
sizeof
(
SDataDispatcherNode
));
case
QUERY_NODE_PHYSICAL_PLAN_INSERT
:
...
...
@@ -352,6 +356,7 @@ static void destroyWinodwPhysiNode(SWinodwPhysiNode* pNode) {
nodesDestroyList
(
pNode
->
pExprs
);
nodesDestroyList
(
pNode
->
pFuncs
);
nodesDestroyNode
(
pNode
->
pTspk
);
nodesDestroyNode
(
pNode
->
pTsEnd
);
}
static
void
destroyScanPhysiNode
(
SScanPhysiNode
*
pNode
)
{
...
...
@@ -525,6 +530,7 @@ void nodesDestroyNode(SNode* pNode) {
SCreateSubTableClause
*
pStmt
=
(
SCreateSubTableClause
*
)
pNode
;
nodesDestroyList
(
pStmt
->
pSpecificTags
);
nodesDestroyList
(
pStmt
->
pValsOfTags
);
nodesDestroyNode
((
SNode
*
)
pStmt
->
pOptions
);
break
;
}
case
QUERY_NODE_CREATE_MULTI_TABLE_STMT
:
...
...
@@ -718,6 +724,7 @@ void nodesDestroyNode(SNode* pNode) {
destroyLogicNode
((
SLogicNode
*
)
pLogicNode
);
nodesDestroyList
(
pLogicNode
->
pFuncs
);
nodesDestroyNode
(
pLogicNode
->
pTspk
);
nodesDestroyNode
(
pLogicNode
->
pTsEnd
);
break
;
}
case
QUERY_NODE_LOGIC_PLAN_FILL
:
{
...
...
@@ -742,7 +749,13 @@ void nodesDestroyNode(SNode* pNode) {
case
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
:
{
SIndefRowsFuncLogicNode
*
pLogicNode
=
(
SIndefRowsFuncLogicNode
*
)
pNode
;
destroyLogicNode
((
SLogicNode
*
)
pLogicNode
);
nodesDestroyList
(
pLogicNode
->
pVectorFuncs
);
nodesDestroyList
(
pLogicNode
->
pFuncs
);
break
;
}
case
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
:
{
SInterpFuncLogicNode
*
pLogicNode
=
(
SInterpFuncLogicNode
*
)
pNode
;
destroyLogicNode
((
SLogicNode
*
)
pLogicNode
);
nodesDestroyList
(
pLogicNode
->
pFuncs
);
break
;
}
case
QUERY_NODE_LOGIC_SUBPLAN
:
{
...
...
@@ -845,7 +858,14 @@ void nodesDestroyNode(SNode* pNode) {
SIndefRowsFuncPhysiNode
*
pPhyNode
=
(
SIndefRowsFuncPhysiNode
*
)
pNode
;
destroyPhysiNode
((
SPhysiNode
*
)
pPhyNode
);
nodesDestroyList
(
pPhyNode
->
pExprs
);
nodesDestroyList
(
pPhyNode
->
pVectorFuncs
);
nodesDestroyList
(
pPhyNode
->
pFuncs
);
break
;
}
case
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC
:
{
SInterpFuncPhysiNode
*
pPhyNode
=
(
SInterpFuncPhysiNode
*
)
pNode
;
destroyPhysiNode
((
SPhysiNode
*
)
pPhyNode
);
nodesDestroyList
(
pPhyNode
->
pExprs
);
nodesDestroyList
(
pPhyNode
->
pFuncs
);
break
;
}
case
QUERY_NODE_PHYSICAL_PLAN_DISPATCH
:
...
...
source/libs/parser/inc/parAst.h
浏览文件 @
0e905bb3
...
...
@@ -109,6 +109,7 @@ SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode
SNode
*
pFill
);
SNode
*
createFillNode
(
SAstCreateContext
*
pCxt
,
EFillMode
mode
,
SNode
*
pValues
);
SNode
*
createGroupingSetNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
);
SNode
*
createInterpTimeRange
(
SAstCreateContext
*
pCxt
,
SNode
*
pStart
,
SNode
*
pEnd
);
SNode
*
addWhereClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pWhere
);
SNode
*
addPartitionByClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNodeList
*
pPartitionByList
);
...
...
@@ -118,6 +119,9 @@ SNode* addHavingClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pHaving);
SNode
*
addOrderByClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNodeList
*
pOrderByList
);
SNode
*
addSlimitClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pSlimit
);
SNode
*
addLimitClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pLimit
);
SNode
*
addRangeClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pRange
);
SNode
*
addEveryClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pEvery
);
SNode
*
addFillClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pFill
);
SNode
*
createSelectStmt
(
SAstCreateContext
*
pCxt
,
bool
isDistinct
,
SNodeList
*
pProjectionList
,
SNode
*
pTable
);
SNode
*
createSetOperator
(
SAstCreateContext
*
pCxt
,
ESetOperatorType
type
,
SNode
*
pLeft
,
SNode
*
pRight
);
...
...
source/libs/parser/inc/sql.y
浏览文件 @
0e905bb3
...
...
@@ -791,7 +791,7 @@ join_type(A) ::= INNER.
/************************************************ query_specification *************************************************/
query_specification(A) ::=
SELECT set_quantifier_opt(B) select_list(C) from_clause(D) where_clause_opt(E)
partition_by_clause_opt(F)
twindow_clause_opt(G)
partition_by_clause_opt(F)
range_opt(J) every_opt(K) fill_opt(L) twindow_clause_opt(G)
group_by_clause_opt(H) having_clause_opt(I). {
A = createSelectStmt(pCxt, B, C, D);
A = addWhereClause(pCxt, A, E);
...
...
@@ -799,6 +799,9 @@ query_specification(A) ::=
A = addWindowClauseClause(pCxt, A, G);
A = addGroupByClause(pCxt, A, H);
A = addHavingClause(pCxt, A, I);
A = addRangeClause(pCxt, A, J);
A = addEveryClause(pCxt, A, K);
A = addFillClause(pCxt, A, L);
}
%type set_quantifier_opt { bool }
...
...
@@ -860,14 +863,20 @@ fill_mode(A) ::= NEXT.
group_by_clause_opt(A) ::= . { A = NULL; }
group_by_clause_opt(A) ::= GROUP BY group_by_list(B). { A = B; }
%type group_by_list { SNodeList* }
%destructor group_by_list { nodesDestroyList($$); }
group_by_list(A) ::= expression(B). { A = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, B))); }
group_by_list(A) ::= group_by_list(B) NK_COMMA expression(C). { A = addNodeToList(pCxt, B, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, C))); }
%type group_by_list
{ SNodeList* }
%destructor group_by_list
{ nodesDestroyList($$); }
group_by_list(A) ::= expression(B).
{ A = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, B))); }
group_by_list(A) ::= group_by_list(B) NK_COMMA expression(C).
{ A = addNodeToList(pCxt, B, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, C))); }
having_clause_opt(A) ::= . { A = NULL; }
having_clause_opt(A) ::= HAVING search_condition(B). { A = B; }
range_opt(A) ::= . { A = NULL; }
range_opt(A) ::= RANGE NK_LP expression(B) NK_COMMA expression(C) NK_RP. { A = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C)); }
every_opt(A) ::= . { A = NULL; }
every_opt(A) ::= EVERY NK_LP duration_literal(B) NK_RP. { A = releaseRawExprNode(pCxt, B); }
/************************************************ query_expression ****************************************************/
query_expression(A) ::=
query_expression_body(B)
...
...
source/libs/parser/src/parAstCreater.c
浏览文件 @
0e905bb3
...
...
@@ -599,6 +599,11 @@ SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode) {
return
(
SNode
*
)
groupingSet
;
}
SNode
*
createInterpTimeRange
(
SAstCreateContext
*
pCxt
,
SNode
*
pStart
,
SNode
*
pEnd
)
{
CHECK_PARSER_STATUS
(
pCxt
);
return
createBetweenAnd
(
pCxt
,
createPrimaryKeyCol
(
pCxt
),
pStart
,
pEnd
);
}
SNode
*
setProjectionAlias
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
,
const
SToken
*
pAlias
)
{
CHECK_PARSER_STATUS
(
pCxt
);
int32_t
len
=
TMIN
(
sizeof
(((
SExprNode
*
)
pNode
)
->
aliasName
)
-
1
,
pAlias
->
n
);
...
...
@@ -671,6 +676,32 @@ SNode* addLimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pLimit) {
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pLimit
=
(
SLimitNode
*
)
pLimit
;
}
else
{
((
SSetOperator
*
)
pStmt
)
->
pLimit
=
pLimit
;
}
return
pStmt
;
}
SNode
*
addRangeClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pRange
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pRange
=
pRange
;
}
return
pStmt
;
}
SNode
*
addEveryClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pEvery
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pEvery
=
pEvery
;
}
return
pStmt
;
}
SNode
*
addFillClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pFill
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pFill
=
pFill
;
}
return
pStmt
;
}
...
...
@@ -878,6 +909,7 @@ SNode* createDefaultTableOptions(SAstCreateContext* pCxt) {
pOptions
->
watermark1
=
TSDB_DEFAULT_ROLLUP_WATERMARK
;
pOptions
->
watermark2
=
TSDB_DEFAULT_ROLLUP_WATERMARK
;
pOptions
->
ttl
=
TSDB_DEFAULT_TABLE_TTL
;
pOptions
->
commentNull
=
true
;
// mark null
return
(
SNode
*
)
pOptions
;
}
...
...
@@ -886,6 +918,7 @@ SNode* createAlterTableOptions(SAstCreateContext* pCxt) {
STableOptions
*
pOptions
=
(
STableOptions
*
)
nodesMakeNode
(
QUERY_NODE_TABLE_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
ttl
=
-
1
;
pOptions
->
commentNull
=
true
;
// mark null
return
(
SNode
*
)
pOptions
;
}
...
...
@@ -894,6 +927,7 @@ SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType
switch
(
type
)
{
case
TABLE_OPTION_COMMENT
:
if
(
checkComment
(
pCxt
,
(
SToken
*
)
pVal
,
true
))
{
((
STableOptions
*
)
pOptions
)
->
commentNull
=
false
;
COPY_STRING_FORM_STR_TOKEN
(((
STableOptions
*
)
pOptions
)
->
comment
,
(
SToken
*
)
pVal
);
}
break
;
...
...
@@ -906,9 +940,15 @@ SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType
case
TABLE_OPTION_ROLLUP
:
((
STableOptions
*
)
pOptions
)
->
pRollupFuncs
=
pVal
;
break
;
case
TABLE_OPTION_TTL
:
((
STableOptions
*
)
pOptions
)
->
ttl
=
taosStr2Int32
(((
SToken
*
)
pVal
)
->
z
,
NULL
,
10
);
case
TABLE_OPTION_TTL
:{
int64_t
ttl
=
taosStr2Int64
(((
SToken
*
)
pVal
)
->
z
,
NULL
,
10
);
if
(
ttl
>
INT32_MAX
){
ttl
=
INT32_MAX
;
}
// ttl can not be smaller than 0, because there is a limitation in sql.y (TTL NK_INTEGER)
((
STableOptions
*
)
pOptions
)
->
ttl
=
ttl
;
break
;
}
case
TABLE_OPTION_SMA
:
((
STableOptions
*
)
pOptions
)
->
pSma
=
pVal
;
break
;
...
...
@@ -971,9 +1011,9 @@ SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists, SN
pStmt
->
ignoreExists
=
ignoreExists
;
pStmt
->
pSpecificTags
=
pSpecificTags
;
pStmt
->
pValsOfTags
=
pValsOfTags
;
pStmt
->
pOptions
=
(
STableOptions
*
)
pOptions
;
nodesDestroyNode
(
pRealTable
);
nodesDestroyNode
(
pUseRealTable
);
nodesDestroyNode
(
pOptions
);
return
(
SNode
*
)
pStmt
;
}
...
...
source/libs/parser/src/parInsert.c
浏览文件 @
0e905bb3
...
...
@@ -803,6 +803,7 @@ static void buildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, STag* pTa
pTbReq
->
name
=
strdup
(
tname
);
pTbReq
->
ctb
.
suid
=
suid
;
pTbReq
->
ctb
.
pTag
=
(
uint8_t
*
)
pTag
;
pTbReq
->
commentLen
=
-
1
;
return
;
}
...
...
source/libs/parser/src/parTokenizer.c
浏览文件 @
0e905bb3
...
...
@@ -81,6 +81,7 @@ static SKeyword keywordTable[] = {
{
"DURATION"
,
TK_DURATION
},
{
"EXISTS"
,
TK_EXISTS
},
{
"EXPLAIN"
,
TK_EXPLAIN
},
{
"EVERY"
,
TK_EVERY
},
{
"FILL"
,
TK_FILL
},
{
"FIRST"
,
TK_FIRST
},
{
"FLOAT"
,
TK_FLOAT
},
...
...
@@ -152,6 +153,7 @@ static SKeyword keywordTable[] = {
{
"QTIME"
,
TK_QTIME
},
{
"QUERIES"
,
TK_QUERIES
},
{
"QUERY"
,
TK_QUERY
},
{
"RANGE"
,
TK_RANGE
},
{
"RATIO"
,
TK_RATIO
},
{
"READ"
,
TK_READ
},
{
"REDISTRIBUTE"
,
TK_REDISTRIBUTE
},
...
...
@@ -258,7 +260,6 @@ static SKeyword keywordTable[] = {
// {"LP", TK_LP},
// {"RP", TK_RP},
// {"COMMA", TK_COMMA},
// {"EVERY", TK_EVERY},
// {"VARIABLE", TK_VARIABLE},
// {"UPDATE", TK_UPDATE},
// {"CHANGE", TK_CHANGE},
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
0e905bb3
...
...
@@ -1157,6 +1157,7 @@ static void setFuncClassification(SSelectStmt* pSelect, SFunctionNode* pFunc) {
pSelect
->
hasIndefiniteRowsFunc
=
pSelect
->
hasIndefiniteRowsFunc
?
true
:
fmIsIndefiniteRowsFunc
(
pFunc
->
funcId
);
pSelect
->
hasUniqueFunc
=
pSelect
->
hasUniqueFunc
?
true
:
(
FUNCTION_TYPE_UNIQUE
==
pFunc
->
funcType
);
pSelect
->
hasTailFunc
=
pSelect
->
hasTailFunc
?
true
:
(
FUNCTION_TYPE_TAIL
==
pFunc
->
funcType
);
pSelect
->
hasInterpFunc
=
pSelect
->
hasInterpFunc
?
true
:
(
FUNCTION_TYPE_INTERP
==
pFunc
->
funcType
);
}
}
...
...
@@ -3147,9 +3148,6 @@ static int32_t checkCreateTable(STranslateContext* pCxt, SCreateTableStmt* pStmt
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkTableRollupOption
(
pCxt
,
pStmt
->
pOptions
->
pRollupFuncs
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkRangeOption
(
pCxt
,
"ttl"
,
pStmt
->
pOptions
->
ttl
,
TSDB_MIN_TABLE_TTL
,
INT32_MAX
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkTableSmaOption
(
pCxt
,
pStmt
);
}
...
...
@@ -3390,17 +3388,19 @@ static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStm
pReq
->
delay2
=
pStmt
->
pOptions
->
maxDelay2
;
pReq
->
watermark1
=
pStmt
->
pOptions
->
watermark1
;
pReq
->
watermark2
=
pStmt
->
pOptions
->
watermark2
;
pReq
->
ttl
=
pStmt
->
pOptions
->
ttl
;
//
pReq->ttl = pStmt->pOptions->ttl;
columnDefNodeToField
(
pStmt
->
pCols
,
&
pReq
->
pColumns
);
columnDefNodeToField
(
pStmt
->
pTags
,
&
pReq
->
pTags
);
pReq
->
numOfColumns
=
LIST_LENGTH
(
pStmt
->
pCols
);
pReq
->
numOfTags
=
LIST_LENGTH
(
pStmt
->
pTags
);
if
(
'\0'
!=
pStmt
->
pOptions
->
comment
[
0
])
{
if
(
pStmt
->
pOptions
->
commentNull
==
false
)
{
pReq
->
comment
=
strdup
(
pStmt
->
pOptions
->
comment
);
if
(
NULL
==
pReq
->
comment
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pReq
->
commentLen
=
strlen
(
pStmt
->
pOptions
->
comment
)
+
1
;
pReq
->
commentLen
=
strlen
(
pStmt
->
pOptions
->
comment
);
}
else
{
pReq
->
commentLen
=
-
1
;
}
SName
tableName
;
...
...
@@ -3452,14 +3452,17 @@ static int32_t buildAlterSuperTableReq(STranslateContext* pCxt, SAlterTableStmt*
pAlterReq
->
alterType
=
pStmt
->
alterType
;
if
(
TSDB_ALTER_TABLE_UPDATE_OPTIONS
==
pStmt
->
alterType
)
{
pAlterReq
->
ttl
=
pStmt
->
pOptions
->
ttl
;
if
(
'\0'
!=
pStmt
->
pOptions
->
comment
[
0
]
)
{
//
pAlterReq->ttl = pStmt->pOptions->ttl;
if
(
pStmt
->
pOptions
->
commentNull
==
false
)
{
pAlterReq
->
comment
=
strdup
(
pStmt
->
pOptions
->
comment
);
if
(
NULL
==
pAlterReq
->
comment
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pAlterReq
->
commentLen
=
strlen
(
pStmt
->
pOptions
->
comment
)
+
1
;
pAlterReq
->
commentLen
=
strlen
(
pStmt
->
pOptions
->
comment
);
}
else
{
pAlterReq
->
commentLen
=
-
1
;
}
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -4715,6 +4718,16 @@ static int32_t buildNormalTableBatchReq(int32_t acctId, const SCreateTableStmt*
SVCreateTbReq
req
=
{
0
};
req
.
type
=
TD_NORMAL_TABLE
;
req
.
name
=
strdup
(
pStmt
->
tableName
);
req
.
ttl
=
pStmt
->
pOptions
->
ttl
;
if
(
pStmt
->
pOptions
->
commentNull
==
false
)
{
req
.
comment
=
strdup
(
pStmt
->
pOptions
->
comment
);
if
(
NULL
==
req
.
comment
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
req
.
commentLen
=
strlen
(
pStmt
->
pOptions
->
comment
);
}
else
{
req
.
commentLen
=
-
1
;
}
req
.
ntb
.
schemaRow
.
nCols
=
LIST_LENGTH
(
pStmt
->
pCols
);
req
.
ntb
.
schemaRow
.
version
=
1
;
req
.
ntb
.
schemaRow
.
pSchema
=
taosMemoryCalloc
(
req
.
ntb
.
schemaRow
.
nCols
,
sizeof
(
SSchema
));
...
...
@@ -4865,6 +4878,13 @@ static void addCreateTbReqIntoVgroup(int32_t acctId, SHashObj* pVgroupHashmap, S
struct
SVCreateTbReq
req
=
{
0
};
req
.
type
=
TD_CHILD_TABLE
;
req
.
name
=
strdup
(
pStmt
->
tableName
);
req
.
ttl
=
pStmt
->
pOptions
->
ttl
;
if
(
pStmt
->
pOptions
->
commentNull
==
false
)
{
req
.
comment
=
strdup
(
pStmt
->
pOptions
->
comment
);
req
.
commentLen
=
strlen
(
pStmt
->
pOptions
->
comment
);
}
else
{
req
.
commentLen
=
-
1
;
}
req
.
ctb
.
suid
=
suid
;
req
.
ctb
.
pTag
=
(
uint8_t
*
)
pTag
;
if
(
pStmt
->
ignoreExists
)
{
...
...
@@ -5436,18 +5456,20 @@ static int32_t buildUpdateOptionsReq(STranslateContext* pCxt, SAlterTableStmt* p
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
-
1
!=
pStmt
->
pOptions
->
ttl
)
{
code
=
checkRangeOption
(
pCxt
,
"ttl"
,
pStmt
->
pOptions
->
ttl
,
TSDB_MIN_TABLE_TTL
,
INT32_MAX
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pReq
->
updateTTL
=
true
;
pReq
->
newTTL
=
pStmt
->
pOptions
->
ttl
;
}
pReq
->
updateTTL
=
true
;
pReq
->
newTTL
=
pStmt
->
pOptions
->
ttl
;
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
'\0'
!=
pStmt
->
pOptions
->
comment
[
0
])
{
pReq
->
updateComment
=
true
;
pReq
->
newComment
=
strdup
(
pStmt
->
pOptions
->
comment
);
if
(
NULL
==
pReq
->
newComment
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
if
(
TSDB_CODE_SUCCESS
==
code
){
if
(
pStmt
->
pOptions
->
commentNull
==
false
)
{
pReq
->
newComment
=
strdup
(
pStmt
->
pOptions
->
comment
);
if
(
NULL
==
pReq
->
newComment
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
pReq
->
newCommentLen
=
strlen
(
pReq
->
newComment
);
}
else
{
pReq
->
newCommentLen
=
-
1
;
}
}
...
...
@@ -5566,6 +5588,9 @@ static int32_t rewriteAlterTableImpl(STranslateContext* pCxt, SAlterTableStmt* p
pStmt
->
alterType
==
TSDB_ALTER_TABLE_UPDATE_TAG_BYTES
))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_ONLY_ONE_JSON_TAG
);
}
if
(
pStmt
->
alterType
==
TSDB_ALTER_TABLE_UPDATE_OPTIONS
&&
-
1
!=
pStmt
->
pOptions
->
ttl
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ALTER_TABLE
);
}
return
TSDB_CODE_SUCCESS
;
}
else
if
(
TSDB_CHILD_TABLE
!=
pTableMeta
->
tableType
&&
TSDB_NORMAL_TABLE
!=
pTableMeta
->
tableType
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ALTER_TABLE
);
...
...
source/libs/parser/src/sql.c
浏览文件 @
0e905bb3
此差异已折叠。
点击以展开。
source/libs/parser/test/parInitialATest.cpp
浏览文件 @
0e905bb3
...
...
@@ -121,10 +121,10 @@ TEST_F(ParserInitialATest, alterSTable) {
int32_t
len
=
snprintf
(
expect
.
name
,
sizeof
(
expect
.
name
),
"0.test.%s"
,
pTbname
);
expect
.
name
[
len
]
=
'\0'
;
expect
.
alterType
=
alterType
;
expect
.
ttl
=
ttl
;
//
expect.ttl = ttl;
if
(
nullptr
!=
pComment
)
{
expect
.
comment
=
strdup
(
pComment
);
expect
.
commentLen
=
strlen
(
pComment
)
+
1
;
expect
.
commentLen
=
strlen
(
pComment
);
}
expect
.
numOfFields
=
numOfFields
;
...
...
@@ -180,9 +180,9 @@ TEST_F(ParserInitialATest, alterSTable) {
tFreeSMAltertbReq
(
&
req
);
});
setAlterStbReqFunc
(
"st1"
,
TSDB_ALTER_TABLE_UPDATE_OPTIONS
,
0
,
nullptr
,
0
,
0
,
nullptr
,
nullptr
,
10
);
run
(
"ALTER TABLE st1 TTL 10"
);
clearAlterStbReq
();
//
setAlterStbReqFunc("st1", TSDB_ALTER_TABLE_UPDATE_OPTIONS, 0, nullptr, 0, 0, nullptr, nullptr, 10);
//
run("ALTER TABLE st1 TTL 10");
//
clearAlterStbReq();
setAlterStbReqFunc
(
"st1"
,
TSDB_ALTER_TABLE_UPDATE_OPTIONS
,
0
,
nullptr
,
0
,
0
,
nullptr
,
"test"
);
run
(
"ALTER TABLE st1 COMMENT 'test'"
);
...
...
@@ -289,7 +289,7 @@ TEST_F(ParserInitialATest, alterTable) {
expect
.
newTTL
=
ttl
;
}
if
(
nullptr
!=
pComment
)
{
expect
.
updateComment
=
true
;
expect
.
newCommentLen
=
strlen
(
pComment
)
;
expect
.
newComment
=
pComment
;
}
};
...
...
@@ -328,9 +328,10 @@ TEST_F(ParserInitialATest, alterTable) {
ASSERT_EQ
(
memcmp
(
req
.
pTagVal
,
expect
.
pTagVal
,
expect
.
nTagVal
),
0
);
ASSERT_EQ
(
req
.
updateTTL
,
expect
.
updateTTL
);
ASSERT_EQ
(
req
.
newTTL
,
expect
.
newTTL
);
ASSERT_EQ
(
req
.
updateComment
,
expect
.
updateComment
);
if
(
nullptr
!=
expect
.
newComment
)
{
ASSERT_EQ
(
std
::
string
(
req
.
newComment
),
std
::
string
(
expect
.
newComment
));
ASSERT_EQ
(
req
.
newCommentLen
,
strlen
(
req
.
newComment
));
ASSERT_EQ
(
expect
.
newCommentLen
,
strlen
(
expect
.
newComment
));
}
tDecoderClear
(
&
coder
);
...
...
source/libs/parser/test/parInitialCTest.cpp
浏览文件 @
0e905bb3
...
...
@@ -370,10 +370,10 @@ TEST_F(ParserInitialCTest, createStable) {
expect
.
delay2
=
delay2
;
expect
.
watermark1
=
watermark1
;
expect
.
watermark2
=
watermark2
;
expect
.
ttl
=
ttl
;
//
expect.ttl = ttl;
if
(
nullptr
!=
pComment
)
{
expect
.
comment
=
strdup
(
pComment
);
expect
.
commentLen
=
strlen
(
pComment
)
+
1
;
expect
.
commentLen
=
strlen
(
pComment
);
}
};
...
...
@@ -414,7 +414,7 @@ TEST_F(ParserInitialCTest, createStable) {
ASSERT_EQ
(
req
.
ttl
,
expect
.
ttl
);
ASSERT_EQ
(
req
.
numOfColumns
,
expect
.
numOfColumns
);
ASSERT_EQ
(
req
.
numOfTags
,
expect
.
numOfTags
);
ASSERT_EQ
(
req
.
commentLen
,
expect
.
commentLen
);
//
ASSERT_EQ(req.commentLen, expect.commentLen);
ASSERT_EQ
(
req
.
ast1Len
,
expect
.
ast1Len
);
ASSERT_EQ
(
req
.
ast2Len
,
expect
.
ast2Len
);
...
...
source/libs/parser/test/parSelectTest.cpp
浏览文件 @
0e905bb3
...
...
@@ -256,6 +256,24 @@ TEST_F(ParserSelectTest, intervalSemanticCheck) {
run
(
"SELECT _WSTARTTS, _WENDTS, _WDURATION, sum(c1) FROM t1"
,
TSDB_CODE_PAR_INVALID_WINDOW_PC
);
}
TEST_F
(
ParserSelectTest
,
interp
)
{
useDb
(
"root"
,
"test"
);
run
(
"SELECT INTERP(c1) FROM t1"
);
run
(
"SELECT INTERP(c1) FROM t1 RANGE('2017-7-14 18:00:00', '2017-7-14 19:00:00')"
);
run
(
"SELECT INTERP(c1) FROM t1 RANGE('2017-7-14 18:00:00', '2017-7-14 19:00:00') FILL(LINEAR)"
);
run
(
"SELECT INTERP(c1) FROM t1 EVERY(5s)"
);
run
(
"SELECT INTERP(c1) FROM t1 EVERY(5s) FILL(LINEAR)"
);
run
(
"SELECT INTERP(c1) FROM t1 RANGE('2017-7-14 18:00:00', '2017-7-14 19:00:00') EVERY(5s)"
);
run
(
"SELECT INTERP(c1) FROM t1 RANGE('2017-7-14 18:00:00', '2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR)"
);
}
TEST_F
(
ParserSelectTest
,
subquery
)
{
useDb
(
"root"
,
"test"
);
...
...
source/libs/planner/src/planLogicCreater.c
浏览文件 @
0e905bb3
...
...
@@ -91,7 +91,7 @@ static EDealRes doNameExpr(SNode* pNode, void* pContext) {
return
DEAL_RES_CONTINUE
;
}
static
int32_t
rewriteExprForSelect
(
SNodeList
*
pExprs
,
SSelectStmt
*
pSelect
,
ESqlClause
clause
)
{
static
int32_t
rewriteExpr
s
ForSelect
(
SNodeList
*
pExprs
,
SSelectStmt
*
pSelect
,
ESqlClause
clause
)
{
nodesWalkExprs
(
pExprs
,
doNameExpr
,
NULL
);
SRewriteExprCxt
cxt
=
{.
errCode
=
TSDB_CODE_SUCCESS
,
.
pExprs
=
pExprs
};
nodesRewriteSelectStmt
(
pSelect
,
clause
,
doRewriteExpr
,
&
cxt
);
...
...
@@ -266,7 +266,7 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
// rewrite the expression in subsequent clauses
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
rewriteExprForSelect
(
pScan
->
pScanPseudoCols
,
pSelect
,
SQL_CLAUSE_FROM
);
code
=
rewriteExpr
s
ForSelect
(
pScan
->
pScanPseudoCols
,
pSelect
,
SQL_CLAUSE_FROM
);
}
pScan
->
scanType
=
getScanType
(
pCxt
,
pScan
->
pScanPseudoCols
,
pScan
->
pScanCols
,
pScan
->
tableType
);
...
...
@@ -425,7 +425,7 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
// rewrite the expression in subsequent clauses
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
rewriteExprForSelect
(
pAgg
->
pGroupKeys
,
pSelect
,
SQL_CLAUSE_GROUP_BY
);
code
=
rewriteExpr
s
ForSelect
(
pAgg
->
pGroupKeys
,
pSelect
,
SQL_CLAUSE_GROUP_BY
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
pSelect
->
hasAggFuncs
)
{
...
...
@@ -434,7 +434,7 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
// rewrite the expression in subsequent clauses
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
rewriteExprForSelect
(
pAgg
->
pAggFuncs
,
pSelect
,
SQL_CLAUSE_GROUP_BY
);
code
=
rewriteExpr
s
ForSelect
(
pAgg
->
pAggFuncs
,
pSelect
,
SQL_CLAUSE_GROUP_BY
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pSelect
->
pHaving
)
{
...
...
@@ -473,14 +473,15 @@ static int32_t createIndefRowsFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt
return
TSDB_CODE_OUT_OF_MEMORY
;
}
int32_t
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_SELECT
,
fmIsVectorFunc
,
&
pIdfRowsFunc
->
pVectorFuncs
);
// indefinite rows functions and _select_values functions
int32_t
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_SELECT
,
fmIsVectorFunc
,
&
pIdfRowsFunc
->
pFuncs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
rewriteExpr
ForSelect
(
pIdfRowsFunc
->
pVector
Funcs
,
pSelect
,
SQL_CLAUSE_SELECT
);
code
=
rewriteExpr
sForSelect
(
pIdfRowsFunc
->
p
Funcs
,
pSelect
,
SQL_CLAUSE_SELECT
);
}
// set the output
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createColumnByRewriteExprs
(
pIdfRowsFunc
->
p
Vector
Funcs
,
&
pIdfRowsFunc
->
node
.
pTargets
);
code
=
createColumnByRewriteExprs
(
pIdfRowsFunc
->
pFuncs
,
&
pIdfRowsFunc
->
node
.
pTargets
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
...
@@ -492,6 +493,45 @@ static int32_t createIndefRowsFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt
return
code
;
}
static
int32_t
createInterpFuncLogicNode
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SLogicNode
**
pLogicNode
)
{
if
(
!
pSelect
->
hasInterpFunc
)
{
return
TSDB_CODE_SUCCESS
;
}
SInterpFuncLogicNode
*
pInterpFunc
=
(
SInterpFuncLogicNode
*
)
nodesMakeNode
(
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
);
if
(
NULL
==
pInterpFunc
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
int32_t
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_SELECT
,
fmIsInterpFunc
,
&
pInterpFunc
->
pFuncs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
rewriteExprsForSelect
(
pInterpFunc
->
pFuncs
,
pSelect
,
SQL_CLAUSE_SELECT
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pSelect
->
pRange
)
{
// SRangeNode* pRange = (SRangeNode*)pSelect->pRange;
// pInterpFunc->timeRange.skey = ((SValueNode*)pRange->pStart)->datum.i;
// pInterpFunc->timeRange.ekey = ((SValueNode*)pRange->pEnd)->datum.i;
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pSelect
->
pEvery
)
{
pInterpFunc
->
interval
=
((
SValueNode
*
)
pSelect
->
pEvery
)
->
datum
.
i
;
}
// set the output
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createColumnByRewriteExprs
(
pInterpFunc
->
pFuncs
,
&
pInterpFunc
->
node
.
pTargets
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pLogicNode
=
(
SLogicNode
*
)
pInterpFunc
;
}
else
{
nodesDestroyNode
((
SNode
*
)
pInterpFunc
);
}
return
code
;
}
static
int32_t
createWindowLogicNodeFinalize
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SWindowLogicNode
*
pWindow
,
SLogicNode
**
pLogicNode
)
{
int32_t
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_WINDOW
,
fmIsWindowClauseFunc
,
&
pWindow
->
pFuncs
);
...
...
@@ -506,7 +546,7 @@ static int32_t createWindowLogicNodeFinalize(SLogicPlanContext* pCxt, SSelectStm
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
rewriteExprForSelect
(
pWindow
->
pFuncs
,
pSelect
,
SQL_CLAUSE_WINDOW
);
code
=
rewriteExpr
s
ForSelect
(
pWindow
->
pFuncs
,
pSelect
,
SQL_CLAUSE_WINDOW
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
...
@@ -559,6 +599,7 @@ static int32_t createWindowLogicNodeBySession(SLogicPlanContext* pCxt, SSessionW
nodesDestroyNode
((
SNode
*
)
pWindow
);
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pWindow
->
pTsEnd
=
nodesCloneNode
((
SNode
*
)
pSession
->
pCol
);
return
createWindowLogicNodeFinalize
(
pCxt
,
pSelect
,
pWindow
,
pLogicNode
);
}
...
...
@@ -777,7 +818,7 @@ static int32_t createDistinctLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSe
// rewrite the expression in subsequent clauses
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
rewriteExprForSelect
(
pAgg
->
pGroupKeys
,
pSelect
,
SQL_CLAUSE_DISTINCT
);
code
=
rewriteExpr
s
ForSelect
(
pAgg
->
pGroupKeys
,
pSelect
,
SQL_CLAUSE_DISTINCT
);
}
// set the output
...
...
@@ -812,6 +853,9 @@ static int32_t createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createSelectRootLogicNode
(
pCxt
,
pSelect
,
createIndefRowsFuncLogicNode
,
&
pRoot
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createSelectRootLogicNode
(
pCxt
,
pSelect
,
createInterpFuncLogicNode
,
&
pRoot
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createSelectRootLogicNode
(
pCxt
,
pSelect
,
createDistinctLogicNode
,
&
pRoot
);
}
...
...
source/libs/planner/src/planPhysiCreater.c
浏览文件 @
0e905bb3
...
...
@@ -825,8 +825,8 @@ static int32_t createIndefRowsFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList*
}
SNodeList
*
pPrecalcExprs
=
NULL
;
SNodeList
*
p
Vector
Funcs
=
NULL
;
int32_t
code
=
rewritePrecalcExprs
(
pCxt
,
pFuncLogicNode
->
p
VectorFuncs
,
&
pPrecalcExprs
,
&
pVector
Funcs
);
SNodeList
*
pFuncs
=
NULL
;
int32_t
code
=
rewritePrecalcExprs
(
pCxt
,
pFuncLogicNode
->
p
Funcs
,
&
pPrecalcExprs
,
&
p
Funcs
);
SDataBlockDescNode
*
pChildTupe
=
(((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
pOutputDataBlockDesc
);
// push down expression to pOutputDataBlockDesc of child node
...
...
@@ -837,10 +837,10 @@ static int32_t createIndefRowsFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList*
}
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pVectorFuncs
)
{
code
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
p
VectorFuncs
,
&
pIdfRowsFunc
->
pVector
Funcs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
p
Funcs
,
&
pIdfRowsFunc
->
p
Funcs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addDataBlockSlots
(
pCxt
,
pIdfRowsFunc
->
p
Vector
Funcs
,
pIdfRowsFunc
->
node
.
pOutputDataBlockDesc
);
code
=
addDataBlockSlots
(
pCxt
,
pIdfRowsFunc
->
pFuncs
,
pIdfRowsFunc
->
node
.
pOutputDataBlockDesc
);
}
}
...
...
@@ -853,6 +853,48 @@ static int32_t createIndefRowsFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList*
return
code
;
}
static
int32_t
createInterpFuncPhysiNode
(
SPhysiPlanContext
*
pCxt
,
SNodeList
*
pChildren
,
SInterpFuncLogicNode
*
pFuncLogicNode
,
SPhysiNode
**
pPhyNode
)
{
SInterpFuncPhysiNode
*
pInterpFunc
=
(
SInterpFuncPhysiNode
*
)
makePhysiNode
(
pCxt
,
(
SLogicNode
*
)
pFuncLogicNode
,
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC
);
if
(
NULL
==
pInterpFunc
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
SNodeList
*
pPrecalcExprs
=
NULL
;
SNodeList
*
pFuncs
=
NULL
;
int32_t
code
=
rewritePrecalcExprs
(
pCxt
,
pFuncLogicNode
->
pFuncs
,
&
pPrecalcExprs
,
&
pFuncs
);
SDataBlockDescNode
*
pChildTupe
=
(((
SPhysiNode
*
)
nodesListGetNode
(
pChildren
,
0
))
->
pOutputDataBlockDesc
);
// push down expression to pOutputDataBlockDesc of child node
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pPrecalcExprs
)
{
code
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
pPrecalcExprs
,
&
pInterpFunc
->
pExprs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
pushdownDataBlockSlots
(
pCxt
,
pInterpFunc
->
pExprs
,
pChildTupe
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
pFuncs
,
&
pInterpFunc
->
pFuncs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addDataBlockSlots
(
pCxt
,
pInterpFunc
->
pFuncs
,
pInterpFunc
->
node
.
pOutputDataBlockDesc
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pInterpFunc
->
timeRange
=
pFuncLogicNode
->
timeRange
;
pInterpFunc
->
interval
=
pFuncLogicNode
->
interval
;
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pPhyNode
=
(
SPhysiNode
*
)
pInterpFunc
;
}
else
{
nodesDestroyNode
((
SNode
*
)
pInterpFunc
);
}
return
code
;
}
static
int32_t
createProjectPhysiNode
(
SPhysiPlanContext
*
pCxt
,
SNodeList
*
pChildren
,
SProjectLogicNode
*
pProjectLogicNode
,
SPhysiNode
**
pPhyNode
)
{
SProjectPhysiNode
*
pProject
=
...
...
@@ -961,6 +1003,9 @@ static int32_t createWindowPhysiNodeFinalize(SPhysiPlanContext* pCxt, SNodeList*
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
setNodeSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
pWindowLogicNode
->
pTspk
,
&
pWindow
->
pTspk
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
pWindowLogicNode
->
pTsEnd
)
{
code
=
setNodeSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
pWindowLogicNode
->
pTsEnd
,
&
pWindow
->
pTsEnd
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pFuncs
)
{
code
=
setListSlotId
(
pCxt
,
pChildTupe
->
dataBlockId
,
-
1
,
pFuncs
,
&
pWindow
->
pFuncs
);
...
...
@@ -1295,6 +1340,8 @@ static int32_t doCreatePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode
return
createFillPhysiNode
(
pCxt
,
pChildren
,
(
SFillLogicNode
*
)
pLogicNode
,
pPhyNode
);
case
QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC
:
return
createIndefRowsFuncPhysiNode
(
pCxt
,
pChildren
,
(
SIndefRowsFuncLogicNode
*
)
pLogicNode
,
pPhyNode
);
case
QUERY_NODE_LOGIC_PLAN_INTERP_FUNC
:
return
createInterpFuncPhysiNode
(
pCxt
,
pChildren
,
(
SInterpFuncLogicNode
*
)
pLogicNode
,
pPhyNode
);
case
QUERY_NODE_LOGIC_PLAN_MERGE
:
return
createMergePhysiNode
(
pCxt
,
(
SMergeLogicNode
*
)
pLogicNode
,
pPhyNode
);
default:
...
...
source/libs/planner/src/planSpliter.c
浏览文件 @
0e905bb3
...
...
@@ -176,7 +176,7 @@ static bool stbSplNeedSplit(bool streamQuery, SLogicNode* pNode) {
return
!
stbSplHasGatherExecFunc
(((
SAggLogicNode
*
)
pNode
)
->
pAggFuncs
)
&&
stbSplHasMultiTbScan
(
streamQuery
,
pNode
);
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
{
SWindowLogicNode
*
pWindow
=
(
SWindowLogicNode
*
)
pNode
;
if
(
WINDOW_TYPE_
INTERVAL
!=
pWindow
->
winType
)
{
if
(
WINDOW_TYPE_
STATE
==
pWindow
->
winType
||
(
!
streamQuery
&&
WINDOW_TYPE_SESSION
==
pWindow
->
winType
)
)
{
return
false
;
}
return
!
stbSplHasGatherExecFunc
(
pWindow
->
pFuncs
)
&&
stbSplHasMultiTbScan
(
streamQuery
,
pNode
);
...
...
@@ -257,6 +257,34 @@ static int32_t stbSplAppendWStart(SNodeList* pFuncs, int32_t* pIndex) {
return
code
;
}
static
int32_t
stbSplAppendWEnd
(
SWindowLogicNode
*
pWin
,
int32_t
*
pIndex
)
{
int32_t
index
=
0
;
SNode
*
pFunc
=
NULL
;
FOREACH
(
pFunc
,
pWin
->
pFuncs
)
{
if
(
FUNCTION_TYPE_WENDTS
==
((
SFunctionNode
*
)
pFunc
)
->
funcType
)
{
*
pIndex
=
index
;
return
TSDB_CODE_SUCCESS
;
}
++
index
;
}
SFunctionNode
*
pWEnd
=
(
SFunctionNode
*
)
nodesMakeNode
(
QUERY_NODE_FUNCTION
);
if
(
NULL
==
pWEnd
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
strcpy
(
pWEnd
->
functionName
,
"_wendts"
);
snprintf
(
pWEnd
->
node
.
aliasName
,
sizeof
(
pWEnd
->
node
.
aliasName
),
"%s.%p"
,
pWEnd
->
functionName
,
pWEnd
);
int32_t
code
=
fmGetFuncInfo
(
pWEnd
,
NULL
,
0
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListStrictAppend
(
pWin
->
pFuncs
,
(
SNode
*
)
pWEnd
);
}
*
pIndex
=
index
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
createColumnByRewriteExpr
(
nodesListGetNode
(
pWin
->
pFuncs
,
index
),
&
pWin
->
node
.
pTargets
);
}
return
code
;
}
static
int32_t
stbSplCreatePartWindowNode
(
SWindowLogicNode
*
pMergeWindow
,
SLogicNode
**
pPartWindow
)
{
SNodeList
*
pFunc
=
pMergeWindow
->
pFuncs
;
pMergeWindow
->
pFuncs
=
NULL
;
...
...
@@ -425,8 +453,18 @@ static int32_t stbSplSplitSessionForStream(SSplitContext* pCxt, SStableSplitInfo
SLogicNode
*
pPartWindow
=
NULL
;
int32_t
code
=
stbSplCreatePartWindowNode
((
SWindowLogicNode
*
)
pInfo
->
pSplitNode
,
&
pPartWindow
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
((
SWindowLogicNode
*
)
pPartWindow
)
->
windowAlgo
=
SESSION_ALGO_STREAM_SEMI
;
((
SWindowLogicNode
*
)
pInfo
->
pSplitNode
)
->
windowAlgo
=
SESSION_ALGO_STREAM_FINAL
;
SWindowLogicNode
*
pPartWin
=
(
SWindowLogicNode
*
)
pPartWindow
;
SWindowLogicNode
*
pMergeWin
=
(
SWindowLogicNode
*
)
pInfo
->
pSplitNode
;
pPartWin
->
windowAlgo
=
SESSION_ALGO_STREAM_SEMI
;
pMergeWin
->
windowAlgo
=
SESSION_ALGO_STREAM_FINAL
;
int32_t
index
=
0
;
int32_t
code
=
stbSplAppendWEnd
(
pPartWin
,
&
index
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pMergeWin
->
pTsEnd
=
nodesCloneNode
(
nodesListGetNode
(
pPartWin
->
node
.
pTargets
,
index
));
if
(
NULL
==
pMergeWin
->
pTsEnd
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
}
code
=
stbSplCreateExchangeNode
(
pCxt
,
pInfo
->
pSplitNode
,
pPartWindow
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
...
...
source/libs/planner/test/planBasicTest.cpp
浏览文件 @
0e905bb3
...
...
@@ -52,6 +52,8 @@ TEST_F(PlanBasicTest, func) {
run
(
"SELECT PERCENTILE(c1, 60) FROM t1"
);
run
(
"SELECT TOP(c1, 60) FROM t1"
);
run
(
"SELECT TOP(c1, 60) FROM st1"
);
}
TEST_F
(
PlanBasicTest
,
uniqueFunc
)
{
...
...
@@ -73,3 +75,11 @@ TEST_F(PlanBasicTest, tailFunc) {
run
(
"SELECT TAIL(c2 + 10, 10, 80) FROM t1 WHERE c1 > 10"
);
}
TEST_F
(
PlanBasicTest
,
interpFunc
)
{
useDb
(
"root"
,
"test"
);
run
(
"SELECT INTERP(c1) FROM t1"
);
run
(
"SELECT INTERP(c1) FROM t1 RANGE('2017-7-14 18:00:00', '2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR)"
);
}
source/libs/tdb/inc/tdb.h
浏览文件 @
0e905bb3
...
...
@@ -58,6 +58,7 @@ int32_t tdbTbcMoveToPrev(TBC *pTbc);
int32_t
tdbTbcGet
(
TBC
*
pTbc
,
const
void
**
ppKey
,
int
*
pkLen
,
const
void
**
ppVal
,
int
*
pvLen
);
int32_t
tdbTbcDelete
(
TBC
*
pTbc
);
int32_t
tdbTbcNext
(
TBC
*
pTbc
,
void
**
ppKey
,
int
*
kLen
,
void
**
ppVal
,
int
*
vLen
);
int32_t
tdbTbcPrev
(
TBC
*
pTbc
,
void
**
ppKey
,
int
*
kLen
,
void
**
ppVal
,
int
*
vLen
);
int32_t
tdbTbcUpsert
(
TBC
*
pTbc
,
const
void
*
pKey
,
int
nKey
,
const
void
*
pData
,
int
nData
,
int
insert
);
// TXN
...
...
source/libs/tdb/src/db/tdbBtree.c
浏览文件 @
0e905bb3
...
...
@@ -1245,6 +1245,52 @@ int tdbBtreeNext(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) {
return
0
;
}
int
tdbBtreePrev
(
SBTC
*
pBtc
,
void
**
ppKey
,
int
*
kLen
,
void
**
ppVal
,
int
*
vLen
)
{
SCell
*
pCell
;
SCellDecoder
cd
;
void
*
pKey
,
*
pVal
;
int
ret
;
// current cursor points to an invalid position
if
(
pBtc
->
idx
<
0
)
{
return
-
1
;
}
pCell
=
tdbPageGetCell
(
pBtc
->
pPage
,
pBtc
->
idx
);
tdbBtreeDecodeCell
(
pBtc
->
pPage
,
pCell
,
&
cd
);
pKey
=
tdbRealloc
(
*
ppKey
,
cd
.
kLen
);
if
(
pKey
==
NULL
)
{
return
-
1
;
}
*
ppKey
=
pKey
;
*
kLen
=
cd
.
kLen
;
memcpy
(
pKey
,
cd
.
pKey
,
cd
.
kLen
);
if
(
ppVal
)
{
// TODO: vLen may be zero
pVal
=
tdbRealloc
(
*
ppVal
,
cd
.
vLen
);
if
(
pVal
==
NULL
)
{
tdbFree
(
pKey
);
return
-
1
;
}
*
ppVal
=
pVal
;
*
vLen
=
cd
.
vLen
;
memcpy
(
pVal
,
cd
.
pVal
,
cd
.
vLen
);
}
ret
=
tdbBtcMoveToPrev
(
pBtc
);
if
(
ret
<
0
)
{
ASSERT
(
0
);
return
-
1
;
}
return
0
;
}
int
tdbBtcMoveToNext
(
SBTC
*
pBtc
)
{
int
nCells
;
int
ret
;
...
...
source/libs/tdb/src/db/tdbTable.c
浏览文件 @
0e905bb3
...
...
@@ -132,6 +132,10 @@ int tdbTbcNext(TBC *pTbc, void **ppKey, int *kLen, void **ppVal, int *vLen) {
return
tdbBtreeNext
(
&
pTbc
->
btc
,
ppKey
,
kLen
,
ppVal
,
vLen
);
}
int
tdbTbcPrev
(
TBC
*
pTbc
,
void
**
ppKey
,
int
*
kLen
,
void
**
ppVal
,
int
*
vLen
)
{
return
tdbBtreePrev
(
&
pTbc
->
btc
,
ppKey
,
kLen
,
ppVal
,
vLen
);
}
int
tdbTbcUpsert
(
TBC
*
pTbc
,
const
void
*
pKey
,
int
nKey
,
const
void
*
pData
,
int
nData
,
int
insert
)
{
return
tdbBtcUpsert
(
&
pTbc
->
btc
,
pKey
,
nKey
,
pData
,
nData
,
insert
);
}
...
...
source/libs/tdb/src/inc/tdbInt.h
浏览文件 @
0e905bb3
...
...
@@ -156,6 +156,7 @@ int tdbBtcMoveToLast(SBTC *pBtc);
int
tdbBtcMoveToNext
(
SBTC
*
pBtc
);
int
tdbBtcMoveToPrev
(
SBTC
*
pBtc
);
int
tdbBtreeNext
(
SBTC
*
pBtc
,
void
**
ppKey
,
int
*
kLen
,
void
**
ppVal
,
int
*
vLen
);
int
tdbBtreePrev
(
SBTC
*
pBtc
,
void
**
ppKey
,
int
*
kLen
,
void
**
ppVal
,
int
*
vLen
);
int
tdbBtcGet
(
SBTC
*
pBtc
,
const
void
**
ppKey
,
int
*
kLen
,
const
void
**
ppVal
,
int
*
vLen
);
int
tdbBtcDelete
(
SBTC
*
pBtc
);
int
tdbBtcUpsert
(
SBTC
*
pBtc
,
const
void
*
pKey
,
int
kLen
,
const
void
*
pData
,
int
nData
,
int
insert
);
...
...
tests/script/tsim/stable/alter_comment.sim
浏览文件 @
0e905bb3
...
...
@@ -159,7 +159,7 @@ sql alter table db.stb rename tag t1 tx
print ========== alter common
sql alter table db.stb comment 'abcde' ;
sql alter table db.stb ttl 10 ;
sql
_error
alter table db.stb ttl 10 ;
sql show db.stables;
if $data[0][6] != abcde then
...
...
tests/script/tsim/stream/session0.sim
浏览文件 @
0e905bb3
...
...
@@ -231,9 +231,10 @@ sql use test3;
sql create table t1(ts timestamp, a int, b int , c int, d double);
sql create stream streams3 trigger at_once watermark 1d into streamt3 as select _wstartts, min(b), a,c from t1 session(ts,10s);
sql create stream streams4 trigger at_once watermark 1d into streamt4 as select _wstartts, max(b), a,c from t1 session(ts,10s);
sql create stream streams5 trigger at_once watermark 1d into streamt5 as select _wstartts, top(b,3), a,c from t1 session(ts,10s);
sql create stream streams6 trigger at_once watermark 1d into streamt6 as select _wstartts, bottom(b,3), a,c from t1 session(ts,10s);
sql create stream streams7 trigger at_once watermark 1d into streamt7 as select _wstartts, spread(a), elapsed(ts), hyperloglog(a) from t1 session(ts,10s);
# sql create stream streams5 trigger at_once watermark 1d into streamt5 as select _wstartts, top(b,3), a,c from t1 session(ts,10s);
# sql create stream streams6 trigger at_once watermark 1d into streamt6 as select _wstartts, bottom(b,3), a,c from t1 session(ts,10s);
# sql create stream streams7 trigger at_once watermark 1d into streamt7 as select _wstartts, spread(a), elapsed(ts), hyperloglog(a) from t1 session(ts,10s);
sql create stream streams7 trigger at_once watermark 1d into streamt7 as select _wstartts, spread(a), hyperloglog(a) from t1 session(ts,10s);
sql create stream streams8 trigger at_once watermark 1d into streamt8 as select _wstartts, histogram(a,"user_input", "[1,3,5,7]", 1), histogram(a,"user_input", "[1,3,5,7]", 0) from t1 session(ts,10s);
sql insert into t1 values(1648791213001,1,1,1,1.0);
sql insert into t1 values(1648791213002,2,3,2,3.4);
...
...
@@ -269,13 +270,13 @@ if $rows == 0 then
goto loop3
endi
sql select * from streamt5;
#
sql select * from streamt5;
if $rows == 0 then
print ======$rows
goto loop3
#
goto loop3
endi
sql select * from streamt6;
#
sql select * from streamt6;
if $rows == 0 then
print ======$rows
goto loop3
...
...
tests/script/tsim/stream/triggerSession0.sim
浏览文件 @
0e905bb3
...
...
@@ -85,7 +85,7 @@ sql insert into t2 values(1648791243003,1,2,3,1.0) (1648791243002,1,2,3,1.0) (16
sleep 500
sql select * from streamt2;
if $rows != 3 then
print ======$rows
print =====
rows
=$rows
return -1
endi
...
...
tests/system-test/2-query/ttl_comment.py
0 → 100644
浏览文件 @
0e905bb3
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, db_test.stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import
sys
import
taos
from
util.log
import
tdLog
from
util.cases
import
tdCases
from
util.sql
import
tdSql
class
TDTestCase
:
def
caseDescription
(
self
):
'''
ttl/comment test
'''
return
def
init
(
self
,
conn
,
logSql
):
tdLog
.
debug
(
"start to execute %s"
%
__file__
)
tdSql
.
init
(
conn
.
cursor
(),
logSql
)
def
run
(
self
):
tdSql
.
prepare
()
tdSql
.
error
(
"create table ttl_table1(ts timestamp, i int) ttl 1.1"
)
tdSql
.
error
(
"create table ttl_table2(ts timestamp, i int) ttl 1e1"
)
tdSql
.
error
(
"create table ttl_table3(ts timestamp, i int) ttl -1"
)
print
(
"============== STEP 1 ===== test normal table"
)
tdSql
.
execute
(
"create table normal_table1(ts timestamp, i int)"
)
tdSql
.
execute
(
"create table normal_table2(ts timestamp, i int) comment '' ttl 3"
)
tdSql
.
execute
(
"create table normal_table3(ts timestamp, i int) ttl 2100000000020 comment 'hello'"
)
tdSql
.
query
(
"show tables like 'normal_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table1'
)
tdSql
.
checkData
(
0
,
7
,
0
)
tdSql
.
checkData
(
0
,
8
,
None
)
tdSql
.
query
(
"show tables like 'normal_table2'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table2'
)
tdSql
.
checkData
(
0
,
7
,
3
)
tdSql
.
checkData
(
0
,
8
,
''
)
tdSql
.
query
(
"show tables like 'normal_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table3'
)
tdSql
.
checkData
(
0
,
7
,
2147483647
)
tdSql
.
checkData
(
0
,
8
,
'hello'
)
tdSql
.
execute
(
"alter table normal_table1 comment 'nihao'"
)
tdSql
.
query
(
"show tables like 'normal_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table1'
)
tdSql
.
checkData
(
0
,
8
,
'nihao'
)
tdSql
.
execute
(
"alter table normal_table1 comment ''"
)
tdSql
.
query
(
"show tables like 'normal_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table1'
)
tdSql
.
checkData
(
0
,
8
,
''
)
tdSql
.
execute
(
"alter table normal_table2 comment 'fly'"
)
tdSql
.
query
(
"show tables like 'normal_table2'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table2'
)
tdSql
.
checkData
(
0
,
8
,
'fly'
)
tdSql
.
execute
(
"alter table normal_table3 comment 'fly'"
)
tdSql
.
query
(
"show tables like 'normal_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table3'
)
tdSql
.
checkData
(
0
,
8
,
'fly'
)
tdSql
.
execute
(
"alter table normal_table1 ttl 1"
)
tdSql
.
query
(
"show tables like 'normal_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table1'
)
tdSql
.
checkData
(
0
,
7
,
1
)
tdSql
.
execute
(
"alter table normal_table3 ttl 0"
)
tdSql
.
query
(
"show tables like 'normal_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'normal_table3'
)
tdSql
.
checkData
(
0
,
7
,
0
)
print
(
"============== STEP 2 ===== test super table"
)
tdSql
.
execute
(
"create table super_table1(ts timestamp, i int) tags(t int)"
)
tdSql
.
execute
(
"create table super_table2(ts timestamp, i int) tags(t int) comment ''"
)
tdSql
.
execute
(
"create table super_table3(ts timestamp, i int) tags(t int) comment 'super'"
)
tdSql
.
query
(
"show stables like 'super_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'super_table1'
)
tdSql
.
checkData
(
0
,
6
,
None
)
tdSql
.
query
(
"show stables like 'super_table2'"
)
tdSql
.
checkData
(
0
,
0
,
'super_table2'
)
tdSql
.
checkData
(
0
,
6
,
''
)
tdSql
.
query
(
"show stables like 'super_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'super_table3'
)
tdSql
.
checkData
(
0
,
6
,
'super'
)
tdSql
.
execute
(
"alter table super_table1 comment 'nihao'"
)
tdSql
.
query
(
"show stables like 'super_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'super_table1'
)
tdSql
.
checkData
(
0
,
6
,
'nihao'
)
tdSql
.
execute
(
"alter table super_table1 comment ''"
)
tdSql
.
query
(
"show stables like 'super_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'super_table1'
)
tdSql
.
checkData
(
0
,
6
,
''
)
tdSql
.
execute
(
"alter table super_table2 comment 'fly'"
)
tdSql
.
query
(
"show stables like 'super_table2'"
)
tdSql
.
checkData
(
0
,
0
,
'super_table2'
)
tdSql
.
checkData
(
0
,
6
,
'fly'
)
tdSql
.
execute
(
"alter table super_table3 comment 'tdengine'"
)
tdSql
.
query
(
"show stables like 'super_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'super_table3'
)
tdSql
.
checkData
(
0
,
6
,
'tdengine'
)
print
(
"============== STEP 3 ===== test child table"
)
tdSql
.
execute
(
"create table child_table1 using super_table1 tags(1) ttl 10"
)
tdSql
.
execute
(
"create table child_table2 using super_table1 tags(1) comment ''"
)
tdSql
.
execute
(
"create table child_table3 using super_table1 tags(1) comment 'child'"
)
tdSql
.
execute
(
"insert into child_table4 using super_table1 tags(1) values(now, 1)"
)
tdSql
.
query
(
"show tables like 'child_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table1'
)
tdSql
.
checkData
(
0
,
7
,
10
)
tdSql
.
checkData
(
0
,
8
,
None
)
tdSql
.
query
(
"show tables like 'child_table2'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table2'
)
tdSql
.
checkData
(
0
,
7
,
0
)
tdSql
.
checkData
(
0
,
8
,
''
)
tdSql
.
query
(
"show tables like 'child_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table3'
)
tdSql
.
checkData
(
0
,
8
,
'child'
)
tdSql
.
query
(
"show tables like 'child_table4'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table4'
)
tdSql
.
checkData
(
0
,
7
,
0
)
tdSql
.
checkData
(
0
,
8
,
None
)
tdSql
.
execute
(
"alter table child_table1 comment 'nihao'"
)
tdSql
.
query
(
"show tables like 'child_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table1'
)
tdSql
.
checkData
(
0
,
8
,
'nihao'
)
tdSql
.
execute
(
"alter table child_table1 comment ''"
)
tdSql
.
query
(
"show tables like 'child_table1'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table1'
)
tdSql
.
checkData
(
0
,
8
,
''
)
tdSql
.
execute
(
"alter table child_table2 comment 'fly'"
)
tdSql
.
query
(
"show tables like 'child_table2'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table2'
)
tdSql
.
checkData
(
0
,
8
,
'fly'
)
tdSql
.
execute
(
"alter table child_table3 comment 'tdengine'"
)
tdSql
.
query
(
"show tables like 'child_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table3'
)
tdSql
.
checkData
(
0
,
8
,
'tdengine'
)
tdSql
.
execute
(
"alter table child_table4 comment 'tdengine'"
)
tdSql
.
query
(
"show tables like 'child_table4'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table4'
)
tdSql
.
checkData
(
0
,
8
,
'tdengine'
)
tdSql
.
execute
(
"alter table child_table4 ttl 9"
)
tdSql
.
query
(
"show tables like 'child_table4'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table4'
)
tdSql
.
checkData
(
0
,
7
,
9
)
tdSql
.
execute
(
"alter table child_table3 ttl 9"
)
tdSql
.
query
(
"show tables like 'child_table3'"
)
tdSql
.
checkData
(
0
,
0
,
'child_table3'
)
tdSql
.
checkData
(
0
,
7
,
9
)
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
"%s successfully executed"
%
__file__
)
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
tests/system-test/fulltest.sh
浏览文件 @
0e905bb3
...
...
@@ -98,6 +98,7 @@ python3 ./test.py -f 2-query/stateduration.py
python3 ./test.py
-f
2-query/function_stateduration.py
python3 ./test.py
-f
2-query/statecount.py
python3 ./test.py
-f
2-query/tail.py
python3 ./test.py
-f
2-query/ttl_comment.py
python3 ./test.py
-f
2-query/distribute_agg_count.py
python3 ./test.py
-f
2-query/distribute_agg_max.py
python3 ./test.py
-f
2-query/distribute_agg_min.py
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录