Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
070f6040
T
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1184
Star
22015
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
070f6040
编写于
5月 25, 2022
作者:
X
Xiaoyu Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: sql command 'drop cgroup'
上级
1ea2eec5
变更
26
隐藏空白更改
内联
并排
Showing
26 changed file
with
3416 addition
and
3155 deletion
+3416
-3155
include/common/tmsg.h
include/common/tmsg.h
+1
-0
include/common/tmsgdef.h
include/common/tmsgdef.h
+1
-0
include/common/ttokendef.h
include/common/ttokendef.h
+162
-160
include/libs/nodes/cmdnodes.h
include/libs/nodes/cmdnodes.h
+8
-0
include/libs/nodes/nodes.h
include/libs/nodes/nodes.h
+1
-1
include/libs/nodes/plannodes.h
include/libs/nodes/plannodes.h
+2
-0
include/libs/nodes/querynodes.h
include/libs/nodes/querynodes.h
+2
-0
include/util/tdef.h
include/util/tdef.h
+6
-3
source/common/src/tdatablock.c
source/common/src/tdatablock.c
+18
-14
source/common/src/tmsg.c
source/common/src/tmsg.c
+4
-1
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+4
-4
source/libs/nodes/src/nodesCloneFuncs.c
source/libs/nodes/src/nodesCloneFuncs.c
+3
-0
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+111
-109
source/libs/parser/inc/parAst.h
source/libs/parser/inc/parAst.h
+4
-1
source/libs/parser/inc/sql.y
source/libs/parser/inc/sql.y
+6
-0
source/libs/parser/src/parAstCreater.c
source/libs/parser/src/parAstCreater.c
+125
-30
source/libs/parser/src/parCalcConst.c
source/libs/parser/src/parCalcConst.c
+5
-5
source/libs/parser/src/parTokenizer.c
source/libs/parser/src/parTokenizer.c
+8
-6
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+137
-74
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+2727
-2704
source/libs/parser/test/parInitialCTest.cpp
source/libs/parser/test/parInitialCTest.cpp
+6
-1
source/libs/parser/test/parInitialDTest.cpp
source/libs/parser/test/parInitialDTest.cpp
+32
-2
source/libs/parser/test/parSelectTest.cpp
source/libs/parser/test/parSelectTest.cpp
+2
-2
source/libs/planner/src/planLogicCreater.c
source/libs/planner/src/planLogicCreater.c
+4
-3
source/libs/planner/src/planSpliter.c
source/libs/planner/src/planSpliter.c
+35
-35
source/libs/planner/test/planSubqueryTest.cpp
source/libs/planner/test/planSubqueryTest.cpp
+2
-0
未找到文件。
include/common/tmsg.h
浏览文件 @
070f6040
...
...
@@ -696,6 +696,7 @@ typedef struct {
int8_t
replications
;
int8_t
strict
;
int8_t
cacheLastRow
;
int8_t
schemaless
;
int8_t
ignoreExist
;
int32_t
numOfRetensions
;
SArray
*
pRetensions
;
// SRetention
...
...
include/common/tmsgdef.h
浏览文件 @
070f6040
...
...
@@ -144,6 +144,7 @@ enum {
TD_DEF_MSG_TYPE
(
TDMT_MND_CREATE_TOPIC
,
"mnode-create-topic"
,
SMCreateTopicReq
,
SMCreateTopicRsp
)
TD_DEF_MSG_TYPE
(
TDMT_MND_ALTER_TOPIC
,
"mnode-alter-topic"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MND_DROP_TOPIC
,
"mnode-drop-topic"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MND_DROP_CGROUP
,
"mnode-drop-cgroup"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MND_SUBSCRIBE
,
"mnode-subscribe"
,
SCMSubscribeReq
,
SCMSubscribeRsp
)
TD_DEF_MSG_TYPE
(
TDMT_MND_MQ_ASK_EP
,
"mnode-mq-ask-ep"
,
SMqAskEpReq
,
SMqAskEpRsp
)
TD_DEF_MSG_TYPE
(
TDMT_MND_MQ_TIMER
,
"mnode-mq-tmr"
,
SMTimerReq
,
NULL
)
...
...
include/common/ttokendef.h
浏览文件 @
070f6040
...
...
@@ -93,166 +93,168 @@
#define TK_VGROUPS 75
#define TK_SINGLE_STABLE 76
#define TK_RETENTIONS 77
#define TK_NK_COLON 78
#define TK_TABLE 79
#define TK_NK_LP 80
#define TK_NK_RP 81
#define TK_STABLE 82
#define TK_ADD 83
#define TK_COLUMN 84
#define TK_MODIFY 85
#define TK_RENAME 86
#define TK_TAG 87
#define TK_SET 88
#define TK_NK_EQ 89
#define TK_USING 90
#define TK_TAGS 91
#define TK_COMMENT 92
#define TK_BOOL 93
#define TK_TINYINT 94
#define TK_SMALLINT 95
#define TK_INT 96
#define TK_INTEGER 97
#define TK_BIGINT 98
#define TK_FLOAT 99
#define TK_DOUBLE 100
#define TK_BINARY 101
#define TK_TIMESTAMP 102
#define TK_NCHAR 103
#define TK_UNSIGNED 104
#define TK_JSON 105
#define TK_VARCHAR 106
#define TK_MEDIUMBLOB 107
#define TK_BLOB 108
#define TK_VARBINARY 109
#define TK_DECIMAL 110
#define TK_DELAY 111
#define TK_FILE_FACTOR 112
#define TK_NK_FLOAT 113
#define TK_ROLLUP 114
#define TK_TTL 115
#define TK_SMA 116
#define TK_SHOW 117
#define TK_DATABASES 118
#define TK_TABLES 119
#define TK_STABLES 120
#define TK_MNODES 121
#define TK_MODULES 122
#define TK_QNODES 123
#define TK_FUNCTIONS 124
#define TK_INDEXES 125
#define TK_ACCOUNTS 126
#define TK_APPS 127
#define TK_CONNECTIONS 128
#define TK_LICENCE 129
#define TK_GRANTS 130
#define TK_QUERIES 131
#define TK_SCORES 132
#define TK_TOPICS 133
#define TK_VARIABLES 134
#define TK_BNODES 135
#define TK_SNODES 136
#define TK_CLUSTER 137
#define TK_TRANSACTIONS 138
#define TK_LIKE 139
#define TK_INDEX 140
#define TK_FULLTEXT 141
#define TK_FUNCTION 142
#define TK_INTERVAL 143
#define TK_TOPIC 144
#define TK_AS 145
#define TK_WITH 146
#define TK_SCHEMA 147
#define TK_DESC 148
#define TK_DESCRIBE 149
#define TK_RESET 150
#define TK_QUERY 151
#define TK_CACHE 152
#define TK_EXPLAIN 153
#define TK_ANALYZE 154
#define TK_VERBOSE 155
#define TK_NK_BOOL 156
#define TK_RATIO 157
#define TK_COMPACT 158
#define TK_VNODES 159
#define TK_IN 160
#define TK_OUTPUTTYPE 161
#define TK_AGGREGATE 162
#define TK_BUFSIZE 163
#define TK_STREAM 164
#define TK_INTO 165
#define TK_TRIGGER 166
#define TK_AT_ONCE 167
#define TK_WINDOW_CLOSE 168
#define TK_WATERMARK 169
#define TK_KILL 170
#define TK_CONNECTION 171
#define TK_TRANSACTION 172
#define TK_MERGE 173
#define TK_VGROUP 174
#define TK_REDISTRIBUTE 175
#define TK_SPLIT 176
#define TK_SYNCDB 177
#define TK_NULL 178
#define TK_NK_QUESTION 179
#define TK_NK_ARROW 180
#define TK_ROWTS 181
#define TK_TBNAME 182
#define TK_QSTARTTS 183
#define TK_QENDTS 184
#define TK_WSTARTTS 185
#define TK_WENDTS 186
#define TK_WDURATION 187
#define TK_CAST 188
#define TK_NOW 189
#define TK_TODAY 190
#define TK_TIMEZONE 191
#define TK_COUNT 192
#define TK_FIRST 193
#define TK_LAST 194
#define TK_LAST_ROW 195
#define TK_BETWEEN 196
#define TK_IS 197
#define TK_NK_LT 198
#define TK_NK_GT 199
#define TK_NK_LE 200
#define TK_NK_GE 201
#define TK_NK_NE 202
#define TK_MATCH 203
#define TK_NMATCH 204
#define TK_CONTAINS 205
#define TK_JOIN 206
#define TK_INNER 207
#define TK_SELECT 208
#define TK_DISTINCT 209
#define TK_WHERE 210
#define TK_PARTITION 211
#define TK_BY 212
#define TK_SESSION 213
#define TK_STATE_WINDOW 214
#define TK_SLIDING 215
#define TK_FILL 216
#define TK_VALUE 217
#define TK_NONE 218
#define TK_PREV 219
#define TK_LINEAR 220
#define TK_NEXT 221
#define TK_GROUP 222
#define TK_HAVING 223
#define TK_ORDER 224
#define TK_SLIMIT 225
#define TK_SOFFSET 226
#define TK_LIMIT 227
#define TK_OFFSET 228
#define TK_ASC 229
#define TK_NULLS 230
#define TK_ID 231
#define TK_NK_BITNOT 232
#define TK_INSERT 233
#define TK_VALUES 234
#define TK_IMPORT 235
#define TK_NK_SEMI 236
#define TK_FILE 237
#define TK_SCHEMALESS 78
#define TK_NK_COLON 79
#define TK_TABLE 80
#define TK_NK_LP 81
#define TK_NK_RP 82
#define TK_STABLE 83
#define TK_ADD 84
#define TK_COLUMN 85
#define TK_MODIFY 86
#define TK_RENAME 87
#define TK_TAG 88
#define TK_SET 89
#define TK_NK_EQ 90
#define TK_USING 91
#define TK_TAGS 92
#define TK_COMMENT 93
#define TK_BOOL 94
#define TK_TINYINT 95
#define TK_SMALLINT 96
#define TK_INT 97
#define TK_INTEGER 98
#define TK_BIGINT 99
#define TK_FLOAT 100
#define TK_DOUBLE 101
#define TK_BINARY 102
#define TK_TIMESTAMP 103
#define TK_NCHAR 104
#define TK_UNSIGNED 105
#define TK_JSON 106
#define TK_VARCHAR 107
#define TK_MEDIUMBLOB 108
#define TK_BLOB 109
#define TK_VARBINARY 110
#define TK_DECIMAL 111
#define TK_DELAY 112
#define TK_FILE_FACTOR 113
#define TK_NK_FLOAT 114
#define TK_ROLLUP 115
#define TK_TTL 116
#define TK_SMA 117
#define TK_SHOW 118
#define TK_DATABASES 119
#define TK_TABLES 120
#define TK_STABLES 121
#define TK_MNODES 122
#define TK_MODULES 123
#define TK_QNODES 124
#define TK_FUNCTIONS 125
#define TK_INDEXES 126
#define TK_ACCOUNTS 127
#define TK_APPS 128
#define TK_CONNECTIONS 129
#define TK_LICENCE 130
#define TK_GRANTS 131
#define TK_QUERIES 132
#define TK_SCORES 133
#define TK_TOPICS 134
#define TK_VARIABLES 135
#define TK_BNODES 136
#define TK_SNODES 137
#define TK_CLUSTER 138
#define TK_TRANSACTIONS 139
#define TK_LIKE 140
#define TK_INDEX 141
#define TK_FULLTEXT 142
#define TK_FUNCTION 143
#define TK_INTERVAL 144
#define TK_TOPIC 145
#define TK_AS 146
#define TK_CGROUP 147
#define TK_WITH 148
#define TK_SCHEMA 149
#define TK_DESC 150
#define TK_DESCRIBE 151
#define TK_RESET 152
#define TK_QUERY 153
#define TK_CACHE 154
#define TK_EXPLAIN 155
#define TK_ANALYZE 156
#define TK_VERBOSE 157
#define TK_NK_BOOL 158
#define TK_RATIO 159
#define TK_COMPACT 160
#define TK_VNODES 161
#define TK_IN 162
#define TK_OUTPUTTYPE 163
#define TK_AGGREGATE 164
#define TK_BUFSIZE 165
#define TK_STREAM 166
#define TK_INTO 167
#define TK_TRIGGER 168
#define TK_AT_ONCE 169
#define TK_WINDOW_CLOSE 170
#define TK_WATERMARK 171
#define TK_KILL 172
#define TK_CONNECTION 173
#define TK_TRANSACTION 174
#define TK_MERGE 175
#define TK_VGROUP 176
#define TK_REDISTRIBUTE 177
#define TK_SPLIT 178
#define TK_SYNCDB 179
#define TK_NULL 180
#define TK_NK_QUESTION 181
#define TK_NK_ARROW 182
#define TK_ROWTS 183
#define TK_TBNAME 184
#define TK_QSTARTTS 185
#define TK_QENDTS 186
#define TK_WSTARTTS 187
#define TK_WENDTS 188
#define TK_WDURATION 189
#define TK_CAST 190
#define TK_NOW 191
#define TK_TODAY 192
#define TK_TIMEZONE 193
#define TK_COUNT 194
#define TK_FIRST 195
#define TK_LAST 196
#define TK_LAST_ROW 197
#define TK_BETWEEN 198
#define TK_IS 199
#define TK_NK_LT 200
#define TK_NK_GT 201
#define TK_NK_LE 202
#define TK_NK_GE 203
#define TK_NK_NE 204
#define TK_MATCH 205
#define TK_NMATCH 206
#define TK_CONTAINS 207
#define TK_JOIN 208
#define TK_INNER 209
#define TK_SELECT 210
#define TK_DISTINCT 211
#define TK_WHERE 212
#define TK_PARTITION 213
#define TK_BY 214
#define TK_SESSION 215
#define TK_STATE_WINDOW 216
#define TK_SLIDING 217
#define TK_FILL 218
#define TK_VALUE 219
#define TK_NONE 220
#define TK_PREV 221
#define TK_LINEAR 222
#define TK_NEXT 223
#define TK_GROUP 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_NK_SPACE 300
#define TK_NK_COMMENT 301
...
...
include/libs/nodes/cmdnodes.h
浏览文件 @
070f6040
...
...
@@ -50,6 +50,7 @@ typedef struct SDatabaseOptions {
int32_t
numOfVgroups
;
int8_t
singleStable
;
SNodeList
*
pRetentions
;
int8_t
schemaless
;
}
SDatabaseOptions
;
typedef
struct
SCreateDatabaseStmt
{
...
...
@@ -260,6 +261,13 @@ typedef struct SDropTopicStmt {
bool
ignoreNotExists
;
}
SDropTopicStmt
;
typedef
struct
SDropCGroupStmt
{
ENodeType
type
;
char
topicName
[
TSDB_TABLE_NAME_LEN
];
char
cgroup
[
TSDB_CGROUP_LEN
];
bool
ignoreNotExists
;
}
SDropCGroupStmt
;
typedef
struct
SAlterLocalStmt
{
ENodeType
type
;
char
config
[
TSDB_DNODE_CONFIG_LEN
];
...
...
include/libs/nodes/nodes.h
浏览文件 @
070f6040
...
...
@@ -131,6 +131,7 @@ typedef enum ENodeType {
QUERY_NODE_DROP_MNODE_STMT
,
QUERY_NODE_CREATE_TOPIC_STMT
,
QUERY_NODE_DROP_TOPIC_STMT
,
QUERY_NODE_DROP_CGROUP_STMT
,
QUERY_NODE_ALTER_LOCAL_STMT
,
QUERY_NODE_EXPLAIN_STMT
,
QUERY_NODE_DESCRIBE_STMT
,
...
...
@@ -242,7 +243,6 @@ typedef struct SNodeList {
#define SNodeptr void*
int32_t
nodesNodeSize
(
ENodeType
type
);
SNodeptr
nodesMakeNode
(
ENodeType
type
);
void
nodesDestroyNode
(
SNodeptr
pNode
);
...
...
include/libs/nodes/plannodes.h
浏览文件 @
070f6040
...
...
@@ -31,6 +31,7 @@ typedef struct SLogicNode {
SNodeList
*
pChildren
;
struct
SLogicNode
*
pParent
;
int32_t
optimizedFlag
;
uint8_t
precision
;
}
SLogicNode
;
typedef
enum
EScanType
{
SCAN_TYPE_TAG
=
1
,
SCAN_TYPE_TABLE
,
SCAN_TYPE_SYSTEM_TABLE
,
SCAN_TYPE_STREAM
}
EScanType
;
...
...
@@ -61,6 +62,7 @@ typedef struct SJoinLogicNode {
SLogicNode
node
;
EJoinType
joinType
;
SNode
*
pOnConditions
;
bool
isSingleTableJoin
;
}
SJoinLogicNode
;
typedef
struct
SAggLogicNode
{
...
...
include/libs/nodes/querynodes.h
浏览文件 @
070f6040
...
...
@@ -132,6 +132,7 @@ typedef struct STableNode {
char
tableName
[
TSDB_TABLE_NAME_LEN
];
char
tableAlias
[
TSDB_TABLE_NAME_LEN
];
uint8_t
precision
;
bool
singleTable
;
}
STableNode
;
struct
STableMeta
;
...
...
@@ -242,6 +243,7 @@ typedef struct SSelectStmt {
bool
hasAggFuncs
;
bool
hasRepeatScanFuncs
;
bool
hasIndefiniteRowsFunc
;
bool
hasSelectFunc
;
bool
hasSelectValFunc
;
}
SSelectStmt
;
...
...
include/util/tdef.h
浏览文件 @
070f6040
...
...
@@ -334,9 +334,12 @@ typedef enum ELogicConditionType {
#define TSDB_DB_STREAM_MODE_OFF 0
#define TSDB_DB_STREAM_MODE_ON 1
#define TSDB_DEFAULT_DB_STREAM_MODE 0
#define TSDB_DB_SINGLE_STABLE_ON 0
#define TSDB_DB_SINGLE_STABLE_OFF 1
#define TSDB_DEFAULT_DB_SINGLE_STABLE 0
#define TSDB_DB_SINGLE_STABLE_ON 1
#define TSDB_DB_SINGLE_STABLE_OFF 0
#define TSDB_DEFAULT_DB_SINGLE_STABLE TSDB_DB_SINGLE_STABLE_OFF
#define TSDB_DB_SCHEMALESS_ON 1
#define TSDB_DB_SCHEMALESS_OFF 0
#define TSDB_DEFAULT_DB_SCHEMALESS TSDB_DB_SCHEMALESS_OFF
#define TSDB_MIN_ROLLUP_FILE_FACTOR 0
#define TSDB_MAX_ROLLUP_FILE_FACTOR 1
...
...
source/common/src/tdatablock.c
浏览文件 @
070f6040
...
...
@@ -275,8 +275,10 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, in
doBitmapMerge
(
pColumnInfoData
,
numOfRow1
,
pSource
,
numOfRow2
);
int32_t
offset
=
pColumnInfoData
->
info
.
bytes
*
numOfRow1
;
memcpy
(
pColumnInfoData
->
pData
+
offset
,
pSource
->
pData
,
pSource
->
info
.
bytes
*
numOfRow2
);
if
(
pSource
->
pData
)
{
int32_t
offset
=
pColumnInfoData
->
info
.
bytes
*
numOfRow1
;
memcpy
(
pColumnInfoData
->
pData
+
offset
,
pSource
->
pData
,
pSource
->
info
.
bytes
*
numOfRow2
);
}
}
return
numOfRow1
+
numOfRow2
;
...
...
@@ -319,14 +321,16 @@ int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* p
pColumnInfoData
->
nullbitmap
=
tmp
;
memcpy
(
pColumnInfoData
->
nullbitmap
,
pSource
->
nullbitmap
,
BitmapLen
(
numOfRows
));
int32_t
newSize
=
numOfRows
*
pColumnInfoData
->
info
.
bytes
;
tmp
=
taosMemoryRealloc
(
pColumnInfoData
->
pData
,
newSize
);
if
(
tmp
==
NULL
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
if
(
pColumnInfoData
->
pData
)
{
int32_t
newSize
=
numOfRows
*
pColumnInfoData
->
info
.
bytes
;
tmp
=
taosMemoryRealloc
(
pColumnInfoData
->
pData
,
newSize
);
if
(
tmp
==
NULL
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pColumnInfoData
->
pData
=
tmp
;
memcpy
(
pColumnInfoData
->
pData
,
pSource
->
pData
,
pSource
->
info
.
bytes
*
numOfRows
);
pColumnInfoData
->
pData
=
tmp
;
memcpy
(
pColumnInfoData
->
pData
,
pSource
->
pData
,
pSource
->
info
.
bytes
*
numOfRows
);
}
}
pColumnInfoData
->
hasNull
=
pSource
->
hasNull
;
...
...
@@ -350,7 +354,7 @@ int32_t blockDataUpdateTsWindow(SSDataBlock* pDataBlock, int32_t tsColumnIndex)
return
-
1
;
}
int32_t
index
=
(
tsColumnIndex
==
-
1
)
?
0
:
tsColumnIndex
;
int32_t
index
=
(
tsColumnIndex
==
-
1
)
?
0
:
tsColumnIndex
;
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pDataBlock
->
pDataBlock
,
index
);
if
(
pColInfoData
->
info
.
type
!=
TSDB_DATA_TYPE_TIMESTAMP
)
{
return
0
;
...
...
@@ -605,8 +609,8 @@ int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf) {
}
int32_t
blockDataFromBuf1
(
SSDataBlock
*
pBlock
,
const
char
*
buf
,
size_t
capacity
)
{
pBlock
->
info
.
rows
=
*
(
int32_t
*
)
buf
;
pBlock
->
info
.
groupId
=
*
(
uint64_t
*
)
(
buf
+
sizeof
(
int32_t
));
pBlock
->
info
.
rows
=
*
(
int32_t
*
)
buf
;
pBlock
->
info
.
groupId
=
*
(
uint64_t
*
)(
buf
+
sizeof
(
int32_t
));
int32_t
numOfCols
=
pBlock
->
info
.
numOfCols
;
const
char
*
pStart
=
buf
+
sizeof
(
uint32_t
)
+
sizeof
(
uint64_t
);
...
...
@@ -675,7 +679,7 @@ size_t blockDataGetSerialMetaSize(const SSDataBlock* pBlock) {
return
sizeof
(
int32_t
)
+
sizeof
(
uint64_t
)
+
pBlock
->
info
.
numOfCols
*
sizeof
(
int32_t
);
}
double
blockDataGetSerialRowSize
(
const
SSDataBlock
*
pBlock
)
{
double
blockDataGetSerialRowSize
(
const
SSDataBlock
*
pBlock
)
{
ASSERT
(
pBlock
!=
NULL
);
double
rowSize
=
0
;
...
...
@@ -1238,7 +1242,7 @@ size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize) {
// the true value must be less than the value of nRows
int32_t
additional
=
0
;
for
(
int32_t
i
=
0
;
i
<
pBlock
->
info
.
numOfCols
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pBlock
->
info
.
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pBlock
->
pDataBlock
,
i
);
if
(
IS_VAR_DATA_TYPE
(
pCol
->
info
.
type
))
{
additional
+=
nRows
*
sizeof
(
int32_t
);
...
...
source/common/src/tmsg.c
浏览文件 @
070f6040
...
...
@@ -1675,6 +1675,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
if
(
tEncodeI8
(
&
encoder
,
pReq
->
replications
)
<
0
)
return
-
1
;
if
(
tEncodeI8
(
&
encoder
,
pReq
->
strict
)
<
0
)
return
-
1
;
if
(
tEncodeI8
(
&
encoder
,
pReq
->
cacheLastRow
)
<
0
)
return
-
1
;
if
(
tEncodeI8
(
&
encoder
,
pReq
->
schemaless
)
<
0
)
return
-
1
;
if
(
tEncodeI8
(
&
encoder
,
pReq
->
ignoreExist
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
&
encoder
,
pReq
->
numOfRetensions
)
<
0
)
return
-
1
;
for
(
int32_t
i
=
0
;
i
<
pReq
->
numOfRetensions
;
++
i
)
{
...
...
@@ -1715,6 +1716,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq)
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
replications
)
<
0
)
return
-
1
;
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
strict
)
<
0
)
return
-
1
;
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
cacheLastRow
)
<
0
)
return
-
1
;
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
schemaless
)
<
0
)
return
-
1
;
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
ignoreExist
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
&
decoder
,
&
pReq
->
numOfRetensions
)
<
0
)
return
-
1
;
pReq
->
pRetensions
=
taosArrayInit
(
pReq
->
numOfRetensions
,
sizeof
(
SRetention
));
...
...
@@ -3347,7 +3349,8 @@ int32_t tDeserializeSExplainRsp(void *buf, int32_t bufLen, SExplainRsp *pRsp) {
if
(
tDecodeDouble
(
&
decoder
,
&
pRsp
->
subplanInfo
[
i
].
totalCost
)
<
0
)
return
-
1
;
if
(
tDecodeU64
(
&
decoder
,
&
pRsp
->
subplanInfo
[
i
].
numOfRows
)
<
0
)
return
-
1
;
if
(
tDecodeU32
(
&
decoder
,
&
pRsp
->
subplanInfo
[
i
].
verboseLen
)
<
0
)
return
-
1
;
if
(
tDecodeBinary
(
&
decoder
,
(
uint8_t
**
)
&
pRsp
->
subplanInfo
[
i
].
verboseInfo
,
&
pRsp
->
subplanInfo
[
i
].
verboseLen
)
<
0
)
return
-
1
;
if
(
tDecodeBinary
(
&
decoder
,
(
uint8_t
**
)
&
pRsp
->
subplanInfo
[
i
].
verboseInfo
,
&
pRsp
->
subplanInfo
[
i
].
verboseLen
)
<
0
)
return
-
1
;
}
tEndDecode
(
&
decoder
);
...
...
source/libs/function/src/builtins.c
浏览文件 @
070f6040
...
...
@@ -190,14 +190,14 @@ static int32_t translateApercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t
if
(
nodeType
(
pParamNode
)
!=
QUERY_NODE_VALUE
)
{
return
invaildFuncParaTypeErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
}
SValueNode
*
pValue
=
(
SValueNode
*
)
pParamNode
;
if
(
pValue
->
datum
.
i
<
0
||
pValue
->
datum
.
i
>
100
)
{
return
invaildFuncParaValueErrMsg
(
pErrBuf
,
len
,
pFunc
->
functionName
);
}
pValue
->
notReserved
=
true
;
if
(
3
==
paraNum
)
{
SNode
*
pPara3
=
nodesListGetNode
(
pFunc
->
pParameterList
,
2
);
if
(
QUERY_NODE_VALUE
!=
nodeType
(
pPara3
)
||
!
validAperventileAlgo
((
SValueNode
*
)
pPara3
))
{
...
...
@@ -837,7 +837,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.
name
=
"top"
,
.
type
=
FUNCTION_TYPE_TOP
,
.
classification
=
FUNC_MGT_SELECT_FUNC
|
FUNC_MGT_INDEFINITE_ROWS_FUNC
,
.
classification
=
FUNC_MGT_
AGG_FUNC
|
FUNC_MGT_
SELECT_FUNC
|
FUNC_MGT_INDEFINITE_ROWS_FUNC
,
.
translateFunc
=
translateTop
,
.
getEnvFunc
=
getTopBotFuncEnv
,
.
initFunc
=
functionSetup
,
...
...
@@ -847,7 +847,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.
name
=
"bottom"
,
.
type
=
FUNCTION_TYPE_BOTTOM
,
.
classification
=
FUNC_MGT_SELECT_FUNC
|
FUNC_MGT_INDEFINITE_ROWS_FUNC
,
.
classification
=
FUNC_MGT_
AGG_FUNC
|
FUNC_MGT_
SELECT_FUNC
|
FUNC_MGT_INDEFINITE_ROWS_FUNC
,
.
translateFunc
=
translateBottom
,
.
getEnvFunc
=
getTopBotFuncEnv
,
.
initFunc
=
functionSetup
,
...
...
source/libs/nodes/src/nodesCloneFuncs.c
浏览文件 @
070f6040
...
...
@@ -191,6 +191,7 @@ static SNode* tableNodeCopy(const STableNode* pSrc, STableNode* pDst) {
COPY_CHAR_ARRAY_FIELD
(
tableName
);
COPY_CHAR_ARRAY_FIELD
(
tableAlias
);
COPY_SCALAR_FIELD
(
precision
);
COPY_SCALAR_FIELD
(
singleTable
);
return
(
SNode
*
)
pDst
;
}
...
...
@@ -326,6 +327,7 @@ static SNode* logicScanCopy(const SScanLogicNode* pSrc, SScanLogicNode* pDst) {
COPY_SCALAR_FIELD
(
sliding
);
COPY_SCALAR_FIELD
(
intervalUnit
);
COPY_SCALAR_FIELD
(
slidingUnit
);
CLONE_NODE_FIELD
(
pTagCond
);
return
(
SNode
*
)
pDst
;
}
...
...
@@ -333,6 +335,7 @@ static SNode* logicJoinCopy(const SJoinLogicNode* pSrc, SJoinLogicNode* pDst) {
COPY_BASE_OBJECT_FIELD
(
node
,
logicNodeCopy
);
COPY_SCALAR_FIELD
(
joinType
);
CLONE_NODE_FIELD
(
pOnConditions
);
COPY_SCALAR_FIELD
(
isSingleTableJoin
);
return
(
SNode
*
)
pDst
;
}
...
...
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
070f6040
...
...
@@ -21,149 +21,160 @@
#include "taoserror.h"
#include "thash.h"
int32_t
nodesNodeSize
(
ENodeType
type
)
{
static
SNode
*
makeNode
(
ENodeType
type
,
size_t
size
)
{
SNode
*
p
=
taosMemoryCalloc
(
1
,
size
);
if
(
NULL
==
p
)
{
return
NULL
;
}
setNodeType
(
p
,
type
);
return
p
;
}
SNodeptr
nodesMakeNode
(
ENodeType
type
)
{
switch
(
type
)
{
case
QUERY_NODE_COLUMN
:
return
sizeof
(
SColumnNode
);
return
makeNode
(
type
,
sizeof
(
SColumnNode
)
);
case
QUERY_NODE_VALUE
:
return
sizeof
(
SValueNode
);
return
makeNode
(
type
,
sizeof
(
SValueNode
)
);
case
QUERY_NODE_OPERATOR
:
return
sizeof
(
SOperatorNode
);
return
makeNode
(
type
,
sizeof
(
SOperatorNode
)
);
case
QUERY_NODE_LOGIC_CONDITION
:
return
sizeof
(
SLogicConditionNode
);
return
makeNode
(
type
,
sizeof
(
SLogicConditionNode
)
);
case
QUERY_NODE_FUNCTION
:
return
sizeof
(
SFunctionNode
);
return
makeNode
(
type
,
sizeof
(
SFunctionNode
)
);
case
QUERY_NODE_REAL_TABLE
:
return
sizeof
(
SRealTableNode
);
return
makeNode
(
type
,
sizeof
(
SRealTableNode
)
);
case
QUERY_NODE_TEMP_TABLE
:
return
sizeof
(
STempTableNode
);
return
makeNode
(
type
,
sizeof
(
STempTableNode
)
);
case
QUERY_NODE_JOIN_TABLE
:
return
sizeof
(
SJoinTableNode
);
return
makeNode
(
type
,
sizeof
(
SJoinTableNode
)
);
case
QUERY_NODE_GROUPING_SET
:
return
sizeof
(
SGroupingSetNode
);
return
makeNode
(
type
,
sizeof
(
SGroupingSetNode
)
);
case
QUERY_NODE_ORDER_BY_EXPR
:
return
sizeof
(
SOrderByExprNode
);
return
makeNode
(
type
,
sizeof
(
SOrderByExprNode
)
);
case
QUERY_NODE_LIMIT
:
return
sizeof
(
SLimitNode
);
return
makeNode
(
type
,
sizeof
(
SLimitNode
)
);
case
QUERY_NODE_STATE_WINDOW
:
return
sizeof
(
SStateWindowNode
);
return
makeNode
(
type
,
sizeof
(
SStateWindowNode
)
);
case
QUERY_NODE_SESSION_WINDOW
:
return
sizeof
(
SSessionWindowNode
);
return
makeNode
(
type
,
sizeof
(
SSessionWindowNode
)
);
case
QUERY_NODE_INTERVAL_WINDOW
:
return
sizeof
(
SIntervalWindowNode
);
return
makeNode
(
type
,
sizeof
(
SIntervalWindowNode
)
);
case
QUERY_NODE_NODE_LIST
:
return
sizeof
(
SNodeListNode
);
return
makeNode
(
type
,
sizeof
(
SNodeListNode
)
);
case
QUERY_NODE_FILL
:
return
sizeof
(
SFillNode
);
return
makeNode
(
type
,
sizeof
(
SFillNode
)
);
case
QUERY_NODE_RAW_EXPR
:
return
sizeof
(
SRawExprNode
);
return
makeNode
(
type
,
sizeof
(
SRawExprNode
)
);
case
QUERY_NODE_TARGET
:
return
sizeof
(
STargetNode
);
return
makeNode
(
type
,
sizeof
(
STargetNode
)
);
case
QUERY_NODE_DATABLOCK_DESC
:
return
sizeof
(
SDataBlockDescNode
);
return
makeNode
(
type
,
sizeof
(
SDataBlockDescNode
)
);
case
QUERY_NODE_SLOT_DESC
:
return
sizeof
(
SSlotDescNode
);
return
makeNode
(
type
,
sizeof
(
SSlotDescNode
)
);
case
QUERY_NODE_COLUMN_DEF
:
return
sizeof
(
SColumnDefNode
);
return
makeNode
(
type
,
sizeof
(
SColumnDefNode
)
);
case
QUERY_NODE_DOWNSTREAM_SOURCE
:
return
sizeof
(
SDownstreamSourceNode
);
return
makeNode
(
type
,
sizeof
(
SDownstreamSourceNode
)
);
case
QUERY_NODE_DATABASE_OPTIONS
:
return
sizeof
(
SDatabaseOptions
);
return
makeNode
(
type
,
sizeof
(
SDatabaseOptions
)
);
case
QUERY_NODE_TABLE_OPTIONS
:
return
sizeof
(
STableOptions
);
return
makeNode
(
type
,
sizeof
(
STableOptions
)
);
case
QUERY_NODE_INDEX_OPTIONS
:
return
sizeof
(
SIndexOptions
);
return
makeNode
(
type
,
sizeof
(
SIndexOptions
)
);
case
QUERY_NODE_EXPLAIN_OPTIONS
:
return
sizeof
(
SExplainOptions
);
return
makeNode
(
type
,
sizeof
(
SExplainOptions
)
);
case
QUERY_NODE_STREAM_OPTIONS
:
return
sizeof
(
SStreamOptions
);
return
makeNode
(
type
,
sizeof
(
SStreamOptions
)
);
case
QUERY_NODE_TOPIC_OPTIONS
:
return
sizeof
(
STopicOptions
);
return
makeNode
(
type
,
sizeof
(
STopicOptions
)
);
case
QUERY_NODE_LEFT_VALUE
:
return
sizeof
(
SLeftValueNode
);
return
makeNode
(
type
,
sizeof
(
SLeftValueNode
)
);
case
QUERY_NODE_SET_OPERATOR
:
return
sizeof
(
SSetOperator
);
return
makeNode
(
type
,
sizeof
(
SSetOperator
)
);
case
QUERY_NODE_SELECT_STMT
:
return
sizeof
(
SSelectStmt
);
return
makeNode
(
type
,
sizeof
(
SSelectStmt
)
);
case
QUERY_NODE_VNODE_MODIF_STMT
:
return
sizeof
(
SVnodeModifOpStmt
);
return
makeNode
(
type
,
sizeof
(
SVnodeModifOpStmt
)
);
case
QUERY_NODE_CREATE_DATABASE_STMT
:
return
sizeof
(
SCreateDatabaseStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateDatabaseStmt
)
);
case
QUERY_NODE_DROP_DATABASE_STMT
:
return
sizeof
(
SDropDatabaseStmt
);
return
makeNode
(
type
,
sizeof
(
SDropDatabaseStmt
)
);
case
QUERY_NODE_ALTER_DATABASE_STMT
:
return
sizeof
(
SAlterDatabaseStmt
);
return
makeNode
(
type
,
sizeof
(
SAlterDatabaseStmt
)
);
case
QUERY_NODE_CREATE_TABLE_STMT
:
return
sizeof
(
SCreateTableStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateTableStmt
)
);
case
QUERY_NODE_CREATE_SUBTABLE_CLAUSE
:
return
sizeof
(
SCreateSubTableClause
);
return
makeNode
(
type
,
sizeof
(
SCreateSubTableClause
)
);
case
QUERY_NODE_CREATE_MULTI_TABLE_STMT
:
return
sizeof
(
SCreateMultiTableStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateMultiTableStmt
)
);
case
QUERY_NODE_DROP_TABLE_CLAUSE
:
return
sizeof
(
SDropTableClause
);
return
makeNode
(
type
,
sizeof
(
SDropTableClause
)
);
case
QUERY_NODE_DROP_TABLE_STMT
:
return
sizeof
(
SDropTableStmt
);
return
makeNode
(
type
,
sizeof
(
SDropTableStmt
)
);
case
QUERY_NODE_DROP_SUPER_TABLE_STMT
:
return
sizeof
(
SDropSuperTableStmt
);
return
makeNode
(
type
,
sizeof
(
SDropSuperTableStmt
)
);
case
QUERY_NODE_ALTER_TABLE_STMT
:
return
sizeof
(
SAlterTableStmt
);
return
makeNode
(
type
,
sizeof
(
SAlterTableStmt
)
);
case
QUERY_NODE_CREATE_USER_STMT
:
return
sizeof
(
SCreateUserStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateUserStmt
)
);
case
QUERY_NODE_ALTER_USER_STMT
:
return
sizeof
(
SAlterUserStmt
);
return
makeNode
(
type
,
sizeof
(
SAlterUserStmt
)
);
case
QUERY_NODE_DROP_USER_STMT
:
return
sizeof
(
SDropUserStmt
);
return
makeNode
(
type
,
sizeof
(
SDropUserStmt
)
);
case
QUERY_NODE_USE_DATABASE_STMT
:
return
sizeof
(
SUseDatabaseStmt
);
return
makeNode
(
type
,
sizeof
(
SUseDatabaseStmt
)
);
case
QUERY_NODE_CREATE_DNODE_STMT
:
return
sizeof
(
SCreateDnodeStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateDnodeStmt
)
);
case
QUERY_NODE_DROP_DNODE_STMT
:
return
sizeof
(
SDropDnodeStmt
);
return
makeNode
(
type
,
sizeof
(
SDropDnodeStmt
)
);
case
QUERY_NODE_ALTER_DNODE_STMT
:
return
sizeof
(
SAlterDnodeStmt
);
return
makeNode
(
type
,
sizeof
(
SAlterDnodeStmt
)
);
case
QUERY_NODE_CREATE_INDEX_STMT
:
return
sizeof
(
SCreateIndexStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateIndexStmt
)
);
case
QUERY_NODE_DROP_INDEX_STMT
:
return
sizeof
(
SDropIndexStmt
);
return
makeNode
(
type
,
sizeof
(
SDropIndexStmt
)
);
case
QUERY_NODE_CREATE_QNODE_STMT
:
case
QUERY_NODE_CREATE_BNODE_STMT
:
case
QUERY_NODE_CREATE_SNODE_STMT
:
case
QUERY_NODE_CREATE_MNODE_STMT
:
return
sizeof
(
SCreateComponentNodeStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateComponentNodeStmt
)
);
case
QUERY_NODE_DROP_QNODE_STMT
:
case
QUERY_NODE_DROP_BNODE_STMT
:
case
QUERY_NODE_DROP_SNODE_STMT
:
case
QUERY_NODE_DROP_MNODE_STMT
:
return
sizeof
(
SDropComponentNodeStmt
);
return
makeNode
(
type
,
sizeof
(
SDropComponentNodeStmt
)
);
case
QUERY_NODE_CREATE_TOPIC_STMT
:
return
sizeof
(
SCreateTopicStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateTopicStmt
)
);
case
QUERY_NODE_DROP_TOPIC_STMT
:
return
sizeof
(
SDropTopicStmt
);
return
makeNode
(
type
,
sizeof
(
SDropTopicStmt
));
case
QUERY_NODE_DROP_CGROUP_STMT
:
return
makeNode
(
type
,
sizeof
(
SDropCGroupStmt
));
case
QUERY_NODE_EXPLAIN_STMT
:
return
sizeof
(
SExplainStmt
);
return
makeNode
(
type
,
sizeof
(
SExplainStmt
)
);
case
QUERY_NODE_DESCRIBE_STMT
:
return
sizeof
(
SDescribeStmt
);
return
makeNode
(
type
,
sizeof
(
SDescribeStmt
)
);
case
QUERY_NODE_RESET_QUERY_CACHE_STMT
:
return
sizeof
(
SNode
);
return
makeNode
(
type
,
sizeof
(
SNode
)
);
case
QUERY_NODE_COMPACT_STMT
:
break
;
case
QUERY_NODE_CREATE_FUNCTION_STMT
:
return
sizeof
(
SCreateFunctionStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateFunctionStmt
)
);
case
QUERY_NODE_DROP_FUNCTION_STMT
:
return
sizeof
(
SDropFunctionStmt
);
return
makeNode
(
type
,
sizeof
(
SDropFunctionStmt
)
);
case
QUERY_NODE_CREATE_STREAM_STMT
:
return
sizeof
(
SCreateStreamStmt
);
return
makeNode
(
type
,
sizeof
(
SCreateStreamStmt
)
);
case
QUERY_NODE_DROP_STREAM_STMT
:
return
sizeof
(
SDropStreamStmt
);
return
makeNode
(
type
,
sizeof
(
SDropStreamStmt
)
);
case
QUERY_NODE_MERGE_VGROUP_STMT
:
case
QUERY_NODE_REDISTRIBUTE_VGROUP_STMT
:
case
QUERY_NODE_SPLIT_VGROUP_STMT
:
case
QUERY_NODE_SYNCDB_STMT
:
break
;
case
QUERY_NODE_GRANT_STMT
:
return
sizeof
(
SGrantStmt
);
return
makeNode
(
type
,
sizeof
(
SGrantStmt
)
);
case
QUERY_NODE_REVOKE_STMT
:
return
sizeof
(
SRevokeStmt
);
return
makeNode
(
type
,
sizeof
(
SRevokeStmt
)
);
case
QUERY_NODE_SHOW_DNODES_STMT
:
case
QUERY_NODE_SHOW_MNODES_STMT
:
case
QUERY_NODE_SHOW_MODULES_STMT
:
...
...
@@ -194,89 +205,80 @@ int32_t nodesNodeSize(ENodeType type) {
case
QUERY_NODE_SHOW_CREATE_TABLE_STMT
:
case
QUERY_NODE_SHOW_CREATE_STABLE_STMT
:
case
QUERY_NODE_SHOW_TRANSACTIONS_STMT
:
return
sizeof
(
SShowStmt
);
return
makeNode
(
type
,
sizeof
(
SShowStmt
)
);
case
QUERY_NODE_KILL_CONNECTION_STMT
:
case
QUERY_NODE_KILL_QUERY_STMT
:
case
QUERY_NODE_KILL_TRANSACTION_STMT
:
return
sizeof
(
SKillStmt
);
return
makeNode
(
type
,
sizeof
(
SKillStmt
)
);
case
QUERY_NODE_LOGIC_PLAN_SCAN
:
return
sizeof
(
SScanLogicNode
);
return
makeNode
(
type
,
sizeof
(
SScanLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_JOIN
:
return
sizeof
(
SJoinLogicNode
);
return
makeNode
(
type
,
sizeof
(
SJoinLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_AGG
:
return
sizeof
(
SAggLogicNode
);
return
makeNode
(
type
,
sizeof
(
SAggLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_PROJECT
:
return
sizeof
(
SProjectLogicNode
);
return
makeNode
(
type
,
sizeof
(
SProjectLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_VNODE_MODIF
:
return
sizeof
(
SVnodeModifLogicNode
);
return
makeNode
(
type
,
sizeof
(
SVnodeModifLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_EXCHANGE
:
return
sizeof
(
SExchangeLogicNode
);
return
makeNode
(
type
,
sizeof
(
SExchangeLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_WINDOW
:
return
sizeof
(
SWindowLogicNode
);
return
makeNode
(
type
,
sizeof
(
SWindowLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_FILL
:
return
sizeof
(
SFillLogicNode
);
return
makeNode
(
type
,
sizeof
(
SFillLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_SORT
:
return
sizeof
(
SSortLogicNode
);
return
makeNode
(
type
,
sizeof
(
SSortLogicNode
)
);
case
QUERY_NODE_LOGIC_PLAN_PARTITION
:
return
sizeof
(
SPartitionLogicNode
);
return
makeNode
(
type
,
sizeof
(
SPartitionLogicNode
)
);
case
QUERY_NODE_LOGIC_SUBPLAN
:
return
sizeof
(
SLogicSubplan
);
return
makeNode
(
type
,
sizeof
(
SLogicSubplan
)
);
case
QUERY_NODE_LOGIC_PLAN
:
return
sizeof
(
SQueryLogicPlan
);
return
makeNode
(
type
,
sizeof
(
SQueryLogicPlan
)
);
case
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
:
return
sizeof
(
STagScanPhysiNode
);
return
makeNode
(
type
,
sizeof
(
STagScanPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN
:
return
sizeof
(
STableScanPhysiNode
);
return
makeNode
(
type
,
sizeof
(
STableScanPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN
:
return
sizeof
(
STableSeqScanPhysiNode
);
return
makeNode
(
type
,
sizeof
(
STableSeqScanPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN
:
return
sizeof
(
SStreamScanPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SStreamScanPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN
:
return
sizeof
(
SSystemTableScanPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SSystemTableScanPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_PROJECT
:
return
sizeof
(
SProjectPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SProjectPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_JOIN
:
return
sizeof
(
SJoinPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SJoinPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_AGG
:
return
sizeof
(
SAggPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SAggPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_EXCHANGE
:
return
sizeof
(
SExchangePhysiNode
);
return
makeNode
(
type
,
sizeof
(
SExchangePhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_SORT
:
return
sizeof
(
SSortPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SSortPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_INTERVAL
:
return
sizeof
(
SIntervalPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SIntervalPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL
:
return
sizeof
(
SStreamIntervalPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SStreamIntervalPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_FILL
:
return
sizeof
(
SFillPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SFillPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW
:
return
sizeof
(
SSessionWinodwPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SSessionWinodwPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW
:
return
sizeof
(
SStateWinodwPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SStateWinodwPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_PARTITION
:
return
sizeof
(
SPartitionPhysiNode
);
return
makeNode
(
type
,
sizeof
(
SPartitionPhysiNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_DISPATCH
:
return
sizeof
(
SDataDispatcherNode
);
return
makeNode
(
type
,
sizeof
(
SDataDispatcherNode
)
);
case
QUERY_NODE_PHYSICAL_PLAN_INSERT
:
return
sizeof
(
SDataInserterNode
);
return
makeNode
(
type
,
sizeof
(
SDataInserterNode
)
);
case
QUERY_NODE_PHYSICAL_SUBPLAN
:
return
sizeof
(
SSubplan
);
return
makeNode
(
type
,
sizeof
(
SSubplan
)
);
case
QUERY_NODE_PHYSICAL_PLAN
:
return
sizeof
(
SQueryPlan
);
return
makeNode
(
type
,
sizeof
(
SQueryPlan
)
);
default:
break
;
}
nodesError
(
"nodesMakeNode unknown node = %s"
,
nodesNodeName
(
type
));
return
0
;
}
SNodeptr
nodesMakeNode
(
ENodeType
type
)
{
SNode
*
p
=
taosMemoryCalloc
(
1
,
nodesNodeSize
(
type
));
if
(
NULL
==
p
)
{
return
NULL
;
}
setNodeType
(
p
,
type
);
return
p
;
return
NULL
;
}
static
void
destroyVgDataBlockArray
(
SArray
*
pArray
)
{
...
...
source/libs/parser/inc/parAst.h
浏览文件 @
070f6040
...
...
@@ -53,7 +53,8 @@ typedef enum EDatabaseOptionType {
DB_OPTION_WAL
,
DB_OPTION_VGROUPS
,
DB_OPTION_SINGLE_STABLE
,
DB_OPTION_RETENTIONS
DB_OPTION_RETENTIONS
,
DB_OPTION_SCHEMALESS
}
EDatabaseOptionType
;
typedef
enum
ETableOptionType
{
...
...
@@ -169,6 +170,8 @@ SNode* createTopicOptions(SAstCreateContext* pCxt);
SNode
*
createCreateTopicStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
const
SToken
*
pTopicName
,
SNode
*
pQuery
,
const
SToken
*
pSubscribeDbName
,
SNode
*
pOptions
);
SNode
*
createDropTopicStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
const
SToken
*
pTopicName
);
SNode
*
createDropCGroupStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
const
SToken
*
pCGroupId
,
const
SToken
*
pTopicName
);
SNode
*
createAlterLocalStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pConfig
,
const
SToken
*
pValue
);
SNode
*
createDefaultExplainOptions
(
SAstCreateContext
*
pCxt
);
SNode
*
setExplainVerbose
(
SAstCreateContext
*
pCxt
,
SNode
*
pOptions
,
const
SToken
*
pVal
);
...
...
source/libs/parser/inc/sql.y
浏览文件 @
070f6040
...
...
@@ -180,6 +180,7 @@ db_options(A) ::= db_options(B) WAL NK_INTEGER(C).
db_options(A) ::= db_options(B) VGROUPS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_VGROUPS, &C); }
db_options(A) ::= db_options(B) SINGLE_STABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLE_STABLE, &C); }
db_options(A) ::= db_options(B) RETENTIONS retention_list(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_RETENTIONS, C); }
db_options(A) ::= db_options(B) SCHEMALESS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SCHEMALESS, &C); }
alter_db_options(A) ::= alter_db_option(B). { A = createAlterDatabaseOptions(pCxt); A = setAlterDatabaseOption(pCxt, A, &B); }
alter_db_options(A) ::= alter_db_options(B) alter_db_option(C). { A = setAlterDatabaseOption(pCxt, B, &C); }
...
...
@@ -407,6 +408,7 @@ cmd ::= CREATE TOPIC not_exists_opt(A)
cmd ::= CREATE TOPIC not_exists_opt(A)
topic_name(B) topic_options(D) AS db_name(C). { pCxt->pRootNode = createCreateTopicStmt(pCxt, A, &B, NULL, &C, D); }
cmd ::= DROP TOPIC exists_opt(A) topic_name(B). { pCxt->pRootNode = createDropTopicStmt(pCxt, A, &B); }
cmd ::= DROP CGROUP exists_opt(A) cgroup_name(B) ON topic_name(C). { pCxt->pRootNode = createDropCGroupStmt(pCxt, A, &B, &C); }
topic_options(A) ::= . { A = createTopicOptions(pCxt); }
topic_options(A) ::= topic_options(B) WITH TABLE. { ((STopicOptions*)B)->withTable = true; A = B; }
...
...
@@ -565,6 +567,10 @@ topic_name(A) ::= NK_ID(B).
%destructor stream_name { }
stream_name(A) ::= NK_ID(B). { A = B; }
%type cgroup_name { SToken }
%destructor cgroup_name { }
cgroup_name(A) ::= NK_ID(B). { A = B; }
/************************************************ expression **********************************************************/
expression(A) ::= literal(B). { A = B; }
expression(A) ::= pseudo_column(B). { A = B; }
...
...
source/libs/parser/src/parAstCreater.c
浏览文件 @
070f6040
...
...
@@ -29,12 +29,11 @@
} \
} while (0)
#define CHECK_RAW_EXPR_NODE(node) \
do { \
if (NULL == (node) || QUERY_NODE_RAW_EXPR != nodeType(node)) { \
pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR; \
return NULL; \
} \
#define CHECK_PARSER_STATUS(pCxt) \
do { \
if (TSDB_CODE_SUCCESS != pCxt->errCode) { \
return NULL; \
} \
} while (0)
SToken
nil_token
=
{.
type
=
TK_NK_NIL
,
.
n
=
0
,
.
z
=
NULL
};
...
...
@@ -206,6 +205,7 @@ static bool checkComment(SAstCreateContext* pCxt, const SToken* pCommentToken, b
}
SNode
*
createRawExprNode
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pToken
,
SNode
*
pNode
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SRawExprNode
*
target
=
(
SRawExprNode
*
)
nodesMakeNode
(
QUERY_NODE_RAW_EXPR
);
CHECK_OUT_OF_MEM
(
target
);
target
->
p
=
pToken
->
z
;
...
...
@@ -215,6 +215,7 @@ SNode* createRawExprNode(SAstCreateContext* pCxt, const SToken* pToken, SNode* p
}
SNode
*
createRawExprNodeExt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pStart
,
const
SToken
*
pEnd
,
SNode
*
pNode
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SRawExprNode
*
target
=
(
SRawExprNode
*
)
nodesMakeNode
(
QUERY_NODE_RAW_EXPR
);
CHECK_OUT_OF_MEM
(
target
);
target
->
p
=
pStart
->
z
;
...
...
@@ -224,7 +225,7 @@ SNode* createRawExprNodeExt(SAstCreateContext* pCxt, const SToken* pStart, const
}
SNode
*
releaseRawExprNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
)
{
CHECK_
RAW_EXPR_NODE
(
pNode
);
CHECK_
PARSER_STATUS
(
pCxt
);
SRawExprNode
*
pRawExpr
=
(
SRawExprNode
*
)
pNode
;
SNode
*
pExpr
=
pRawExpr
->
pNode
;
if
(
nodesIsExprNode
(
pExpr
))
{
...
...
@@ -247,6 +248,7 @@ SToken getTokenFromRawExprNode(SAstCreateContext* pCxt, SNode* pNode) {
}
SNodeList
*
createNodeList
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNodeList
*
list
=
nodesMakeList
();
CHECK_OUT_OF_MEM
(
list
);
pCxt
->
errCode
=
nodesListAppend
(
list
,
pNode
);
...
...
@@ -254,11 +256,13 @@ SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) {
}
SNodeList
*
addNodeToList
(
SAstCreateContext
*
pCxt
,
SNodeList
*
pList
,
SNode
*
pNode
)
{
CHECK_PARSER_STATUS
(
pCxt
);
pCxt
->
errCode
=
nodesListAppend
(
pList
,
pNode
);
return
pList
;
}
SNode
*
createColumnNode
(
SAstCreateContext
*
pCxt
,
SToken
*
pTableAlias
,
SToken
*
pColumnName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkTableName
(
pCxt
,
pTableAlias
)
||
!
checkColumnName
(
pCxt
,
pColumnName
))
{
return
NULL
;
}
...
...
@@ -272,6 +276,7 @@ SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pC
}
SNode
*
createValueNode
(
SAstCreateContext
*
pCxt
,
int32_t
dataType
,
const
SToken
*
pLiteral
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SValueNode
*
val
=
(
SValueNode
*
)
nodesMakeNode
(
QUERY_NODE_VALUE
);
CHECK_OUT_OF_MEM
(
val
);
val
->
literal
=
strndup
(
pLiteral
->
z
,
pLiteral
->
n
);
...
...
@@ -291,6 +296,7 @@ SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken*
}
SNode
*
createDurationValueNode
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pLiteral
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SValueNode
*
val
=
(
SValueNode
*
)
nodesMakeNode
(
QUERY_NODE_VALUE
);
CHECK_OUT_OF_MEM
(
val
);
val
->
literal
=
strndup
(
pLiteral
->
z
,
pLiteral
->
n
);
...
...
@@ -304,6 +310,7 @@ SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral)
}
SNode
*
createDefaultDatabaseCondValue
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
NULL
==
pCxt
->
pQueryCxt
->
db
)
{
return
NULL
;
}
...
...
@@ -321,6 +328,7 @@ SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) {
}
SNode
*
createPlaceholderValueNode
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pLiteral
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SValueNode
*
val
=
(
SValueNode
*
)
nodesMakeNode
(
QUERY_NODE_VALUE
);
CHECK_OUT_OF_MEM
(
val
);
val
->
literal
=
strndup
(
pLiteral
->
z
,
pLiteral
->
n
);
...
...
@@ -338,6 +346,7 @@ SNode* createPlaceholderValueNode(SAstCreateContext* pCxt, const SToken* pLitera
}
SNode
*
createLogicConditionNode
(
SAstCreateContext
*
pCxt
,
ELogicConditionType
type
,
SNode
*
pParam1
,
SNode
*
pParam2
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SLogicConditionNode
*
cond
=
(
SLogicConditionNode
*
)
nodesMakeNode
(
QUERY_NODE_LOGIC_CONDITION
);
CHECK_OUT_OF_MEM
(
cond
);
cond
->
condType
=
type
;
...
...
@@ -360,6 +369,7 @@ SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType typ
}
SNode
*
createOperatorNode
(
SAstCreateContext
*
pCxt
,
EOperatorType
type
,
SNode
*
pLeft
,
SNode
*
pRight
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SOperatorNode
*
op
=
(
SOperatorNode
*
)
nodesMakeNode
(
QUERY_NODE_OPERATOR
);
CHECK_OUT_OF_MEM
(
op
);
op
->
opType
=
type
;
...
...
@@ -369,17 +379,20 @@ SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pL
}
SNode
*
createBetweenAnd
(
SAstCreateContext
*
pCxt
,
SNode
*
pExpr
,
SNode
*
pLeft
,
SNode
*
pRight
)
{
CHECK_PARSER_STATUS
(
pCxt
);
return
createLogicConditionNode
(
pCxt
,
LOGIC_COND_TYPE_AND
,
createOperatorNode
(
pCxt
,
OP_TYPE_GREATER_EQUAL
,
pExpr
,
pLeft
),
createOperatorNode
(
pCxt
,
OP_TYPE_LOWER_EQUAL
,
nodesCloneNode
(
pExpr
),
pRight
));
}
SNode
*
createNotBetweenAnd
(
SAstCreateContext
*
pCxt
,
SNode
*
pExpr
,
SNode
*
pLeft
,
SNode
*
pRight
)
{
CHECK_PARSER_STATUS
(
pCxt
);
return
createLogicConditionNode
(
pCxt
,
LOGIC_COND_TYPE_OR
,
createOperatorNode
(
pCxt
,
OP_TYPE_LOWER_THAN
,
pExpr
,
pLeft
),
createOperatorNode
(
pCxt
,
OP_TYPE_GREATER_THAN
,
nodesCloneNode
(
pExpr
),
pRight
));
}
static
SNode
*
createPrimaryKeyCol
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SColumnNode
*
pCol
=
nodesMakeNode
(
QUERY_NODE_COLUMN
);
CHECK_OUT_OF_MEM
(
pCol
);
pCol
->
colId
=
PRIMARYKEY_TIMESTAMP_COL_ID
;
...
...
@@ -388,6 +401,7 @@ static SNode* createPrimaryKeyCol(SAstCreateContext* pCxt) {
}
SNode
*
createFunctionNode
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pFuncName
,
SNodeList
*
pParameterList
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
0
==
strncasecmp
(
"_rowts"
,
pFuncName
->
z
,
pFuncName
->
n
)
||
0
==
strncasecmp
(
"_c0"
,
pFuncName
->
z
,
pFuncName
->
n
))
{
return
createPrimaryKeyCol
(
pCxt
);
}
...
...
@@ -399,6 +413,7 @@ SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNod
}
SNode
*
createCastFunctionNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pExpr
,
SDataType
dt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SFunctionNode
*
func
=
(
SFunctionNode
*
)
nodesMakeNode
(
QUERY_NODE_FUNCTION
);
CHECK_OUT_OF_MEM
(
func
);
strcpy
(
func
->
functionName
,
"cast"
);
...
...
@@ -413,6 +428,7 @@ SNode* createCastFunctionNode(SAstCreateContext* pCxt, SNode* pExpr, SDataType d
}
SNode
*
createNodeListNode
(
SAstCreateContext
*
pCxt
,
SNodeList
*
pList
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNodeListNode
*
list
=
(
SNodeListNode
*
)
nodesMakeNode
(
QUERY_NODE_NODE_LIST
);
CHECK_OUT_OF_MEM
(
list
);
list
->
pNodeList
=
pList
;
...
...
@@ -420,6 +436,7 @@ SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList) {
}
SNode
*
createNodeListNodeEx
(
SAstCreateContext
*
pCxt
,
SNode
*
p1
,
SNode
*
p2
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNodeListNode
*
list
=
(
SNodeListNode
*
)
nodesMakeNode
(
QUERY_NODE_NODE_LIST
);
CHECK_OUT_OF_MEM
(
list
);
list
->
pNodeList
=
nodesMakeList
();
...
...
@@ -430,6 +447,7 @@ SNode* createNodeListNodeEx(SAstCreateContext* pCxt, SNode* p1, SNode* p2) {
}
SNode
*
createRealTableNode
(
SAstCreateContext
*
pCxt
,
SToken
*
pDbName
,
SToken
*
pTableName
,
SToken
*
pTableAlias
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
true
)
||
!
checkTableName
(
pCxt
,
pTableName
)
||
!
checkTableName
(
pCxt
,
pTableAlias
))
{
return
NULL
;
}
...
...
@@ -450,6 +468,7 @@ SNode* createRealTableNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pTa
}
SNode
*
createTempTableNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pSubquery
,
const
SToken
*
pTableAlias
)
{
CHECK_PARSER_STATUS
(
pCxt
);
STempTableNode
*
tempTable
=
(
STempTableNode
*
)
nodesMakeNode
(
QUERY_NODE_TEMP_TABLE
);
CHECK_OUT_OF_MEM
(
tempTable
);
tempTable
->
pSubquery
=
pSubquery
;
...
...
@@ -467,6 +486,7 @@ SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, const STok
}
SNode
*
createJoinTableNode
(
SAstCreateContext
*
pCxt
,
EJoinType
type
,
SNode
*
pLeft
,
SNode
*
pRight
,
SNode
*
pJoinCond
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SJoinTableNode
*
joinTable
=
(
SJoinTableNode
*
)
nodesMakeNode
(
QUERY_NODE_JOIN_TABLE
);
CHECK_OUT_OF_MEM
(
joinTable
);
joinTable
->
joinType
=
type
;
...
...
@@ -477,6 +497,7 @@ SNode* createJoinTableNode(SAstCreateContext* pCxt, EJoinType type, SNode* pLeft
}
SNode
*
createLimitNode
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pLimit
,
const
SToken
*
pOffset
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SLimitNode
*
limitNode
=
(
SLimitNode
*
)
nodesMakeNode
(
QUERY_NODE_LIMIT
);
CHECK_OUT_OF_MEM
(
limitNode
);
limitNode
->
limit
=
taosStr2Int64
(
pLimit
->
z
,
NULL
,
10
);
...
...
@@ -487,6 +508,7 @@ SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const STok
}
SNode
*
createOrderByExprNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pExpr
,
EOrder
order
,
ENullOrder
nullOrder
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SOrderByExprNode
*
orderByExpr
=
(
SOrderByExprNode
*
)
nodesMakeNode
(
QUERY_NODE_ORDER_BY_EXPR
);
CHECK_OUT_OF_MEM
(
orderByExpr
);
orderByExpr
->
pExpr
=
pExpr
;
...
...
@@ -499,6 +521,7 @@ SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order
}
SNode
*
createSessionWindowNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pCol
,
SNode
*
pGap
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SSessionWindowNode
*
session
=
(
SSessionWindowNode
*
)
nodesMakeNode
(
QUERY_NODE_SESSION_WINDOW
);
CHECK_OUT_OF_MEM
(
session
);
session
->
pCol
=
(
SColumnNode
*
)
pCol
;
...
...
@@ -507,6 +530,7 @@ SNode* createSessionWindowNode(SAstCreateContext* pCxt, SNode* pCol, SNode* pGap
}
SNode
*
createStateWindowNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pExpr
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SStateWindowNode
*
state
=
(
SStateWindowNode
*
)
nodesMakeNode
(
QUERY_NODE_STATE_WINDOW
);
CHECK_OUT_OF_MEM
(
state
);
state
->
pCol
=
createPrimaryKeyCol
(
pCxt
);
...
...
@@ -520,6 +544,7 @@ SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) {
SNode
*
createIntervalWindowNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pInterval
,
SNode
*
pOffset
,
SNode
*
pSliding
,
SNode
*
pFill
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SIntervalWindowNode
*
interval
=
(
SIntervalWindowNode
*
)
nodesMakeNode
(
QUERY_NODE_INTERVAL_WINDOW
);
CHECK_OUT_OF_MEM
(
interval
);
interval
->
pCol
=
createPrimaryKeyCol
(
pCxt
);
...
...
@@ -535,6 +560,7 @@ SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode
}
SNode
*
createFillNode
(
SAstCreateContext
*
pCxt
,
EFillMode
mode
,
SNode
*
pValues
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SFillNode
*
fill
=
(
SFillNode
*
)
nodesMakeNode
(
QUERY_NODE_FILL
);
CHECK_OUT_OF_MEM
(
fill
);
fill
->
mode
=
mode
;
...
...
@@ -549,6 +575,7 @@ SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) {
}
SNode
*
createGroupingSetNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SGroupingSetNode
*
groupingSet
=
(
SGroupingSetNode
*
)
nodesMakeNode
(
QUERY_NODE_GROUPING_SET
);
CHECK_OUT_OF_MEM
(
groupingSet
);
groupingSet
->
groupingSetType
=
GP_TYPE_NORMAL
;
...
...
@@ -558,9 +585,7 @@ SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode) {
}
SNode
*
setProjectionAlias
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
,
const
SToken
*
pAlias
)
{
if
(
NULL
==
pNode
||
TSDB_CODE_SUCCESS
!=
pCxt
->
errCode
)
{
return
pNode
;
}
CHECK_PARSER_STATUS
(
pCxt
);
int32_t
len
=
TMIN
(
sizeof
(((
SExprNode
*
)
pNode
)
->
aliasName
)
-
1
,
pAlias
->
n
);
strncpy
(((
SExprNode
*
)
pNode
)
->
aliasName
,
pAlias
->
z
,
len
);
((
SExprNode
*
)
pNode
)
->
aliasName
[
len
]
=
'\0'
;
...
...
@@ -570,6 +595,7 @@ SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* p
}
SNode
*
addWhereClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pWhere
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pWhere
=
pWhere
;
}
...
...
@@ -577,6 +603,7 @@ SNode* addWhereClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pWhere) {
}
SNode
*
addPartitionByClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNodeList
*
pPartitionByList
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pPartitionByList
=
pPartitionByList
;
}
...
...
@@ -584,6 +611,7 @@ SNode* addPartitionByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pP
}
SNode
*
addWindowClauseClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pWindow
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pWindow
=
pWindow
;
}
...
...
@@ -591,6 +619,7 @@ SNode* addWindowClauseClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pWind
}
SNode
*
addGroupByClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNodeList
*
pGroupByList
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pGroupByList
=
pGroupByList
;
}
...
...
@@ -598,6 +627,7 @@ SNode* addGroupByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pGroup
}
SNode
*
addHavingClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pHaving
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pHaving
=
pHaving
;
}
...
...
@@ -605,6 +635,7 @@ SNode* addHavingClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pHaving) {
}
SNode
*
addOrderByClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNodeList
*
pOrderByList
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pOrderByList
=
pOrderByList
;
}
...
...
@@ -612,6 +643,7 @@ SNode* addOrderByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrder
}
SNode
*
addSlimitClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pSlimit
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pSlimit
=
(
SLimitNode
*
)
pSlimit
;
}
...
...
@@ -619,6 +651,7 @@ SNode* addSlimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pSlimit) {
}
SNode
*
addLimitClause
(
SAstCreateContext
*
pCxt
,
SNode
*
pStmt
,
SNode
*
pLimit
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
((
SSelectStmt
*
)
pStmt
)
->
pLimit
=
(
SLimitNode
*
)
pLimit
;
}
...
...
@@ -626,6 +659,7 @@ SNode* addLimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pLimit) {
}
SNode
*
createSelectStmt
(
SAstCreateContext
*
pCxt
,
bool
isDistinct
,
SNodeList
*
pProjectionList
,
SNode
*
pTable
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SSelectStmt
*
select
=
(
SSelectStmt
*
)
nodesMakeNode
(
QUERY_NODE_SELECT_STMT
);
CHECK_OUT_OF_MEM
(
select
);
select
->
isDistinct
=
isDistinct
;
...
...
@@ -637,6 +671,7 @@ SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pPr
}
SNode
*
createSetOperator
(
SAstCreateContext
*
pCxt
,
ESetOperatorType
type
,
SNode
*
pLeft
,
SNode
*
pRight
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SSetOperator
*
setOp
=
(
SSetOperator
*
)
nodesMakeNode
(
QUERY_NODE_SET_OPERATOR
);
CHECK_OUT_OF_MEM
(
setOp
);
setOp
->
opType
=
type
;
...
...
@@ -647,6 +682,7 @@ SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode*
}
SNode
*
createDefaultDatabaseOptions
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDatabaseOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_DATABASE_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
buffer
=
TSDB_DEFAULT_BUFFER_PER_VNODE
;
...
...
@@ -667,10 +703,12 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) {
pOptions
->
walLevel
=
TSDB_DEFAULT_WAL_LEVEL
;
pOptions
->
numOfVgroups
=
TSDB_DEFAULT_VN_PER_DB
;
pOptions
->
singleStable
=
TSDB_DEFAULT_DB_SINGLE_STABLE
;
pOptions
->
schemaless
=
TSDB_DEFAULT_DB_SCHEMALESS
;
return
(
SNode
*
)
pOptions
;
}
SNode
*
createAlterDatabaseOptions
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDatabaseOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_DATABASE_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
buffer
=
-
1
;
...
...
@@ -691,10 +729,12 @@ SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) {
pOptions
->
walLevel
=
-
1
;
pOptions
->
numOfVgroups
=
-
1
;
pOptions
->
singleStable
=
-
1
;
pOptions
->
schemaless
=
-
1
;
return
(
SNode
*
)
pOptions
;
}
SNode
*
setDatabaseOption
(
SAstCreateContext
*
pCxt
,
SNode
*
pOptions
,
EDatabaseOptionType
type
,
void
*
pVal
)
{
CHECK_PARSER_STATUS
(
pCxt
);
switch
(
type
)
{
case
DB_OPTION_BUFFER
:
((
SDatabaseOptions
*
)
pOptions
)
->
buffer
=
taosStr2Int32
(((
SToken
*
)
pVal
)
->
z
,
NULL
,
10
);
...
...
@@ -754,6 +794,9 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti
case
DB_OPTION_RETENTIONS
:
((
SDatabaseOptions
*
)
pOptions
)
->
pRetentions
=
pVal
;
break
;
case
DB_OPTION_SCHEMALESS
:
((
SDatabaseOptions
*
)
pOptions
)
->
schemaless
=
taosStr2Int8
(((
SToken
*
)
pVal
)
->
z
,
NULL
,
10
);
break
;
default:
break
;
}
...
...
@@ -761,6 +804,7 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti
}
SNode
*
setAlterDatabaseOption
(
SAstCreateContext
*
pCxt
,
SNode
*
pOptions
,
SAlterOption
*
pAlterOption
)
{
CHECK_PARSER_STATUS
(
pCxt
);
switch
(
pAlterOption
->
type
)
{
case
DB_OPTION_KEEP
:
case
DB_OPTION_RETENTIONS
:
...
...
@@ -772,6 +816,7 @@ SNode* setAlterDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, SAlterOp
}
SNode
*
createCreateDatabaseStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
SToken
*
pDbName
,
SNode
*
pOptions
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
))
{
return
NULL
;
}
...
...
@@ -784,6 +829,7 @@ SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, STok
}
SNode
*
createDropDatabaseStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
SToken
*
pDbName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
))
{
return
NULL
;
}
...
...
@@ -795,6 +841,7 @@ SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, STo
}
SNode
*
createAlterDatabaseStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pDbName
,
SNode
*
pOptions
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
))
{
return
NULL
;
}
...
...
@@ -806,6 +853,7 @@ SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode*
}
SNode
*
createDefaultTableOptions
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
STableOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_TABLE_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
delay
=
TSDB_DEFAULT_ROLLUP_DELAY
;
...
...
@@ -815,6 +863,7 @@ SNode* createDefaultTableOptions(SAstCreateContext* pCxt) {
}
SNode
*
createAlterTableOptions
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
STableOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_TABLE_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
delay
=
-
1
;
...
...
@@ -824,6 +873,7 @@ SNode* createAlterTableOptions(SAstCreateContext* pCxt) {
}
SNode
*
setTableOption
(
SAstCreateContext
*
pCxt
,
SNode
*
pOptions
,
ETableOptionType
type
,
void
*
pVal
)
{
CHECK_PARSER_STATUS
(
pCxt
);
switch
(
type
)
{
case
TABLE_OPTION_COMMENT
:
if
(
checkComment
(
pCxt
,
(
SToken
*
)
pVal
,
true
))
{
...
...
@@ -853,6 +903,7 @@ SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType
}
SNode
*
createColumnDefNode
(
SAstCreateContext
*
pCxt
,
SToken
*
pColName
,
SDataType
dataType
,
const
SToken
*
pComment
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkColumnName
(
pCxt
,
pColName
)
||
!
checkComment
(
pCxt
,
pComment
,
false
))
{
return
NULL
;
}
...
...
@@ -879,9 +930,7 @@ SDataType createVarLenDataType(uint8_t type, const SToken* pLen) {
SNode
*
createCreateTableStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
SNode
*
pRealTable
,
SNodeList
*
pCols
,
SNodeList
*
pTags
,
SNode
*
pOptions
)
{
if
(
NULL
==
pRealTable
)
{
return
NULL
;
}
CHECK_PARSER_STATUS
(
pCxt
);
SCreateTableStmt
*
pStmt
=
(
SCreateTableStmt
*
)
nodesMakeNode
(
QUERY_NODE_CREATE_TABLE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
strcpy
(
pStmt
->
dbName
,
((
SRealTableNode
*
)
pRealTable
)
->
table
.
dbName
);
...
...
@@ -896,9 +945,7 @@ SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, SNode*
SNode
*
createCreateSubTableClause
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
SNode
*
pRealTable
,
SNode
*
pUseRealTable
,
SNodeList
*
pSpecificTags
,
SNodeList
*
pValsOfTags
,
SNode
*
pOptions
)
{
if
(
NULL
==
pRealTable
)
{
return
NULL
;
}
CHECK_PARSER_STATUS
(
pCxt
);
SCreateSubTableClause
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_CREATE_SUBTABLE_CLAUSE
);
CHECK_OUT_OF_MEM
(
pStmt
);
strcpy
(
pStmt
->
dbName
,
((
SRealTableNode
*
)
pRealTable
)
->
table
.
dbName
);
...
...
@@ -914,6 +961,7 @@ SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists, SN
}
SNode
*
createCreateMultiTableStmt
(
SAstCreateContext
*
pCxt
,
SNodeList
*
pSubTables
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SCreateMultiTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_CREATE_MULTI_TABLE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
pSubTables
=
pSubTables
;
...
...
@@ -921,9 +969,7 @@ SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables
}
SNode
*
createDropTableClause
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
SNode
*
pRealTable
)
{
if
(
NULL
==
pRealTable
)
{
return
NULL
;
}
CHECK_PARSER_STATUS
(
pCxt
);
SDropTableClause
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DROP_TABLE_CLAUSE
);
CHECK_OUT_OF_MEM
(
pStmt
);
strcpy
(
pStmt
->
dbName
,
((
SRealTableNode
*
)
pRealTable
)
->
table
.
dbName
);
...
...
@@ -934,6 +980,7 @@ SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNod
}
SNode
*
createDropTableStmt
(
SAstCreateContext
*
pCxt
,
SNodeList
*
pTables
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DROP_TABLE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
pTables
=
pTables
;
...
...
@@ -941,6 +988,7 @@ SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables) {
}
SNode
*
createDropSuperTableStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
SNode
*
pRealTable
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropSuperTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DROP_SUPER_TABLE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
strcpy
(
pStmt
->
dbName
,
((
SRealTableNode
*
)
pRealTable
)
->
table
.
dbName
);
...
...
@@ -958,9 +1006,7 @@ static SNode* createAlterTableStmtFinalize(SNode* pRealTable, SAlterTableStmt* p
}
SNode
*
createAlterTableModifyOptions
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
,
SNode
*
pOptions
)
{
if
(
NULL
==
pRealTable
)
{
return
NULL
;
}
CHECK_PARSER_STATUS
(
pCxt
);
SAlterTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_ALTER_TABLE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
alterType
=
TSDB_ALTER_TABLE_UPDATE_OPTIONS
;
...
...
@@ -970,7 +1016,8 @@ SNode* createAlterTableModifyOptions(SAstCreateContext* pCxt, SNode* pRealTable,
SNode
*
createAlterTableAddModifyCol
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
,
int8_t
alterType
,
SToken
*
pColName
,
SDataType
dataType
)
{
if
(
NULL
==
pRealTable
||
!
checkColumnName
(
pCxt
,
pColName
))
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkColumnName
(
pCxt
,
pColName
))
{
return
NULL
;
}
SAlterTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_ALTER_TABLE_STMT
);
...
...
@@ -982,7 +1029,8 @@ SNode* createAlterTableAddModifyCol(SAstCreateContext* pCxt, SNode* pRealTable,
}
SNode
*
createAlterTableDropCol
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
,
int8_t
alterType
,
SToken
*
pColName
)
{
if
(
NULL
==
pRealTable
||
!
checkColumnName
(
pCxt
,
pColName
))
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkColumnName
(
pCxt
,
pColName
))
{
return
NULL
;
}
SAlterTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_ALTER_TABLE_STMT
);
...
...
@@ -994,7 +1042,8 @@ SNode* createAlterTableDropCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_
SNode
*
createAlterTableRenameCol
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
,
int8_t
alterType
,
SToken
*
pOldColName
,
SToken
*
pNewColName
)
{
if
(
NULL
==
pRealTable
||
!
checkColumnName
(
pCxt
,
pOldColName
)
||
!
checkColumnName
(
pCxt
,
pNewColName
))
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkColumnName
(
pCxt
,
pOldColName
)
||
!
checkColumnName
(
pCxt
,
pNewColName
))
{
return
NULL
;
}
SAlterTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_ALTER_TABLE_STMT
);
...
...
@@ -1006,7 +1055,8 @@ SNode* createAlterTableRenameCol(SAstCreateContext* pCxt, SNode* pRealTable, int
}
SNode
*
createAlterTableSetTag
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
,
SToken
*
pTagName
,
SNode
*
pVal
)
{
if
(
NULL
==
pRealTable
||
!
checkColumnName
(
pCxt
,
pTagName
))
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkColumnName
(
pCxt
,
pTagName
))
{
return
NULL
;
}
SAlterTableStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_ALTER_TABLE_STMT
);
...
...
@@ -1018,6 +1068,7 @@ SNode* createAlterTableSetTag(SAstCreateContext* pCxt, SNode* pRealTable, SToken
}
SNode
*
createUseDatabaseStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pDbName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
))
{
return
NULL
;
}
...
...
@@ -1033,13 +1084,13 @@ static bool needDbShowStmt(ENodeType type) {
}
SNode
*
createShowStmt
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
SNode
*
pDbName
,
SNode
*
pTbNamePattern
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
needDbShowStmt
(
type
)
&&
NULL
==
pDbName
&&
NULL
==
pCxt
->
pQueryCxt
->
db
)
{
snprintf
(
pCxt
->
pQueryCxt
->
pMsg
,
pCxt
->
pQueryCxt
->
msgLen
,
"db not specified"
);
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
return
NULL
;
}
SShowStmt
*
pStmt
=
nodesMakeNode
(
type
);
;
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
pDbName
=
pDbName
;
pStmt
->
pTbNamePattern
=
pTbNamePattern
;
...
...
@@ -1047,18 +1098,21 @@ SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, S
}
SNode
*
createShowCreateDatabaseStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pDbName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_SHOW_CREATE_DATABASE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
}
SNode
*
createShowCreateTableStmt
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
SNode
*
pRealTable
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
type
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
}
SNode
*
createCreateUserStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
,
const
SToken
*
pPassword
)
{
CHECK_PARSER_STATUS
(
pCxt
);
char
password
[
TSDB_USET_PASSWORD_LEN
]
=
{
0
};
if
(
!
checkUserName
(
pCxt
,
pUserName
)
||
!
checkPassword
(
pCxt
,
pPassword
,
password
))
{
return
NULL
;
...
...
@@ -1071,6 +1125,7 @@ SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const ST
}
SNode
*
createAlterUserStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
,
int8_t
alterType
,
const
SToken
*
pVal
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkUserName
(
pCxt
,
pUserName
))
{
return
NULL
;
}
...
...
@@ -1090,6 +1145,7 @@ SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t al
}
SNode
*
createDropUserStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkUserName
(
pCxt
,
pUserName
))
{
return
NULL
;
}
...
...
@@ -1100,6 +1156,7 @@ SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName) {
}
SNode
*
createCreateDnodeStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pFqdn
,
const
SToken
*
pPort
)
{
CHECK_PARSER_STATUS
(
pCxt
);
int32_t
port
=
0
;
char
fqdn
[
TSDB_FQDN_LEN
]
=
{
0
};
if
(
NULL
==
pPort
)
{
...
...
@@ -1121,6 +1178,7 @@ SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const
}
SNode
*
createDropDnodeStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pDnode
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropDnodeStmt
*
pStmt
=
(
SDropDnodeStmt
*
)
nodesMakeNode
(
QUERY_NODE_DROP_DNODE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
if
(
TK_NK_INTEGER
==
pDnode
->
type
)
{
...
...
@@ -1136,6 +1194,7 @@ SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode) {
SNode
*
createAlterDnodeStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pDnode
,
const
SToken
*
pConfig
,
const
SToken
*
pValue
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SAlterDnodeStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_ALTER_DNODE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
dnodeId
=
taosStr2Int32
(
pDnode
->
z
,
NULL
,
10
);
...
...
@@ -1148,6 +1207,7 @@ SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const
SNode
*
createCreateIndexStmt
(
SAstCreateContext
*
pCxt
,
EIndexType
type
,
bool
ignoreExists
,
SToken
*
pIndexName
,
SToken
*
pTableName
,
SNodeList
*
pCols
,
SNode
*
pOptions
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkIndexName
(
pCxt
,
pIndexName
)
||
!
checkTableName
(
pCxt
,
pTableName
)
||
!
checkDbName
(
pCxt
,
NULL
,
true
))
{
return
NULL
;
}
...
...
@@ -1164,6 +1224,7 @@ SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, bool igno
SNode
*
createIndexOption
(
SAstCreateContext
*
pCxt
,
SNodeList
*
pFuncs
,
SNode
*
pInterval
,
SNode
*
pOffset
,
SNode
*
pSliding
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SIndexOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_INDEX_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
pFuncs
=
pFuncs
;
...
...
@@ -1174,6 +1235,7 @@ SNode* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInt
}
SNode
*
createDropIndexStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
SToken
*
pIndexName
,
SToken
*
pTableName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkIndexName
(
pCxt
,
pIndexName
)
||
!
checkTableName
(
pCxt
,
pTableName
))
{
return
NULL
;
}
...
...
@@ -1186,6 +1248,7 @@ SNode* createDropIndexStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken
}
SNode
*
createCreateComponentNodeStmt
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
const
SToken
*
pDnodeId
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SCreateComponentNodeStmt
*
pStmt
=
nodesMakeNode
(
type
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
dnodeId
=
taosStr2Int32
(
pDnodeId
->
z
,
NULL
,
10
);
...
...
@@ -1194,6 +1257,7 @@ SNode* createCreateComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, co
}
SNode
*
createDropComponentNodeStmt
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
const
SToken
*
pDnodeId
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropComponentNodeStmt
*
pStmt
=
nodesMakeNode
(
type
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
dnodeId
=
taosStr2Int32
(
pDnodeId
->
z
,
NULL
,
10
);
...
...
@@ -1202,6 +1266,7 @@ SNode* createDropComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, cons
}
SNode
*
createTopicOptions
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
STopicOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_TOPIC_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
withTable
=
false
;
...
...
@@ -1212,6 +1277,7 @@ SNode* createTopicOptions(SAstCreateContext* pCxt) {
SNode
*
createCreateTopicStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
const
SToken
*
pTopicName
,
SNode
*
pQuery
,
const
SToken
*
pSubscribeDbName
,
SNode
*
pOptions
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SCreateTopicStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_CREATE_TOPIC_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
strncpy
(
pStmt
->
topicName
,
pTopicName
->
z
,
pTopicName
->
n
);
...
...
@@ -1225,6 +1291,7 @@ SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const S
}
SNode
*
createDropTopicStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
const
SToken
*
pTopicName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropTopicStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DROP_TOPIC_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
strncpy
(
pStmt
->
topicName
,
pTopicName
->
z
,
pTopicName
->
n
);
...
...
@@ -1232,7 +1299,19 @@ SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const
return
(
SNode
*
)
pStmt
;
}
SNode
*
createDropCGroupStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
const
SToken
*
pCGroupId
,
const
SToken
*
pTopicName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropCGroupStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DROP_CGROUP_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
ignoreNotExists
=
ignoreNotExists
;
strncpy
(
pStmt
->
topicName
,
pTopicName
->
z
,
pTopicName
->
n
);
strncpy
(
pStmt
->
cgroup
,
pCGroupId
->
z
,
pCGroupId
->
n
);
return
(
SNode
*
)
pStmt
;
}
SNode
*
createAlterLocalStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pConfig
,
const
SToken
*
pValue
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SAlterLocalStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_ALTER_LOCAL_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
trimString
(
pConfig
->
z
,
pConfig
->
n
,
pStmt
->
config
,
sizeof
(
pStmt
->
config
));
...
...
@@ -1243,6 +1322,7 @@ SNode* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, cons
}
SNode
*
createDefaultExplainOptions
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SExplainOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_EXPLAIN_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
verbose
=
TSDB_DEFAULT_EXPLAIN_VERBOSE
;
...
...
@@ -1251,16 +1331,19 @@ SNode* createDefaultExplainOptions(SAstCreateContext* pCxt) {
}
SNode
*
setExplainVerbose
(
SAstCreateContext
*
pCxt
,
SNode
*
pOptions
,
const
SToken
*
pVal
)
{
CHECK_PARSER_STATUS
(
pCxt
);
((
SExplainOptions
*
)
pOptions
)
->
verbose
=
(
0
==
strncasecmp
(
pVal
->
z
,
"true"
,
pVal
->
n
));
return
pOptions
;
}
SNode
*
setExplainRatio
(
SAstCreateContext
*
pCxt
,
SNode
*
pOptions
,
const
SToken
*
pVal
)
{
CHECK_PARSER_STATUS
(
pCxt
);
((
SExplainOptions
*
)
pOptions
)
->
ratio
=
taosStr2Double
(
pVal
->
z
,
NULL
);
return
pOptions
;
}
SNode
*
createExplainStmt
(
SAstCreateContext
*
pCxt
,
bool
analyze
,
SNode
*
pOptions
,
SNode
*
pQuery
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SExplainStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_EXPLAIN_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
analyze
=
analyze
;
...
...
@@ -1270,9 +1353,7 @@ SNode* createExplainStmt(SAstCreateContext* pCxt, bool analyze, SNode* pOptions,
}
SNode
*
createDescribeStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
)
{
if
(
NULL
==
pRealTable
)
{
return
NULL
;
}
CHECK_PARSER_STATUS
(
pCxt
);
SDescribeStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DESCRIBE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
strcpy
(
pStmt
->
dbName
,
((
SRealTableNode
*
)
pRealTable
)
->
table
.
dbName
);
...
...
@@ -1282,12 +1363,14 @@ SNode* createDescribeStmt(SAstCreateContext* pCxt, SNode* pRealTable) {
}
SNode
*
createResetQueryCacheStmt
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_RESET_QUERY_CACHE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
}
SNode
*
createCompactStmt
(
SAstCreateContext
*
pCxt
,
SNodeList
*
pVgroups
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_COMPACT_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
...
...
@@ -1295,6 +1378,7 @@ SNode* createCompactStmt(SAstCreateContext* pCxt, SNodeList* pVgroups) {
SNode
*
createCreateFunctionStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
bool
aggFunc
,
const
SToken
*
pFuncName
,
const
SToken
*
pLibPath
,
SDataType
dataType
,
int32_t
bufSize
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
pLibPath
->
n
<=
2
)
{
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
return
NULL
;
...
...
@@ -1311,6 +1395,7 @@ SNode* createCreateFunctionStmt(SAstCreateContext* pCxt, bool ignoreExists, bool
}
SNode
*
createDropFunctionStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
const
SToken
*
pFuncName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropFunctionStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DROP_FUNCTION_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
ignoreNotExists
=
ignoreNotExists
;
...
...
@@ -1319,6 +1404,7 @@ SNode* createDropFunctionStmt(SAstCreateContext* pCxt, bool ignoreNotExists, con
}
SNode
*
createStreamOptions
(
SAstCreateContext
*
pCxt
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SStreamOptions
*
pOptions
=
nodesMakeNode
(
QUERY_NODE_STREAM_OPTIONS
);
CHECK_OUT_OF_MEM
(
pOptions
);
pOptions
->
triggerType
=
STREAM_TRIGGER_AT_ONCE
;
...
...
@@ -1327,6 +1413,7 @@ SNode* createStreamOptions(SAstCreateContext* pCxt) {
SNode
*
createCreateStreamStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
const
SToken
*
pStreamName
,
SNode
*
pRealTable
,
SNode
*
pOptions
,
SNode
*
pQuery
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SCreateStreamStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_CREATE_STREAM_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
strncpy
(
pStmt
->
streamName
,
pStreamName
->
z
,
pStreamName
->
n
);
...
...
@@ -1342,6 +1429,7 @@ SNode* createCreateStreamStmt(SAstCreateContext* pCxt, bool ignoreExists, const
}
SNode
*
createDropStreamStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreNotExists
,
const
SToken
*
pStreamName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SDropStreamStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_DROP_STREAM_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
strncpy
(
pStmt
->
streamName
,
pStreamName
->
z
,
pStreamName
->
n
);
...
...
@@ -1350,6 +1438,7 @@ SNode* createDropStreamStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const
}
SNode
*
createKillStmt
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
const
SToken
*
pId
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SKillStmt
*
pStmt
=
nodesMakeNode
(
type
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
targetId
=
taosStr2Int32
(
pId
->
z
,
NULL
,
10
);
...
...
@@ -1357,30 +1446,35 @@ SNode* createKillStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pId
}
SNode
*
createMergeVgroupStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pVgId1
,
const
SToken
*
pVgId2
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_MERGE_VGROUP_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
}
SNode
*
createRedistributeVgroupStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pVgId
,
SNodeList
*
pDnodes
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_REDISTRIBUTE_VGROUP_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
}
SNode
*
createSplitVgroupStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pVgId
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_SPLIT_VGROUP_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
}
SNode
*
createSyncdbStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pDbName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SNode
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_SYNCDB_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
return
pStmt
;
}
SNode
*
createGrantStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
SToken
*
pDbName
,
SToken
*
pUserName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
)
||
!
checkUserName
(
pCxt
,
pUserName
))
{
return
NULL
;
}
...
...
@@ -1393,6 +1487,7 @@ SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbN
}
SNode
*
createRevokeStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
SToken
*
pDbName
,
SToken
*
pUserName
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
)
||
!
checkUserName
(
pCxt
,
pUserName
))
{
return
NULL
;
}
...
...
source/libs/parser/src/parCalcConst.c
浏览文件 @
070f6040
...
...
@@ -176,11 +176,11 @@ static int32_t calcConstProject(SNode* pProject, SNode** pNew) {
}
int32_t
code
=
scalarCalculateConstants
(
pProject
,
pNew
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
QUERY_NODE_VALUE
==
nodeType
(
pNew
)
&&
NULL
!=
pAssociation
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
QUERY_NODE_VALUE
==
nodeType
(
*
pNew
)
&&
NULL
!=
pAssociation
)
{
int32_t
size
=
taosArrayGetSize
(
pAssociation
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SNode
**
pCol
=
taosArrayGet
(
pAssociation
,
i
);
*
pCol
=
nodesCloneNode
(
pNew
);
SNode
**
pCol
=
taosArrayGet
P
(
pAssociation
,
i
);
*
pCol
=
nodesCloneNode
(
*
pNew
);
if
(
NULL
==
*
pCol
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
...
...
@@ -233,9 +233,9 @@ static int32_t calcConstGroupBy(SCalcConstContext* pCxt, SSelectStmt* pSelect) {
}
static
int32_t
calcConstSelect
(
SCalcConstContext
*
pCxt
,
SSelectStmt
*
pSelect
,
bool
subquery
)
{
int32_t
code
=
calcConst
Projections
(
pCxt
,
pSelect
,
subquery
);
int32_t
code
=
calcConst
FromTable
(
pCxt
,
pSelect
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
calcConst
FromTable
(
pCxt
,
pSelect
);
code
=
calcConst
Projections
(
pCxt
,
pSelect
,
subquery
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
calcConstSelectCondition
(
pCxt
,
pSelect
,
&
pSelect
->
pWhere
);
...
...
source/libs/parser/src/parTokenizer.c
浏览文件 @
070f6040
...
...
@@ -53,6 +53,7 @@ static SKeyword keywordTable[] = {
{
"CACHE"
,
TK_CACHE
},
{
"CACHELAST"
,
TK_CACHELAST
},
{
"CAST"
,
TK_CAST
},
{
"CGROUP"
,
TK_CGROUP
},
{
"CLUSTER"
,
TK_CLUSTER
},
{
"COLUMN"
,
TK_COLUMN
},
{
"COMMENT"
,
TK_COMMENT
},
...
...
@@ -156,6 +157,7 @@ static SKeyword keywordTable[] = {
{
"REVOKE"
,
TK_REVOKE
},
{
"ROLLUP"
,
TK_ROLLUP
},
{
"SCHEMA"
,
TK_SCHEMA
},
{
"SCHEMALESS"
,
TK_SCHEMALESS
},
{
"SCORES"
,
TK_SCORES
},
{
"SELECT"
,
TK_SELECT
},
{
"SESSION"
,
TK_SESSION
},
...
...
@@ -605,12 +607,12 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) {
}
return
i
;
}
case
'['
:
{
for
(
i
=
1
;
z
[
i
]
&&
z
[
i
-
1
]
!=
']'
;
i
++
)
{
}
*
tokenId
=
TK_NK_ID
;
return
i
;
}
//
case '[': {
//
for (i = 1; z[i] && z[i - 1] != ']'; i++) {
//
}
//
*tokenId = TK_NK_ID;
//
return i;
//
}
case
'T'
:
case
't'
:
case
'F'
:
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
070f6040
...
...
@@ -342,12 +342,14 @@ static void setColumnInfoBySchema(const SRealTableNode* pTable, const SSchema* p
}
}
static
void
setColumnInfoByExpr
(
const
STableNode
*
pTable
,
SExprNode
*
pExpr
,
SColumnNode
*
pCol
)
{
static
void
setColumnInfoByExpr
(
const
STableNode
*
pTable
,
SExprNode
*
pExpr
,
SColumnNode
**
pColRef
)
{
SColumnNode
*
pCol
=
*
pColRef
;
pCol
->
pProjectRef
=
(
SNode
*
)
pExpr
;
if
(
NULL
==
pExpr
->
pAssociation
)
{
pExpr
->
pAssociation
=
taosArrayInit
(
TARRAY_MIN_SIZE
,
POINTER_BYTES
);
}
taosArrayPush
(
pExpr
->
pAssociation
,
&
pCol
);
taosArrayPush
(
pExpr
->
pAssociation
,
&
pCol
Ref
);
if
(
NULL
!=
pTable
)
{
strcpy
(
pCol
->
tableAlias
,
pTable
->
tableAlias
);
}
else
if
(
QUERY_NODE_COLUMN
==
nodeType
(
pExpr
))
{
...
...
@@ -385,7 +387,7 @@ static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* p
if
(
NULL
==
pCol
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_OUT_OF_MEMORY
);
}
setColumnInfoByExpr
(
pTable
,
(
SExprNode
*
)
pNode
,
pCol
);
setColumnInfoByExpr
(
pTable
,
(
SExprNode
*
)
pNode
,
&
pCol
);
nodesListAppend
(
pList
,
(
SNode
*
)
pCol
);
}
}
...
...
@@ -425,8 +427,9 @@ static bool isPrimaryKey(STempTableNode* pTable, SNode* pExpr) {
return
isPrimaryKeyImpl
(
pTable
,
pExpr
);
}
static
bool
findAndSetColumn
(
SColumnNode
*
pCol
,
const
STableNode
*
pTable
)
{
bool
found
=
false
;
static
bool
findAndSetColumn
(
SColumnNode
**
pColRef
,
const
STableNode
*
pTable
)
{
SColumnNode
*
pCol
=
*
pColRef
;
bool
found
=
false
;
if
(
QUERY_NODE_REAL_TABLE
==
nodeType
(
pTable
))
{
const
STableMeta
*
pMeta
=
((
SRealTableNode
*
)
pTable
)
->
pMeta
;
if
(
isInternalPrimaryKey
(
pCol
))
{
...
...
@@ -448,7 +451,7 @@ static bool findAndSetColumn(SColumnNode* pCol, const STableNode* pTable) {
SExprNode
*
pExpr
=
(
SExprNode
*
)
pNode
;
if
(
0
==
strcmp
(
pCol
->
colName
,
pExpr
->
aliasName
)
||
(
isPrimaryKey
((
STempTableNode
*
)
pTable
,
pNode
)
&&
isInternalPrimaryKey
(
pCol
)))
{
setColumnInfoByExpr
(
pTable
,
pExpr
,
pCol
);
setColumnInfoByExpr
(
pTable
,
pExpr
,
pCol
Ref
);
found
=
true
;
break
;
}
...
...
@@ -457,36 +460,36 @@ static bool findAndSetColumn(SColumnNode* pCol, const STableNode* pTable) {
return
found
;
}
static
EDealRes
translateColumnWithPrefix
(
STranslateContext
*
pCxt
,
SColumnNode
*
pCol
)
{
static
EDealRes
translateColumnWithPrefix
(
STranslateContext
*
pCxt
,
SColumnNode
*
*
pCol
)
{
SArray
*
pTables
=
taosArrayGetP
(
pCxt
->
pNsLevel
,
pCxt
->
currLevel
);
size_t
nums
=
taosArrayGetSize
(
pTables
);
bool
foundTable
=
false
;
for
(
size_t
i
=
0
;
i
<
nums
;
++
i
)
{
STableNode
*
pTable
=
taosArrayGetP
(
pTables
,
i
);
if
(
belongTable
(
pCxt
->
pParseCxt
->
db
,
pCol
,
pTable
))
{
if
(
belongTable
(
pCxt
->
pParseCxt
->
db
,
(
*
pCol
)
,
pTable
))
{
foundTable
=
true
;
if
(
findAndSetColumn
(
pCol
,
pTable
))
{
break
;
}
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_COLUMN
,
pCol
->
colName
);
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_COLUMN
,
(
*
pCol
)
->
colName
);
}
}
if
(
!
foundTable
)
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
pCol
->
tableAlias
);
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_TABLE_NOT_EXIST
,
(
*
pCol
)
->
tableAlias
);
}
return
DEAL_RES_CONTINUE
;
}
static
EDealRes
translateColumnWithoutPrefix
(
STranslateContext
*
pCxt
,
SColumnNode
*
pCol
)
{
static
EDealRes
translateColumnWithoutPrefix
(
STranslateContext
*
pCxt
,
SColumnNode
*
*
pCol
)
{
SArray
*
pTables
=
taosArrayGetP
(
pCxt
->
pNsLevel
,
pCxt
->
currLevel
);
size_t
nums
=
taosArrayGetSize
(
pTables
);
bool
found
=
false
;
bool
isInternalPk
=
isInternalPrimaryKey
(
pCol
);
bool
isInternalPk
=
isInternalPrimaryKey
(
*
pCol
);
for
(
size_t
i
=
0
;
i
<
nums
;
++
i
)
{
STableNode
*
pTable
=
taosArrayGetP
(
pTables
,
i
);
if
(
findAndSetColumn
(
pCol
,
pTable
))
{
if
(
found
)
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_AMBIGUOUS_COLUMN
,
pCol
->
colName
);
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_AMBIGUOUS_COLUMN
,
(
*
pCol
)
->
colName
);
}
found
=
true
;
if
(
isInternalPk
)
{
...
...
@@ -501,18 +504,18 @@ static EDealRes translateColumnWithoutPrefix(STranslateContext* pCxt, SColumnNod
}
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_INTERNAL_PK
);
}
else
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_COLUMN
,
pCol
->
colName
);
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_COLUMN
,
(
*
pCol
)
->
colName
);
}
}
return
DEAL_RES_CONTINUE
;
}
static
bool
translateColumnUseAlias
(
STranslateContext
*
pCxt
,
SColumnNode
*
pCol
)
{
static
bool
translateColumnUseAlias
(
STranslateContext
*
pCxt
,
SColumnNode
*
*
pCol
)
{
SNodeList
*
pProjectionList
=
pCxt
->
pCurrStmt
->
pProjectionList
;
SNode
*
pNode
;
FOREACH
(
pNode
,
pProjectionList
)
{
SExprNode
*
pExpr
=
(
SExprNode
*
)
pNode
;
if
(
0
==
strcmp
(
pCol
->
colName
,
pExpr
->
aliasName
))
{
if
(
0
==
strcmp
(
(
*
pCol
)
->
colName
,
pExpr
->
aliasName
))
{
setColumnInfoByExpr
(
NULL
,
pExpr
,
pCol
);
return
true
;
}
...
...
@@ -520,14 +523,14 @@ static bool translateColumnUseAlias(STranslateContext* pCxt, SColumnNode* pCol)
return
false
;
}
static
EDealRes
translateColumn
(
STranslateContext
*
pCxt
,
SColumnNode
*
pCol
)
{
static
EDealRes
translateColumn
(
STranslateContext
*
pCxt
,
SColumnNode
*
*
pCol
)
{
// count(*)/first(*)/last(*) and so on
if
(
0
==
strcmp
(
pCol
->
colName
,
"*"
))
{
if
(
0
==
strcmp
(
(
*
pCol
)
->
colName
,
"*"
))
{
return
DEAL_RES_CONTINUE
;
}
EDealRes
res
=
DEAL_RES_CONTINUE
;
if
(
'\0'
!=
pCol
->
tableAlias
[
0
])
{
if
(
'\0'
!=
(
*
pCol
)
->
tableAlias
[
0
])
{
res
=
translateColumnWithPrefix
(
pCxt
,
pCol
);
}
else
{
bool
found
=
false
;
...
...
@@ -870,6 +873,55 @@ static int32_t getFuncInfo(STranslateContext* pCxt, SFunctionNode* pFunc) {
return
fmGetFuncInfo
(
&
param
,
pFunc
);
}
static
int32_t
translateAggFunc
(
STranslateContext
*
pCxt
,
SFunctionNode
*
pFunc
)
{
if
(
beforeHaving
(
pCxt
->
currClause
))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
);
}
if
(
hasInvalidFuncNesting
(
pFunc
->
pParameterList
))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_AGG_FUNC_NESTING
);
}
if
(
pCxt
->
pCurrStmt
->
hasIndefiniteRowsFunc
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
);
}
if
(
isCountStar
(
pFunc
))
{
return
rewriteCountStar
(
pCxt
,
pFunc
);
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
translateScanPseudoColumnFunc
(
STranslateContext
*
pCxt
,
SFunctionNode
*
pFunc
)
{
if
(
0
==
LIST_LENGTH
(
pFunc
->
pParameterList
))
{
if
(
QUERY_NODE_REAL_TABLE
!=
nodeType
(
pCxt
->
pCurrStmt
->
pFromTable
))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_TBNAME
);
}
}
else
{
SValueNode
*
pVal
=
nodesListGetNode
(
pFunc
->
pParameterList
,
0
);
STableNode
*
pTable
=
NULL
;
pCxt
->
errCode
=
findTable
(
pCxt
,
pVal
->
literal
,
&
pTable
);
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
&&
(
NULL
==
pTable
||
QUERY_NODE_REAL_TABLE
!=
nodeType
(
pTable
)))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_TBNAME
);
}
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
translateIndefiniteRowsFunc
(
STranslateContext
*
pCxt
,
SFunctionNode
*
pFunc
)
{
if
(
SQL_CLAUSE_SELECT
!=
pCxt
->
currClause
||
pCxt
->
pCurrStmt
->
hasIndefiniteRowsFunc
||
pCxt
->
pCurrStmt
->
hasAggFuncs
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
);
}
if
(
hasInvalidFuncNesting
(
pFunc
->
pParameterList
))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_AGG_FUNC_NESTING
);
}
return
TSDB_CODE_SUCCESS
;
}
static
void
setFuncClassification
(
SSelectStmt
*
pSelect
,
SFunctionNode
*
pFunc
)
{
pSelect
->
hasAggFuncs
=
pSelect
->
hasAggFuncs
?
true
:
fmIsAggFunc
(
pFunc
->
funcId
);
pSelect
->
hasRepeatScanFuncs
=
pSelect
->
hasRepeatScanFuncs
?
true
:
fmIsRepeatScanFunc
(
pFunc
->
funcId
);
pSelect
->
hasIndefiniteRowsFunc
=
pSelect
->
hasIndefiniteRowsFunc
?
true
:
fmIsIndefiniteRowsFunc
(
pFunc
->
funcId
);
}
static
EDealRes
translateFunction
(
STranslateContext
*
pCxt
,
SFunctionNode
*
pFunc
)
{
SNode
*
pParam
=
NULL
;
FOREACH
(
pParam
,
pFunc
->
pParameterList
)
{
...
...
@@ -880,48 +932,16 @@ static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode* pFunc)
pCxt
->
errCode
=
getFuncInfo
(
pCxt
,
pFunc
);
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
&&
fmIsAggFunc
(
pFunc
->
funcId
))
{
if
(
beforeHaving
(
pCxt
->
currClause
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
);
}
if
(
hasInvalidFuncNesting
(
pFunc
->
pParameterList
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_AGG_FUNC_NESTING
);
}
if
(
pCxt
->
pCurrStmt
->
hasIndefiniteRowsFunc
)
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
);
}
pCxt
->
pCurrStmt
->
hasAggFuncs
=
true
;
if
(
isCountStar
(
pFunc
))
{
pCxt
->
errCode
=
rewriteCountStar
(
pCxt
,
pFunc
);
}
if
(
fmIsRepeatScanFunc
(
pFunc
->
funcId
))
{
pCxt
->
pCurrStmt
->
hasRepeatScanFuncs
=
true
;
}
pCxt
->
errCode
=
translateAggFunc
(
pCxt
,
pFunc
);
}
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
&&
fmIsScanPseudoColumnFunc
(
pFunc
->
funcId
))
{
if
(
0
==
LIST_LENGTH
(
pFunc
->
pParameterList
))
{
if
(
QUERY_NODE_REAL_TABLE
!=
nodeType
(
pCxt
->
pCurrStmt
->
pFromTable
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_TBNAME
);
}
}
else
{
SValueNode
*
pVal
=
nodesListGetNode
(
pFunc
->
pParameterList
,
0
);
STableNode
*
pTable
=
NULL
;
pCxt
->
errCode
=
findTable
(
pCxt
,
pVal
->
literal
,
&
pTable
);
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
&&
(
NULL
==
pTable
||
QUERY_NODE_REAL_TABLE
!=
nodeType
(
pTable
)))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_TBNAME
);
}
}
pCxt
->
errCode
=
translateScanPseudoColumnFunc
(
pCxt
,
pFunc
);
}
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
&&
fmIsIndefiniteRowsFunc
(
pFunc
->
funcId
))
{
if
(
SQL_CLAUSE_SELECT
!=
pCxt
->
currClause
||
pCxt
->
pCurrStmt
->
hasIndefiniteRowsFunc
||
pCxt
->
pCurrStmt
->
hasAggFuncs
)
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
);
}
if
(
hasInvalidFuncNesting
(
pFunc
->
pParameterList
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_AGG_FUNC_NESTING
);
}
pCxt
->
pCurrStmt
->
hasIndefiniteRowsFunc
=
true
;
pCxt
->
errCode
=
translateIndefiniteRowsFunc
(
pCxt
,
pFunc
);
}
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
)
{
setFuncClassification
(
pCxt
->
pCurrStmt
,
pFunc
);
}
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
?
DEAL_RES_CONTINUE
:
DEAL_RES_ERROR
;
}
...
...
@@ -936,34 +956,34 @@ static EDealRes translateLogicCond(STranslateContext* pCxt, SLogicConditionNode*
return
DEAL_RES_CONTINUE
;
}
static
EDealRes
doTranslateExpr
(
SNode
*
pNode
,
void
*
pContext
)
{
static
EDealRes
doTranslateExpr
(
SNode
*
*
pNode
,
void
*
pContext
)
{
STranslateContext
*
pCxt
=
(
STranslateContext
*
)
pContext
;
switch
(
nodeType
(
pNode
))
{
switch
(
nodeType
(
*
pNode
))
{
case
QUERY_NODE_COLUMN
:
return
translateColumn
(
pCxt
,
(
SColumnNode
*
)
pNode
);
return
translateColumn
(
pCxt
,
(
SColumnNode
*
*
)
pNode
);
case
QUERY_NODE_VALUE
:
return
translateValue
(
pCxt
,
(
SValueNode
*
)
pNode
);
return
translateValue
(
pCxt
,
(
SValueNode
*
)
*
pNode
);
case
QUERY_NODE_OPERATOR
:
return
translateOperator
(
pCxt
,
(
SOperatorNode
*
)
pNode
);
return
translateOperator
(
pCxt
,
(
SOperatorNode
*
)
*
pNode
);
case
QUERY_NODE_FUNCTION
:
return
translateFunction
(
pCxt
,
(
SFunctionNode
*
)
pNode
);
return
translateFunction
(
pCxt
,
(
SFunctionNode
*
)
*
pNode
);
case
QUERY_NODE_LOGIC_CONDITION
:
return
translateLogicCond
(
pCxt
,
(
SLogicConditionNode
*
)
pNode
);
return
translateLogicCond
(
pCxt
,
(
SLogicConditionNode
*
)
*
pNode
);
case
QUERY_NODE_TEMP_TABLE
:
return
translateExprSubquery
(
pCxt
,
((
STempTableNode
*
)
pNode
)
->
pSubquery
);
return
translateExprSubquery
(
pCxt
,
((
STempTableNode
*
)
*
pNode
)
->
pSubquery
);
default:
break
;
}
return
DEAL_RES_CONTINUE
;
}
static
int32_t
translateExpr
(
STranslateContext
*
pCxt
,
SNode
*
pNode
)
{
nodes
Walk
ExprPostOrder
(
pNode
,
doTranslateExpr
,
pCxt
);
static
int32_t
translateExpr
(
STranslateContext
*
pCxt
,
SNode
*
*
pNode
)
{
nodes
Rewrite
ExprPostOrder
(
pNode
,
doTranslateExpr
,
pCxt
);
return
pCxt
->
errCode
;
}
static
int32_t
translateExprList
(
STranslateContext
*
pCxt
,
SNodeList
*
pList
)
{
nodes
Walk
ExprsPostOrder
(
pList
,
doTranslateExpr
,
pCxt
);
nodes
Rewrite
ExprsPostOrder
(
pList
,
doTranslateExpr
,
pCxt
);
return
pCxt
->
errCode
;
}
...
...
@@ -1238,12 +1258,31 @@ static uint8_t getStmtPrecision(SNode* pStmt) {
return
0
;
}
static
bool
stmtIsSingleTable
(
SNode
*
pStmt
)
{
if
(
QUERY_NODE_SELECT_STMT
==
nodeType
(
pStmt
))
{
return
((
STableNode
*
)((
SSelectStmt
*
)
pStmt
)
->
pFromTable
)
->
singleTable
;
}
return
false
;
}
static
uint8_t
getJoinTablePrecision
(
SJoinTableNode
*
pJoinTable
)
{
uint8_t
lp
=
((
STableNode
*
)
pJoinTable
->
pLeft
)
->
precision
;
uint8_t
rp
=
((
STableNode
*
)
pJoinTable
->
pRight
)
->
precision
;
return
(
lp
>
rp
?
rp
:
lp
);
}
static
bool
joinTableIsSingleTable
(
SJoinTableNode
*
pJoinTable
)
{
return
(((
STableNode
*
)
pJoinTable
->
pLeft
)
->
singleTable
&&
((
STableNode
*
)
pJoinTable
->
pRight
)
->
singleTable
);
}
static
bool
isSingleTable
(
SRealTableNode
*
pRealTable
)
{
int8_t
tableType
=
pRealTable
->
pMeta
->
tableType
;
if
(
TSDB_SYSTEM_TABLE
==
tableType
)
{
return
0
!=
strcmp
(
pRealTable
->
table
.
tableName
,
TSDB_INS_TABLE_USER_TABLES
);
}
return
(
TSDB_CHILD_TABLE
==
tableType
||
TSDB_NORMAL_TABLE
==
tableType
);
}
static
int32_t
translateTable
(
STranslateContext
*
pCxt
,
SNode
*
pTable
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
switch
(
nodeType
(
pTable
))
{
...
...
@@ -1262,6 +1301,7 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
code
=
setTableVgroupList
(
pCxt
,
&
name
,
pRealTable
);
}
pRealTable
->
table
.
precision
=
pRealTable
->
pMeta
->
tableInfo
.
precision
;
pRealTable
->
table
.
singleTable
=
isSingleTable
(
pRealTable
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNamespace
(
pCxt
,
pRealTable
);
}
...
...
@@ -1272,6 +1312,7 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
code
=
translateSubquery
(
pCxt
,
pTempTable
->
pSubquery
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pTempTable
->
table
.
precision
=
getStmtPrecision
(
pTempTable
->
pSubquery
);
pTempTable
->
table
.
singleTable
=
stmtIsSingleTable
(
pTempTable
->
pSubquery
);
code
=
addNamespace
(
pCxt
,
pTempTable
);
}
break
;
...
...
@@ -1284,7 +1325,8 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pJoinTable
->
table
.
precision
=
getJoinTablePrecision
(
pJoinTable
);
code
=
translateExpr
(
pCxt
,
pJoinTable
->
pOnCond
);
pJoinTable
->
table
.
singleTable
=
joinTableIsSingleTable
(
pJoinTable
);
code
=
translateExpr
(
pCxt
,
&
pJoinTable
->
pOnCond
);
}
break
;
}
...
...
@@ -1517,7 +1559,7 @@ static int32_t translateOrderByPosition(STranslateContext* pCxt, SNodeList* pPro
if
(
NULL
==
pCol
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_OUT_OF_MEMORY
);
}
setColumnInfoByExpr
(
NULL
,
(
SExprNode
*
)
nodesListGetNode
(
pProjectionList
,
pos
-
1
),
pCol
);
setColumnInfoByExpr
(
NULL
,
(
SExprNode
*
)
nodesListGetNode
(
pProjectionList
,
pos
-
1
),
&
pCol
);
((
SOrderByExprNode
*
)
pNode
)
->
pExpr
=
(
SNode
*
)
pCol
;
nodesDestroyNode
(
pExpr
);
}
...
...
@@ -1563,7 +1605,7 @@ static int32_t translateHaving(STranslateContext* pCxt, SSelectStmt* pSelect) {
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
);
}
pCxt
->
currClause
=
SQL_CLAUSE_HAVING
;
int32_t
code
=
translateExpr
(
pCxt
,
pSelect
->
pHaving
);
int32_t
code
=
translateExpr
(
pCxt
,
&
pSelect
->
pHaving
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkExprForGroupBy
(
pCxt
,
&
pSelect
->
pHaving
);
}
...
...
@@ -1811,7 +1853,7 @@ static int32_t translateWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
return
TSDB_CODE_SUCCESS
;
}
pCxt
->
currClause
=
SQL_CLAUSE_WINDOW
;
int32_t
code
=
translateExpr
(
pCxt
,
pSelect
->
pWindow
);
int32_t
code
=
translateExpr
(
pCxt
,
&
pSelect
->
pWindow
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkWindow
(
pCxt
,
pSelect
);
}
...
...
@@ -1825,7 +1867,7 @@ static int32_t translatePartitionBy(STranslateContext* pCxt, SNodeList* pPartiti
static
int32_t
translateWhere
(
STranslateContext
*
pCxt
,
SNode
*
pWhere
)
{
pCxt
->
currClause
=
SQL_CLAUSE_WHERE
;
return
translateExpr
(
pCxt
,
pWhere
);
return
translateExpr
(
pCxt
,
&
pWhere
);
}
static
int32_t
translateFrom
(
STranslateContext
*
pCxt
,
SSelectStmt
*
pSelect
)
{
...
...
@@ -1857,7 +1899,7 @@ static int32_t createPrimaryKeyColByTable(STranslateContext* pCxt, STableNode* p
}
pCol
->
colId
=
PRIMARYKEY_TIMESTAMP_COL_ID
;
strcpy
(
pCol
->
colName
,
PK_TS_COL_INTERNAL_NAME
);
if
(
!
findAndSetColumn
(
pCol
,
pTable
))
{
if
(
!
findAndSetColumn
(
&
pCol
,
pTable
))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_TIMELINE_FUNC
);
}
*
pPrimaryKey
=
(
SNode
*
)
pCol
;
...
...
@@ -2075,6 +2117,7 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS
pReq
->
replications
=
pStmt
->
pOptions
->
replica
;
pReq
->
strict
=
pStmt
->
pOptions
->
strict
;
pReq
->
cacheLastRow
=
pStmt
->
pOptions
->
cachelast
;
pReq
->
schemaless
=
pStmt
->
pOptions
->
schemaless
;
pReq
->
ignoreExist
=
pStmt
->
ignoreExists
;
return
buildCreateDbRetentions
(
pStmt
->
pOptions
->
pRetentions
,
pReq
);
}
...
...
@@ -2274,6 +2317,9 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkDbRetentionsOption
(
pCxt
,
pOptions
->
pRetentions
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkDbEnumOption
(
pCxt
,
"schemaless"
,
pOptions
->
schemaless
,
TSDB_DB_SCHEMALESS_ON
,
TSDB_DB_SCHEMALESS_OFF
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkOptionsDependency
(
pCxt
,
pDbName
,
pOptions
);
}
...
...
@@ -3267,6 +3313,18 @@ static int32_t translateDropTopic(STranslateContext* pCxt, SDropTopicStmt* pStmt
return
buildCmdMsg
(
pCxt
,
TDMT_MND_DROP_TOPIC
,
(
FSerializeFunc
)
tSerializeSMDropTopicReq
,
&
dropReq
);
}
static
int32_t
translateDropCGroup
(
STranslateContext
*
pCxt
,
SDropCGroupStmt
*
pStmt
)
{
SMDropCgroupReq
dropReq
=
{
0
};
SName
name
;
tNameSetDbName
(
&
name
,
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
topicName
,
strlen
(
pStmt
->
topicName
));
tNameGetFullDbName
(
&
name
,
dropReq
.
topic
);
dropReq
.
igNotExists
=
pStmt
->
ignoreNotExists
;
strcpy
(
dropReq
.
cgroup
,
pStmt
->
cgroup
);
return
buildCmdMsg
(
pCxt
,
TDMT_MND_DROP_CGROUP
,
(
FSerializeFunc
)
tSerializeSMDropCgroupReq
,
&
dropReq
);
}
static
int32_t
translateAlterLocal
(
STranslateContext
*
pCxt
,
SAlterLocalStmt
*
pStmt
)
{
// todo
return
TSDB_CODE_SUCCESS
;
...
...
@@ -3326,6 +3384,8 @@ static int32_t buildCreateStreamReq(STranslateContext* pCxt, SCreateStreamStmt*
pReq
->
igExists
=
pStmt
->
ignoreExists
;
SName
name
;
// tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->streamName, strlen(pStmt->streamName));
// tNameGetFullDbName(&name, pReq->name);
tNameExtractFullName
(
toName
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
db
,
pStmt
->
streamName
,
&
name
),
pReq
->
name
);
if
(
'\0'
!=
pStmt
->
targetTabName
[
0
])
{
...
...
@@ -3550,6 +3610,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
case
QUERY_NODE_DROP_TOPIC_STMT
:
code
=
translateDropTopic
(
pCxt
,
(
SDropTopicStmt
*
)
pNode
);
break
;
case
QUERY_NODE_DROP_CGROUP_STMT
:
code
=
translateDropCGroup
(
pCxt
,
(
SDropCGroupStmt
*
)
pNode
);
break
;
case
QUERY_NODE_ALTER_LOCAL_STMT
:
code
=
translateAlterLocal
(
pCxt
,
(
SAlterLocalStmt
*
)
pNode
);
break
;
...
...
source/libs/parser/src/sql.c
浏览文件 @
070f6040
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
source/libs/parser/test/parInitialCTest.cpp
浏览文件 @
070f6040
...
...
@@ -90,6 +90,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
expect
.
walLevel
=
TSDB_DEFAULT_WAL_LEVEL
;
expect
.
numOfVgroups
=
TSDB_DEFAULT_VN_PER_DB
;
expect
.
numOfStables
=
TSDB_DEFAULT_DB_SINGLE_STABLE
;
expect
.
schemaless
=
TSDB_DEFAULT_DB_SCHEMALESS
;
};
auto
setDbBufferFunc
=
[
&
](
int32_t
buffer
)
{
expect
.
buffer
=
buffer
;
};
...
...
@@ -124,6 +125,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
taosArrayPush
(
expect
.
pRetensions
,
&
retention
);
++
expect
.
numOfRetensions
;
};
auto
setDbSchemalessFunc
=
[
&
](
int8_t
schemaless
)
{
expect
.
schemaless
=
schemaless
;
};
setCheckDdlFunc
([
&
](
const
SQuery
*
pQuery
,
ParserStage
stage
)
{
ASSERT_EQ
(
nodeType
(
pQuery
->
pRoot
),
QUERY_NODE_CREATE_DATABASE_STMT
);
...
...
@@ -149,6 +151,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
ASSERT_EQ
(
req
.
replications
,
expect
.
replications
);
ASSERT_EQ
(
req
.
strict
,
expect
.
strict
);
ASSERT_EQ
(
req
.
cacheLastRow
,
expect
.
cacheLastRow
);
ASSERT_EQ
(
req
.
schemaless
,
expect
.
schemaless
);
ASSERT_EQ
(
req
.
ignoreExist
,
expect
.
ignoreExist
);
ASSERT_EQ
(
req
.
numOfRetensions
,
expect
.
numOfRetensions
);
if
(
expect
.
numOfRetensions
>
0
)
{
...
...
@@ -188,6 +191,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
setDbWalLevelFunc
(
2
);
setDbVgroupsFunc
(
100
);
setDbSingleStableFunc
(
1
);
setDbSchemalessFunc
(
1
);
run
(
"CREATE DATABASE IF NOT EXISTS wxy_db "
"BUFFER 64 "
"CACHELAST 2 "
...
...
@@ -205,7 +209,8 @@ TEST_F(ParserInitialCTest, createDatabase) {
"STRICT 1 "
"WAL 2 "
"VGROUPS 100 "
"SINGLE_STABLE 1 "
);
"SINGLE_STABLE 1 "
"SCHEMALESS 1"
);
setCreateDbReqFunc
(
"wxy_db"
,
1
);
setDbDaysFunc
(
100
);
...
...
source/libs/parser/test/parInitialDTest.cpp
浏览文件 @
070f6040
...
...
@@ -19,7 +19,7 @@ using namespace std;
namespace
ParserTest
{
class
ParserInitialDTest
:
public
Parser
TestBase
{};
class
ParserInitialDTest
:
public
Parser
DdlTest
{};
// todo delete
// todo desc
...
...
@@ -29,7 +29,37 @@ class ParserInitialDTest : public ParserTestBase {};
TEST_F
(
ParserInitialDTest
,
dropBnode
)
{
useDb
(
"root"
,
"test"
);
run
(
"drop bnode on dnode 1"
);
run
(
"DROP BNODE ON DNODE 1"
);
}
// DROP CGROUP [ IF EXISTS ] cgroup_name ON topic_name
TEST_F
(
ParserInitialDTest
,
dropCGroup
)
{
useDb
(
"root"
,
"test"
);
SMDropCgroupReq
expect
=
{
0
};
auto
setDropCgroupReqFunc
=
[
&
](
const
char
*
pTopicName
,
const
char
*
pCGroupName
,
int8_t
igNotExists
=
0
)
{
memset
(
&
expect
,
0
,
sizeof
(
SMDropCgroupReq
));
snprintf
(
expect
.
topic
,
sizeof
(
expect
.
topic
),
"0.%s"
,
pTopicName
);
strcpy
(
expect
.
cgroup
,
pCGroupName
);
expect
.
igNotExists
=
igNotExists
;
};
setCheckDdlFunc
([
&
](
const
SQuery
*
pQuery
,
ParserStage
stage
)
{
ASSERT_EQ
(
nodeType
(
pQuery
->
pRoot
),
QUERY_NODE_DROP_CGROUP_STMT
);
SMDropCgroupReq
req
=
{
0
};
ASSERT_TRUE
(
TSDB_CODE_SUCCESS
==
tDeserializeSMDropCgroupReq
(
pQuery
->
pCmdMsg
->
pMsg
,
pQuery
->
pCmdMsg
->
msgLen
,
&
req
));
ASSERT_EQ
(
std
::
string
(
req
.
topic
),
std
::
string
(
expect
.
topic
));
ASSERT_EQ
(
std
::
string
(
req
.
cgroup
),
std
::
string
(
expect
.
cgroup
));
ASSERT_EQ
(
req
.
igNotExists
,
expect
.
igNotExists
);
});
setDropCgroupReqFunc
(
"tp1"
,
"cg1"
);
run
(
"DROP CGROUP cg1 ON tp1"
);
setDropCgroupReqFunc
(
"tp1"
,
"cg1"
,
1
);
run
(
"DROP CGROUP IF EXISTS cg1 ON tp1"
);
}
// todo drop database
...
...
source/libs/parser/test/parSelectTest.cpp
浏览文件 @
070f6040
...
...
@@ -121,13 +121,13 @@ TEST_F(ParserSelectTest, selectFunc) {
run
(
"SELECT MAX(c1), c2 FROM t1 STATE_WINDOW(c3)"
);
}
TEST_F
(
ParserSelectTest
,
nonstd
Func
)
{
TEST_F
(
ParserSelectTest
,
IndefiniteRows
Func
)
{
useDb
(
"root"
,
"test"
);
run
(
"SELECT DIFF(c1) FROM t1"
);
}
TEST_F
(
ParserSelectTest
,
nonstd
FuncSemanticCheck
)
{
TEST_F
(
ParserSelectTest
,
IndefiniteRows
FuncSemanticCheck
)
{
useDb
(
"root"
,
"test"
);
run
(
"SELECT DIFF(c1), c2 FROM t1"
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
,
PARSER_STAGE_TRANSLATE
);
...
...
source/libs/planner/src/planLogicCreater.c
浏览文件 @
070f6040
...
...
@@ -321,6 +321,7 @@ static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
}
pJoin
->
joinType
=
pJoinTable
->
joinType
;
pJoin
->
isSingleTableJoin
=
pJoinTable
->
table
.
singleTable
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
...
...
@@ -418,7 +419,7 @@ static SColumnNode* createColumnByExpr(const char* pStmtName, SExprNode* pExpr)
}
static
int32_t
createAggLogicNode
(
SLogicPlanContext
*
pCxt
,
SSelectStmt
*
pSelect
,
SLogicNode
**
pLogicNode
)
{
if
(
!
pSelect
->
hasAggFuncs
&&
!
pSelect
->
hasIndefiniteRowsFunc
&&
NULL
==
pSelect
->
pGroupByList
)
{
if
(
!
pSelect
->
hasAggFuncs
&&
NULL
==
pSelect
->
pGroupByList
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -442,8 +443,8 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
code
=
rewriteExprForSelect
(
pAgg
->
pGroupKeys
,
pSelect
,
SQL_CLAUSE_GROUP_BY
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
(
pSelect
->
hasAggFuncs
||
pSelect
->
hasIndefiniteRowsFunc
)
)
{
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_GROUP_BY
,
fmIs
Vector
Func
,
&
pAgg
->
pAggFuncs
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
pSelect
->
hasAggFuncs
)
{
code
=
nodesCollectFuncs
(
pSelect
,
SQL_CLAUSE_GROUP_BY
,
fmIs
Agg
Func
,
&
pAgg
->
pAggFuncs
);
}
// rewrite the expression in subsequent clauses
...
...
source/libs/planner/src/planSpliter.c
浏览文件 @
070f6040
...
...
@@ -18,7 +18,6 @@
#define SPLIT_FLAG_MASK(n) (1 << n)
#define SPLIT_FLAG_STS SPLIT_FLAG_MASK(0)
#define SPLIT_FLAG_CTJ SPLIT_FLAG_MASK(1)
#define SPLIT_FLAG_SET_MASK(val, mask) (val) |= (mask)
#define SPLIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
...
...
@@ -42,7 +41,8 @@ typedef struct SStsInfo {
}
SStsInfo
;
typedef
struct
SCtjInfo
{
SScanLogicNode
*
pScan
;
SJoinLogicNode
*
pJoin
;
SLogicNode
*
pSplitNode
;
SLogicSubplan
*
pSubplan
;
}
SCtjInfo
;
...
...
@@ -58,7 +58,7 @@ typedef struct SUnInfo {
typedef
bool
(
*
FSplFindSplitNode
)(
SLogicSubplan
*
pSubplan
,
void
*
pInfo
);
static
SLogicSubplan
*
splCreateS
canSubplan
(
SSplitContext
*
pCxt
,
SScanLogicNode
*
pScan
,
int32_t
flag
)
{
static
SLogicSubplan
*
splCreateS
ubplan
(
SSplitContext
*
pCxt
,
SLogicNode
*
pNode
,
int32_t
flag
)
{
SLogicSubplan
*
pSubplan
=
nodesMakeNode
(
QUERY_NODE_LOGIC_SUBPLAN
);
if
(
NULL
==
pSubplan
)
{
return
NULL
;
...
...
@@ -66,35 +66,37 @@ static SLogicSubplan* splCreateScanSubplan(SSplitContext* pCxt, SScanLogicNode*
pSubplan
->
id
.
queryId
=
pCxt
->
queryId
;
pSubplan
->
id
.
groupId
=
pCxt
->
groupId
;
pSubplan
->
subplanType
=
SUBPLAN_TYPE_SCAN
;
pSubplan
->
pNode
=
(
SLogicNode
*
)
nodesCloneNode
(
pScan
);
TSWAP
(
pSubplan
->
pVgroupList
,
((
SScanLogicNode
*
)
pSubplan
->
pNode
)
->
pVgroupList
);
pSubplan
->
pNode
=
(
SLogicNode
*
)
nodesCloneNode
(
pNode
);
if
(
QUERY_NODE_LOGIC_PLAN_SCAN
==
nodeType
(
pNode
))
{
TSWAP
(
pSubplan
->
pVgroupList
,
((
SScanLogicNode
*
)
pSubplan
->
pNode
)
->
pVgroupList
);
}
SPLIT_FLAG_SET_MASK
(
pSubplan
->
splitFlag
,
flag
);
return
pSubplan
;
}
static
int32_t
splCreateExchangeNode
(
SSplitContext
*
pCxt
,
SLogicSubplan
*
pSubplan
,
S
ScanLogicNode
*
pScan
,
static
int32_t
splCreateExchangeNode
(
SSplitContext
*
pCxt
,
SLogicSubplan
*
pSubplan
,
S
LogicNode
*
pSplitNode
,
ESubplanType
subplanType
)
{
SExchangeLogicNode
*
pExchange
=
nodesMakeNode
(
QUERY_NODE_LOGIC_PLAN_EXCHANGE
);
if
(
NULL
==
pExchange
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pExchange
->
srcGroupId
=
pCxt
->
groupId
;
pExchange
->
precision
=
pS
can
->
pMeta
->
tableInfo
.
precision
;
pExchange
->
node
.
pTargets
=
nodesCloneList
(
pS
can
->
node
.
pTargets
);
pExchange
->
precision
=
pS
plitNode
->
precision
;
pExchange
->
node
.
pTargets
=
nodesCloneList
(
pS
plitNode
->
pTargets
);
if
(
NULL
==
pExchange
->
node
.
pTargets
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pSubplan
->
subplanType
=
SUBPLAN_TYPE_MERGE
;
pSubplan
->
subplanType
=
subplanType
;
if
(
NULL
==
pS
can
->
node
.
pParent
)
{
if
(
NULL
==
pS
plitNode
->
pParent
)
{
pSubplan
->
pNode
=
(
SLogicNode
*
)
pExchange
;
return
TSDB_CODE_SUCCESS
;
}
SNode
*
pNode
;
FOREACH
(
pNode
,
pS
can
->
node
.
pParent
->
pChildren
)
{
if
(
nodesEqualNode
(
pNode
,
pS
can
))
{
FOREACH
(
pNode
,
pS
plitNode
->
pParent
->
pChildren
)
{
if
(
nodesEqualNode
(
pNode
,
pS
plitNode
))
{
REPLACE_NODE
(
pExchange
);
nodesDestroyNode
(
pNode
);
return
TSDB_CODE_SUCCESS
;
...
...
@@ -148,33 +150,31 @@ static int32_t stsSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) {
if
(
!
splMatch
(
pCxt
,
pSubplan
,
SPLIT_FLAG_STS
,
(
FSplFindSplitNode
)
stsFindSplitNode
,
&
info
))
{
return
TSDB_CODE_SUCCESS
;
}
int32_t
code
=
nodesListMakeStrictAppend
(
&
info
.
pSubplan
->
pChildren
,
splCreateScanSubplan
(
pCxt
,
info
.
pScan
,
SPLIT_FLAG_STS
));
int32_t
code
=
nodesListMakeStrictAppend
(
&
info
.
pSubplan
->
pChildren
,
splCreateSubplan
(
pCxt
,
(
SLogicNode
*
)
info
.
pScan
,
SPLIT_FLAG_STS
));
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
splCreateExchangeNode
(
pCxt
,
info
.
pSubplan
,
info
.
pScan
,
SUBPLAN_TYPE_MERGE
);
code
=
splCreateExchangeNode
(
pCxt
,
info
.
pSubplan
,
(
SLogicNode
*
)
info
.
pScan
,
SUBPLAN_TYPE_MERGE
);
}
++
(
pCxt
->
groupId
);
pCxt
->
split
=
true
;
return
code
;
}
static
bool
ctjIsSingleTable
(
int8_t
tableType
)
{
return
(
TSDB_CHILD_TABLE
==
tableType
||
TSDB_NORMAL_TABLE
==
tableType
);
static
bool
needSplit
(
SJoinLogicNode
*
pJoin
)
{
if
(
!
pJoin
->
isSingleTableJoin
)
{
return
false
;
}
return
QUERY_NODE_LOGIC_PLAN_EXCHANGE
!=
nodeType
(
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
0
))
&&
QUERY_NODE_LOGIC_PLAN_EXCHANGE
!=
nodeType
(
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
));
}
static
SLogicNode
*
ctjMatchByNode
(
SLogicNode
*
pNode
)
{
if
(
QUERY_NODE_LOGIC_PLAN_JOIN
==
nodeType
(
pNode
))
{
SLogicNode
*
pLeft
=
(
SLogicNode
*
)
nodesListGetNode
(
pNode
->
pChildren
,
0
);
SLogicNode
*
pRight
=
(
SLogicNode
*
)
nodesListGetNode
(
pNode
->
pChildren
,
1
);
if
(
QUERY_NODE_LOGIC_PLAN_SCAN
==
nodeType
(
pLeft
)
&&
ctjIsSingleTable
(((
SScanLogicNode
*
)
pLeft
)
->
pMeta
->
tableType
)
&&
QUERY_NODE_LOGIC_PLAN_SCAN
==
nodeType
(
pRight
)
&&
ctjIsSingleTable
(((
SScanLogicNode
*
)
pRight
)
->
pMeta
->
tableType
))
{
return
pRight
;
}
static
SJoinLogicNode
*
ctjMatchByNode
(
SLogicNode
*
pNode
)
{
if
(
QUERY_NODE_LOGIC_PLAN_JOIN
==
nodeType
(
pNode
)
&&
needSplit
((
SJoinLogicNode
*
)
pNode
))
{
return
(
SJoinLogicNode
*
)
pNode
;
}
SNode
*
pChild
;
FOREACH
(
pChild
,
pNode
->
pChildren
)
{
SLogicNode
*
pSplitNode
=
ctjMatchByNode
((
SLogicNode
*
)
pChild
);
S
Join
LogicNode
*
pSplitNode
=
ctjMatchByNode
((
SLogicNode
*
)
pChild
);
if
(
NULL
!=
pSplitNode
)
{
return
pSplitNode
;
}
...
...
@@ -183,23 +183,23 @@ static SLogicNode* ctjMatchByNode(SLogicNode* pNode) {
}
static
bool
ctjFindSplitNode
(
SLogicSubplan
*
pSubplan
,
SCtjInfo
*
pInfo
)
{
SLogicNode
*
pSplitNode
=
ctjMatchByNode
(
pSubplan
->
pNode
);
if
(
NULL
!=
pSplitNode
)
{
pInfo
->
pScan
=
(
SScanLogicNode
*
)
pSplitNode
;
SJoinLogicNode
*
pJoin
=
ctjMatchByNode
(
pSubplan
->
pNode
);
if
(
NULL
!=
pJoin
)
{
pInfo
->
pJoin
=
pJoin
;
pInfo
->
pSplitNode
=
nodesListGetNode
(
pJoin
->
node
.
pChildren
,
1
);
pInfo
->
pSubplan
=
pSubplan
;
}
return
NULL
!=
p
SplitNode
;
return
NULL
!=
p
Join
;
}
static
int32_t
ctjSplit
(
SSplitContext
*
pCxt
,
SLogicSubplan
*
pSubplan
)
{
SCtjInfo
info
=
{
0
};
if
(
!
splMatch
(
pCxt
,
pSubplan
,
SPLIT_FLAG_CTJ
,
(
FSplFindSplitNode
)
ctjFindSplitNode
,
&
info
))
{
if
(
!
splMatch
(
pCxt
,
pSubplan
,
0
,
(
FSplFindSplitNode
)
ctjFindSplitNode
,
&
info
))
{
return
TSDB_CODE_SUCCESS
;
}
int32_t
code
=
nodesListMakeStrictAppend
(
&
info
.
pSubplan
->
pChildren
,
splCreateScanSubplan
(
pCxt
,
info
.
pScan
,
SPLIT_FLAG_CTJ
));
int32_t
code
=
nodesListMakeStrictAppend
(
&
info
.
pSubplan
->
pChildren
,
splCreateSubplan
(
pCxt
,
info
.
pSplitNode
,
0
));
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
splCreateExchangeNode
(
pCxt
,
info
.
pSubplan
,
info
.
pS
can
,
info
.
pSubplan
->
subplanType
);
code
=
splCreateExchangeNode
(
pCxt
,
info
.
pSubplan
,
info
.
pS
plitNode
,
info
.
pSubplan
->
subplanType
);
}
++
(
pCxt
->
groupId
);
pCxt
->
split
=
true
;
...
...
source/libs/planner/test/planSubqueryTest.cpp
浏览文件 @
070f6040
...
...
@@ -26,6 +26,8 @@ TEST_F(PlanSubqeuryTest, basic) {
run
(
"SELECT * FROM (SELECT * FROM t1)"
);
run
(
"SELECT LAST(c1) FROM (SELECT * FROM t1)"
);
run
(
"SELECT c1 FROM (SELECT TODAY() AS c1 FROM t1)"
);
}
TEST_F
(
PlanSubqeuryTest
,
doubleGroupBy
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录