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

taosdata / TDengine / #5006

29 Mar 2026 04:32AM UTC coverage: 72.274% (+0.1%) from 72.152%
#5006

push

travis-ci

web-flow
refactor: do some internal refactor for TDgpt. (#34955)

253711 of 351039 relevant lines covered (72.27%)

131490495.89 hits per line

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

90.04
/source/libs/parser/src/parAuthenticator.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 "catalog.h"
17
#include "cmdnodes.h"
18
#include "parInt.h"
19
#include "tconfig.h"
20

21
typedef struct SAuthCxt {
22
  SParseContext*   pParseCxt;
23
  SParseMetaCache* pMetaCache;
24
  int32_t          errCode;
25
} SAuthCxt;
26

27
typedef struct SSelectAuthCxt {
28
  SAuthCxt*    pAuthCxt;
29
  SSelectStmt* pSelect;
30
} SSelectAuthCxt;
31

32
typedef struct SAuthRewriteCxt {
33
  STableNode* pTarget;
34
} SAuthRewriteCxt;
35

36
extern SConfig* tsCfg;
37

38
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt);
39

40
static int32_t setUserAuthInfo(SParseContext* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
3,340,171✔
41
                               EPrivObjType objType, bool isView, bool effective, SUserAuthInfo* pAuth) {
42
  if (effective) {
3,340,171✔
43
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pEffectiveUser ? pCxt->pEffectiveUser : "");
17,327✔
44
    pAuth->userId = pCxt->effectiveUserId;  // TODO: assign the effective user id
17,327✔
45
  } else {
46
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pUser);
3,322,844✔
47
    pAuth->userId = pCxt->userId;
3,322,844✔
48
  }
49

50
  if (NULL == pTabName) {
3,340,171✔
51
    if (pDbName) {
2,330,621✔
52
      int32_t code = tNameSetDbName(&pAuth->tbName, pCxt->acctId, pDbName, strlen(pDbName));
2,134,752✔
53
      if (TSDB_CODE_SUCCESS != code) return code;
2,134,752✔
54
    } else {
55
      pAuth->tbName.acctId = pCxt->acctId;
195,869✔
56
      pAuth->tbName.type = TSDB_SYS_NAME_T;
195,869✔
57
    }
58
  } else {
59
    toName(pCxt->acctId, pDbName, pTabName, &pAuth->tbName);
1,009,550✔
60
  }
61
  pAuth->privType = privType;
3,340,171✔
62
  pAuth->objType = objType;
3,340,171✔
63
  pAuth->isView = isView;
3,340,171✔
64
  return TSDB_CODE_SUCCESS;
3,340,171✔
65
}
66

67
static int32_t checkAuthByOwner(SAuthCxt* pCxt, SUserAuthInfo* pAuthInfo, SUserAuthRes* pAuthRes, bool *recheck) {
2,470,518✔
68
  SParseContext*   pParseCxt = pCxt->pParseCxt;
2,470,518✔
69
  const SPrivInfo* pPrivInfo = privInfoGet(pAuthInfo->privType);
2,470,518✔
70
  if (NULL == pPrivInfo) {
2,470,518✔
71
    return TSDB_CODE_PAR_INTERNAL_ERROR;
800✔
72
  }
73
  int32_t code = 0;
2,469,718✔
74
  if (pPrivInfo->category == PRIV_CATEGORY_OBJECT || pAuthInfo->objType == PRIV_OBJ_DB) {
2,469,718✔
75
    SPrivInfo privInfoDup = *pPrivInfo;
1,827,109✔
76
    if (privInfoDup.objType <= 0) privInfoDup.objType = PRIV_OBJ_DB;
1,827,109✔
77
    switch (privInfoDup.objType) {
1,827,109✔
78
      case PRIV_OBJ_DB: {
1,431,448✔
79
        SDbCfgInfo dbCfgInfo = {0};
1,431,448✔
80
        char       dbFName[TSDB_DB_FNAME_LEN] = {0};
1,431,448✔
81
        (void)tNameGetFullDbName(&pAuthInfo->tbName, dbFName);
1,431,448✔
82
        code = getDbCfgFromCache(pCxt->pMetaCache, dbFName, &dbCfgInfo);
1,431,448✔
83
        if (TSDB_CODE_SUCCESS != code) {
1,431,448✔
84
          return code;
309,550✔
85
        }
86
        // rewrite privilege for audit db
87
        if (dbCfgInfo.isAudit && pAuthInfo->objType == PRIV_OBJ_DB) {
1,361,098✔
88
          if (pAuthInfo->privType == PRIV_DB_USE) {
×
89
            pAuthInfo->useDb = AUTH_OWNED_MASK;
×
90
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
91
          } else if (pAuthInfo->privType == PRIV_CM_ALTER) {
×
92
            pAuthInfo->privType = PRIV_AUDIT_DB_ALTER;
×
93
            pAuthInfo->objType = PRIV_OBJ_CLUSTER;
×
94
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
95
          } else if (pAuthInfo->privType == PRIV_CM_DROP) {
×
96
            pAuthInfo->privType = PRIV_AUDIT_DB_DROP;
×
97
            pAuthInfo->objType = PRIV_OBJ_CLUSTER;
×
98
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
99
          } else if (pAuthInfo->privType == PRIV_TBL_CREATE) {
×
100
            pAuthInfo->privType = PRIV_AUDIT_TBL_CREATE;
×
101
            pAuthInfo->objType = PRIV_OBJ_CLUSTER;
×
102
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
103
          }
104
          return TSDB_CODE_SUCCESS;
×
105
        }
106
        if (dbCfgInfo.ownerId == pAuthInfo->userId) {
1,361,098✔
107
          pAuthRes->pass[pAuthInfo->isView ? AUTH_RES_VIEW : AUTH_RES_BASIC] = true;
280,832✔
108
          return TSDB_CODE_SUCCESS;
280,832✔
109
        }
110
        break;
1,080,266✔
111
      }
112
      default:
395,661✔
113
        return TSDB_CODE_SUCCESS;
395,661✔
114
    }
115
  }
116
_exit:
642,609✔
117
  return TSDB_CODE_SUCCESS;
1,722,875✔
118
}
119

120
static int32_t checkAuthImpl(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
630,104,271✔
121
                             EPrivObjType objType, SNode** pCond, SArray** pPrivCols, bool isView, bool effective) {
122
  SParseContext* pParseCxt = pCxt->pParseCxt;
630,104,271✔
123
  if (pParseCxt->isSuperUser) {
630,107,787✔
124
    return TSDB_CODE_SUCCESS;
626,777,258✔
125
  }
126

127
  AUTH_RES_TYPE auth_res_type = isView ? AUTH_RES_VIEW : AUTH_RES_BASIC;
3,339,818✔
128
  SUserAuthInfo authInfo = {0};
3,339,818✔
129
  int32_t code = setUserAuthInfo(pCxt->pParseCxt, pDbName, pTabName, privType, objType, isView, effective, &authInfo);
3,339,818✔
130
  if (TSDB_CODE_SUCCESS != code) return code;
3,340,171✔
131
  SUserAuthRes authRes = {0};
3,340,171✔
132
  bool         recheck = false;
3,340,171✔
133
  if (NULL != pCxt->pMetaCache && privType != PRIV_VIEW_SELECT && privType != PRIV_AUDIT_TBL_SELECT) {
3,340,171✔
134
    code = checkAuthByOwner(pCxt, &authInfo, &authRes, &recheck);
2,470,518✔
135
    if (code == TSDB_CODE_SUCCESS && authRes.pass[auth_res_type]) {
2,470,518✔
136
      goto _exit;
280,832✔
137
    }
138
    code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
2,189,686✔
139
#ifdef TD_ENTERPRISE
140
    if (isView && TSDB_CODE_PAR_INTERNAL_ERROR == code) {
2,189,686✔
141
      authInfo.isView = false;
×
142
      code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
×
143
    }
144
#endif
145
  } else {
146
    recheck = true;  // recheck since the cached key is changed
869,653✔
147
  }
148
  if (recheck) {  // the priv type of view and audit may be rewritten, need to recheck from catalog
3,059,339✔
149
    SRequestConnInfo conn = {.pTrans = pParseCxt->pTransporter,
907,809✔
150
                             .requestId = pParseCxt->requestId,
869,653✔
151
                             .requestObjRefId = pParseCxt->requestRid,
869,653✔
152
                             .mgmtEps = pParseCxt->mgmtEpSet};
153
    code = catalogChkAuth(pParseCxt->pCatalog, &conn, &authInfo, &authRes);
869,653✔
154
  }
155

156
_exit:
2,269,474✔
157
  if (TSDB_CODE_SUCCESS == code) {
3,340,171✔
158
    if (pCond) *pCond = authRes.pCond[auth_res_type];
3,340,171✔
159
    if (pPrivCols) *pPrivCols = authRes.pCols;
3,340,171✔
160
    if (taosArrayGetSize(authRes.pCols) > 0) {
3,340,171✔
161
      pCxt->pParseCxt->hasPrivCols = 1; // used later in translateCheckPrivCols for select *
6,232✔
162
    }
163
  }
164
  return TSDB_CODE_SUCCESS == code ? (authRes.pass[auth_res_type] ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED)
3,340,171✔
165
                                   : code;
5,548,845✔
166
}
167

