未验证 提交 d0469cc4 编写于 作者: D dapan1121 提交者: GitHub

Merge pull request #19261 from taosdata/feat/TD-20866-3.0

feat: support show cluster alive; and show db.alive;
...@@ -30,6 +30,11 @@ typedef int64_t tb_uid_t; ...@@ -30,6 +30,11 @@ typedef int64_t tb_uid_t;
#define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX)) #define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX))
#define TSWINDOW_IS_EQUAL(t1, t2) (((t1).skey == (t2).skey) && ((t1).ekey == (t2).ekey)) #define TSWINDOW_IS_EQUAL(t1, t2) (((t1).skey == (t2).skey) && ((t1).ekey == (t2).ekey))
//define show cluster alive and show db.alive
#define SHOW_STATUS_NOT_AVAILABLE 0
#define SHOW_STATUS_AVAILABLE 1
#define SHOW_STATUS_HALF_AVAILABLE 2
typedef enum { typedef enum {
TSDB_SUPER_TABLE = 1, // super table TSDB_SUPER_TABLE = 1, // super table
TSDB_CHILD_TABLE = 2, // table created from super table TSDB_CHILD_TABLE = 2, // table created from super table
......
...@@ -175,171 +175,172 @@ ...@@ -175,171 +175,172 @@
#define TK_CONSUMERS 157 #define TK_CONSUMERS 157
#define TK_SUBSCRIPTIONS 158 #define TK_SUBSCRIPTIONS 158
#define TK_VNODES 159 #define TK_VNODES 159
#define TK_LIKE 160 #define TK_ALIVE 160
#define TK_TBNAME 161 #define TK_LIKE 161
#define TK_QTAGS 162 #define TK_TBNAME 162
#define TK_AS 163 #define TK_QTAGS 163
#define TK_INDEX 164 #define TK_AS 164
#define TK_FUNCTION 165 #define TK_INDEX 165
#define TK_INTERVAL 166 #define TK_FUNCTION 166
#define TK_COUNT 167 #define TK_INTERVAL 167
#define TK_LAST_ROW 168 #define TK_COUNT 168
#define TK_TOPIC 169 #define TK_LAST_ROW 169
#define TK_WITH 170 #define TK_TOPIC 170
#define TK_META 171 #define TK_WITH 171
#define TK_CONSUMER 172 #define TK_META 172
#define TK_GROUP 173 #define TK_CONSUMER 173
#define TK_DESC 174 #define TK_GROUP 174
#define TK_DESCRIBE 175 #define TK_DESC 175
#define TK_RESET 176 #define TK_DESCRIBE 176
#define TK_QUERY 177 #define TK_RESET 177
#define TK_CACHE 178 #define TK_QUERY 178
#define TK_EXPLAIN 179 #define TK_CACHE 179
#define TK_ANALYZE 180 #define TK_EXPLAIN 180
#define TK_VERBOSE 181 #define TK_ANALYZE 181
#define TK_NK_BOOL 182 #define TK_VERBOSE 182
#define TK_RATIO 183 #define TK_NK_BOOL 183
#define TK_NK_FLOAT 184 #define TK_RATIO 184
#define TK_OUTPUTTYPE 185 #define TK_NK_FLOAT 185
#define TK_AGGREGATE 186 #define TK_OUTPUTTYPE 186
#define TK_BUFSIZE 187 #define TK_AGGREGATE 187
#define TK_STREAM 188 #define TK_BUFSIZE 188
#define TK_INTO 189 #define TK_STREAM 189
#define TK_TRIGGER 190 #define TK_INTO 190
#define TK_AT_ONCE 191 #define TK_TRIGGER 191
#define TK_WINDOW_CLOSE 192 #define TK_AT_ONCE 192
#define TK_IGNORE 193 #define TK_WINDOW_CLOSE 193
#define TK_EXPIRED 194 #define TK_IGNORE 194
#define TK_FILL_HISTORY 195 #define TK_EXPIRED 195
#define TK_SUBTABLE 196 #define TK_FILL_HISTORY 196
#define TK_KILL 197 #define TK_SUBTABLE 197
#define TK_CONNECTION 198 #define TK_KILL 198
#define TK_TRANSACTION 199 #define TK_CONNECTION 199
#define TK_BALANCE 200 #define TK_TRANSACTION 200
#define TK_VGROUP 201 #define TK_BALANCE 201
#define TK_MERGE 202 #define TK_VGROUP 202
#define TK_REDISTRIBUTE 203 #define TK_MERGE 203
#define TK_SPLIT 204 #define TK_REDISTRIBUTE 204
#define TK_DELETE 205 #define TK_SPLIT 205
#define TK_INSERT 206 #define TK_DELETE 206
#define TK_NULL 207 #define TK_INSERT 207
#define TK_NK_QUESTION 208 #define TK_NULL 208
#define TK_NK_ARROW 209 #define TK_NK_QUESTION 209
#define TK_ROWTS 210 #define TK_NK_ARROW 210
#define TK_QSTART 211 #define TK_ROWTS 211
#define TK_QEND 212 #define TK_QSTART 212
#define TK_QDURATION 213 #define TK_QEND 213
#define TK_WSTART 214 #define TK_QDURATION 214
#define TK_WEND 215 #define TK_WSTART 215
#define TK_WDURATION 216 #define TK_WEND 216
#define TK_IROWTS 217 #define TK_WDURATION 217
#define TK_ISFILLED 218 #define TK_IROWTS 218
#define TK_CAST 219 #define TK_ISFILLED 219
#define TK_NOW 220 #define TK_CAST 220
#define TK_TODAY 221 #define TK_NOW 221
#define TK_TIMEZONE 222 #define TK_TODAY 222
#define TK_CLIENT_VERSION 223 #define TK_TIMEZONE 223
#define TK_SERVER_VERSION 224 #define TK_CLIENT_VERSION 224
#define TK_SERVER_STATUS 225 #define TK_SERVER_VERSION 225
#define TK_CURRENT_USER 226 #define TK_SERVER_STATUS 226
#define TK_CASE 227 #define TK_CURRENT_USER 227
#define TK_END 228 #define TK_CASE 228
#define TK_WHEN 229 #define TK_END 229
#define TK_THEN 230 #define TK_WHEN 230
#define TK_ELSE 231 #define TK_THEN 231
#define TK_BETWEEN 232 #define TK_ELSE 232
#define TK_IS 233 #define TK_BETWEEN 233
#define TK_NK_LT 234 #define TK_IS 234
#define TK_NK_GT 235 #define TK_NK_LT 235
#define TK_NK_LE 236 #define TK_NK_GT 236
#define TK_NK_GE 237 #define TK_NK_LE 237
#define TK_NK_NE 238 #define TK_NK_GE 238
#define TK_MATCH 239 #define TK_NK_NE 239
#define TK_NMATCH 240 #define TK_MATCH 240
#define TK_CONTAINS 241 #define TK_NMATCH 241
#define TK_IN 242 #define TK_CONTAINS 242
#define TK_JOIN 243 #define TK_IN 243
#define TK_INNER 244 #define TK_JOIN 244
#define TK_SELECT 245 #define TK_INNER 245
#define TK_DISTINCT 246 #define TK_SELECT 246
#define TK_WHERE 247 #define TK_DISTINCT 247
#define TK_PARTITION 248 #define TK_WHERE 248
#define TK_BY 249 #define TK_PARTITION 249
#define TK_SESSION 250 #define TK_BY 250
#define TK_STATE_WINDOW 251 #define TK_SESSION 251
#define TK_EVENT_WINDOW 252 #define TK_STATE_WINDOW 252
#define TK_START 253 #define TK_EVENT_WINDOW 253
#define TK_SLIDING 254 #define TK_START 254
#define TK_FILL 255 #define TK_SLIDING 255
#define TK_VALUE 256 #define TK_FILL 256
#define TK_NONE 257 #define TK_VALUE 257
#define TK_PREV 258 #define TK_NONE 258
#define TK_LINEAR 259 #define TK_PREV 259
#define TK_NEXT 260 #define TK_LINEAR 260
#define TK_HAVING 261 #define TK_NEXT 261
#define TK_RANGE 262 #define TK_HAVING 262
#define TK_EVERY 263 #define TK_RANGE 263
#define TK_ORDER 264 #define TK_EVERY 264
#define TK_SLIMIT 265 #define TK_ORDER 265
#define TK_SOFFSET 266 #define TK_SLIMIT 266
#define TK_LIMIT 267 #define TK_SOFFSET 267
#define TK_OFFSET 268 #define TK_LIMIT 268
#define TK_ASC 269 #define TK_OFFSET 269
#define TK_NULLS 270 #define TK_ASC 270
#define TK_ABORT 271 #define TK_NULLS 271
#define TK_AFTER 272 #define TK_ABORT 272
#define TK_ATTACH 273 #define TK_AFTER 273
#define TK_BEFORE 274 #define TK_ATTACH 274
#define TK_BEGIN 275 #define TK_BEFORE 275
#define TK_BITAND 276 #define TK_BEGIN 276
#define TK_BITNOT 277 #define TK_BITAND 277
#define TK_BITOR 278 #define TK_BITNOT 278
#define TK_BLOCKS 279 #define TK_BITOR 279
#define TK_CHANGE 280 #define TK_BLOCKS 280
#define TK_COMMA 281 #define TK_CHANGE 281
#define TK_COMPACT 282 #define TK_COMMA 282
#define TK_CONCAT 283 #define TK_COMPACT 283
#define TK_CONFLICT 284 #define TK_CONCAT 284
#define TK_COPY 285 #define TK_CONFLICT 285
#define TK_DEFERRED 286 #define TK_COPY 286
#define TK_DELIMITERS 287 #define TK_DEFERRED 287
#define TK_DETACH 288 #define TK_DELIMITERS 288
#define TK_DIVIDE 289 #define TK_DETACH 289
#define TK_DOT 290 #define TK_DIVIDE 290
#define TK_EACH 291 #define TK_DOT 291
#define TK_FAIL 292 #define TK_EACH 292
#define TK_FILE 293 #define TK_FAIL 293
#define TK_FOR 294 #define TK_FILE 294
#define TK_GLOB 295 #define TK_FOR 295
#define TK_ID 296 #define TK_GLOB 296
#define TK_IMMEDIATE 297 #define TK_ID 297
#define TK_IMPORT 298 #define TK_IMMEDIATE 298
#define TK_INITIALLY 299 #define TK_IMPORT 299
#define TK_INSTEAD 300 #define TK_INITIALLY 300
#define TK_ISNULL 301 #define TK_INSTEAD 301
#define TK_KEY 302 #define TK_ISNULL 302
#define TK_MODULES 303 #define TK_KEY 303
#define TK_NK_BITNOT 304 #define TK_MODULES 304
#define TK_NK_SEMI 305 #define TK_NK_BITNOT 305
#define TK_NOTNULL 306 #define TK_NK_SEMI 306
#define TK_OF 307 #define TK_NOTNULL 307
#define TK_PLUS 308 #define TK_OF 308
#define TK_PRIVILEGE 309 #define TK_PLUS 309
#define TK_RAISE 310 #define TK_PRIVILEGE 310
#define TK_REPLACE 311 #define TK_RAISE 311
#define TK_RESTRICT 312 #define TK_REPLACE 312
#define TK_ROW 313 #define TK_RESTRICT 313
#define TK_SEMI 314 #define TK_ROW 314
#define TK_STAR 315 #define TK_SEMI 315
#define TK_STATEMENT 316 #define TK_STAR 316
#define TK_STRICT 317 #define TK_STATEMENT 317
#define TK_STRING 318 #define TK_STRICT 318
#define TK_TIMES 319 #define TK_STRING 319
#define TK_UPDATE 320 #define TK_TIMES 320
#define TK_VALUES 321 #define TK_UPDATE 321
#define TK_VARIABLE 322 #define TK_VALUES 322
#define TK_VIEW 323 #define TK_VARIABLE 323
#define TK_WAL 324 #define TK_VIEW 324
#define TK_WAL 325
#define TK_NK_SPACE 600 #define TK_NK_SPACE 600
#define TK_NK_COMMENT 601 #define TK_NK_COMMENT 601
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
typedef struct SExplainCtx SExplainCtx; typedef struct SExplainCtx SExplainCtx;
int32_t qExecCommand(bool sysInfoUser, SNode *pStmt, SRetrieveTableRsp **pRsp); int32_t qExecCommand(int64_t* pConnId, bool sysInfoUser, SNode *pStmt, SRetrieveTableRsp **pRsp);
int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp); int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp);
int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int64_t startTs); int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int64_t startTs);
......
...@@ -40,6 +40,7 @@ extern "C" { ...@@ -40,6 +40,7 @@ extern "C" {
#define SHOW_LOCAL_VARIABLES_RESULT_FIELD1_LEN (TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE) #define SHOW_LOCAL_VARIABLES_RESULT_FIELD1_LEN (TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE)
#define SHOW_LOCAL_VARIABLES_RESULT_FIELD2_LEN (TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE) #define SHOW_LOCAL_VARIABLES_RESULT_FIELD2_LEN (TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE)
#define SHOW_ALIVE_RESULT_COLS 1
#define PRIVILEGE_TYPE_MASK(n) (1 << n) #define PRIVILEGE_TYPE_MASK(n) (1 << n)
#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0) #define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0)
...@@ -262,6 +263,11 @@ typedef struct SShowCreateDatabaseStmt { ...@@ -262,6 +263,11 @@ typedef struct SShowCreateDatabaseStmt {
void* pCfg; // SDbCfgInfo void* pCfg; // SDbCfgInfo
} SShowCreateDatabaseStmt; } SShowCreateDatabaseStmt;
typedef struct SShowAliveStmt {
ENodeType type;
char dbName[TSDB_DB_NAME_LEN];
} SShowAliveStmt;
typedef struct SShowCreateTableStmt { typedef struct SShowCreateTableStmt {
ENodeType type; ENodeType type;
char dbName[TSDB_DB_NAME_LEN]; char dbName[TSDB_DB_NAME_LEN];
......
...@@ -208,6 +208,8 @@ typedef enum ENodeType { ...@@ -208,6 +208,8 @@ typedef enum ENodeType {
QUERY_NODE_DELETE_STMT, QUERY_NODE_DELETE_STMT,
QUERY_NODE_INSERT_STMT, QUERY_NODE_INSERT_STMT,
QUERY_NODE_QUERY, QUERY_NODE_QUERY,
QUERY_NODE_SHOW_DB_ALIVE_STMT,
QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT,
// logic plan node // logic plan node
QUERY_NODE_LOGIC_PLAN_SCAN = 1000, QUERY_NODE_LOGIC_PLAN_SCAN = 1000,
......
...@@ -272,7 +272,7 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtC ...@@ -272,7 +272,7 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtC
int32_t execLocalCmd(SRequestObj* pRequest, SQuery* pQuery) { int32_t execLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
SRetrieveTableRsp* pRsp = NULL; SRetrieveTableRsp* pRsp = NULL;
int32_t code = qExecCommand(pRequest->pTscObj->sysInfo, pQuery->pRoot, &pRsp); int32_t code = qExecCommand(&pRequest->pTscObj->id, pRequest->pTscObj->sysInfo, pQuery->pRoot, &pRsp);
if (TSDB_CODE_SUCCESS == code && NULL != pRsp) { if (TSDB_CODE_SUCCESS == code && NULL != pRsp) {
code = setQueryResultFromRsp(&pRequest->body.resInfo, pRsp, false, true); code = setQueryResultFromRsp(&pRequest->body.resInfo, pRsp, false, true);
} }
...@@ -310,7 +310,7 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) { ...@@ -310,7 +310,7 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
return; return;
} }
int32_t code = qExecCommand(pRequest->pTscObj->sysInfo, pQuery->pRoot, &pRsp); int32_t code = qExecCommand(&pRequest->pTscObj->id ,pRequest->pTscObj->sysInfo, pQuery->pRoot, &pRsp);
if (TSDB_CODE_SUCCESS == code && NULL != pRsp) { if (TSDB_CODE_SUCCESS == code && NULL != pRsp) {
code = setQueryResultFromRsp(&pRequest->body.resInfo, pRsp, false, true); code = setQueryResultFromRsp(&pRequest->body.resInfo, pRsp, false, true);
} }
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "tdatablock.h" #include "tdatablock.h"
#include "tglobal.h" #include "tglobal.h"
#include "tgrant.h" #include "tgrant.h"
#include "taosdef.h"
extern SConfig* tsCfg; extern SConfig* tsCfg;
...@@ -153,6 +154,23 @@ static int32_t buildCreateDBResultDataBlock(SSDataBlock** pOutput) { ...@@ -153,6 +154,23 @@ static int32_t buildCreateDBResultDataBlock(SSDataBlock** pOutput) {
return code; return code;
} }
static int32_t buildAliveResultDataBlock(SSDataBlock** pOutput) {
SSDataBlock* pBlock = createDataBlock();
if (NULL == pBlock) {
return TSDB_CODE_OUT_OF_MEMORY;
}
SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_INT, sizeof(int32_t), 1);
int32_t code = blockDataAppendColInfo(pBlock, &infoData);
if (TSDB_CODE_SUCCESS == code) {
*pOutput = pBlock;
} else {
blockDataDestroy(pBlock);
}
return code;
}
int64_t getValOfDiffPrecision(int8_t unit, int64_t val) { int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
int64_t v = 0; int64_t v = 0;
switch (unit) { switch (unit) {
...@@ -280,6 +298,108 @@ static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbFName, S ...@@ -280,6 +298,108 @@ static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbFName, S
colDataAppend(pCol2, 0, buf2, false); colDataAppend(pCol2, 0, buf2, false);
} }
#define CHECK_LEADER(n) (row[n] && (fields[n].type == TSDB_DATA_TYPE_VARCHAR && strncasecmp(row[n], "leader", varDataLen((char *)row[n] - VARSTR_HEADER_SIZE)) == 0))
// on this row, if have leader return true else return false
bool existLeaderRole(TAOS_ROW row, TAOS_FIELD* fields, int nFields) {
// vgroup_id | db_name | tables | v1_dnode | v1_status | v2_dnode | v2_status | v3_dnode | v3_status | v4_dnode |
// v4_status | cacheload | tsma |
if (nFields != 13) {
return false;
}
// check have leader on cloumn v*_status on 4 6 8 10
if (CHECK_LEADER(4) || CHECK_LEADER(6) || CHECK_LEADER(8) || CHECK_LEADER(10)) {
return true;
}
return false;
}
// get db alive status, return 1 is alive else return 0
int32_t getAliveStatusFromApi(int64_t* pConnId, char* dbName, int32_t* pStatus) {
char sql[128 + TSDB_DB_NAME_LEN] = "select * from information_schema.ins_vgroups";
int32_t code;
// filter with db name
if (dbName && dbName[0] != 0) {
char str[64 + TSDB_DB_NAME_LEN] = "";
// test db name exist
sprintf(str, "show create database %s ;", dbName);
TAOS_RES* dbRes = taos_query(pConnId, str);
code = taos_errno(dbRes);
if (code != TSDB_CODE_SUCCESS) {
taos_free_result(dbRes);
return code;
}
taos_free_result(dbRes);
sprintf(str, " where db_name='%s' ;", dbName);
strcat(sql, str);
}
TAOS_RES* res = taos_query(pConnId, sql);
code = taos_errno(res);
if (code != TSDB_CODE_SUCCESS) {
taos_free_result(res);
return code;
}
TAOS_ROW row = NULL;
TAOS_FIELD* fields = taos_fetch_fields(res);
int32_t nFields = taos_num_fields(res);
int32_t nAvailble = 0;
int32_t nUnAvailble = 0;
while ((row = taos_fetch_row(res)) != NULL) {
if (existLeaderRole(row, fields, nFields)) {
nAvailble++;
} else {
nUnAvailble++;
}
}
taos_free_result(res);
int32_t status = 0;
if (nAvailble + nUnAvailble == 0 || nUnAvailble == 0) {
status = SHOW_STATUS_AVAILABLE;
} else if (nAvailble > 0 && nUnAvailble > 0) {
status = SHOW_STATUS_HALF_AVAILABLE;
} else {
status = SHOW_STATUS_NOT_AVAILABLE;
}
if (pStatus) {
*pStatus = status;
}
return TSDB_CODE_SUCCESS;
}
static int32_t setAliveResultIntoDataBlock(int64_t* pConnId, SSDataBlock* pBlock, char* dbName) {
blockDataEnsureCapacity(pBlock, 1);
pBlock->info.rows = 1;
SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
int32_t status = 0;
int32_t code = getAliveStatusFromApi(pConnId, dbName, &status);
if (code == TSDB_CODE_SUCCESS) {
colDataAppend(pCol1, 0, (const char*)&status, false);
}
return code;
}
static int32_t execShowAliveStatus(int64_t* pConnId, SShowAliveStmt* pStmt, SRetrieveTableRsp** pRsp) {
SSDataBlock* pBlock = NULL;
int32_t code = buildAliveResultDataBlock(&pBlock);
if (TSDB_CODE_SUCCESS == code) {
code = setAliveResultIntoDataBlock(pConnId, pBlock, pStmt->dbName);
}
if (TSDB_CODE_SUCCESS == code) {
code = buildRetrieveTableRsp(pBlock, SHOW_ALIVE_RESULT_COLS, pRsp);
}
blockDataDestroy(pBlock);
return code;
}
static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt, SRetrieveTableRsp** pRsp) { static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt, SRetrieveTableRsp** pRsp) {
SSDataBlock* pBlock = NULL; SSDataBlock* pBlock = NULL;
int32_t code = buildCreateDBResultDataBlock(&pBlock); int32_t code = buildCreateDBResultDataBlock(&pBlock);
...@@ -735,7 +855,7 @@ static int32_t execSelectWithoutFrom(SSelectStmt* pSelect, SRetrieveTableRsp** p ...@@ -735,7 +855,7 @@ static int32_t execSelectWithoutFrom(SSelectStmt* pSelect, SRetrieveTableRsp** p
return code; return code;
} }
int32_t qExecCommand(bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp) { int32_t qExecCommand(int64_t* pConnId, bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp) {
switch (nodeType(pStmt)) { switch (nodeType(pStmt)) {
case QUERY_NODE_DESCRIBE_STMT: case QUERY_NODE_DESCRIBE_STMT:
return execDescribe(sysInfoUser, pStmt, pRsp); return execDescribe(sysInfoUser, pStmt, pRsp);
...@@ -753,6 +873,9 @@ int32_t qExecCommand(bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp) { ...@@ -753,6 +873,9 @@ int32_t qExecCommand(bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp) {
return execShowLocalVariables(pRsp); return execShowLocalVariables(pRsp);
case QUERY_NODE_SELECT_STMT: case QUERY_NODE_SELECT_STMT:
return execSelectWithoutFrom((SSelectStmt*)pStmt, pRsp); return execSelectWithoutFrom((SSelectStmt*)pStmt, pRsp);
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
return execShowAliveStatus(pConnId, (SShowAliveStmt*)pStmt, pRsp);
default: default:
break; break;
} }
......
...@@ -173,6 +173,10 @@ const char* nodesNodeName(ENodeType type) { ...@@ -173,6 +173,10 @@ const char* nodesNodeName(ENodeType type) {
return "BalanceVgroupStmt"; return "BalanceVgroupStmt";
case QUERY_NODE_MERGE_VGROUP_STMT: case QUERY_NODE_MERGE_VGROUP_STMT:
return "MergeVgroupStmt"; return "MergeVgroupStmt";
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
return "ShowDbAliveStmt";
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
return "ShowClusterAliveStmt";
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT: case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
return "RedistributeVgroupStmt"; return "RedistributeVgroupStmt";
case QUERY_NODE_SPLIT_VGROUP_STMT: case QUERY_NODE_SPLIT_VGROUP_STMT:
......
...@@ -434,6 +434,9 @@ SNode* nodesMakeNode(ENodeType type) { ...@@ -434,6 +434,9 @@ SNode* nodesMakeNode(ENodeType type) {
return makeNode(type, sizeof(SShowDnodeVariablesStmt)); return makeNode(type, sizeof(SShowDnodeVariablesStmt));
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
return makeNode(type, sizeof(SShowCreateDatabaseStmt)); return makeNode(type, sizeof(SShowCreateDatabaseStmt));
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
return makeNode(type, sizeof(SShowAliveStmt));
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:
return makeNode(type, sizeof(SShowCreateTableStmt)); return makeNode(type, sizeof(SShowCreateTableStmt));
...@@ -960,6 +963,8 @@ void nodesDestroyNode(SNode* pNode) { ...@@ -960,6 +963,8 @@ void nodesDestroyNode(SNode* pNode) {
case QUERY_NODE_SHOW_USERS_STMT: case QUERY_NODE_SHOW_USERS_STMT:
case QUERY_NODE_SHOW_LICENCES_STMT: case QUERY_NODE_SHOW_LICENCES_STMT:
case QUERY_NODE_SHOW_VGROUPS_STMT: case QUERY_NODE_SHOW_VGROUPS_STMT:
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
case QUERY_NODE_SHOW_TOPICS_STMT: case QUERY_NODE_SHOW_TOPICS_STMT:
case QUERY_NODE_SHOW_CONSUMERS_STMT: case QUERY_NODE_SHOW_CONSUMERS_STMT:
case QUERY_NODE_SHOW_CONNECTIONS_STMT: case QUERY_NODE_SHOW_CONNECTIONS_STMT:
......
...@@ -176,6 +176,7 @@ SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type); ...@@ -176,6 +176,7 @@ SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type);
SNode* createShowStmtWithCond(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, SNode* pTbName, SNode* createShowStmtWithCond(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, SNode* pTbName,
EOperatorType tableCondType); EOperatorType tableCondType);
SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName); SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName);
SNode* createShowAliveStmt(SAstCreateContext* pCxt, SNode* pDbName, ENodeType type);
SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable); SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable);
SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable); SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable);
SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pLikePattern); SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pLikePattern);
......
...@@ -433,6 +433,9 @@ cmd ::= SHOW TAGS FROM table_name_cond(A) from_db_opt(B). ...@@ -433,6 +433,9 @@ cmd ::= SHOW TAGS FROM table_name_cond(A) from_db_opt(B).
cmd ::= SHOW TABLE TAGS tag_list_opt(C) FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowTableTagsStmt(pCxt, A, B, C); } cmd ::= SHOW TABLE TAGS tag_list_opt(C) FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowTableTagsStmt(pCxt, A, B, C); }
cmd ::= SHOW VNODES NK_INTEGER(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A), NULL); } cmd ::= SHOW VNODES NK_INTEGER(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A), NULL); }
cmd ::= SHOW VNODES NK_STRING(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &A)); } cmd ::= SHOW VNODES NK_STRING(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &A)); }
// show alive
cmd ::= SHOW db_name_cond_opt(A) ALIVE. { pCxt->pRootNode = createShowAliveStmt(pCxt, A, QUERY_NODE_SHOW_DB_ALIVE_STMT); }
cmd ::= SHOW CLUSTER ALIVE. { pCxt->pRootNode = createShowAliveStmt(pCxt, NULL, QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT); }
db_name_cond_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); } db_name_cond_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); }
db_name_cond_opt(A) ::= db_name(B) NK_DOT. { A = createIdentifierValueNode(pCxt, &B); } db_name_cond_opt(A) ::= db_name(B) NK_DOT. { A = createIdentifierValueNode(pCxt, &B); }
......
...@@ -1370,6 +1370,38 @@ SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { ...@@ -1370,6 +1370,38 @@ SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) {
return (SNode*)pStmt; return (SNode*)pStmt;
} }
SNode* createShowAliveStmt(SAstCreateContext* pCxt, SNode* pNode, ENodeType type) {
CHECK_PARSER_STATUS(pCxt);
SToken dbToken = {0};
SToken* pDbToken = NULL;
if (pNode) {
SValueNode* pDbName = (SValueNode*)pNode;
if (pDbName->literal) {
dbToken.z = pDbName->literal;
dbToken.n = strlen(pDbName->literal);
pDbToken = &dbToken;
}
}
if (pDbToken && !checkDbName(pCxt, pDbToken, true)) {
nodesDestroyNode(pNode);
return NULL;
}
SShowAliveStmt* pStmt = (SShowAliveStmt*)nodesMakeNode(type);
CHECK_OUT_OF_MEM(pStmt);
if (pDbToken) {
COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbToken);
}
if (pNode) {
nodesDestroyNode(pNode);
}
return (SNode*)pStmt;
}
SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable) { SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable) {
CHECK_PARSER_STATUS(pCxt); CHECK_PARSER_STATUS(pCxt);
SShowCreateTableStmt* pStmt = (SShowCreateTableStmt*)nodesMakeNode(type); SShowCreateTableStmt* pStmt = (SShowCreateTableStmt*)nodesMakeNode(type);
......
...@@ -145,6 +145,8 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) { ...@@ -145,6 +145,8 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
case QUERY_NODE_SHOW_CLUSTER_STMT: case QUERY_NODE_SHOW_CLUSTER_STMT:
case QUERY_NODE_SHOW_LICENCES_STMT: case QUERY_NODE_SHOW_LICENCES_STMT:
case QUERY_NODE_SHOW_VGROUPS_STMT: case QUERY_NODE_SHOW_VGROUPS_STMT:
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
case QUERY_NODE_SHOW_VNODES_STMT: case QUERY_NODE_SHOW_VNODES_STMT:
......
...@@ -269,6 +269,7 @@ static SKeyword keywordTable[] = { ...@@ -269,6 +269,7 @@ static SKeyword keywordTable[] = {
{"_WDURATION", TK_WDURATION}, {"_WDURATION", TK_WDURATION},
{"_WEND", TK_WEND}, {"_WEND", TK_WEND},
{"_WSTART", TK_WSTART}, {"_WSTART", TK_WSTART},
{"ALIVE", TK_ALIVE},
}; };
// clang-format on // clang-format on
......
...@@ -6364,6 +6364,20 @@ static int32_t extractShowCreateDatabaseResultSchema(int32_t* numOfCols, SSchema ...@@ -6364,6 +6364,20 @@ static int32_t extractShowCreateDatabaseResultSchema(int32_t* numOfCols, SSchema
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
static int32_t extractShowAliveResultSchema(int32_t* numOfCols, SSchema** pSchema) {
*numOfCols = 1;
*pSchema = taosMemoryCalloc((*numOfCols), sizeof(SSchema));
if (NULL == (*pSchema)) {
return TSDB_CODE_OUT_OF_MEMORY;
}
(*pSchema)[0].type = TSDB_DATA_TYPE_INT;
(*pSchema)[0].bytes = sizeof(int32_t);
strcpy((*pSchema)[0].name, "status");
return TSDB_CODE_SUCCESS;
}
static int32_t extractShowCreateTableResultSchema(int32_t* numOfCols, SSchema** pSchema) { static int32_t extractShowCreateTableResultSchema(int32_t* numOfCols, SSchema** pSchema) {
*numOfCols = 2; *numOfCols = 2;
*pSchema = taosMemoryCalloc((*numOfCols), sizeof(SSchema)); *pSchema = taosMemoryCalloc((*numOfCols), sizeof(SSchema));
...@@ -6415,6 +6429,9 @@ int32_t extractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pS ...@@ -6415,6 +6429,9 @@ int32_t extractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pS
return extractDescribeResultSchema(numOfCols, pSchema); return extractDescribeResultSchema(numOfCols, pSchema);
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
return extractShowCreateDatabaseResultSchema(numOfCols, pSchema); return extractShowCreateDatabaseResultSchema(numOfCols, pSchema);
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
return extractShowAliveResultSchema(numOfCols, pSchema);
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:
return extractShowCreateTableResultSchema(numOfCols, pSchema); return extractShowCreateTableResultSchema(numOfCols, pSchema);
...@@ -7934,6 +7951,8 @@ static int32_t setQuery(STranslateContext* pCxt, SQuery* pQuery) { ...@@ -7934,6 +7951,8 @@ static int32_t setQuery(STranslateContext* pCxt, SQuery* pQuery) {
break; break;
case QUERY_NODE_DESCRIBE_STMT: case QUERY_NODE_DESCRIBE_STMT:
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
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_LOCAL_VARIABLES_STMT: case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
...@@ -261,6 +261,70 @@ class TDSql: ...@@ -261,6 +261,70 @@ class TDSql:
tdLog.info(f"sql:{self.sql}, row:{row} col:{col} data:{self.queryResult[row][col]} == expect:{data}") tdLog.info(f"sql:{self.sql}, row:{row} col:{col} data:{self.queryResult[row][col]} == expect:{data}")
# return true or false replace exit, no print out
def checkRowColNoExit(self, row, col):
caller = inspect.getframeinfo(inspect.stack()[2][0])
if row < 0:
args = (caller.filename, caller.lineno, self.sql, row)
return False
if col < 0:
args = (caller.filename, caller.lineno, self.sql, row)
return False
if row > self.queryRows:
args = (caller.filename, caller.lineno, self.sql, row, self.queryRows)
return False
if col > self.queryCols:
args = (caller.filename, caller.lineno, self.sql, col, self.queryCols)
return False
return True
# return true or false replace exit, no print out
def checkDataNoExit(self, row, col, data):
if self.checkRowColNoExit(row, col) == False:
return False
if self.queryResult[row][col] != data:
if self.cursor.istype(col, "TIMESTAMP"):
# suppose user want to check nanosecond timestamp if a longer data passed
if (len(data) >= 28):
if pd.to_datetime(self.queryResult[row][col]) == pd.to_datetime(data):
return True
else:
if self.queryResult[row][col] == _parse_datetime(data):
return True
return False
if str(self.queryResult[row][col]) == str(data):
return True
elif isinstance(data, float):
if abs(data) >= 1 and abs((self.queryResult[row][col] - data) / data) <= 0.000001:
return True
elif abs(data) < 1 and abs(self.queryResult[row][col] - data) <= 0.000001:
return True
else:
return False
else:
return False
return True
# loop execute sql then sleep(waitTime) , if checkData ok break loop
def checkDataLoop(self, row, col, data, sql, loopCount, waitTime):
# loop check util checkData return true
for i in range(loopCount):
self.query(sql)
if self.checkDataNoExit(row, col, data) :
self.checkData(row, col, data)
return
time.sleep(waitTime)
# last check
self.query(sql)
self.checkData(row, col, data)
def getData(self, row, col): def getData(self, row, col):
self.checkRowCol(row, col) self.checkRowCol(row, col)
return self.queryResult[row][col] return self.queryResult[row][col]
......
...@@ -137,11 +137,34 @@ class TDTestCase: ...@@ -137,11 +137,34 @@ class TDTestCase:
config_dir = dnode.cfgDir config_dir = dnode.cfgDir
return taos.connect(host=host, port=int(port), config=config_dir) return taos.connect(host=host, port=int(port), config=config_dir)
def check_alive(self):
# check cluster alive
tdLog.printNoPrefix("======== test cluster alive: ")
tdSql.checkDataLoop(0, 0, 1, "show cluster alive;", 20, 0.5)
tdSql.query("show db.alive;")
tdSql.checkData(0, 0, 1)
# stop 5 dnode
self.TDDnodes.stoptaosd(5)
tdSql.checkDataLoop(0, 0, 2, "show cluster alive;", 20, 0.5)
tdSql.query("show db.alive;")
tdSql.checkData(0, 0, 2)
# stop 2 dnode
self.TDDnodes.stoptaosd(2)
tdSql.checkDataLoop(0, 0, 0, "show cluster alive;", 20, 0.5)
tdSql.query("show db.alive;")
tdSql.checkData(0, 0, 0)
def run(self): def run(self):
# print(self.master_dnode.cfgDict) # print(self.master_dnode.cfgDict)
self.five_dnode_one_mnode() self.five_dnode_one_mnode()
# check cluster and db alive
self.check_alive()
def stop(self): def stop(self):
tdSql.close() tdSql.close()
......
...@@ -138,6 +138,7 @@ SWords shellCommands[] = { ...@@ -138,6 +138,7 @@ SWords shellCommands[] = {
{"show create table <tb_name> \\G;", 0, 0, NULL}, {"show create table <tb_name> \\G;", 0, 0, NULL},
{"show connections;", 0, 0, NULL}, {"show connections;", 0, 0, NULL},
{"show cluster;", 0, 0, NULL}, {"show cluster;", 0, 0, NULL},
{"show cluster alive;", 0, 0, NULL},
{"show databases;", 0, 0, NULL}, {"show databases;", 0, 0, NULL},
{"show dnodes;", 0, 0, NULL}, {"show dnodes;", 0, 0, NULL},
{"show dnode <dnode_id> variables;", 0, 0, NULL}, {"show dnode <dnode_id> variables;", 0, 0, NULL},
...@@ -425,6 +426,7 @@ void showHelp() { ...@@ -425,6 +426,7 @@ void showHelp() {
show create table <tb_name>;\n\ show create table <tb_name>;\n\
show connections;\n\ show connections;\n\
show cluster;\n\ show cluster;\n\
show cluster alive;\n\
show databases;\n\ show databases;\n\
show dnodes;\n\ show dnodes;\n\
show dnode <dnode_id> variables;\n\ show dnode <dnode_id> variables;\n\
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册