• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4348

21 Jun 2025 07:48AM UTC coverage: 62.366% (+1.8%) from 60.571%
#4348

push

travis-ci

web-flow
docs: add OpenMetrics support and configuration details to taosAdapter documentation (#31427)

* docs: add OpenMetrics support and configuration details to taosAdapter documentation

* docs: enhance OpenMetrics section in taosAdapter documentation

156282 of 319947 branches covered (48.85%)

Branch coverage included in aggregate %.

242147 of 318911 relevant lines covered (75.93%)

6151642.33 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.56
/source/libs/parser/src/parAstParser.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#include "functionMgt.h"
17
#include "os.h"
18
#include "parAst.h"
19
#include "parInt.h"
20
#include "parToken.h"
21
#include "systable.h"
22
#include "tglobal.h"
23

24
typedef void* (*FMalloc)(size_t);
25
typedef void (*FFree)(void*);
26

27
extern void* ParseAlloc(FMalloc);
28
extern void  Parse(void*, int, SToken, void*);
29
extern void  ParseFree(void*, FFree);
30
extern void  ParseTrace(FILE*, char*);
31

32
int32_t buildQueryAfterParse(SQuery** pQuery, SNode* pRootNode, int16_t placeholderNo, SArray** pPlaceholderValues) {
1,210,868✔
33
  *pQuery = NULL;
1,210,868✔
34
  int32_t code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)pQuery);
1,210,868✔
35
  if (NULL == *pQuery) {
1,210,944!
36
    return code;
×
37
  }
38
  (*pQuery)->pRoot = pRootNode;
1,210,944✔
39
  (*pQuery)->placeholderNum = placeholderNo;
1,210,944✔
40
  TSWAP((*pQuery)->pPlaceholderValues, *pPlaceholderValues);
1,210,944✔
41
  (*pQuery)->execStage = QUERY_EXEC_STAGE_ANALYSE;
1,210,944✔
42

43
  return TSDB_CODE_SUCCESS;
1,210,944✔
44
}
45

46
int32_t parse(SParseContext* pParseCxt, SQuery** pQuery) {
1,243,931✔
47
  SAstCreateContext cxt;
48
  initAstCreateContext(pParseCxt, &cxt);
1,243,931✔
49
  void* pParser = ParseAlloc((FMalloc)taosMemMalloc);
1,243,988✔
50
  if (!pParser) return terrno;
1,243,927!
51
  int32_t i = 0;
1,243,927✔
52
  while (1) {
71,523,137✔
53
    SToken t0 = {0};
72,767,064✔
54
    if (cxt.pQueryCxt->pSql[i] == 0) {
72,767,064✔
55
      Parse(pParser, 0, t0, &cxt);
927,425✔
56
      goto abort_parse;
1,248,805✔
57
    }
58
    if (!pParseCxt->hasDupQuoteChar) {
71,839,639✔
59
      char dupQuoteChar = 0;
71,834,998✔
60
      t0.n = tGetToken((char*)&cxt.pQueryCxt->pSql[i], &t0.type, &dupQuoteChar);
71,834,998✔
61
      if (dupQuoteChar) pParseCxt->hasDupQuoteChar = true;
71,836,309✔
62
    } else {
63
      t0.n = tGetToken((char*)&cxt.pQueryCxt->pSql[i], &t0.type, NULL);
4,641✔
64
    }
65
    t0.z = (char*)(cxt.pQueryCxt->pSql + i);
71,841,141✔
66
    i += t0.n;
71,841,141✔
67

68
    switch (t0.type) {
71,841,141!
69
      case TK_NK_SPACE:
24,465,064✔
70
      case TK_NK_COMMENT: {
71
        break;
24,465,064✔
72
      }
73
      case TK_NK_SEMI: {
285,625✔
74
        Parse(pParser, 0, t0, &cxt);
285,625✔
75
        goto abort_parse;
285,625✔
76
      }
77
      case TK_NK_ILLEGAL: {
1,941✔
78
        snprintf(cxt.pQueryCxt->pMsg, cxt.pQueryCxt->msgLen, "unrecognized token: \"%s\"", t0.z);
1,941✔
79
        cxt.errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
1,941✔
80
        goto abort_parse;
1,941✔
81
      }
82
      case TK_NK_OCT: {
×
83
        snprintf(cxt.pQueryCxt->pMsg, cxt.pQueryCxt->msgLen, "unsupported token: \"%s\"", t0.z);
×
84
        cxt.errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
×
85
        goto abort_parse;
×
86
      }
87
      default:
47,088,511✔
88
        // ParseTrace(stdout, "");
89
        Parse(pParser, t0.type, t0, &cxt);
47,088,511✔
90
        if (TSDB_CODE_SUCCESS != cxt.errCode) {
47,091,944✔
91
          goto abort_parse;
33,871✔
92
        }
93
    }
94
  }
95

96
abort_parse:
1,248,805✔
97
  ParseFree(pParser, (FFree)taosAutoMemoryFree);
1,248,805✔
98
  if (TSDB_CODE_SUCCESS == cxt.errCode) {
1,243,956✔
99
    int32_t code = buildQueryAfterParse(pQuery, cxt.pRootNode, cxt.placeholderNo, &cxt.pPlaceholderValues);
1,210,992✔
100
    if (TSDB_CODE_SUCCESS != code) {
1,210,984!
101
      return code;
×
102
    }
103
  }
104
  taosArrayDestroy(cxt.pPlaceholderValues);
1,243,948✔
105
  return cxt.errCode;
1,243,943✔
106
}
107

108
typedef struct SCollectMetaKeyCxt {
109
  SParseContext*   pParseCxt;
110
  SParseMetaCache* pMetaCache;
111
  SNode*           pStmt;
112
  bool             collectVSubTables;
113
  bool             collectVStbRefDbs;
114
} SCollectMetaKeyCxt;
115

116
typedef struct SCollectMetaKeyFromExprCxt {
117
  SCollectMetaKeyCxt* pComCxt;
118
  bool                hasLastRowOrLast;
119
  bool                tbnameCollect;
120
  int32_t             errCode;
121
} SCollectMetaKeyFromExprCxt;
122

123
static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt);
124

125
static EDealRes collectMetaKeyFromFunction(SCollectMetaKeyFromExprCxt* pCxt, SFunctionNode* pFunc) {
3,301,817✔
126
  switch (fmGetFuncType(pFunc->functionName)) {
3,301,817✔
127
    case FUNCTION_TYPE_LAST_ROW:
66,631✔
128
    case FUNCTION_TYPE_LAST:
129
      pCxt->hasLastRowOrLast = true;
66,631✔
130
      break;
66,631✔
131
    case FUNCTION_TYPE_UDF:
214✔
132
      pCxt->errCode = reserveUdfInCache(pFunc->functionName, pCxt->pComCxt->pMetaCache);
214✔
133
      break;
216✔
134
    default:
3,234,980✔
135
      break;
3,234,980✔
136
  }
137
  return TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
3,301,827!
138
}
139

140
static bool needGetTableIndex(SNode* pStmt) {
1,107,045✔
141
  if (QUERY_SMA_OPTIMIZE_ENABLE == tsQuerySmaOptimize && QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
1,107,045!
142
    SSelectStmt* pSelect = (SSelectStmt*)pStmt;
1,728✔
143
    return (NULL != pSelect->pWindow && QUERY_NODE_INTERVAL_WINDOW == nodeType(pSelect->pWindow));
1,728!
144
  }
145
  return false;
1,105,317✔
146
}
147

148
static int32_t collectMetaKeyFromInsTagsImpl(SCollectMetaKeyCxt* pCxt, SName* pName) {
9,624✔
149
  if (0 == pName->type) {
9,624✔
150
    return TSDB_CODE_SUCCESS;
8,031✔
151
  }
152
  if (TSDB_DB_NAME_T == pName->type) {
1,593✔
153
    return reserveDbVgInfoInCache(pName->acctId, pName->dbname, pCxt->pMetaCache);
403✔
154
  }
155
  return reserveTableVgroupInCacheExt(pName, pCxt->pMetaCache);
1,190✔
156
}
157

158
static int32_t collectMetaKeyFromInsTags(SCollectMetaKeyCxt* pCxt) {
9,624✔
159
  SSelectStmt* pSelect = (SSelectStmt*)pCxt->pStmt;
9,624✔
160
  SName        name = {0};
9,624✔
161
  int32_t      code = getVnodeSysTableTargetName(pCxt->pParseCxt->acctId, pSelect->pWhere, &name);
9,624✔
162
  if (TSDB_CODE_SUCCESS == code) {
9,624!
163
    code = collectMetaKeyFromInsTagsImpl(pCxt, &name);
9,624✔
164
  }
165
  return code;
9,625✔
166
}
167

168
static int32_t collectMetaKeyFromRealTableImpl(SCollectMetaKeyCxt* pCxt, const char* pDb, const char* pTable,
1,107,016✔
169
                                               AUTH_TYPE authType) {
170
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pDb, pTable, pCxt->pMetaCache);
1,107,016✔
171
  if (TSDB_CODE_SUCCESS == code) {
1,107,053!
172
    code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pDb, pTable, pCxt->pMetaCache);
1,107,055✔
173
  }