168
static int32_t checkAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
629,880,799✔
169
                         EPrivObjType objType, SNode** pCond, SArray** pPrivCols) {
170
#ifdef TD_ENTERPRISE
171
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, pPrivCols, false, false);
629,880,799✔
172
#else
173
  return TSDB_CODE_SUCCESS;
174
#endif
175
}
176

177
static int32_t authSysPrivileges(SAuthCxt* pCxt, SNode* pStmt, EPrivType type) {
5,333,711✔
178
  return checkAuth(pCxt, NULL, NULL, type, 0, NULL, NULL);
5,333,711✔
179
}
180

181
static int32_t authObjPrivileges(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
566,700,077✔
182
                                 EPrivObjType objType) {
183
  if (!pDbName) {
566,700,077✔
184
    return TSDB_CODE_PAR_INTERNAL_ERROR;
×
185
  }
186

187
  return checkAuth(pCxt, pDbName, pTabName, privType, objType, NULL, NULL);
566,700,077✔
188
}
189

190
static int32_t checkEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
14,661✔
191
                                  EPrivObjType objType, SNode** pCond) {
192
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, NULL, NULL, false, true);
14,661✔
193
}
194

195
static int32_t checkViewAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
235,354✔
196
                             EPrivObjType objType, SNode** pCond) {
197
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, NULL, true, false);
235,354✔
198
}
199

200
static int32_t checkViewEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
2,666✔
201
                                      EPrivObjType objType, SNode** pCond) {
202
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, NULL, true, true);
2,666✔
203
}
204

205
static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) {
24,271,900✔
206
  return TSDB_CODE_SUCCESS == authQuery(pCxt, pStmt) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
24,271,900✔
207
}
208

209
static int32_t mergeStableTagCond(SNode** pWhere, SNode* pTagCond) {
588✔
210
  SLogicConditionNode* pLogicCond = NULL;
588✔
211
  int32_t              code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond);
588✔
212
  if (NULL == pLogicCond) {
588✔
213
    return code;
×
214
  }
215
  pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
588✔
216
  pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
588✔
217
  pLogicCond->condType = LOGIC_COND_TYPE_AND;
588✔
218
  code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, pTagCond);
588✔
219
  if (TSDB_CODE_SUCCESS == code) {
588✔
220
    code = nodesListMakeAppend(&pLogicCond->pParameterList, *pWhere);
588✔
221
  }
222
  if (TSDB_CODE_SUCCESS == code) {
588✔
223
    *pWhere = (SNode*)pLogicCond;
588✔
224
  } else {
225
    nodesDestroyNode((SNode*)pLogicCond);
×
226
  }
227
  return code;
588✔
228
}
229

230
EDealRes rewriteAuthTable(SNode* pNode, void* pContext) {
49,883✔
231
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
49,883✔
232
    SColumnNode*     pCol = (SColumnNode*)pNode;
15,338✔
233
    SAuthRewriteCxt* pCxt = (SAuthRewriteCxt*)pContext;
15,338✔
234
    tstrncpy(pCol->tableName, pCxt->pTarget->tableName, TSDB_TABLE_NAME_LEN);
15,338✔
235
    tstrncpy(pCol->tableAlias, pCxt->pTarget->tableAlias, TSDB_TABLE_NAME_LEN);
15,338✔
236
    pCol->appendByPrivCond = 1;
15,338✔
237
  }
238

239
  return DEAL_RES_CONTINUE;
49,883✔
240
}
241

242
static int32_t rewriteAppendStableTagCond(SNode** pWhere, SNode* pTagCond, STableNode* pTable) {
11,469✔
243
  SNode*  pTagCondCopy = NULL;
11,469✔
244
  int32_t code = nodesCloneNode(pTagCond, &pTagCondCopy);
11,469✔
245
  if (NULL == pTagCondCopy) {
11,469✔
246
    return code;
×
247
  }
248

249
  SAuthRewriteCxt cxt = {.pTarget = pTable};
11,469✔
250
  nodesWalkExpr(pTagCondCopy, rewriteAuthTable, &cxt);
11,469✔
251

252
  if (NULL == *pWhere) {
11,469✔
253
    *pWhere = pTagCondCopy;
10,718✔
254
    return TSDB_CODE_SUCCESS;
10,718✔
255
  }
256

257
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pWhere) &&
751✔
258
      LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pWhere)->condType) {
163✔
259
    return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCondCopy);
163✔
260
  }
261

262
  return mergeStableTagCond(pWhere, pTagCondCopy);
588✔
263
}
264
#if 0
265
/**
266
 * @brief Fast fail path if no star(*) specified in select clause
267
 */
268
static int32_t authSelectTblCols(SSelectStmt* pSelect, STableNode* pTable, SArray* pPrivCols) {
269
  int32_t    code = 0;
270
  SNodeList* pRetrievedCols = NULL;
271
  int32_t    nCols = taosArrayGetSize(pPrivCols);
272

273
  if (nCols <= 0) {
274
    goto _return;
275
  }
276

277
  PAR_ERR_JRET(nodesCollectColumns(pSelect, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pRetrievedCols));
278

279
  int32_t i = 0, j = 0, k = 0;
280
  SNode*  pNode = NULL;
281
  FOREACH(pNode, pRetrievedCols) {
282
    SColumnNode* pColNode = (SColumnNode*)pNode;
283

284
    j = i;
285

286
    // search in the remaining columns first for better performance if ordered
287
    bool found = false;
288
    for (; i < nCols; ++i) {
289
      SColNameFlag* pColNameFlag = (SColNameFlag*)TARRAY_GET_ELEM(pPrivCols, i);
290
      if (strcmp(pColNode->colName, pColNameFlag->colName) == 0) {
291
        found = true;
292
        ++i;
293
        break;
294
      }
295
    }
296
    if (!found) {
297
      for (k = 0; k < j; ++k) {
298
        SColNameFlag* pColNameFlag = (SColNameFlag*)TARRAY_GET_ELEM(pPrivCols, k);
299
        if (strcmp(pColNode->colName, pColNameFlag->colName) == 0) {
300
          found = true;
301
          break;
302
        }
303
      }
304
    }
305
    if (!found) {
306
      code = TSDB_CODE_PAR_COL_PERMISSION_DENIED;
307
      goto _return;
308
    }
309
  }
310
_return:
311
  nodesDestroyList(pRetrievedCols);
312
  return code;
313
}
314
#endif
315

