Merge pull request #12984 from taosdata/feature/3.0_wxy
feat: sql command 'drop cgroup'
This commit is contained in:
commit
94ebcc9b74
|
@ -695,6 +695,7 @@ typedef struct {
|
||||||
int8_t replications;
|
int8_t replications;
|
||||||
int8_t strict;
|
int8_t strict;
|
||||||
int8_t cacheLastRow;
|
int8_t cacheLastRow;
|
||||||
|
int8_t schemaless;
|
||||||
int8_t ignoreExist;
|
int8_t ignoreExist;
|
||||||
int32_t numOfRetensions;
|
int32_t numOfRetensions;
|
||||||
SArray* pRetensions; // SRetention
|
SArray* pRetensions; // SRetention
|
||||||
|
|
|
@ -144,6 +144,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TOPIC, "mnode-create-topic", SMCreateTopicReq, SMCreateTopicRsp)
|
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_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_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_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_ASK_EP, "mnode-mq-ask-ep", SMqAskEpReq, SMqAskEpRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_MQ_TIMER, "mnode-mq-tmr", SMTimerReq, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_MQ_TIMER, "mnode-mq-tmr", SMTimerReq, NULL)
|
||||||
|
|
|
@ -93,166 +93,168 @@
|
||||||
#define TK_VGROUPS 75
|
#define TK_VGROUPS 75
|
||||||
#define TK_SINGLE_STABLE 76
|
#define TK_SINGLE_STABLE 76
|
||||||
#define TK_RETENTIONS 77
|
#define TK_RETENTIONS 77
|
||||||
#define TK_NK_COLON 78
|
#define TK_SCHEMALESS 78
|
||||||
#define TK_TABLE 79
|
#define TK_NK_COLON 79
|
||||||
#define TK_NK_LP 80
|
#define TK_TABLE 80
|
||||||
#define TK_NK_RP 81
|
#define TK_NK_LP 81
|
||||||
#define TK_STABLE 82
|
#define TK_NK_RP 82
|
||||||
#define TK_ADD 83
|
#define TK_STABLE 83
|
||||||
#define TK_COLUMN 84
|
#define TK_ADD 84
|
||||||
#define TK_MODIFY 85
|
#define TK_COLUMN 85
|
||||||
#define TK_RENAME 86
|
#define TK_MODIFY 86
|
||||||
#define TK_TAG 87
|
#define TK_RENAME 87
|
||||||
#define TK_SET 88
|
#define TK_TAG 88
|
||||||
#define TK_NK_EQ 89
|
#define TK_SET 89
|
||||||
#define TK_USING 90
|
#define TK_NK_EQ 90
|
||||||
#define TK_TAGS 91
|
#define TK_USING 91
|
||||||
#define TK_COMMENT 92
|
#define TK_TAGS 92
|
||||||
#define TK_BOOL 93
|
#define TK_COMMENT 93
|
||||||
#define TK_TINYINT 94
|
#define TK_BOOL 94
|
||||||
#define TK_SMALLINT 95
|
#define TK_TINYINT 95
|
||||||
#define TK_INT 96
|
#define TK_SMALLINT 96
|
||||||
#define TK_INTEGER 97
|
#define TK_INT 97
|
||||||
#define TK_BIGINT 98
|
#define TK_INTEGER 98
|
||||||
#define TK_FLOAT 99
|
#define TK_BIGINT 99
|
||||||
#define TK_DOUBLE 100
|
#define TK_FLOAT 100
|
||||||
#define TK_BINARY 101
|
#define TK_DOUBLE 101
|
||||||
#define TK_TIMESTAMP 102
|
#define TK_BINARY 102
|
||||||
#define TK_NCHAR 103
|
#define TK_TIMESTAMP 103
|
||||||
#define TK_UNSIGNED 104
|
#define TK_NCHAR 104
|
||||||
#define TK_JSON 105
|
#define TK_UNSIGNED 105
|
||||||
#define TK_VARCHAR 106
|
#define TK_JSON 106
|
||||||
#define TK_MEDIUMBLOB 107
|
#define TK_VARCHAR 107
|
||||||
#define TK_BLOB 108
|
#define TK_MEDIUMBLOB 108
|
||||||
#define TK_VARBINARY 109
|
#define TK_BLOB 109
|
||||||
#define TK_DECIMAL 110
|
#define TK_VARBINARY 110
|
||||||
#define TK_DELAY 111
|
#define TK_DECIMAL 111
|
||||||
#define TK_FILE_FACTOR 112
|
#define TK_DELAY 112
|
||||||
#define TK_NK_FLOAT 113
|
#define TK_FILE_FACTOR 113
|
||||||
#define TK_ROLLUP 114
|
#define TK_NK_FLOAT 114
|
||||||
#define TK_TTL 115
|
#define TK_ROLLUP 115
|
||||||
#define TK_SMA 116
|
#define TK_TTL 116
|
||||||
#define TK_SHOW 117
|
#define TK_SMA 117
|
||||||
#define TK_DATABASES 118
|
#define TK_SHOW 118
|
||||||
#define TK_TABLES 119
|
#define TK_DATABASES 119
|
||||||
#define TK_STABLES 120
|
#define TK_TABLES 120
|
||||||
#define TK_MNODES 121
|
#define TK_STABLES 121
|
||||||
#define TK_MODULES 122
|
#define TK_MNODES 122
|
||||||
#define TK_QNODES 123
|
#define TK_MODULES 123
|
||||||
#define TK_FUNCTIONS 124
|
#define TK_QNODES 124
|
||||||
#define TK_INDEXES 125
|
#define TK_FUNCTIONS 125
|
||||||
#define TK_ACCOUNTS 126
|
#define TK_INDEXES 126
|
||||||
#define TK_APPS 127
|
#define TK_ACCOUNTS 127
|
||||||
#define TK_CONNECTIONS 128
|
#define TK_APPS 128
|
||||||
#define TK_LICENCE 129
|
#define TK_CONNECTIONS 129
|
||||||
#define TK_GRANTS 130
|
#define TK_LICENCE 130
|
||||||
#define TK_QUERIES 131
|
#define TK_GRANTS 131
|
||||||
#define TK_SCORES 132
|
#define TK_QUERIES 132
|
||||||
#define TK_TOPICS 133
|
#define TK_SCORES 133
|
||||||
#define TK_VARIABLES 134
|
#define TK_TOPICS 134
|
||||||
#define TK_BNODES 135
|
#define TK_VARIABLES 135
|
||||||
#define TK_SNODES 136
|
#define TK_BNODES 136
|
||||||
#define TK_CLUSTER 137
|
#define TK_SNODES 137
|
||||||
#define TK_TRANSACTIONS 138
|
#define TK_CLUSTER 138
|
||||||
#define TK_LIKE 139
|
#define TK_TRANSACTIONS 139
|
||||||
#define TK_INDEX 140
|
#define TK_LIKE 140
|
||||||
#define TK_FULLTEXT 141
|
#define TK_INDEX 141
|
||||||
#define TK_FUNCTION 142
|
#define TK_FULLTEXT 142
|
||||||
#define TK_INTERVAL 143
|
#define TK_FUNCTION 143
|
||||||
#define TK_TOPIC 144
|
#define TK_INTERVAL 144
|
||||||
#define TK_AS 145
|
#define TK_TOPIC 145
|
||||||
#define TK_WITH 146
|
#define TK_AS 146
|
||||||
#define TK_SCHEMA 147
|
#define TK_CGROUP 147
|
||||||
#define TK_DESC 148
|
#define TK_WITH 148
|
||||||
#define TK_DESCRIBE 149
|
#define TK_SCHEMA 149
|
||||||
#define TK_RESET 150
|
#define TK_DESC 150
|
||||||
#define TK_QUERY 151
|
#define TK_DESCRIBE 151
|
||||||
#define TK_CACHE 152
|
#define TK_RESET 152
|
||||||
#define TK_EXPLAIN 153
|
#define TK_QUERY 153
|
||||||
#define TK_ANALYZE 154
|
#define TK_CACHE 154
|
||||||
#define TK_VERBOSE 155
|
#define TK_EXPLAIN 155
|
||||||
#define TK_NK_BOOL 156
|
#define TK_ANALYZE 156
|
||||||
#define TK_RATIO 157
|
#define TK_VERBOSE 157
|
||||||
#define TK_COMPACT 158
|
#define TK_NK_BOOL 158
|
||||||
#define TK_VNODES 159
|
#define TK_RATIO 159
|
||||||
#define TK_IN 160
|
#define TK_COMPACT 160
|
||||||
#define TK_OUTPUTTYPE 161
|
#define TK_VNODES 161
|
||||||
#define TK_AGGREGATE 162
|
#define TK_IN 162
|
||||||
#define TK_BUFSIZE 163
|
#define TK_OUTPUTTYPE 163
|
||||||
#define TK_STREAM 164
|
#define TK_AGGREGATE 164
|
||||||
#define TK_INTO 165
|
#define TK_BUFSIZE 165
|
||||||
#define TK_TRIGGER 166
|
#define TK_STREAM 166
|
||||||
#define TK_AT_ONCE 167
|
#define TK_INTO 167
|
||||||
#define TK_WINDOW_CLOSE 168
|
#define TK_TRIGGER 168
|
||||||
#define TK_WATERMARK 169
|
#define TK_AT_ONCE 169
|
||||||
#define TK_KILL 170
|
#define TK_WINDOW_CLOSE 170
|
||||||
#define TK_CONNECTION 171
|
#define TK_WATERMARK 171
|
||||||
#define TK_TRANSACTION 172
|
#define TK_KILL 172
|
||||||
#define TK_MERGE 173
|
#define TK_CONNECTION 173
|
||||||
#define TK_VGROUP 174
|
#define TK_TRANSACTION 174
|
||||||
#define TK_REDISTRIBUTE 175
|
#define TK_MERGE 175
|
||||||
#define TK_SPLIT 176
|
#define TK_VGROUP 176
|
||||||
#define TK_SYNCDB 177
|
#define TK_REDISTRIBUTE 177
|
||||||
#define TK_NULL 178
|
#define TK_SPLIT 178
|
||||||
#define TK_NK_QUESTION 179
|
#define TK_SYNCDB 179
|
||||||
#define TK_NK_ARROW 180
|
#define TK_NULL 180
|
||||||
#define TK_ROWTS 181
|
#define TK_NK_QUESTION 181
|
||||||
#define TK_TBNAME 182
|
#define TK_NK_ARROW 182
|
||||||
#define TK_QSTARTTS 183
|
#define TK_ROWTS 183
|
||||||
#define TK_QENDTS 184
|
#define TK_TBNAME 184
|
||||||
#define TK_WSTARTTS 185
|
#define TK_QSTARTTS 185
|
||||||
#define TK_WENDTS 186
|
#define TK_QENDTS 186
|
||||||
#define TK_WDURATION 187
|
#define TK_WSTARTTS 187
|
||||||
#define TK_CAST 188
|
#define TK_WENDTS 188
|
||||||
#define TK_NOW 189
|
#define TK_WDURATION 189
|
||||||
#define TK_TODAY 190
|
#define TK_CAST 190
|
||||||
#define TK_TIMEZONE 191
|
#define TK_NOW 191
|
||||||
#define TK_COUNT 192
|
#define TK_TODAY 192
|
||||||
#define TK_FIRST 193
|
#define TK_TIMEZONE 193
|
||||||
#define TK_LAST 194
|
#define TK_COUNT 194
|
||||||
#define TK_LAST_ROW 195
|
#define TK_FIRST 195
|
||||||
#define TK_BETWEEN 196
|
#define TK_LAST 196
|
||||||
#define TK_IS 197
|
#define TK_LAST_ROW 197
|
||||||
#define TK_NK_LT 198
|
#define TK_BETWEEN 198
|
||||||
#define TK_NK_GT 199
|
#define TK_IS 199
|
||||||
#define TK_NK_LE 200
|
#define TK_NK_LT 200
|
||||||
#define TK_NK_GE 201
|
#define TK_NK_GT 201
|
||||||
#define TK_NK_NE 202
|
#define TK_NK_LE 202
|
||||||
#define TK_MATCH 203
|
#define TK_NK_GE 203
|
||||||
#define TK_NMATCH 204
|
#define TK_NK_NE 204
|
||||||
#define TK_CONTAINS 205
|
#define TK_MATCH 205
|
||||||
#define TK_JOIN 206
|
#define TK_NMATCH 206
|
||||||
#define TK_INNER 207
|
#define TK_CONTAINS 207
|
||||||
#define TK_SELECT 208
|
#define TK_JOIN 208
|
||||||
#define TK_DISTINCT 209
|
#define TK_INNER 209
|
||||||
#define TK_WHERE 210
|
#define TK_SELECT 210
|
||||||
#define TK_PARTITION 211
|
#define TK_DISTINCT 211
|
||||||
#define TK_BY 212
|
#define TK_WHERE 212
|
||||||
#define TK_SESSION 213
|
#define TK_PARTITION 213
|
||||||
#define TK_STATE_WINDOW 214
|
#define TK_BY 214
|
||||||
#define TK_SLIDING 215
|
#define TK_SESSION 215
|
||||||
#define TK_FILL 216
|
#define TK_STATE_WINDOW 216
|
||||||
#define TK_VALUE 217
|
#define TK_SLIDING 217
|
||||||
#define TK_NONE 218
|
#define TK_FILL 218
|
||||||
#define TK_PREV 219
|
#define TK_VALUE 219
|
||||||
#define TK_LINEAR 220
|
#define TK_NONE 220
|
||||||
#define TK_NEXT 221
|
#define TK_PREV 221
|
||||||
#define TK_GROUP 222
|
#define TK_LINEAR 222
|
||||||
#define TK_HAVING 223
|
#define TK_NEXT 223
|
||||||
#define TK_ORDER 224
|
#define TK_GROUP 224
|
||||||
#define TK_SLIMIT 225
|
#define TK_HAVING 225
|
||||||
#define TK_SOFFSET 226
|
#define TK_ORDER 226
|
||||||
#define TK_LIMIT 227
|
#define TK_SLIMIT 227
|
||||||
#define TK_OFFSET 228
|
#define TK_SOFFSET 228
|
||||||
#define TK_ASC 229
|
#define TK_LIMIT 229
|
||||||
#define TK_NULLS 230
|
#define TK_OFFSET 230
|
||||||
#define TK_ID 231
|
#define TK_ASC 231
|
||||||
#define TK_NK_BITNOT 232
|
#define TK_NULLS 232
|
||||||
#define TK_INSERT 233
|
#define TK_ID 233
|
||||||
#define TK_VALUES 234
|
#define TK_NK_BITNOT 234
|
||||||
#define TK_IMPORT 235
|
#define TK_INSERT 235
|
||||||
#define TK_NK_SEMI 236
|
#define TK_VALUES 236
|
||||||
#define TK_FILE 237
|
#define TK_IMPORT 237
|
||||||
|
#define TK_NK_SEMI 238
|
||||||
|
#define TK_FILE 239
|
||||||
|
|
||||||
#define TK_NK_SPACE 300
|
#define TK_NK_SPACE 300
|
||||||
#define TK_NK_COMMENT 301
|
#define TK_NK_COMMENT 301
|
||||||
|
|
|
@ -50,6 +50,7 @@ typedef struct SDatabaseOptions {
|
||||||
int32_t numOfVgroups;
|
int32_t numOfVgroups;
|
||||||
int8_t singleStable;
|
int8_t singleStable;
|
||||||
SNodeList* pRetentions;
|
SNodeList* pRetentions;
|
||||||
|
int8_t schemaless;
|
||||||
} SDatabaseOptions;
|
} SDatabaseOptions;
|
||||||
|
|
||||||
typedef struct SCreateDatabaseStmt {
|
typedef struct SCreateDatabaseStmt {
|
||||||
|
@ -260,6 +261,13 @@ typedef struct SDropTopicStmt {
|
||||||
bool ignoreNotExists;
|
bool ignoreNotExists;
|
||||||
} SDropTopicStmt;
|
} SDropTopicStmt;
|
||||||
|
|
||||||
|
typedef struct SDropCGroupStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char topicName[TSDB_TABLE_NAME_LEN];
|
||||||
|
char cgroup[TSDB_CGROUP_LEN];
|
||||||
|
bool ignoreNotExists;
|
||||||
|
} SDropCGroupStmt;
|
||||||
|
|
||||||
typedef struct SAlterLocalStmt {
|
typedef struct SAlterLocalStmt {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
char config[TSDB_DNODE_CONFIG_LEN];
|
char config[TSDB_DNODE_CONFIG_LEN];
|
||||||
|
|
|
@ -131,6 +131,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_DROP_MNODE_STMT,
|
QUERY_NODE_DROP_MNODE_STMT,
|
||||||
QUERY_NODE_CREATE_TOPIC_STMT,
|
QUERY_NODE_CREATE_TOPIC_STMT,
|
||||||
QUERY_NODE_DROP_TOPIC_STMT,
|
QUERY_NODE_DROP_TOPIC_STMT,
|
||||||
|
QUERY_NODE_DROP_CGROUP_STMT,
|
||||||
QUERY_NODE_ALTER_LOCAL_STMT,
|
QUERY_NODE_ALTER_LOCAL_STMT,
|
||||||
QUERY_NODE_EXPLAIN_STMT,
|
QUERY_NODE_EXPLAIN_STMT,
|
||||||
QUERY_NODE_DESCRIBE_STMT,
|
QUERY_NODE_DESCRIBE_STMT,
|
||||||
|
@ -243,7 +244,6 @@ typedef struct SNodeList {
|
||||||
|
|
||||||
#define SNodeptr void*
|
#define SNodeptr void*
|
||||||
|
|
||||||
int32_t nodesNodeSize(ENodeType type);
|
|
||||||
SNodeptr nodesMakeNode(ENodeType type);
|
SNodeptr nodesMakeNode(ENodeType type);
|
||||||
void nodesDestroyNode(SNodeptr pNode);
|
void nodesDestroyNode(SNodeptr pNode);
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef struct SLogicNode {
|
||||||
SNodeList* pChildren;
|
SNodeList* pChildren;
|
||||||
struct SLogicNode* pParent;
|
struct SLogicNode* pParent;
|
||||||
int32_t optimizedFlag;
|
int32_t optimizedFlag;
|
||||||
|
uint8_t precision;
|
||||||
} SLogicNode;
|
} SLogicNode;
|
||||||
|
|
||||||
typedef enum EScanType { SCAN_TYPE_TAG = 1, SCAN_TYPE_TABLE, SCAN_TYPE_SYSTEM_TABLE, SCAN_TYPE_STREAM } EScanType;
|
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;
|
SLogicNode node;
|
||||||
EJoinType joinType;
|
EJoinType joinType;
|
||||||
SNode* pOnConditions;
|
SNode* pOnConditions;
|
||||||
|
bool isSingleTableJoin;
|
||||||
} SJoinLogicNode;
|
} SJoinLogicNode;
|
||||||
|
|
||||||
typedef struct SAggLogicNode {
|
typedef struct SAggLogicNode {
|
||||||
|
|
|
@ -132,6 +132,7 @@ typedef struct STableNode {
|
||||||
char tableName[TSDB_TABLE_NAME_LEN];
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
char tableAlias[TSDB_TABLE_NAME_LEN];
|
char tableAlias[TSDB_TABLE_NAME_LEN];
|
||||||
uint8_t precision;
|
uint8_t precision;
|
||||||
|
bool singleTable;
|
||||||
} STableNode;
|
} STableNode;
|
||||||
|
|
||||||
struct STableMeta;
|
struct STableMeta;
|
||||||
|
@ -242,6 +243,7 @@ typedef struct SSelectStmt {
|
||||||
bool hasAggFuncs;
|
bool hasAggFuncs;
|
||||||
bool hasRepeatScanFuncs;
|
bool hasRepeatScanFuncs;
|
||||||
bool hasIndefiniteRowsFunc;
|
bool hasIndefiniteRowsFunc;
|
||||||
|
bool hasSelectFunc;
|
||||||
bool hasSelectValFunc;
|
bool hasSelectValFunc;
|
||||||
} SSelectStmt;
|
} SSelectStmt;
|
||||||
|
|
||||||
|
|
|
@ -334,9 +334,12 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_DB_STREAM_MODE_OFF 0
|
#define TSDB_DB_STREAM_MODE_OFF 0
|
||||||
#define TSDB_DB_STREAM_MODE_ON 1
|
#define TSDB_DB_STREAM_MODE_ON 1
|
||||||
#define TSDB_DEFAULT_DB_STREAM_MODE 0
|
#define TSDB_DEFAULT_DB_STREAM_MODE 0
|
||||||
#define TSDB_DB_SINGLE_STABLE_ON 0
|
#define TSDB_DB_SINGLE_STABLE_ON 1
|
||||||
#define TSDB_DB_SINGLE_STABLE_OFF 1
|
#define TSDB_DB_SINGLE_STABLE_OFF 0
|
||||||
#define TSDB_DEFAULT_DB_SINGLE_STABLE 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_MIN_ROLLUP_FILE_FACTOR 0
|
||||||
#define TSDB_MAX_ROLLUP_FILE_FACTOR 1
|
#define TSDB_MAX_ROLLUP_FILE_FACTOR 1
|
||||||
|
|
|
@ -275,8 +275,10 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, in
|
||||||
|
|
||||||
doBitmapMerge(pColumnInfoData, numOfRow1, pSource, numOfRow2);
|
doBitmapMerge(pColumnInfoData, numOfRow1, pSource, numOfRow2);
|
||||||
|
|
||||||
int32_t offset = pColumnInfoData->info.bytes * numOfRow1;
|
if (pSource->pData) {
|
||||||
memcpy(pColumnInfoData->pData + offset, pSource->pData, pSource->info.bytes * numOfRow2);
|
int32_t offset = pColumnInfoData->info.bytes * numOfRow1;
|
||||||
|
memcpy(pColumnInfoData->pData + offset, pSource->pData, pSource->info.bytes * numOfRow2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return numOfRow1 + numOfRow2;
|
return numOfRow1 + numOfRow2;
|
||||||
|
@ -319,14 +321,16 @@ int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* p
|
||||||
pColumnInfoData->nullbitmap = tmp;
|
pColumnInfoData->nullbitmap = tmp;
|
||||||
memcpy(pColumnInfoData->nullbitmap, pSource->nullbitmap, BitmapLen(numOfRows));
|
memcpy(pColumnInfoData->nullbitmap, pSource->nullbitmap, BitmapLen(numOfRows));
|
||||||
|
|
||||||
int32_t newSize = numOfRows * pColumnInfoData->info.bytes;
|
if (pSource->pData) {
|
||||||
tmp = taosMemoryRealloc(pColumnInfoData->pData, newSize);
|
int32_t newSize = numOfRows * pColumnInfoData->info.bytes;
|
||||||
if (tmp == NULL) {
|
tmp = taosMemoryRealloc(pColumnInfoData->pData, newSize);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
if (tmp == NULL) {
|
||||||
}
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
pColumnInfoData->pData = tmp;
|
pColumnInfoData->pData = tmp;
|
||||||
memcpy(pColumnInfoData->pData, pSource->pData, pSource->info.bytes * numOfRows);
|
memcpy(pColumnInfoData->pData, pSource->pData, pSource->info.bytes * numOfRows);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pColumnInfoData->hasNull = pSource->hasNull;
|
pColumnInfoData->hasNull = pSource->hasNull;
|
||||||
|
|
|
@ -1680,6 +1680,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
||||||
if (tEncodeI8(&encoder, pReq->replications) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->replications) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 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 (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
||||||
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
||||||
|
@ -1720,6 +1721,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq)
|
||||||
if (tDecodeI8(&decoder, &pReq->replications) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->replications) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 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 (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
||||||
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
||||||
|
@ -3352,7 +3354,8 @@ int32_t tDeserializeSExplainRsp(void *buf, int32_t bufLen, SExplainRsp *pRsp) {
|
||||||
if (tDecodeDouble(&decoder, &pRsp->subplanInfo[i].totalCost) < 0) return -1;
|
if (tDecodeDouble(&decoder, &pRsp->subplanInfo[i].totalCost) < 0) return -1;
|
||||||
if (tDecodeU64(&decoder, &pRsp->subplanInfo[i].numOfRows) < 0) return -1;
|
if (tDecodeU64(&decoder, &pRsp->subplanInfo[i].numOfRows) < 0) return -1;
|
||||||
if (tDecodeU32(&decoder, &pRsp->subplanInfo[i].verboseLen) < 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);
|
tEndDecode(&decoder);
|
||||||
|
|
|
@ -276,7 +276,7 @@ static int32_t translateElapsed(SFunctionNode* pFunc, char* pErrBuf, int32_t len
|
||||||
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param0
|
// param0
|
||||||
SNode* pParaNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
SNode* pParaNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
if (QUERY_NODE_COLUMN != nodeType(pParaNode0)) {
|
if (QUERY_NODE_COLUMN != nodeType(pParaNode0)) {
|
||||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||||
|
@ -288,7 +288,7 @@ static int32_t translateElapsed(SFunctionNode* pFunc, char* pErrBuf, int32_t len
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param1
|
// param1
|
||||||
if (2 == numOfParams) {
|
if (2 == numOfParams) {
|
||||||
SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
|
SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode1)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode1)) {
|
||||||
|
@ -317,7 +317,7 @@ static int32_t translateLeastSQR(SFunctionNode* pFunc, char* pErrBuf, int32_t le
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfParams; ++i) {
|
for (int32_t i = 0; i < numOfParams; ++i) {
|
||||||
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
||||||
if (i > 0) { //param1 & param2
|
if (i > 0) { // param1 & param2
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
@ -333,7 +333,6 @@ static int32_t translateLeastSQR(SFunctionNode* pFunc, char* pErrBuf, int32_t le
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
|
pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -344,7 +343,7 @@ static int32_t translateHistogram(SFunctionNode* pFunc, char* pErrBuf, int32_t l
|
||||||
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param0
|
// param0
|
||||||
SNode* pParaNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
SNode* pParaNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
if (QUERY_NODE_COLUMN != nodeType(pParaNode0)) {
|
if (QUERY_NODE_COLUMN != nodeType(pParaNode0)) {
|
||||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||||
|
@ -356,7 +355,7 @@ static int32_t translateHistogram(SFunctionNode* pFunc, char* pErrBuf, int32_t l
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param1 ~ param3
|
// param1 ~ param3
|
||||||
for (int32_t i = 1; i < numOfParams; ++i) {
|
for (int32_t i = 1; i < numOfParams; ++i) {
|
||||||
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
||||||
|
@ -399,13 +398,13 @@ static int32_t translateStateCount(SFunctionNode* pFunc, char* pErrBuf, int32_t
|
||||||
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param0
|
// param0
|
||||||
uint8_t colType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type;
|
uint8_t colType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type;
|
||||||
if (!IS_NUMERIC_TYPE(colType)) {
|
if (!IS_NUMERIC_TYPE(colType)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param1 & param2
|
// param1 & param2
|
||||||
for (int32_t i = 1; i < numOfParams; ++i) {
|
for (int32_t i = 1; i < numOfParams; ++i) {
|
||||||
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
||||||
|
@ -423,7 +422,7 @@ static int32_t translateStateCount(SFunctionNode* pFunc, char* pErrBuf, int32_t
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//set result type
|
// set result type
|
||||||
pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
|
pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -434,13 +433,13 @@ static int32_t translateStateDuration(SFunctionNode* pFunc, char* pErrBuf, int32
|
||||||
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param0
|
// param0
|
||||||
uint8_t colType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type;
|
uint8_t colType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type;
|
||||||
if (!IS_NUMERIC_TYPE(colType)) {
|
if (!IS_NUMERIC_TYPE(colType)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param1, param2 & param3
|
// param1, param2 & param3
|
||||||
for (int32_t i = 1; i < numOfParams; ++i) {
|
for (int32_t i = 1; i < numOfParams; ++i) {
|
||||||
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
||||||
|
@ -458,11 +457,12 @@ static int32_t translateStateDuration(SFunctionNode* pFunc, char* pErrBuf, int32
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numOfParams == 4 && ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 3))->resType.type != TSDB_DATA_TYPE_BIGINT) {
|
if (numOfParams == 4 &&
|
||||||
|
((SExprNode*)nodesListGetNode(pFunc->pParameterList, 3))->resType.type != TSDB_DATA_TYPE_BIGINT) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//set result type
|
// set result type
|
||||||
pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
|
pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -503,7 +503,7 @@ static int32_t translateMavg(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param0
|
// param0
|
||||||
SNode* pParaNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
SNode* pParaNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
if (QUERY_NODE_COLUMN != nodeType(pParaNode0)) {
|
if (QUERY_NODE_COLUMN != nodeType(pParaNode0)) {
|
||||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||||
|
@ -512,7 +512,7 @@ static int32_t translateMavg(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
|
|
||||||
uint8_t colType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type;
|
uint8_t colType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type;
|
||||||
|
|
||||||
//param1
|
// param1
|
||||||
SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
|
SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode1)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode1)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
|
@ -539,7 +539,7 @@ static int32_t translateSample(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
|
||||||
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param0
|
// param0
|
||||||
SNode* pParamNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
SNode* pParamNode0 = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
if (QUERY_NODE_COLUMN != nodeType(pParamNode0)) {
|
if (QUERY_NODE_COLUMN != nodeType(pParamNode0)) {
|
||||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||||
|
@ -549,7 +549,7 @@ static int32_t translateSample(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
|
||||||
SExprNode* pCol = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
SExprNode* pCol = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
uint8_t colType = pCol->resType.type;
|
uint8_t colType = pCol->resType.type;
|
||||||
|
|
||||||
//param1
|
// param1
|
||||||
SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
|
SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode1)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode1)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
|
@ -567,7 +567,7 @@ static int32_t translateSample(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//set result type
|
// set result type
|
||||||
if (IS_VAR_DATA_TYPE(colType)) {
|
if (IS_VAR_DATA_TYPE(colType)) {
|
||||||
pFunc->node.resType = (SDataType){.bytes = pCol->resType.bytes, .type = colType};
|
pFunc->node.resType = (SDataType){.bytes = pCol->resType.bytes, .type = colType};
|
||||||
} else {
|
} else {
|
||||||
|
@ -583,7 +583,7 @@ static int32_t translateTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//param0
|
// param0
|
||||||
SNode* pPara = nodesListGetNode(pFunc->pParameterList, 0);
|
SNode* pPara = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
if (QUERY_NODE_COLUMN != nodeType(pPara)) {
|
if (QUERY_NODE_COLUMN != nodeType(pPara)) {
|
||||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||||
|
@ -592,7 +592,7 @@ static int32_t translateTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
SExprNode* pCol = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
SExprNode* pCol = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
uint8_t colType = pCol->resType.type;
|
uint8_t colType = pCol->resType.type;
|
||||||
|
|
||||||
//param1 & param2
|
// param1 & param2
|
||||||
for (int32_t i = 1; i < numOfParams; ++i) {
|
for (int32_t i = 1; i < numOfParams; ++i) {
|
||||||
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, i);
|
||||||
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
if (QUERY_NODE_VALUE != nodeType(pParamNode)) {
|
||||||
|
@ -613,7 +613,7 @@ static int32_t translateTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//set result type
|
// set result type
|
||||||
if (IS_VAR_DATA_TYPE(colType)) {
|
if (IS_VAR_DATA_TYPE(colType)) {
|
||||||
pFunc->node.resType = (SDataType){.bytes = pCol->resType.bytes, .type = colType};
|
pFunc->node.resType = (SDataType){.bytes = pCol->resType.bytes, .type = colType};
|
||||||
} else {
|
} else {
|
||||||
|
@ -978,7 +978,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "top",
|
.name = "top",
|
||||||
.type = FUNCTION_TYPE_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,
|
.translateFunc = translateTop,
|
||||||
.getEnvFunc = getTopBotFuncEnv,
|
.getEnvFunc = getTopBotFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
|
@ -988,7 +988,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "bottom",
|
.name = "bottom",
|
||||||
.type = FUNCTION_TYPE_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,
|
.translateFunc = translateBottom,
|
||||||
.getEnvFunc = getTopBotFuncEnv,
|
.getEnvFunc = getTopBotFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
|
|
|
@ -191,6 +191,7 @@ static SNode* tableNodeCopy(const STableNode* pSrc, STableNode* pDst) {
|
||||||
COPY_CHAR_ARRAY_FIELD(tableName);
|
COPY_CHAR_ARRAY_FIELD(tableName);
|
||||||
COPY_CHAR_ARRAY_FIELD(tableAlias);
|
COPY_CHAR_ARRAY_FIELD(tableAlias);
|
||||||
COPY_SCALAR_FIELD(precision);
|
COPY_SCALAR_FIELD(precision);
|
||||||
|
COPY_SCALAR_FIELD(singleTable);
|
||||||
return (SNode*)pDst;
|
return (SNode*)pDst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,6 +327,7 @@ static SNode* logicScanCopy(const SScanLogicNode* pSrc, SScanLogicNode* pDst) {
|
||||||
COPY_SCALAR_FIELD(sliding);
|
COPY_SCALAR_FIELD(sliding);
|
||||||
COPY_SCALAR_FIELD(intervalUnit);
|
COPY_SCALAR_FIELD(intervalUnit);
|
||||||
COPY_SCALAR_FIELD(slidingUnit);
|
COPY_SCALAR_FIELD(slidingUnit);
|
||||||
|
CLONE_NODE_FIELD(pTagCond);
|
||||||
return (SNode*)pDst;
|
return (SNode*)pDst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,6 +335,7 @@ static SNode* logicJoinCopy(const SJoinLogicNode* pSrc, SJoinLogicNode* pDst) {
|
||||||
COPY_BASE_OBJECT_FIELD(node, logicNodeCopy);
|
COPY_BASE_OBJECT_FIELD(node, logicNodeCopy);
|
||||||
COPY_SCALAR_FIELD(joinType);
|
COPY_SCALAR_FIELD(joinType);
|
||||||
CLONE_NODE_FIELD(pOnConditions);
|
CLONE_NODE_FIELD(pOnConditions);
|
||||||
|
COPY_SCALAR_FIELD(isSingleTableJoin);
|
||||||
return (SNode*)pDst;
|
return (SNode*)pDst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,149 +21,160 @@
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
#include "thash.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) {
|
switch (type) {
|
||||||
case QUERY_NODE_COLUMN:
|
case QUERY_NODE_COLUMN:
|
||||||
return sizeof(SColumnNode);
|
return makeNode(type, sizeof(SColumnNode));
|
||||||
case QUERY_NODE_VALUE:
|
case QUERY_NODE_VALUE:
|
||||||
return sizeof(SValueNode);
|
return makeNode(type, sizeof(SValueNode));
|
||||||
case QUERY_NODE_OPERATOR:
|
case QUERY_NODE_OPERATOR:
|
||||||
return sizeof(SOperatorNode);
|
return makeNode(type, sizeof(SOperatorNode));
|
||||||
case QUERY_NODE_LOGIC_CONDITION:
|
case QUERY_NODE_LOGIC_CONDITION:
|
||||||
return sizeof(SLogicConditionNode);
|
return makeNode(type, sizeof(SLogicConditionNode));
|
||||||
case QUERY_NODE_FUNCTION:
|
case QUERY_NODE_FUNCTION:
|
||||||
return sizeof(SFunctionNode);
|
return makeNode(type, sizeof(SFunctionNode));
|
||||||
case QUERY_NODE_REAL_TABLE:
|
case QUERY_NODE_REAL_TABLE:
|
||||||
return sizeof(SRealTableNode);
|
return makeNode(type, sizeof(SRealTableNode));
|
||||||
case QUERY_NODE_TEMP_TABLE:
|
case QUERY_NODE_TEMP_TABLE:
|
||||||
return sizeof(STempTableNode);
|
return makeNode(type, sizeof(STempTableNode));
|
||||||
case QUERY_NODE_JOIN_TABLE:
|
case QUERY_NODE_JOIN_TABLE:
|
||||||
return sizeof(SJoinTableNode);
|
return makeNode(type, sizeof(SJoinTableNode));
|
||||||
case QUERY_NODE_GROUPING_SET:
|
case QUERY_NODE_GROUPING_SET:
|
||||||
return sizeof(SGroupingSetNode);
|
return makeNode(type, sizeof(SGroupingSetNode));
|
||||||
case QUERY_NODE_ORDER_BY_EXPR:
|
case QUERY_NODE_ORDER_BY_EXPR:
|
||||||
return sizeof(SOrderByExprNode);
|
return makeNode(type, sizeof(SOrderByExprNode));
|
||||||
case QUERY_NODE_LIMIT:
|
case QUERY_NODE_LIMIT:
|
||||||
return sizeof(SLimitNode);
|
return makeNode(type, sizeof(SLimitNode));
|
||||||
case QUERY_NODE_STATE_WINDOW:
|
case QUERY_NODE_STATE_WINDOW:
|
||||||
return sizeof(SStateWindowNode);
|
return makeNode(type, sizeof(SStateWindowNode));
|
||||||
case QUERY_NODE_SESSION_WINDOW:
|
case QUERY_NODE_SESSION_WINDOW:
|
||||||
return sizeof(SSessionWindowNode);
|
return makeNode(type, sizeof(SSessionWindowNode));
|
||||||
case QUERY_NODE_INTERVAL_WINDOW:
|
case QUERY_NODE_INTERVAL_WINDOW:
|
||||||
return sizeof(SIntervalWindowNode);
|
return makeNode(type, sizeof(SIntervalWindowNode));
|
||||||
case QUERY_NODE_NODE_LIST:
|
case QUERY_NODE_NODE_LIST:
|
||||||
return sizeof(SNodeListNode);
|
return makeNode(type, sizeof(SNodeListNode));
|
||||||
case QUERY_NODE_FILL:
|
case QUERY_NODE_FILL:
|
||||||
return sizeof(SFillNode);
|
return makeNode(type, sizeof(SFillNode));
|
||||||
case QUERY_NODE_RAW_EXPR:
|
case QUERY_NODE_RAW_EXPR:
|
||||||
return sizeof(SRawExprNode);
|
return makeNode(type, sizeof(SRawExprNode));
|
||||||
case QUERY_NODE_TARGET:
|
case QUERY_NODE_TARGET:
|
||||||
return sizeof(STargetNode);
|
return makeNode(type, sizeof(STargetNode));
|
||||||
case QUERY_NODE_DATABLOCK_DESC:
|
case QUERY_NODE_DATABLOCK_DESC:
|
||||||
return sizeof(SDataBlockDescNode);
|
return makeNode(type, sizeof(SDataBlockDescNode));
|
||||||
case QUERY_NODE_SLOT_DESC:
|
case QUERY_NODE_SLOT_DESC:
|
||||||
return sizeof(SSlotDescNode);
|
return makeNode(type, sizeof(SSlotDescNode));
|
||||||
case QUERY_NODE_COLUMN_DEF:
|
case QUERY_NODE_COLUMN_DEF:
|
||||||
return sizeof(SColumnDefNode);
|
return makeNode(type, sizeof(SColumnDefNode));
|
||||||
case QUERY_NODE_DOWNSTREAM_SOURCE:
|
case QUERY_NODE_DOWNSTREAM_SOURCE:
|
||||||
return sizeof(SDownstreamSourceNode);
|
return makeNode(type, sizeof(SDownstreamSourceNode));
|
||||||
case QUERY_NODE_DATABASE_OPTIONS:
|
case QUERY_NODE_DATABASE_OPTIONS:
|
||||||
return sizeof(SDatabaseOptions);
|
return makeNode(type, sizeof(SDatabaseOptions));
|
||||||
case QUERY_NODE_TABLE_OPTIONS:
|
case QUERY_NODE_TABLE_OPTIONS:
|
||||||
return sizeof(STableOptions);
|
return makeNode(type, sizeof(STableOptions));
|
||||||
case QUERY_NODE_INDEX_OPTIONS:
|
case QUERY_NODE_INDEX_OPTIONS:
|
||||||
return sizeof(SIndexOptions);
|
return makeNode(type, sizeof(SIndexOptions));
|
||||||
case QUERY_NODE_EXPLAIN_OPTIONS:
|
case QUERY_NODE_EXPLAIN_OPTIONS:
|
||||||
return sizeof(SExplainOptions);
|
return makeNode(type, sizeof(SExplainOptions));
|
||||||
case QUERY_NODE_STREAM_OPTIONS:
|
case QUERY_NODE_STREAM_OPTIONS:
|
||||||
return sizeof(SStreamOptions);
|
return makeNode(type, sizeof(SStreamOptions));
|
||||||
case QUERY_NODE_TOPIC_OPTIONS:
|
case QUERY_NODE_TOPIC_OPTIONS:
|
||||||
return sizeof(STopicOptions);
|
return makeNode(type, sizeof(STopicOptions));
|
||||||
case QUERY_NODE_LEFT_VALUE:
|
case QUERY_NODE_LEFT_VALUE:
|
||||||
return sizeof(SLeftValueNode);
|
return makeNode(type, sizeof(SLeftValueNode));
|
||||||
case QUERY_NODE_SET_OPERATOR:
|
case QUERY_NODE_SET_OPERATOR:
|
||||||
return sizeof(SSetOperator);
|
return makeNode(type, sizeof(SSetOperator));
|
||||||
case QUERY_NODE_SELECT_STMT:
|
case QUERY_NODE_SELECT_STMT:
|
||||||
return sizeof(SSelectStmt);
|
return makeNode(type, sizeof(SSelectStmt));
|
||||||
case QUERY_NODE_VNODE_MODIF_STMT:
|
case QUERY_NODE_VNODE_MODIF_STMT:
|
||||||
return sizeof(SVnodeModifOpStmt);
|
return makeNode(type, sizeof(SVnodeModifOpStmt));
|
||||||
case QUERY_NODE_CREATE_DATABASE_STMT:
|
case QUERY_NODE_CREATE_DATABASE_STMT:
|
||||||
return sizeof(SCreateDatabaseStmt);
|
return makeNode(type, sizeof(SCreateDatabaseStmt));
|
||||||
case QUERY_NODE_DROP_DATABASE_STMT:
|
case QUERY_NODE_DROP_DATABASE_STMT:
|
||||||
return sizeof(SDropDatabaseStmt);
|
return makeNode(type, sizeof(SDropDatabaseStmt));
|
||||||
case QUERY_NODE_ALTER_DATABASE_STMT:
|
case QUERY_NODE_ALTER_DATABASE_STMT:
|
||||||
return sizeof(SAlterDatabaseStmt);
|
return makeNode(type, sizeof(SAlterDatabaseStmt));
|
||||||
case QUERY_NODE_CREATE_TABLE_STMT:
|
case QUERY_NODE_CREATE_TABLE_STMT:
|
||||||
return sizeof(SCreateTableStmt);
|
return makeNode(type, sizeof(SCreateTableStmt));
|
||||||
case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
|
case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
|
||||||
return sizeof(SCreateSubTableClause);
|
return makeNode(type, sizeof(SCreateSubTableClause));
|
||||||
case QUERY_NODE_CREATE_MULTI_TABLE_STMT:
|
case QUERY_NODE_CREATE_MULTI_TABLE_STMT:
|
||||||
return sizeof(SCreateMultiTableStmt);
|
return makeNode(type, sizeof(SCreateMultiTableStmt));
|
||||||
case QUERY_NODE_DROP_TABLE_CLAUSE:
|
case QUERY_NODE_DROP_TABLE_CLAUSE:
|
||||||
return sizeof(SDropTableClause);
|
return makeNode(type, sizeof(SDropTableClause));
|
||||||
case QUERY_NODE_DROP_TABLE_STMT:
|
case QUERY_NODE_DROP_TABLE_STMT:
|
||||||
return sizeof(SDropTableStmt);
|
return makeNode(type, sizeof(SDropTableStmt));
|
||||||
case QUERY_NODE_DROP_SUPER_TABLE_STMT:
|
case QUERY_NODE_DROP_SUPER_TABLE_STMT:
|
||||||
return sizeof(SDropSuperTableStmt);
|
return makeNode(type, sizeof(SDropSuperTableStmt));
|
||||||
case QUERY_NODE_ALTER_TABLE_STMT:
|
case QUERY_NODE_ALTER_TABLE_STMT:
|
||||||
return sizeof(SAlterTableStmt);
|
return makeNode(type, sizeof(SAlterTableStmt));
|
||||||
case QUERY_NODE_CREATE_USER_STMT:
|
case QUERY_NODE_CREATE_USER_STMT:
|
||||||
return sizeof(SCreateUserStmt);
|
return makeNode(type, sizeof(SCreateUserStmt));
|
||||||
case QUERY_NODE_ALTER_USER_STMT:
|
case QUERY_NODE_ALTER_USER_STMT:
|
||||||
return sizeof(SAlterUserStmt);
|
return makeNode(type, sizeof(SAlterUserStmt));
|
||||||
case QUERY_NODE_DROP_USER_STMT:
|
case QUERY_NODE_DROP_USER_STMT:
|
||||||
return sizeof(SDropUserStmt);
|
return makeNode(type, sizeof(SDropUserStmt));
|
||||||
case QUERY_NODE_USE_DATABASE_STMT:
|
case QUERY_NODE_USE_DATABASE_STMT:
|
||||||
return sizeof(SUseDatabaseStmt);
|
return makeNode(type, sizeof(SUseDatabaseStmt));
|
||||||
case QUERY_NODE_CREATE_DNODE_STMT:
|
case QUERY_NODE_CREATE_DNODE_STMT:
|
||||||
return sizeof(SCreateDnodeStmt);
|
return makeNode(type, sizeof(SCreateDnodeStmt));
|
||||||
case QUERY_NODE_DROP_DNODE_STMT:
|
case QUERY_NODE_DROP_DNODE_STMT:
|
||||||
return sizeof(SDropDnodeStmt);
|
return makeNode(type, sizeof(SDropDnodeStmt));
|
||||||
case QUERY_NODE_ALTER_DNODE_STMT:
|
case QUERY_NODE_ALTER_DNODE_STMT:
|
||||||
return sizeof(SAlterDnodeStmt);
|
return makeNode(type, sizeof(SAlterDnodeStmt));
|
||||||
case QUERY_NODE_CREATE_INDEX_STMT:
|
case QUERY_NODE_CREATE_INDEX_STMT:
|
||||||
return sizeof(SCreateIndexStmt);
|
return makeNode(type, sizeof(SCreateIndexStmt));
|
||||||
case QUERY_NODE_DROP_INDEX_STMT:
|
case QUERY_NODE_DROP_INDEX_STMT:
|
||||||
return sizeof(SDropIndexStmt);
|
return makeNode(type, sizeof(SDropIndexStmt));
|
||||||
case QUERY_NODE_CREATE_QNODE_STMT:
|
case QUERY_NODE_CREATE_QNODE_STMT:
|
||||||
case QUERY_NODE_CREATE_BNODE_STMT:
|
case QUERY_NODE_CREATE_BNODE_STMT:
|
||||||
case QUERY_NODE_CREATE_SNODE_STMT:
|
case QUERY_NODE_CREATE_SNODE_STMT:
|
||||||
case QUERY_NODE_CREATE_MNODE_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_QNODE_STMT:
|
||||||
case QUERY_NODE_DROP_BNODE_STMT:
|
case QUERY_NODE_DROP_BNODE_STMT:
|
||||||
case QUERY_NODE_DROP_SNODE_STMT:
|
case QUERY_NODE_DROP_SNODE_STMT:
|
||||||
case QUERY_NODE_DROP_MNODE_STMT:
|
case QUERY_NODE_DROP_MNODE_STMT:
|
||||||
return sizeof(SDropComponentNodeStmt);
|
return makeNode(type, sizeof(SDropComponentNodeStmt));
|
||||||
case QUERY_NODE_CREATE_TOPIC_STMT:
|
case QUERY_NODE_CREATE_TOPIC_STMT:
|
||||||
return sizeof(SCreateTopicStmt);
|
return makeNode(type, sizeof(SCreateTopicStmt));
|
||||||
case QUERY_NODE_DROP_TOPIC_STMT:
|
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:
|
case QUERY_NODE_EXPLAIN_STMT:
|
||||||
return sizeof(SExplainStmt);
|
return makeNode(type, sizeof(SExplainStmt));
|
||||||
case QUERY_NODE_DESCRIBE_STMT:
|
case QUERY_NODE_DESCRIBE_STMT:
|
||||||
return sizeof(SDescribeStmt);
|
return makeNode(type, sizeof(SDescribeStmt));
|
||||||
case QUERY_NODE_RESET_QUERY_CACHE_STMT:
|
case QUERY_NODE_RESET_QUERY_CACHE_STMT:
|
||||||
return sizeof(SNode);
|
return makeNode(type, sizeof(SNode));
|
||||||
case QUERY_NODE_COMPACT_STMT:
|
case QUERY_NODE_COMPACT_STMT:
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_CREATE_FUNCTION_STMT:
|
case QUERY_NODE_CREATE_FUNCTION_STMT:
|
||||||
return sizeof(SCreateFunctionStmt);
|
return makeNode(type, sizeof(SCreateFunctionStmt));
|
||||||
case QUERY_NODE_DROP_FUNCTION_STMT:
|
case QUERY_NODE_DROP_FUNCTION_STMT:
|
||||||
return sizeof(SDropFunctionStmt);
|
return makeNode(type, sizeof(SDropFunctionStmt));
|
||||||
case QUERY_NODE_CREATE_STREAM_STMT:
|
case QUERY_NODE_CREATE_STREAM_STMT:
|
||||||
return sizeof(SCreateStreamStmt);
|
return makeNode(type, sizeof(SCreateStreamStmt));
|
||||||
case QUERY_NODE_DROP_STREAM_STMT:
|
case QUERY_NODE_DROP_STREAM_STMT:
|
||||||
return sizeof(SDropStreamStmt);
|
return makeNode(type, sizeof(SDropStreamStmt));
|
||||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||||
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
||||||
case QUERY_NODE_SPLIT_VGROUP_STMT:
|
case QUERY_NODE_SPLIT_VGROUP_STMT:
|
||||||
case QUERY_NODE_SYNCDB_STMT:
|
case QUERY_NODE_SYNCDB_STMT:
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_GRANT_STMT:
|
case QUERY_NODE_GRANT_STMT:
|
||||||
return sizeof(SGrantStmt);
|
return makeNode(type, sizeof(SGrantStmt));
|
||||||
case QUERY_NODE_REVOKE_STMT:
|
case QUERY_NODE_REVOKE_STMT:
|
||||||
return sizeof(SRevokeStmt);
|
return makeNode(type, sizeof(SRevokeStmt));
|
||||||
case QUERY_NODE_SHOW_DNODES_STMT:
|
case QUERY_NODE_SHOW_DNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_MNODES_STMT:
|
case QUERY_NODE_SHOW_MNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_MODULES_STMT:
|
case QUERY_NODE_SHOW_MODULES_STMT:
|
||||||
|
@ -194,91 +205,82 @@ int32_t nodesNodeSize(ENodeType type) {
|
||||||
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
||||||
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
|
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
|
||||||
case QUERY_NODE_SHOW_TRANSACTIONS_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_CONNECTION_STMT:
|
||||||
case QUERY_NODE_KILL_QUERY_STMT:
|
case QUERY_NODE_KILL_QUERY_STMT:
|
||||||
case QUERY_NODE_KILL_TRANSACTION_STMT:
|
case QUERY_NODE_KILL_TRANSACTION_STMT:
|
||||||
return sizeof(SKillStmt);
|
return makeNode(type, sizeof(SKillStmt));
|
||||||
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
||||||
return sizeof(SScanLogicNode);
|
return makeNode(type, sizeof(SScanLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
||||||
return sizeof(SJoinLogicNode);
|
return makeNode(type, sizeof(SJoinLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_AGG:
|
case QUERY_NODE_LOGIC_PLAN_AGG:
|
||||||
return sizeof(SAggLogicNode);
|
return makeNode(type, sizeof(SAggLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_PROJECT:
|
case QUERY_NODE_LOGIC_PLAN_PROJECT:
|
||||||
return sizeof(SProjectLogicNode);
|
return makeNode(type, sizeof(SProjectLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF:
|
case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF:
|
||||||
return sizeof(SVnodeModifLogicNode);
|
return makeNode(type, sizeof(SVnodeModifLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
|
case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
|
||||||
return sizeof(SExchangeLogicNode);
|
return makeNode(type, sizeof(SExchangeLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_WINDOW:
|
case QUERY_NODE_LOGIC_PLAN_WINDOW:
|
||||||
return sizeof(SWindowLogicNode);
|
return makeNode(type, sizeof(SWindowLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_FILL:
|
case QUERY_NODE_LOGIC_PLAN_FILL:
|
||||||
return sizeof(SFillLogicNode);
|
return makeNode(type, sizeof(SFillLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_SORT:
|
case QUERY_NODE_LOGIC_PLAN_SORT:
|
||||||
return sizeof(SSortLogicNode);
|
return makeNode(type, sizeof(SSortLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_PARTITION:
|
case QUERY_NODE_LOGIC_PLAN_PARTITION:
|
||||||
return sizeof(SPartitionLogicNode);
|
return makeNode(type, sizeof(SPartitionLogicNode));
|
||||||
case QUERY_NODE_LOGIC_SUBPLAN:
|
case QUERY_NODE_LOGIC_SUBPLAN:
|
||||||
return sizeof(SLogicSubplan);
|
return makeNode(type, sizeof(SLogicSubplan));
|
||||||
case QUERY_NODE_LOGIC_PLAN:
|
case QUERY_NODE_LOGIC_PLAN:
|
||||||
return sizeof(SQueryLogicPlan);
|
return makeNode(type, sizeof(SQueryLogicPlan));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
|
||||||
return sizeof(STagScanPhysiNode);
|
return makeNode(type, sizeof(STagScanPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
||||||
return sizeof(STableScanPhysiNode);
|
return makeNode(type, sizeof(STableScanPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
|
||||||
return sizeof(STableSeqScanPhysiNode);
|
return makeNode(type, sizeof(STableSeqScanPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
||||||
return sizeof(SStreamScanPhysiNode);
|
return makeNode(type, sizeof(SStreamScanPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
|
||||||
return sizeof(SSystemTableScanPhysiNode);
|
return makeNode(type, sizeof(SSystemTableScanPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
||||||
return sizeof(SProjectPhysiNode);
|
return makeNode(type, sizeof(SProjectPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
||||||
return sizeof(SJoinPhysiNode);
|
return makeNode(type, sizeof(SJoinPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_AGG:
|
case QUERY_NODE_PHYSICAL_PLAN_AGG:
|
||||||
return sizeof(SAggPhysiNode);
|
return makeNode(type, sizeof(SAggPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE:
|
case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE:
|
||||||
return sizeof(SExchangePhysiNode);
|
return makeNode(type, sizeof(SExchangePhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_SORT:
|
case QUERY_NODE_PHYSICAL_PLAN_SORT:
|
||||||
return sizeof(SSortPhysiNode);
|
return makeNode(type, sizeof(SSortPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INTERVAL:
|
case QUERY_NODE_PHYSICAL_PLAN_INTERVAL:
|
||||||
return sizeof(SIntervalPhysiNode);
|
return makeNode(type, sizeof(SIntervalPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
|
||||||
return sizeof(SStreamIntervalPhysiNode);
|
return makeNode(type, sizeof(SStreamIntervalPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_FILL:
|
case QUERY_NODE_PHYSICAL_PLAN_FILL:
|
||||||
return sizeof(SFillPhysiNode);
|
return makeNode(type, sizeof(SFillPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW:
|
case QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW:
|
||||||
return sizeof(SSessionWinodwPhysiNode);
|
return makeNode(type, sizeof(SSessionWinodwPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION_WINDOW:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION_WINDOW:
|
||||||
return sizeof(SStreamSessionWinodwPhysiNode);
|
return makeNode(type, sizeof(SStreamSessionWinodwPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW:
|
case QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW:
|
||||||
return sizeof(SStateWinodwPhysiNode);
|
return makeNode(type, sizeof(SStateWinodwPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
return sizeof(SPartitionPhysiNode);
|
return makeNode(type, sizeof(SPartitionPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
return sizeof(SDataDispatcherNode);
|
return makeNode(type, sizeof(SDataDispatcherNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
||||||
return sizeof(SDataInserterNode);
|
return makeNode(type, sizeof(SDataInserterNode));
|
||||||
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
||||||
return sizeof(SSubplan);
|
return makeNode(type, sizeof(SSubplan));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN:
|
case QUERY_NODE_PHYSICAL_PLAN:
|
||||||
return sizeof(SQueryPlan);
|
return makeNode(type, sizeof(SQueryPlan));
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
nodesError("nodesMakeNode unknown node = %s", nodesNodeName(type));
|
nodesError("nodesMakeNode unknown node = %s", nodesNodeName(type));
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
SNodeptr nodesMakeNode(ENodeType type) {
|
|
||||||
SNode* p = taosMemoryCalloc(1, nodesNodeSize(type));
|
|
||||||
if (NULL == p) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
setNodeType(p, type);
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyVgDataBlockArray(SArray* pArray) {
|
static void destroyVgDataBlockArray(SArray* pArray) {
|
||||||
|
|
|
@ -53,7 +53,8 @@ typedef enum EDatabaseOptionType {
|
||||||
DB_OPTION_WAL,
|
DB_OPTION_WAL,
|
||||||
DB_OPTION_VGROUPS,
|
DB_OPTION_VGROUPS,
|
||||||
DB_OPTION_SINGLE_STABLE,
|
DB_OPTION_SINGLE_STABLE,
|
||||||
DB_OPTION_RETENTIONS
|
DB_OPTION_RETENTIONS,
|
||||||
|
DB_OPTION_SCHEMALESS
|
||||||
} EDatabaseOptionType;
|
} EDatabaseOptionType;
|
||||||
|
|
||||||
typedef enum ETableOptionType {
|
typedef enum ETableOptionType {
|
||||||
|
@ -169,6 +170,8 @@ SNode* createTopicOptions(SAstCreateContext* pCxt);
|
||||||
SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pTopicName, SNode* pQuery,
|
SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pTopicName, SNode* pQuery,
|
||||||
const SToken* pSubscribeDbName, SNode* pOptions);
|
const SToken* pSubscribeDbName, SNode* pOptions);
|
||||||
SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pTopicName);
|
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* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, const SToken* pValue);
|
||||||
SNode* createDefaultExplainOptions(SAstCreateContext* pCxt);
|
SNode* createDefaultExplainOptions(SAstCreateContext* pCxt);
|
||||||
SNode* setExplainVerbose(SAstCreateContext* pCxt, SNode* pOptions, const SToken* pVal);
|
SNode* setExplainVerbose(SAstCreateContext* pCxt, SNode* pOptions, const SToken* pVal);
|
||||||
|
|
|
@ -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) 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) 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) 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_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); }
|
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)
|
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); }
|
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 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) ::= . { A = createTopicOptions(pCxt); }
|
||||||
topic_options(A) ::= topic_options(B) WITH TABLE. { ((STopicOptions*)B)->withTable = true; A = B; }
|
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 { }
|
%destructor stream_name { }
|
||||||
stream_name(A) ::= NK_ID(B). { A = B; }
|
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 **********************************************************/
|
||||||
expression(A) ::= literal(B). { A = B; }
|
expression(A) ::= literal(B). { A = B; }
|
||||||
expression(A) ::= pseudo_column(B). { A = B; }
|
expression(A) ::= pseudo_column(B). { A = B; }
|
||||||
|
|
|
@ -29,12 +29,11 @@
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define CHECK_RAW_EXPR_NODE(node) \
|
#define CHECK_PARSER_STATUS(pCxt) \
|
||||||
do { \
|
do { \
|
||||||
if (NULL == (node) || QUERY_NODE_RAW_EXPR != nodeType(node)) { \
|
if (TSDB_CODE_SUCCESS != pCxt->errCode) { \
|
||||||
pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR; \
|
return NULL; \
|
||||||
return NULL; \
|
} \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
SToken nil_token = {.type = TK_NK_NIL, .n = 0, .z = NULL};
|
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) {
|
SNode* createRawExprNode(SAstCreateContext* pCxt, const SToken* pToken, SNode* pNode) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SRawExprNode* target = (SRawExprNode*)nodesMakeNode(QUERY_NODE_RAW_EXPR);
|
SRawExprNode* target = (SRawExprNode*)nodesMakeNode(QUERY_NODE_RAW_EXPR);
|
||||||
CHECK_OUT_OF_MEM(target);
|
CHECK_OUT_OF_MEM(target);
|
||||||
target->p = pToken->z;
|
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) {
|
SNode* createRawExprNodeExt(SAstCreateContext* pCxt, const SToken* pStart, const SToken* pEnd, SNode* pNode) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SRawExprNode* target = (SRawExprNode*)nodesMakeNode(QUERY_NODE_RAW_EXPR);
|
SRawExprNode* target = (SRawExprNode*)nodesMakeNode(QUERY_NODE_RAW_EXPR);
|
||||||
CHECK_OUT_OF_MEM(target);
|
CHECK_OUT_OF_MEM(target);
|
||||||
target->p = pStart->z;
|
target->p = pStart->z;
|
||||||
|
@ -224,7 +225,7 @@ SNode* createRawExprNodeExt(SAstCreateContext* pCxt, const SToken* pStart, const
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* releaseRawExprNode(SAstCreateContext* pCxt, SNode* pNode) {
|
SNode* releaseRawExprNode(SAstCreateContext* pCxt, SNode* pNode) {
|
||||||
CHECK_RAW_EXPR_NODE(pNode);
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SRawExprNode* pRawExpr = (SRawExprNode*)pNode;
|
SRawExprNode* pRawExpr = (SRawExprNode*)pNode;
|
||||||
SNode* pExpr = pRawExpr->pNode;
|
SNode* pExpr = pRawExpr->pNode;
|
||||||
if (nodesIsExprNode(pExpr)) {
|
if (nodesIsExprNode(pExpr)) {
|
||||||
|
@ -247,6 +248,7 @@ SToken getTokenFromRawExprNode(SAstCreateContext* pCxt, SNode* pNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) {
|
SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNodeList* list = nodesMakeList();
|
SNodeList* list = nodesMakeList();
|
||||||
CHECK_OUT_OF_MEM(list);
|
CHECK_OUT_OF_MEM(list);
|
||||||
pCxt->errCode = nodesListAppend(list, pNode);
|
pCxt->errCode = nodesListAppend(list, pNode);
|
||||||
|
@ -254,11 +256,13 @@ SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode) {
|
SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
pCxt->errCode = nodesListAppend(pList, pNode);
|
pCxt->errCode = nodesListAppend(pList, pNode);
|
||||||
return pList;
|
return pList;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pColumnName) {
|
SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pColumnName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkTableName(pCxt, pTableAlias) || !checkColumnName(pCxt, pColumnName)) {
|
if (!checkTableName(pCxt, pTableAlias) || !checkColumnName(pCxt, pColumnName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -272,6 +276,7 @@ SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pC
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral) {
|
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
CHECK_OUT_OF_MEM(val);
|
CHECK_OUT_OF_MEM(val);
|
||||||
val->literal = strndup(pLiteral->z, pLiteral->n);
|
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) {
|
SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
CHECK_OUT_OF_MEM(val);
|
CHECK_OUT_OF_MEM(val);
|
||||||
val->literal = strndup(pLiteral->z, pLiteral->n);
|
val->literal = strndup(pLiteral->z, pLiteral->n);
|
||||||
|
@ -304,6 +310,7 @@ SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral)
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) {
|
SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (NULL == pCxt->pQueryCxt->db) {
|
if (NULL == pCxt->pQueryCxt->db) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -321,6 +328,7 @@ SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createPlaceholderValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) {
|
SNode* createPlaceholderValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
CHECK_OUT_OF_MEM(val);
|
CHECK_OUT_OF_MEM(val);
|
||||||
val->literal = strndup(pLiteral->z, pLiteral->n);
|
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) {
|
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
||||||
CHECK_OUT_OF_MEM(cond);
|
CHECK_OUT_OF_MEM(cond);
|
||||||
cond->condType = type;
|
cond->condType = type;
|
||||||
|
@ -360,6 +369,7 @@ SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType typ
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pLeft, SNode* pRight) {
|
SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pLeft, SNode* pRight) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SOperatorNode* op = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR);
|
SOperatorNode* op = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR);
|
||||||
CHECK_OUT_OF_MEM(op);
|
CHECK_OUT_OF_MEM(op);
|
||||||
op->opType = type;
|
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) {
|
SNode* createBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* pRight) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
return createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND,
|
return createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND,
|
||||||
createOperatorNode(pCxt, OP_TYPE_GREATER_EQUAL, pExpr, pLeft),
|
createOperatorNode(pCxt, OP_TYPE_GREATER_EQUAL, pExpr, pLeft),
|
||||||
createOperatorNode(pCxt, OP_TYPE_LOWER_EQUAL, nodesCloneNode(pExpr), pRight));
|
createOperatorNode(pCxt, OP_TYPE_LOWER_EQUAL, nodesCloneNode(pExpr), pRight));
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createNotBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* 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),
|
return createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, createOperatorNode(pCxt, OP_TYPE_LOWER_THAN, pExpr, pLeft),
|
||||||
createOperatorNode(pCxt, OP_TYPE_GREATER_THAN, nodesCloneNode(pExpr), pRight));
|
createOperatorNode(pCxt, OP_TYPE_GREATER_THAN, nodesCloneNode(pExpr), pRight));
|
||||||
}
|
}
|
||||||
|
|
||||||
static SNode* createPrimaryKeyCol(SAstCreateContext* pCxt) {
|
static SNode* createPrimaryKeyCol(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SColumnNode* pCol = nodesMakeNode(QUERY_NODE_COLUMN);
|
SColumnNode* pCol = nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
CHECK_OUT_OF_MEM(pCol);
|
CHECK_OUT_OF_MEM(pCol);
|
||||||
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||||
|
@ -388,6 +401,7 @@ static SNode* createPrimaryKeyCol(SAstCreateContext* pCxt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNodeList* pParameterList) {
|
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)) {
|
if (0 == strncasecmp("_rowts", pFuncName->z, pFuncName->n) || 0 == strncasecmp("_c0", pFuncName->z, pFuncName->n)) {
|
||||||
return createPrimaryKeyCol(pCxt);
|
return createPrimaryKeyCol(pCxt);
|
||||||
}
|
}
|
||||||
|
@ -399,6 +413,7 @@ SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNod
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCastFunctionNode(SAstCreateContext* pCxt, SNode* pExpr, SDataType dt) {
|
SNode* createCastFunctionNode(SAstCreateContext* pCxt, SNode* pExpr, SDataType dt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SFunctionNode* func = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
SFunctionNode* func = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
||||||
CHECK_OUT_OF_MEM(func);
|
CHECK_OUT_OF_MEM(func);
|
||||||
strcpy(func->functionName, "cast");
|
strcpy(func->functionName, "cast");
|
||||||
|
@ -413,6 +428,7 @@ SNode* createCastFunctionNode(SAstCreateContext* pCxt, SNode* pExpr, SDataType d
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList) {
|
SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
CHECK_OUT_OF_MEM(list);
|
CHECK_OUT_OF_MEM(list);
|
||||||
list->pNodeList = pList;
|
list->pNodeList = pList;
|
||||||
|
@ -420,6 +436,7 @@ SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createNodeListNodeEx(SAstCreateContext* pCxt, SNode* p1, SNode* p2) {
|
SNode* createNodeListNodeEx(SAstCreateContext* pCxt, SNode* p1, SNode* p2) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
CHECK_OUT_OF_MEM(list);
|
CHECK_OUT_OF_MEM(list);
|
||||||
list->pNodeList = nodesMakeList();
|
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) {
|
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)) {
|
if (!checkDbName(pCxt, pDbName, true) || !checkTableName(pCxt, pTableName) || !checkTableName(pCxt, pTableAlias)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -450,6 +468,7 @@ SNode* createRealTableNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pTa
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, const SToken* pTableAlias) {
|
SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, const SToken* pTableAlias) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
STempTableNode* tempTable = (STempTableNode*)nodesMakeNode(QUERY_NODE_TEMP_TABLE);
|
STempTableNode* tempTable = (STempTableNode*)nodesMakeNode(QUERY_NODE_TEMP_TABLE);
|
||||||
CHECK_OUT_OF_MEM(tempTable);
|
CHECK_OUT_OF_MEM(tempTable);
|
||||||
tempTable->pSubquery = pSubquery;
|
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) {
|
SNode* createJoinTableNode(SAstCreateContext* pCxt, EJoinType type, SNode* pLeft, SNode* pRight, SNode* pJoinCond) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SJoinTableNode* joinTable = (SJoinTableNode*)nodesMakeNode(QUERY_NODE_JOIN_TABLE);
|
SJoinTableNode* joinTable = (SJoinTableNode*)nodesMakeNode(QUERY_NODE_JOIN_TABLE);
|
||||||
CHECK_OUT_OF_MEM(joinTable);
|
CHECK_OUT_OF_MEM(joinTable);
|
||||||
joinTable->joinType = type;
|
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) {
|
SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const SToken* pOffset) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SLimitNode* limitNode = (SLimitNode*)nodesMakeNode(QUERY_NODE_LIMIT);
|
SLimitNode* limitNode = (SLimitNode*)nodesMakeNode(QUERY_NODE_LIMIT);
|
||||||
CHECK_OUT_OF_MEM(limitNode);
|
CHECK_OUT_OF_MEM(limitNode);
|
||||||
limitNode->limit = taosStr2Int64(pLimit->z, NULL, 10);
|
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) {
|
SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SOrderByExprNode* orderByExpr = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR);
|
SOrderByExprNode* orderByExpr = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR);
|
||||||
CHECK_OUT_OF_MEM(orderByExpr);
|
CHECK_OUT_OF_MEM(orderByExpr);
|
||||||
orderByExpr->pExpr = pExpr;
|
orderByExpr->pExpr = pExpr;
|
||||||
|
@ -499,6 +521,7 @@ SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createSessionWindowNode(SAstCreateContext* pCxt, SNode* pCol, SNode* pGap) {
|
SNode* createSessionWindowNode(SAstCreateContext* pCxt, SNode* pCol, SNode* pGap) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SSessionWindowNode* session = (SSessionWindowNode*)nodesMakeNode(QUERY_NODE_SESSION_WINDOW);
|
SSessionWindowNode* session = (SSessionWindowNode*)nodesMakeNode(QUERY_NODE_SESSION_WINDOW);
|
||||||
CHECK_OUT_OF_MEM(session);
|
CHECK_OUT_OF_MEM(session);
|
||||||
session->pCol = (SColumnNode*)pCol;
|
session->pCol = (SColumnNode*)pCol;
|
||||||
|
@ -507,6 +530,7 @@ SNode* createSessionWindowNode(SAstCreateContext* pCxt, SNode* pCol, SNode* pGap
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) {
|
SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SStateWindowNode* state = (SStateWindowNode*)nodesMakeNode(QUERY_NODE_STATE_WINDOW);
|
SStateWindowNode* state = (SStateWindowNode*)nodesMakeNode(QUERY_NODE_STATE_WINDOW);
|
||||||
CHECK_OUT_OF_MEM(state);
|
CHECK_OUT_OF_MEM(state);
|
||||||
state->pCol = createPrimaryKeyCol(pCxt);
|
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* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode* pOffset, SNode* pSliding,
|
||||||
SNode* pFill) {
|
SNode* pFill) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SIntervalWindowNode* interval = (SIntervalWindowNode*)nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW);
|
SIntervalWindowNode* interval = (SIntervalWindowNode*)nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW);
|
||||||
CHECK_OUT_OF_MEM(interval);
|
CHECK_OUT_OF_MEM(interval);
|
||||||
interval->pCol = createPrimaryKeyCol(pCxt);
|
interval->pCol = createPrimaryKeyCol(pCxt);
|
||||||
|
@ -535,6 +560,7 @@ SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) {
|
SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SFillNode* fill = (SFillNode*)nodesMakeNode(QUERY_NODE_FILL);
|
SFillNode* fill = (SFillNode*)nodesMakeNode(QUERY_NODE_FILL);
|
||||||
CHECK_OUT_OF_MEM(fill);
|
CHECK_OUT_OF_MEM(fill);
|
||||||
fill->mode = mode;
|
fill->mode = mode;
|
||||||
|
@ -549,6 +575,7 @@ SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode) {
|
SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SGroupingSetNode* groupingSet = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET);
|
SGroupingSetNode* groupingSet = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET);
|
||||||
CHECK_OUT_OF_MEM(groupingSet);
|
CHECK_OUT_OF_MEM(groupingSet);
|
||||||
groupingSet->groupingSetType = GP_TYPE_NORMAL;
|
groupingSet->groupingSetType = GP_TYPE_NORMAL;
|
||||||
|
@ -558,9 +585,7 @@ SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias) {
|
SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias) {
|
||||||
if (NULL == pNode || TSDB_CODE_SUCCESS != pCxt->errCode) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
return pNode;
|
|
||||||
}
|
|
||||||
int32_t len = TMIN(sizeof(((SExprNode*)pNode)->aliasName) - 1, pAlias->n);
|
int32_t len = TMIN(sizeof(((SExprNode*)pNode)->aliasName) - 1, pAlias->n);
|
||||||
strncpy(((SExprNode*)pNode)->aliasName, pAlias->z, len);
|
strncpy(((SExprNode*)pNode)->aliasName, pAlias->z, len);
|
||||||
((SExprNode*)pNode)->aliasName[len] = '\0';
|
((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) {
|
SNode* addWhereClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pWhere) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pWhere = pWhere;
|
((SSelectStmt*)pStmt)->pWhere = pWhere;
|
||||||
}
|
}
|
||||||
|
@ -577,6 +603,7 @@ SNode* addWhereClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pWhere) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* addPartitionByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pPartitionByList) {
|
SNode* addPartitionByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pPartitionByList) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pPartitionByList = pPartitionByList;
|
((SSelectStmt*)pStmt)->pPartitionByList = pPartitionByList;
|
||||||
}
|
}
|
||||||
|
@ -584,6 +611,7 @@ SNode* addPartitionByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pP
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* addWindowClauseClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pWindow) {
|
SNode* addWindowClauseClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pWindow) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pWindow = pWindow;
|
((SSelectStmt*)pStmt)->pWindow = pWindow;
|
||||||
}
|
}
|
||||||
|
@ -591,6 +619,7 @@ SNode* addWindowClauseClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pWind
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* addGroupByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pGroupByList) {
|
SNode* addGroupByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pGroupByList) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pGroupByList = pGroupByList;
|
((SSelectStmt*)pStmt)->pGroupByList = pGroupByList;
|
||||||
}
|
}
|
||||||
|
@ -598,6 +627,7 @@ SNode* addGroupByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* addHavingClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pHaving) {
|
SNode* addHavingClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pHaving) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pHaving = pHaving;
|
((SSelectStmt*)pStmt)->pHaving = pHaving;
|
||||||
}
|
}
|
||||||
|
@ -605,6 +635,7 @@ SNode* addHavingClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pHaving) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* addOrderByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrderByList) {
|
SNode* addOrderByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrderByList) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pOrderByList = pOrderByList;
|
((SSelectStmt*)pStmt)->pOrderByList = pOrderByList;
|
||||||
}
|
}
|
||||||
|
@ -612,6 +643,7 @@ SNode* addOrderByClause(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrder
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* addSlimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pSlimit) {
|
SNode* addSlimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pSlimit) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pSlimit = (SLimitNode*)pSlimit;
|
((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) {
|
SNode* addLimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pLimit) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
((SSelectStmt*)pStmt)->pLimit = (SLimitNode*)pLimit;
|
((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) {
|
SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT);
|
SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT);
|
||||||
CHECK_OUT_OF_MEM(select);
|
CHECK_OUT_OF_MEM(select);
|
||||||
select->isDistinct = isDistinct;
|
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) {
|
SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SSetOperator* setOp = (SSetOperator*)nodesMakeNode(QUERY_NODE_SET_OPERATOR);
|
SSetOperator* setOp = (SSetOperator*)nodesMakeNode(QUERY_NODE_SET_OPERATOR);
|
||||||
CHECK_OUT_OF_MEM(setOp);
|
CHECK_OUT_OF_MEM(setOp);
|
||||||
setOp->opType = type;
|
setOp->opType = type;
|
||||||
|
@ -647,6 +682,7 @@ SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode*
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) {
|
SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDatabaseOptions* pOptions = nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS);
|
SDatabaseOptions* pOptions = nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE;
|
pOptions->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE;
|
||||||
|
@ -667,10 +703,12 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) {
|
||||||
pOptions->walLevel = TSDB_DEFAULT_WAL_LEVEL;
|
pOptions->walLevel = TSDB_DEFAULT_WAL_LEVEL;
|
||||||
pOptions->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
pOptions->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
||||||
pOptions->singleStable = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
pOptions->singleStable = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
||||||
|
pOptions->schemaless = TSDB_DEFAULT_DB_SCHEMALESS;
|
||||||
return (SNode*)pOptions;
|
return (SNode*)pOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) {
|
SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDatabaseOptions* pOptions = nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS);
|
SDatabaseOptions* pOptions = nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->buffer = -1;
|
pOptions->buffer = -1;
|
||||||
|
@ -691,10 +729,12 @@ SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) {
|
||||||
pOptions->walLevel = -1;
|
pOptions->walLevel = -1;
|
||||||
pOptions->numOfVgroups = -1;
|
pOptions->numOfVgroups = -1;
|
||||||
pOptions->singleStable = -1;
|
pOptions->singleStable = -1;
|
||||||
|
pOptions->schemaless = -1;
|
||||||
return (SNode*)pOptions;
|
return (SNode*)pOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, void* pVal) {
|
SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, void* pVal) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case DB_OPTION_BUFFER:
|
case DB_OPTION_BUFFER:
|
||||||
((SDatabaseOptions*)pOptions)->buffer = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
((SDatabaseOptions*)pOptions)->buffer = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
|
@ -754,6 +794,9 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti
|
||||||
case DB_OPTION_RETENTIONS:
|
case DB_OPTION_RETENTIONS:
|
||||||
((SDatabaseOptions*)pOptions)->pRetentions = pVal;
|
((SDatabaseOptions*)pOptions)->pRetentions = pVal;
|
||||||
break;
|
break;
|
||||||
|
case DB_OPTION_SCHEMALESS:
|
||||||
|
((SDatabaseOptions*)pOptions)->schemaless = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -761,6 +804,7 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* setAlterDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, SAlterOption* pAlterOption) {
|
SNode* setAlterDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, SAlterOption* pAlterOption) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
switch (pAlterOption->type) {
|
switch (pAlterOption->type) {
|
||||||
case DB_OPTION_KEEP:
|
case DB_OPTION_KEEP:
|
||||||
case DB_OPTION_RETENTIONS:
|
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) {
|
SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* pDbName, SNode* pOptions) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false)) {
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -784,6 +829,7 @@ SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, STok
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken* pDbName) {
|
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken* pDbName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false)) {
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -795,6 +841,7 @@ SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, STo
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* pOptions) {
|
SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* pOptions) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false)) {
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -806,6 +853,7 @@ SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode*
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDefaultTableOptions(SAstCreateContext* pCxt) {
|
SNode* createDefaultTableOptions(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
STableOptions* pOptions = nodesMakeNode(QUERY_NODE_TABLE_OPTIONS);
|
STableOptions* pOptions = nodesMakeNode(QUERY_NODE_TABLE_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->delay = TSDB_DEFAULT_ROLLUP_DELAY;
|
pOptions->delay = TSDB_DEFAULT_ROLLUP_DELAY;
|
||||||
|
@ -815,6 +863,7 @@ SNode* createDefaultTableOptions(SAstCreateContext* pCxt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createAlterTableOptions(SAstCreateContext* pCxt) {
|
SNode* createAlterTableOptions(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
STableOptions* pOptions = nodesMakeNode(QUERY_NODE_TABLE_OPTIONS);
|
STableOptions* pOptions = nodesMakeNode(QUERY_NODE_TABLE_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->delay = -1;
|
pOptions->delay = -1;
|
||||||
|
@ -824,6 +873,7 @@ SNode* createAlterTableOptions(SAstCreateContext* pCxt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType type, void* pVal) {
|
SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType type, void* pVal) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TABLE_OPTION_COMMENT:
|
case TABLE_OPTION_COMMENT:
|
||||||
if (checkComment(pCxt, (SToken*)pVal, true)) {
|
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) {
|
SNode* createColumnDefNode(SAstCreateContext* pCxt, SToken* pColName, SDataType dataType, const SToken* pComment) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkColumnName(pCxt, pColName) || !checkComment(pCxt, pComment, false)) {
|
if (!checkColumnName(pCxt, pColName) || !checkComment(pCxt, pComment, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -879,9 +930,7 @@ SDataType createVarLenDataType(uint8_t type, const SToken* pLen) {
|
||||||
|
|
||||||
SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, SNode* pRealTable, SNodeList* pCols,
|
SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, SNode* pRealTable, SNodeList* pCols,
|
||||||
SNodeList* pTags, SNode* pOptions) {
|
SNodeList* pTags, SNode* pOptions) {
|
||||||
if (NULL == pRealTable) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
SCreateTableStmt* pStmt = (SCreateTableStmt*)nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT);
|
SCreateTableStmt* pStmt = (SCreateTableStmt*)nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
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,
|
SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists, SNode* pRealTable, SNode* pUseRealTable,
|
||||||
SNodeList* pSpecificTags, SNodeList* pValsOfTags, SNode* pOptions) {
|
SNodeList* pSpecificTags, SNodeList* pValsOfTags, SNode* pOptions) {
|
||||||
if (NULL == pRealTable) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
SCreateSubTableClause* pStmt = nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_CLAUSE);
|
SCreateSubTableClause* pStmt = nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_CLAUSE);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
||||||
|
@ -914,6 +961,7 @@ SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists, SN
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables) {
|
SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SCreateMultiTableStmt* pStmt = nodesMakeNode(QUERY_NODE_CREATE_MULTI_TABLE_STMT);
|
SCreateMultiTableStmt* pStmt = nodesMakeNode(QUERY_NODE_CREATE_MULTI_TABLE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->pSubTables = pSubTables;
|
pStmt->pSubTables = pSubTables;
|
||||||
|
@ -921,9 +969,7 @@ SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) {
|
SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) {
|
||||||
if (NULL == pRealTable) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
SDropTableClause* pStmt = nodesMakeNode(QUERY_NODE_DROP_TABLE_CLAUSE);
|
SDropTableClause* pStmt = nodesMakeNode(QUERY_NODE_DROP_TABLE_CLAUSE);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
||||||
|
@ -934,6 +980,7 @@ SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNod
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables) {
|
SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDropTableStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_TABLE_STMT);
|
SDropTableStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_TABLE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->pTables = pTables;
|
pStmt->pTables = pTables;
|
||||||
|
@ -941,6 +988,7 @@ SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropSuperTableStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) {
|
SNode* createDropSuperTableStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDropSuperTableStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_SUPER_TABLE_STMT);
|
SDropSuperTableStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_SUPER_TABLE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
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) {
|
SNode* createAlterTableModifyOptions(SAstCreateContext* pCxt, SNode* pRealTable, SNode* pOptions) {
|
||||||
if (NULL == pRealTable) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT);
|
SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->alterType = TSDB_ALTER_TABLE_UPDATE_OPTIONS;
|
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,
|
SNode* createAlterTableAddModifyCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, SToken* pColName,
|
||||||
SDataType dataType) {
|
SDataType dataType) {
|
||||||
if (NULL == pRealTable || !checkColumnName(pCxt, pColName)) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
|
if (!checkColumnName(pCxt, pColName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT);
|
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) {
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT);
|
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,
|
SNode* createAlterTableRenameCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, SToken* pOldColName,
|
||||||
SToken* pNewColName) {
|
SToken* pNewColName) {
|
||||||
if (NULL == pRealTable || !checkColumnName(pCxt, pOldColName) || !checkColumnName(pCxt, pNewColName)) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
|
if (!checkColumnName(pCxt, pOldColName) || !checkColumnName(pCxt, pNewColName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT);
|
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) {
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT);
|
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) {
|
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false)) {
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1033,13 +1084,13 @@ static bool needDbShowStmt(ENodeType type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, SNode* pTbNamePattern) {
|
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, SNode* pTbNamePattern) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (needDbShowStmt(type) && NULL == pDbName && NULL == pCxt->pQueryCxt->db) {
|
if (needDbShowStmt(type) && NULL == pDbName && NULL == pCxt->pQueryCxt->db) {
|
||||||
snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "db not specified");
|
snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "db not specified");
|
||||||
pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
|
pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SShowStmt* pStmt = nodesMakeNode(type);
|
SShowStmt* pStmt = nodesMakeNode(type);
|
||||||
;
|
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->pDbName = pDbName;
|
pStmt->pDbName = pDbName;
|
||||||
pStmt->pTbNamePattern = pTbNamePattern;
|
pStmt->pTbNamePattern = pTbNamePattern;
|
||||||
|
@ -1047,18 +1098,21 @@ SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, S
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(QUERY_NODE_SHOW_CREATE_DATABASE_STMT);
|
SNode* pStmt = nodesMakeNode(QUERY_NODE_SHOW_CREATE_DATABASE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable) {
|
SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(type);
|
SNode* pStmt = nodesMakeNode(type);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword) {
|
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
||||||
if (!checkUserName(pCxt, pUserName) || !checkPassword(pCxt, pPassword, password)) {
|
if (!checkUserName(pCxt, pUserName) || !checkPassword(pCxt, pPassword, password)) {
|
||||||
return NULL;
|
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) {
|
SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t alterType, const SToken* pVal) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkUserName(pCxt, pUserName)) {
|
if (!checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1090,6 +1145,7 @@ SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t al
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName) {
|
SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkUserName(pCxt, pUserName)) {
|
if (!checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1100,6 +1156,7 @@ SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort) {
|
SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
int32_t port = 0;
|
int32_t port = 0;
|
||||||
char fqdn[TSDB_FQDN_LEN] = {0};
|
char fqdn[TSDB_FQDN_LEN] = {0};
|
||||||
if (NULL == pPort) {
|
if (NULL == pPort) {
|
||||||
|
@ -1121,6 +1178,7 @@ SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode) {
|
SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDropDnodeStmt* pStmt = (SDropDnodeStmt*)nodesMakeNode(QUERY_NODE_DROP_DNODE_STMT);
|
SDropDnodeStmt* pStmt = (SDropDnodeStmt*)nodesMakeNode(QUERY_NODE_DROP_DNODE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
if (TK_NK_INTEGER == pDnode->type) {
|
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,
|
SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const SToken* pConfig,
|
||||||
const SToken* pValue) {
|
const SToken* pValue) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SAlterDnodeStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_DNODE_STMT);
|
SAlterDnodeStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_DNODE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->dnodeId = taosStr2Int32(pDnode->z, NULL, 10);
|
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,
|
SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, bool ignoreExists, SToken* pIndexName,
|
||||||
SToken* pTableName, SNodeList* pCols, SNode* pOptions) {
|
SToken* pTableName, SNodeList* pCols, SNode* pOptions) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName) || !checkDbName(pCxt, NULL, true)) {
|
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName) || !checkDbName(pCxt, NULL, true)) {
|
||||||
return NULL;
|
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* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInterval, SNode* pOffset,
|
||||||
SNode* pSliding) {
|
SNode* pSliding) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SIndexOptions* pOptions = nodesMakeNode(QUERY_NODE_INDEX_OPTIONS);
|
SIndexOptions* pOptions = nodesMakeNode(QUERY_NODE_INDEX_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->pFuncs = pFuncs;
|
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) {
|
SNode* createDropIndexStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken* pIndexName, SToken* pTableName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName)) {
|
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1186,6 +1248,7 @@ SNode* createDropIndexStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDnodeId) {
|
SNode* createCreateComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDnodeId) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SCreateComponentNodeStmt* pStmt = nodesMakeNode(type);
|
SCreateComponentNodeStmt* pStmt = nodesMakeNode(type);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->dnodeId = taosStr2Int32(pDnodeId->z, NULL, 10);
|
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) {
|
SNode* createDropComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDnodeId) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDropComponentNodeStmt* pStmt = nodesMakeNode(type);
|
SDropComponentNodeStmt* pStmt = nodesMakeNode(type);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->dnodeId = taosStr2Int32(pDnodeId->z, NULL, 10);
|
pStmt->dnodeId = taosStr2Int32(pDnodeId->z, NULL, 10);
|
||||||
|
@ -1202,6 +1266,7 @@ SNode* createDropComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, cons
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createTopicOptions(SAstCreateContext* pCxt) {
|
SNode* createTopicOptions(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
STopicOptions* pOptions = nodesMakeNode(QUERY_NODE_TOPIC_OPTIONS);
|
STopicOptions* pOptions = nodesMakeNode(QUERY_NODE_TOPIC_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->withTable = false;
|
pOptions->withTable = false;
|
||||||
|
@ -1212,6 +1277,7 @@ SNode* createTopicOptions(SAstCreateContext* pCxt) {
|
||||||
|
|
||||||
SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pTopicName, SNode* pQuery,
|
SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pTopicName, SNode* pQuery,
|
||||||
const SToken* pSubscribeDbName, SNode* pOptions) {
|
const SToken* pSubscribeDbName, SNode* pOptions) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SCreateTopicStmt* pStmt = nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT);
|
SCreateTopicStmt* pStmt = nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strncpy(pStmt->topicName, pTopicName->z, pTopicName->n);
|
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) {
|
SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pTopicName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDropTopicStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_TOPIC_STMT);
|
SDropTopicStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_TOPIC_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strncpy(pStmt->topicName, pTopicName->z, pTopicName->n);
|
strncpy(pStmt->topicName, pTopicName->z, pTopicName->n);
|
||||||
|
@ -1232,7 +1299,19 @@ SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const
|
||||||
return (SNode*)pStmt;
|
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) {
|
SNode* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, const SToken* pValue) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SAlterLocalStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_LOCAL_STMT);
|
SAlterLocalStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_LOCAL_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
trimString(pConfig->z, pConfig->n, pStmt->config, sizeof(pStmt->config));
|
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) {
|
SNode* createDefaultExplainOptions(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SExplainOptions* pOptions = nodesMakeNode(QUERY_NODE_EXPLAIN_OPTIONS);
|
SExplainOptions* pOptions = nodesMakeNode(QUERY_NODE_EXPLAIN_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->verbose = TSDB_DEFAULT_EXPLAIN_VERBOSE;
|
pOptions->verbose = TSDB_DEFAULT_EXPLAIN_VERBOSE;
|
||||||
|
@ -1251,16 +1331,19 @@ SNode* createDefaultExplainOptions(SAstCreateContext* pCxt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* setExplainVerbose(SAstCreateContext* pCxt, SNode* pOptions, const SToken* pVal) {
|
SNode* setExplainVerbose(SAstCreateContext* pCxt, SNode* pOptions, const SToken* pVal) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
((SExplainOptions*)pOptions)->verbose = (0 == strncasecmp(pVal->z, "true", pVal->n));
|
((SExplainOptions*)pOptions)->verbose = (0 == strncasecmp(pVal->z, "true", pVal->n));
|
||||||
return pOptions;
|
return pOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* setExplainRatio(SAstCreateContext* pCxt, SNode* pOptions, const SToken* pVal) {
|
SNode* setExplainRatio(SAstCreateContext* pCxt, SNode* pOptions, const SToken* pVal) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
((SExplainOptions*)pOptions)->ratio = taosStr2Double(pVal->z, NULL);
|
((SExplainOptions*)pOptions)->ratio = taosStr2Double(pVal->z, NULL);
|
||||||
return pOptions;
|
return pOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createExplainStmt(SAstCreateContext* pCxt, bool analyze, SNode* pOptions, SNode* pQuery) {
|
SNode* createExplainStmt(SAstCreateContext* pCxt, bool analyze, SNode* pOptions, SNode* pQuery) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SExplainStmt* pStmt = nodesMakeNode(QUERY_NODE_EXPLAIN_STMT);
|
SExplainStmt* pStmt = nodesMakeNode(QUERY_NODE_EXPLAIN_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->analyze = analyze;
|
pStmt->analyze = analyze;
|
||||||
|
@ -1270,9 +1353,7 @@ SNode* createExplainStmt(SAstCreateContext* pCxt, bool analyze, SNode* pOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDescribeStmt(SAstCreateContext* pCxt, SNode* pRealTable) {
|
SNode* createDescribeStmt(SAstCreateContext* pCxt, SNode* pRealTable) {
|
||||||
if (NULL == pRealTable) {
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
SDescribeStmt* pStmt = nodesMakeNode(QUERY_NODE_DESCRIBE_STMT);
|
SDescribeStmt* pStmt = nodesMakeNode(QUERY_NODE_DESCRIBE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
||||||
|
@ -1282,12 +1363,14 @@ SNode* createDescribeStmt(SAstCreateContext* pCxt, SNode* pRealTable) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createResetQueryCacheStmt(SAstCreateContext* pCxt) {
|
SNode* createResetQueryCacheStmt(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(QUERY_NODE_RESET_QUERY_CACHE_STMT);
|
SNode* pStmt = nodesMakeNode(QUERY_NODE_RESET_QUERY_CACHE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCompactStmt(SAstCreateContext* pCxt, SNodeList* pVgroups) {
|
SNode* createCompactStmt(SAstCreateContext* pCxt, SNodeList* pVgroups) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(QUERY_NODE_COMPACT_STMT);
|
SNode* pStmt = nodesMakeNode(QUERY_NODE_COMPACT_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
|
@ -1295,6 +1378,7 @@ SNode* createCompactStmt(SAstCreateContext* pCxt, SNodeList* pVgroups) {
|
||||||
|
|
||||||
SNode* createCreateFunctionStmt(SAstCreateContext* pCxt, bool ignoreExists, bool aggFunc, const SToken* pFuncName,
|
SNode* createCreateFunctionStmt(SAstCreateContext* pCxt, bool ignoreExists, bool aggFunc, const SToken* pFuncName,
|
||||||
const SToken* pLibPath, SDataType dataType, int32_t bufSize) {
|
const SToken* pLibPath, SDataType dataType, int32_t bufSize) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (pLibPath->n <= 2) {
|
if (pLibPath->n <= 2) {
|
||||||
pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
|
pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1311,6 +1395,7 @@ SNode* createCreateFunctionStmt(SAstCreateContext* pCxt, bool ignoreExists, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropFunctionStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pFuncName) {
|
SNode* createDropFunctionStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pFuncName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDropFunctionStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_FUNCTION_STMT);
|
SDropFunctionStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_FUNCTION_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->ignoreNotExists = ignoreNotExists;
|
pStmt->ignoreNotExists = ignoreNotExists;
|
||||||
|
@ -1319,6 +1404,7 @@ SNode* createDropFunctionStmt(SAstCreateContext* pCxt, bool ignoreNotExists, con
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createStreamOptions(SAstCreateContext* pCxt) {
|
SNode* createStreamOptions(SAstCreateContext* pCxt) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SStreamOptions* pOptions = nodesMakeNode(QUERY_NODE_STREAM_OPTIONS);
|
SStreamOptions* pOptions = nodesMakeNode(QUERY_NODE_STREAM_OPTIONS);
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
pOptions->triggerType = STREAM_TRIGGER_AT_ONCE;
|
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* createCreateStreamStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pStreamName, SNode* pRealTable,
|
||||||
SNode* pOptions, SNode* pQuery) {
|
SNode* pOptions, SNode* pQuery) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SCreateStreamStmt* pStmt = nodesMakeNode(QUERY_NODE_CREATE_STREAM_STMT);
|
SCreateStreamStmt* pStmt = nodesMakeNode(QUERY_NODE_CREATE_STREAM_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strncpy(pStmt->streamName, pStreamName->z, pStreamName->n);
|
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) {
|
SNode* createDropStreamStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pStreamName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDropStreamStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_STREAM_STMT);
|
SDropStreamStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_STREAM_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strncpy(pStmt->streamName, pStreamName->z, pStreamName->n);
|
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) {
|
SNode* createKillStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pId) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SKillStmt* pStmt = nodesMakeNode(type);
|
SKillStmt* pStmt = nodesMakeNode(type);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->targetId = taosStr2Int32(pId->z, NULL, 10);
|
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) {
|
SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, const SToken* pVgId2) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(QUERY_NODE_MERGE_VGROUP_STMT);
|
SNode* pStmt = nodesMakeNode(QUERY_NODE_MERGE_VGROUP_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes) {
|
SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(QUERY_NODE_REDISTRIBUTE_VGROUP_STMT);
|
SNode* pStmt = nodesMakeNode(QUERY_NODE_REDISTRIBUTE_VGROUP_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId) {
|
SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(QUERY_NODE_SPLIT_VGROUP_STMT);
|
SNode* pStmt = nodesMakeNode(QUERY_NODE_SPLIT_VGROUP_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SNode* pStmt = nodesMakeNode(QUERY_NODE_SYNCDB_STMT);
|
SNode* pStmt = nodesMakeNode(QUERY_NODE_SYNCDB_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName) {
|
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false) || !checkUserName(pCxt, pUserName)) {
|
if (!checkDbName(pCxt, pDbName, false) || !checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
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) {
|
SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false) || !checkUserName(pCxt, pUserName)) {
|
if (!checkDbName(pCxt, pDbName, false) || !checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,11 +176,11 @@ static int32_t calcConstProject(SNode* pProject, SNode** pNew) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = scalarCalculateConstants(pProject, 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);
|
int32_t size = taosArrayGetSize(pAssociation);
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
SNode** pCol = taosArrayGet(pAssociation, i);
|
SNode** pCol = taosArrayGetP(pAssociation, i);
|
||||||
*pCol = nodesCloneNode(pNew);
|
*pCol = nodesCloneNode(*pNew);
|
||||||
if (NULL == *pCol) {
|
if (NULL == *pCol) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
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) {
|
static int32_t calcConstSelect(SCalcConstContext* pCxt, SSelectStmt* pSelect, bool subquery) {
|
||||||
int32_t code = calcConstProjections(pCxt, pSelect, subquery);
|
int32_t code = calcConstFromTable(pCxt, pSelect);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = calcConstFromTable(pCxt, pSelect);
|
code = calcConstProjections(pCxt, pSelect, subquery);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = calcConstSelectCondition(pCxt, pSelect, &pSelect->pWhere);
|
code = calcConstSelectCondition(pCxt, pSelect, &pSelect->pWhere);
|
||||||
|
|
|
@ -53,6 +53,7 @@ static SKeyword keywordTable[] = {
|
||||||
{"CACHE", TK_CACHE},
|
{"CACHE", TK_CACHE},
|
||||||
{"CACHELAST", TK_CACHELAST},
|
{"CACHELAST", TK_CACHELAST},
|
||||||
{"CAST", TK_CAST},
|
{"CAST", TK_CAST},
|
||||||
|
{"CGROUP", TK_CGROUP},
|
||||||
{"CLUSTER", TK_CLUSTER},
|
{"CLUSTER", TK_CLUSTER},
|
||||||
{"COLUMN", TK_COLUMN},
|
{"COLUMN", TK_COLUMN},
|
||||||
{"COMMENT", TK_COMMENT},
|
{"COMMENT", TK_COMMENT},
|
||||||
|
@ -156,6 +157,7 @@ static SKeyword keywordTable[] = {
|
||||||
{"REVOKE", TK_REVOKE},
|
{"REVOKE", TK_REVOKE},
|
||||||
{"ROLLUP", TK_ROLLUP},
|
{"ROLLUP", TK_ROLLUP},
|
||||||
{"SCHEMA", TK_SCHEMA},
|
{"SCHEMA", TK_SCHEMA},
|
||||||
|
{"SCHEMALESS", TK_SCHEMALESS},
|
||||||
{"SCORES", TK_SCORES},
|
{"SCORES", TK_SCORES},
|
||||||
{"SELECT", TK_SELECT},
|
{"SELECT", TK_SELECT},
|
||||||
{"SESSION", TK_SESSION},
|
{"SESSION", TK_SESSION},
|
||||||
|
@ -605,12 +607,12 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) {
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
case '[': {
|
// case '[': {
|
||||||
for (i = 1; z[i] && z[i - 1] != ']'; i++) {
|
// for (i = 1; z[i] && z[i - 1] != ']'; i++) {
|
||||||
}
|
// }
|
||||||
*tokenId = TK_NK_ID;
|
// *tokenId = TK_NK_ID;
|
||||||
return i;
|
// return i;
|
||||||
}
|
// }
|
||||||
case 'T':
|
case 'T':
|
||||||
case 't':
|
case 't':
|
||||||
case 'F':
|
case 'F':
|
||||||
|
|
|
@ -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;
|
pCol->pProjectRef = (SNode*)pExpr;
|
||||||
if (NULL == pExpr->pAssociation) {
|
if (NULL == pExpr->pAssociation) {
|
||||||
pExpr->pAssociation = taosArrayInit(TARRAY_MIN_SIZE, POINTER_BYTES);
|
pExpr->pAssociation = taosArrayInit(TARRAY_MIN_SIZE, POINTER_BYTES);
|
||||||
}
|
}
|
||||||
taosArrayPush(pExpr->pAssociation, &pCol);
|
taosArrayPush(pExpr->pAssociation, &pColRef);
|
||||||
if (NULL != pTable) {
|
if (NULL != pTable) {
|
||||||
strcpy(pCol->tableAlias, pTable->tableAlias);
|
strcpy(pCol->tableAlias, pTable->tableAlias);
|
||||||
} else if (QUERY_NODE_COLUMN == nodeType(pExpr)) {
|
} else if (QUERY_NODE_COLUMN == nodeType(pExpr)) {
|
||||||
|
@ -385,7 +387,7 @@ static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* p
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
setColumnInfoByExpr(pTable, (SExprNode*)pNode, pCol);
|
setColumnInfoByExpr(pTable, (SExprNode*)pNode, &pCol);
|
||||||
nodesListAppend(pList, (SNode*)pCol);
|
nodesListAppend(pList, (SNode*)pCol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -425,8 +427,9 @@ static bool isPrimaryKey(STempTableNode* pTable, SNode* pExpr) {
|
||||||
return isPrimaryKeyImpl(pTable, pExpr);
|
return isPrimaryKeyImpl(pTable, pExpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool findAndSetColumn(SColumnNode* pCol, const STableNode* pTable) {
|
static bool findAndSetColumn(SColumnNode** pColRef, const STableNode* pTable) {
|
||||||
bool found = false;
|
SColumnNode* pCol = *pColRef;
|
||||||
|
bool found = false;
|
||||||
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
||||||
const STableMeta* pMeta = ((SRealTableNode*)pTable)->pMeta;
|
const STableMeta* pMeta = ((SRealTableNode*)pTable)->pMeta;
|
||||||
if (isInternalPrimaryKey(pCol)) {
|
if (isInternalPrimaryKey(pCol)) {
|
||||||
|
@ -448,7 +451,7 @@ static bool findAndSetColumn(SColumnNode* pCol, const STableNode* pTable) {
|
||||||
SExprNode* pExpr = (SExprNode*)pNode;
|
SExprNode* pExpr = (SExprNode*)pNode;
|
||||||
if (0 == strcmp(pCol->colName, pExpr->aliasName) ||
|
if (0 == strcmp(pCol->colName, pExpr->aliasName) ||
|
||||||
(isPrimaryKey((STempTableNode*)pTable, pNode) && isInternalPrimaryKey(pCol))) {
|
(isPrimaryKey((STempTableNode*)pTable, pNode) && isInternalPrimaryKey(pCol))) {
|
||||||
setColumnInfoByExpr(pTable, pExpr, pCol);
|
setColumnInfoByExpr(pTable, pExpr, pColRef);
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -457,36 +460,36 @@ static bool findAndSetColumn(SColumnNode* pCol, const STableNode* pTable) {
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes translateColumnWithPrefix(STranslateContext* pCxt, SColumnNode* pCol) {
|
static EDealRes translateColumnWithPrefix(STranslateContext* pCxt, SColumnNode** pCol) {
|
||||||
SArray* pTables = taosArrayGetP(pCxt->pNsLevel, pCxt->currLevel);
|
SArray* pTables = taosArrayGetP(pCxt->pNsLevel, pCxt->currLevel);
|
||||||
size_t nums = taosArrayGetSize(pTables);
|
size_t nums = taosArrayGetSize(pTables);
|
||||||
bool foundTable = false;
|
bool foundTable = false;
|
||||||
for (size_t i = 0; i < nums; ++i) {
|
for (size_t i = 0; i < nums; ++i) {
|
||||||
STableNode* pTable = taosArrayGetP(pTables, i);
|
STableNode* pTable = taosArrayGetP(pTables, i);
|
||||||
if (belongTable(pCxt->pParseCxt->db, pCol, pTable)) {
|
if (belongTable(pCxt->pParseCxt->db, (*pCol), pTable)) {
|
||||||
foundTable = true;
|
foundTable = true;
|
||||||
if (findAndSetColumn(pCol, pTable)) {
|
if (findAndSetColumn(pCol, pTable)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, pCol->colName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, (*pCol)->colName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!foundTable) {
|
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;
|
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);
|
SArray* pTables = taosArrayGetP(pCxt->pNsLevel, pCxt->currLevel);
|
||||||
size_t nums = taosArrayGetSize(pTables);
|
size_t nums = taosArrayGetSize(pTables);
|
||||||
bool found = false;
|
bool found = false;
|
||||||
bool isInternalPk = isInternalPrimaryKey(pCol);
|
bool isInternalPk = isInternalPrimaryKey(*pCol);
|
||||||
for (size_t i = 0; i < nums; ++i) {
|
for (size_t i = 0; i < nums; ++i) {
|
||||||
STableNode* pTable = taosArrayGetP(pTables, i);
|
STableNode* pTable = taosArrayGetP(pTables, i);
|
||||||
if (findAndSetColumn(pCol, pTable)) {
|
if (findAndSetColumn(pCol, pTable)) {
|
||||||
if (found) {
|
if (found) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_AMBIGUOUS_COLUMN, pCol->colName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_AMBIGUOUS_COLUMN, (*pCol)->colName);
|
||||||
}
|
}
|
||||||
found = true;
|
found = true;
|
||||||
if (isInternalPk) {
|
if (isInternalPk) {
|
||||||
|
@ -501,18 +504,18 @@ static EDealRes translateColumnWithoutPrefix(STranslateContext* pCxt, SColumnNod
|
||||||
}
|
}
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_INTERNAL_PK);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_INTERNAL_PK);
|
||||||
} else {
|
} 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;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool translateColumnUseAlias(STranslateContext* pCxt, SColumnNode* pCol) {
|
static bool translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** pCol) {
|
||||||
SNodeList* pProjectionList = pCxt->pCurrStmt->pProjectionList;
|
SNodeList* pProjectionList = pCxt->pCurrStmt->pProjectionList;
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
FOREACH(pNode, pProjectionList) {
|
FOREACH(pNode, pProjectionList) {
|
||||||
SExprNode* pExpr = (SExprNode*)pNode;
|
SExprNode* pExpr = (SExprNode*)pNode;
|
||||||
if (0 == strcmp(pCol->colName, pExpr->aliasName)) {
|
if (0 == strcmp((*pCol)->colName, pExpr->aliasName)) {
|
||||||
setColumnInfoByExpr(NULL, pExpr, pCol);
|
setColumnInfoByExpr(NULL, pExpr, pCol);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -520,14 +523,14 @@ static bool translateColumnUseAlias(STranslateContext* pCxt, SColumnNode* pCol)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode* pCol) {
|
static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
|
||||||
// count(*)/first(*)/last(*) and so on
|
// count(*)/first(*)/last(*) and so on
|
||||||
if (0 == strcmp(pCol->colName, "*")) {
|
if (0 == strcmp((*pCol)->colName, "*")) {
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EDealRes res = DEAL_RES_CONTINUE;
|
EDealRes res = DEAL_RES_CONTINUE;
|
||||||
if ('\0' != pCol->tableAlias[0]) {
|
if ('\0' != (*pCol)->tableAlias[0]) {
|
||||||
res = translateColumnWithPrefix(pCxt, pCol);
|
res = translateColumnWithPrefix(pCxt, pCol);
|
||||||
} else {
|
} else {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
@ -870,6 +873,55 @@ static int32_t getFuncInfo(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
return fmGetFuncInfo(¶m, pFunc);
|
return fmGetFuncInfo(¶m, 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) {
|
static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
SNode* pParam = NULL;
|
SNode* pParam = NULL;
|
||||||
FOREACH(pParam, pFunc->pParameterList) {
|
FOREACH(pParam, pFunc->pParameterList) {
|
||||||
|
@ -880,48 +932,16 @@ static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode* pFunc)
|
||||||
|
|
||||||
pCxt->errCode = getFuncInfo(pCxt, pFunc);
|
pCxt->errCode = getFuncInfo(pCxt, pFunc);
|
||||||
if (TSDB_CODE_SUCCESS == pCxt->errCode && fmIsAggFunc(pFunc->funcId)) {
|
if (TSDB_CODE_SUCCESS == pCxt->errCode && fmIsAggFunc(pFunc->funcId)) {
|
||||||
if (beforeHaving(pCxt->currClause)) {
|
pCxt->errCode = translateAggFunc(pCxt, pFunc);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == pCxt->errCode && fmIsScanPseudoColumnFunc(pFunc->funcId)) {
|
if (TSDB_CODE_SUCCESS == pCxt->errCode && fmIsScanPseudoColumnFunc(pFunc->funcId)) {
|
||||||
if (0 == LIST_LENGTH(pFunc->pParameterList)) {
|
pCxt->errCode = translateScanPseudoColumnFunc(pCxt, pFunc);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == pCxt->errCode && fmIsIndefiniteRowsFunc(pFunc->funcId)) {
|
if (TSDB_CODE_SUCCESS == pCxt->errCode && fmIsIndefiniteRowsFunc(pFunc->funcId)) {
|
||||||
if (SQL_CLAUSE_SELECT != pCxt->currClause || pCxt->pCurrStmt->hasIndefiniteRowsFunc ||
|
pCxt->errCode = translateIndefiniteRowsFunc(pCxt, pFunc);
|
||||||
pCxt->pCurrStmt->hasAggFuncs) {
|
}
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_NOT_ALLOWED_FUNC);
|
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
||||||
}
|
setFuncClassification(pCxt->pCurrStmt, pFunc);
|
||||||
if (hasInvalidFuncNesting(pFunc->pParameterList)) {
|
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_AGG_FUNC_NESTING);
|
|
||||||
}
|
|
||||||
pCxt->pCurrStmt->hasIndefiniteRowsFunc = true;
|
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
|
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;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes doTranslateExpr(SNode* pNode, void* pContext) {
|
static EDealRes doTranslateExpr(SNode** pNode, void* pContext) {
|
||||||
STranslateContext* pCxt = (STranslateContext*)pContext;
|
STranslateContext* pCxt = (STranslateContext*)pContext;
|
||||||
switch (nodeType(pNode)) {
|
switch (nodeType(*pNode)) {
|
||||||
case QUERY_NODE_COLUMN:
|
case QUERY_NODE_COLUMN:
|
||||||
return translateColumn(pCxt, (SColumnNode*)pNode);
|
return translateColumn(pCxt, (SColumnNode**)pNode);
|
||||||
case QUERY_NODE_VALUE:
|
case QUERY_NODE_VALUE:
|
||||||
return translateValue(pCxt, (SValueNode*)pNode);
|
return translateValue(pCxt, (SValueNode*)*pNode);
|
||||||
case QUERY_NODE_OPERATOR:
|
case QUERY_NODE_OPERATOR:
|
||||||
return translateOperator(pCxt, (SOperatorNode*)pNode);
|
return translateOperator(pCxt, (SOperatorNode*)*pNode);
|
||||||
case QUERY_NODE_FUNCTION:
|
case QUERY_NODE_FUNCTION:
|
||||||
return translateFunction(pCxt, (SFunctionNode*)pNode);
|
return translateFunction(pCxt, (SFunctionNode*)*pNode);
|
||||||
case QUERY_NODE_LOGIC_CONDITION:
|
case QUERY_NODE_LOGIC_CONDITION:
|
||||||
return translateLogicCond(pCxt, (SLogicConditionNode*)pNode);
|
return translateLogicCond(pCxt, (SLogicConditionNode*)*pNode);
|
||||||
case QUERY_NODE_TEMP_TABLE:
|
case QUERY_NODE_TEMP_TABLE:
|
||||||
return translateExprSubquery(pCxt, ((STempTableNode*)pNode)->pSubquery);
|
return translateExprSubquery(pCxt, ((STempTableNode*)*pNode)->pSubquery);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateExpr(STranslateContext* pCxt, SNode* pNode) {
|
static int32_t translateExpr(STranslateContext* pCxt, SNode** pNode) {
|
||||||
nodesWalkExprPostOrder(pNode, doTranslateExpr, pCxt);
|
nodesRewriteExprPostOrder(pNode, doTranslateExpr, pCxt);
|
||||||
return pCxt->errCode;
|
return pCxt->errCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateExprList(STranslateContext* pCxt, SNodeList* pList) {
|
static int32_t translateExprList(STranslateContext* pCxt, SNodeList* pList) {
|
||||||
nodesWalkExprsPostOrder(pList, doTranslateExpr, pCxt);
|
nodesRewriteExprsPostOrder(pList, doTranslateExpr, pCxt);
|
||||||
return pCxt->errCode;
|
return pCxt->errCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1238,12 +1258,31 @@ static uint8_t getStmtPrecision(SNode* pStmt) {
|
||||||
return 0;
|
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) {
|
static uint8_t getJoinTablePrecision(SJoinTableNode* pJoinTable) {
|
||||||
uint8_t lp = ((STableNode*)pJoinTable->pLeft)->precision;
|
uint8_t lp = ((STableNode*)pJoinTable->pLeft)->precision;
|
||||||
uint8_t rp = ((STableNode*)pJoinTable->pRight)->precision;
|
uint8_t rp = ((STableNode*)pJoinTable->pRight)->precision;
|
||||||
return (lp > rp ? rp : lp);
|
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) {
|
static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
switch (nodeType(pTable)) {
|
switch (nodeType(pTable)) {
|
||||||
|
@ -1262,6 +1301,7 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
|
||||||
code = setTableVgroupList(pCxt, &name, pRealTable);
|
code = setTableVgroupList(pCxt, &name, pRealTable);
|
||||||
}
|
}
|
||||||
pRealTable->table.precision = pRealTable->pMeta->tableInfo.precision;
|
pRealTable->table.precision = pRealTable->pMeta->tableInfo.precision;
|
||||||
|
pRealTable->table.singleTable = isSingleTable(pRealTable);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = addNamespace(pCxt, pRealTable);
|
code = addNamespace(pCxt, pRealTable);
|
||||||
}
|
}
|
||||||
|
@ -1272,6 +1312,7 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
|
||||||
code = translateSubquery(pCxt, pTempTable->pSubquery);
|
code = translateSubquery(pCxt, pTempTable->pSubquery);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pTempTable->table.precision = getStmtPrecision(pTempTable->pSubquery);
|
pTempTable->table.precision = getStmtPrecision(pTempTable->pSubquery);
|
||||||
|
pTempTable->table.singleTable = stmtIsSingleTable(pTempTable->pSubquery);
|
||||||
code = addNamespace(pCxt, pTempTable);
|
code = addNamespace(pCxt, pTempTable);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1284,7 +1325,8 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pJoinTable->table.precision = getJoinTablePrecision(pJoinTable);
|
pJoinTable->table.precision = getJoinTablePrecision(pJoinTable);
|
||||||
code = translateExpr(pCxt, pJoinTable->pOnCond);
|
pJoinTable->table.singleTable = joinTableIsSingleTable(pJoinTable);
|
||||||
|
code = translateExpr(pCxt, &pJoinTable->pOnCond);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1517,7 +1559,7 @@ static int32_t translateOrderByPosition(STranslateContext* pCxt, SNodeList* pPro
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
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;
|
((SOrderByExprNode*)pNode)->pExpr = (SNode*)pCol;
|
||||||
nodesDestroyNode(pExpr);
|
nodesDestroyNode(pExpr);
|
||||||
}
|
}
|
||||||
|
@ -1563,7 +1605,7 @@ static int32_t translateHaving(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION);
|
||||||
}
|
}
|
||||||
pCxt->currClause = SQL_CLAUSE_HAVING;
|
pCxt->currClause = SQL_CLAUSE_HAVING;
|
||||||
int32_t code = translateExpr(pCxt, pSelect->pHaving);
|
int32_t code = translateExpr(pCxt, &pSelect->pHaving);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = checkExprForGroupBy(pCxt, &pSelect->pHaving);
|
code = checkExprForGroupBy(pCxt, &pSelect->pHaving);
|
||||||
}
|
}
|
||||||
|
@ -1811,7 +1853,7 @@ static int32_t translateWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
pCxt->currClause = SQL_CLAUSE_WINDOW;
|
pCxt->currClause = SQL_CLAUSE_WINDOW;
|
||||||
int32_t code = translateExpr(pCxt, pSelect->pWindow);
|
int32_t code = translateExpr(pCxt, &pSelect->pWindow);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = checkWindow(pCxt, pSelect);
|
code = checkWindow(pCxt, pSelect);
|
||||||
}
|
}
|
||||||
|
@ -1825,7 +1867,7 @@ static int32_t translatePartitionBy(STranslateContext* pCxt, SNodeList* pPartiti
|
||||||
|
|
||||||
static int32_t translateWhere(STranslateContext* pCxt, SNode* pWhere) {
|
static int32_t translateWhere(STranslateContext* pCxt, SNode* pWhere) {
|
||||||
pCxt->currClause = SQL_CLAUSE_WHERE;
|
pCxt->currClause = SQL_CLAUSE_WHERE;
|
||||||
return translateExpr(pCxt, pWhere);
|
return translateExpr(pCxt, &pWhere);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateFrom(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
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;
|
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||||
strcpy(pCol->colName, PK_TS_COL_INTERNAL_NAME);
|
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);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TIMELINE_FUNC);
|
||||||
}
|
}
|
||||||
*pPrimaryKey = (SNode*)pCol;
|
*pPrimaryKey = (SNode*)pCol;
|
||||||
|
@ -2075,6 +2117,7 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS
|
||||||
pReq->replications = pStmt->pOptions->replica;
|
pReq->replications = pStmt->pOptions->replica;
|
||||||
pReq->strict = pStmt->pOptions->strict;
|
pReq->strict = pStmt->pOptions->strict;
|
||||||
pReq->cacheLastRow = pStmt->pOptions->cachelast;
|
pReq->cacheLastRow = pStmt->pOptions->cachelast;
|
||||||
|
pReq->schemaless = pStmt->pOptions->schemaless;
|
||||||
pReq->ignoreExist = pStmt->ignoreExists;
|
pReq->ignoreExist = pStmt->ignoreExists;
|
||||||
return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq);
|
return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq);
|
||||||
}
|
}
|
||||||
|
@ -2274,6 +2317,9 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = checkDbRetentionsOption(pCxt, pOptions->pRetentions);
|
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) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = checkOptionsDependency(pCxt, pDbName, pOptions);
|
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);
|
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) {
|
static int32_t translateAlterLocal(STranslateContext* pCxt, SAlterLocalStmt* pStmt) {
|
||||||
// todo
|
// todo
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -3326,6 +3384,8 @@ static int32_t buildCreateStreamReq(STranslateContext* pCxt, SCreateStreamStmt*
|
||||||
pReq->igExists = pStmt->ignoreExists;
|
pReq->igExists = pStmt->ignoreExists;
|
||||||
|
|
||||||
SName name;
|
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);
|
tNameExtractFullName(toName(pCxt->pParseCxt->acctId, pCxt->pParseCxt->db, pStmt->streamName, &name), pReq->name);
|
||||||
|
|
||||||
if ('\0' != pStmt->targetTabName[0]) {
|
if ('\0' != pStmt->targetTabName[0]) {
|
||||||
|
@ -3550,6 +3610,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
||||||
case QUERY_NODE_DROP_TOPIC_STMT:
|
case QUERY_NODE_DROP_TOPIC_STMT:
|
||||||
code = translateDropTopic(pCxt, (SDropTopicStmt*)pNode);
|
code = translateDropTopic(pCxt, (SDropTopicStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_DROP_CGROUP_STMT:
|
||||||
|
code = translateDropCGroup(pCxt, (SDropCGroupStmt*)pNode);
|
||||||
|
break;
|
||||||
case QUERY_NODE_ALTER_LOCAL_STMT:
|
case QUERY_NODE_ALTER_LOCAL_STMT:
|
||||||
code = translateAlterLocal(pCxt, (SAlterLocalStmt*)pNode);
|
code = translateAlterLocal(pCxt, (SAlterLocalStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -90,6 +90,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
expect.walLevel = TSDB_DEFAULT_WAL_LEVEL;
|
expect.walLevel = TSDB_DEFAULT_WAL_LEVEL;
|
||||||
expect.numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
expect.numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
||||||
expect.numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
expect.numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
||||||
|
expect.schemaless = TSDB_DEFAULT_DB_SCHEMALESS;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; };
|
auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; };
|
||||||
|
@ -124,6 +125,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
taosArrayPush(expect.pRetensions, &retention);
|
taosArrayPush(expect.pRetensions, &retention);
|
||||||
++expect.numOfRetensions;
|
++expect.numOfRetensions;
|
||||||
};
|
};
|
||||||
|
auto setDbSchemalessFunc = [&](int8_t schemaless) { expect.schemaless = schemaless; };
|
||||||
|
|
||||||
setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
|
setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
|
||||||
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_CREATE_DATABASE_STMT);
|
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.replications, expect.replications);
|
||||||
ASSERT_EQ(req.strict, expect.strict);
|
ASSERT_EQ(req.strict, expect.strict);
|
||||||
ASSERT_EQ(req.cacheLastRow, expect.cacheLastRow);
|
ASSERT_EQ(req.cacheLastRow, expect.cacheLastRow);
|
||||||
|
ASSERT_EQ(req.schemaless, expect.schemaless);
|
||||||
ASSERT_EQ(req.ignoreExist, expect.ignoreExist);
|
ASSERT_EQ(req.ignoreExist, expect.ignoreExist);
|
||||||
ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions);
|
ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions);
|
||||||
if (expect.numOfRetensions > 0) {
|
if (expect.numOfRetensions > 0) {
|
||||||
|
@ -188,6 +191,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
setDbWalLevelFunc(2);
|
setDbWalLevelFunc(2);
|
||||||
setDbVgroupsFunc(100);
|
setDbVgroupsFunc(100);
|
||||||
setDbSingleStableFunc(1);
|
setDbSingleStableFunc(1);
|
||||||
|
setDbSchemalessFunc(1);
|
||||||
run("CREATE DATABASE IF NOT EXISTS wxy_db "
|
run("CREATE DATABASE IF NOT EXISTS wxy_db "
|
||||||
"BUFFER 64 "
|
"BUFFER 64 "
|
||||||
"CACHELAST 2 "
|
"CACHELAST 2 "
|
||||||
|
@ -205,7 +209,8 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
"STRICT 1 "
|
"STRICT 1 "
|
||||||
"WAL 2 "
|
"WAL 2 "
|
||||||
"VGROUPS 100 "
|
"VGROUPS 100 "
|
||||||
"SINGLE_STABLE 1 ");
|
"SINGLE_STABLE 1 "
|
||||||
|
"SCHEMALESS 1");
|
||||||
|
|
||||||
setCreateDbReqFunc("wxy_db", 1);
|
setCreateDbReqFunc("wxy_db", 1);
|
||||||
setDbDaysFunc(100);
|
setDbDaysFunc(100);
|
||||||
|
|
|
@ -19,7 +19,7 @@ using namespace std;
|
||||||
|
|
||||||
namespace ParserTest {
|
namespace ParserTest {
|
||||||
|
|
||||||
class ParserInitialDTest : public ParserTestBase {};
|
class ParserInitialDTest : public ParserDdlTest {};
|
||||||
|
|
||||||
// todo delete
|
// todo delete
|
||||||
// todo desc
|
// todo desc
|
||||||
|
@ -29,7 +29,37 @@ class ParserInitialDTest : public ParserTestBase {};
|
||||||
TEST_F(ParserInitialDTest, dropBnode) {
|
TEST_F(ParserInitialDTest, dropBnode) {
|
||||||
useDb("root", "test");
|
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
|
// todo drop database
|
||||||
|
|
|
@ -121,13 +121,13 @@ TEST_F(ParserSelectTest, selectFunc) {
|
||||||
run("SELECT MAX(c1), c2 FROM t1 STATE_WINDOW(c3)");
|
run("SELECT MAX(c1), c2 FROM t1 STATE_WINDOW(c3)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserSelectTest, nonstdFunc) {
|
TEST_F(ParserSelectTest, IndefiniteRowsFunc) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("SELECT DIFF(c1) FROM t1");
|
run("SELECT DIFF(c1) FROM t1");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserSelectTest, nonstdFuncSemanticCheck) {
|
TEST_F(ParserSelectTest, IndefiniteRowsFuncSemanticCheck) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("SELECT DIFF(c1), c2 FROM t1", TSDB_CODE_PAR_NOT_ALLOWED_FUNC, PARSER_STAGE_TRANSLATE);
|
run("SELECT DIFF(c1), c2 FROM t1", TSDB_CODE_PAR_NOT_ALLOWED_FUNC, PARSER_STAGE_TRANSLATE);
|
||||||
|
|
|
@ -321,6 +321,7 @@ static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
|
||||||
}
|
}
|
||||||
|
|
||||||
pJoin->joinType = pJoinTable->joinType;
|
pJoin->joinType = pJoinTable->joinType;
|
||||||
|
pJoin->isSingleTableJoin = pJoinTable->table.singleTable;
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
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) {
|
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;
|
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);
|
code = rewriteExprForSelect(pAgg->pGroupKeys, pSelect, SQL_CLAUSE_GROUP_BY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && (pSelect->hasAggFuncs || pSelect->hasIndefiniteRowsFunc)) {
|
if (TSDB_CODE_SUCCESS == code && pSelect->hasAggFuncs) {
|
||||||
code = nodesCollectFuncs(pSelect, SQL_CLAUSE_GROUP_BY, fmIsVectorFunc, &pAgg->pAggFuncs);
|
code = nodesCollectFuncs(pSelect, SQL_CLAUSE_GROUP_BY, fmIsAggFunc, &pAgg->pAggFuncs);
|
||||||
}
|
}
|
||||||
|
|
||||||
// rewrite the expression in subsequent clauses
|
// rewrite the expression in subsequent clauses
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#define SPLIT_FLAG_MASK(n) (1 << n)
|
#define SPLIT_FLAG_MASK(n) (1 << n)
|
||||||
|
|
||||||
#define SPLIT_FLAG_STS SPLIT_FLAG_MASK(0)
|
#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_SET_MASK(val, mask) (val) |= (mask)
|
||||||
#define SPLIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
|
#define SPLIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
|
||||||
|
@ -42,7 +41,8 @@ typedef struct SStsInfo {
|
||||||
} SStsInfo;
|
} SStsInfo;
|
||||||
|
|
||||||
typedef struct SCtjInfo {
|
typedef struct SCtjInfo {
|
||||||
SScanLogicNode* pScan;
|
SJoinLogicNode* pJoin;
|
||||||
|
SLogicNode* pSplitNode;
|
||||||
SLogicSubplan* pSubplan;
|
SLogicSubplan* pSubplan;
|
||||||
} SCtjInfo;
|
} SCtjInfo;
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ typedef struct SUnInfo {
|
||||||
|
|
||||||
typedef bool (*FSplFindSplitNode)(SLogicSubplan* pSubplan, void* pInfo);
|
typedef bool (*FSplFindSplitNode)(SLogicSubplan* pSubplan, void* pInfo);
|
||||||
|
|
||||||
static SLogicSubplan* splCreateScanSubplan(SSplitContext* pCxt, SScanLogicNode* pScan, int32_t flag) {
|
static SLogicSubplan* splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode, int32_t flag) {
|
||||||
SLogicSubplan* pSubplan = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN);
|
SLogicSubplan* pSubplan = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN);
|
||||||
if (NULL == pSubplan) {
|
if (NULL == pSubplan) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -66,35 +66,37 @@ static SLogicSubplan* splCreateScanSubplan(SSplitContext* pCxt, SScanLogicNode*
|
||||||
pSubplan->id.queryId = pCxt->queryId;
|
pSubplan->id.queryId = pCxt->queryId;
|
||||||
pSubplan->id.groupId = pCxt->groupId;
|
pSubplan->id.groupId = pCxt->groupId;
|
||||||
pSubplan->subplanType = SUBPLAN_TYPE_SCAN;
|
pSubplan->subplanType = SUBPLAN_TYPE_SCAN;
|
||||||
pSubplan->pNode = (SLogicNode*)nodesCloneNode(pScan);
|
pSubplan->pNode = (SLogicNode*)nodesCloneNode(pNode);
|
||||||
TSWAP(pSubplan->pVgroupList, ((SScanLogicNode*)pSubplan->pNode)->pVgroupList);
|
if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) {
|
||||||
|
TSWAP(pSubplan->pVgroupList, ((SScanLogicNode*)pSubplan->pNode)->pVgroupList);
|
||||||
|
}
|
||||||
SPLIT_FLAG_SET_MASK(pSubplan->splitFlag, flag);
|
SPLIT_FLAG_SET_MASK(pSubplan->splitFlag, flag);
|
||||||
return pSubplan;
|
return pSubplan;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t splCreateExchangeNode(SSplitContext* pCxt, SLogicSubplan* pSubplan, SScanLogicNode* pScan,
|
static int32_t splCreateExchangeNode(SSplitContext* pCxt, SLogicSubplan* pSubplan, SLogicNode* pSplitNode,
|
||||||
ESubplanType subplanType) {
|
ESubplanType subplanType) {
|
||||||
SExchangeLogicNode* pExchange = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE);
|
SExchangeLogicNode* pExchange = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE);
|
||||||
if (NULL == pExchange) {
|
if (NULL == pExchange) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
pExchange->srcGroupId = pCxt->groupId;
|
pExchange->srcGroupId = pCxt->groupId;
|
||||||
pExchange->precision = pScan->pMeta->tableInfo.precision;
|
pExchange->precision = pSplitNode->precision;
|
||||||
pExchange->node.pTargets = nodesCloneList(pScan->node.pTargets);
|
pExchange->node.pTargets = nodesCloneList(pSplitNode->pTargets);
|
||||||
if (NULL == pExchange->node.pTargets) {
|
if (NULL == pExchange->node.pTargets) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pSubplan->subplanType = SUBPLAN_TYPE_MERGE;
|
pSubplan->subplanType = subplanType;
|
||||||
|
|
||||||
if (NULL == pScan->node.pParent) {
|
if (NULL == pSplitNode->pParent) {
|
||||||
pSubplan->pNode = (SLogicNode*)pExchange;
|
pSubplan->pNode = (SLogicNode*)pExchange;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
FOREACH(pNode, pScan->node.pParent->pChildren) {
|
FOREACH(pNode, pSplitNode->pParent->pChildren) {
|
||||||
if (nodesEqualNode(pNode, pScan)) {
|
if (nodesEqualNode(pNode, pSplitNode)) {
|
||||||
REPLACE_NODE(pExchange);
|
REPLACE_NODE(pExchange);
|
||||||
nodesDestroyNode(pNode);
|
nodesDestroyNode(pNode);
|
||||||
return TSDB_CODE_SUCCESS;
|
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)) {
|
if (!splMatch(pCxt, pSubplan, SPLIT_FLAG_STS, (FSplFindSplitNode)stsFindSplitNode, &info)) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
int32_t code =
|
int32_t code = nodesListMakeStrictAppend(&info.pSubplan->pChildren,
|
||||||
nodesListMakeStrictAppend(&info.pSubplan->pChildren, splCreateScanSubplan(pCxt, info.pScan, SPLIT_FLAG_STS));
|
splCreateSubplan(pCxt, (SLogicNode*)info.pScan, SPLIT_FLAG_STS));
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
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->groupId);
|
||||||
pCxt->split = true;
|
pCxt->split = true;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ctjIsSingleTable(int8_t tableType) {
|
static bool needSplit(SJoinLogicNode* pJoin) {
|
||||||
return (TSDB_CHILD_TABLE == tableType || TSDB_NORMAL_TABLE == tableType);
|
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) {
|
static SJoinLogicNode* ctjMatchByNode(SLogicNode* pNode) {
|
||||||
if (QUERY_NODE_LOGIC_PLAN_JOIN == nodeType(pNode)) {
|
if (QUERY_NODE_LOGIC_PLAN_JOIN == nodeType(pNode) && needSplit((SJoinLogicNode*)pNode)) {
|
||||||
SLogicNode* pLeft = (SLogicNode*)nodesListGetNode(pNode->pChildren, 0);
|
return (SJoinLogicNode*)pNode;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SNode* pChild;
|
SNode* pChild;
|
||||||
FOREACH(pChild, pNode->pChildren) {
|
FOREACH(pChild, pNode->pChildren) {
|
||||||
SLogicNode* pSplitNode = ctjMatchByNode((SLogicNode*)pChild);
|
SJoinLogicNode* pSplitNode = ctjMatchByNode((SLogicNode*)pChild);
|
||||||
if (NULL != pSplitNode) {
|
if (NULL != pSplitNode) {
|
||||||
return pSplitNode;
|
return pSplitNode;
|
||||||
}
|
}
|
||||||
|
@ -183,23 +183,23 @@ static SLogicNode* ctjMatchByNode(SLogicNode* pNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ctjFindSplitNode(SLogicSubplan* pSubplan, SCtjInfo* pInfo) {
|
static bool ctjFindSplitNode(SLogicSubplan* pSubplan, SCtjInfo* pInfo) {
|
||||||
SLogicNode* pSplitNode = ctjMatchByNode(pSubplan->pNode);
|
SJoinLogicNode* pJoin = ctjMatchByNode(pSubplan->pNode);
|
||||||
if (NULL != pSplitNode) {
|
if (NULL != pJoin) {
|
||||||
pInfo->pScan = (SScanLogicNode*)pSplitNode;
|
pInfo->pJoin = pJoin;
|
||||||
|
pInfo->pSplitNode = nodesListGetNode(pJoin->node.pChildren, 1);
|
||||||
pInfo->pSubplan = pSubplan;
|
pInfo->pSubplan = pSubplan;
|
||||||
}
|
}
|
||||||
return NULL != pSplitNode;
|
return NULL != pJoin;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t ctjSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) {
|
static int32_t ctjSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) {
|
||||||
SCtjInfo info = {0};
|
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;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
int32_t code =
|
int32_t code = nodesListMakeStrictAppend(&info.pSubplan->pChildren, splCreateSubplan(pCxt, info.pSplitNode, 0));
|
||||||
nodesListMakeStrictAppend(&info.pSubplan->pChildren, splCreateScanSubplan(pCxt, info.pScan, SPLIT_FLAG_CTJ));
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = splCreateExchangeNode(pCxt, info.pSubplan, info.pScan, info.pSubplan->subplanType);
|
code = splCreateExchangeNode(pCxt, info.pSubplan, info.pSplitNode, info.pSubplan->subplanType);
|
||||||
}
|
}
|
||||||
++(pCxt->groupId);
|
++(pCxt->groupId);
|
||||||
pCxt->split = true;
|
pCxt->split = true;
|
||||||
|
|
|
@ -26,6 +26,8 @@ TEST_F(PlanSubqeuryTest, basic) {
|
||||||
run("SELECT * FROM (SELECT * FROM t1)");
|
run("SELECT * FROM (SELECT * FROM t1)");
|
||||||
|
|
||||||
run("SELECT LAST(c1) 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) {
|
TEST_F(PlanSubqeuryTest, doubleGroupBy) {
|
||||||
|
|
Loading…
Reference in New Issue