feat: support show views command

This commit is contained in:
dapan1121 2023-10-09 17:19:36 +08:00
parent 5b639a172d
commit 6c8db261f3
18 changed files with 3850 additions and 3841 deletions

View File

@ -49,6 +49,7 @@ extern "C" {
#define TSDB_INS_TABLE_STREAMS "ins_streams"
#define TSDB_INS_TABLE_STREAM_TASKS "ins_stream_tasks"
#define TSDB_INS_TABLE_USER_PRIVILEGES "ins_user_privileges"
#define TSDB_INS_TABLE_VIEWS "ins_views"
#define TSDB_PERFORMANCE_SCHEMA_DB "performance_schema"
#define TSDB_PERFS_TABLE_SMAS "perf_smas"

View File

@ -335,6 +335,7 @@ typedef enum ENodeType {
QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT,
QUERY_NODE_SHOW_VNODES_STMT,
QUERY_NODE_SHOW_USER_PRIVILEGES_STMT,
QUERY_NODE_SHOW_VIEWS_STMT,
QUERY_NODE_SHOW_CREATE_DATABASE_STMT,
QUERY_NODE_SHOW_CREATE_TABLE_STMT,
QUERY_NODE_SHOW_CREATE_STABLE_STMT,

View File

@ -186,179 +186,177 @@
#define TK_SUBSCRIPTIONS 167
#define TK_VNODES 168
#define TK_ALIVE 169
#define TK_LIKE 170
#define TK_TBNAME 171
#define TK_QTAGS 172
#define TK_AS 173
#define TK_INDEX 174
#define TK_FUNCTION 175
#define TK_INTERVAL 176
#define TK_COUNT 177
#define TK_LAST_ROW 178
#define TK_META 179
#define TK_ONLY 180
#define TK_TOPIC 181
#define TK_CONSUMER 182
#define TK_GROUP 183
#define TK_DESC 184
#define TK_DESCRIBE 185
#define TK_RESET 186
#define TK_QUERY 187
#define TK_CACHE 188
#define TK_EXPLAIN 189
#define TK_ANALYZE 190
#define TK_VERBOSE 191
#define TK_NK_BOOL 192
#define TK_RATIO 193
#define TK_NK_FLOAT 194
#define TK_OUTPUTTYPE 195
#define TK_AGGREGATE 196
#define TK_BUFSIZE 197
#define TK_LANGUAGE 198
#define TK_REPLACE 199
#define TK_VIEW 200
#define TK_STREAM 201
#define TK_INTO 202
#define TK_PAUSE 203
#define TK_RESUME 204
#define TK_TRIGGER 205
#define TK_AT_ONCE 206
#define TK_WINDOW_CLOSE 207
#define TK_IGNORE 208
#define TK_EXPIRED 209
#define TK_FILL_HISTORY 210
#define TK_UPDATE 211
#define TK_SUBTABLE 212
#define TK_UNTREATED 213
#define TK_KILL 214
#define TK_CONNECTION 215
#define TK_TRANSACTION 216
#define TK_BALANCE 217
#define TK_VGROUP 218
#define TK_LEADER 219
#define TK_MERGE 220
#define TK_REDISTRIBUTE 221
#define TK_SPLIT 222
#define TK_DELETE 223
#define TK_INSERT 224
#define TK_NULL 225
#define TK_NK_QUESTION 226
#define TK_NK_ARROW 227
#define TK_ROWTS 228
#define TK_QSTART 229
#define TK_QEND 230
#define TK_QDURATION 231
#define TK_WSTART 232
#define TK_WEND 233
#define TK_WDURATION 234
#define TK_IROWTS 235
#define TK_ISFILLED 236
#define TK_CAST 237
#define TK_NOW 238
#define TK_TODAY 239
#define TK_TIMEZONE 240
#define TK_CLIENT_VERSION 241
#define TK_SERVER_VERSION 242
#define TK_SERVER_STATUS 243
#define TK_CURRENT_USER 244
#define TK_CASE 245
#define TK_WHEN 246
#define TK_THEN 247
#define TK_ELSE 248
#define TK_BETWEEN 249
#define TK_IS 250
#define TK_NK_LT 251
#define TK_NK_GT 252
#define TK_NK_LE 253
#define TK_NK_GE 254
#define TK_NK_NE 255
#define TK_MATCH 256
#define TK_NMATCH 257
#define TK_CONTAINS 258
#define TK_IN 259
#define TK_JOIN 260
#define TK_INNER 261
#define TK_SELECT 262
#define TK_NK_HINT 263
#define TK_DISTINCT 264
#define TK_WHERE 265
#define TK_PARTITION 266
#define TK_BY 267
#define TK_SESSION 268
#define TK_STATE_WINDOW 269
#define TK_EVENT_WINDOW 270
#define TK_SLIDING 271
#define TK_FILL 272
#define TK_VALUE 273
#define TK_VALUE_F 274
#define TK_NONE 275
#define TK_PREV 276
#define TK_NULL_F 277
#define TK_LINEAR 278
#define TK_NEXT 279
#define TK_HAVING 280
#define TK_RANGE 281
#define TK_EVERY 282
#define TK_ORDER 283
#define TK_SLIMIT 284
#define TK_SOFFSET 285
#define TK_LIMIT 286
#define TK_OFFSET 287
#define TK_ASC 288
#define TK_NULLS 289
#define TK_ABORT 290
#define TK_AFTER 291
#define TK_ATTACH 292
#define TK_BEFORE 293
#define TK_BEGIN 294
#define TK_BITAND 295
#define TK_BITNOT 296
#define TK_BITOR 297
#define TK_BLOCKS 298
#define TK_CHANGE 299
#define TK_COMMA 300
#define TK_CONCAT 301
#define TK_CONFLICT 302
#define TK_COPY 303
#define TK_DEFERRED 304
#define TK_DELIMITERS 305
#define TK_DETACH 306
#define TK_DIVIDE 307
#define TK_DOT 308
#define TK_EACH 309
#define TK_FAIL 310
#define TK_FILE 311
#define TK_FOR 312
#define TK_GLOB 313
#define TK_ID 314
#define TK_IMMEDIATE 315
#define TK_IMPORT 316
#define TK_INITIALLY 317
#define TK_INSTEAD 318
#define TK_ISNULL 319
#define TK_KEY 320
#define TK_MODULES 321
#define TK_NK_BITNOT 322
#define TK_NK_SEMI 323
#define TK_NOTNULL 324
#define TK_OF 325
#define TK_PLUS 326
#define TK_PRIVILEGE 327
#define TK_RAISE 328
#define TK_RESTRICT 329
#define TK_ROW 330
#define TK_SEMI 331
#define TK_STAR 332
#define TK_STATEMENT 333
#define TK_STRICT 334
#define TK_STRING 335
#define TK_TIMES 336
#define TK_VALUES 337
#define TK_VARIABLE 338
#define TK_WAL 339
#define TK_VIEWS 170
#define TK_LIKE 171
#define TK_TBNAME 172
#define TK_QTAGS 173
#define TK_AS 174
#define TK_INDEX 175
#define TK_FUNCTION 176
#define TK_INTERVAL 177
#define TK_COUNT 178
#define TK_LAST_ROW 179
#define TK_META 180
#define TK_ONLY 181
#define TK_TOPIC 182
#define TK_CONSUMER 183
#define TK_GROUP 184
#define TK_DESC 185
#define TK_DESCRIBE 186
#define TK_RESET 187
#define TK_QUERY 188
#define TK_CACHE 189
#define TK_EXPLAIN 190
#define TK_ANALYZE 191
#define TK_VERBOSE 192
#define TK_NK_BOOL 193
#define TK_RATIO 194
#define TK_NK_FLOAT 195
#define TK_OUTPUTTYPE 196
#define TK_AGGREGATE 197
#define TK_BUFSIZE 198
#define TK_LANGUAGE 199
#define TK_REPLACE 200
#define TK_VIEW 201
#define TK_STREAM 202
#define TK_INTO 203
#define TK_PAUSE 204
#define TK_RESUME 205
#define TK_TRIGGER 206
#define TK_AT_ONCE 207
#define TK_WINDOW_CLOSE 208
#define TK_IGNORE 209
#define TK_EXPIRED 210
#define TK_FILL_HISTORY 211
#define TK_UPDATE 212
#define TK_SUBTABLE 213
#define TK_UNTREATED 214
#define TK_KILL 215
#define TK_CONNECTION 216
#define TK_TRANSACTION 217
#define TK_BALANCE 218
#define TK_VGROUP 219
#define TK_LEADER 220
#define TK_MERGE 221
#define TK_REDISTRIBUTE 222
#define TK_SPLIT 223
#define TK_DELETE 224
#define TK_INSERT 225
#define TK_NULL 226
#define TK_NK_QUESTION 227
#define TK_NK_ARROW 228
#define TK_ROWTS 229
#define TK_QSTART 230
#define TK_QEND 231
#define TK_QDURATION 232
#define TK_WSTART 233
#define TK_WEND 234
#define TK_WDURATION 235
#define TK_IROWTS 236
#define TK_ISFILLED 237
#define TK_CAST 238
#define TK_NOW 239
#define TK_TODAY 240
#define TK_TIMEZONE 241
#define TK_CLIENT_VERSION 242
#define TK_SERVER_VERSION 243
#define TK_SERVER_STATUS 244
#define TK_CURRENT_USER 245
#define TK_CASE 246
#define TK_WHEN 247
#define TK_THEN 248
#define TK_ELSE 249
#define TK_BETWEEN 250
#define TK_IS 251
#define TK_NK_LT 252
#define TK_NK_GT 253
#define TK_NK_LE 254
#define TK_NK_GE 255
#define TK_NK_NE 256
#define TK_MATCH 257
#define TK_NMATCH 258
#define TK_CONTAINS 259
#define TK_IN 260
#define TK_JOIN 261
#define TK_INNER 262
#define TK_SELECT 263
#define TK_NK_HINT 264
#define TK_DISTINCT 265
#define TK_WHERE 266
#define TK_PARTITION 267
#define TK_BY 268
#define TK_SESSION 269
#define TK_STATE_WINDOW 270
#define TK_EVENT_WINDOW 271
#define TK_SLIDING 272
#define TK_FILL 273
#define TK_VALUE 274
#define TK_VALUE_F 275
#define TK_NONE 276
#define TK_PREV 277
#define TK_NULL_F 278
#define TK_LINEAR 279
#define TK_NEXT 280
#define TK_HAVING 281
#define TK_RANGE 282
#define TK_EVERY 283
#define TK_ORDER 284
#define TK_SLIMIT 285
#define TK_SOFFSET 286
#define TK_LIMIT 287
#define TK_OFFSET 288
#define TK_ASC 289
#define TK_NULLS 290
#define TK_ABORT 291
#define TK_AFTER 292
#define TK_ATTACH 293
#define TK_BEFORE 294
#define TK_BEGIN 295
#define TK_BITAND 296
#define TK_BITNOT 297
#define TK_BITOR 298
#define TK_BLOCKS 299
#define TK_CHANGE 300
#define TK_COMMA 301
#define TK_CONCAT 302
#define TK_CONFLICT 303
#define TK_COPY 304
#define TK_DEFERRED 305
#define TK_DELIMITERS 306
#define TK_DETACH 307
#define TK_DIVIDE 308
#define TK_DOT 309
#define TK_EACH 310
#define TK_FAIL 311
#define TK_FILE 312
#define TK_FOR 313
#define TK_GLOB 314
#define TK_ID 315
#define TK_IMMEDIATE 316
#define TK_IMPORT 317
#define TK_INITIALLY 318
#define TK_INSTEAD 319
#define TK_ISNULL 320
#define TK_KEY 321
#define TK_MODULES 322
#define TK_NK_BITNOT 323
#define TK_NK_SEMI 324
#define TK_NOTNULL 325
#define TK_OF 326
#define TK_PLUS 327
#define TK_PRIVILEGE 328
#define TK_RAISE 329
#define TK_RESTRICT 330
#define TK_ROW 331
#define TK_SEMI 332
#define TK_STAR 333
#define TK_STATEMENT 334
#define TK_STRICT 335
#define TK_STRING 336
#define TK_TIMES 337
#define TK_VALUES 338
#define TK_VARIABLE 339
#define TK_WAL 340
#define TK_NK_SPACE 600

View File

@ -24,6 +24,7 @@
#define SYSTABLE_SCH_TABLE_NAME_LEN ((TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE)
#define SYSTABLE_SCH_DB_NAME_LEN ((TSDB_DB_NAME_LEN - 1) + VARSTR_HEADER_SIZE)
#define SYSTABLE_SCH_COL_NAME_LEN ((TSDB_COL_NAME_LEN - 1) + VARSTR_HEADER_SIZE)
#define SYSTABLE_SCH_VIEW_NAME_LEN ((TSDB_VIEW_NAME_LEN - 1) + VARSTR_HEADER_SIZE)
// clang-format off
static const SSysDbTableSchema dnodesSchema[] = {
@ -312,6 +313,19 @@ static const SSysDbTableSchema userUserPrivilegesSchema[] = {
{.name = "condition", .bytes = TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
};
static const SSysDbTableSchema userViewsSchema[] = {
{.name = "view_name", .bytes = SYSTABLE_SCH_VIEW_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false},
{.name = "type", .bytes = 128 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "query_sql", .bytes = TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "column_list", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "parameters", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "default_values", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "target_table", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
};
static const SSysTableMeta infosMeta[] = {
{TSDB_INS_TABLE_DNODES, dnodesSchema, tListLen(dnodesSchema), true},
{TSDB_INS_TABLE_MNODES, mnodesSchema, tListLen(mnodesSchema), true},
@ -338,6 +352,7 @@ static const SSysTableMeta infosMeta[] = {
{TSDB_INS_TABLE_STREAM_TASKS, streamTaskSchema, tListLen(streamTaskSchema), false},
{TSDB_INS_TABLE_VNODES, vnodesSchema, tListLen(vnodesSchema), true},
{TSDB_INS_TABLE_USER_PRIVILEGES, userUserPrivilegesSchema, tListLen(userUserPrivilegesSchema), true},
{TSDB_INS_TABLE_VIEWS, userViewsSchema, tListLen(userViewsSchema), false},
};
static const SSysDbTableSchema connectionsSchema[] = {

View File

@ -728,16 +728,23 @@ void tFreeStreamObj(SStreamObj* pObj);
// SArray* childInfo; // SArray<SStreamChildEpInfo>
// } SStreamCheckpointObj;
#define VIEW_TYPE_UPDATABLE (1 << 0)
#define VIEW_TYPE_MATERIALIZED (1 << 1)
typedef struct {
char fullname[TSDB_VIEW_FNAME_LEN];
char name[TSDB_VIEW_NAME_LEN];
char dbFName[TSDB_DB_FNAME_LEN];
char* querySql;
char* parameters;
void** defaultValues;
char* targetTable;
uint64_t viewId;
uint64_t dbId;
int64_t createdTime;
int32_t version;
int8_t precision;
int8_t type;
int32_t numOfCols;
SSchema* pSchema;
SRWLatch lock;

View File

@ -43,7 +43,8 @@ int32_t mndViewActionUpdate(SSdb *pSdb, SViewObj *pOldView, SViewObj *pNewView);
int32_t mndProcessCreateViewReqImpl(SCMCreateViewReq* pCreateView, SRpcMsg *pReq);
int32_t mndProcessDropViewReqImpl(SCMDropViewReq* pDropView, SRpcMsg *pReq);
int32_t mndProcessViewMetaReqImpl(SViewMetaReq* pMetaReq, SRpcMsg *pReq);
int32_t mndRetrieveViewImpl(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
int32_t mndDropViewByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb);
#endif

View File

@ -28,6 +28,7 @@
#include "mndTrans.h"
#include "mndUser.h"
#include "mndVgroup.h"
#include "mndView.h"
#include "systable.h"
#include "tjson.h"
#include "thttp.h"
@ -1301,6 +1302,9 @@ static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
/*if (mndDropSubByDB(pMnode, pTrans, pDb) != 0) goto _OVER;*/
/*if (mndDropTopicByDB(pMnode, pTrans, pDb) != 0) goto _OVER;*/
if (mndDropStreamByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
#ifdef TD_ENTERPRISE
if (mndDropViewByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
#endif
if (mndDropSmasByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
if (mndDropIdxsByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
if (mndSetDropDbRedoActions(pMnode, pTrans, pDb) != 0) goto _OVER;

View File

@ -116,6 +116,8 @@ static int32_t convertToRetrieveType(char *name, int32_t len) {
type = TSDB_MGMT_TABLE_STREAM_TASKS;
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_PRIVILEGES, len) == 0) {
type = TSDB_MGMT_TABLE_PRIVILEGES;
} else if (strncasecmp(name, TSDB_INS_TABLE_VIEWS, len) == 0) {
type = TSDB_MGMT_TABLE_VIEWS;
} else {
mError("invalid show name:%s len:%d", name, len);
}

View File

@ -94,78 +94,10 @@ int32_t mndProcessGetViewMetaReq(SRpcMsg *pReq) {
int32_t mndRetrieveView(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
#if 0
SMnode *pMnode = pReq->info.node;
SSdb *pSdb = pMnode->pSdb;
int32_t numOfRows = 0;
SViewObj *pView = NULL;
while (numOfRows < rows) {
pShow->pIter = sdbFetch(pSdb, SDB_VIEW, pShow->pIter, (void **)&pView);
if (pShow->pIter == NULL) break;
SColumnInfoData *pColInfo;
SName n;
int32_t cols = 0;
char viewName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
STR_WITH_MAXSIZE_TO_VARSTR(viewName, mndGetDbStr(pView->name), sizeof(viewName));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)viewName, false);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)&pView->createTime, false);
char sql[TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE] = {0};
STR_WITH_MAXSIZE_TO_VARSTR(sql, pView->sql, sizeof(sql));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)sql, false);
char status[20 + VARSTR_HEADER_SIZE] = {0};
char status2[20] = {0};
mndShowViewStatus(status2, pView);
STR_WITH_MAXSIZE_TO_VARSTR(status, status2, sizeof(status));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)&status, false);
char sourceDB[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
STR_WITH_MAXSIZE_TO_VARSTR(sourceDB, mndGetDbStr(pView->sourceDb), sizeof(sourceDB));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)&sourceDB, false);
char targetDB[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
STR_WITH_MAXSIZE_TO_VARSTR(targetDB, mndGetDbStr(pView->targetDb), sizeof(targetDB));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)&targetDB, false);
if (pView->targetSTbName[0] == 0) {
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, NULL, true);
} else {
char targetSTB[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
STR_WITH_MAXSIZE_TO_VARSTR(targetSTB, mndGetStbStr(pView->targetSTbName), sizeof(targetSTB));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)&targetSTB, false);
}
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)&pView->conf.watermark, false);
char trigger[20 + VARSTR_HEADER_SIZE] = {0};
char trigger2[20] = {0};
mndShowViewTrigger(trigger2, pView);
STR_WITH_MAXSIZE_TO_VARSTR(trigger, trigger2, sizeof(trigger));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataSetVal(pColInfo, numOfRows, (const char *)&trigger, false);
numOfRows++;
sdbRelease(pSdb, pView);
}
pShow->numOfRows += numOfRows;
return numOfRows;
#else
#ifndef TD_ENTERPRISE
return 0;
#else
return mndRetrieveViewImpl(pReq, pShow, pBlock, rows);
#endif
}