316
static EDealRes authSelectImpl(SNode* pNode, void* pContext) {
2,002,905,017✔
317
  SSelectAuthCxt* pCxt = pContext;
2,002,905,017✔
318
  SAuthCxt*       pAuthCxt = pCxt->pAuthCxt;
2,002,905,017✔
319
  bool            isView = false;
2,002,906,057✔
320
  bool            isAudit = false;
2,002,906,057✔
321
  if (QUERY_NODE_REAL_TABLE == nodeType(pNode)) {
2,002,906,057✔
322
    SNode*      pTagCond = NULL;
201,446,077✔
323
    // SArray*     pPrivCols = NULL;
324
    STableNode* pTable = (STableNode*)pNode;
201,446,132✔
325
    if ((pAuthCxt->pParseCxt->enableSysInfo == 0) && IS_INFORMATION_SCHEMA_DB(pTable->dbName) &&
201,446,132✔
326
        (strcmp(pTable->tableName, TSDB_INS_TABLE_VGROUPS) == 0)) {
22,748✔
327
      pAuthCxt->errCode = TSDB_CODE_PAR_PERMISSION_DENIED;
728✔
328
      return DEAL_RES_ERROR;
728✔
329
    }
330
    if (authObjPrivileges(pAuthCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB) != TSDB_CODE_SUCCESS) {
201,445,900✔
331
      pAuthCxt->errCode = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
5,147✔
332
      return DEAL_RES_ERROR;
5,147✔
333
    }
334
#ifdef TD_ENTERPRISE
335
    SName name = {0};
201,439,134✔
336
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
201,440,280✔
337
    STableMeta* pTableMeta = NULL;
201,439,789✔
338
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
201,440,835✔
339
    int32_t code = getTargetMetaImpl(pAuthCxt->pParseCxt, pAuthCxt->pMetaCache, &name, &pTableMeta, true);
201,440,314✔
340
    if (TSDB_CODE_SUCCESS == code) {
201,439,712✔
341
      if (pTableMeta->isAudit) {
200,988,718✔
342
        isAudit = true;
426✔
343
      } else if (!pTableMeta->isAudit && (pTableMeta->ownerId == pAuthCxt->pParseCxt->userId)) {
200,988,839✔
344
        // owner has all privileges on the table he owns except audit table
345
        taosMemoryFree(pTableMeta);
195,072,454✔
346
        return DEAL_RES_CONTINUE;
195,071,237✔
347
      }
348
      if (TSDB_VIEW_TABLE == pTableMeta->tableType) {
5,916,229✔
349
        isView = true;
59,070✔
350
      }
351
    }
352
    taosMemoryFree(pTableMeta);
6,368,240✔
353
#endif
354
    if (!isView) {
6,367,797✔
355
      pAuthCxt->errCode =
6,308,741✔
356
          checkAuth(pAuthCxt, pTable->dbName, pTable->tableName, isAudit ? PRIV_AUDIT_TBL_SELECT : PRIV_TBL_SELECT,
6,308,727✔
357
                    PRIV_OBJ_TBL, &pTagCond, NULL);  //&pPrivCols);
358
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
6,308,741✔
359
        pAuthCxt->errCode = checkEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName,
14,661✔
360
                                               isAudit ? PRIV_AUDIT_TBL_SELECT : PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL);
361
      }
362
#if 0
363
      if (TSDB_CODE_SUCCESS == pAuthCxt->errCode && NULL != pPrivCols) {
364
        pAuthCxt->errCode = authSelectTblCols(pCxt->pSelect, pTable, pPrivCols);
365
      }
366
#endif
367
      if (TSDB_CODE_SUCCESS == pAuthCxt->errCode && NULL != pTagCond) {
6,308,741✔
368
        pAuthCxt->errCode = rewriteAppendStableTagCond(&pCxt->pSelect->pWhere, pTagCond, pTable);
11,469✔
369
      }
370
    } else {
371
      pAuthCxt->errCode =
59,070✔
372
          checkViewAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_VIEW_SELECT, PRIV_OBJ_VIEW, NULL);
59,070✔
373
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
59,070✔
374
        pAuthCxt->errCode =
2,666✔
375
            checkViewEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_VIEW_SELECT, PRIV_OBJ_VIEW, NULL);
2,666✔
376
      }
377
    }
378
    return TSDB_CODE_SUCCESS == pAuthCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
6,367,811✔
379
  } else if (QUERY_NODE_TEMP_TABLE == nodeType(pNode)) {
1,801,461,433✔
380
    return authSubquery(pAuthCxt, ((STempTableNode*)pNode)->pSubquery);
24,271,898✔
381
  }
382
  return DEAL_RES_CONTINUE;
1,777,189,014✔
383
}
384

385
static int32_t authSelect(SAuthCxt* pCxt, SSelectStmt* pSelect) {
214,437,030✔
386
  SSelectAuthCxt cxt = {.pAuthCxt = pCxt, .pSelect = pSelect};
214,437,030✔
387
  nodesWalkSelectStmt(pSelect, SQL_CLAUSE_FROM, authSelectImpl, &cxt);
214,437,547✔
388
  return pCxt->errCode;
214,437,563✔
389
}
390

391
static int32_t authSetOperator(SAuthCxt* pCxt, SSetOperator* pSetOper) {
9,473,443✔
392
  int32_t code = authQuery(pCxt, pSetOper->pLeft);
9,473,443✔
393
  if (TSDB_CODE_SUCCESS == code) {
9,473,443✔
394
    code = authQuery(pCxt, pSetOper->pRight);
9,471,085✔
395
  }
396
  return code;
9,473,443✔
397
}
398

399
static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) {
52,725✔
400
  // if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->userName, TSDB_DEFAULT_USER)) {
401
  //   return TSDB_CODE_PAR_PERMISSION_DENIED;
402
  // }
403
  if (0 == strcmp(pStmt->userName, TSDB_DEFAULT_USER)) {
52,725✔
404
    return TSDB_CODE_PAR_PERMISSION_DENIED;
183✔
405
  }
406
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_USER_DROP);  // root has SYSDBA role with USER_DROP privilege
52,542✔
407
}
408

409
static int32_t authDelete(SAuthCxt* pCxt, SDeleteStmt* pDelete) {
1,872,112✔
410
  SNode*      pTagCond = NULL;
1,872,112✔
411
  STableNode* pTable = (STableNode*)pDelete->pFromTable;
1,872,112✔
412
  int32_t     code = checkAuth(pCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
1,872,112✔
413
  if (TSDB_CODE_SUCCESS == code) {
1,872,112✔
414
    code = checkAuth(pCxt, pTable->dbName, pTable->tableName, PRIV_TBL_DELETE, PRIV_OBJ_TBL, &pTagCond, NULL);
1,872,112✔
415
  } else {
416
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
417
  }
418
  if (TSDB_CODE_SUCCESS == code && NULL != pTagCond) {
1,872,112✔
419
    code = rewriteAppendStableTagCond(&pDelete->pWhere, pTagCond, pTable);
×
420
  }
421
  return code;
1,872,112✔
422
}
423

424
static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
293,269✔
425
  SNode*      pTagCond = NULL;
293,269✔
426
  SArray*     pPrivCols = NULL;
293,269✔
427
  STableNode* pTable = (STableNode*)pInsert->pTable;
293,269✔
428
  // todo check tag condition for subtable
429
  int32_t code = checkAuth(pCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
293,269✔
430
  if (TSDB_CODE_SUCCESS == code) {
293,269✔
431
    code = checkAuth(pCxt, pTable->dbName, pTable->tableName, PRIV_TBL_INSERT, PRIV_OBJ_TBL, &pTagCond, &pPrivCols);
293,269✔
432
  } else {
433
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
434
  }
435
  return code;
293,269✔
436
}
437

438
static int32_t authShowTables(SAuthCxt* pCxt, SShowStmt* pStmt) {
594,750✔
439
  // return checkAuth(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, AUTH_TYPE_READ_OR_WRITE, NULL);
440
  // stb: more check in server, child table(TODO): more check when filter query result
441
  if (authObjPrivileges(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
594,750✔
442
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
5,096✔
443
  }
444
  return 0;
589,654✔
445
}
446

447
static int32_t authShowVtables(SAuthCxt* pCxt, SShowStmt* pStmt) { return authShowTables(pCxt, pStmt); }
62,277✔
448

449
static int32_t authShowUsage(SAuthCxt* pCxt, SShowStmt* pStmt) {
352✔
450
  if (authObjPrivileges(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
352✔
451
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
452
  }
453
  return 0;
352✔
454
}
455

456
static int32_t authShowCreateTable(SAuthCxt* pCxt, SShowCreateTableStmt* pStmt) {
97,165✔
457
  // SNode* pTagCond = NULL;
458
  // todo check tag condition for subtable
459
  // return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_READ, &pTagCond);
460
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
97,165✔
461
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
3,822✔
462
  }
463
  return authObjPrivileges(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_SHOW_CREATE, PRIV_OBJ_TBL);
93,343✔
464
}
465

466
static int32_t authShowCreateView(SAuthCxt* pCxt, SShowCreateViewStmt* pStmt) {
8,766✔
467
#ifndef TD_ENTERPRISE
468
  return TSDB_CODE_OPS_NOT_SUPPORT;
469
#else
470
  int32_t code = authObjPrivileges(pCxt, ((SShowCreateViewStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
8,766✔
471
  if (TSDB_CODE_SUCCESS == code) {
8,766✔
472
    code = checkViewAuth(pCxt, ((SShowCreateViewStmt*)pStmt)->dbName, ((SShowCreateViewStmt*)pStmt)->viewName,
8,766✔
473
                         PRIV_CM_SHOW_CREATE, PRIV_OBJ_VIEW, NULL);
474
  } else {
475
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
476
  }
477
  if (code == 0) pStmt->hasPrivilege = true;
8,766✔
478
  return 0;  // return 0 and check owner later in translateShowCreateView
8,766✔
479
#endif
480
}
481

482
static int32_t authCreateTable(SAuthCxt* pCxt, SCreateTableStmt* pStmt) {
9,052,838✔
483
  // SNode* pTagCond = NULL;
484
  // todo check tag condition for subtable
485
  // return checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, &pTagCond);
486
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
9,052,838✔
487
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
518✔
488
  }
489
  return authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
9,052,320✔
490
}
491

492
static int32_t authCreateVTable(SAuthCxt* pCxt, SCreateVTableStmt* pStmt) {
207,556✔
493
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
207,556✔
494
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
495
  }
496
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB));
207,556✔
497
  SNode* pCol = NULL;
196,836✔
498
  FOREACH(pCol, pStmt->pCols) {
153,930,509✔
499
    SColumnDefNode* pColDef = (SColumnDefNode*)pCol;
153,741,713✔
500
    if (NULL == pColDef) {
153,741,713✔
501
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
502
    }
503
    SColumnOptions* pOptions = (SColumnOptions*)pColDef->pOptions;
153,741,713✔
504
    if (pOptions && pOptions->hasRef) {
153,741,713✔
505
      if (authObjPrivileges(pCxt, pOptions->refDb, pOptions->refTable, PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
95,934,761✔
506
        return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
8,040✔
507
      }
508
    }
509
  }
510
  return TSDB_CODE_SUCCESS;
188,796✔
511
}
512

513
static int32_t authCreateVSubTable(SAuthCxt* pCxt, SCreateVSubTableStmt* pStmt) {
372,069✔
514
  int32_t    code = TSDB_CODE_SUCCESS;
372,069✔
515
  SNode*     pNode = NULL;
372,069✔
516
  SNodeList* pTmpList = pStmt->pSpecificColRefs ? pStmt->pSpecificColRefs : pStmt->pColRefs;
372,069✔
517
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
372,069✔
518
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
519
  }
520
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB));
372,069✔
521
  if (NULL == pTmpList) {
361,349✔
522
    // no column reference
523
    return TSDB_CODE_SUCCESS;
18,366✔
524
  }