174
  if (TSDB_CODE_SUCCESS == code) {
1,107,060!
175
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pDb, pTable, authType,
1,107,062✔
176
                                  pCxt->pMetaCache);
177
  }
178
#ifdef TD_ENTERPRISE
179
  if (TSDB_CODE_SUCCESS == code && NULL != pCxt->pParseCxt->pEffectiveUser) {
1,107,061!
180
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pEffectiveUser, pDb, pTable, authType,
680✔
181
                                  pCxt->pMetaCache);
182
  }
183
#endif
184
  if (TSDB_CODE_SUCCESS == code) {
1,107,061✔
185
    code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pDb, pCxt->pMetaCache);
1,107,057✔
186
  }
187
  if (TSDB_CODE_SUCCESS == code && needGetTableIndex(pCxt->pStmt)) {
1,107,065✔
188
    code = reserveTableIndexInCache(pCxt->pParseCxt->acctId, pDb, pTable, pCxt->pMetaCache);
1,377✔
189
  }
190
  if (TSDB_CODE_SUCCESS == code && (0 == strcmp(pTable, TSDB_INS_TABLE_DNODE_VARIABLES))) {
1,107,058✔
191
    code = reserveDnodeRequiredInCache(pCxt->pMetaCache);
18✔
192
  }
193
  if (TSDB_CODE_SUCCESS == code &&
1,107,058✔
194
      (0 == strcmp(pTable, TSDB_INS_TABLE_TAGS) || 0 == strcmp(pTable, TSDB_INS_TABLE_TABLES) ||
1,107,040✔
195
       0 == strcmp(pTable, TSDB_INS_TABLE_COLS) || 0 == strcmp(pTable, TSDB_INS_DISK_USAGE) ||
1,104,311✔
196
       0 == strcmp(pTable, TSDB_INS_TABLE_FILESETS)) &&
1,097,410✔
197
      QUERY_NODE_SELECT_STMT == nodeType(pCxt->pStmt)) {
9,631✔
198
    code = collectMetaKeyFromInsTags(pCxt);
9,624✔
199
  }
200
  if (TSDB_CODE_SUCCESS == code && QUERY_SMA_OPTIMIZE_ENABLE == tsQuerySmaOptimize &&
1,107,059✔
201
      QUERY_NODE_SELECT_STMT == nodeType(pCxt->pStmt)) {
1,728!
202
    code = reserveTableTSMAInfoInCache(pCxt->pParseCxt->acctId, pDb, pTable, pCxt->pMetaCache);
1,728✔
203
  }
204
  return code;
1,107,056✔
205
}
206

207
static EDealRes collectMetaKeyFromRealTable(SCollectMetaKeyFromExprCxt* pCxt, SRealTableNode* pRealTable) {
1,091,933✔
208
  pCxt->errCode = collectMetaKeyFromRealTableImpl(pCxt->pComCxt, pRealTable->table.dbName, pRealTable->table.tableName,
1,091,933✔
209
                                                  AUTH_TYPE_READ);
210
  if (TSDB_CODE_SUCCESS == pCxt->errCode && pCxt->pComCxt->collectVSubTables) {
1,091,970!
211
    pCxt->errCode = reserveVSubTableInCache(pCxt->pComCxt->pParseCxt->acctId, pRealTable->table.dbName, pRealTable->table.tableName, pCxt->pComCxt->pMetaCache);
1,218✔
212
  }
213
  if (TSDB_CODE_SUCCESS == pCxt->errCode && pCxt->pComCxt->collectVStbRefDbs) {
1,091,970✔
214
    pCxt->errCode = reserveVStbRefDbsInCache(pCxt->pComCxt->pParseCxt->acctId, pRealTable->table.dbName, pRealTable->table.tableName, pCxt->pComCxt->pMetaCache);
833,548✔
215
  }
216
  return TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
1,091,960!
217
}
218

219
static EDealRes collectMetaKeyFromTempTable(SCollectMetaKeyFromExprCxt* pCxt, STempTableNode* pTempTable) {
310,546✔
220
  pCxt->errCode = collectMetaKeyFromQuery(pCxt->pComCxt, pTempTable->pSubquery);
310,546✔
221
  return TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
310,548!
222
}
223

224
static int32_t isTbnameEqCondOperator(SOperatorNode* pOperator, char** ppTableName) {
1,093,985✔
225
  if (pOperator->opType != OP_TYPE_EQUAL) {
1,093,985✔
226
    return TSDB_CODE_SUCCESS;
1,004,773✔
227
  }
228

229
  SValueNode* pValueNode = NULL;
89,212✔
230
  if (nodeType(pOperator->pLeft) == QUERY_NODE_FUNCTION &&
89,212✔
231
      0 == strcasecmp(((SFunctionNode*)(pOperator->pLeft))->functionName, "tbname") &&
23,630✔
232
      nodeType(pOperator->pRight) == QUERY_NODE_VALUE) {
6,089✔
233
    pValueNode = (SValueNode*)pOperator->pRight;
6,084✔
234
  } else if (nodeType(pOperator->pRight) == QUERY_NODE_FUNCTION &&
83,128✔
235
             0 == strcasecmp(((SFunctionNode*)(pOperator->pRight))->functionName, "tbname") &&
328✔
236
             nodeType(pOperator->pLeft) == QUERY_NODE_VALUE) {
5!
237
    pValueNode = (SValueNode*)pOperator->pLeft;
×
238
  } else {
239
    return TSDB_CODE_SUCCESS;
83,128✔
240
  }
241

242
  *ppTableName = pValueNode->literal;
6,084✔
243

244
  return TSDB_CODE_SUCCESS;
6,084✔
245
}
246

247
static EDealRes collectMetaKeyFromOperator(SCollectMetaKeyFromExprCxt* pCxt, SOperatorNode* pOpNode) {
1,798,557✔
248
  if (!pCxt->tbnameCollect) {
1,798,557✔
249
    return DEAL_RES_CONTINUE;
704,575✔
250
  }
251

252
  char*   pTableName = NULL;
1,093,982✔
253
  int32_t code = isTbnameEqCondOperator((SOperatorNode*)pOpNode, &pTableName);
1,093,982✔
254
  if (TSDB_CODE_SUCCESS != code) return DEAL_RES_CONTINUE;
1,093,992!
255
  if (pTableName) {
1,093,992✔
256
    SSelectStmt* pSelect = (SSelectStmt*)pCxt->pComCxt->pStmt;
6,084✔
257
    pCxt->errCode = collectMetaKeyFromRealTableImpl(pCxt->pComCxt, ((SRealTableNode*)pSelect->pFromTable)->table.dbName,
6,084✔
258
                                                    pTableName, AUTH_TYPE_READ);
259
  }
260

261
  return TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
1,093,992✔
262
}
263

264
static EDealRes collectMetaKeyFromExprImpl(SNode* pNode, void* pContext) {
15,919,105✔
265
  SCollectMetaKeyFromExprCxt* pCxt = pContext;
15,919,105✔
266
  switch (nodeType(pNode)) {
15,919,105✔
267
    case QUERY_NODE_FUNCTION:
3,301,821✔
268
      return collectMetaKeyFromFunction(pCxt, (SFunctionNode*)pNode);
3,301,821✔
269
    case QUERY_NODE_REAL_TABLE:
1,091,949✔
270
      return collectMetaKeyFromRealTable(pCxt, (SRealTableNode*)pNode);
1,091,949✔
271
    case QUERY_NODE_TEMP_TABLE:
310,546✔
272
      return collectMetaKeyFromTempTable(pCxt, (STempTableNode*)pNode);
310,546✔
273
    case QUERY_NODE_OPERATOR:
1,798,567✔
274
      return collectMetaKeyFromOperator(pCxt, (SOperatorNode*)pNode);
1,798,567✔
275
    default:
9,416,222✔
276
      break;
9,416,222✔
277
  }
278
  return DEAL_RES_CONTINUE;
9,416,222✔
279
}
280

281
static int32_t collectMetaKeyFromExprs(SCollectMetaKeyCxt* pCxt, SNodeList* pList) {
84,824✔
282
  SCollectMetaKeyFromExprCxt cxt = {.pComCxt = pCxt, .errCode = TSDB_CODE_SUCCESS, .tbnameCollect = false};
84,824✔
283
  nodesWalkExprs(pList, collectMetaKeyFromExprImpl, &cxt);
84,824✔
284
  return cxt.errCode;
84,824✔
285
}
286

287
static int32_t collectMetaKeyFromSetOperator(SCollectMetaKeyCxt* pCxt, SSetOperator* pStmt) {
84,824✔
288
  int32_t code = collectMetaKeyFromQuery(pCxt, pStmt->pLeft);
84,824✔
289
  if (TSDB_CODE_SUCCESS == code) {
84,824!
290
    code = collectMetaKeyFromQuery(pCxt, pStmt->pRight);
84,824✔
291
  }
292
  if (TSDB_CODE_SUCCESS == code) {
84,824!
293
    code = collectMetaKeyFromExprs(pCxt, pStmt->pOrderByList);
84,824✔
294
  }
295
  return code;
84,824✔
296
}
297