View File

@ -320,6 +320,11 @@ int32_t ctgdHandleDbgCommand(char *command) {
CTG_RET(TSDB_CODE_INVALID_PARA);
}
if (NULL == param || NULL == option) {
taosMemoryFree(dup);
CTG_RET(TSDB_CODE_INVALID_PARA);
}
bool enable = atoi(param);
int32_t code = ctgdEnableDebug(option, enable);

View File

@ -438,6 +438,7 @@ SNode* nodesMakeNode(ENodeType type) {
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
case QUERY_NODE_SHOW_TAGS_STMT:
case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
case QUERY_NODE_SHOW_VIEWS_STMT:
return makeNode(type, sizeof(SShowStmt));
case QUERY_NODE_SHOW_TABLE_TAGS_STMT:
return makeNode(type, sizeof(SShowTableTagsStmt));

View File

@ -500,6 +500,7 @@ cmd ::= SHOW VNODES.
// 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); }
cmd ::= SHOW db_name_cond_opt(A) VIEWS. { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VIEWS_STMT, A, NULL, OP_TYPE_LIKE); }
db_name_cond_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); }
db_name_cond_opt(A) ::= db_name(B) NK_DOT. { A = createIdentifierValueNode(pCxt, &B); }

View File

@ -1569,7 +1569,8 @@ SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) {
static bool needDbShowStmt(ENodeType type) {
return QUERY_NODE_SHOW_TABLES_STMT == type || QUERY_NODE_SHOW_STABLES_STMT == type ||
QUERY_NODE_SHOW_VGROUPS_STMT == type || QUERY_NODE_SHOW_INDEXES_STMT == type ||
QUERY_NODE_SHOW_TAGS_STMT == type || QUERY_NODE_SHOW_TABLE_TAGS_STMT == type;
QUERY_NODE_SHOW_TAGS_STMT == type || QUERY_NODE_SHOW_TABLE_TAGS_STMT == type ||
QUERY_NODE_SHOW_VIEWS_STMT == type;
}
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type) {
@ -2166,7 +2167,11 @@ SNode* createCreateViewStmt(SAstCreateContext* pCxt, bool orReplace, SNode* pVie
CHECK_PARSER_STATUS(pCxt);
SCreateViewStmt* pStmt = (SCreateViewStmt*)nodesMakeNode(QUERY_NODE_CREATE_VIEW_STMT);
CHECK_OUT_OF_MEM(pStmt);
pStmt->pQuerySql = strdup(pAs->z + pAs->n);
int32_t i = pAs->n;
while (isspace(*(pAs->z + i))) {
++i;
}
pStmt->pQuerySql = strdup(pAs->z + i);
CHECK_OUT_OF_MEM(pStmt->pQuerySql);
strcpy(pStmt->dbName, ((SViewNode*)pView)->table.dbName);
strcpy(pStmt->viewName, ((SViewNode*)pView)->table.tableName);

View File

@ -583,6 +583,18 @@ static int32_t collectMetaKeyFromShowUserPrivileges(SCollectMetaKeyCxt* pCxt, SS
pCxt->pMetaCache);
}
static int32_t collectMetaKeyFromShowViews(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VIEWS,
pCxt->pMetaCache);
if (TSDB_CODE_SUCCESS == code) {
code =
reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
}
return code;
}
static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SShowCreateDatabaseStmt* pStmt) {
return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
}
@ -764,6 +776,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
return collectMetaKeyFromShowVnodes(pCxt, (SShowVnodesStmt*)pStmt);
case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
return collectMetaKeyFromShowUserPrivileges(pCxt, (SShowStmt*)pStmt);
case QUERY_NODE_SHOW_VIEWS_STMT:
return collectMetaKeyFromShowViews(pCxt, (SShowStmt*)pStmt);
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
return collectMetaKeyFromShowCreateDatabase(pCxt, (SShowCreateDatabaseStmt*)pStmt);
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:

View File

@ -264,6 +264,7 @@ static SKeyword keywordTable[] = {
{"VGROUP", TK_VGROUP},
{"VGROUPS", TK_VGROUPS},
{"VIEW", TK_VIEW},
{"VIEWS", TK_VIEWS},
{"VNODE", TK_VNODE},
{"VNODES", TK_VNODES},
{"WAL_FSYNC_PERIOD", TK_WAL_FSYNC_PERIOD},

View File

@ -250,6 +250,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = {
.numOfShowCols = 1,
.pShowCols = {"*"}
},
{ .showType = QUERY_NODE_SHOW_VIEWS_STMT,
.pDbName = TSDB_INFORMATION_SCHEMA_DB,
.pTableName = TSDB_INS_TABLE_VIEWS,
.numOfShowCols = 1,
.pShowCols = {"*"}
},
};
// clang-format on
@ -343,7 +349,11 @@ static int32_t getTableMetaImpl(STranslateContext* pCxt, const SName* pName, STa
code = getTableMetaFromCache(pCxt->pMetaCache, pName, pMeta);
#ifdef TD_ENTERPRISE
if (TSDB_CODE_SUCCESS != code) {
int32_t origCode = code;
code = getViewMetaFromCache(pCxt->pMetaCache, pName, pMeta);
if (TSDB_CODE_SUCCESS != code) {
code = origCode;
}
}
#endif
} else {
@ -9335,6 +9345,7 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) {
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
case QUERY_NODE_SHOW_TAGS_STMT:
case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
case QUERY_NODE_SHOW_VIEWS_STMT:
code = rewriteShow(pCxt, pQuery);
break;
case QUERY_NODE_SHOW_VGROUPS_STMT:

File diff suppressed because it is too large Load Diff

View File

@ -110,6 +110,10 @@ void generateInformationSchema(MockCatalogService* mcs) {
.addColumn("user_name", TSDB_DATA_TYPE_BINARY, TSDB_USER_LEN)
.addColumn("privilege", TSDB_DATA_TYPE_BINARY, 10)
.done();
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VIEWS, TSDB_SYSTEM_TABLE, 2)
.addColumn("view_name", TSDB_DATA_TYPE_BINARY, TSDB_VIEW_NAME_LEN)
.addColumn("create_time", TSDB_DATA_TYPE_TIMESTAMP)
.done();
}
void generatePerformanceSchema(MockCatalogService* mcs) {