525

526
  FOREACH(pNode, pTmpList) {
58,983,136✔
527
    SColumnRefNode* pColRef = (SColumnRefNode*)pNode;
58,648,193✔
528
    if (NULL == pColRef) {
58,648,193✔
529
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
530
    }
531
    if (authObjPrivileges(pCxt, pColRef->refDbName, pColRef->refTableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
58,648,193✔
532
      return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
8,040✔
533
    }
534
  }
535
  return code;
334,943✔
536
}
537

538
static int32_t authCreateStream(SAuthCxt* pCxt, SCreateStreamStmt* pStmt) {
461,098✔
539
  int32_t code = TSDB_CODE_SUCCESS;
461,098✔
540

541
  if (IS_SYS_DBNAME(pStmt->streamDbName)) {
461,098✔
542
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
543
  }
544
  if (IS_SYS_DBNAME(pStmt->targetDbName)) {
461,098✔
545
    return TSDB_CODE_PAR_PERMISSION_DENIED;
41✔
546
  }
547
  if (pStmt->pTrigger) {
461,057✔
548
    SStreamTriggerNode* pTrigger = (SStreamTriggerNode*)pStmt->pTrigger;
461,057✔
549
    STableNode*         pTriggerTable = (STableNode*)pTrigger->pTrigerTable;
461,057✔
550
    if (pTriggerTable) {
461,057✔
551
      if (IS_SYS_DBNAME(pTriggerTable->dbName)) return TSDB_CODE_PAR_PERMISSION_DENIED;
448,804✔
552
      if (authObjPrivileges(pCxt, pTriggerTable->dbName, pTriggerTable->tableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
448,763✔
553
        return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
920✔
554
      }
555
      if (authObjPrivileges(pCxt, pTriggerTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
447,843✔
556
        return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
557
      }
558
    }
559
  }
560

561
  if (authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->streamDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
460,096✔
562
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
563
  }
564
  PAR_ERR_RET(
460,096✔
565
      authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->streamDbName, NULL, PRIV_STREAM_CREATE, PRIV_OBJ_DB));
566
  if (pStmt->targetDbName[0] != '\0') {
459,406✔
567
    if (authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->targetDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
455,211✔
568
      return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
569
    }
570
    if (authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->targetDbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB)) {
455,211✔
571
      return TSDB_CODE_PAR_TB_CREATE_PERMISSION_DENIED;
230✔
572
    }
573
  }
574
  if (pStmt->pQuery) {
459,176✔
575
    PAR_ERR_RET(authQuery(pCxt, pStmt->pQuery));
455,381✔
576
  }
577
  return code;
458,716✔
578
}
579

580
static int32_t authCreateTopic(SAuthCxt* pCxt, SCreateTopicStmt* pStmt) {
183,217✔
581
  int32_t code = TSDB_CODE_SUCCESS;
183,217✔
582

583
  if (IS_SYS_DBNAME(pStmt->subDbName)) {
183,217✔
584
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
585
  }
586
  if (NULL != pStmt->pQuery) {
183,217✔
587
    PAR_ERR_RET(authQuery(pCxt, pStmt->pQuery));
143,738✔
588
  }
589
  if (NULL != pStmt->pWhere) {
182,746✔
590
    if (authObjPrivileges(pCxt, ((SCreateTopicStmt*)pStmt)->subDbName, ((SCreateTopicStmt*)pStmt)->subSTbName,
9,780✔
591
                          PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
592
      return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
×
593
    }
594
  }
595
  if (((SCreateTopicStmt*)pStmt)->subDbName[0] != '\0') {
182,746✔
596
    if (authObjPrivileges(pCxt, ((SCreateTopicStmt*)pStmt)->subDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
39,479✔
597
      return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
598
    }
599
  }
600

601
  return code;
182,746✔
602
}
603

604
static int32_t authCreateMultiTable(SAuthCxt* pCxt, SCreateMultiTablesStmt* pStmt) {
36,464,306✔
605
  int32_t code = TSDB_CODE_SUCCESS;
36,464,306✔
606
  SNode*  pNode = NULL;
36,464,306✔
607
  FOREACH(pNode, pStmt->pSubTables) {
80,075,387✔
608
    if (pNode->type == QUERY_NODE_CREATE_SUBTABLE_CLAUSE) {
43,617,733✔
609
      SCreateSubTableClause* pClause = (SCreateSubTableClause*)pNode;
43,614,492✔
610
      code = authObjPrivileges(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
43,614,492✔
611
      if (TSDB_CODE_SUCCESS != code) {
43,613,559✔
612
        code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
182✔
613
        break;
182✔
614
      }
615
      code = authObjPrivileges(pCxt, pClause->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
43,613,377✔
616
      if (TSDB_CODE_SUCCESS != code) {
43,619,299✔
617
        break;
×
618
      }
619
    } else {
620
      SCreateSubTableFromFileClause* pClause = (SCreateSubTableFromFileClause*)pNode;
×
621
      code = authObjPrivileges(pCxt, pClause->useDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
×
622
      if (TSDB_CODE_SUCCESS != code) {
×
623
        code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
624
        break;
×
625
      }
626
      code = authObjPrivileges(pCxt, pClause->useDbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
×
627
      if (TSDB_CODE_SUCCESS != code) {
×
628
        break;
×
629
      }
630
    }
631
  }
632
  return code;
36,460,727✔
633
}
634

635
static int32_t authDropTable(SAuthCxt* pCxt, SDropTableStmt* pStmt) {
2,445,835✔
636
  int32_t code = TSDB_CODE_SUCCESS;
2,445,835✔
637
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
2,445,835✔
638
    return TSDB_CODE_PAR_PERMISSION_DENIED;
250✔
639
  }
640
  SNode* pNode = NULL;
2,445,585✔
641
  FOREACH(pNode, pStmt->pTables) {
5,001,072✔
642
    SDropTableClause* pClause = (SDropTableClause*)pNode;
2,557,035✔
643
    if (checkAuth(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
2,557,035✔
644
      code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
489✔
645
      break;
489✔
646
    }
647

648
    if (!pStmt->withOpt) {
2,556,546✔
649
      // for child table, check privileges of its super table later
650
      if (checkAuth(pCxt, pClause->dbName, pClause->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL, NULL)) {
2,413,302✔
651
        code = TSDB_CODE_PAR_PERMISSION_DENIED;
1,059✔
652
        break;
1,059✔
653
      }
654
    }
655
  }
656

657
  return code;
2,445,585✔
658
}
659

660
static int32_t authDropStable(SAuthCxt* pCxt, SDropSuperTableStmt* pStmt) {
94,413✔
661
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
94,413✔
662
    return TSDB_CODE_PAR_PERMISSION_DENIED;
125✔
663
  }
664
  if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
94,288✔
665
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
666
  }
667
  if (!pStmt->withOpt) {
94,288✔
668
    PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL, NULL));
38,968✔
669
  }
670
  return 0;
94,288✔
671
}
672

673
static int32_t authDropVtable(SAuthCxt* pCxt, SDropVirtualTableStmt* pStmt) {
75,800✔
674
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
75,800✔
675
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
676
  }
677
  if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
75,800✔
678
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
679
  }
680
  if (!pStmt->withOpt) {
75,800✔
681
    PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL, NULL));