298
static int32_t reserveDbCfgForLastRow(SCollectMetaKeyCxt* pCxt, SNode* pTable) {
51,253✔
299
  if (NULL == pTable || QUERY_NODE_REAL_TABLE != nodeType(pTable)) {
51,253!
300
    return TSDB_CODE_SUCCESS;
7,434✔
301
  }
302
  return reserveDbCfgInCache(pCxt->pParseCxt->acctId, ((SRealTableNode*)pTable)->table.dbName, pCxt->pMetaCache);
43,819✔
303
}
304

305
static int32_t collectMetaKeyFromSelect(SCollectMetaKeyCxt* pCxt, SSelectStmt* pStmt) {
1,393,252✔
306
  SCollectMetaKeyFromExprCxt cxt = {.pComCxt = pCxt, .hasLastRowOrLast = false, .errCode = TSDB_CODE_SUCCESS};
1,393,252✔
307
  if (pStmt->pFromTable && QUERY_NODE_REAL_TABLE == nodeType(pStmt->pFromTable)) {
1,393,252✔
308
    cxt.tbnameCollect = true;
832,672✔
309
    cxt.pComCxt->collectVStbRefDbs = true;
832,672✔
310
  }
311
  nodesWalkSelectStmt(pStmt, SQL_CLAUSE_FROM, collectMetaKeyFromExprImpl, &cxt);
1,393,252✔
312
  if (TSDB_CODE_SUCCESS == cxt.errCode && cxt.hasLastRowOrLast) {
1,393,290!
313
    cxt.errCode = reserveDbCfgForLastRow(pCxt, pStmt->pFromTable);
50,980✔
314
  }
315
  return cxt.errCode;
1,393,295✔
316
}
317

318
static int32_t collectMetaKeyFromAlterDatabase(SCollectMetaKeyCxt* pCxt, SAlterDatabaseStmt* pStmt) {
315✔
319
  return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
315✔
320
}
321

322
static int32_t collectMetaKeyFromFlushDatabase(SCollectMetaKeyCxt* pCxt, SFlushDatabaseStmt* pStmt) {
10,156✔
323
  return reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
10,156✔
324
}
325

326
static int32_t collectMetaKeyFromCreateTable(SCollectMetaKeyCxt* pCxt, SCreateTableStmt* pStmt) {
21,222✔
327
  int32_t code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
21,222✔
328
  if (TSDB_CODE_SUCCESS == code && NULL == pStmt->pTags) {
21,222!
329
    code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
14,612✔
330
  }
331
  if (TSDB_CODE_SUCCESS == code) {
21,222!
332
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_WRITE,
21,222✔
333
                                  pCxt->pMetaCache);
334
  }
335
  return code;
21,222✔
336
}
337

338
static int32_t collectMetaKeyFromCreateVTable(SCollectMetaKeyCxt* pCxt, SCreateVTableStmt* pStmt) {
204✔
339
  int32_t code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
204✔
340
  if (TSDB_CODE_SUCCESS == code) {
204!
341
    code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
204✔
342
  }
343
  if (TSDB_CODE_SUCCESS == code) {
204!
344
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_WRITE,
204✔
345
                                  pCxt->pMetaCache);
346
  }
347
  if (TSDB_CODE_SUCCESS == code) {
204!
348
    SNode *pNode = NULL;
204✔
349
    FOREACH(pNode, pStmt->pCols) {
2,255!
350
      SColumnDefNode *pCol = (SColumnDefNode*)pNode;
2,051✔
351
      if (NULL == pCol) {
2,051!
352
        code = TSDB_CODE_PAR_INVALID_COLUMN;
×
353
        break;
×
354
      }
355
      SColumnOptions *pOptions = (SColumnOptions*)pCol->pOptions;
2,051✔
356
      if (pOptions && pOptions->hasRef) {
2,051!
357
        code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pOptions->refDb, pOptions->refTable, pCxt->pMetaCache);
1,129✔
358
        if (TSDB_CODE_SUCCESS == code) {
1,129!
359
          code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pOptions->refDb, pOptions->refTable, pCxt->pMetaCache);
1,129✔
360
        }
361
        if (TSDB_CODE_SUCCESS == code) {
1,129!
362
          code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pOptions->refDb,
1,129✔
363
                                        pOptions->refTable, AUTH_TYPE_READ, pCxt->pMetaCache);
1,129✔
364
        }
365
        if (TSDB_CODE_SUCCESS != code) {
1,129!
366
          break;
×
367
        }
368
      }
369
    }
370
  }
371
  return code;
204✔
372
}
373

374
static int32_t collectMetaKeyFromCreateVSubTable(SCollectMetaKeyCxt* pCxt, SCreateVSubTableStmt* pStmt) {
180✔
375
  int32_t code = TSDB_CODE_SUCCESS;
180✔
376
  PAR_ERR_RET(reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache));
180!
377
  // super table's meta
378
  PAR_ERR_RET(reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->useDbName, pStmt->useTableName,pCxt->pMetaCache));
180!
379
  // child table's meta
380
  PAR_ERR_RET(reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache));
180!
381
  // check db's write auth
382
  PAR_ERR_RET(reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL,
180!
383
                                     AUTH_TYPE_WRITE, pCxt->pMetaCache));
384
  // check org table's read auth
385
  SNode     *pNode = NULL;
180✔
386
  SNodeList *pTmpNodeList = pStmt->pSpecificColRefs ? pStmt->pSpecificColRefs : pStmt->pColRefs;
180✔
387
  if (NULL == pTmpNodeList) {
180✔
388
    // no column reference
389
    return TSDB_CODE_SUCCESS;
5✔
390
  }
391

392
  FOREACH(pNode, pTmpNodeList) {
1,091!
393
    SColumnRefNode *pColRef = (SColumnRefNode*)pNode;
916✔
394
    if (NULL == pColRef) {
916!
395
      code = TSDB_CODE_PAR_INVALID_COLUMN;
×
396
      break;
×
397
    }
398
    PAR_ERR_RET(reserveTableMetaInCache(pCxt->pParseCxt->acctId, pColRef->refDbName, pColRef->refTableName,
916!
399
                                        pCxt->pMetaCache));
400
    PAR_ERR_RET(reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pColRef->refDbName, pColRef->refTableName,
916!
401
                                          pCxt->pMetaCache));
402
    PAR_ERR_RET(reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pColRef->refDbName,
916!
403
                                       pColRef->refTableName, AUTH_TYPE_READ, pCxt->pMetaCache));
404
  }
405
  return code;
175✔
406
}
407

408
static int32_t collectMetaKeyFromCreateMultiTable(SCollectMetaKeyCxt* pCxt, SCreateMultiTablesStmt* pStmt) {
90,384✔
409
  int32_t code = TSDB_CODE_SUCCESS;
90,384✔
410
  SNode*  pNode = NULL;
90,384✔
411
  FOREACH(pNode, pStmt->pSubTables) {
200,343!
412
    if (pNode->type == QUERY_NODE_CREATE_SUBTABLE_CLAUSE) {
109,891!
413
      SCreateSubTableClause* pClause = (SCreateSubTableClause*)pNode;
109,891✔
414
      code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pClause->dbName, pCxt->pMetaCache);
109,891✔
415
      if (TSDB_CODE_SUCCESS == code) {
109,952!
416
        code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pClause->useDbName, pClause->useTableName,
109,961✔
417
                                       pCxt->pMetaCache);
418
      }
419
      if (TSDB_CODE_SUCCESS == code) {
109,955!
420
        code =
421
            reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pClause->dbName, pClause->tableName, pCxt->pMetaCache);
109,964✔
422
      }
423
      if (TSDB_CODE_SUCCESS == code) {
109,957!
424
        code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pClause->dbName, NULL,
109,967✔
425
                                      AUTH_TYPE_WRITE, pCxt->pMetaCache);
426
      }
427
    } else {
428
      SCreateSubTableFromFileClause* pClause = (SCreateSubTableFromFileClause*)pNode;
×
429
      code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pClause->useDbName, pCxt->pMetaCache);
×
430
      if (TSDB_CODE_SUCCESS == code) {
×
431
        code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pClause->useDbName, pClause->useTableName,
×
432
                                       pCxt->pMetaCache);
433
      }
434
      if (TSDB_CODE_SUCCESS == code) {
×
435
        code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pClause->useDbName, NULL,
×
436
                                      AUTH_TYPE_WRITE, pCxt->pMetaCache);
437
      }
438
    }
439

440
    if (TSDB_CODE_SUCCESS != code) {
109,959!
441
      break;
×
442
    }
443
  }
444
  return code;
90,452✔
445
}
446

447
static int32_t collectMetaKeyFromCreateSubTableFromFile(SCollectMetaKeyCxt*            pCxt,
2✔
448
                                                        SCreateSubTableFromFileClause* pClause) {
449
  int32_t code = TSDB_CODE_SUCCESS;
2✔
450
  SNode*  pNode = NULL;
2✔
451

452
  code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pClause->useDbName, pCxt->pMetaCache);
2✔
453
  if (TSDB_CODE_SUCCESS == code) {
2!
454
    code =
455
        reserveTableMetaInCache(pCxt->pParseCxt->acctId, pClause->useDbName, pClause->useTableName, pCxt->pMetaCache);
2✔
456
  }
457
  if (TSDB_CODE_SUCCESS == code) {
2!
458
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pClause->useDbName, NULL,
2✔
459
                                  AUTH_TYPE_WRITE, pCxt->pMetaCache);
460
  }
461

