Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
d0469cc4
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
d0469cc4
编写于
1月 03, 2023
作者:
D
dapan1121
提交者:
GitHub
1月 03, 2023
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #19261 from taosdata/feat/TD-20866-3.0
feat: support show cluster alive; and show db.alive;
上级
25f24af0
eabecd2d
变更
19
隐藏空白更改
内联
并排
Showing
19 changed file
with
4067 addition
and
3208 deletion
+4067
-3208
include/common/taosdef.h
include/common/taosdef.h
+5
-0
include/common/ttokendef.h
include/common/ttokendef.h
+166
-165
include/libs/command/command.h
include/libs/command/command.h
+1
-1
include/libs/nodes/cmdnodes.h
include/libs/nodes/cmdnodes.h
+6
-0
include/libs/nodes/nodes.h
include/libs/nodes/nodes.h
+2
-0
source/client/src/clientImpl.c
source/client/src/clientImpl.c
+2
-2
source/libs/command/src/command.c
source/libs/command/src/command.c
+124
-1
source/libs/nodes/src/nodesCodeFuncs.c
source/libs/nodes/src/nodesCodeFuncs.c
+4
-0
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+5
-0
source/libs/parser/inc/parAst.h
source/libs/parser/inc/parAst.h
+1
-0
source/libs/parser/inc/sql.y
source/libs/parser/inc/sql.y
+3
-0
source/libs/parser/src/parAstCreater.c
source/libs/parser/src/parAstCreater.c
+32
-0
source/libs/parser/src/parAuthenticator.c
source/libs/parser/src/parAuthenticator.c
+2
-0
source/libs/parser/src/parTokenizer.c
source/libs/parser/src/parTokenizer.c
+1
-0
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+19
-0
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+3604
-3038
tests/pytest/util/sql.py
tests/pytest/util/sql.py
+64
-0
tests/system-test/6-cluster/5dnode1mnode.py
tests/system-test/6-cluster/5dnode1mnode.py
+24
-1
tools/shell/src/shellAuto.c
tools/shell/src/shellAuto.c
+2
-0
未找到文件。
include/common/taosdef.h
浏览文件 @
d0469cc4
...
...
@@ -30,6 +30,11 @@ typedef int64_t tb_uid_t;
#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 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
{
TSDB_SUPER_TABLE
=
1
,
// super table
TSDB_CHILD_TABLE
=
2
,
// table created from super table
...
...
include/common/ttokendef.h
浏览文件 @
d0469cc4
...
...
@@ -175,171 +175,172 @@
#define TK_CONSUMERS 157
#define TK_SUBSCRIPTIONS 158
#define TK_VNODES 159
#define TK_LIKE 160
#define TK_TBNAME 161
#define TK_QTAGS 162
#define TK_AS 163
#define TK_INDEX 164
#define TK_FUNCTION 165
#define TK_INTERVAL 166
#define TK_COUNT 167
#define TK_LAST_ROW 168
#define TK_TOPIC 169
#define TK_WITH 170
#define TK_META 171
#define TK_CONSUMER 172
#define TK_GROUP 173
#define TK_DESC 174
#define TK_DESCRIBE 175
#define TK_RESET 176
#define TK_QUERY 177
#define TK_CACHE 178
#define TK_EXPLAIN 179
#define TK_ANALYZE 180
#define TK_VERBOSE 181
#define TK_NK_BOOL 182
#define TK_RATIO 183
#define TK_NK_FLOAT 184
#define TK_OUTPUTTYPE 185
#define TK_AGGREGATE 186
#define TK_BUFSIZE 187
#define TK_STREAM 188
#define TK_INTO 189
#define TK_TRIGGER 190
#define TK_AT_ONCE 191
#define TK_WINDOW_CLOSE 192
#define TK_IGNORE 193
#define TK_EXPIRED 194
#define TK_FILL_HISTORY 195
#define TK_SUBTABLE 196
#define TK_KILL 197
#define TK_CONNECTION 198
#define TK_TRANSACTION 199
#define TK_BALANCE 200
#define TK_VGROUP 201
#define TK_MERGE 202
#define TK_REDISTRIBUTE 203
#define TK_SPLIT 204
#define TK_DELETE 205
#define TK_INSERT 206
#define TK_NULL 207
#define TK_NK_QUESTION 208
#define TK_NK_ARROW 209
#define TK_ROWTS 210
#define TK_QSTART 211
#define TK_QEND 212
#define TK_QDURATION 213
#define TK_WSTART 214
#define TK_WEND 215
#define TK_WDURATION 216
#define TK_IROWTS 217
#define TK_ISFILLED 218
#define TK_CAST 219
#define TK_NOW 220
#define TK_TODAY 221
#define TK_TIMEZONE 222
#define TK_CLIENT_VERSION 223
#define TK_SERVER_VERSION 224
#define TK_SERVER_STATUS 225
#define TK_CURRENT_USER 226
#define TK_CASE 227
#define TK_END 228
#define TK_WHEN 229
#define TK_THEN 230
#define TK_ELSE 231
#define TK_BETWEEN 232
#define TK_IS 233
#define TK_NK_LT 234
#define TK_NK_GT 235
#define TK_NK_LE 236
#define TK_NK_GE 237
#define TK_NK_NE 238
#define TK_MATCH 239
#define TK_NMATCH 240
#define TK_CONTAINS 241
#define TK_IN 242
#define TK_JOIN 243
#define TK_INNER 244
#define TK_SELECT 245
#define TK_DISTINCT 246
#define TK_WHERE 247
#define TK_PARTITION 248
#define TK_BY 249
#define TK_SESSION 250
#define TK_STATE_WINDOW 251
#define TK_EVENT_WINDOW 252
#define TK_START 253
#define TK_SLIDING 254
#define TK_FILL 255
#define TK_VALUE 256
#define TK_NONE 257
#define TK_PREV 258
#define TK_LINEAR 259
#define TK_NEXT 260
#define TK_HAVING 261
#define TK_RANGE 262
#define TK_EVERY 263
#define TK_ORDER 264
#define TK_SLIMIT 265
#define TK_SOFFSET 266
#define TK_LIMIT 267
#define TK_OFFSET 268
#define TK_ASC 269
#define TK_NULLS 270
#define TK_ABORT 271
#define TK_AFTER 272
#define TK_ATTACH 273
#define TK_BEFORE 274
#define TK_BEGIN 275
#define TK_BITAND 276
#define TK_BITNOT 277
#define TK_BITOR 278
#define TK_BLOCKS 279
#define TK_CHANGE 280
#define TK_COMMA 281
#define TK_COMPACT 282
#define TK_CONCAT 283
#define TK_CONFLICT 284
#define TK_COPY 285
#define TK_DEFERRED 286
#define TK_DELIMITERS 287
#define TK_DETACH 288
#define TK_DIVIDE 289
#define TK_DOT 290
#define TK_EACH 291
#define TK_FAIL 292
#define TK_FILE 293
#define TK_FOR 294
#define TK_GLOB 295
#define TK_ID 296
#define TK_IMMEDIATE 297
#define TK_IMPORT 298
#define TK_INITIALLY 299
#define TK_INSTEAD 300
#define TK_ISNULL 301
#define TK_KEY 302
#define TK_MODULES 303
#define TK_NK_BITNOT 304
#define TK_NK_SEMI 305
#define TK_NOTNULL 306
#define TK_OF 307
#define TK_PLUS 308
#define TK_PRIVILEGE 309
#define TK_RAISE 310
#define TK_REPLACE 311
#define TK_RESTRICT 312
#define TK_ROW 313
#define TK_SEMI 314
#define TK_STAR 315
#define TK_STATEMENT 316
#define TK_STRICT 317
#define TK_STRING 318
#define TK_TIMES 319
#define TK_UPDATE 320
#define TK_VALUES 321
#define TK_VARIABLE 322
#define TK_VIEW 323
#define TK_WAL 324
#define TK_ALIVE 160
#define TK_LIKE 161
#define TK_TBNAME 162
#define TK_QTAGS 163
#define TK_AS 164
#define TK_INDEX 165
#define TK_FUNCTION 166
#define TK_INTERVAL 167
#define TK_COUNT 168
#define TK_LAST_ROW 169
#define TK_TOPIC 170
#define TK_WITH 171
#define TK_META 172
#define TK_CONSUMER 173
#define TK_GROUP 174
#define TK_DESC 175
#define TK_DESCRIBE 176
#define TK_RESET 177
#define TK_QUERY 178
#define TK_CACHE 179
#define TK_EXPLAIN 180
#define TK_ANALYZE 181
#define TK_VERBOSE 182
#define TK_NK_BOOL 183
#define TK_RATIO 184
#define TK_NK_FLOAT 185
#define TK_OUTPUTTYPE 186
#define TK_AGGREGATE 187
#define TK_BUFSIZE 188
#define TK_STREAM 189
#define TK_INTO 190
#define TK_TRIGGER 191
#define TK_AT_ONCE 192
#define TK_WINDOW_CLOSE 193
#define TK_IGNORE 194
#define TK_EXPIRED 195
#define TK_FILL_HISTORY 196
#define TK_SUBTABLE 197
#define TK_KILL 198
#define TK_CONNECTION 199
#define TK_TRANSACTION 200
#define TK_BALANCE 201
#define TK_VGROUP 202
#define TK_MERGE 203
#define TK_REDISTRIBUTE 204
#define TK_SPLIT 205
#define TK_DELETE 206
#define TK_INSERT 207
#define TK_NULL 208
#define TK_NK_QUESTION 209
#define TK_NK_ARROW 210
#define TK_ROWTS 211
#define TK_QSTART 212
#define TK_QEND 213
#define TK_QDURATION 214
#define TK_WSTART 215
#define TK_WEND 216
#define TK_WDURATION 217
#define TK_IROWTS 218
#define TK_ISFILLED 219
#define TK_CAST 220
#define TK_NOW 221
#define TK_TODAY 222
#define TK_TIMEZONE 223
#define TK_CLIENT_VERSION 224
#define TK_SERVER_VERSION 225
#define TK_SERVER_STATUS 226
#define TK_CURRENT_USER 227
#define TK_CASE 228
#define TK_END 229
#define TK_WHEN 230
#define TK_THEN 231
#define TK_ELSE 232
#define TK_BETWEEN 233
#define TK_IS 234
#define TK_NK_LT 235
#define TK_NK_GT 236
#define TK_NK_LE 237
#define TK_NK_GE 238
#define TK_NK_NE 239
#define TK_MATCH 240
#define TK_NMATCH 241
#define TK_CONTAINS 242
#define TK_IN 243
#define TK_JOIN 244
#define TK_INNER 245
#define TK_SELECT 246
#define TK_DISTINCT 247
#define TK_WHERE 248
#define TK_PARTITION 249
#define TK_BY 250
#define TK_SESSION 251
#define TK_STATE_WINDOW 252
#define TK_EVENT_WINDOW 253
#define TK_START 254
#define TK_SLIDING 255
#define TK_FILL 256
#define TK_VALUE 257
#define TK_NONE 258
#define TK_PREV 259
#define TK_LINEAR 260
#define TK_NEXT 261
#define TK_HAVING 262
#define TK_RANGE 263
#define TK_EVERY 264
#define TK_ORDER 265
#define TK_SLIMIT 266
#define TK_SOFFSET 267
#define TK_LIMIT 268
#define TK_OFFSET 269
#define TK_ASC 270
#define TK_NULLS 271
#define TK_ABORT 272
#define TK_AFTER 273
#define TK_ATTACH 274
#define TK_BEFORE 275
#define TK_BEGIN 276
#define TK_BITAND 277
#define TK_BITNOT 278
#define TK_BITOR 279
#define TK_BLOCKS 280
#define TK_CHANGE 281
#define TK_COMMA 282
#define TK_COMPACT 283
#define TK_CONCAT 284
#define TK_CONFLICT 285
#define TK_COPY 286
#define TK_DEFERRED 287
#define TK_DELIMITERS 288
#define TK_DETACH 289
#define TK_DIVIDE 290
#define TK_DOT 291
#define TK_EACH 292
#define TK_FAIL 293
#define TK_FILE 294
#define TK_FOR 295
#define TK_GLOB 296
#define TK_ID 297
#define TK_IMMEDIATE 298
#define TK_IMPORT 299
#define TK_INITIALLY 300
#define TK_INSTEAD 301
#define TK_ISNULL 302
#define TK_KEY 303
#define TK_MODULES 304
#define TK_NK_BITNOT 305
#define TK_NK_SEMI 306
#define TK_NOTNULL 307
#define TK_OF 308
#define TK_PLUS 309
#define TK_PRIVILEGE 310
#define TK_RAISE 311
#define TK_REPLACE 312
#define TK_RESTRICT 313
#define TK_ROW 314
#define TK_SEMI 315
#define TK_STAR 316
#define TK_STATEMENT 317
#define TK_STRICT 318
#define TK_STRING 319
#define TK_TIMES 320
#define TK_UPDATE 321
#define TK_VALUES 322
#define TK_VARIABLE 323
#define TK_VIEW 324
#define TK_WAL 325
#define TK_NK_SPACE 600
#define TK_NK_COMMENT 601
...
...
include/libs/command/command.h
浏览文件 @
d0469cc4
...
...
@@ -22,7 +22,7 @@
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
qExecExplainBegin
(
SQueryPlan
*
pDag
,
SExplainCtx
**
pCtx
,
int64_t
startTs
);
...
...
include/libs/nodes/cmdnodes.h
浏览文件 @
d0469cc4
...
...
@@ -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_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_ALL PRIVILEGE_TYPE_MASK(0)
...
...
@@ -262,6 +263,11 @@ typedef struct SShowCreateDatabaseStmt {
void
*
pCfg
;
// SDbCfgInfo
}
SShowCreateDatabaseStmt
;
typedef
struct
SShowAliveStmt
{
ENodeType
type
;
char
dbName
[
TSDB_DB_NAME_LEN
];
}
SShowAliveStmt
;
typedef
struct
SShowCreateTableStmt
{
ENodeType
type
;
char
dbName
[
TSDB_DB_NAME_LEN
];
...
...
include/libs/nodes/nodes.h
浏览文件 @
d0469cc4
...
...
@@ -208,6 +208,8 @@ typedef enum ENodeType {
QUERY_NODE_DELETE_STMT
,
QUERY_NODE_INSERT_STMT
,
QUERY_NODE_QUERY
,
QUERY_NODE_SHOW_DB_ALIVE_STMT
,
QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT
,
// logic plan node
QUERY_NODE_LOGIC_PLAN_SCAN
=
1000
,
...
...
source/client/src/clientImpl.c
浏览文件 @
d0469cc4
...
...
@@ -272,7 +272,7 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtC
int32_t
execLocalCmd
(
SRequestObj
*
pRequest
,
SQuery
*
pQuery
)
{
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
)
{
code
=
setQueryResultFromRsp
(
&
pRequest
->
body
.
resInfo
,
pRsp
,
false
,
true
);
}
...
...
@@ -310,7 +310,7 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
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
)
{
code
=
setQueryResultFromRsp
(
&
pRequest
->
body
.
resInfo
,
pRsp
,
false
,
true
);
}
...
...
source/libs/command/src/command.c
浏览文件 @
d0469cc4
...
...
@@ -21,6 +21,7 @@
#include "tdatablock.h"
#include "tglobal.h"
#include "tgrant.h"
#include "taosdef.h"
extern
SConfig
*
tsCfg
;
...
...
@@ -153,6 +154,23 @@ static int32_t buildCreateDBResultDataBlock(SSDataBlock** pOutput) {
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
v
=
0
;
switch
(
unit
)
{
...
...
@@ -280,6 +298,108 @@ static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbFName, S
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
)
{
SSDataBlock
*
pBlock
=
NULL
;
int32_t
code
=
buildCreateDBResultDataBlock
(
&
pBlock
);
...
...
@@ -735,7 +855,7 @@ static int32_t execSelectWithoutFrom(SSelectStmt* pSelect, SRetrieveTableRsp** p
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
))
{
case
QUERY_NODE_DESCRIBE_STMT
:
return
execDescribe
(
sysInfoUser
,
pStmt
,
pRsp
);
...
...
@@ -753,6 +873,9 @@ int32_t qExecCommand(bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp) {
return
execShowLocalVariables
(
pRsp
);
case
QUERY_NODE_SELECT_STMT
:
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:
break
;
}
...
...
source/libs/nodes/src/nodesCodeFuncs.c
浏览文件 @
d0469cc4
...
...
@@ -173,6 +173,10 @@ const char* nodesNodeName(ENodeType type) {
return
"BalanceVgroupStmt"
;
case
QUERY_NODE_MERGE_VGROUP_STMT
:
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
:
return
"RedistributeVgroupStmt"
;
case
QUERY_NODE_SPLIT_VGROUP_STMT
:
...
...
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
d0469cc4
...
...
@@ -434,6 +434,9 @@ SNode* nodesMakeNode(ENodeType type) {
return
makeNode
(
type
,
sizeof
(
SShowDnodeVariablesStmt
));
case
QUERY_NODE_SHOW_CREATE_DATABASE_STMT
:
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_STABLE_STMT
:
return
makeNode
(
type
,
sizeof
(
SShowCreateTableStmt
));
...
...
@@ -960,6 +963,8 @@ void nodesDestroyNode(SNode* pNode) {
case
QUERY_NODE_SHOW_USERS_STMT
:
case
QUERY_NODE_SHOW_LICENCES_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_CONSUMERS_STMT
:
case
QUERY_NODE_SHOW_CONNECTIONS_STMT
:
...
...
source/libs/parser/inc/parAst.h
浏览文件 @
d0469cc4
...
...
@@ -176,6 +176,7 @@ SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type);
SNode
*
createShowStmtWithCond
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
SNode
*
pDbName
,
SNode
*
pTbName
,
EOperatorType
tableCondType
);
SNode
*
createShowCreateDatabaseStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pDbName
);
SNode
*
createShowAliveStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pDbName
,
ENodeType
type
);
SNode
*
createShowCreateTableStmt
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
SNode
*
pRealTable
);
SNode
*
createShowTableDistributedStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
);
SNode
*
createShowDnodeVariablesStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pDnodeId
,
SNode
*
pLikePattern
);
...
...
source/libs/parser/inc/sql.y
浏览文件 @
d0469cc4
...
...
@@ -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 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)); }
// 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) ::= db_name(B) NK_DOT. { A = createIdentifierValueNode(pCxt, &B); }
...
...
source/libs/parser/src/parAstCreater.c
浏览文件 @
d0469cc4
...
...
@@ -1370,6 +1370,38 @@ SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) {
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
)
{
CHECK_PARSER_STATUS
(
pCxt
);
SShowCreateTableStmt
*
pStmt
=
(
SShowCreateTableStmt
*
)
nodesMakeNode
(
type
);
...
...
source/libs/parser/src/parAuthenticator.c
浏览文件 @
d0469cc4
...
...
@@ -145,6 +145,8 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
case
QUERY_NODE_SHOW_CLUSTER_STMT
:
case
QUERY_NODE_SHOW_LICENCES_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_TABLE_DISTRIBUTED_STMT
:
case
QUERY_NODE_SHOW_VNODES_STMT
:
...
...
source/libs/parser/src/parTokenizer.c
浏览文件 @
d0469cc4
...
...
@@ -269,6 +269,7 @@ static SKeyword keywordTable[] = {
{
"_WDURATION"
,
TK_WDURATION
},
{
"_WEND"
,
TK_WEND
},
{
"_WSTART"
,
TK_WSTART
},
{
"ALIVE"
,
TK_ALIVE
},
};
// clang-format on
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
d0469cc4
...
...
@@ -6364,6 +6364,20 @@ static int32_t extractShowCreateDatabaseResultSchema(int32_t* numOfCols, SSchema
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
)
{
*
numOfCols
=
2
;
*
pSchema
=
taosMemoryCalloc
((
*
numOfCols
),
sizeof
(
SSchema
));
...
...
@@ -6415,6 +6429,9 @@ int32_t extractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pS
return
extractDescribeResultSchema
(
numOfCols
,
pSchema
);
case
QUERY_NODE_SHOW_CREATE_DATABASE_STMT
:
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_STABLE_STMT
:
return
extractShowCreateTableResultSchema
(
numOfCols
,
pSchema
);
...
...
@@ -7934,6 +7951,8 @@ static int32_t setQuery(STranslateContext* pCxt, SQuery* pQuery) {
break
;
case
QUERY_NODE_DESCRIBE_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_STABLE_STMT
:
case
QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT
:
...
...
source/libs/parser/src/sql.c
浏览文件 @
d0469cc4
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
tests/pytest/util/sql.py
浏览文件 @
d0469cc4
...
...
@@ -261,6 +261,70 @@ class TDSql:
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
):
self
.
checkRowCol
(
row
,
col
)
return
self
.
queryResult
[
row
][
col
]
...
...
tests/system-test/6-cluster/5dnode1mnode.py
浏览文件 @
d0469cc4
...
...
@@ -137,11 +137,34 @@ class TDTestCase:
config_dir
=
dnode
.
cfgDir
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
):
# print(self.master_dnode.cfgDict)
self
.
five_dnode_one_mnode
()
# check cluster and db alive
self
.
check_alive
()
def
stop
(
self
):
tdSql
.
close
()
...
...
tools/shell/src/shellAuto.c
浏览文件 @
d0469cc4
...
...
@@ -138,6 +138,7 @@ SWords shellCommands[] = {
{
"show create table <tb_name>
\\
G;"
,
0
,
0
,
NULL
},
{
"show connections;"
,
0
,
0
,
NULL
},
{
"show cluster;"
,
0
,
0
,
NULL
},
{
"show cluster alive;"
,
0
,
0
,
NULL
},
{
"show databases;"
,
0
,
0
,
NULL
},
{
"show dnodes;"
,
0
,
0
,
NULL
},
{
"show dnode <dnode_id> variables;"
,
0
,
0
,
NULL
},
...
...
@@ -425,6 +426,7 @@ void showHelp() {
show create table <tb_name>;
\n
\
show connections;
\n
\
show cluster;
\n
\
show cluster alive;
\n
\
show databases;
\n
\
show dnodes;
\n
\
show dnode <dnode_id> variables;
\n
\
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录