75,800✔
682
  }
683
  return 0;
65,064✔
684
}
685

686
static int32_t authAlterTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
20,075,293✔
687
  // TODO: if alterType is TSDB_ALTER_TABLE_UPDATE_CHILD_TABLE_TAG_VAL, the tables to
688
  // change tag value are child tables but we only have the super table name here.
689
  // the auth logic below haven't handled this case, but as this case is only for internal
690
  // use and not exposed to users, we can live with this for now and improve it later if needed.
691

692
  if (pStmt->alterType == TSDB_ALTER_TABLE_UPDATE_MULTI_TABLE_TAG_VAL) {
20,075,293✔
693
    int32_t code = 0;
8,661,551✔
694
    SNode* pTableNode = NULL;
8,661,551✔
695
    FOREACH(pTableNode, pStmt->pList) {
17,340,721✔
696
      SAlterTableUpdateTagValClause* pClause = (SAlterTableUpdateTagValClause*)pTableNode;
8,679,170✔
697
      if (checkAuth(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
8,679,170✔
698
        return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
699
      }
700
      code = checkAuth(pCxt, pClause->dbName, pClause->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL, NULL);
8,679,170✔
701
      if (code != TSDB_CODE_SUCCESS) {
8,679,170✔
702
        break;
×
703
      }
704
    }
705
    return code;
8,661,551✔
706
  } else {
707
    // todo check tag condition for subtable
708
    if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
11,413,742✔
709
      return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
1,572✔
710
    }
711
    return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL, NULL);
11,412,170✔
712
  }
713
}
714

715
static int32_t authAlterVTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
429,300✔
716
  // TODO: if alterType is TSDB_ALTER_TABLE_UPDATE_CHILD_TABLE_TAG_VAL, the tables to
717
  // change tag value are child tables but we only have the super table name here.
718
  // the auth logic below haven't handled this case, but as this case is only for internal
719
  // use and not exposed to users, we can live with this for now and improve it later if needed.
720

721
  if (pStmt->alterType == TSDB_ALTER_TABLE_UPDATE_MULTI_TABLE_TAG_VAL) {
429,300✔
722
    int32_t code = 0;
44,697✔
723
    SNode* pTableNode = NULL;
44,697✔
724
    FOREACH(pTableNode, pStmt->pList) {
98,332✔
725
      SAlterTableUpdateTagValClause* pClause = (SAlterTableUpdateTagValClause*)pTableNode;
59,003✔
726
      if (checkAuth(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
59,003✔
727
        return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
728
      }
729
      code = checkAuth(pCxt, pClause->dbName, pClause->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL, NULL);
59,003✔
730
      if (code != TSDB_CODE_SUCCESS) {
59,003✔
731
        break;
5,368✔
732
      }
733
    }
734
    PAR_RET(code);
44,697✔
735
  } 
736

737
  if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
384,603✔
738
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
739
  }
740
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL, NULL));
384,603✔
741
  if (pStmt->alterType == TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COLUMN_REF ||
330,923✔
742
      pStmt->alterType == TSDB_ALTER_TABLE_ALTER_COLUMN_REF) {
299,609✔
743
    if (checkAuth(pCxt, pStmt->refDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
133,525✔
744
      return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
745
    }
746
    if (checkAuth(pCxt, pStmt->refDbName, pStmt->refTableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL, NULL)) {
133,525✔
747
      return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
21,472✔
748
    }
749
  }
750
  PAR_RET(TSDB_CODE_SUCCESS);
309,451✔
751
}
752

753
static int32_t authCreateView(SAuthCxt* pCxt, SCreateViewStmt* pStmt) {
223,808✔
754
#ifndef TD_ENTERPRISE
755
  return TSDB_CODE_OPS_NOT_SUPPORT;
756
#else
757
  int32_t code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
223,808✔
758
  if (TSDB_CODE_SUCCESS == code) {
223,808✔
759
    code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_VIEW_CREATE, PRIV_OBJ_DB, NULL, NULL);
223,808✔
760
    if (code != TSDB_CODE_SUCCESS && pStmt->orReplace) {
223,808✔
761
      code = checkAuth(pCxt, pStmt->dbName, pStmt->viewName, PRIV_CM_ALTER, PRIV_OBJ_VIEW, NULL, NULL);
308✔
762
    }
763
  } else {
764
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
765
  }
766
  if (TSDB_CODE_SUCCESS == code) {
223,808✔
767
    if ((code = authQuery(pCxt, pStmt->pQuery))) {
219,660✔
768
      if (code == TSDB_CODE_PAR_PERMISSION_DENIED) code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
3,840✔
769
    }
770
  }
771
  return code;
223,808✔
772
#endif
773
}
774

775
static int32_t authDropView(SAuthCxt* pCxt, SDropViewStmt* pStmt) {
167,518✔
776
#ifndef TD_ENTERPRISE
777
  return TSDB_CODE_OPS_NOT_SUPPORT;
778
#else
779
  int32_t code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
167,518✔
780
  if (TSDB_CODE_SUCCESS == code) {
167,518✔
781
    code = checkViewAuth(pCxt, pStmt->dbName, pStmt->viewName, PRIV_CM_DROP, PRIV_OBJ_VIEW, NULL);
167,518✔
782
  } else {
783
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
784
  }
785
  if (code == 0) {
167,518✔
786
    pStmt->hasPrivilege = true;
156,553✔
787
  } else {
788
    code = 0;  // check owner in parTranslater
10,965✔
789
  }
790
  return code;
167,518✔
791
#endif
792
}
793

794
static int32_t authCreateIndex(SAuthCxt* pCxt, SCreateIndexStmt* pStmt) {
22,652✔
795
  int32_t code = authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
22,652✔
796

797
  if (TSDB_CODE_SUCCESS == code) {
22,652✔
798
    if (authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, ((SCreateIndexStmt*)pStmt)->tableName,
22,652✔
799
                          PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
800
      code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
154✔
801
    }
802
  } else {
803
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
804
  }
805

806
  if (TSDB_CODE_SUCCESS == code) {
22,652✔
807
    code = authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, ((SCreateIndexStmt*)pStmt)->tableName,
22,498✔
808
                             PRIV_IDX_CREATE, PRIV_OBJ_TBL);
809
  }
810

811
  return code;
22,652✔
812
}
813

814
static int32_t authDropIndex(SAuthCxt* pCxt, SDropIndexStmt* pStmt) {
11,678✔
815
  int32_t code = authObjPrivileges(pCxt, ((SDropIndexStmt*)pStmt)->indexDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
11,678✔
816
  if (TSDB_CODE_SUCCESS == code) {
11,678✔
817
    code = authObjPrivileges(pCxt, ((SDropIndexStmt*)pStmt)->indexDbName, ((SDropIndexStmt*)pStmt)->indexName,
11,678✔
818
                             PRIV_CM_DROP, PRIV_OBJ_IDX);
819
  } else {
820
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
821
  }
822
  return code;
11,678✔
823
}
824

825
static int32_t authShowIndexes(SAuthCxt* pCxt, SShowStmt* pStmt) { return authShowTables(pCxt, pStmt); }
8,018✔
826

827
static int32_t authCreateTsma(SAuthCxt* pCxt, SCreateTSMAStmt* pStmt) {
9,014✔
828
  int32_t code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
9,014✔
829
  if (TSDB_CODE_SUCCESS == code) {
9,014✔
830
    if (authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB)) {
9,014✔
831
      code = TSDB_CODE_PAR_TB_CREATE_PERMISSION_DENIED;
462✔
832
    }
833
  } else {
834
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
835
  }
836
  if (!pStmt->pOptions->recursiveTsma) {
9,014✔
837
    if (TSDB_CODE_SUCCESS == code) {
7,637✔
838
      if (authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, ((SCreateTSMAStmt*)pStmt)->tableName,
7,175✔
839
                            PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
840
        code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
×
841
      }
842
    }
843

844
    if (TSDB_CODE_SUCCESS == code) {
7,637✔
845
      if (authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_STREAM_CREATE, PRIV_OBJ_DB)) {
7,175✔
846
        code = TSDB_CODE_PAR_STREAM_CREATE_PERMISSION_DENIED;
308✔
847
      }
848
    }
849
    if (TSDB_CODE_SUCCESS == code) {
7,637✔
850
      code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, ((SCreateTSMAStmt*)pStmt)->tableName,
6,867✔
851
                               PRIV_TSMA_CREATE, PRIV_OBJ_TBL);
852
    }