462
  return code;
2✔
463
}
464

465
static int32_t collectMetaKeyFromDropTable(SCollectMetaKeyCxt* pCxt, SDropTableStmt* pStmt) {
17,038✔
466
  int32_t code = TSDB_CODE_SUCCESS;
17,038✔
467
  SNode*  pNode = NULL;
17,038✔
468
  FOREACH(pNode, pStmt->pTables) {
34,986!
469
    SDropTableClause* pClause = (SDropTableClause*)pNode;
17,948✔
470
    if (pStmt->withOpt) {
17,948✔
471
      code = reserveTableUidInCache(pCxt->pParseCxt->acctId, pClause->dbName, pClause->tableName, pCxt->pMetaCache);
1,147✔
472
      if (TSDB_CODE_SUCCESS == code) {
1,147!
473
        code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pClause->dbName, pCxt->pMetaCache);
1,147✔
474
      }
475
      if (TSDB_CODE_SUCCESS == code) {
1,147!
476
        code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pClause->dbName, pCxt->pMetaCache);
1,147✔
477
      }
478
    } else {
479
      code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pClause->dbName, pClause->tableName, pCxt->pMetaCache);
16,801✔
480
      if (TSDB_CODE_SUCCESS == code) {
16,801!
481
        code =
482
            reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pClause->dbName, pClause->tableName, pCxt->pMetaCache);
16,801✔
483
      }
484
      if (TSDB_CODE_SUCCESS == code) {
16,801!
485
        code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pClause->dbName,
16,801✔
486
                                      pClause->tableName, AUTH_TYPE_WRITE, pCxt->pMetaCache);
16,801✔
487
      }
488
    }
489
    if (TSDB_CODE_SUCCESS != code) {
17,948!
490
      break;
×
491
    }
492
  }
493
  return code;
17,038✔
494
}
495

496
static int32_t collectMetaKeyFromDropStable(SCollectMetaKeyCxt* pCxt, SDropSuperTableStmt* pStmt) {
594✔
497
  if (pStmt->withOpt) {
594✔
498
    return reserveTableUidInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
421✔
499
  }
500
  return reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->tableName,
173✔
501
                                AUTH_TYPE_WRITE, pCxt->pMetaCache);
502
}
503

504
static int32_t collectMetaKeyFromDropVtable(SCollectMetaKeyCxt* pCxt, SDropVirtualTableStmt* pStmt) {
62✔
505
  int32_t code = TSDB_CODE_SUCCESS;
62✔
506
  if (pStmt->withOpt) {
62!
507
    code = reserveTableUidInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
×
508
    if (TSDB_CODE_SUCCESS == code) {
×
509
      code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
×
510
    }
511
    if (TSDB_CODE_SUCCESS == code) {
×
512
      code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
×
513
    }
514
  } else {
515
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
62✔
516
    if (TSDB_CODE_SUCCESS == code) {
62!
517
      code =
518
          reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
62✔
519
    }
520
    if (TSDB_CODE_SUCCESS == code) {
62!
521
      code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName,
62✔
522
                                    pStmt->tableName, AUTH_TYPE_WRITE, pCxt->pMetaCache);
62✔
523
    }
524
  }
525
  return code;
62✔
526
}
527

528
static int32_t collectMetaKeyFromAlterTable(SCollectMetaKeyCxt* pCxt, SAlterTableStmt* pStmt) {
16,768✔
529
  int32_t code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
16,768✔
530
  if (TSDB_CODE_SUCCESS == code) {
16,768!
531
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
16,768✔
532
  }
533
  if (TSDB_CODE_SUCCESS == code) {
16,768!
534
    code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
16,768✔
535
  }
536
  if (TSDB_CODE_SUCCESS == code) {
16,768!
537
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->tableName,
16,768✔
538
                                  AUTH_TYPE_WRITE, pCxt->pMetaCache);
539
  }
540
  return code;
16,768✔
541
}
542

543
static int32_t collectMetaKeyFromAlterStable(SCollectMetaKeyCxt* pCxt, SAlterTableStmt* pStmt) {
1,215✔
544
  int32_t code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
1,215✔
545
  if (TSDB_CODE_SUCCESS == code) {
1,215!
546
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
1,215✔
547
  }
548
  if (TSDB_CODE_SUCCESS == code) {
1,215!
549
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->tableName,
1,215✔
550
                                  AUTH_TYPE_WRITE, pCxt->pMetaCache);
551
  }
552
  return code;
1,215✔
553
}
554

555
static int32_t collectMetaKeyFromAlterVtable(SCollectMetaKeyCxt* pCxt, SAlterTableStmt* pStmt) {
433✔
556
  PAR_ERR_RET(reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache));
433!
557
  PAR_ERR_RET(reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache));
433!
558
  PAR_ERR_RET(reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache));
433!
559
  PAR_ERR_RET(reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->tableName,
433!
560
                                     AUTH_TYPE_WRITE, pCxt->pMetaCache));
561
  if (pStmt->alterType == TSDB_ALTER_TABLE_ALTER_COLUMN_REF || pStmt->alterType == TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COLUMN_REF) {
433✔
562
    PAR_ERR_RET(reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->refDbName, pStmt->refTableName, pCxt->pMetaCache));
173!
563
    PAR_ERR_RET(reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->refDbName, pStmt->refTableName,
173!
564
                                       AUTH_TYPE_READ, pCxt->pMetaCache));
565
  }
566
  return TSDB_CODE_SUCCESS;
433✔
567
}
568

569
static int32_t collectMetaKeyFromUseDatabase(SCollectMetaKeyCxt* pCxt, SUseDatabaseStmt* pStmt) {
7,218✔
570
  return reserveDbVgVersionInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
7,218✔
571
}
572

573
static int32_t collectMetaKeyFromCreateIndex(SCollectMetaKeyCxt* pCxt, SCreateIndexStmt* pStmt) {
26✔
574
  int32_t code = TSDB_CODE_SUCCESS;
26✔
575
  if (INDEX_TYPE_SMA == pStmt->indexType || INDEX_TYPE_NORMAL == pStmt->indexType) {
26!
576
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
26✔
577
    if (TSDB_CODE_SUCCESS == code) {
26!
578
      code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
26✔
579
    }
580
    if (TSDB_CODE_SUCCESS == code) {
26!
581
      code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
26✔
582
    }
583
    if (TSDB_CODE_SUCCESS == code) {
26!
584
      code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
26✔
585
    }
586
  }
587
  return code;
26✔
588
}
589

590
static int32_t collectMetaKeyFromCreateTopic(SCollectMetaKeyCxt* pCxt, SCreateTopicStmt* pStmt) {
638✔
591
  if (NULL != pStmt->pQuery) {
638✔
592
    return collectMetaKeyFromQuery(pCxt, pStmt->pQuery);
516✔
593
  }
594
  if (NULL != pStmt->pWhere) {
122✔
595
    int32_t code = collectMetaKeyFromRealTableImpl(pCxt, pStmt->subDbName, pStmt->subSTbName, AUTH_TYPE_READ);
21✔
596
    return code;
21✔
597
  }
598
  return TSDB_CODE_SUCCESS;
101✔
599
}
600

601
static int32_t collectMetaKeyFromExplain(SCollectMetaKeyCxt* pCxt, SExplainStmt* pStmt) {
126,236✔
602
  return collectMetaKeyFromQuery(pCxt, pStmt->pQuery);
126,236✔
603
}
604

605
static int32_t collectMetaKeyFromDescribe(SCollectMetaKeyCxt* pCxt, SDescribeStmt* pStmt) {
4,546✔
606
  SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
4,546✔
607
  tstrncpy(name.dbname, pStmt->dbName, TSDB_DB_NAME_LEN);
4,546✔
608
  tstrncpy(name.tname, pStmt->tableName, TSDB_TABLE_NAME_LEN);
4,546✔
609
  int32_t code = catalogRemoveTableMeta(pCxt->pParseCxt->pCatalog, &name);
4,546✔
610
#ifdef TD_ENTERPRISE
611
  if (TSDB_CODE_SUCCESS == code) {
4,547!
612
    char dbFName[TSDB_DB_FNAME_LEN];
613
    (void)tNameGetFullDbName(&name, dbFName);
4,547✔
614
    code = catalogRemoveViewMeta(pCxt->pParseCxt->pCatalog, dbFName, 0, pStmt->tableName, 0);
4,547✔
615
  }
616
#endif
617
  if (TSDB_CODE_SUCCESS == code) {
4,547!
618
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
4,547✔
619
  }
620
  return code;
4,547✔
621
}
622

623
static int32_t collectMetaKeyFromCreateStream(SCollectMetaKeyCxt* pCxt, SCreateStreamStmt* pStmt) {
1,218✔
624
  pCxt->collectVSubTables = true;
1,218✔
625
  
626
  int32_t code =
627
      reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->targetDbName, pStmt->targetTabName, pCxt->pMetaCache);
1,218✔
628
  if (TSDB_CODE_SUCCESS == code && NULL != pStmt->pSubtable && NULL != pStmt->pQuery) {
1,218!
629
    SSelectStmt* pSelect = (SSelectStmt*)pStmt->pQuery;
271✔
630
    int32_t      code = nodesCloneNode(pStmt->pSubtable, &pSelect->pSubtable);
271✔
631
    if (NULL == pSelect->pSubtable) {
271!
632
      return code;
×
633
    }
634
  }
635
  if (TSDB_CODE_SUCCESS == code) {
1,218!
636
    code = collectMetaKeyFromQuery(pCxt, pStmt->pQuery);
1,218✔
637
  }
638
  if (TSDB_CODE_SUCCESS == code && pStmt->pOptions->fillHistory) {
1,218!
639
    SSelectStmt* pSelect = (SSelectStmt*)pStmt->pQuery;
275✔
640
    code = reserveDbCfgForLastRow(pCxt, pSelect->pFromTable);
275✔
641
  }
642
  return code;
1,218✔
643
}
644

645
static int32_t collectMetaKeyFromShowDnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
57✔
646
  if (pCxt->pParseCxt->enableSysInfo) {
57✔
647
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODES,
53✔
648
                                   pCxt->pMetaCache);
649
  }
650
  return TSDB_CODE_SUCCESS;
4✔
651
}
652

653
static int32_t collectMetaKeyFromShowMnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
53✔
654
  if (pCxt->pParseCxt->enableSysInfo) {
53✔
655
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MNODES,
49✔
656
                                   pCxt->pMetaCache);
657
  }
658
  return TSDB_CODE_SUCCESS;
4✔
659
}
660

661
static int32_t collectMetaKeyFromShowModules(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
×
662
  if (pCxt->pParseCxt->enableSysInfo) {
×
663
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MODULES,
×
664
                                   pCxt->pMetaCache);
665
  }
666
  return TSDB_CODE_SUCCESS;
×
667
}
668

669
static int32_t collectMetaKeyFromShowQnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
17✔
670
  if (pCxt->pParseCxt->enableSysInfo) {
17✔
671
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_QNODES,
13✔
672
                                   pCxt->pMetaCache);
673
  }
674
  return TSDB_CODE_SUCCESS;
4✔
675
}
676

677
static int32_t collectMetaKeyFromShowSnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
32✔
678
  if (pCxt->pParseCxt->enableSysInfo) {
32✔
679
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_SNODES,
24✔
680
                                   pCxt->pMetaCache);
681
  }
682
  return TSDB_CODE_SUCCESS;
8✔
683
}
684

685
static int32_t collectMetaKeyFromShowAnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
4✔
686
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_ANODES,
4✔
687
                                 pCxt->pMetaCache);
688
}
689

690
static int32_t collectMetaKeyFromShowAnodesFull(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
1✔
691
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_ANODES_FULL,
1✔
692
                                 pCxt->pMetaCache);
693
}
694

695
static int32_t collectMetaKeyFromShowBnodes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
×
696
  if (pCxt->pParseCxt->enableSysInfo) {
×
697
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_BNODES,
×
698
                                   pCxt->pMetaCache);
699
  }
700
  return TSDB_CODE_SUCCESS;
×
701
}
702

703
static int32_t collectMetaKeyFromShowArbGroups(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
18✔
704
  if (pCxt->pParseCxt->enableSysInfo) {
18!
705
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_ARBGROUPS,
18✔
706
                                   pCxt->pMetaCache);
707
  }
708
  return TSDB_CODE_SUCCESS;
×
709
}
710

711
static int32_t collectMetaKeyFromShowCluster(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
12✔
712
  if (pCxt->pParseCxt->enableSysInfo) {
12✔
713
    return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CLUSTER,
8✔
714
                                   pCxt->pMetaCache);
715
  }
716
  return TSDB_CODE_SUCCESS;
4✔
717
}
718

719
static int32_t collectMetaKeyFromShowDatabases(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
281✔
720
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DATABASES,
281✔
721
                                 pCxt->pMetaCache);
722
}
723

724
static int32_t collectMetaKeyFromShowFunctions(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
19✔
725
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_FUNCTIONS,
19✔
726
                                 pCxt->pMetaCache);
727
}
728

729
static int32_t collectMetaKeyFromShowIndexes(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
33✔
730
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_INDEXES,
33✔
731
                                 pCxt->pMetaCache);
732
}
733

734
static int32_t collectMetaKeyFromShowStables(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
788✔
735
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STABLES,
788✔
736
                                         pCxt->pMetaCache);
737
  if (TSDB_CODE_SUCCESS == code) {
788!
738
    code =
739
        reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
788✔
740
                               NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
741
  }
742
  return code;
788✔
743
}
744

745
static int32_t collectMetaKeyFromShowStreams(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
245✔
746
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STREAMS,
245✔
747
                                 pCxt->pMetaCache);
748
}
749

750
static int32_t collectMetaKeyFromShowTables(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
1,438✔
751
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLES,
1,438✔
752
                                         pCxt->pMetaCache);
753
  if (TSDB_CODE_SUCCESS == code) {
1,438!
754
    code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
1,438✔
755
  }
756
  if (TSDB_CODE_SUCCESS == code) {
1,438!
757
    code =
758
        reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
1,438✔
759
                               NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
760
  }
761
  return code;
1,438✔
762
}
763

764
static int32_t collectMetaKeyFromShowFilesets(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
×
765
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_FILESETS,
×
766
                                         pCxt->pMetaCache);
767
  if (TSDB_CODE_SUCCESS == code) {
×
768
    code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
×
769
  }
770
  if (TSDB_CODE_SUCCESS == code) {
×
771
    code =
772
        reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
×
773
                               NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
774
  }
775
  return code;
×
776
}
777

778
static int32_t collectMetaKeyFromShowTags(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
829✔
779
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TAGS,
829✔
780
                                         pCxt->pMetaCache);
781
  if (TSDB_CODE_SUCCESS == code) {
829!
782
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal,
829✔
783
                                   ((SValueNode*)pStmt->pTbName)->literal, pCxt->pMetaCache);
829✔
784
  }
785
  if (TSDB_CODE_SUCCESS == code) {
829!
786
    code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
829✔
787
  }
788
  if (TSDB_CODE_SUCCESS == code && NULL != pStmt->pTbName) {
829!
789
    code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal,
829✔
790
                                     ((SValueNode*)pStmt->pTbName)->literal, pCxt->pMetaCache);
829✔
791
  }
792
  return code;
829✔
793
}
794

795
static int32_t collectMetaKeyFromShowStableTags(SCollectMetaKeyCxt* pCxt, SShowTableTagsStmt* pStmt) {
36✔
796
  return collectMetaKeyFromRealTableImpl(pCxt, ((SValueNode*)pStmt->pDbName)->literal,
72✔
797
                                         ((SValueNode*)pStmt->pTbName)->literal, AUTH_TYPE_READ);
36✔
798
}
799

800
static int32_t collectMetaKeyFromShowUsers(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
19✔
801
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USERS,
19✔
802
                                 pCxt->pMetaCache);
803
}
804

805
static int32_t collectMetaKeyFromShowUsersFull(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
×
806
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USERS_FULL,
×
807
                                 pCxt->pMetaCache);
808
}
809

810
static int32_t collectMetaKeyFromShowLicence(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
95✔
811
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_LICENCES,
95✔
812
                                 pCxt->pMetaCache);
813
}
814

815
static int32_t collectMetaKeyFromShowVgroups(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
643✔
816
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS,
643✔
817
                                         pCxt->pMetaCache);
818
  if (TSDB_CODE_SUCCESS == code) {
643!
819
    // just to verify whether the database exists
820
    code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
643✔
821
  }
822
  return code;
643✔
823
}
824

825
static int32_t collectMetaKeyFromShowTopics(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
32✔
826
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TOPICS,
32✔
827
                                 pCxt->pMetaCache);
828
}
829

830
static int32_t collectMetaKeyFromShowConsumers(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
59✔
831
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_CONSUMERS,
59✔
832
                                 pCxt->pMetaCache);
833
}
834

835
static int32_t collectMetaKeyFromShowConnections(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
8✔
836
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_CONNECTIONS,
8✔
837
                                 pCxt->pMetaCache);
838
}
839

840
static int32_t collectMetaKeyFromShowQueries(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
8✔
841
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_QUERIES,
8✔
842
                                 pCxt->pMetaCache);
843
}
844

845
static int32_t collectMetaKeyFromShowVariables(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
123✔
846
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CONFIGS,
123✔
847
                                 pCxt->pMetaCache);
848
}
849

850
static int32_t collectMetaKeyFromShowDnodeVariables(SCollectMetaKeyCxt* pCxt, SShowDnodeVariablesStmt* pStmt) {
353✔
851
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB,
353✔
852
                                         TSDB_INS_TABLE_DNODE_VARIABLES, pCxt->pMetaCache);
853
  if (TSDB_CODE_SUCCESS == code) {
353!
854
    code = reserveDnodeRequiredInCache(pCxt->pMetaCache);
353✔
855
  }
856
  return code;
353✔
857
}
858

859
static int32_t collectMetaKeyFromShowVnodes(SCollectMetaKeyCxt* pCxt, SShowVnodesStmt* pStmt) {
27✔
860
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VNODES,
27✔
861
                                 pCxt->pMetaCache);
862
}
863

864
static int32_t collectMetaKeyFromShowUserPrivileges(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
16✔
865
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_PRIVILEGES,
16✔
866
                                 pCxt->pMetaCache);
867
}
868