853
  }
854

855
  return code;
9,014✔
856
}
857

858
static int32_t authDropTsma(SAuthCxt* pCxt, SDropTSMAStmt* pStmt) {
4,287✔
859
  int32_t code = authObjPrivileges(pCxt, ((SDropTSMAStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
4,287✔
860
  if (TSDB_CODE_SUCCESS == code) {
4,287✔
861
    code = authObjPrivileges(pCxt, ((SDropTSMAStmt*)pStmt)->dbName, ((SDropTSMAStmt*)pStmt)->tsmaName, PRIV_CM_DROP,
4,287✔
862
                             PRIV_OBJ_TSMA);
863
  } else {
864
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
865
  }
866
  return code;
4,287✔
867
}
868

869
static int32_t authCreateRsma(SAuthCxt* pCxt, SCreateRsmaStmt* pStmt) {
115,832✔
870
  int32_t code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
115,832✔
871
  if (TSDB_CODE_SUCCESS == code) {
115,832✔
872
    if (authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
115,832✔
873
                          PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
874
      code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
×
875
    }
876
  } else {
877
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
878
  }
879
  if (TSDB_CODE_SUCCESS == code) {
115,832✔
880
    if (authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
115,832✔
881
                          PRIV_TBL_INSERT, PRIV_OBJ_TBL)) {
882
      code = TSDB_CODE_PAR_TB_INSERT_PERMISSION_DENIED;
154✔
883
    }
884
  }
885
  if (TSDB_CODE_SUCCESS == code) {
115,832✔
886
    code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
115,678✔
887
                             PRIV_RSMA_CREATE, PRIV_OBJ_TBL);
888
  }
889
  return code;
115,832✔
890
}
891

892
static int32_t authDropRsma(SAuthCxt* pCxt, SDropRsmaStmt* pStmt) {
10,702✔
893
  int32_t code = authObjPrivileges(pCxt, ((SDropRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
10,702✔
894
  if (TSDB_CODE_SUCCESS == code) {
10,702✔
895
    code = authObjPrivileges(pCxt, ((SDropRsmaStmt*)pStmt)->dbName, ((SDropRsmaStmt*)pStmt)->rsmaName, PRIV_CM_DROP,
10,702✔
896
                             PRIV_OBJ_RSMA);
897
  } else {
898
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
899
  }
900
  return code;
10,702✔
901
}
902

903
static int32_t authShowCreateRsma(SAuthCxt* pCxt, SShowCreateRsmaStmt* pStmt) {
3,370✔
904
#ifndef TD_ENTERPRISE
905
  return TSDB_CODE_OPS_NOT_SUPPORT;
906
#else
907
  int32_t code = authObjPrivileges(pCxt, ((SShowCreateRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
3,370✔
908
  if (TSDB_CODE_SUCCESS == code) {
3,370✔
909
    code = authObjPrivileges(pCxt, ((SShowCreateRsmaStmt*)pStmt)->dbName, ((SShowCreateRsmaStmt*)pStmt)->rsmaName,
3,370✔
910
                             PRIV_CM_SHOW_CREATE, PRIV_OBJ_RSMA);
911
  } else {
912
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
913
  }
914
  if (code == 0) pStmt->hasPrivilege = true;
3,370✔
915
  return 0;  // return 0 and check owner later in translateShowCreateRsma since rsma ctgCatalog not available yet
3,370✔
916
#endif
917
}
918

919
static int32_t authCreateDatabase(SAuthCxt* pCxt, SCreateDatabaseStmt* pStmt) {
1,559,719✔
920
  return authSysPrivileges(pCxt, (SNode*)pStmt, PRIV_DB_CREATE);
1,559,719✔
921
}
922

923
static int32_t authAlterDatabase(SAuthCxt* pCxt, SAlterDatabaseStmt* pStmt) {
231,478✔
924
  return authObjPrivileges(pCxt, ((SAlterDatabaseStmt*)pStmt)->dbName, NULL, PRIV_CM_ALTER, PRIV_OBJ_DB);
231,478✔
925
}
926

927
static int32_t authAlterLocal(SAuthCxt* pCxt, SAlterLocalStmt* pStmt) {
569,551✔
928
  int32_t privType = cfgGetPrivType(tsCfg, pStmt->config, 0);
569,551✔
929
  return authSysPrivileges(pCxt, (void*)pStmt, privType);
569,551✔
930
}
931

932
static int32_t authDropRole(SAuthCxt* pCxt, SDropRoleStmt* pStmt) {
1,694✔
933
  return authSysPrivileges(pCxt, (SNode*)pStmt, PRIV_ROLE_DROP);
1,694✔
934
}
935

936
static int32_t authDropDatabase(SAuthCxt* pCxt, SDropDatabaseStmt* pStmt) {
1,305,091✔
937
  return authObjPrivileges(pCxt, ((SDropDatabaseStmt*)pStmt)->dbName, NULL, PRIV_CM_DROP, PRIV_OBJ_DB);
1,305,091✔
938
}
939

940
static int32_t authUseDatabase(SAuthCxt* pCxt, SUseDatabaseStmt* pStmt) {
96,465,470✔
941
  return authObjPrivileges(pCxt, ((SUseDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
96,465,470✔
942
}
943

944
static int32_t authGrant(SAuthCxt* pCxt, SGrantStmt* pStmt) {
868,287✔
945
  if (pStmt->optrType == TSDB_ALTER_ROLE_ROLE) {
868,287✔
946
    if (IS_SYS_PREFIX(pStmt->roleName)) {
6,953✔
947
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSDBA) == 0) {
6,328✔
948
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSDBA);
1,857✔
949
      }
950
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSSEC) == 0) {
4,471✔
951
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSSEC);
1,241✔
952
      }
953
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSAUDIT) == 0) {
3,230✔
954
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSAUDIT);
1,241✔
955
      }
956
    }
957
  }
958
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_PRIVILEGE);
863,948✔
959
}
960

961
static int32_t authRevoke(SAuthCxt* pCxt, SRevokeStmt* pStmt) {
490,272✔
962
  if (pStmt->optrType == TSDB_ALTER_ROLE_ROLE) {
490,272✔
963
    if (IS_SYS_PREFIX(pStmt->roleName)) {
5,925✔
964
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSDBA) == 0) {
5,771✔
965
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSDBA);
154✔
966
      }
967
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSSEC) == 0) {
5,617✔
968
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSSEC);
154✔
969
      }
970
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSAUDIT) == 0) {
5,463✔
971
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSAUDIT);
154✔
972
      }
973
    }
974
  }
975
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_PRIVILEGE);
489,810✔
976
}
977

978
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
506,018,207✔
979
  int32_t code = TSDB_CODE_SUCCESS;
506,018,207✔
980
#ifdef TD_ENTERPRISE
981
  switch (nodeType(pStmt)) {
506,018,207✔
982
    case QUERY_NODE_SET_OPERATOR:
9,473,443✔
983
      return authSetOperator(pCxt, (SSetOperator*)pStmt);
9,473,443✔
984
    case QUERY_NODE_SELECT_STMT:
214,436,485✔
985
      return authSelect(pCxt, (SSelectStmt*)pStmt);
214,436,485✔
986
    case QUERY_NODE_CREATE_ROLE_STMT:
2,319✔
987
      return authSysPrivileges(pCxt, pStmt, PRIV_ROLE_CREATE);
2,319✔
988
    case QUERY_NODE_DROP_ROLE_STMT:
1,694✔
989
      return authDropRole(pCxt, (SDropRoleStmt*)pStmt);
1,694✔
990
    case QUERY_NODE_CREATE_USER_STMT:
107,462✔
991
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_CREATE);
107,462✔
992
    case QUERY_NODE_ALTER_USER_STMT:
54,083✔
993
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_ALTER);
54,083✔
994
    case QUERY_NODE_DROP_USER_STMT:
52,725✔
995
      return authDropUser(pCxt, (SDropUserStmt*)pStmt);
52,725✔
996
    case QUERY_NODE_DELETE_STMT:
1,872,112✔
997
      return authDelete(pCxt, (SDeleteStmt*)pStmt);
1,872,112✔
998
    case QUERY_NODE_INSERT_STMT:
293,269✔
999
      return authInsert(pCxt, (SInsertStmt*)pStmt);
293,269✔
1000
    case QUERY_NODE_CREATE_TABLE_STMT:
9,052,838✔
1001
      return authCreateTable(pCxt, (SCreateTableStmt*)pStmt);
9,052,838✔
1002
    case QUERY_NODE_CREATE_VIRTUAL_TABLE_STMT:
207,556✔
1003
      return authCreateVTable(pCxt, (SCreateVTableStmt*)pStmt);
207,556✔
1004
    case QUERY_NODE_CREATE_VIRTUAL_SUBTABLE_STMT:
372,069✔
1005
      return authCreateVSubTable(pCxt, (SCreateVSubTableStmt*)pStmt);
372,069✔
1006
    case QUERY_NODE_CREATE_MULTI_TABLES_STMT:
36,464,757✔
1007
      return authCreateMultiTable(pCxt, (SCreateMultiTablesStmt*)pStmt);
36,464,757✔
1008
    case QUERY_NODE_CREATE_STREAM_STMT:
461,098✔
1009
      return authCreateStream(pCxt, (SCreateStreamStmt*)pStmt);
461,098✔
1010
    case QUERY_NODE_CREATE_TOPIC_STMT:
183,217✔
1011
      return authCreateTopic(pCxt, (SCreateTopicStmt*)pStmt);
183,217✔
1012
    case QUERY_NODE_DROP_TABLE_STMT:
2,445,835✔
1013
      return authDropTable(pCxt, (SDropTableStmt*)pStmt);
2,445,835✔
1014
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
94,413✔
1015
      return authDropStable(pCxt, (SDropSuperTableStmt*)pStmt);
94,413✔
1016
    case QUERY_NODE_DROP_VIRTUAL_TABLE_STMT:
75,800✔
1017
      return authDropVtable(pCxt, (SDropVirtualTableStmt*)pStmt);
75,800✔
1018
    case QUERY_NODE_ALTER_TABLE_STMT:
20,075,293✔
1019
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
1020
      return authAlterTable(pCxt, (SAlterTableStmt*)pStmt);
20,075,293✔
1021
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT:
429,300✔
1022
      return authAlterVTable(pCxt, (SAlterTableStmt*)pStmt);
429,300✔
1023
    case QUERY_NODE_SHOW_MODULES_STMT:
117,494✔
1024
    case QUERY_NODE_SHOW_BACKUP_NODES_STMT:
1025
    case QUERY_NODE_SHOW_DB_ALIVE_STMT:
1026
    // case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
1027
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
1028
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:  // TODO: check in mnode
1029
    // case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT: // not check local variables
1030
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
1031
    case QUERY_NODE_SHOW_SCORES_STMT:
1032
    case QUERY_NODE_SHOW_ARBGROUPS_STMT:
1033
    case QUERY_NODE_SHOW_ENCRYPTIONS_STMT:
1034
    case QUERY_NODE_SHOW_MOUNTS_STMT:
1035
    case QUERY_NODE_SHOW_ENCRYPT_ALGORITHMS_STMT:
1036
    case QUERY_NODE_SHOW_ENCRYPT_STATUS_STMT:
1037
      return !pCxt->pParseCxt->enableSysInfo ? TSDB_CODE_PAR_PERMISSION_DENIED : TSDB_CODE_SUCCESS;
117,494✔
1038
    case QUERY_NODE_SHOW_USERS_STMT:
123,521✔
1039
    case QUERY_NODE_SHOW_USERS_FULL_STMT:
1040
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_SHOW);
123,521✔
1041
    case QUERY_NODE_SHOW_ROLES_STMT:
1,087✔
1042
      return authSysPrivileges(pCxt, pStmt, PRIV_ROLE_SHOW);
1,087✔
1043
    case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
5,081✔
1044
    case QUERY_NODE_SHOW_ROLE_PRIVILEGES_STMT:
1045
    case QUERY_NODE_SHOW_ROLE_COL_PRIVILEGES_STMT:
1046
      return authSysPrivileges(pCxt, pStmt, PRIV_SHOW_PRIVILEGES);
5,081✔
1047
    case QUERY_NODE_SHOW_DNODES_STMT:
485,572✔
1048
    case QUERY_NODE_SHOW_MNODES_STMT:
1049
    case QUERY_NODE_SHOW_QNODES_STMT:
1050
    case QUERY_NODE_SHOW_SNODES_STMT:
1051
    case QUERY_NODE_SHOW_BNODES_STMT:
1052
      return authSysPrivileges(pCxt, pStmt, PRIV_NODES_SHOW);
485,572✔
1053
    case QUERY_NODE_SHOW_ANODES_STMT:
182✔
1054
    case QUERY_NODE_SHOW_ANODES_FULL_STMT:
1055
      return TSDB_CODE_SUCCESS;
182✔
1056
    case QUERY_NODE_SHOW_XNODES_STMT:
6,323✔
1057
    case QUERY_NODE_SHOW_XNODE_AGENTS_STMT:
1058
      return authSysPrivileges(pCxt, pStmt, PRIV_NODES_SHOW);
6,323✔
1059
    case QUERY_NODE_SHOW_XNODE_TASKS_STMT:
11,876✔
1060
    case QUERY_NODE_SHOW_XNODE_JOBS_STMT:
1061
      return TSDB_CODE_SUCCESS;
11,876✔
1062
    case QUERY_NODE_CREATE_XNODE_STMT:
5,097✔
1063
    case QUERY_NODE_DROP_XNODE_STMT:
1064
      return TSDB_CODE_SUCCESS;
5,097✔
1065
    case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT:
4,007✔
1066
    // case QUERY_NODE_SHOW_LICENCES_STMT: // do not check auth for basic licence info since it's used for taos logon
1067
    case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
1068
    case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
1069
      return authSysPrivileges(pCxt, pStmt, PRIV_GRANTS_SHOW);
4,007✔
1070
    case QUERY_NODE_SHOW_TABLES_STMT:
524,455✔
1071
    case QUERY_NODE_SHOW_STABLES_STMT:
1072
      return authShowTables(pCxt, (SShowStmt*)pStmt);
524,455✔
1073
    case QUERY_NODE_SHOW_VTABLES_STMT:
62,277✔
1074
      return authShowVtables(pCxt, (SShowStmt*)pStmt);
62,277✔
1075
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
97,165✔
1076
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
1077
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
1078
      return authShowCreateTable(pCxt, (SShowCreateTableStmt*)pStmt);
97,165✔
1079
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
8,766✔
1080
      return authShowCreateView(pCxt, (SShowCreateViewStmt*)pStmt);
8,766✔
1081
    case QUERY_NODE_CREATE_VIEW_STMT:
223,808✔
1082
      return authCreateView(pCxt, (SCreateViewStmt*)pStmt);
223,808✔
1083
    case QUERY_NODE_DROP_VIEW_STMT:
167,518✔
1084
      return authDropView(pCxt, (SDropViewStmt*)pStmt);
167,518✔
1085
    case QUERY_NODE_CREATE_INDEX_STMT:
22,652✔
1086
      return authCreateIndex(pCxt, (SCreateIndexStmt*)pStmt);
22,652✔
1087
    case QUERY_NODE_DROP_INDEX_STMT:
11,678✔
1088
      return authDropIndex(pCxt, (SDropIndexStmt*)pStmt);
11,678✔
1089
    case QUERY_NODE_SHOW_INDEXES_STMT:
8,018✔
1090
      return authShowIndexes(pCxt, (SShowStmt*)pStmt);
8,018✔
1091
    case QUERY_NODE_CREATE_TSMA_STMT:
9,014✔
1092
      return authCreateTsma(pCxt, (SCreateTSMAStmt*)pStmt);