869
static int32_t collectMetaKeyFromShowViews(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
23✔
870
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VIEWS,
23✔
871
                                         pCxt->pMetaCache);
872
  if (TSDB_CODE_SUCCESS == code) {
23!
873
    code =
874
        reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
23✔
875
                               NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
876
  }
877
  return code;
23✔
878
}
879

880
static int32_t collectMetaKeyFromShowCompacts(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
524✔
881
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_COMPACTS,
524✔
882
                                         pCxt->pMetaCache);
883
  return code;
524✔
884
}
885

886
static int32_t collectMetaKeyFromShowCompactDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
1✔
887
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB,
1✔
888
                                         TSDB_INS_TABLE_COMPACT_DETAILS, pCxt->pMetaCache);
889
  return code;
1✔
890
}
891

892
static int32_t collectMetaKeyFromShowTransactionDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
×
893
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB,
×
894
                                         TSDB_INS_TABLE_TRANSACTION_DETAILS, pCxt->pMetaCache);
895
  return code;
×
896
}
897

898
static int32_t collectMetaKeyFromShowGrantsFull(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
77✔
899
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_GRANTS_FULL,
77✔
900
                                 pCxt->pMetaCache);
901
}
902

903
static int32_t collectMetaKeyFromShowGrantsLogs(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
11✔
904
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_GRANTS_LOGS,
11✔
905
                                 pCxt->pMetaCache);
906
}
907

908
static int32_t collectMetaKeyFromShowClusterMachines(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
10✔
909
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MACHINES,
10✔
910
                                 pCxt->pMetaCache);
911
}
912

913
static int32_t collectMetaKeyFromShowEncryptions(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
2✔
914
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_ENCRYPTIONS,
2✔
915
                                 pCxt->pMetaCache);
916
}
917

918
static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SShowCreateDatabaseStmt* pStmt) {
30✔
919
  return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
30✔
920
}
921

922
static int32_t collectMetaKeyFromShowCreateTable(SCollectMetaKeyCxt* pCxt, SShowCreateTableStmt* pStmt) {
328✔
923
  SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
328✔
924
  tstrncpy(name.dbname, pStmt->dbName, TSDB_DB_NAME_LEN);
328✔
925
  tstrncpy(name.tname, pStmt->tableName, TSDB_TABLE_NAME_LEN);
328✔
926
  int32_t code = catalogRemoveTableMeta(pCxt->pParseCxt->pCatalog, &name);
328✔
927
  if (TSDB_CODE_SUCCESS == code) {
328!
928
    code = reserveTableCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
328✔
929
  }
930
  if (TSDB_CODE_SUCCESS == code) {
328!
931
    code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
328✔
932
  }
933
  if (TSDB_CODE_SUCCESS == code) {
328!
934
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->tableName,
328✔
935
                                  AUTH_TYPE_READ, pCxt->pMetaCache);
936
  }
937
  return code;
328✔
938
}
939

940
static int32_t collectMetaKeyFromShowCreateView(SCollectMetaKeyCxt* pCxt, SShowCreateViewStmt* pStmt) {
18✔
941
  SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
18✔
942
  tstrncpy(name.dbname, pStmt->dbName, TSDB_DB_NAME_LEN);
18✔
943
  tstrncpy(name.tname, pStmt->viewName, TSDB_TABLE_NAME_LEN);
18✔
944
  char dbFName[TSDB_DB_FNAME_LEN];
945
  (void)tNameGetFullDbName(&name, dbFName);
18✔
946
  int32_t code = catalogRemoveViewMeta(pCxt->pParseCxt->pCatalog, dbFName, 0, pStmt->viewName, 0);
18✔
947
  if (TSDB_CODE_SUCCESS == code) {
18!
948
    code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName,
18✔
949
                                      AUTH_TYPE_READ, pCxt->pMetaCache);
950
  }
951
  if (TSDB_CODE_SUCCESS == code) {
18!
952
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
18✔
953
  }
954
  pCxt->pMetaCache->forceFetchViewMeta = true;
18✔
955
  return code;
18✔
956
}
957

958
static int32_t collectMetaKeyFromShowApps(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
8✔
959
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_APPS,
8✔
960
                                 pCxt->pMetaCache);
961
}
962

963
static int32_t collectMetaKeyFromShowTransactions(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
263✔
964
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_TRANS,
263✔
965
                                 pCxt->pMetaCache);
966
}
967

968
static int32_t collectMetaKeyFromDelete(SCollectMetaKeyCxt* pCxt, SDeleteStmt* pStmt) {
8,792✔
969
  STableNode* pTable = (STableNode*)pStmt->pFromTable;
8,792✔
970
  return collectMetaKeyFromRealTableImpl(pCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_WRITE);
8,792✔
971
}
972

973
static int32_t collectMetaKeyFromInsert(SCollectMetaKeyCxt* pCxt, SInsertStmt* pStmt) {
142✔
974
  STableNode* pTable = (STableNode*)pStmt->pTable;
142✔
975
  int32_t     code = collectMetaKeyFromRealTableImpl(pCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_WRITE);
142✔
976
  if (TSDB_CODE_SUCCESS == code) {
142!
977
    code = collectMetaKeyFromQuery(pCxt, pStmt->pQuery);
142✔
978
  }
979
  return code;
142✔
980
}
981

982
static int32_t collectMetaKeyFromShowBlockDist(SCollectMetaKeyCxt* pCxt, SShowTableDistributedStmt* pStmt) {
12✔
983
  SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
12✔
984
  tstrncpy(name.dbname, pStmt->dbName, TSDB_DB_NAME_LEN);
12✔
985
  tstrncpy(name.tname, pStmt->tableName, TSDB_TABLE_NAME_LEN);
12✔
986
  int32_t code = catalogRemoveTableMeta(pCxt->pParseCxt->pCatalog, &name);
12✔
987
  if (TSDB_CODE_SUCCESS == code) {
12!
988
    code = collectMetaKeyFromRealTableImpl(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_READ);
12✔
989
  }
990
  return code;
12✔
991
}
992

993
static int32_t collectMetaKeyFromShowSubscriptions(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
73✔
994
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_SUBSCRIPTIONS,
73✔
995
                                 pCxt->pMetaCache);
996
}
997

998
static int32_t collectMetaKeyFromCompactDatabase(SCollectMetaKeyCxt* pCxt, SCompactDatabaseStmt* pStmt) {
48✔
999
  return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
48✔
1000
}
1001

1002
static int32_t collectMetaKeyFromCompactVgroups(SCollectMetaKeyCxt* pCxt, SCompactVgroupsStmt* pStmt) {
×
1003
  return reserveDbCfgInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
×
1004
}
1005

1006
static int32_t collectMetaKeyFromGrant(SCollectMetaKeyCxt* pCxt, SGrantStmt* pStmt) {
584✔
1007
  if ('\0' == pStmt->tabName[0]) {
584✔
1008
    return TSDB_CODE_SUCCESS;
282✔
1009
  }
1010
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->objName, pStmt->tabName, pCxt->pMetaCache);
302✔
1011
}
1012

1013
static int32_t collectMetaKeyFromRevoke(SCollectMetaKeyCxt* pCxt, SRevokeStmt* pStmt) {
489✔
1014
  if ('\0' == pStmt->tabName[0]) {
489✔
1015
    return TSDB_CODE_SUCCESS;
241✔
1016
  }
1017
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->objName, pStmt->tabName, pCxt->pMetaCache);
248✔
1018
}
1019

1020
static int32_t collectMetaKeyFromCreateViewStmt(SCollectMetaKeyCxt* pCxt, SCreateViewStmt* pStmt) {
283✔
1021
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
283✔
1022
  if (TSDB_CODE_SUCCESS == code) {
283!
1023
    code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_WRITE,
283✔
1024
                                  pCxt->pMetaCache);
1025
  }
1026
  if (TSDB_CODE_SUCCESS == code) {
283!
1027
    code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName,
283✔
1028
                                      AUTH_TYPE_ALTER, pCxt->pMetaCache);
1029
  }
1030
  return code;
283✔
1031
}
1032

1033
static int32_t collectMetaKeyFromDropViewStmt(SCollectMetaKeyCxt* pCxt, SDropViewStmt* pStmt) {
188✔
1034
  int32_t code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName,
188✔
1035
                                            pStmt->viewName, AUTH_TYPE_ALTER, pCxt->pMetaCache);
188✔
1036
  pCxt->pMetaCache->forceFetchViewMeta = true;
188✔
1037
  return code;
188✔
1038
}
1039

1040
static int32_t collectMetaKeyFromCreateTSMAStmt(SCollectMetaKeyCxt* pCxt, SCreateTSMAStmt* pStmt) {
324✔
1041
  int32_t code;
1042
  if (pStmt->pOptions->recursiveTsma) {
324✔
1043
    // if creating recursive tsma, the tablename is tsmaName
1044
    code = reserveTSMAInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
107✔
1045
    if (TSDB_CODE_SUCCESS == code) {
107!
1046
      char dstTbName[TSDB_TABLE_NAME_LEN] = {0};
107✔
1047
      snprintf(dstTbName, TSDB_TABLE_NAME_LEN, "%s" TSMA_RES_STB_POSTFIX, pStmt->tableName);
107✔
1048
      code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, dstTbName, pCxt->pMetaCache);
107✔
1049
      if (TSDB_CODE_SUCCESS == code) {
107!
1050
        code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, dstTbName, pCxt->pMetaCache);
107✔
1051
      }
1052
    }
1053
  } else {
1054
    code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
217✔
1055
    if (TSDB_CODE_SUCCESS == code) {
217!
1056
      code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
217✔
1057
    }
1058
  }
1059
  if (TSDB_CODE_SUCCESS == code) {
324!
1060
    code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
324✔
1061
  }
1062
  if (TSDB_CODE_SUCCESS == code) {
324!
1063
    code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
324✔
1064
  }
1065
  return code;
324✔
1066
}
1067

1068
static int32_t collectMetaKeyFromDropTSMAStmt(SCollectMetaKeyCxt* pCxt, SDropTSMAStmt* pStmt) {
144✔
1069
  int32_t code;
1070
  code = reserveTSMAInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tsmaName, pCxt->pMetaCache);
144✔
1071
  if (TSDB_CODE_SUCCESS == code) {
144!
1072
    code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
144✔
1073
  }
1074
  if (TSDB_CODE_SUCCESS == code) {
144!
1075
    code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
144✔
1076
  }
1077
  return code;
144✔
1078
}
1079

1080
static int32_t collectMetaKeyFromShowUsage(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
2✔
1081
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_DISK_USAGE,
2✔
1082
                                         pCxt->pMetaCache);
1083
  if (TSDB_CODE_SUCCESS == code) {
2!
1084
    code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
2✔
1085
  }
1086
  if (TSDB_CODE_SUCCESS == code) {
2!
1087
    code =
1088
        reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
2✔
1089
                               NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
1090
  }
1091
  return code;
2✔
1092
}
1093

1094
static int32_t collectMetaKeyFromShowTSMASStmt(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
2✔
1095
  return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TSMAS,
2✔
1096
                                 pCxt->pMetaCache);
1097
}
1098

1099
static int32_t collectMetaKeyFromShowAlive(SCollectMetaKeyCxt* pCxt, SShowAliveStmt* pStmt) {
25✔
1100
  int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS,
25✔
1101
                                         pCxt->pMetaCache);
1102
  if (TSDB_CODE_SUCCESS == code) {
25!
1103
    // just to verify whether the database exists
1104
    code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
25✔
1105
  }
1106
  return code;
25✔
1107
}
1108

1109
static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
1,818,078✔
1110
  pCxt->pStmt = pStmt;