9,014✔
1093
    case QUERY_NODE_DROP_TSMA_STMT:
4,287✔
1094
      return authDropTsma(pCxt, (SDropTSMAStmt*)pStmt);
4,287✔
1095
    case QUERY_NODE_CREATE_RSMA_STMT:
115,832✔
1096
      return authCreateRsma(pCxt, (SCreateRsmaStmt*)pStmt);
115,832✔
1097
    case QUERY_NODE_DROP_RSMA_STMT:
10,702✔
1098
      return authDropRsma(pCxt, (SDropRsmaStmt*)pStmt);
10,702✔
1099
    case QUERY_NODE_ALTER_RSMA_STMT:
21,552✔
1100
      return authObjPrivileges(pCxt, ((SAlterRsmaStmt*)pStmt)->dbName, ((SAlterRsmaStmt*)pStmt)->rsmaName,
21,552✔
1101
                               PRIV_CM_ALTER, PRIV_OBJ_RSMA);
1102
    case QUERY_NODE_SHOW_CREATE_RSMA_STMT:
3,370✔
1103
      return authShowCreateRsma(pCxt, (SShowCreateRsmaStmt*)pStmt);
3,370✔
1104
    case QUERY_NODE_CREATE_DATABASE_STMT:
1,559,719✔
1105
      return authCreateDatabase(pCxt, (SCreateDatabaseStmt*)pStmt);
1,559,719✔
1106
    case QUERY_NODE_BALANCE_VGROUP_STMT:
13,140✔
1107
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_BALANCE);
13,140✔
1108
    case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
3,211✔
1109
    case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
1110
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_BALANCE_LEADER);
3,211✔
1111
    case QUERY_NODE_MERGE_VGROUP_STMT:
×
1112
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_MERGE);
×
1113
    case QUERY_NODE_SPLIT_VGROUP_STMT:
23,709✔
1114
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_SPLIT);
23,709✔
1115
    case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
48,090✔
1116
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_REDISTRIBUTE);
48,090✔
1117
    case QUERY_NODE_CREATE_FUNCTION_STMT:
16,328✔
1118
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_CREATE);
16,328✔
1119
    case QUERY_NODE_DROP_FUNCTION_STMT:
8,952✔
1120
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_DROP);
8,952✔
1121
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
12,257✔
1122
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_SHOW);
12,257✔
1123
    case QUERY_NODE_GRANT_STMT:
868,287✔
1124
      return authGrant(pCxt, (SGrantStmt*)pStmt);
868,287✔
1125
    case QUERY_NODE_REVOKE_STMT:
490,272✔
1126
      return authRevoke(pCxt, (SRevokeStmt*)pStmt);
490,272✔
1127
    case QUERY_NODE_CREATE_DNODE_STMT:
315,442✔
1128
    case QUERY_NODE_CREATE_MNODE_STMT:
1129
    case QUERY_NODE_CREATE_QNODE_STMT:
1130
    case QUERY_NODE_CREATE_SNODE_STMT:
1131
    case QUERY_NODE_CREATE_BNODE_STMT:
1132
    case QUERY_NODE_CREATE_ANODE_STMT:
1133
      return authSysPrivileges(pCxt, pStmt, PRIV_NODE_CREATE);
315,442✔
1134
    case QUERY_NODE_DROP_DNODE_STMT:
107,935✔
1135
    case QUERY_NODE_DROP_MNODE_STMT:
1136
    case QUERY_NODE_DROP_QNODE_STMT:
1137
    case QUERY_NODE_DROP_SNODE_STMT:
1138
    case QUERY_NODE_DROP_BNODE_STMT:
1139
    case QUERY_NODE_DROP_ANODE_STMT:
1140
      return authSysPrivileges(pCxt, pStmt, PRIV_NODE_DROP);
107,935✔
1141
    case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
443,216✔
1142
    case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
1143
      return authSysPrivileges(pCxt, pStmt, PRIV_TRANS_SHOW);
443,216✔
1144
    case QUERY_NODE_KILL_TRANSACTION_STMT:
605✔
1145
      return authSysPrivileges(pCxt, pStmt, PRIV_TRANS_KILL);
605✔
1146
    case QUERY_NODE_SHOW_QUERIES_STMT:
3,297✔
1147
      return authSysPrivileges(pCxt, pStmt, PRIV_QUERY_SHOW);
3,297✔
1148
    case QUERY_NODE_KILL_QUERY_STMT:
199✔
1149
      return authSysPrivileges(pCxt, pStmt, PRIV_QUERY_KILL);
199✔
1150
    case QUERY_NODE_KILL_CONNECTION_STMT:
336✔
1151
      return authSysPrivileges(pCxt, pStmt, PRIV_CONN_KILL);
336✔
1152
    case QUERY_NODE_ALTER_DATABASE_STMT:
231,478✔
1153
      return authAlterDatabase(pCxt, (SAlterDatabaseStmt*)pStmt);
231,478✔
1154
    case QUERY_NODE_ALTER_LOCAL_STMT:
569,551✔
1155
      return authAlterLocal(pCxt, (SAlterLocalStmt*)pStmt);
569,551✔
1156
    case QUERY_NODE_DROP_DATABASE_STMT:
1,305,091✔
1157
      return authDropDatabase(pCxt, (SDropDatabaseStmt*)pStmt);
1,305,091✔
1158
    case QUERY_NODE_USE_DATABASE_STMT:
96,465,537✔
1159
      return authUseDatabase(pCxt, (SUseDatabaseStmt*)pStmt);
96,465,537✔
1160
    case QUERY_NODE_FLUSH_DATABASE_STMT:
1,900,118✔
1161
      return authObjPrivileges(pCxt, ((SFlushDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_FLUSH, PRIV_OBJ_DB);
1,900,118✔
1162
    case QUERY_NODE_COMPACT_DATABASE_STMT:
33,287✔
1163
      return authObjPrivileges(pCxt, ((SCompactDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_COMPACT, PRIV_OBJ_DB);
33,287✔
1164
    case QUERY_NODE_TRIM_DATABASE_STMT:
10,770✔
1165
      return authObjPrivileges(pCxt, ((STrimDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_TRIM, PRIV_OBJ_DB);
10,770✔
1166
    case QUERY_NODE_ROLLUP_DATABASE_STMT:
10,240✔
1167
      return authObjPrivileges(pCxt, ((SRollupDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_ROLLUP, PRIV_OBJ_DB);
10,240✔
1168
    case QUERY_NODE_SCAN_DATABASE_STMT:
876✔
1169
      return authObjPrivileges(pCxt, ((SScanDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_SCAN, PRIV_OBJ_DB);
876✔
1170
    case QUERY_NODE_SSMIGRATE_DATABASE_STMT:
3,216✔
1171
      return authObjPrivileges(pCxt, ((SSsMigrateDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_SSMIGRATE, PRIV_OBJ_DB);
3,216✔
1172
    case QUERY_NODE_SHOW_USAGE_STMT:  // disk info
352✔
1173
      return authShowUsage(pCxt, (SShowStmt*)pStmt);
352✔
1174
    case QUERY_NODE_SHOW_APPS_STMT:
1,921✔
1175
      return authSysPrivileges(pCxt, pStmt, PRIV_APPS_SHOW);
1,921✔
1176
    case QUERY_NODE_SHOW_CLUSTER_STMT:
8,223✔
1177
      return authSysPrivileges(pCxt, pStmt, PRIV_CLUSTER_SHOW);
8,223✔
1178
      // check in mnode
1179
    case QUERY_NODE_SHOW_VGROUPS_STMT:
758,191✔
1180
    case QUERY_NODE_SHOW_VNODES_STMT:
1181
    case QUERY_NODE_SHOW_COMPACTS_STMT:
1182
    case QUERY_NODE_SHOW_RETENTIONS_STMT:
1183
    case QUERY_NODE_SHOW_SCANS_STMT:
1184
    case QUERY_NODE_SHOW_SSMIGRATES_STMT:
1185
      return TSDB_CODE_SUCCESS;
758,191✔
1186
    default:
102,600,406✔
1187
      break;
102,600,406✔
1188
  }
1189
#endif
1190
  return code;
102,600,406✔
1191
}
1192

1193
int32_t authenticate(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
461,984,400✔
1194
  SAuthCxt cxt = {.pParseCxt = pParseCxt, .pMetaCache = pMetaCache, .errCode = TSDB_CODE_SUCCESS};
461,984,400✔
1195
  return authQuery(&cxt, pQuery->pRoot);
461,986,714✔
1196
}
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