1,818,078✔
1111
  switch (nodeType(pStmt)) {
1,818,078!
1112
    case QUERY_NODE_SET_OPERATOR:
84,824✔
1113
      return collectMetaKeyFromSetOperator(pCxt, (SSetOperator*)pStmt);
84,824✔
1114
    case QUERY_NODE_SELECT_STMT:
1,393,263✔
1115
      return collectMetaKeyFromSelect(pCxt, (SSelectStmt*)pStmt);
1,393,263✔
1116
    case QUERY_NODE_ALTER_DATABASE_STMT:
315✔
1117
      return collectMetaKeyFromAlterDatabase(pCxt, (SAlterDatabaseStmt*)pStmt);
315✔
1118
    case QUERY_NODE_FLUSH_DATABASE_STMT:
10,156✔
1119
      return collectMetaKeyFromFlushDatabase(pCxt, (SFlushDatabaseStmt*)pStmt);
10,156✔
1120
    case QUERY_NODE_CREATE_TABLE_STMT:
21,222✔
1121
      return collectMetaKeyFromCreateTable(pCxt, (SCreateTableStmt*)pStmt);
21,222✔
1122
    case QUERY_NODE_CREATE_VIRTUAL_TABLE_STMT:
204✔
1123
      return collectMetaKeyFromCreateVTable(pCxt, (SCreateVTableStmt*)pStmt);
204✔
1124
    case QUERY_NODE_CREATE_VIRTUAL_SUBTABLE_STMT:
180✔
1125
      return collectMetaKeyFromCreateVSubTable(pCxt, (SCreateVSubTableStmt*)pStmt);
180✔
1126
    case QUERY_NODE_CREATE_MULTI_TABLES_STMT:
90,387✔
1127
      return collectMetaKeyFromCreateMultiTable(pCxt, (SCreateMultiTablesStmt*)pStmt);
90,387✔
1128
    case QUERY_NODE_CREATE_SUBTABLE_FROM_FILE_CLAUSE:
2✔
1129
      return collectMetaKeyFromCreateSubTableFromFile(pCxt, (SCreateSubTableFromFileClause*)pStmt);
2✔
1130
    case QUERY_NODE_DROP_TABLE_STMT:
17,038✔
1131
      return collectMetaKeyFromDropTable(pCxt, (SDropTableStmt*)pStmt);
17,038✔
1132
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
594✔
1133
      return collectMetaKeyFromDropStable(pCxt, (SDropSuperTableStmt*)pStmt);
594✔
1134
    case QUERY_NODE_DROP_VIRTUAL_TABLE_STMT:
62✔
1135
      return collectMetaKeyFromDropVtable(pCxt, (SDropVirtualTableStmt*)pStmt);
62✔
1136
    case QUERY_NODE_ALTER_TABLE_STMT:
16,768✔
1137
      return collectMetaKeyFromAlterTable(pCxt, (SAlterTableStmt*)pStmt);
16,768✔
1138
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
1,215✔
1139
      return collectMetaKeyFromAlterStable(pCxt, (SAlterTableStmt*)pStmt);
1,215✔
1140
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT:
433✔
1141
      return collectMetaKeyFromAlterVtable(pCxt, (SAlterTableStmt*)pStmt);
433✔
1142
    case QUERY_NODE_USE_DATABASE_STMT:
7,220✔
1143
      return collectMetaKeyFromUseDatabase(pCxt, (SUseDatabaseStmt*)pStmt);
7,220✔
1144
    case QUERY_NODE_CREATE_INDEX_STMT:
26✔
1145
      return collectMetaKeyFromCreateIndex(pCxt, (SCreateIndexStmt*)pStmt);
26✔
1146
    case QUERY_NODE_CREATE_TOPIC_STMT:
638✔
1147
      return collectMetaKeyFromCreateTopic(pCxt, (SCreateTopicStmt*)pStmt);
638✔
1148
    case QUERY_NODE_EXPLAIN_STMT:
126,236✔
1149
      return collectMetaKeyFromExplain(pCxt, (SExplainStmt*)pStmt);
126,236✔
1150
    case QUERY_NODE_DESCRIBE_STMT:
4,546✔
1151
      return collectMetaKeyFromDescribe(pCxt, (SDescribeStmt*)pStmt);
4,546✔
1152
    case QUERY_NODE_COMPACT_DATABASE_STMT:
48✔
1153
      return collectMetaKeyFromCompactDatabase(pCxt, (SCompactDatabaseStmt*)pStmt);
48✔
1154
    case QUERY_NODE_COMPACT_VGROUPS_STMT:
×
1155
      return collectMetaKeyFromCompactVgroups(pCxt, (SCompactVgroupsStmt*)pStmt);
×
1156
    case QUERY_NODE_CREATE_STREAM_STMT:
1,218✔
1157
      return collectMetaKeyFromCreateStream(pCxt, (SCreateStreamStmt*)pStmt);
1,218✔
1158
    case QUERY_NODE_GRANT_STMT:
584✔
1159
      return collectMetaKeyFromGrant(pCxt, (SGrantStmt*)pStmt);
584✔
1160
    case QUERY_NODE_REVOKE_STMT:
489✔
1161
      return collectMetaKeyFromRevoke(pCxt, (SRevokeStmt*)pStmt);
489✔
1162
    case QUERY_NODE_SHOW_DNODES_STMT:
57✔
1163
      return collectMetaKeyFromShowDnodes(pCxt, (SShowStmt*)pStmt);
57✔
1164
    case QUERY_NODE_SHOW_MNODES_STMT:
53✔
1165
      return collectMetaKeyFromShowMnodes(pCxt, (SShowStmt*)pStmt);
53✔
1166
    case QUERY_NODE_SHOW_MODULES_STMT:
×
1167
      return collectMetaKeyFromShowModules(pCxt, (SShowStmt*)pStmt);
×
1168
    case QUERY_NODE_SHOW_QNODES_STMT:
17✔
1169
      return collectMetaKeyFromShowQnodes(pCxt, (SShowStmt*)pStmt);
17✔
1170
    case QUERY_NODE_SHOW_SNODES_STMT:
32✔
1171
      return collectMetaKeyFromShowSnodes(pCxt, (SShowStmt*)pStmt);
32✔
1172
    case QUERY_NODE_SHOW_ANODES_STMT:
4✔
1173
      return collectMetaKeyFromShowAnodes(pCxt, (SShowStmt*)pStmt);
4✔
1174
    case QUERY_NODE_SHOW_ANODES_FULL_STMT:
1✔
1175
      return collectMetaKeyFromShowAnodesFull(pCxt, (SShowStmt*)pStmt);
1✔
1176
    case QUERY_NODE_SHOW_BNODES_STMT:
×
1177
      return collectMetaKeyFromShowBnodes(pCxt, (SShowStmt*)pStmt);
×
1178
    case QUERY_NODE_SHOW_ARBGROUPS_STMT:
18✔
1179
      return collectMetaKeyFromShowArbGroups(pCxt, (SShowStmt*)pStmt);
18✔
1180
    case QUERY_NODE_SHOW_CLUSTER_STMT:
12✔
1181
      return collectMetaKeyFromShowCluster(pCxt, (SShowStmt*)pStmt);
12✔
1182
    case QUERY_NODE_SHOW_DATABASES_STMT:
281✔
1183
      return collectMetaKeyFromShowDatabases(pCxt, (SShowStmt*)pStmt);
281✔
1184
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
19✔
1185
      return collectMetaKeyFromShowFunctions(pCxt, (SShowStmt*)pStmt);
19✔
1186
    case QUERY_NODE_SHOW_INDEXES_STMT:
33✔
1187
      return collectMetaKeyFromShowIndexes(pCxt, (SShowStmt*)pStmt);
33✔
1188
    case QUERY_NODE_SHOW_STABLES_STMT:
788✔
1189
      return collectMetaKeyFromShowStables(pCxt, (SShowStmt*)pStmt);
788✔
1190
    case QUERY_NODE_SHOW_STREAMS_STMT:
245✔
1191
      return collectMetaKeyFromShowStreams(pCxt, (SShowStmt*)pStmt);
245✔
1192
    case QUERY_NODE_SHOW_TABLES_STMT:
1,438✔
1193
    case QUERY_NODE_SHOW_VTABLES_STMT:
1194
      return collectMetaKeyFromShowTables(pCxt, (SShowStmt*)pStmt);
1,438✔
1195
    case QUERY_NODE_SHOW_FILESETS_STMT:
×
1196
      return collectMetaKeyFromShowFilesets(pCxt, (SShowStmt*)pStmt);
×
1197
    case QUERY_NODE_SHOW_TAGS_STMT:
829✔
1198
      return collectMetaKeyFromShowTags(pCxt, (SShowStmt*)pStmt);
829✔
1199
    case QUERY_NODE_SHOW_TABLE_TAGS_STMT:
36✔
1200
      return collectMetaKeyFromShowStableTags(pCxt, (SShowTableTagsStmt*)pStmt);
36✔
1201
    case QUERY_NODE_SHOW_USERS_STMT:
19✔
1202
      return collectMetaKeyFromShowUsers(pCxt, (SShowStmt*)pStmt);
19✔
1203
    case QUERY_NODE_SHOW_USERS_FULL_STMT:
×
1204
      return collectMetaKeyFromShowUsersFull(pCxt, (SShowStmt*)pStmt);
×
1205
    case QUERY_NODE_SHOW_LICENCES_STMT:
95✔
1206
      return collectMetaKeyFromShowLicence(pCxt, (SShowStmt*)pStmt);
95✔
1207
    case QUERY_NODE_SHOW_VGROUPS_STMT:
643✔
1208
      return collectMetaKeyFromShowVgroups(pCxt, (SShowStmt*)pStmt);
643✔
1209
    case QUERY_NODE_SHOW_TOPICS_STMT:
32✔
1210
      return collectMetaKeyFromShowTopics(pCxt, (SShowStmt*)pStmt);
32✔
1211
    case QUERY_NODE_SHOW_CONSUMERS_STMT:
59✔
1212
      return collectMetaKeyFromShowConsumers(pCxt, (SShowStmt*)pStmt);
59✔
1213
    case QUERY_NODE_SHOW_CONNECTIONS_STMT:
8✔
1214
      return collectMetaKeyFromShowConnections(pCxt, (SShowStmt*)pStmt);
8✔
1215
    case QUERY_NODE_SHOW_QUERIES_STMT:
8✔
1216
      return collectMetaKeyFromShowQueries(pCxt, (SShowStmt*)pStmt);
8✔
1217
    case QUERY_NODE_SHOW_VARIABLES_STMT:
123✔
1218
      return collectMetaKeyFromShowVariables(pCxt, (SShowStmt*)pStmt);
123✔
1219
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
353✔
1220
      return collectMetaKeyFromShowDnodeVariables(pCxt, (SShowDnodeVariablesStmt*)pStmt);
353✔
1221
    case QUERY_NODE_SHOW_VNODES_STMT:
27✔
1222
      return collectMetaKeyFromShowVnodes(pCxt, (SShowVnodesStmt*)pStmt);
27✔
1223
    case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
16✔
1224
      return collectMetaKeyFromShowUserPrivileges(pCxt, (SShowStmt*)pStmt);
16✔
1225
    case QUERY_NODE_SHOW_VIEWS_STMT:
23✔
1226
      return collectMetaKeyFromShowViews(pCxt, (SShowStmt*)pStmt);
23✔
1227
    case QUERY_NODE_SHOW_COMPACTS_STMT:
524✔
1228
      return collectMetaKeyFromShowCompacts(pCxt, (SShowStmt*)pStmt);
524✔
1229
    case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
1✔
1230
      return collectMetaKeyFromShowCompactDetails(pCxt, (SShowStmt*)pStmt);
1✔
1231
    case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
×
1232
      return collectMetaKeyFromShowTransactionDetails(pCxt, (SShowStmt*)pStmt);
×
1233
    case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
77✔
1234
      return collectMetaKeyFromShowGrantsFull(pCxt, (SShowStmt*)pStmt);
77✔
1235
    case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
11✔
1236
      return collectMetaKeyFromShowGrantsLogs(pCxt, (SShowStmt*)pStmt);
11✔
1237
    case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT:
10✔
1238
      return collectMetaKeyFromShowClusterMachines(pCxt, (SShowStmt*)pStmt);
10✔
1239
    case QUERY_NODE_SHOW_ENCRYPTIONS_STMT:
2✔
1240
      return collectMetaKeyFromShowEncryptions(pCxt, (SShowStmt*)pStmt);
2✔
1241
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
30✔
1242
      return collectMetaKeyFromShowCreateDatabase(pCxt, (SShowCreateDatabaseStmt*)pStmt);
30✔
1243
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
328✔
1244
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
1245
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
1246
      return collectMetaKeyFromShowCreateTable(pCxt, (SShowCreateTableStmt*)pStmt);
328✔
1247
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
18✔
1248
      return collectMetaKeyFromShowCreateView(pCxt, (SShowCreateViewStmt*)pStmt);
18✔
1249
    case QUERY_NODE_SHOW_APPS_STMT:
8✔
1250
      return collectMetaKeyFromShowApps(pCxt, (SShowStmt*)pStmt);
8✔
1251
    case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
263✔
1252
      return collectMetaKeyFromShowTransactions(pCxt, (SShowStmt*)pStmt);
263✔
1253
    case QUERY_NODE_SHOW_USAGE_STMT:
2✔
1254
      return collectMetaKeyFromShowUsage(pCxt, (SShowStmt*)pStmt);
2✔
1255
    case QUERY_NODE_DELETE_STMT:
8,792✔
1256
      return collectMetaKeyFromDelete(pCxt, (SDeleteStmt*)pStmt);
8,792✔
1257
    case QUERY_NODE_INSERT_STMT:
142✔
1258
      return collectMetaKeyFromInsert(pCxt, (SInsertStmt*)pStmt);
142✔
1259
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
12✔
1260
      return collectMetaKeyFromShowBlockDist(pCxt, (SShowTableDistributedStmt*)pStmt);
12✔
1261
    case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
73✔
1262
      return collectMetaKeyFromShowSubscriptions(pCxt, (SShowStmt*)pStmt);
73✔
1263
    case QUERY_NODE_CREATE_VIEW_STMT:
283✔
1264
      return collectMetaKeyFromCreateViewStmt(pCxt, (SCreateViewStmt*)pStmt);
283✔
1265
    case QUERY_NODE_DROP_VIEW_STMT:
188✔
1266
      return collectMetaKeyFromDropViewStmt(pCxt, (SDropViewStmt*)pStmt);
188✔
1267
    case QUERY_NODE_CREATE_TSMA_STMT:
324✔
1268
      return collectMetaKeyFromCreateTSMAStmt(pCxt, (SCreateTSMAStmt*)pStmt);
324✔
1269
    case QUERY_NODE_DROP_TSMA_STMT:
144✔
1270
      return collectMetaKeyFromDropTSMAStmt(pCxt, (SDropTSMAStmt*)pStmt);
144✔
1271
      break;
1272
    case QUERY_NODE_SHOW_TSMAS_STMT:
2✔
1273
      return collectMetaKeyFromShowTSMASStmt(pCxt, (SShowStmt*)pStmt);
2✔
1274
    case QUERY_NODE_SHOW_DB_ALIVE_STMT:
25✔
1275
    case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
1276
      return collectMetaKeyFromShowAlive(pCxt, (SShowAliveStmt*)pStmt);
25✔
1277
    default:
23,882✔
1278
      break;
23,882✔
1279
  }
1280
  return TSDB_CODE_SUCCESS;
23,882✔
1281
}
1282

1283
int32_t collectMetaKey(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
1,209,720✔
1284
  SCollectMetaKeyCxt cxt = {.pParseCxt = pParseCxt, .pMetaCache = pMetaCache, .pStmt = pQuery->pRoot};
1,209,720✔
1285
  return collectMetaKeyFromQuery(&cxt, pQuery->pRoot);
1,209,720✔
1286
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc