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

taosdata / TDengine / #5014

03 Apr 2026 03:59PM UTC coverage: 72.256% (-0.06%) from 72.317%
#5014

push

travis-ci

web-flow
merge: from main to 3.0 branch #35067

4054 of 5985 new or added lines in 68 files covered. (67.74%)

13285 existing lines in 168 files now uncovered.

257272 of 356056 relevant lines covered (72.26%)

133154720.42 hits per line

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

78.06
/source/dnode/mnode/impl/src/mndStb.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
#define _DEFAULT_SOURCE
17
#include "audit.h"
18
#include "mndDb.h"
19
#include "mndDnode.h"
20
#include "mndIndex.h"
21
#include "mndIndexComm.h"
22
#include "mndInfoSchema.h"
23
#include "mndMnode.h"
24
#include "mndPerfSchema.h"
25
#include "mndPrivilege.h"
26
#include "mndRsma.h"
27
#include "mndShow.h"
28
#include "mndSma.h"
29
#include "mndStb.h"
30
#include "mndTopic.h"
31
#include "mndTrans.h"
32
#include "mndUser.h"
33
#include "mndVgroup.h"
34
#include "mndStream.h"
35
#include "tname.h"
36

37
#define STB_VER_SUPPORT_COMP    2
38
#define STB_VER_SUPPORT_VIRTUAL 3
39
#define STB_VER_SUPPORT_OWNER   4
40
#define STB_VER_NUMBER          STB_VER_SUPPORT_OWNER
41
#define STB_RESERVE_SIZE        55
42

43
static int32_t  mndStbActionInsert(SSdb *pSdb, SStbObj *pStb);
44
static int32_t  mndStbActionDelete(SSdb *pSdb, SStbObj *pStb);
45
static int32_t  mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew);
46
static int32_t  mndProcessTtlTimer(SRpcMsg *pReq);
47
// static int32_t  mndProcessTrimDbTimer(SRpcMsg *pReq);
48
static int32_t  mndProcessCreateStbReq(SRpcMsg *pReq);
49
static int32_t  mndProcessAlterStbReq(SRpcMsg *pReq);
50
static int32_t  mndProcessDropStbReq(SRpcMsg *pReq);
51
static int32_t  mndProcessDropTtltbRsp(SRpcMsg *pReq);
52
static int32_t  mndProcessTrimDbRsp(SRpcMsg *pReq);
53
static int32_t  mndProcessTrimDbWalRsp(SRpcMsg *pReq);
54
static int32_t  mndProcessTableMetaReq(SRpcMsg *pReq);
55
static int32_t  mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
56
static int32_t  mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
57
static void     mndCancelGetNextStb(SMnode *pMnode, void *pIter);
58
static int32_t  mndProcessTableCfgReq(SRpcMsg *pReq);
59
static int32_t  mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
60
                               void *alterOriData, int32_t alterOriDataLen);
61
static int32_t  mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
62
                                              void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter);
63

64
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq);
65
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq);
66

67
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq);
68
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq);
69
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pReq);
70
static int32_t mndProcessAuditRecordRsp(SRpcMsg *pRsp);
71

72
int32_t mndInitStb(SMnode *pMnode) {
475,805✔
73
  SSdbTable table = {
475,805✔
74
      .sdbType = SDB_STB,
75
      .keyType = SDB_KEY_BINARY,
76
      .encodeFp = (SdbEncodeFp)mndStbActionEncode,
77
      .decodeFp = (SdbDecodeFp)mndStbActionDecode,
78
      .insertFp = (SdbInsertFp)mndStbActionInsert,
79
      .updateFp = (SdbUpdateFp)mndStbActionUpdate,
80
      .deleteFp = (SdbDeleteFp)mndStbActionDelete,
81
  };
82

83
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_STB, mndProcessCreateStbReq);
475,805✔
84
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_STB, mndProcessAlterStbReq);
475,805✔
85
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_STB, mndProcessDropStbReq);
475,805✔
86
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndTransProcessRsp);
475,805✔
87
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TTL_TABLE_RSP, mndProcessDropTtltbRsp);
475,805✔
88
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_RSP, mndTransProcessRsp);
475,805✔
89
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_WAL_RSP, mndProcessTrimDbWalRsp);
475,805✔
90
  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
475,805✔
91
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
475,805✔
92
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
475,805✔
93
  mndSetMsgHandle(pMnode, TDMT_MND_TTL_TIMER, mndProcessTtlTimer);
475,805✔
94
  // mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB_TIMER, mndProcessTrimDbTimer);
95
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
475,805✔
96
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP, mndProcessDropStbReqFromMNode);
475,805✔
97
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP_RSP, mndTransProcessRsp);
475,805✔
98
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_TB_WITH_TSMA, mndProcessDropTbWithTsma);
475,805✔
99
  mndSetMsgHandle(pMnode, TDMT_VND_FETCH_TTL_EXPIRED_TBS_RSP, mndProcessFetchTtlExpiredTbs);
475,805✔
100
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TABLE_RSP, mndTransProcessRsp);
475,805✔
101
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_TABLE_RSP, mndTransProcessRsp);
475,805✔
102

103
  //  mndSetMsgHandle(pMnode, TDMT_MND_SYSTABLE_RETRIEVE, mndProcessRetrieveStbReq);
104

105
  // mndSetMsgHandle(pMnode, TDMT_MND_CREATE_INDEX, mndProcessCreateIndexReq);
106
  // mndSetMsgHandle(pMnode, TDMT_MND_DROP_INDEX, mndProcessDropIndexReq);
107
  // mndSetMsgHandle(pMnode, TDMT_VND_CREATE_INDEX_RSP, mndTransProcessRsp);
108
  // mndSetMsgHandle(pMnode, TDMT_VND_DROP_INDEX_RSP, mndTransProcessRsp);
109
  mndSetMsgHandle(pMnode, TDMT_VND_AUDIT_RECORD_RSP, mndProcessAuditRecordRsp);
475,805✔
110

111
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
475,805✔
112
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
475,805✔
113

114
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
475,805✔
115
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
475,805✔
116

117
  return sdbSetTable(pMnode->pSdb, table);
475,805✔
118
}
119

120
void mndCleanupStb(SMnode *pMnode) {}
475,738✔
121

122
SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
16,162,998✔
123
  int32_t code = 0;
16,162,998✔
124
  int32_t lino = 0;
16,162,998✔
125
  bool    hasTypeMod = false;
16,162,998✔
126
  terrno = TSDB_CODE_OUT_OF_MEMORY;
16,162,998✔
127

128
  int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + pStb->commentLen +
16,175,054✔
129
                 pStb->ast1Len + pStb->ast2Len + pStb->numOfColumns * sizeof(SColCmpr) + STB_RESERVE_SIZE +
16,175,054✔
130
                 taosArrayGetSize(pStb->pFuncs) * TSDB_FUNC_NAME_LEN + sizeof(int32_t) * pStb->numOfColumns;
16,162,998✔
131
  SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
16,162,998✔
132
  if (pRaw == NULL) goto _OVER;
16,162,998✔
133

134
  int32_t dataPos = 0;
16,162,998✔
135
  SDB_SET_BINARY(pRaw, dataPos, pStb->name, TSDB_TABLE_FNAME_LEN, _OVER)
16,162,998✔
136
  SDB_SET_BINARY(pRaw, dataPos, pStb->db, TSDB_DB_FNAME_LEN, _OVER)
16,162,998✔
137
  SDB_SET_INT64(pRaw, dataPos, pStb->createdTime, _OVER)
16,162,998✔
138
  SDB_SET_INT64(pRaw, dataPos, pStb->updateTime, _OVER)
16,162,998✔
139
  SDB_SET_INT64(pRaw, dataPos, pStb->uid, _OVER)
16,162,998✔
140
  SDB_SET_INT64(pRaw, dataPos, pStb->dbUid, _OVER)
16,162,998✔
141
  SDB_SET_INT32(pRaw, dataPos, pStb->tagVer, _OVER)
16,162,998✔
142
  SDB_SET_INT32(pRaw, dataPos, pStb->colVer, _OVER)
16,162,998✔
143
  SDB_SET_INT32(pRaw, dataPos, pStb->smaVer, _OVER)
16,162,998✔
144
  SDB_SET_INT32(pRaw, dataPos, pStb->nextColId, _OVER)
16,162,998✔
145
  SDB_SET_INT64(pRaw, dataPos, pStb->maxdelay[0], _OVER)
16,162,998✔
146
  SDB_SET_INT64(pRaw, dataPos, pStb->maxdelay[1], _OVER)
16,162,998✔
147
  SDB_SET_INT64(pRaw, dataPos, pStb->watermark[0], _OVER)
16,162,998✔
148
  SDB_SET_INT64(pRaw, dataPos, pStb->watermark[1], _OVER)
16,162,998✔
149
  SDB_SET_INT32(pRaw, dataPos, pStb->ttl, _OVER)
16,162,998✔
150
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfColumns, _OVER)
16,162,998✔
151
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfTags, _OVER)
16,162,998✔
152
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfFuncs, _OVER)
16,162,998✔
153
  SDB_SET_INT32(pRaw, dataPos, pStb->commentLen, _OVER)
16,162,998✔
154
  SDB_SET_INT32(pRaw, dataPos, pStb->ast1Len, _OVER)
16,162,998✔
155
  SDB_SET_INT32(pRaw, dataPos, pStb->ast2Len, _OVER)
16,162,998✔
156

157
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
996,600,090✔
158
    SSchema *pSchema = &pStb->pColumns[i];
980,437,092✔
159
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
980,437,092✔
160
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
980,437,092✔
161
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
980,437,092✔
162
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
980,437,092✔
163
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
980,437,092✔
164
    hasTypeMod = hasTypeMod || HAS_TYPE_MOD(pSchema);
980,437,092✔
165
  }
166

167
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
108,401,588✔
168
    SSchema *pSchema = &pStb->pTags[i];
92,238,590✔
169
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
92,238,590✔
170
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
92,238,590✔
171
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
92,238,590✔
172
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
92,238,590✔
173
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
92,238,590✔
174
  }
175

176
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
16,162,998✔
UNCOV
177
    char *func = taosArrayGet(pStb->pFuncs, i);
×
UNCOV
178
    SDB_SET_BINARY(pRaw, dataPos, func, TSDB_FUNC_NAME_LEN, _OVER)
×
179
  }
180

181
  if (pStb->commentLen > 0) {
16,162,998✔
182
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
66,684✔
183
  }
184

185
  if (pStb->ast1Len > 0) {
16,162,998✔
UNCOV
186
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
187
  }
188

189
  if (pStb->ast2Len > 0) {
16,162,998✔
UNCOV
190
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
191
  }
192

193
  if (pStb->pCmpr != NULL) {
16,162,998✔
194
    for (int i = 0; i < pStb->numOfColumns; i++) {
996,600,090✔
195
      SColCmpr *p = &pStb->pCmpr[i];
980,437,092✔
196
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
980,437,092✔
197
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
980,437,092✔
198
    }
199
  }
200
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
16,162,998✔
201

202
  if (hasTypeMod) {
16,162,998✔
203
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
621,372,708✔
204
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
616,099,736✔
205
    }
206
  }
207

208
  SDB_SET_INT8(pRaw, dataPos, pStb->virtualStb, _OVER)
16,162,998✔
209
  // since 3.4.0.0 - STB_VER_SUPPORT_OWNER
210
  SDB_SET_BINARY(pRaw, dataPos, pStb->createUser, TSDB_USER_LEN, _OVER)
16,162,998✔
211
  SDB_SET_INT64(pRaw, dataPos, pStb->ownerId, _OVER)
16,162,998✔
212
  SDB_SET_INT8(pRaw, dataPos, pStb->secureDelete, _OVER)
16,162,998✔
213
  SDB_SET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
16,162,998✔
214
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
16,162,998✔
215

216
  terrno = 0;
16,162,998✔
217

218
_OVER:
16,162,998✔
219
  if (terrno != 0) {
16,162,998✔
UNCOV
220
    mError("stb:%s, failed to encode to raw:%p since %s", pStb->name, pRaw, terrstr());
×
UNCOV
221
    sdbFreeRaw(pRaw);
×
222
    return NULL;
×
223
  }
224

225
  mTrace("stb:%s, encode to raw:%p, row:%p", pStb->name, pRaw, pStb);
16,162,998✔
226
  return pRaw;
16,162,998✔
227
}
228

229
SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
15,238,188✔
230
  int32_t code = 0;
15,238,188✔
231
  int32_t lino = 0;
15,238,188✔
232
  terrno = TSDB_CODE_OUT_OF_MEMORY;
15,238,188✔
233
  SSdbRow *pRow = NULL;
15,238,188✔
234
  SStbObj *pStb = NULL;
15,238,188✔
235
  bool     hasExtSchemas = false;
15,238,188✔
236

237
  int8_t sver = 0;
15,238,188✔
238
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
15,238,188✔
239

240
  if (sver > STB_VER_NUMBER) {
15,238,188✔
UNCOV
241
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
UNCOV
242
    goto _OVER;
×
243
  }
244

245
  pRow = sdbAllocRow(sizeof(SStbObj));
15,238,188✔
246
  if (pRow == NULL) goto _OVER;
15,238,188✔
247

248
  pStb = sdbGetRowObj(pRow);
15,238,188✔
249
  if (pStb == NULL) goto _OVER;
15,238,188✔
250

251
  int32_t dataPos = 0;
15,238,188✔
252
  SDB_GET_BINARY(pRaw, dataPos, pStb->name, TSDB_TABLE_FNAME_LEN, _OVER)
15,238,188✔
253
  SDB_GET_BINARY(pRaw, dataPos, pStb->db, TSDB_DB_FNAME_LEN, _OVER)
15,238,188✔
254
  SDB_GET_INT64(pRaw, dataPos, &pStb->createdTime, _OVER)
15,238,188✔
255
  SDB_GET_INT64(pRaw, dataPos, &pStb->updateTime, _OVER)
15,238,188✔
256
  SDB_GET_INT64(pRaw, dataPos, &pStb->uid, _OVER)
15,238,188✔
257
  SDB_GET_INT64(pRaw, dataPos, &pStb->dbUid, _OVER)
15,238,188✔
258
  SDB_GET_INT32(pRaw, dataPos, &pStb->tagVer, _OVER)
15,238,188✔
259
  SDB_GET_INT32(pRaw, dataPos, &pStb->colVer, _OVER)
15,238,188✔
260
  SDB_GET_INT32(pRaw, dataPos, &pStb->smaVer, _OVER)
15,238,188✔
261
  SDB_GET_INT32(pRaw, dataPos, &pStb->nextColId, _OVER)
15,238,188✔
262
  SDB_GET_INT64(pRaw, dataPos, &pStb->maxdelay[0], _OVER)
15,238,188✔
263
  SDB_GET_INT64(pRaw, dataPos, &pStb->maxdelay[1], _OVER)
15,238,188✔
264
  SDB_GET_INT64(pRaw, dataPos, &pStb->watermark[0], _OVER)
15,238,188✔
265
  SDB_GET_INT64(pRaw, dataPos, &pStb->watermark[1], _OVER)
15,238,188✔
266
  SDB_GET_INT32(pRaw, dataPos, &pStb->ttl, _OVER)
15,238,188✔
267
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfColumns, _OVER)
15,238,188✔
268
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfTags, _OVER)
15,238,188✔
269
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfFuncs, _OVER)
15,238,188✔
270
  SDB_GET_INT32(pRaw, dataPos, &pStb->commentLen, _OVER)
15,238,188✔
271
  SDB_GET_INT32(pRaw, dataPos, &pStb->ast1Len, _OVER)
15,238,188✔
272
  SDB_GET_INT32(pRaw, dataPos, &pStb->ast2Len, _OVER)
15,238,188✔
273

274
  pStb->pColumns = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchema));
15,238,188✔
275
  pStb->pTags = taosMemoryCalloc(pStb->numOfTags, sizeof(SSchema));
15,238,188✔
276
  pStb->pFuncs = taosArrayInit(pStb->numOfFuncs, TSDB_FUNC_NAME_LEN);
15,238,188✔
277
  if (pStb->pColumns == NULL || pStb->pTags == NULL || pStb->pFuncs == NULL) {
15,238,188✔
UNCOV
278
    goto _OVER;
×
279
  }
280

281
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,623,341,138✔
282
    SSchema *pSchema = &pStb->pColumns[i];
1,608,102,950✔
283
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
1,608,102,950✔
284
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
1,608,102,950✔
285
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
1,608,102,950✔
286
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
1,608,102,950✔
287
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
1,608,102,950✔
288
    hasExtSchemas = hasExtSchemas || HAS_TYPE_MOD(pSchema);
1,608,102,950✔
289
  }
290

291
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
161,477,657✔
292
    SSchema *pSchema = &pStb->pTags[i];
146,239,469✔
293
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
146,239,469✔
294
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
146,239,469✔
295
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
146,239,469✔
296
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
146,239,469✔
297
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
146,239,469✔
298
  }
299

300
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
15,238,188✔
UNCOV
301
    char funcName[TSDB_FUNC_NAME_LEN] = {0};
×
UNCOV
302
    SDB_GET_BINARY(pRaw, dataPos, funcName, TSDB_FUNC_NAME_LEN, _OVER)
×
303
    if (taosArrayPush(pStb->pFuncs, funcName) == NULL) goto _OVER;
×
304
  }
305

306
  if (pStb->commentLen > 0) {
15,238,188✔
307
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
64,309✔
308
    if (pStb->comment == NULL) goto _OVER;
64,309✔
309
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
64,309✔
310
  }
311

312
  if (pStb->ast1Len > 0) {
15,238,188✔
UNCOV
313
    pStb->pAst1 = taosMemoryCalloc(pStb->ast1Len, 1);
×
UNCOV
314
    if (pStb->pAst1 == NULL) goto _OVER;
×
315
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
×
316
  }
317

318
  if (pStb->ast2Len > 0) {
15,238,188✔
UNCOV
319
    pStb->pAst2 = taosMemoryCalloc(pStb->ast2Len, 1);
×
UNCOV
320
    if (pStb->pAst2 == NULL) goto _OVER;
×
321
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
×
322
  }
323

324
  pStb->pCmpr = taosMemoryCalloc(pStb->numOfColumns, sizeof(SColCmpr));
15,238,188✔
325
  if (sver < STB_VER_SUPPORT_COMP) {
15,238,188✔
326
    // compatible with old data, setup default compress value
327
    // impl later
UNCOV
328
    for (int i = 0; i < pStb->numOfColumns; i++) {
×
UNCOV
329
      SSchema  *pSchema = &pStb->pColumns[i];
×
330
      SColCmpr *pCmpr = &pStb->pCmpr[i];
×
331
      pCmpr->id = pSchema->colId;
×
332
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
×
333
    }
334
  } else {
335
    for (int i = 0; i < pStb->numOfColumns; i++) {
1,623,341,138✔
336
      SColCmpr *pCmpr = &pStb->pCmpr[i];
1,608,102,950✔
337
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
1,608,102,950✔
338
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
1,608,102,950✔
339
    }
340
  }
341
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
15,238,188✔
342

343
  // type mod
344
  if (hasExtSchemas) {
15,238,188✔
345
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
6,628,989✔
346
    if (!pStb->pExtSchemas) goto _OVER;
6,628,989✔
347
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,337,740,134✔
348
      SSchema *pSchema = &pStb->pColumns[i];
1,331,111,145✔
349
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
1,331,111,145✔
350
    }
351
  }
352

353
  if (sver < STB_VER_SUPPORT_VIRTUAL) {
15,238,188✔
UNCOV
354
    pStb->virtualStb = 0;
×
355
  } else {
356
    SDB_GET_INT8(pRaw, dataPos, &pStb->virtualStb, _OVER)
15,238,188✔
357
  }
358

359
  if (sver < STB_VER_SUPPORT_OWNER) {
15,238,188✔
UNCOV
360
    pStb->createUser[0] = 0;
×
361
  } else {
362
    SDB_GET_BINARY(pRaw, dataPos, pStb->createUser, TSDB_USER_LEN, _OVER)
15,238,188✔
363
    SDB_GET_INT64(pRaw, dataPos, &pStb->ownerId, _OVER)
15,238,188✔
364
  }
365

366
  if (dataPos + sizeof(int8_t) <= pRaw->dataLen) {
15,238,188✔
367
    SDB_GET_INT8(pRaw, dataPos, &pStb->secureDelete, _OVER)
15,238,188✔
368
  } else {
UNCOV
369
    pStb->secureDelete = 0;
×
370
  }
371

372
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
15,238,188✔
373

374
  terrno = 0;
15,238,188✔
375

376
_OVER:
15,238,188✔
377
  if (terrno != 0) {
15,238,188✔
UNCOV
378
    mError("stb:%s, failed to decode from raw:%p since %s", pStb == NULL ? "null" : pStb->name, pRaw, terrstr());
×
UNCOV
379
    if (pStb != NULL) {
×
380
      taosMemoryFreeClear(pStb->pColumns);
×
381
      taosMemoryFreeClear(pStb->pTags);
×
382
      taosMemoryFreeClear(pStb->comment);
×
383
      taosMemoryFree(pStb->pCmpr);
×
384
      taosMemoryFreeClear(pStb->pExtSchemas);
×
385
    }
386
    taosMemoryFreeClear(pRow);
×
UNCOV
387
    return NULL;
×
388
  }
389

390
  mTrace("stb:%s, decode from raw:%p, row:%p", pStb->name, pRaw, pStb);
15,238,188✔
391
  return pRow;
15,238,188✔
392
}
393

394
void mndFreeStb(SStbObj *pStb) {
17,280,911✔
395
  taosArrayDestroy(pStb->pFuncs);
17,280,911✔
396
  taosMemoryFreeClear(pStb->pColumns);
17,280,911✔
397
  taosMemoryFreeClear(pStb->pTags);
17,280,911✔
398
  taosMemoryFreeClear(pStb->comment);
17,280,911✔
399
  taosMemoryFreeClear(pStb->pAst1);
17,280,911✔
400
  taosMemoryFreeClear(pStb->pAst2);
17,280,911✔
401
  taosMemoryFreeClear(pStb->pCmpr);
17,280,911✔
402
  taosMemoryFreeClear(pStb->pExtSchemas);
17,280,911✔
403
}
17,280,911✔
404

405
static int32_t mndStbActionInsert(SSdb *pSdb, SStbObj *pStb) {
2,590,014✔
406
  mTrace("stb:%s, perform insert action, row:%p", pStb->name, pStb);
2,590,014✔
407
  return 0;
2,590,014✔
408
}
409

410
static int32_t mndStbActionDelete(SSdb *pSdb, SStbObj *pStb) {
17,206,250✔
411
  mTrace("stb:%s, perform delete action, row:%p", pStb->name, pStb);
17,206,250✔
412
  mndFreeStb(pStb);
17,206,250✔
413
  return 0;
17,206,250✔
414
}
415

416
static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
11,552,115✔
417
  terrno = 0;
11,552,115✔
418
  mTrace("stb:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
11,552,115✔
419

420
  taosWLockLatch(&pOld->lock);
11,552,115✔
421
  int32_t numOfColumns = pOld->numOfColumns;
11,552,115✔
422
  if (pOld->numOfColumns < pNew->numOfColumns) {
11,552,115✔
423
    void *pColumns = taosMemoryMalloc(pNew->numOfColumns * sizeof(SSchema));
2,705,086✔
424
    if (pColumns == NULL) {
2,705,086✔
UNCOV
425
      goto END;
×
426
    }
427
    taosMemoryFree(pOld->pColumns);
2,705,086✔
428
    pOld->pColumns = pColumns;
2,705,086✔
429
  }
430

431
  if (pOld->numOfTags < pNew->numOfTags) {
11,552,115✔
432
    void *pTags = taosMemoryMalloc(pNew->numOfTags * sizeof(SSchema));
286,330✔
433
    if (pTags == NULL) {
286,330✔
UNCOV
434
      goto END;
×
435
    }
436
    taosMemoryFree(pOld->pTags);
286,330✔
437
    pOld->pTags = pTags;
286,330✔
438
  }
439

440
  if (pOld->commentLen < pNew->commentLen && pNew->commentLen > 0) {
11,552,115✔
441
    void *comment = taosMemoryMalloc(pNew->commentLen + 1);
6,290✔
442
    if (comment == NULL) {
6,290✔
UNCOV
443
      goto END;
×
444
    }
445
    taosMemoryFree(pOld->comment);
6,290✔
446
    pOld->comment = comment;
6,290✔
447
  }
448
  pOld->commentLen = pNew->commentLen;
11,552,115✔
449

450
  if (pOld->ast1Len < pNew->ast1Len) {
11,552,115✔
UNCOV
451
    void *pAst1 = taosMemoryMalloc(pNew->ast1Len + 1);
×
UNCOV
452
    if (pAst1 == NULL) {
×
453
      goto END;
×
454
    }
455
    taosMemoryFree(pOld->pAst1);
×
UNCOV
456
    pOld->pAst1 = pAst1;
×
457
  }
458

459
  if (pOld->ast2Len < pNew->ast2Len) {
11,552,115✔
UNCOV
460
    void *pAst2 = taosMemoryMalloc(pNew->ast2Len + 1);
×
UNCOV
461
    if (pAst2 == NULL) {
×
462
      goto END;
×
463
    }
464
    taosMemoryFree(pOld->pAst2);
×
UNCOV
465
    pOld->pAst2 = pAst2;
×
466
  }
467

468
  pOld->updateTime = pNew->updateTime;
11,552,115✔
469
  pOld->tagVer = pNew->tagVer;
11,552,115✔
470
  pOld->colVer = pNew->colVer;
11,552,115✔
471
  pOld->smaVer = pNew->smaVer;
11,552,115✔
472
  pOld->nextColId = pNew->nextColId;
11,552,115✔
473
  pOld->ttl = pNew->ttl;
11,552,115✔
474
  pOld->keep = pNew->keep;
11,552,115✔
475
  pOld->ownerId = pNew->ownerId;
11,552,115✔
476
  pOld->secureDelete = pNew->secureDelete;
11,552,115✔
477

478
  if (pNew->numOfColumns > 0) {
11,552,115✔
479
    pOld->numOfColumns = pNew->numOfColumns;
11,552,115✔
480
    memcpy(pOld->pColumns, pNew->pColumns, pOld->numOfColumns * sizeof(SSchema));
11,552,115✔
481
  }
482
  if (pNew->numOfTags > 0) {
11,552,115✔
483
    pOld->numOfTags = pNew->numOfTags;
11,552,115✔
484
    memcpy(pOld->pTags, pNew->pTags, pOld->numOfTags * sizeof(SSchema));
11,552,115✔
485
  }
486
  if (pNew->commentLen > 0) {
11,552,115✔
487
    memcpy(pOld->comment, pNew->comment, pNew->commentLen + 1);
42,480✔
488
    pOld->commentLen = pNew->commentLen;
42,480✔
489
  }
490
  if (pNew->ast1Len != 0) {
11,552,115✔
UNCOV
491
    memcpy(pOld->pAst1, pNew->pAst1, pNew->ast1Len);
×
UNCOV
492
    pOld->ast1Len = pNew->ast1Len;
×
493
  }
494
  if (pNew->ast2Len != 0) {
11,552,115✔
UNCOV
495
    memcpy(pOld->pAst2, pNew->pAst2, pNew->ast2Len);
×
UNCOV
496
    pOld->ast2Len = pNew->ast2Len;
×
497
  }
498
  if (numOfColumns < pNew->numOfColumns) {
11,552,115✔
499
    taosMemoryFree(pOld->pCmpr);
2,705,086✔
500
    pOld->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
2,705,086✔
501
    if (pOld->pCmpr == NULL){
2,705,086✔
UNCOV
502
      goto END;
×
503
    }
504
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
2,705,086✔
505
  } else {
506
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
8,847,029✔
507
  }
508

509
  if (pNew->pExtSchemas) {
11,552,115✔
510
    taosMemoryFreeClear(pOld->pExtSchemas);
6,581,607✔
511
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
6,581,607✔
512
    if (pOld->pExtSchemas == NULL){
6,581,607✔
UNCOV
513
      goto END;
×
514
    }
515
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
6,581,607✔
516
  }
517

518
END:
4,970,508✔
519
  taosWUnLockLatch(&pOld->lock);
11,552,115✔
520
  return terrno;
11,552,115✔
521
}
522

523
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
37,051,190✔
524
  SSdb    *pSdb = pMnode->pSdb;
37,051,190✔
525
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
37,051,190✔
526
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
37,051,190✔
527
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3,271,798✔
528
  }
529
  return pStb;
37,051,190✔
530
}
531

532
void mndReleaseStb(SMnode *pMnode, SStbObj *pStb) {
36,276,031✔
533
  SSdb *pSdb = pMnode->pSdb;
36,276,031✔
534
  sdbRelease(pSdb, pStb);
36,276,031✔
535
}
36,276,031✔
536

537
SDbObj *mndAcquireDbByStb(SMnode *pMnode, const char *stbName) {
8,398,356✔
538
  SName name = {0};
8,398,356✔
539
  if ((terrno = tNameFromString(&name, stbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) return NULL;
8,398,356✔
540

541
  char db[TSDB_TABLE_FNAME_LEN] = {0};
8,398,356✔
542
  if ((terrno = tNameGetFullDbName(&name, db)) != 0) return NULL;
8,398,356✔
543

544
  return mndAcquireDb(pMnode, db);
8,398,356✔
545
}
546

547
static FORCE_INLINE int32_t schemaExColIdCompare(const void *colId, const void *pSchema) {
548
  if (*(col_id_t *)colId < ((SSchema *)pSchema)->colId) {
549
    return -1;
550
  } else if (*(col_id_t *)colId > ((SSchema *)pSchema)->colId) {
551
    return 1;
552
  }
553
  return 0;
554
}
555

556
void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen, void *alterOriData,
11,212,777✔
557
                            int32_t alterOriDataLen) {
558
  SEncoder       encoder = {0};
11,212,777✔
559
  int32_t        contLen;
560
  SName          name = {0};
11,212,777✔
561
  SVCreateStbReq req = {0};
11,212,777✔
562

563
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
11,212,777✔
UNCOV
564
    goto _err;
×
565
  }
566
  char dbFName[TSDB_DB_FNAME_LEN] = {0};
11,212,777✔
567
  if ((terrno = tNameGetFullDbName(&name, dbFName)) != 0) {
11,212,777✔
UNCOV
568
    goto _err;
×
569
  };
570

571
  req.name = (char *)tNameGetTableName(&name);
11,212,777✔
572
  req.suid = pStb->uid;
11,212,777✔
573
  req.rollup = pStb->ast1Len > 0 ? 1 : 0;
11,212,777✔
574
  req.alterOriData = alterOriData;
11,212,777✔
575
  req.alterOriDataLen = alterOriDataLen;
11,212,777✔
576
  req.source = pStb->source;
11,212,777✔
577
  req.virtualStb = pStb->virtualStb;
11,212,777✔
578
  req.secureDelete = pStb->secureDelete;
11,212,777✔
579
  // todo
580
  req.schemaRow.nCols = pStb->numOfColumns;
11,212,777✔
581
  req.schemaRow.version = pStb->colVer;
11,212,777✔
582
  req.schemaRow.pSchema = pStb->pColumns;
11,212,777✔
583
  req.schemaTag.nCols = pStb->numOfTags;
11,212,777✔
584
  req.schemaTag.version = pStb->tagVer;
11,212,777✔
585
  req.schemaTag.pSchema = pStb->pTags;
11,212,777✔
586

587
  req.colCmpred = 1;
11,212,777✔
588
  SColCmprWrapper *pCmpr = &req.colCmpr;
11,212,777✔
589
  req.keep = pStb->keep;
11,212,777✔
590
  pCmpr->version = pStb->colVer;
11,212,777✔
591
  pCmpr->nCols = pStb->numOfColumns;
11,212,777✔
592

593
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
11,212,777✔
594
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
957,819,041✔
595
    SColCmpr *p = &pCmpr->pColCmpr[i];
946,606,264✔
596
    p->alg = pStb->pCmpr[i].alg;
946,606,264✔
597
    p->id = pStb->pCmpr[i].id;
946,606,264✔
598
  }
599

600
  req.pExtSchemas = pStb->pExtSchemas; // only reference to it.
11,212,777✔
601
  // get length
602
  int32_t ret = 0;
11,212,777✔
603
  tEncodeSize(tEncodeSVCreateStbReq, &req, contLen, ret);
11,212,777✔
604
  if (ret < 0) {
11,212,777✔
UNCOV
605
    goto _err;
×
606
  }
607

608
  contLen += sizeof(SMsgHead);
11,212,777✔
609

610
  SMsgHead *pHead = taosMemoryCalloc(1, contLen);
11,212,777✔
611
  if (pHead == NULL) {
11,212,777✔
UNCOV
612
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
UNCOV
613
    goto _err;
×
614
  }
615

616
  pHead->contLen = htonl(contLen);
11,212,777✔
617
  pHead->vgId = htonl(pVgroup->vgId);
11,212,777✔
618

619
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
11,212,777✔
620
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
11,212,777✔
621
  if (tEncodeSVCreateStbReq(&encoder, &req) < 0) {
11,212,777✔
UNCOV
622
    taosMemoryFreeClear(pHead);
×
UNCOV
623
    tEncoderClear(&encoder);
×
624
    goto _err;
×
625
  }
626
  tEncoderClear(&encoder);
11,212,777✔
627

628
  *pContLen = contLen;
11,212,777✔
629
  taosMemoryFreeClear(req.rsmaParam.name);
11,212,777✔
630
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
11,212,777✔
631
  taosMemoryFreeClear(req.rsmaParam.funcIds);
11,212,777✔
632
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
11,212,777✔
633
  return pHead;
11,212,777✔
UNCOV
634
_err:
×
UNCOV
635
  taosMemoryFreeClear(req.rsmaParam.name);
×
636
  taosMemoryFreeClear(req.rsmaParam.funcColIds);
×
637
  taosMemoryFreeClear(req.rsmaParam.funcIds);
×
638
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
×
639
  return NULL;
×
640
}
641

642
static void *mndBuildVDropStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen) {
5,518,309✔
643
  SName        name = {0};
5,518,309✔
644
  SVDropStbReq req = {0};
5,518,309✔
645
  int32_t      contLen = 0;
5,518,309✔
646
  int32_t      ret = 0;
5,518,309✔
647
  SMsgHead    *pHead = NULL;
5,518,309✔
648
  SEncoder     encoder = {0};
5,518,309✔
649

650
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
5,518,309✔
UNCOV
651
    return NULL;
×
652
  }
653

654
  req.name = (char *)tNameGetTableName(&name);
5,518,309✔
655
  req.suid = pStb->uid;
5,518,309✔
656

657
  tEncodeSize(tEncodeSVDropStbReq, &req, contLen, ret);
5,518,309✔
658
  if (ret < 0) return NULL;
5,518,309✔
659

660
  contLen += sizeof(SMsgHead);
5,518,309✔
661
  pHead = taosMemoryMalloc(contLen);
5,518,309✔
662
  if (pHead == NULL) {
5,518,309✔
UNCOV
663
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
UNCOV
664
    return NULL;
×
665
  }
666

667
  pHead->contLen = htonl(contLen);
5,518,309✔
668
  pHead->vgId = htonl(pVgroup->vgId);
5,518,309✔
669

670
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
5,518,309✔
671

672
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
5,518,309✔
673
  int32_t code = tEncodeSVDropStbReq(&encoder, &req);
5,518,309✔
674
  tEncoderClear(&encoder);
5,518,309✔
675
  if (code != 0) {
5,518,309✔
UNCOV
676
    terrno = code;
×
UNCOV
677
    return NULL;
×
678
  }
679

680
  *pContLen = contLen;
5,518,309✔
681
  return pHead;
5,518,309✔
682
}
683

684
int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) {
2,079,861✔
685
  int32_t code = 0;
2,079,861✔
686
  if (pCreate->igExists < 0 || pCreate->igExists > 1) {
2,079,861✔
UNCOV
687
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
688
    TAOS_RETURN(code);
×
689
  }
690

691
  if (pCreate->virtualStb != 0 && pCreate->virtualStb != 1) {
2,079,861✔
UNCOV
692
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
693
    TAOS_RETURN(code);
×
694
  }
695

696
  int32_t maxColumns = pCreate->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
2,079,861✔
697
  if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > maxColumns) {
2,079,861✔
UNCOV
698
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
UNCOV
699
    TAOS_RETURN(code);
×
700
  }
701

702
  if (pCreate->numOfTags <= 0 || pCreate->numOfTags > TSDB_MAX_TAGS) {
2,079,861✔
UNCOV
703
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
704
    TAOS_RETURN(code);
×
705
  }
706

707
  SField *pField = taosArrayGet(pCreate->pColumns, 0);
2,079,861✔
708
  if (pField->type != TSDB_DATA_TYPE_TIMESTAMP) {
2,079,861✔
UNCOV
709
    code = TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
UNCOV
710
    TAOS_RETURN(code);
×
711
  }
712

713
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
163,742,529✔
714
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
161,662,668✔
715
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
161,662,668✔
UNCOV
716
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
717
      TAOS_RETURN(code);
×
718
    }
719
    if (pField1->bytes <= 0) {
161,662,668✔
UNCOV
720
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
721
      TAOS_RETURN(code);
×
722
    }
723
    if (pField1->name[0] == 0) {
161,662,668✔
UNCOV
724
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
725
      TAOS_RETURN(code);
×
726
    }
727
  }
728

729
  for (int32_t i = 0; i < pCreate->numOfTags; ++i) {
10,711,257✔
730
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
8,631,396✔
731
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
8,631,396✔
UNCOV
732
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
733
      TAOS_RETURN(code);
×
734
    }
735
    if (pField1->bytes <= 0) {
8,631,396✔
UNCOV
736
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
737
      TAOS_RETURN(code);
×
738
    }
739
    if (pField1->name[0] == 0) {
8,631,396✔
UNCOV
740
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
741
      TAOS_RETURN(code);
×
742
    }
743
  }
744

745
  TAOS_RETURN(code);
2,079,861✔
746
}
747

UNCOV
748
static int32_t mndSetCreateStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
×
UNCOV
749
  int32_t  code = 0;
×
750
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
×
751
  if (pRedoRaw == NULL) {
×
752
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
753
    if (terrno != 0) code = terrno;
×
754
    TAOS_RETURN(code);
×
755
  }
756
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
×
UNCOV
757
    sdbFreeRaw(pRedoRaw);
×
758
    TAOS_RETURN(code);
×
759
  }
760
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING));
×
761

762
  TAOS_RETURN(code);
×
763
}
764

765
int32_t mndSetCreateStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,035,916✔
766
  int32_t  code = 0;
2,035,916✔
767
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
2,035,916✔
768
  if (pCommitRaw == NULL) {
2,035,916✔
UNCOV
769
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
770
    if (terrno != 0) code = terrno;
×
771
    TAOS_RETURN(code);
×
772
  }
773
  mInfo("trans:%d, add stb to commit log", pTrans->id);
2,035,916✔
774
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
2,035,916✔
UNCOV
775
    sdbFreeRaw(pCommitRaw);
×
UNCOV
776
    TAOS_RETURN(code);
×
777
  }
778
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
2,035,916✔
779

780
  TAOS_RETURN(code);
2,035,916✔
781
}
782

783
static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,033,949✔
784
  int32_t code = 0;
2,033,949✔
785
  SSdb   *pSdb = pMnode->pSdb;
2,033,949✔
786
  SVgObj *pVgroup = NULL;
2,033,949✔
787
  void   *pIter = NULL;
2,033,949✔
788
  int32_t contLen;
2,030,542✔
789

790
  while (1) {
8,897,855✔
791
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
10,931,804✔
792
    if (pIter == NULL) break;
10,931,804✔
793
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,897,855✔
794
      sdbRelease(pSdb, pVgroup);
4,343,102✔
795
      continue;
4,343,102✔
796
    }
797

798
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
4,554,753✔
799
    if (pReq == NULL) {
4,554,753✔
UNCOV
800
      sdbCancelFetch(pSdb, pIter);
×
UNCOV
801
      sdbRelease(pSdb, pVgroup);
×
802
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
803
      if (terrno != 0) code = terrno;
×
804
      TAOS_RETURN(code);
×
805
    }
806

807
    STransAction action = {0};
4,554,753✔
808
    action.mTraceId = pTrans->mTraceId;
4,554,753✔
809
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,554,753✔
810
    action.pCont = pReq;
4,554,753✔
811
    action.contLen = contLen;
4,554,753✔
812
    action.msgType = TDMT_VND_CREATE_STB;
4,554,753✔
813
    action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
4,554,753✔
814
    action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4,554,753✔
815
    mInfo("trans:%d, add create stb to redo action", pTrans->id);
4,554,753✔
816
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
4,554,753✔
UNCOV
817
      taosMemoryFree(pReq);
×
UNCOV
818
      sdbCancelFetch(pSdb, pIter);
×
819
      sdbRelease(pSdb, pVgroup);
×
820
      TAOS_RETURN(code);
×
821
    }
822
    sdbRelease(pSdb, pVgroup);
4,554,753✔
823
  }
824

825
  TAOS_RETURN(code);
2,033,949✔
826
}
827

UNCOV
828
int32_t mndSetForceDropCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SStbObj *pStb) {
×
UNCOV
829
  int32_t code = 0;
×
830
  SSdb   *pSdb = pMnode->pSdb;
×
831
  int32_t contLen;
×
832

833
  void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
×
UNCOV
834
  if (pReq == NULL) {
×
835
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
836
    if (terrno != 0) code = terrno;
×
837
    TAOS_RETURN(code);
×
838
  }
839

UNCOV
840
  STransAction action = {0};
×
UNCOV
841
  action.mTraceId = pTrans->mTraceId;
×
842
  action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
843
  action.pCont = pReq;
×
844
  action.contLen = contLen;
×
845
  action.msgType = TDMT_VND_CREATE_STB;
×
846
  action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
×
847
  action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
×
848
  action.groupId = pVgroup->vgId;
×
849
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
850
    taosMemoryFree(pReq);
×
851
    TAOS_RETURN(code);
×
852
  }
853

UNCOV
854
  TAOS_RETURN(code);
×
855
}
856

857
static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,033,949✔
858
  int32_t code = 0;
2,033,949✔
859
  SSdb   *pSdb = pMnode->pSdb;
2,033,949✔
860
  SVgObj *pVgroup = NULL;
2,033,949✔
861
  void   *pIter = NULL;
2,033,949✔
862

863
  while (1) {
8,897,855✔
864
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
10,931,804✔
865
    if (pIter == NULL) break;
10,931,804✔
866
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
8,897,855✔
867
      sdbRelease(pSdb, pVgroup);
4,343,102✔
868
      continue;
4,343,102✔
869
    }
870

871
    int32_t contLen = 0;
4,554,753✔
872
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
4,554,753✔
873
    if (pReq == NULL) {
4,554,753✔
UNCOV
874
      sdbCancelFetch(pSdb, pIter);
×
UNCOV
875
      sdbRelease(pSdb, pVgroup);
×
876
      code = TSDB_CODE_OUT_OF_MEMORY;
×
877
      TAOS_RETURN(code);
×
878
    }
879

880
    STransAction action = {0};
4,554,753✔
881
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4,554,753✔
882
    action.pCont = pReq;
4,554,753✔
883
    action.contLen = contLen;
4,554,753✔
884
    action.msgType = TDMT_VND_DROP_STB;
4,554,753✔
885
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4,554,753✔
886
    mInfo("trans:%d, add drop stb to undo action", pTrans->id);
4,554,753✔
887
    if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
4,554,753✔
UNCOV
888
      taosMemoryFree(pReq);
×
UNCOV
889
      sdbCancelFetch(pSdb, pIter);
×
890
      sdbRelease(pSdb, pVgroup);
×
891
      TAOS_RETURN(code);
×
892
    }
893
    sdbRelease(pSdb, pVgroup);
4,554,753✔
894
  }
895

896
  TAOS_RETURN(code);
2,033,949✔
897
}
898

UNCOV
899
static SSchema *mndFindStbColumns(const SStbObj *pStb, const char *colName) {
×
UNCOV
900
  for (int32_t col = 0; col < pStb->numOfColumns; ++col) {
×
901
    SSchema *pSchema = &pStb->pColumns[col];
×
902
    if (taosStrncasecmp(pSchema->name, colName, TSDB_COL_NAME_LEN) == 0) {
×
903
      return pSchema;
×
904
    }
905
  }
UNCOV
906
  return NULL;
×
907
}
908

909
int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreate, SDbObj *pDb) {
2,040,756✔
910
  int32_t code = 0;
2,040,756✔
911
  bool    hasTypeMods = false;
2,040,756✔
912
  memcpy(pDst->name, pCreate->name, TSDB_TABLE_FNAME_LEN);
2,040,756✔
913
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
2,040,756✔
914
  pDst->createdTime = taosGetTimestampMs();
2,040,756✔
915
  pDst->updateTime = pDst->createdTime;
2,040,756✔
916
  pDst->uid = (pCreate->source == TD_REQ_FROM_TAOX_OLD || pCreate->source == TD_REQ_FROM_TAOX || pCreate->source == TD_REQ_FROM_SML)
6,115,454✔
917
                  ? pCreate->suid
918
                  : mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
4,081,512✔
919
  pDst->dbUid = pDb->uid;
2,040,756✔
920
  pDst->tagVer = 1;
2,040,756✔
921
  pDst->colVer = 1;
2,040,756✔
922
  pDst->smaVer = 1;
2,040,756✔
923
  pDst->nextColId = 1;
2,040,756✔
924
  pDst->maxdelay[0] = pCreate->delay1;
2,040,756✔
925
  pDst->maxdelay[1] = pCreate->delay2;
2,040,756✔
926
  pDst->watermark[0] = pCreate->watermark1;
2,040,756✔
927
  pDst->watermark[1] = pCreate->watermark2;
2,040,756✔
928
  pDst->ttl = pCreate->ttl;
2,040,756✔
929
  pDst->numOfColumns = pCreate->numOfColumns;
2,040,756✔
930
  pDst->numOfTags = pCreate->numOfTags;
2,040,756✔
931
  pDst->numOfFuncs = pCreate->numOfFuncs;
2,040,756✔
932
  pDst->commentLen = pCreate->commentLen;
2,040,756✔
933
  pDst->pFuncs = pCreate->pFuncs;
2,040,756✔
934
  pDst->source = pCreate->source;
2,040,756✔
935
  pDst->keep = pCreate->keep;
2,040,756✔
936
  pDst->virtualStb = pCreate->virtualStb;
2,040,756✔
937
  pDst->secureDelete = pCreate->secureDelete;
2,040,756✔
938
  pCreate->pFuncs = NULL;
2,040,756✔
939

940
  if (pDst->commentLen > 0) {
2,040,756✔
941
    pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
9,269✔
942
    if (pDst->comment == NULL) {
9,269✔
UNCOV
943
      code = terrno;
×
UNCOV
944
      TAOS_RETURN(code);
×
945
    }
946
    memcpy(pDst->comment, pCreate->pComment, pDst->commentLen + 1);
9,269✔
947
  }
948

949
  pDst->ast1Len = pCreate->ast1Len;
2,040,756✔
950
  if (pDst->ast1Len > 0) {
2,040,756✔
UNCOV
951
    pDst->pAst1 = taosMemoryCalloc(pDst->ast1Len, 1);
×
UNCOV
952
    if (pDst->pAst1 == NULL) {
×
953
      code = terrno;
×
954
      TAOS_RETURN(code);
×
955
    }
956
    memcpy(pDst->pAst1, pCreate->pAst1, pDst->ast1Len);
×
957
  }
958

959
  pDst->ast2Len = pCreate->ast2Len;
2,040,756✔
960
  if (pDst->ast2Len > 0) {
2,040,756✔
UNCOV
961
    pDst->pAst2 = taosMemoryCalloc(pDst->ast2Len, 1);
×
UNCOV
962
    if (pDst->pAst2 == NULL) {
×
963
      code = terrno;
×
964
      TAOS_RETURN(code);
×
965
    }
966
    memcpy(pDst->pAst2, pCreate->pAst2, pDst->ast2Len);
×
967
  }
968

969
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
2,040,756✔
970
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
2,040,756✔
971
  if (pDst->pColumns == NULL || pDst->pTags == NULL) {
2,040,756✔
UNCOV
972
    code = terrno;
×
UNCOV
973
    TAOS_RETURN(code);
×
974
  }
975

976
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
2,040,756✔
977
    code = TSDB_CODE_OUT_OF_RANGE;
1,170✔
978
    TAOS_RETURN(code);
1,170✔
979
  }
980

981
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
125,120,732✔
982
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
123,081,146✔
983
    SSchema           *pSchema = &pDst->pColumns[i];
123,081,146✔
984
    pSchema->type = pField->type;
123,081,146✔
985
    pSchema->bytes = pField->bytes;
123,081,146✔
986
    pSchema->flags = pField->flags;
123,081,146✔
987
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
123,081,146✔
988
    pSchema->colId = pDst->nextColId;
123,081,146✔
989
    pDst->nextColId++;
123,081,146✔
990
    hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
123,081,146✔
991
  }
992

993
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
10,437,391✔
994
    SField  *pField = taosArrayGet(pCreate->pTags, i);
8,397,805✔
995
    SSchema *pSchema = &pDst->pTags[i];
8,397,805✔
996
    pSchema->type = pField->type;
8,397,805✔
997
    pSchema->bytes = pField->bytes;
8,397,805✔
998
    if (i == 0) {
8,397,805✔
999
      SSCHMEA_SET_IDX_ON(pSchema);
2,039,586✔
1000
    }
1001
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
8,397,805✔
1002
    pSchema->colId = pDst->nextColId;
8,397,805✔
1003
    pDst->nextColId++;
8,397,805✔
1004
  }
1005
  // set col compress
1006
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
2,039,586✔
1007
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
125,120,732✔
1008
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
123,081,146✔
1009
    SSchema           *pSchema = &pDst->pColumns[i];
123,081,146✔
1010

1011
    SColCmpr *pColCmpr = &pDst->pCmpr[i];
123,081,146✔
1012
    pColCmpr->id = pSchema->colId;
123,081,146✔
1013
    pColCmpr->alg = pField->compress;
123,081,146✔
1014
  }
1015

1016
  if (hasTypeMods) {
2,039,586✔
1017
    pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
20,031✔
1018
    if (!pDst->pExtSchemas) {
20,031✔
UNCOV
1019
      code = terrno;
×
UNCOV
1020
      TAOS_RETURN(code);
×
1021
    }
1022
    for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
333,398✔
1023
      SFieldWithOptions * pField = taosArrayGet(pCreate->pColumns, i);
313,367✔
1024
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
313,367✔
1025
    }
1026
  }
1027
  TAOS_RETURN(code);
2,039,586✔
1028
}
1029
int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
1,968,782✔
1030
  SName name = {0};
1,968,782✔
1031
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
1,968,782✔
UNCOV
1032
    return -1;
×
1033
  }
1034
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
1,968,782✔
1035
}
1036

1037
static int32_t mndCreateStb(SMnode *pMnode, SRpcMsg *pReq, SMCreateStbReq *pCreate, SDbObj *pDb, SUserObj *pOperUser) {
1,967,985✔
1038
  SStbObj stbObj = {0};
1,967,985✔
1039
  int32_t code = -1;
1,967,985✔
1040

1041
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
1,967,985✔
1042

1043
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
1,967,985✔
1044
  if (pTrans == NULL) {
1,967,985✔
UNCOV
1045
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
1046
    if (terrno != 0) code = terrno;
×
1047
    goto _OVER;
×
1048
  }
1049

1050
  mInfo("trans:%d, used to create stb:%s", pTrans->id, pCreate->name);
1,967,985✔
1051
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
1,967,985✔
1052
  memcpy(stbObj.createUser, pOperUser->name, TSDB_USER_LEN);
1,966,815✔
1053
  stbObj.ownerId = pOperUser->uid;
1,966,815✔
1054

1055

1056
  SSchema *pSchema = &(stbObj.pTags[0]);
1,966,815✔
1057
  if (mndGenIdxNameForFirstTag(fullIdxName, pDb->name, stbObj.name, pSchema->name) < 0) {
1,966,815✔
UNCOV
1058
    code = terrno;
×
UNCOV
1059
    goto _OVER;
×
1060
  }
1061
  SSIdx idx = {0};
1,966,815✔
1062
  if (mndAcquireGlobalIdx(pMnode, fullIdxName, SDB_IDX, &idx) == 0 && idx.pIdx != NULL) {
1,966,815✔
UNCOV
1063
    code = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
×
UNCOV
1064
    mndReleaseIdx(pMnode, idx.pIdx);
×
1065
    goto _OVER;
×
1066
  }
1067

1068
  SIdxObj idxObj = {0};
1,966,815✔
1069
  memcpy(idxObj.name, fullIdxName, TSDB_INDEX_FNAME_LEN);
1,966,815✔
1070
  memcpy(idxObj.stb, stbObj.name, TSDB_TABLE_FNAME_LEN);
1,966,815✔
1071
  memcpy(idxObj.db, stbObj.db, TSDB_DB_FNAME_LEN);
1,966,815✔
1072
  memcpy(idxObj.colName, pSchema->name, TSDB_COL_NAME_LEN);
1,966,815✔
1073
  memcpy(idxObj.createUser, pOperUser->name, TSDB_USER_LEN);
1,966,815✔
1074
  idxObj.ownerId = pOperUser->uid;
1,966,815✔
1075
  idxObj.createdTime = taosGetTimestampMs();
1,966,815✔
1076
  idxObj.uid = mndGenerateUid(fullIdxName, strlen(fullIdxName));
1,966,815✔
1077
  idxObj.stbUid = stbObj.uid;
1,966,815✔
1078
  idxObj.dbUid = stbObj.dbUid;
1,966,815✔
1079

1080
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
1,966,815✔
1081

1082
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
1,966,815✔
1083
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,961,178✔
1084
  code = 0;
1,960,970✔
1085

1086
_OVER:
1,967,985✔
1087
  mndTransDrop(pTrans);
1,967,985✔
1088
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
1,967,985✔
1089
  TAOS_RETURN(code);
1,967,985✔
1090
}
1091

1092
typedef struct {
1093
  const char *name;
1094
  uint8_t     type;
1095
  int32_t     bytes;
1096
  uint32_t    alg;
1097
} AuditColumnDef;
1098

1099
// column is consistent with vnodePrepareRow process in vnodeSvr.c
1100
static const AuditColumnDef audit_columns[] = {
1101
    {"ts", TSDB_DATA_TYPE_TIMESTAMP, 8, 0x2000102},
1102
    {"details", TSDB_DATA_TYPE_VARCHAR, 50000 + VARSTR_HEADER_SIZE, 0xFF000302},
1103
    {"user_name", TSDB_DATA_TYPE_VARCHAR, 25 + VARSTR_HEADER_SIZE, 0xFF000302},
1104
    {"operation", TSDB_DATA_TYPE_VARCHAR, 20 + VARSTR_HEADER_SIZE, 0xFF000302},
1105
    {"db", TSDB_DATA_TYPE_VARCHAR, TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, 0xFF000302},
1106
    {"resource", TSDB_DATA_TYPE_VARCHAR, TSDB_STREAM_NAME_LEN + VARSTR_HEADER_SIZE, 0xFF000302},
1107
    {"client_address", TSDB_DATA_TYPE_VARCHAR, AUDIT_CLIENT_ADD_LEN + VARSTR_HEADER_SIZE, 0xFF000302},
1108
    {"duration", TSDB_DATA_TYPE_DOUBLE, 8, 0x5000102},
1109
    {"affected_rows", TSDB_DATA_TYPE_UBIGINT, 8, 0x1000102}};
1110

1111
static int32_t mndBuildAuditStb(SMnode *pMnode, SStbObj *pDst, SDbObj *pDb) {
77✔
1112
  int32_t code = 0;
77✔
1113
  char   *name = AUDIT_STABLE_NAME;
77✔
1114
  (void)tsnprintf(pDst->name, TSDB_TABLE_FNAME_LEN, "%s.%s", pDb->name, name);
77✔
1115
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
77✔
1116
  pDst->createdTime = taosGetTimestampMs();
77✔
1117
  pDst->updateTime = pDst->createdTime;
77✔
1118
  pDst->uid = mndGenerateUid(pDst->name, strlen(pDst->name));
77✔
1119
  pDst->dbUid = pDb->uid;
77✔
1120
  pDst->tagVer = 1;
77✔
1121
  pDst->colVer = 1;
77✔
1122
  pDst->smaVer = 1;
77✔
1123
  pDst->nextColId = 1;
77✔
1124
  pDst->maxdelay[0] = -1;
77✔
1125
  pDst->maxdelay[1] = -1;
77✔
1126
  pDst->watermark[0] = 5000;
77✔
1127
  pDst->watermark[1] = 5000;
77✔
1128
  pDst->ttl = 0;
77✔
1129
  pDst->keep = -1;
77✔
1130
  pDst->source = 0;
77✔
1131
  pDst->virtualStb = 0;
77✔
1132
  pDst->numOfColumns = sizeof(audit_columns) / sizeof(AuditColumnDef);
77✔
1133
  pDst->numOfTags = 1;
77✔
1134
  pDst->numOfFuncs = 0;
77✔
1135
  pDst->commentLen = -1;
77✔
1136
  pDst->pFuncs = NULL;
77✔
1137

1138
  pDst->ast1Len = 0;
77✔
1139
  pDst->ast2Len = 0;
77✔
1140

1141
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
77✔
1142
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
77✔
1143
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
77✔
1144
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL) {
77✔
UNCOV
1145
    code = terrno;
×
UNCOV
1146
    TAOS_RETURN(code);
×
1147
  }
1148

1149
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
77✔
UNCOV
1150
    code = TSDB_CODE_OUT_OF_RANGE;
×
UNCOV
1151
    TAOS_RETURN(code);
×
1152
  }
1153

1154
  SSchema *pSchema = NULL;
77✔
1155
  for (int32_t i = 0; i < sizeof(audit_columns) / sizeof(AuditColumnDef); ++i) {
770✔
1156
    pSchema = &pDst->pColumns[pDst->nextColId - 1];
693✔
1157
    pSchema->type = audit_columns[i].type;
693✔
1158
    pSchema->bytes = audit_columns[i].bytes;
693✔
1159
    pSchema->flags = 1;
693✔
1160
    tstrncpy(pSchema->name, audit_columns[i].name, TSDB_COL_NAME_LEN);
693✔
1161
    pSchema->colId = pDst->nextColId;
693✔
1162
    // hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
1163
    SColCmpr *pColCmpr = &pDst->pCmpr[pDst->nextColId - 1];
693✔
1164
    pColCmpr->id = pSchema->colId;
693✔
1165
    pColCmpr->alg = audit_columns[i].alg;
693✔
1166
    pDst->nextColId++;
693✔
1167
  }
1168

1169
  // tag
1170
  pSchema = &pDst->pTags[0];
77✔
1171
  pSchema->type = TSDB_DATA_TYPE_VARCHAR;
77✔
1172
  pSchema->bytes = 64 + VARSTR_HEADER_SIZE;
77✔
1173
  SSCHMEA_SET_IDX_ON(pSchema);
77✔
1174
  tstrncpy(pSchema->name, "cluster_id", TSDB_COL_NAME_LEN);
77✔
1175
  pSchema->colId = pDst->nextColId;
77✔
1176
  pDst->nextColId++;
77✔
1177

1178
  /*
1179
    if (hasTypeMods) {
1180
      pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
1181
      if (!pDst->pExtSchemas) {
1182
        code = terrno;
1183
        TAOS_RETURN(code);
1184
      }
1185
      for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
1186
        SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
1187
        pDst->pExtSchemas[i].typeMod = pField->typeMod;
1188
      }
1189
    }
1190
  */
1191
  TAOS_RETURN(code);
77✔
1192
}
1193

1194
static int32_t mndSetCreateAuditStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
77✔
1195
                                               SVgObj *pVgroup) {
1196
  int32_t code = 0;
77✔
1197
  SSdb   *pSdb = pMnode->pSdb;
77✔
1198

1199
  int32_t contLen;
77✔
1200

1201
  if (pVgroup == NULL) {
77✔
UNCOV
1202
    code = TSDB_CODE_INVALID_PARA;
×
UNCOV
1203
    TAOS_RETURN(code);
×
1204
  }
1205

1206
  void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
77✔
1207
  if (pReq == NULL) {
77✔
UNCOV
1208
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
1209
    if (terrno != 0) code = terrno;
×
1210
    TAOS_RETURN(code);
×
1211
  }
1212

1213
  STransAction action = {0};
77✔
1214
  action.mTraceId = pTrans->mTraceId;
77✔
1215
  action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
77✔
1216
  action.pCont = pReq;
77✔
1217
  action.contLen = contLen;
77✔
1218
  action.msgType = TDMT_VND_CREATE_STB;
77✔
1219
  action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
77✔
1220
  action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
77✔
1221
  mInfo("trans:%d, add create stb to redo action", pTrans->id);
77✔
1222
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
77✔
UNCOV
1223
    taosMemoryFree(pReq);
×
UNCOV
1224
    TAOS_RETURN(code);
×
1225
  }
1226

1227
  TAOS_RETURN(code);
77✔
1228
}
1229

1230
// Note: pVgroup is expected to point to the first element of a vgroup array (e.g. pVgroups at the call site).
1231
// Only the first element is used for creating the audit super table.
1232
int32_t mndCreateAuditStb(SMnode *pMnode, SDbObj *pDb, SUserObj *pOperUser, STrans *pTrans, SVgObj *pVgroup) {
77✔
1233
  SStbObj stbObj = {0};
77✔
1234
  int32_t code = -1;
77✔
1235

1236
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
77✔
1237

1238
  TAOS_CHECK_GOTO(mndBuildAuditStb(pMnode, &stbObj, pDb), NULL, _OVER);
77✔
1239
  memcpy(stbObj.createUser, pOperUser->name, TSDB_USER_LEN);
77✔
1240
  stbObj.ownerId = pOperUser->uid;
77✔
1241

1242
  SSchema *pSchema = &(stbObj.pTags[0]);
77✔
1243
  if (mndGenIdxNameForFirstTag(fullIdxName, pDb->name, stbObj.name, pSchema->name) < 0) {
77✔
UNCOV
1244
    code = terrno;
×
UNCOV
1245
    goto _OVER;
×
1246
  }
1247

1248
  SSIdx idx = {0};
77✔
1249
  if (mndAcquireGlobalIdx(pMnode, fullIdxName, SDB_IDX, &idx) == 0 && idx.pIdx != NULL) {
77✔
UNCOV
1250
    code = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
×
UNCOV
1251
    mndReleaseIdx(pMnode, idx.pIdx);
×
1252
    goto _OVER;
×
1253
  }
1254

1255
  SIdxObj idxObj = {0};
77✔
1256
  memcpy(idxObj.name, fullIdxName, TSDB_INDEX_FNAME_LEN);
77✔
1257
  memcpy(idxObj.stb, stbObj.name, TSDB_TABLE_FNAME_LEN);
77✔
1258
  memcpy(idxObj.db, stbObj.db, TSDB_DB_FNAME_LEN);
77✔
1259
  memcpy(idxObj.colName, pSchema->name, TSDB_COL_NAME_LEN);
77✔
1260
  memcpy(idxObj.createUser, pOperUser->name, TSDB_USER_LEN);
77✔
1261
  idxObj.ownerId = pOperUser->uid;
77✔
1262
  idxObj.createdTime = taosGetTimestampMs();
77✔
1263
  idxObj.uid = mndGenerateUid(fullIdxName, strlen(fullIdxName));
77✔
1264
  idxObj.stbUid = stbObj.uid;
77✔
1265
  idxObj.dbUid = stbObj.dbUid;
77✔
1266

1267
  mndTransSetDbName(pTrans, pDb->name, stbObj.name);
77✔
1268
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
77✔
1269
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
77✔
1270
  TAOS_CHECK_GOTO(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
77✔
1271
  TAOS_CHECK_GOTO(mndSetCreateAuditStbRedoActions(pMnode, pTrans, pDb, &stbObj, pVgroup), NULL, _OVER);
77✔
1272

1273
  code = 0;
77✔
1274

1275
_OVER:
77✔
1276
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
77✔
1277
  TAOS_RETURN(code);
77✔
1278
}
1279

1280
static int32_t mndProcessAuditRecordRsp(SRpcMsg *pRsp) {
308✔
1281
  int32_t code = 0;
308✔
1282

1283
  if (pRsp == NULL) {
308✔
UNCOV
1284
    mError("audit record rsp, null response message");
×
UNCOV
1285
    return -1;
×
1286
  }
1287

1288
  if (pRsp->code != 0) {
308✔
UNCOV
1289
    mError("audit record rsp failed, code:%d", pRsp->code);
×
UNCOV
1290
    return pRsp->code;
×
1291
  }
1292

1293
  SMnode *pMnode = pRsp->info.node;
308✔
1294
  SSdb   *pSdb = pMnode->pSdb;
308✔
1295
  (void)pMnode;  // currently unused, kept for potential future use
1296
  (void)pSdb;    // currently unused, kept for potential future use
1297

1298
  mDebug("audit record rsp succeeded, code:%d", pRsp->code);
308✔
1299

1300
  // no need to implement this rsp, since we do not care about the result of audit record insertion
1301

1302
  return code;
308✔
1303
}
1304

1305
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
2,039,586✔
1306
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
2,039,586✔
1307
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
2,039,586✔
1308
  TAOS_CHECK_RETURN(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb));
2,033,949✔
1309
  TAOS_CHECK_RETURN(mndSetCreateStbRedoActions(pMnode, pTrans, pDb, pStb));
2,033,949✔
1310
  TAOS_CHECK_RETURN(mndSetCreateStbUndoActions(pMnode, pTrans, pDb, pStb));
2,033,949✔
1311
  return 0;
2,033,949✔
1312
}
1313

1314
static int32_t mndProcessTtlTimer(SRpcMsg *pReq) {
3,440,050✔
1315
  SMnode           *pMnode = pReq->info.node;
3,440,050✔
1316
  SSdb             *pSdb = pMnode->pSdb;
3,440,050✔
1317
  SVgObj           *pVgroup = NULL;
3,440,050✔
1318
  void             *pIter = NULL;
3,440,050✔
1319
  SVDropTtlTableReq ttlReq = {
3,440,050✔
1320
      .timestampSec = taosGetTimestampSec(), .ttlDropMaxCount = tsTtlBatchDropNum, .nUids = 0, .pTbUids = NULL};
3,440,050✔
1321
  int32_t reqLen = tSerializeSVDropTtlTableReq(NULL, 0, &ttlReq);
3,440,050✔
1322
  int32_t contLen = reqLen + sizeof(SMsgHead);
3,440,050✔
1323

1324
  mDebug("start to process ttl timer");
3,440,050✔
1325

1326
  while (1) {
13,682,333✔
1327
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
17,122,383✔
1328
    if (pIter == NULL) break;
17,122,383✔
1329

1330
    if (pVgroup->mountVgId) {
13,682,333✔
1331
      sdbRelease(pSdb, pVgroup);
624✔
1332
      continue;
624✔
1333
    }
1334

1335
    int32_t   code = 0;
13,681,709✔
1336
    SMsgHead *pHead = rpcMallocCont(contLen);
13,681,709✔
1337
    if (pHead == NULL) {
13,681,709✔
UNCOV
1338
      sdbRelease(pSdb, pVgroup);
×
UNCOV
1339
      continue;
×
1340
    }
1341
    pHead->contLen = htonl(contLen);
13,681,709✔
1342
    pHead->vgId = htonl(pVgroup->vgId);
13,681,709✔
1343
    if ((code = tSerializeSVDropTtlTableReq((char *)pHead + sizeof(SMsgHead), reqLen, &ttlReq)) < 0) {
13,681,709✔
UNCOV
1344
      mError("vgId:%d, failed to serialize drop ttl table request since %s", pVgroup->vgId, tstrerror(code));
×
UNCOV
1345
      sdbRelease(pSdb, pVgroup);
×
1346
      continue;
×
1347
    }
1348

1349
    SRpcMsg rpcMsg = {
13,681,709✔
1350
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1351
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
13,681,709✔
1352
    code = tmsgSendReq(&epSet, &rpcMsg);
13,681,709✔
1353
    if (code != 0) {
13,681,709✔
1354
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
25,666✔
1355
    } else {
1356
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
13,656,043✔
1357
    }
1358
    sdbRelease(pSdb, pVgroup);
13,681,709✔
1359
  }
1360

1361
  return 0;
3,440,050✔
1362
}
1363

1364
#if 0
1365
static int32_t mndProcessTrimDbTimer(SRpcMsg *pReq) {
1366
  SMnode     *pMnode = pReq->info.node;
1367
  SSdb       *pSdb = pMnode->pSdb;
1368
  SVgObj     *pVgroup = NULL;
1369
  void       *pIter = NULL;
1370
  SVTrimDbReq trimReq = {0};
1371
  trimReq.compactStartTime = taosGetTimestampMs();
1372
  trimReq.tw.skey = INT64_MIN;
1373
  trimReq.tw.ekey = trimReq.compactStartTime;
1374
  trimReq.compactId = 0;  // TODO: use the real value
1375
  trimReq.metaOnly = 0;
1376
  trimReq.triggerType = TSDB_TRIGGER_AUTO;
1377
  int32_t reqLen = tSerializeSVTrimDbReq(NULL, 0, &trimReq);
1378
  int32_t contLen = reqLen + sizeof(SMsgHead);
1379

1380
  while (1) {
1381
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1382
    if (pIter == NULL) break;
1383
    if (pVgroup->mountVgId) {
1384
      sdbRelease(pSdb, pVgroup);
1385
      continue;
1386
    }
1387

1388
    int32_t code = 0;
1389

1390
    SMsgHead *pHead = rpcMallocCont(contLen);
1391
    if (pHead == NULL) {
1392
      sdbCancelFetch(pSdb, pVgroup);
1393
      sdbRelease(pSdb, pVgroup);
1394
      continue;
1395
    }
1396
    pHead->contLen = htonl(contLen);
1397
    pHead->vgId = htonl(pVgroup->vgId);
1398
    trimReq.dbUid = pVgroup->dbUid;
1399
    (void)snprintf(trimReq.db, sizeof(trimReq.db), "%s", pVgroup->dbName);
1400
    if ((code = tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &trimReq)) < 0) {
1401
      mError("vgId:%d, failed to serialize trim db request since %s", pVgroup->vgId, tstrerror(code));
1402
    }
1403

1404
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen};
1405
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
1406
    code = tmsgSendReq(&epSet, &rpcMsg);
1407
    if (code != 0) {
1408
      mError("vgId:%d, timer failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code);
1409
    } else {
1410
      mInfo("vgId:%d, timer send vnode-trim request to vnode, time:%" PRIi64 " ms", pVgroup->vgId, trimReq.tw.ekey);
1411
    }
1412
    sdbRelease(pSdb, pVgroup);
1413
  }
1414

1415
  return 0;
1416
}
1417
#endif
1418

1419
static int32_t mndFindSuperTableTagIndex(const SStbObj *pStb, const char *tagName) {
3,728,155✔
1420
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
31,280,566✔
1421
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
28,494,452✔
1422
      return tag;
942,041✔
1423
    }
1424
  }
1425

1426
  return -1;
2,786,114✔
1427
}
1428

1429
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
5,693,711✔
1430
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
338,036,571✔
1431
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
335,179,021✔
1432
      return col;
2,836,161✔
1433
    }
1434
  }
1435

1436
  return -1;
2,857,550✔
1437
}
1438

1439
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
3,012,461✔
1440
  int32_t rowLen = 0;
3,012,461✔
1441
  for (int32_t i = 0; i < nSchema; ++i) {
213,813,230✔
1442
    rowLen += (pSchemas + i)->bytes;
210,800,769✔
1443
  }
1444

1445
  int32_t nField = taosArrayGetSize(pFields);
3,012,461✔
1446
  for (int32_t i = 0; i < nField; ++i) {
6,024,922✔
1447
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
3,012,461✔
1448
  }
1449

1450
  return rowLen <= maxLen;
3,012,461✔
1451
}
1452

1453
static int32_t mndBuildStbFromAlter(SStbObj *pStb, SStbObj *pDst, SMCreateStbReq *createReq) {
31,418✔
1454
  int32_t code = 0;
31,418✔
1455
  taosRLockLatch(&pStb->lock);
31,418✔
1456
  memcpy(pDst, pStb, sizeof(SStbObj));
31,418✔
1457
  taosRUnLockLatch(&pStb->lock);
31,418✔
1458

1459
  pDst->source = createReq->source;
31,418✔
1460
  pDst->updateTime = taosGetTimestampMs();
31,418✔
1461
  pDst->numOfColumns = createReq->numOfColumns;
31,418✔
1462
  pDst->numOfTags = createReq->numOfTags;
31,418✔
1463
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
31,418✔
1464
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
31,418✔
1465
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SColCmpr));
31,418✔
1466
  pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
31,418✔
1467

1468
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL || pDst->pExtSchemas == NULL) {
31,418✔
UNCOV
1469
    code = terrno;
×
UNCOV
1470
    TAOS_RETURN(code);
×
1471
  }
1472

1473
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
31,418✔
UNCOV
1474
    code = TSDB_CODE_OUT_OF_RANGE;
×
UNCOV
1475
    TAOS_RETURN(code);
×
1476
  }
1477

1478
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
227,627✔
1479
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
196,209✔
1480
    SSchema           *pSchema = &pDst->pColumns[i];
196,209✔
1481
    pSchema->type = pField->type;
196,209✔
1482
    pSchema->bytes = pField->bytes;
196,209✔
1483
    pSchema->flags = pField->flags;
196,209✔
1484
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
196,209✔
1485
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
196,209✔
1486
    if (cIndex >= 0) {
196,209✔
1487
      pSchema->colId = pStb->pColumns[cIndex].colId;
182,051✔
1488
    } else {
1489
      pSchema->colId = pDst->nextColId++;
14,158✔
1490
    }
1491
  }
1492

1493
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
231,334✔
1494
    SField  *pField = taosArrayGet(createReq->pTags, i);
199,916✔
1495
    SSchema *pSchema = &pDst->pTags[i];
199,916✔
1496
    pSchema->type = pField->type;
199,916✔
1497
    pSchema->bytes = pField->bytes;
199,916✔
1498
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
199,916✔
1499
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
199,916✔
1500
    if (cIndex >= 0) {
199,916✔
1501
      pSchema->colId = pStb->pTags[cIndex].colId;
189,786✔
1502
    } else {
1503
      pSchema->colId = pDst->nextColId++;
10,130✔
1504
    }
1505
  }
1506
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
227,627✔
1507
    SColCmpr          *p = pDst->pCmpr + i;
196,209✔
1508
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
196,209✔
1509
    SSchema           *pSchema = &pDst->pColumns[i];
196,209✔
1510
    p->id = pSchema->colId;
196,209✔
1511
    if (pField->compress == 0) {
196,209✔
UNCOV
1512
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1513
    } else {
1514
      p->alg = pField->compress;
196,209✔
1515
    }
1516
    if (pField->flags & COL_HAS_TYPE_MOD) {
196,209✔
UNCOV
1517
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
×
1518
    }
1519
  }
1520
  pDst->tagVer = createReq->tagVer;
31,418✔
1521
  pDst->colVer = createReq->colVer;
31,418✔
1522
  return TSDB_CODE_SUCCESS;
31,418✔
1523
}
1524

1525
// used for tmq_get_json_meta to build alter msg
1526
static void buildAlterMsg(SStbObj *pStb, SStbObj *pDst, void** pAlterBuf, int32_t* len){
31,418✔
1527
  SMAlterStbReq alterReq = {0};
31,418✔
1528
  alterReq.pFields = taosArrayInit(2, sizeof(SField));
31,418✔
1529
  if (NULL == alterReq.pFields) {
31,418✔
UNCOV
1530
    mError("failed to init alter fields array");
×
UNCOV
1531
    goto END;
×
1532
  }
1533
  tstrncpy(alterReq.name, pStb->name, TSDB_TABLE_FNAME_LEN);
31,418✔
1534
  for (int32_t i = 0; i < pDst->numOfColumns && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
219,625✔
1535
    SSchema           *pSchema = &pDst->pColumns[i];
188,207✔
1536
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pSchema->name);
188,207✔
1537
    if (cIndex >= 0 && pSchema->bytes == pStb->pColumns[cIndex].bytes) {
188,207✔
1538
      continue;
171,533✔
1539
    }
1540
    if (cIndex < 0) {
16,674✔
1541
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_COLUMN;
14,158✔
1542
    } else if (pSchema->bytes > pStb->pColumns[cIndex].bytes){
2,516✔
1543
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES;
2,516✔
1544
    }
1545
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
16,674✔
1546
    pAlterField->type = pSchema->type;
16,674✔
1547
    pAlterField->bytes = pSchema->bytes;
16,674✔
1548
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
16,674✔
1549
    mDebug("alter column name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
16,674✔
1550
  }
1551

1552
  for (int32_t i = 0; i < pDst->numOfTags && taosArrayGetSize(alterReq.pFields) == 0; ++i) {
145,047✔
1553
    SSchema *pSchema = &pDst->pTags[i];
113,629✔
1554
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pSchema->name);
113,629✔
1555
    if (cIndex >= 0 && pSchema->bytes == pStb->pTags[cIndex].bytes) {
113,629✔
1556
      continue;
98,885✔
1557
    }
1558
    if (cIndex < 0) {
14,744✔
1559
      alterReq.alterType = TSDB_ALTER_TABLE_ADD_TAG;
10,130✔
1560
    } else if (pSchema->bytes > pStb->pTags[cIndex].bytes){
4,614✔
1561
      alterReq.alterType = TSDB_ALTER_TABLE_UPDATE_TAG_BYTES;
4,614✔
1562
    }
1563
    SField *pAlterField = taosArrayReserve(alterReq.pFields, 1);
14,744✔
1564
    pAlterField->type = pSchema->type;
14,744✔
1565
    pAlterField->bytes = pSchema->bytes;
14,744✔
1566
    tstrncpy(pAlterField->name, pSchema->name, TSDB_COL_NAME_LEN);
14,744✔
1567
    mDebug("alter tag name:%s, type:%d, bytes:%d", pAlterField->name, pAlterField->type, pAlterField->bytes);
14,744✔
1568
  }
1569
  alterReq.numOfFields = taosArrayGetSize(alterReq.pFields);
31,418✔
1570
  if (alterReq.numOfFields == 0) {
31,418✔
UNCOV
1571
    mError("no valid alter field found");
×
UNCOV
1572
    goto END;
×
1573
  }
1574

1575
  int32_t contLen = tSerializeSMAlterStbReq(NULL, 0, &alterReq);
31,418✔
1576
  if (contLen <= 0) {
31,418✔
UNCOV
1577
    mError("failed to get alter stb req len");
×
UNCOV
1578
    goto END;
×
1579
  }
1580
  void*   buf = taosMemoryMalloc(contLen);
31,418✔
1581
  if (buf == NULL) {
31,418✔
UNCOV
1582
    mError("failed to malloc alter stb req buf");
×
UNCOV
1583
    goto END;
×
1584
  }
1585
  int32_t code = tSerializeSMAlterStbReq(buf, contLen, &alterReq);
31,418✔
1586
  if (code <= TSDB_CODE_SUCCESS) {
31,418✔
UNCOV
1587
    mError("failed to serialize alter stb req %d", code);
×
UNCOV
1588
    taosMemoryFreeClear(buf);
×
1589
    goto END;
×
1590
  }
1591
  *pAlterBuf = buf;
31,418✔
1592
  *len = contLen;
31,418✔
1593
END:
31,418✔
1594
  taosArrayDestroy(alterReq.pFields);
31,418✔
1595
}
31,418✔
1596

1597
static int32_t mndProcessCreateStbReq(SRpcMsg *pReq) {
2,007,090✔
1598
  SMnode        *pMnode = pReq->info.node;
2,007,090✔
1599
  int32_t        code = -1;
2,007,090✔
1600
  SStbObj       *pStb = NULL;
2,007,090✔
1601
  SDbObj        *pDb = NULL;
2,007,090✔
1602
  SUserObj      *pOperUser = NULL;
2,007,090✔
1603
  SMCreateStbReq createReq = {0};
2,007,090✔
1604
  bool           isAlter = false;
2,007,090✔
1605
  SHashObj      *pHash = NULL;
2,007,090✔
1606
  int64_t        tss = taosGetTimestampMs();
2,007,090✔
1607

1608
  if (tDeserializeSMCreateStbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
2,007,090✔
UNCOV
1609
    code = TSDB_CODE_INVALID_MSG;
×
UNCOV
1610
    goto _OVER;
×
1611
  }
1612

1613
  mInfo("stb:%s, start to create", createReq.name);
2,007,090✔
1614
  if (mndCheckCreateStbReq(&createReq) != 0) {
2,007,090✔
UNCOV
1615
    code = TSDB_CODE_INVALID_MSG;
×
UNCOV
1616
    goto _OVER;
×
1617
  }
1618

1619
  pStb = mndAcquireStb(pMnode, createReq.name);
2,007,090✔
1620
  if (pStb != NULL) {
2,007,090✔
1621
    if (createReq.igExists) {
38,911✔
1622
      if (createReq.source == TD_REQ_FROM_APP) {
37,467✔
1623
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
3,259✔
1624
        code = 0;
3,259✔
1625
        goto _OVER;
3,259✔
1626
      } else if (pStb->uid != createReq.suid) {
34,208✔
UNCOV
1627
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
UNCOV
1628
        code = 0;
×
1629
        goto _OVER;
×
1630
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
65,626✔
1631
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
34,208✔
1632
        int32_t colDelta = createReq.colVer - pStb->colVer;
34,208✔
1633
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
34,208✔
1634
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1635
        if (tagDelta <= 0 && colDelta <= 0) {
34,208✔
1636
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
2,790✔
1637
          code = 0;
2,790✔
1638
          goto _OVER;
2,790✔
1639
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
31,418✔
UNCOV
1640
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1641
          isAlter = true;
31,418✔
1642
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
31,418✔
1643
        } else {
UNCOV
1644
          mError("stb:%s, schema version increase more than 1 number, error is returned", createReq.name);
×
UNCOV
1645
          code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1646
          goto _OVER;
×
1647
        }
1648
      } else {
UNCOV
1649
        mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid, origin tagVer:%d colVer:%d",
×
1650
               createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1651
        code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
UNCOV
1652
        goto _OVER;
×
1653
      }
1654
    } else {
1655
      code = TSDB_CODE_MND_STB_ALREADY_EXIST;
1,444✔
1656
      goto _OVER;
1,444✔
1657
    }
1658
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
1,968,179✔
UNCOV
1659
    goto _OVER;
×
1660
  } else if ((createReq.source == TD_REQ_FROM_TAOX_OLD || createReq.source == TD_REQ_FROM_TAOX || createReq.source == TD_REQ_FROM_SML) &&
1,968,179✔
1661
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
4,870✔
UNCOV
1662
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
UNCOV
1663
    code = 0;
×
1664
    goto _OVER;
×
1665
  }
1666

1667
  pHash = taosHashInit(createReq.numOfColumns + createReq.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
1,999,597✔
1668
                       false, HASH_NO_LOCK);
1669
  if (pHash == NULL) {
1,999,597✔
UNCOV
1670
    code = TSDB_CODE_OUT_OF_MEMORY;
×
UNCOV
1671
    goto _OVER;
×
1672
  }
1673

1674
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
163,308,755✔
1675
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
161,309,158✔
1676
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
161,309,158✔
UNCOV
1677
      if (code == TSDB_CODE_DUP_KEY) {
×
UNCOV
1678
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1679
      }
1680
      goto _OVER;
×
1681
    }
1682
  }
1683

1684
  for (int32_t i = 0; i < createReq.numOfTags; ++i) {
10,477,362✔
1685
    SField *pField = taosArrayGet(createReq.pTags, i);
8,477,959✔
1686
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
8,477,959✔
1687
      if (code == TSDB_CODE_DUP_KEY) {
194✔
1688
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
194✔
1689
      }
1690
      goto _OVER;
194✔
1691
    }
1692
  }
1693

1694
  pDb = mndAcquireDbByStb(pMnode, createReq.name);
1,999,403✔
1695
  if (pDb == NULL) {
1,999,403✔
UNCOV
1696
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
UNCOV
1697
    goto _OVER;
×
1698
  }
1699

1700
  if ((code = mndAcquireUser(pMnode, (RPC_MSG_USER(pReq)), &pOperUser))) {
1,999,403✔
UNCOV
1701
    goto _OVER;
×
1702
  }
1703

1704
  if ((code = mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb))) {
1,999,403✔
UNCOV
1705
    goto _OVER;
×
1706
  }
1707

1708
  if ((code =
1,999,403✔
1709
           mndCheckDbPrivilegeByNameRecF(pMnode, pOperUser, pDb->cfg.isAudit ? PRIV_AUDIT_TBL_CREATE : PRIV_TBL_CREATE,
1,999,403✔
1710
                                         pDb->cfg.isAudit ? PRIV_OBJ_CLUSTER : PRIV_OBJ_DB, pDb->name, NULL))) {
1,999,403✔
UNCOV
1711
    goto _OVER;
×
1712
  }
1713

1714
  if (pDb->cfg.isMount) {
1,999,403✔
UNCOV
1715
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
UNCOV
1716
    goto _OVER;
×
1717
  }
1718

1719
  int32_t numOfStbs = -1;
1,999,403✔
1720
  if ((code = mndGetNumOfStbs(pMnode, pDb->name, &numOfStbs)) != 0) {
1,999,403✔
UNCOV
1721
    goto _OVER;
×
1722
  }
1723

1724
  if (pDb->cfg.numOfStables == 1 && numOfStbs != 0) {
1,999,403✔
UNCOV
1725
    code = TSDB_CODE_MND_SINGLE_STB_MODE_DB;
×
UNCOV
1726
    goto _OVER;
×
1727
  }
1728

1729
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
1,999,403✔
UNCOV
1730
    goto _OVER;
×
1731
  }
1732

1733
  if (isAlter) {
1,999,403✔
1734
    bool    needRsp = false;
31,418✔
1735
    SStbObj pDst = {0};
31,418✔
1736
    if ((code = mndBuildStbFromAlter(pStb, &pDst, &createReq)) != 0) {
31,418✔
UNCOV
1737
      taosMemoryFreeClear(pDst.pTags);
×
UNCOV
1738
      taosMemoryFreeClear(pDst.pColumns);
×
1739
      taosMemoryFreeClear(pDst.pCmpr);
×
1740
      taosMemoryFreeClear(pDst.pExtSchemas);
×
1741
      goto _OVER;
×
1742
    }
1743
    void* buf = NULL;
31,418✔
1744
    int32_t contLen = 0;
31,418✔
1745
    buildAlterMsg(pStb, &pDst, &buf, &contLen);
31,418✔
1746
    code = mndAlterStbImp(pMnode, pReq, pDb, &pDst, needRsp, buf, contLen);
31,418✔
1747
    taosMemoryFree(buf);
31,418✔
1748
    taosMemoryFreeClear(pDst.pTags);
31,418✔
1749
    taosMemoryFreeClear(pDst.pColumns);
31,418✔
1750
    taosMemoryFreeClear(pDst.pCmpr);
31,418✔
1751
    taosMemoryFreeClear(pDst.pExtSchemas);
31,418✔
1752
  } else {
1753
    code = mndCreateStb(pMnode, pReq, &createReq, pDb, pOperUser);
1,967,985✔
1754
  }
1755
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
1,999,403✔
1756

1757
  if (tsAuditLevel >= AUDIT_LEVEL_DATABASE) {
1,999,403✔
1758
    SName name = {0};
1,999,403✔
1759
    TAOS_CHECK_RETURN(tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
1,999,403✔
1760

1761
    int64_t tse = taosGetTimestampMs();
1,999,403✔
1762
    double  duration = (double)(tse - tss);
1,999,403✔
1763
    duration = duration / 1000;
1,999,403✔
1764
    if (createReq.sql == NULL && createReq.sqlLen == 0) {
2,001,149✔
1765
      char detail[1000] = {0};
392,641✔
1766

1767
      (void)snprintf(detail, sizeof(detail), "dbname:%s, stable name:%s", name.dbname, name.tname);
392,641✔
1768

1769
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail), duration, 0);
392,641✔
1770
    } else {
1771
      auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen,
1,606,762✔
1772
                  duration, 0);
1773
    }
1774
  }
1775
_OVER:
2,003,313✔
1776
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,007,090✔
1777
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
8,653✔
1778
  }
1779

1780
  mndReleaseStb(pMnode, pStb);
2,007,090✔
1781
  mndReleaseDb(pMnode, pDb);
2,007,090✔
1782
  mndReleaseUser(pMnode, pOperUser);
2,007,090✔
1783
  tFreeSMCreateStbReq(&createReq);
2,007,090✔
1784

1785
  if (pHash != NULL) {
2,007,090✔
1786
    taosHashCleanup(pHash);
1,999,597✔
1787
  }
1788

1789
  TAOS_RETURN(code);
2,007,090✔
1790
}
1791

1792
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
5,826,001✔
1793
  int32_t code = 0;
5,826,001✔
1794
  if (pAlter->commentLen >= 0) return 0;
5,826,001✔
1795
  if (pAlter->ttl != 0) return 0;
14,452✔
1796
  if (pAlter->keep != -1) return 0;
14,452✔
UNCOV
1797
  if (pAlter->secureDelete >= 0) return 0;
×
1798

1799
  if (pAlter->numOfFields < 1 || pAlter->numOfFields != (int32_t)taosArrayGetSize(pAlter->pFields)) {
×
UNCOV
1800
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1801
    TAOS_RETURN(code);
×
1802
  }
1803

UNCOV
1804
  for (int32_t i = 0; i < pAlter->numOfFields; ++i) {
×
UNCOV
1805
    SField *pField = taosArrayGet(pAlter->pFields, i);
×
1806
    if (pField->name[0] == 0) {
×
1807
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1808
      TAOS_RETURN(code);
×
1809
    }
1810
  }
1811

UNCOV
1812
  TAOS_RETURN(code);
×
1813
}
1814

1815
int32_t mndAllocStbSchemas(const SStbObj *pOld, SStbObj *pNew) {
5,574,058✔
1816
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
5,574,058✔
1817
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
5,574,058✔
1818
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
5,574,058✔
1819
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
5,574,058✔
UNCOV
1820
    TAOS_RETURN(terrno);
×
1821
  }
1822

1823
  memcpy(pNew->pColumns, pOld->pColumns, sizeof(SSchema) * pOld->numOfColumns);
5,574,058✔
1824
  memcpy(pNew->pTags, pOld->pTags, sizeof(SSchema) * pOld->numOfTags);
5,574,058✔
1825
  memcpy(pNew->pCmpr, pOld->pCmpr, sizeof(SColCmpr) * pOld->numOfColumns);
5,574,058✔
1826
  if (pOld->pExtSchemas) {
5,574,058✔
1827
    pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
4,440,670✔
1828
    if (pNew->pExtSchemas == NULL) {
4,440,670✔
UNCOV
1829
      TAOS_RETURN(terrno);
×
1830
    }
1831
    memcpy(pNew->pExtSchemas, pOld->pExtSchemas, sizeof(SExtSchema) * pOld->numOfColumns);
4,440,670✔
1832
  }
1833

1834
  TAOS_RETURN(0);
5,574,058✔
1835
}
1836

1837
static int32_t mndUpdateTableOptions(const SStbObj *pOld, SStbObj *pNew, char *pComment, int32_t commentLen,
25,576✔
1838
                                     int32_t ttl, int64_t keep, int8_t secureDelete) {
1839
  int32_t code = 0;
25,576✔
1840
  if (commentLen > 0) {
25,576✔
1841
    pNew->commentLen = commentLen;
6,290✔
1842
    pNew->comment = taosMemoryCalloc(1, commentLen + 1);
6,290✔
1843
    if (pNew->comment == NULL) {
6,290✔
UNCOV
1844
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
UNCOV
1845
      return -1;
×
1846
    }
1847
    memcpy(pNew->comment, pComment, commentLen + 1);
6,290✔
1848
  } else if (commentLen == 0) {
19,286✔
1849
    pNew->commentLen = 0;
4,834✔
1850
  } else {
1851
  }
1852

1853
  if (ttl >= 0) {
25,576✔
1854
    pNew->ttl = ttl;
25,576✔
1855
  }
1856

1857
  if (keep > 0) {
25,576✔
1858
    pNew->keep = keep;
13,848✔
1859
  }
1860

1861
  if (secureDelete >= 0) {
25,576✔
1862
    pNew->secureDelete = secureDelete;
604✔
1863
  }
1864

1865
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
25,576✔
UNCOV
1866
    TAOS_RETURN(code);
×
1867
  }
1868
  TAOS_RETURN(code);
25,576✔
1869
}
1870

1871
static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *pFields, int32_t ntags) {
295,954✔
1872
  int32_t code = 0;
295,954✔
1873
  if (pOld->numOfTags + ntags > TSDB_MAX_TAGS) {
295,954✔
UNCOV
1874
    code = TSDB_CODE_MND_TOO_MANY_TAGS;
×
UNCOV
1875
    TAOS_RETURN(code);
×
1876
  }
1877

1878
  int32_t maxColumns = pOld->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
295,954✔
1879
  if (pOld->numOfColumns + ntags + pOld->numOfTags > maxColumns) {
295,954✔
UNCOV
1880
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
UNCOV
1881
    TAOS_RETURN(code);
×
1882
  }
1883

1884
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
295,954✔
1885
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
21,728✔
1886
    TAOS_RETURN(code);
21,728✔
1887
  }
1888

1889
  pNew->numOfTags = pNew->numOfTags + ntags;
274,226✔
1890
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
274,226✔
UNCOV
1891
    TAOS_RETURN(code);
×
1892
  }
1893

1894
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ntags) {
274,226✔
1895
    code = TSDB_CODE_OUT_OF_RANGE;
1,170✔
1896
    TAOS_RETURN(code);
1,170✔
1897
  }
1898

1899
  for (int32_t i = 0; i < ntags; i++) {
480,983✔
1900
    SField *pField = taosArrayGet(pFields, i);
273,056✔
1901
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
273,056✔
1902
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
2,249✔
1903
      TAOS_RETURN(code);
2,249✔
1904
    }
1905

1906
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
270,807✔
1907
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
62,880✔
1908
      TAOS_RETURN(code);
62,880✔
1909
    }
1910

1911
    SSchema *pSchema = &pNew->pTags[pOld->numOfTags + i];
207,927✔
1912
    pSchema->bytes = pField->bytes;
207,927✔
1913
    pSchema->type = pField->type;
207,927✔
1914
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
207,927✔
1915
    if (pNew->nextColId > INT16_MAX) {
207,927✔
UNCOV
1916
      code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
UNCOV
1917
      TAOS_RETURN(code);
×
1918
    }
1919
    pSchema->colId = pNew->nextColId;
207,927✔
1920
    pNew->nextColId++;
207,927✔
1921

1922
    mInfo("stb:%s, start to add tag %s", pNew->name, pSchema->name);
207,927✔
1923
  }
1924

1925
  pNew->tagVer++;
207,927✔
1926
  TAOS_RETURN(code);
207,927✔
1927
}
1928

1929
static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId, bool isTag) {
2,644,152✔
1930
  int32_t code = 0;
2,644,152✔
1931
  SSdb   *pSdb = pMnode->pSdb;
2,644,152✔
1932
  void   *pIter = NULL;
2,644,152✔
UNCOV
1933
  while (1) {
×
1934
    SSmaObj *pSma = NULL;
2,644,152✔
1935
    pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
2,644,152✔
1936
    if (pIter == NULL) break;
2,644,152✔
1937

1938
    mInfo("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, sql:%s", pSma->name, stbFullName,
264✔
1939
          suid, colId, pSma->sql);
1940

1941
    if (isTag) {
264✔
1942
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
264✔
1943
      mError("tsma:%s, check tag:%d conflicted", pSma->name, colId);
264✔
1944
      sdbRelease(pSdb, pSma);
264✔
1945
      sdbCancelFetch(pSdb, pIter);
264✔
1946
      TAOS_RETURN(code);
264✔
1947
    }
1948

UNCOV
1949
    SNode *pAst = NULL;
×
UNCOV
1950
    if (nodesStringToNode(pSma->ast, &pAst) != 0) {
×
1951
      code = TSDB_CODE_SDB_INVALID_DATA_CONTENT;
×
1952
      mError("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d failed since parse AST err",
×
1953
             pSma->name, stbFullName, suid, colId);
1954
      sdbCancelFetch(pSdb, pIter);
×
UNCOV
1955
      TAOS_RETURN(code);
×
1956
    }
1957

UNCOV
1958
    SNodeList *pNodeList = NULL;
×
UNCOV
1959
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1960
        0) {
1961
      sdbCancelFetch(pSdb, pIter);
×
UNCOV
1962
      TAOS_RETURN(code);
×
1963
    }
1964
    SNode *pNode = NULL;
×
UNCOV
1965
    FOREACH(pNode, pNodeList) {
×
1966
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1967
      mInfo("tsma:%s, check colId:%d tableId:%" PRId64, pSma->name, pCol->colId, pCol->tableId);
×
1968

1969
      if ((pCol->tableId != suid) && (pSma->stbUid != suid)) {
×
UNCOV
1970
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1971
        goto NEXT;
×
1972
      }
1973
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
UNCOV
1974
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1975
        mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
×
1976
        nodesDestroyNode(pAst);
×
1977
        nodesDestroyList(pNodeList);
×
1978
        sdbRelease(pSdb, pSma);
×
1979
        sdbCancelFetch(pSdb, pIter);
×
1980
        TAOS_RETURN(code);
×
1981
      }
1982
      mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1983
    }
1984

UNCOV
1985
  NEXT:
×
UNCOV
1986
    sdbRelease(pSdb, pSma);
×
1987
    nodesDestroyNode(pAst);
×
1988
    nodesDestroyList(pNodeList);
×
1989
  }
1990
  TAOS_RETURN(code);
2,643,888✔
1991
}
1992

1993
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
108,113✔
1994
  int32_t code = 0;
108,113✔
1995
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
108,113✔
1996
  if (tag < 0) {
108,113✔
1997
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
194✔
1998
    TAOS_RETURN(code);
194✔
1999
  }
2000

2001
  col_id_t colId = pOld->pTags[tag].colId;
107,919✔
2002
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
107,919✔
2003

2004
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
107,787✔
2005

2006
  memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
107,787✔
2007
  pNew->numOfTags--;
107,787✔
2008

2009
  pNew->tagVer++;
107,787✔
2010

2011
  // if (mndDropIndexByTag(pMnode, pOld, tagName) != 0) {
2012
  //   return -1;
2013
  // }
2014
  mInfo("stb:%s, start to drop tag %s", pNew->name, tagName);
107,787✔
2015
  TAOS_RETURN(code);
107,787✔
2016
}
2017

2018
static int32_t mndAlterStbTagName(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pFields) {
140,719✔
2019
  int32_t code = 0;
140,719✔
2020
  if ((int32_t)taosArrayGetSize(pFields) != 2) {
140,719✔
UNCOV
2021
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
UNCOV
2022
    TAOS_RETURN(code);
×
2023
  }
2024

2025
  SField *pField0 = taosArrayGet(pFields, 0);
140,719✔
2026
  SField *pField1 = taosArrayGet(pFields, 1);
140,719✔
2027

2028
  const char *oldTagName = pField0->name;
140,719✔
2029
  const char *newTagName = pField1->name;
140,719✔
2030

2031
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
140,719✔
2032
  if (tag < 0) {
140,719✔
2033
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
3,804✔
2034
    TAOS_RETURN(code);
3,804✔
2035
  }
2036

2037
  col_id_t colId = pOld->pTags[tag].colId;
136,915✔
2038
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
136,915✔
2039

2040
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
136,783✔
2041
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
6,520✔
2042
    TAOS_RETURN(code);
6,520✔
2043
  }
2044

2045
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
130,263✔
2046
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
194✔
2047
    TAOS_RETURN(code);
194✔
2048
  }
2049

2050
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
130,069✔
2051

2052
  SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
130,069✔
2053
  memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
130,069✔
2054

2055
  pNew->tagVer++;
130,069✔
2056
  mInfo("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
130,069✔
2057
  TAOS_RETURN(code);
130,069✔
2058
}
2059

2060
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
332,467✔
2061
  int32_t code = 0;
332,467✔
2062
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
332,467✔
2063
  if (tag < 0) {
332,467✔
2064
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
194✔
2065
    TAOS_RETURN(code);
194✔
2066
  }
2067

2068
  col_id_t colId = pOld->pTags[tag].colId;
332,273✔
2069
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, true));
332,273✔
2070

2071
  uint32_t nLen = 0;
332,273✔
2072
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
13,266,046✔
2073
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
12,933,773✔
2074
  }
2075

2076
  if (nLen > TSDB_MAX_TAGS_LEN) {
332,273✔
2077
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
192,836✔
2078
    TAOS_RETURN(code);
192,836✔
2079
  }
2080

2081
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
139,437✔
2082

2083
  SSchema *pTag = pNew->pTags + tag;
139,437✔
2084

2085
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
139,437✔
2086
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
133,430✔
2087
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
194✔
2088
    TAOS_RETURN(code);
194✔
2089
  }
2090

2091
  if (pField->bytes <= pTag->bytes) {
139,243✔
2092
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
46,366✔
2093
    TAOS_RETURN(code);
46,366✔
2094
  }
2095

2096
  pTag->bytes = pField->bytes;
92,877✔
2097
  pNew->tagVer++;
92,877✔
2098

2099
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
92,877✔
2100
  TAOS_RETURN(code);
92,877✔
2101
}
2102

2103
static int32_t mndUpdateSuperTableColumnCompress(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pField,
95,833✔
2104
                                                 int32_t nCols) {
2105
  // if (pColCmpr == NULL || colName == NULL) return -1;
2106

2107
  if (taosArrayGetSize(pField) != nCols) return TSDB_CODE_FAILED;
95,833✔
2108
  TAOS_FIELD *p = taosArrayGet(pField, 0);
95,833✔
2109

2110
  int32_t code = 0;
95,833✔
2111
  int32_t idx = mndFindSuperTableColumnIndex(pOld, p->name);
95,833✔
2112
  if (idx == -1) {
95,833✔
UNCOV
2113
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
UNCOV
2114
    TAOS_RETURN(code);
×
2115
  }
2116
  SSchema *pTarget = &pOld->pColumns[idx];
95,833✔
2117
  col_id_t colId = pTarget->colId;
95,833✔
2118

2119
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
95,833✔
2120
  code = validColCmprByType(pTarget->type, p->bytes);
95,833✔
2121
  if (code != TSDB_CODE_SUCCESS) {
95,833✔
2122
    TAOS_RETURN(code);
2,298✔
2123
  }
2124

2125
  int8_t updated = 0;
93,535✔
2126
  for (int i = 0; i < pNew->numOfColumns; i++) {
792,838✔
2127
    SColCmpr *pCmpr = &pNew->pCmpr[i];
792,838✔
2128
    if (pCmpr->id == colId) {
792,838✔
2129
      uint32_t dst = 0;
93,535✔
2130
      updated = tUpdateCompress(pCmpr->alg, p->bytes, TSDB_COLVAL_COMPRESS_DISABLED, TSDB_COLVAL_LEVEL_DISABLED,
93,535✔
2131
                                TSDB_COLVAL_LEVEL_MEDIUM, &dst);
2132
      if (updated > 0) pCmpr->alg = dst;
93,535✔
2133
      break;
93,535✔
2134
    }
2135
  }
2136

2137
  if (updated == 0) {
93,535✔
2138
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
8,148✔
2139
    TAOS_RETURN(code);
8,148✔
2140
  } else if (updated == -1) {
85,387✔
UNCOV
2141
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
UNCOV
2142
    TAOS_RETURN(code);
×
2143
  }
2144

2145
  pNew->colVer++;
85,387✔
2146

2147
  TAOS_RETURN(code);
85,387✔
2148
}
2149
static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const SMAlterStbReq* pReq, int32_t ncols,
2,716,507✔
2150
                                      int8_t withCompress) {
2151
  int32_t code = 0;
2,716,507✔
2152
  int32_t maxColumns = pOld->virtualStb ? TSDB_MAX_COLUMNS : TSDB_MAX_COLUMNS_NON_VIRTUAL;
2,716,507✔
2153
  int32_t maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
2,716,507✔
2154
  if (pOld->numOfColumns + ncols + pOld->numOfTags > maxColumns) {
2,716,507✔
UNCOV
2155
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
UNCOV
2156
    TAOS_RETURN(code);
×
2157
  }
2158

2159
  if ((code = grantCheck(TSDB_GRANT_TIMESERIES)) != 0) {
2,716,507✔
UNCOV
2160
    TAOS_RETURN(code);
×
2161
  }
2162

2163
  if (!mndValidateSchema(pOld->pColumns, pOld->numOfColumns, pReq->pFields, maxBytesPerRow)) {
2,716,507✔
UNCOV
2164
    code = TSDB_CODE_PAR_INVALID_ROW_LENGTH;
×
UNCOV
2165
    TAOS_RETURN(code);
×
2166
  }
2167

2168
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,716,507✔
2169

2170
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,716,507✔
2171

2172
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ncols) {
2,716,507✔
2173
    code = TSDB_CODE_OUT_OF_RANGE;
1,170✔
2174
    TAOS_RETURN(code);
1,170✔
2175
  }
2176

2177
  for (int32_t i = 0; i < ncols; i++) {
5,138,809✔
2178
    if (withCompress) {
2,715,337✔
2179
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
262,146✔
2180
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
262,146✔
UNCOV
2181
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
UNCOV
2182
        TAOS_RETURN(code);
×
2183
      }
2184

2185
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
262,146✔
UNCOV
2186
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
×
UNCOV
2187
        TAOS_RETURN(code);
×
2188
      }
2189

2190
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
262,146✔
2191
      pSchema->bytes = pField->bytes;
262,146✔
2192
      pSchema->type = pField->type;
262,146✔
2193
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
262,146✔
2194
      if (pNew->nextColId > INT16_MAX) {
262,146✔
UNCOV
2195
        code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
UNCOV
2196
        TAOS_RETURN(code);
×
2197
      }
2198
      pSchema->colId = pNew->nextColId;
262,146✔
2199
      pNew->nextColId++;
262,146✔
2200

2201
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
262,146✔
2202
      pCmpr->id = pSchema->colId;
262,146✔
2203
      pCmpr->alg = pField->compress;
262,146✔
2204
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
262,146✔
2205
    } else {
2206
      SField *pField = taosArrayGet(pReq->pFields, i);
2,453,191✔
2207
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
2,453,191✔
2208
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
289,616✔
2209
        TAOS_RETURN(code);
289,616✔
2210
      }
2211

2212
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
2,163,575✔
2213
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
2,249✔
2214
        TAOS_RETURN(code);
2,249✔
2215
      }
2216

2217
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
2,161,326✔
2218
      pSchema->bytes = pField->bytes;
2,161,326✔
2219
      pSchema->type = pField->type;
2,161,326✔
2220
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
2,161,326✔
2221
      if (pNew->nextColId > INT16_MAX) {
2,161,326✔
UNCOV
2222
        code = TSDB_CODE_MND_EXCEED_MAX_COL_ID;
×
UNCOV
2223
        TAOS_RETURN(code);
×
2224
      }
2225
      pSchema->colId = pNew->nextColId;
2,161,326✔
2226
      pNew->nextColId++;
2,161,326✔
2227

2228
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
2,161,326✔
2229
      pCmpr->id = pSchema->colId;
2,161,326✔
2230
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
2,161,326✔
2231
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
2,161,326✔
2232
    }
2233
  }
2234
  // 1. old schema already has extschemas
2235
  // 2. new schema has extschemas
2236
  if (pReq->pTypeMods || pOld->pExtSchemas) {
2,423,472✔
2237
    if (!pNew->pExtSchemas) {
2,423,084✔
2238
      // all ext schemas reset to zero
2239
      pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
31,104✔
2240
      if (!pNew->pExtSchemas) TAOS_RETURN(terrno);
31,104✔
2241
    }
2242
    if (pOld->pExtSchemas) {
2,423,084✔
2243
      memcpy(pNew->pExtSchemas, pOld->pExtSchemas, pOld->numOfColumns * sizeof(SExtSchema));
2,391,980✔
2244
    }
2245
    if (taosArrayGetSize(pReq->pTypeMods) > 0) {
2,423,084✔
2246
      // copy added column ext schema
2247
      for (int32_t i = 0; i < ncols; ++i) {
4,846,168✔
2248
        pNew->pColumns[pOld->numOfColumns + i].flags |= COL_HAS_TYPE_MOD;
2,423,084✔
2249
        pNew->pExtSchemas[pOld->numOfColumns + i].typeMod = *(STypeMod *)taosArrayGet(pReq->pTypeMods, i);
2,423,084✔
2250
      }
2251
    }
2252
  }
2253

2254
  pNew->colVer++;
2,423,472✔
2255
  TAOS_RETURN(code);
2,423,472✔
2256
}
2257

2258
static int32_t mndDropSuperTableColumn(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *colName) {
1,575,122✔
2259
  int32_t code = 0;
1,575,122✔
2260
  int32_t col = mndFindSuperTableColumnIndex(pOld, colName);
1,575,122✔
2261
  if (col < 0) {
1,575,122✔
2262
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
2,249✔
2263
    TAOS_RETURN(code);
2,249✔
2264
  }
2265

2266
  if (col == 0) {
1,572,873✔
2267
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
1,650✔
2268
    TAOS_RETURN(code);
1,650✔
2269
  }
2270

2271
  if (pOld->numOfColumns == 2) {
1,571,223✔
2272
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
194✔
2273
    TAOS_RETURN(code);
194✔
2274
  }
2275

2276
  col_id_t colId = pOld->pColumns[col].colId;
1,571,029✔
2277
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, false));
1,571,029✔
2278

2279
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
1,571,029✔
2280

2281
  int32_t sz = pNew->numOfColumns - col - 1;
1,571,029✔
2282
  memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * sz);
1,571,029✔
2283
  memmove(pNew->pCmpr + col, pNew->pCmpr + col + 1, sizeof(SColCmpr) * sz);
1,571,029✔
2284
  if (pOld->pExtSchemas) {
1,571,029✔
2285
    memmove(pNew->pExtSchemas + col, pNew->pExtSchemas + col + 1, sizeof(SExtSchema) * sz);
1,541,070✔
2286
  }
2287
  pNew->numOfColumns--;
1,571,029✔
2288

2289
  pNew->colVer++;
1,571,029✔
2290
  mInfo("stb:%s, start to drop col %s", pNew->name, colName);
1,571,029✔
2291
  TAOS_RETURN(code);
1,571,029✔
2292
}
2293

2294
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
519,684✔
2295
  int32_t code = 0;
519,684✔
2296
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
519,684✔
2297
  if (col < 0) {
519,684✔
2298
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
388✔
2299
    TAOS_RETURN(code);
388✔
2300
  }
2301

2302
  col_id_t colId = pOld->pColumns[col].colId;
519,296✔
2303

2304
  uint32_t nLen = 0;
519,296✔
2305
  int32_t  maxBytesPerRow = pOld->virtualStb ? TSDB_MAX_BYTES_PER_ROW_VIRTUAL : TSDB_MAX_BYTES_PER_ROW;
519,296✔
2306
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
40,428,321✔
2307
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
39,909,025✔
2308
  }
2309

2310
  if (nLen > maxBytesPerRow) {
519,296✔
2311
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
23,280✔
2312
    TAOS_RETURN(code);
23,280✔
2313
  }
2314

2315
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, pOld->name, pOld->uid, colId, false));
496,016✔
2316

2317
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
496,016✔
2318

2319
  SSchema *pCol = pNew->pColumns + col;
496,016✔
2320
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
496,016✔
2321
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
486,423✔
2322
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
194✔
2323
    TAOS_RETURN(code);
194✔
2324
  }
2325

2326
  if (pField->bytes <= pCol->bytes) {
495,822✔
2327
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
188,277✔
2328
    TAOS_RETURN(code);
188,277✔
2329
  }
2330

2331
  pCol->bytes = pField->bytes;
307,545✔
2332
  pNew->colVer++;
307,545✔
2333

2334
  mInfo("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
307,545✔
2335
  TAOS_RETURN(code);
307,545✔
2336
}
2337

2338
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,798,399✔
2339
  int32_t  code = 0;
4,798,399✔
2340
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
4,798,399✔
2341
  if (pRedoRaw == NULL) {
4,798,399✔
UNCOV
2342
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
2343
    if (terrno != 0) code = terrno;
×
2344
    TAOS_RETURN(code);
×
2345
  }
2346
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
4,798,399✔
UNCOV
2347
    sdbFreeRaw(pRedoRaw);
×
UNCOV
2348
    TAOS_RETURN(code);
×
2349
  }
2350
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
4,798,399✔
2351

2352
  TAOS_RETURN(code);
4,798,399✔
2353
}
2354

2355
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
4,798,399✔
2356
  int32_t  code = 0;
4,798,399✔
2357
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
4,798,399✔
2358
  if (pCommitRaw == NULL) {
4,798,399✔
UNCOV
2359
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
2360
    if (terrno != 0) code = terrno;
×
2361
    TAOS_RETURN(code);
×
2362
  }
2363
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
4,798,399✔
UNCOV
2364
    sdbFreeRaw(pCommitRaw);
×
UNCOV
2365
    TAOS_RETURN(code);
×
2366
  }
2367
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
4,798,399✔
2368

2369
  TAOS_RETURN(code);
4,798,399✔
2370
}
2371

2372
static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb, void *alterOriData,
4,798,399✔
2373
                                         int32_t alterOriDataLen) {
2374
  int32_t code = 0;
4,798,399✔
2375
  SSdb   *pSdb = pMnode->pSdb;
4,798,399✔
2376
  SVgObj *pVgroup = NULL;
4,798,399✔
2377
  void   *pIter = NULL;
4,798,399✔
2378
  int32_t contLen;
4,796,415✔
2379

2380
  while (1) {
12,314,892✔
2381
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
17,113,291✔
2382
    if (pIter == NULL) break;
17,113,291✔
2383
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
12,314,892✔
2384
      sdbRelease(pSdb, pVgroup);
5,676,007✔
2385
      continue;
5,676,007✔
2386
    }
2387

2388
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
6,638,885✔
2389
    if (pReq == NULL) {
6,638,885✔
UNCOV
2390
      sdbCancelFetch(pSdb, pIter);
×
UNCOV
2391
      sdbRelease(pSdb, pVgroup);
×
2392
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2393
      if (terrno != 0) code = terrno;
×
2394
      TAOS_RETURN(code);
×
2395
    }
2396
    STransAction action = {0};
6,638,885✔
2397
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
6,638,885✔
2398
    action.pCont = pReq;
6,638,885✔
2399
    action.contLen = contLen;
6,638,885✔
2400
    action.msgType = TDMT_VND_ALTER_STB;
6,638,885✔
2401
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
6,638,885✔
UNCOV
2402
      taosMemoryFree(pReq);
×
UNCOV
2403
      sdbCancelFetch(pSdb, pIter);
×
2404
      sdbRelease(pSdb, pVgroup);
×
2405
      TAOS_RETURN(code);
×
2406
    }
2407
    sdbRelease(pSdb, pVgroup);
6,638,885✔
2408
  }
2409

2410
  TAOS_RETURN(code);
4,798,399✔
2411
}
2412

UNCOV
2413
static int32_t mndSetAlterStbRedoActions2(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
×
2414
                                          void *alterOriData, int32_t alterOriDataLen) {
2415
  int32_t code = 0;
×
UNCOV
2416
  SSdb   *pSdb = pMnode->pSdb;
×
2417
  SVgObj *pVgroup = NULL;
×
2418
  void   *pIter = NULL;
×
2419
  int32_t contLen;
×
2420

2421
  while (1) {
×
UNCOV
2422
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
2423
    if (pIter == NULL) break;
×
2424
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
×
2425
      sdbRelease(pSdb, pVgroup);
×
2426
      continue;
×
2427
    }
2428

UNCOV
2429
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
UNCOV
2430
    if (pReq == NULL) {
×
2431
      sdbCancelFetch(pSdb, pIter);
×
2432
      sdbRelease(pSdb, pVgroup);
×
2433
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2434
      if (terrno != 0) code = terrno;
×
2435
      TAOS_RETURN(code);
×
2436
    }
2437
    STransAction action = {0};
×
UNCOV
2438
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2439
    action.pCont = pReq;
×
2440
    action.contLen = contLen;
×
2441
    action.msgType = TDMT_VND_CREATE_INDEX;
×
2442
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
2443
      taosMemoryFree(pReq);
×
2444
      sdbCancelFetch(pSdb, pIter);
×
2445
      sdbRelease(pSdb, pVgroup);
×
2446
      TAOS_RETURN(code);
×
2447
    }
2448
    sdbRelease(pSdb, pVgroup);
×
2449
  }
2450

UNCOV
2451
  TAOS_RETURN(code);
×
2452
}
2453

2454
static int32_t mndBuildStbSchemaImp(SMnode *pMnode, SDbObj *pDb, SStbObj *pStb, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
22,877,829✔
2455
  int32_t code = 0;
22,877,829✔
2456
  taosRLockLatch(&pStb->lock);
22,877,829✔
2457

2458
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
22,877,829✔
2459
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
22,877,829✔
2460
  if (pRsp->pSchemas == NULL) {
22,877,829✔
UNCOV
2461
    taosRUnLockLatch(&pStb->lock);
×
UNCOV
2462
    code = terrno;
×
2463
    TAOS_RETURN(code);
×
2464
  }
2465
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
22,877,829✔
2466
  if (pRsp->pSchemaExt == NULL) {
22,877,829✔
UNCOV
2467
    taosRUnLockLatch(&pStb->lock);
×
UNCOV
2468
    code = terrno;
×
2469
    TAOS_RETURN(code);
×
2470
  }
2471
  pRsp->numOfColRefs = 0;
22,877,829✔
2472
  pRsp->pColRefs = NULL;
22,877,829✔
2473
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
22,877,829✔
2474
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
22,877,829✔
2475
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
22,877,829✔
2476
  pRsp->dbId = pDb->uid;
22,877,829✔
2477
  pRsp->numOfTags = pStb->numOfTags;
22,877,829✔
2478
  pRsp->numOfColumns = pStb->numOfColumns;
22,877,829✔
2479
  pRsp->precision = pDb->cfg.precision;
22,877,829✔
2480
  pRsp->tableType = TSDB_SUPER_TABLE;
22,877,829✔
2481
  pRsp->sversion = pStb->colVer;
22,877,829✔
2482
  pRsp->tversion = pStb->tagVer;
22,877,829✔
2483
  pRsp->suid = pStb->uid;
22,877,829✔
2484
  pRsp->tuid = pStb->uid;
22,877,829✔
2485
  pRsp->virtualStb = pStb->virtualStb;
22,877,829✔
2486
  pRsp->ownerId = pStb->ownerId;
22,877,829✔
2487
  pRsp->isAudit = pDb->cfg.isAudit ? 1 : 0;
22,877,829✔
2488
  pRsp->secureDelete = pStb->secureDelete;
22,877,829✔
2489

2490
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
653,880,099✔
2491
    SSchema *pSchema = &pRsp->pSchemas[i];
631,002,270✔
2492
    SSchema *pSrcSchema = &pStb->pColumns[i];
631,001,591✔
2493
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
631,001,591✔
2494
    pSchema->type = pSrcSchema->type;
631,002,668✔
2495
    pSchema->flags = pSrcSchema->flags;
631,000,397✔
2496
    pSchema->colId = pSrcSchema->colId;
631,001,624✔
2497
    pSchema->bytes = pSrcSchema->bytes;
631,001,872✔
2498
  }
2499
  
2500
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
108,888,032✔
2501
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
86,010,601✔
2502
    SSchema *pSrcSchema = &pStb->pTags[i];
86,010,203✔
2503
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
86,010,203✔
2504
    pSchema->type = pSrcSchema->type;
86,010,203✔
2505
    pSchema->flags = pSrcSchema->flags;
86,009,243✔
2506
    pSchema->colId = pSrcSchema->colId;
86,010,601✔
2507
    pSchema->bytes = pSrcSchema->bytes;
86,010,203✔
2508
  }
2509

2510
  if (refByStm) {
22,877,431✔
2511
    mndStreamUpdateTagsRefFlag(pMnode, pStb->uid, &pRsp->pSchemas[pStb->numOfColumns], pStb->numOfTags);
16,110,355✔
2512
  }
2513

2514
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
653,880,099✔
2515
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
631,001,872✔
2516
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
631,001,474✔
2517
    pSchEx->colId = pCmpr->id;
631,001,872✔
2518
    pSchEx->compress = pCmpr->alg;
631,002,270✔
2519
    if (pStb->pExtSchemas) {
631,002,668✔
2520
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
316,326,431✔
2521
    }
2522
  }
2523

2524
  taosRUnLockLatch(&pStb->lock);
22,877,829✔
2525
  TAOS_RETURN(code);
22,877,829✔
2526
}
2527

2528
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
28,595✔
2529
  int32_t code = 0;
28,595✔
2530
  taosRLockLatch(&pStb->lock);
28,595✔
2531

2532
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
28,595✔
2533
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
28,595✔
2534
  if (pRsp->pSchemas == NULL) {
28,595✔
UNCOV
2535
    taosRUnLockLatch(&pStb->lock);
×
UNCOV
2536
    code = terrno;
×
2537
    TAOS_RETURN(code);
×
2538
  }
2539

2540
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
28,595✔
2541
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
28,595✔
2542
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
28,595✔
2543
  pRsp->numOfTags = pStb->numOfTags;
28,595✔
2544
  pRsp->numOfColumns = pStb->numOfColumns;
28,595✔
2545
  pRsp->tableType = TSDB_SUPER_TABLE;
28,595✔
2546
  pRsp->delay1 = pStb->maxdelay[0];
28,595✔
2547
  pRsp->delay2 = pStb->maxdelay[1];
28,595✔
2548
  pRsp->watermark1 = pStb->watermark[0];
28,595✔
2549
  pRsp->watermark2 = pStb->watermark[1];
28,595✔
2550
  pRsp->ttl = pStb->ttl;
28,595✔
2551
  pRsp->keep = pStb->keep;
28,595✔
2552
  pRsp->commentLen = pStb->commentLen;
28,595✔
2553
  if (pStb->commentLen > 0) {
28,595✔
UNCOV
2554
    pRsp->pComment = taosStrdup(pStb->comment);
×
2555
  }
2556

2557
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
163,180✔
2558
    SSchema *pSchema = &pRsp->pSchemas[i];
134,585✔
2559
    SSchema *pSrcSchema = &pStb->pColumns[i];
134,585✔
2560
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
134,585✔
2561
    pSchema->type = pSrcSchema->type;
134,585✔
2562
    pSchema->flags = pSrcSchema->flags;
134,585✔
2563
    pSchema->colId = pSrcSchema->colId;
134,585✔
2564
    pSchema->bytes = pSrcSchema->bytes;
134,585✔
2565
  }
2566

2567
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
84,560✔
2568
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
55,965✔
2569
    SSchema *pSrcSchema = &pStb->pTags[i];
55,965✔
2570
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
55,965✔
2571
    pSchema->type = pSrcSchema->type;
55,965✔
2572
    pSchema->flags = pSrcSchema->flags;
55,965✔
2573
    pSchema->colId = pSrcSchema->colId;
55,965✔
2574
    pSchema->bytes = pSrcSchema->bytes;
55,965✔
2575
  }
2576

2577
  if (pStb->numOfFuncs > 0) {
28,595✔
UNCOV
2578
    pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
×
2579
  }
2580

2581
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
28,595✔
2582
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
163,180✔
2583
    SColCmpr *pCmpr = &pStb->pCmpr[i];
134,585✔
2584

2585
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
134,585✔
2586
    pSchExt->colId = pCmpr->id;
134,585✔
2587
    pSchExt->compress = pCmpr->alg;
134,585✔
2588
    if (pStb->pExtSchemas) {
134,585✔
2589
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
26,375✔
2590
    }
2591
  }
2592
  pRsp->virtualStb = pStb->virtualStb;
28,595✔
2593
  pRsp->pColRefs = NULL;
28,595✔
2594
  pRsp->secureDelete = pStb->secureDelete;
28,595✔
2595

2596
  taosRUnLockLatch(&pStb->lock);
28,595✔
2597
  TAOS_RETURN(code);
28,595✔
2598
}
2599

2600
static int32_t mndValidateStbVersion(SMnode *pMnode, SSTableVersion *pStbVer, bool *schema, bool *sma) {
9,093,724✔
2601
  int32_t code = 0;
9,093,724✔
2602
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
9,093,724✔
2603
  snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVer->dbFName, pStbVer->stbName);
9,093,724✔
2604

2605
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
9,093,724✔
2606
  if (pDb == NULL) {
9,093,724✔
2607
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
38,237✔
2608
    TAOS_RETURN(code);
38,237✔
2609
  }
2610

2611
  if (pDb->uid != pStbVer->dbId) {
9,055,487✔
2612
    mndReleaseDb(pMnode, pDb);
723✔
2613
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
723✔
2614
    TAOS_RETURN(code);
723✔
2615
  }
2616

2617
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
9,054,764✔
2618
  if (pStb == NULL) {
9,054,764✔
2619
    mndReleaseDb(pMnode, pDb);
3,486✔
2620
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
3,486✔
2621
    TAOS_RETURN(code);
3,486✔
2622
  }
2623

2624
  taosRLockLatch(&pStb->lock);
9,051,278✔
2625

2626
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
9,051,278✔
2627
    *schema = true;
25,456✔
2628
  } else {
2629
    *schema = false;
9,025,822✔
2630
  }
2631

2632
  if (pStbVer->smaVer && pStbVer->smaVer != pStb->smaVer) {
9,051,278✔
UNCOV
2633
    *sma = true;
×
2634
  } else {
2635
    *sma = false;
9,051,278✔
2636
  }
2637

2638
  taosRUnLockLatch(&pStb->lock);
9,051,278✔
2639

2640
  mndReleaseDb(pMnode, pDb);
9,051,278✔
2641
  mndReleaseStb(pMnode, pStb);
9,051,278✔
2642
  return TSDB_CODE_SUCCESS;
9,051,278✔
2643
}
2644

2645
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp, bool refByStm) {
16,898,984✔
2646
  int32_t code = 0;
16,898,984✔
2647
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
16,898,984✔
2648
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
16,898,984✔
2649

2650
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
16,898,984✔
2651
  if (pDb == NULL) {
16,898,984✔
UNCOV
2652
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
UNCOV
2653
    TAOS_RETURN(code);
×
2654
  }
2655

2656
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
16,898,984✔
2657
  if (pStb == NULL) {
16,898,984✔
2658
    mndReleaseDb(pMnode, pDb);
763,173✔
2659
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
763,173✔
2660
    TAOS_RETURN(code);
763,173✔
2661
  }
2662

2663
  code = mndBuildStbSchemaImp(pMnode, pDb, pStb, tbName, pRsp, refByStm);
16,135,811✔
2664
  mndReleaseDb(pMnode, pDb);
16,135,811✔
2665
  mndReleaseStb(pMnode, pStb);
16,135,811✔
2666
  TAOS_RETURN(code);
16,135,811✔
2667
}
2668

2669
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
28,595✔
2670
  int32_t code = 0;
28,595✔
2671
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
28,595✔
2672
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
28,595✔
2673

2674
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
28,595✔
2675
  if (pDb == NULL) {
28,595✔
UNCOV
2676
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
UNCOV
2677
    TAOS_RETURN(code);
×
2678
  }
2679

2680
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
28,595✔
2681
  if (pStb == NULL) {
28,595✔
UNCOV
2682
    mndReleaseDb(pMnode, pDb);
×
UNCOV
2683
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
×
2684
    TAOS_RETURN(code);
×
2685
  }
2686

2687
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
28,595✔
2688

2689
  mndReleaseDb(pMnode, pDb);
28,595✔
2690
  mndReleaseStb(pMnode, pStb);
28,595✔
2691
  TAOS_RETURN(code);
28,595✔
2692
}
2693

2694
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, int32_t *pLen) {
4,741,405✔
2695
  int32_t       code = 0;
4,741,405✔
2696
  SEncoder      ec = {0};
4,741,405✔
2697
  uint32_t      contLen = 0;
4,741,405✔
2698
  SMAlterStbRsp alterRsp = {0};
4,741,405✔
2699
  SName         name = {0};
4,741,405✔
2700
  TAOS_CHECK_RETURN(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
4,741,405✔
2701

2702
  alterRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
4,741,405✔
2703
  if (NULL == alterRsp.pMeta) {
4,741,405✔
UNCOV
2704
    code = terrno;
×
UNCOV
2705
    TAOS_RETURN(code);
×
2706
  }
2707

2708
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, alterRsp.pMeta, false);
4,741,405✔
2709
  if (code) {
4,741,405✔
UNCOV
2710
    tFreeSMAlterStbRsp(&alterRsp);
×
UNCOV
2711
    return code;
×
2712
  }
2713

2714
  tEncodeSize(tEncodeSMAlterStbRsp, &alterRsp, contLen, code);
4,741,405✔
2715
  if (code) {
4,741,405✔
UNCOV
2716
    tFreeSMAlterStbRsp(&alterRsp);
×
UNCOV
2717
    return code;
×
2718
  }
2719

2720
  void *cont = taosMemoryMalloc(contLen);
4,741,405✔
2721
  if (NULL == cont) {
4,741,405✔
UNCOV
2722
    code = terrno;
×
UNCOV
2723
    tFreeSMAlterStbRsp(&alterRsp);
×
2724
    TAOS_RETURN(code);
×
2725
  }
2726
  tEncoderInit(&ec, cont, contLen);
4,741,405✔
2727
  code = tEncodeSMAlterStbRsp(&ec, &alterRsp);
4,741,405✔
2728
  tEncoderClear(&ec);
4,741,405✔
2729

2730
  tFreeSMAlterStbRsp(&alterRsp);
4,741,405✔
2731

2732
  if (code < 0) TAOS_RETURN(code);
4,741,405✔
2733

2734
  *pCont = cont;
4,741,405✔
2735
  *pLen = contLen;
4,741,405✔
2736

2737
  TAOS_RETURN(code);
4,741,405✔
2738
}
2739

2740
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
2,002,205✔
2741
  int32_t code = -1;
2,002,205✔
2742
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
2,002,205✔
2743
  if (NULL == pDb) {
2,002,205✔
UNCOV
2744
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
2745
    if (terrno != 0) code = terrno;
×
2746
    TAOS_RETURN(code);
×
2747
  }
2748

2749
  SStbObj *pObj = mndAcquireStb(pMnode, stbFName);
2,002,205✔
2750
  if (NULL == pObj) {
2,002,205✔
2751
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,592✔
2752
    if (terrno != 0) code = terrno;
1,592✔
2753
    goto _OVER;
1,592✔
2754
  }
2755

2756
  SEncoder       ec = {0};
2,000,613✔
2757
  uint32_t       contLen = 0;
2,000,613✔
2758
  SMCreateStbRsp stbRsp = {0};
2,000,613✔
2759
  SName          name = {0};
2,000,613✔
2760
  TAOS_CHECK_GOTO(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE), NULL, _OVER);
2,000,613✔
2761

2762
  stbRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
2,000,613✔
2763
  if (NULL == stbRsp.pMeta) {
2,000,613✔
UNCOV
2764
    code = terrno;
×
UNCOV
2765
    goto _OVER;
×
2766
  }
2767

2768
  code = mndBuildStbSchemaImp(NULL, pDb, pObj, name.tname, stbRsp.pMeta, false);
2,000,613✔
2769
  if (code) {
2,000,613✔
UNCOV
2770
    tFreeSMCreateStbRsp(&stbRsp);
×
UNCOV
2771
    goto _OVER;
×
2772
  }
2773

2774
  tEncodeSize(tEncodeSMCreateStbRsp, &stbRsp, contLen, code);
2,000,613✔
2775
  if (code) {
2,000,613✔
UNCOV
2776
    tFreeSMCreateStbRsp(&stbRsp);
×
UNCOV
2777
    goto _OVER;
×
2778
  }
2779

2780
  void *cont = taosMemoryMalloc(contLen);
2,000,613✔
2781
  if (NULL == cont) {
2,000,613✔
UNCOV
2782
    code = terrno;
×
UNCOV
2783
    tFreeSMCreateStbRsp(&stbRsp);
×
2784
    goto _OVER;
×
2785
  }
2786
  tEncoderInit(&ec, cont, contLen);
2,000,613✔
2787
  TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER);
2,000,613✔
2788
  tEncoderClear(&ec);
2,000,613✔
2789

2790
  tFreeSMCreateStbRsp(&stbRsp);
2,000,613✔
2791

2792
  *pCont = cont;
2,000,613✔
2793
  *pLen = contLen;
2,000,613✔
2794

2795
  code = 0;
2,000,613✔
2796

2797
_OVER:
2,002,205✔
2798
  if (pObj) {
2,002,205✔
2799
    mndReleaseStb(pMnode, pObj);
2,000,613✔
2800
  }
2801

2802
  if (pDb) {
2,002,205✔
2803
    mndReleaseDb(pMnode, pDb);
2,002,205✔
2804
  }
2805

2806
  TAOS_RETURN(code);
2,002,205✔
2807
}
2808

2809
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
4,745,231✔
2810
                              void *alterOriData, int32_t alterOriDataLen) {
2811
  int32_t code = -1;
4,745,231✔
2812
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
4,745,231✔
2813
  if (pTrans == NULL) {
4,745,231✔
UNCOV
2814
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
2815
    if (terrno != 0) code = terrno;
×
2816
    goto _OVER;
×
2817
  }
2818

2819
  mInfo("trans:%d, used to alter stb:%s, alterOriDataLen:%d", pTrans->id, pStb->name, alterOriDataLen);
4,745,231✔
2820
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
4,745,231✔
2821
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
4,745,231✔
2822

2823
  if (needRsp) {
4,560,543✔
2824
    void   *pCont = NULL;
4,503,549✔
2825
    int32_t contLen = 0;
4,503,549✔
2826
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
4,503,549✔
2827
    mndTransSetRpcRsp(pTrans, pCont, contLen);
4,503,549✔
2828
  }
2829

2830
  TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,560,543✔
2831
  TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,560,543✔
2832
  TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
4,560,543✔
2833
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
4,560,543✔
2834

2835
  code = 0;
4,560,543✔
2836

2837
_OVER:
4,745,231✔
2838
  mndTransDrop(pTrans);
4,745,231✔
2839
  TAOS_RETURN(code);
4,745,231✔
2840
}
2841

2842
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
237,856✔
2843
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2844
  int32_t code = -1;
237,856✔
2845
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
237,856✔
2846
  if (pTrans == NULL) {
237,856✔
UNCOV
2847
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
2848
    if (terrno != 0) code = terrno;
×
2849
    goto _OVER;
×
2850
  }
2851

2852
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
237,856✔
2853
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
237,856✔
2854

2855
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
237,856✔
2856

2857
  if (needRsp) {
237,856✔
2858
    void   *pCont = NULL;
237,856✔
2859
    int32_t contLen = 0;
237,856✔
2860
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
237,856✔
2861
    mndTransSetRpcRsp(pTrans, pCont, contLen);
237,856✔
2862
  }
2863

2864
  if (pAlter->alterType == TSDB_ALTER_TABLE_DROP_TAG) {
237,856✔
2865
    SIdxObj idxObj = {0};
107,787✔
2866
    SField *pField0 = taosArrayGet(pAlter->pFields, 0);
107,787✔
2867
    bool    exist = false;
107,787✔
2868
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
107,787✔
2869
      exist = true;
4,386✔
2870
    }
2871
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
107,787✔
2872
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
107,787✔
2873

2874
    if (exist == true) {
107,787✔
2875
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
4,386✔
2876
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
4,386✔
2877
    }
2878

2879
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
107,787✔
2880
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
107,787✔
2881

2882
  } else if (pAlter->alterType == TSDB_ALTER_TABLE_UPDATE_TAG_NAME) {
130,069✔
2883
    SIdxObj     idxObj = {0};
130,069✔
2884
    SField     *pField0 = taosArrayGet(pAlter->pFields, 0);
130,069✔
2885
    SField     *pField1 = taosArrayGet(pAlter->pFields, 1);
130,069✔
2886
    const char *oTagName = pField0->name;
130,069✔
2887
    const char *nTagName = pField1->name;
130,069✔
2888
    bool        exist = false;
130,069✔
2889

2890
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
130,069✔
2891
      exist = true;
14,243✔
2892
    }
2893

2894
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
130,069✔
2895
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
130,069✔
2896

2897
    if (exist == true) {
130,069✔
2898
      memcpy(idxObj.colName, nTagName, strlen(nTagName));
14,243✔
2899
      idxObj.colName[strlen(nTagName)] = 0;
14,243✔
2900
      TAOS_CHECK_GOTO(mndSetAlterIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
14,243✔
2901
      TAOS_CHECK_GOTO(mndSetAlterIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
14,243✔
2902
    }
2903

2904
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
130,069✔
2905
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
130,069✔
2906
  }
2907
  code = 0;
237,856✔
2908

2909
_OVER:
237,856✔
2910
  mndTransDrop(pTrans);
237,856✔
2911
  TAOS_RETURN(code);
237,856✔
2912
}
2913

2914
static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *pAlter, SDbObj *pDb, SStbObj *pOld) {
5,809,975✔
2915
  bool    needRsp = true;
5,809,975✔
2916
  int32_t code = -1;
5,809,975✔
2917
  SField *pField0 = NULL;
5,809,975✔
2918

2919
  SStbObj stbObj = {0};
5,809,975✔
2920
  taosRLockLatch(&pOld->lock);
5,809,975✔
2921
  memcpy(&stbObj, pOld, sizeof(SStbObj));
5,809,975✔
2922
  taosRUnLockLatch(&pOld->lock);
5,809,975✔
2923
  stbObj.pColumns = NULL;
5,809,975✔
2924
  stbObj.pTags = NULL;
5,809,975✔
2925
  stbObj.pFuncs = NULL;
5,809,975✔
2926
  stbObj.pCmpr = NULL;
5,809,975✔
2927
  stbObj.pExtSchemas = NULL;
5,809,975✔
2928
  stbObj.updateTime = taosGetTimestampMs();
5,809,975✔
2929
  stbObj.lock = 0;
5,809,975✔
2930
  stbObj.virtualStb = pOld->virtualStb;
5,809,975✔
2931
  bool updateTagIndex = false;
5,809,975✔
2932
  switch (pAlter->alterType) {
5,809,975✔
2933
    case TSDB_ALTER_TABLE_ADD_TAG:
295,954✔
2934
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
295,954✔
2935
      break;
295,954✔
2936
    case TSDB_ALTER_TABLE_DROP_TAG:
108,113✔
2937
      pField0 = taosArrayGet(pAlter->pFields, 0);
108,113✔
2938
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
108,113✔
2939
      updateTagIndex = true;
108,113✔
2940
      break;
108,113✔
2941
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
140,719✔
2942
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
140,719✔
2943
      updateTagIndex = true;
140,719✔
2944
      break;
140,719✔
2945
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
332,467✔
2946
      pField0 = taosArrayGet(pAlter->pFields, 0);
332,467✔
2947
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
332,467✔
2948
      break;
332,467✔
2949
    case TSDB_ALTER_TABLE_ADD_COLUMN:
2,454,361✔
2950
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
2,454,361✔
2951
      break;
2,454,361✔
2952
    case TSDB_ALTER_TABLE_DROP_COLUMN:
1,575,122✔
2953
      pField0 = taosArrayGet(pAlter->pFields, 0);
1,575,122✔
2954
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
1,575,122✔
2955
      break;
1,575,122✔
2956
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
519,684✔
2957
      pField0 = taosArrayGet(pAlter->pFields, 0);
519,684✔
2958
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
519,684✔
2959
      break;
519,684✔
2960
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
25,576✔
2961
      needRsp = false;
25,576✔
2962
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep,
25,576✔
2963
                                   pAlter->secureDelete);
25,576✔
2964
      break;
25,576✔
2965
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
95,833✔
2966
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
95,833✔
2967
      break;
95,833✔
2968
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
262,146✔
2969
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
262,146✔
2970
      break;
262,146✔
UNCOV
2971
    default:
×
UNCOV
2972
      needRsp = false;
×
2973
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2974
      break;
×
2975
  }
2976

2977
  if (code != 0) goto _OVER;
5,809,975✔
2978
  if (updateTagIndex == false) {
4,951,669✔
2979
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
4,713,813✔
2980
  } else {
2981
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
237,856✔
2982
  }
2983

2984
_OVER:
5,809,975✔
2985
  taosMemoryFreeClear(stbObj.pTags);
5,809,975✔
2986
  taosMemoryFreeClear(stbObj.pColumns);
5,809,975✔
2987
  taosMemoryFreeClear(stbObj.pCmpr);
5,809,975✔
2988
  if (pAlter->commentLen > 0) {
5,809,975✔
2989
    taosMemoryFreeClear(stbObj.comment);
6,290✔
2990
  }
2991
  taosMemoryFreeClear(stbObj.pExtSchemas);
5,809,975✔
2992
  TAOS_RETURN(code);
5,809,975✔
2993
}
2994

2995
static int32_t mndProcessAlterStbReq(SRpcMsg *pReq) {
5,826,001✔
2996
  SMnode       *pMnode = pReq->info.node;
5,826,001✔
2997
  int32_t       code = -1;
5,826,001✔
2998
  SDbObj       *pDb = NULL;
5,826,001✔
2999
  SStbObj      *pStb = NULL;
5,826,001✔
3000
  SUserObj     *pOperUser = NULL;
5,826,001✔
3001
  SMAlterStbReq alterReq = {0};
5,826,001✔
3002
  int64_t       tss = taosGetTimestampMs();
5,826,001✔
3003

3004
  if (tDeserializeSMAlterStbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
5,826,001✔
UNCOV
3005
    code = TSDB_CODE_INVALID_MSG;
×
UNCOV
3006
    goto _OVER;
×
3007
  }
3008

3009
  mInfo("stb:%s, start to alter", alterReq.name);
5,826,001✔
3010
  if (mndCheckAlterStbReq(&alterReq) != 0) goto _OVER;
5,826,001✔
3011

3012
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
5,826,001✔
3013
  if (pDb == NULL) {
5,826,001✔
3014
    code = TSDB_CODE_MND_DB_NOT_EXIST;
388✔
3015
    goto _OVER;
388✔
3016
  }
3017
  if (pDb->cfg.isMount) {
5,825,613✔
3018
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
312✔
3019
    goto _OVER;
312✔
3020
  }
3021

3022
  pStb = mndAcquireStb(pMnode, alterReq.name);
5,825,301✔
3023
  if (pStb == NULL) {
5,825,301✔
3024
    code = TSDB_CODE_MND_STB_NOT_EXIST;
15,326✔
3025
    goto _OVER;
15,326✔
3026
  }
3027

3028
  SName   name = {0};
5,809,975✔
3029
  int32_t ret = 0;
5,809,975✔
3030
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
5,809,975✔
UNCOV
3031
    mError("stb:%s, failed to tNameFromString since %s", alterReq.name, tstrerror(ret));
×
3032

3033
  // if ((code = mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), MND_OPER_WRITE_DB, pDb)) != 0) {
3034
  //   goto _OVER;
3035
  // }
3036
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser), NULL, _OVER);
5,809,975✔
3037
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb), NULL,
5,809,975✔
3038
                  _OVER);
3039
  TAOS_CHECK_GOTO(mndCheckDbPrivilegeByNameRecF(pMnode, pOperUser, PRIV_CM_ALTER, PRIV_OBJ_TBL, pDb->name, name.tname),
5,809,975✔
3040
                  NULL, _OVER);
3041

3042
  code = mndAlterStb(pMnode, pReq, &alterReq, pDb, pStb);
5,809,975✔
3043
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
5,809,975✔
3044

3045
  if (tsAuditLevel >= AUDIT_LEVEL_DATABASE) {
5,809,975✔
3046
    int64_t tse = taosGetTimestampMs();
5,809,975✔
3047
    double  duration = (double)(tse - tss);
5,809,975✔
3048
    duration = duration / 1000;
5,809,975✔
3049
    auditRecord(pReq, pMnode->clusterId, "alterStb", name.dbname, name.tname, alterReq.sql, alterReq.sqlLen, duration,
5,809,975✔
3050
                0);
3051
  }
3052
_OVER:
5,819,167✔
3053
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
5,826,001✔
3054
    mError("stb:%s, failed to alter since %s", alterReq.name, tstrerror(code));
1,059,020✔
3055
  }
3056

3057
  mndReleaseStb(pMnode, pStb);
5,826,001✔
3058
  mndReleaseDb(pMnode, pDb);
5,826,001✔
3059
  mndReleaseUser(pMnode, pOperUser);
5,826,001✔
3060
  tFreeSMAltertbReq(&alterReq);
5,826,001✔
3061

3062
  TAOS_RETURN(code);
5,826,001✔
3063
}
3064

3065
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
483,727✔
3066
  int32_t  code = 0;
483,727✔
3067
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
483,727✔
3068
  if (pRedoRaw == NULL) {
483,727✔
UNCOV
3069
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
3070
    if (terrno != 0) code = terrno;
×
3071
    TAOS_RETURN(code);
×
3072
  }
3073
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
483,727✔
UNCOV
3074
    sdbFreeRaw(pRedoRaw);
×
UNCOV
3075
    TAOS_RETURN(code);
×
3076
  }
3077
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
483,727✔
3078

3079
  TAOS_RETURN(code);
483,727✔
3080
}
3081

3082
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
483,727✔
3083
  int32_t  code = 0;
483,727✔
3084
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
483,727✔
3085
  if (pCommitRaw == NULL) {
483,727✔
UNCOV
3086
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
3087
    if (terrno != 0) code = terrno;
×
3088
    TAOS_RETURN(code);
×
3089
  }
3090
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
483,727✔
UNCOV
3091
    sdbFreeRaw(pCommitRaw);
×
UNCOV
3092
    TAOS_RETURN(code);
×
3093
  }
3094
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
483,727✔
3095

3096
  TAOS_RETURN(code);
483,727✔
3097
}
3098

3099
static int32_t mndSetDropStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
483,727✔
3100
  int32_t code = 0;
483,727✔
3101
  SSdb   *pSdb = pMnode->pSdb;
483,727✔
3102
  SVgObj *pVgroup = NULL;
483,727✔
3103
  void   *pIter = NULL;
483,727✔
3104

3105
  while (1) {
1,284,950✔
3106
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1,768,677✔
3107
    if (pIter == NULL) break;
1,768,677✔
3108
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
1,284,950✔
3109
      sdbRelease(pSdb, pVgroup);
321,394✔
3110
      continue;
321,394✔
3111
    }
3112

3113
    int32_t contLen = 0;
963,556✔
3114
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
963,556✔
3115
    if (pReq == NULL) {
963,556✔
UNCOV
3116
      sdbCancelFetch(pSdb, pIter);
×
UNCOV
3117
      sdbRelease(pSdb, pVgroup);
×
3118
      code = TSDB_CODE_OUT_OF_MEMORY;
×
3119
      TAOS_RETURN(code);
×
3120
    }
3121

3122
    STransAction action = {0};
963,556✔
3123
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
963,556✔
3124
    action.pCont = pReq;
963,556✔
3125
    action.contLen = contLen;
963,556✔
3126
    action.msgType = TDMT_VND_DROP_STB;
963,556✔
3127
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
963,556✔
3128
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
963,556✔
UNCOV
3129
      taosMemoryFree(pReq);
×
UNCOV
3130
      sdbCancelFetch(pSdb, pIter);
×
3131
      sdbRelease(pSdb, pVgroup);
×
3132
      TAOS_RETURN(code);
×
3133
    }
3134
    sdbRelease(pSdb, pVgroup);
963,556✔
3135
  }
3136

3137
  TAOS_RETURN(code);
483,727✔
3138
}
3139

3140
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
483,727✔
3141
  int32_t code = -1;
483,727✔
3142
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
483,727✔
3143
  if (pTrans == NULL) {
483,727✔
UNCOV
3144
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
3145
    if (terrno != 0) code = terrno;
×
3146
    goto _OVER;
×
3147
  }
3148

3149
  mInfo("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
483,727✔
3150
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
483,727✔
3151
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
483,727✔
3152

3153
  TAOS_CHECK_GOTO(mndSetDropStbPrepareLogs(pMnode, pTrans, pStb), NULL, _OVER);
483,727✔
3154
  TAOS_CHECK_GOTO(mndSetDropStbCommitLogs(pMnode, pTrans, pStb), NULL, _OVER);
483,727✔
3155
  TAOS_CHECK_GOTO(mndSetDropStbRedoActions(pMnode, pTrans, pDb, pStb), NULL, _OVER);
483,727✔
3156
  TAOS_CHECK_GOTO(mndDropIdxsByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
483,727✔
3157
  TAOS_CHECK_GOTO(mndDropRsmaByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
483,727✔
3158
  TAOS_CHECK_GOTO(mndUserRemoveStb(pMnode, pTrans, pStb->name), NULL, _OVER);
483,727✔
3159
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
483,727✔
3160
  code = 0;
483,727✔
3161

3162
_OVER:
483,727✔
3163
  mndTransDrop(pTrans);
483,727✔
3164
  TAOS_RETURN(code);
483,727✔
3165
}
3166

3167
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
484,039✔
3168
  int32_t code = 0;
484,039✔
3169
  SSdb   *pSdb = pMnode->pSdb;
484,039✔
3170
  void   *pIter = NULL;
484,039✔
3171
  while (1) {
1,716✔
3172
    SMqTopicObj *pTopic = NULL;
485,755✔
3173
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
485,755✔
3174
    if (pIter == NULL) break;
485,755✔
3175

3176
    if (pTopic->stbUid == suid) {
1,716✔
UNCOV
3177
      sdbRelease(pSdb, pTopic);
×
UNCOV
3178
      sdbCancelFetch(pSdb, pIter);
×
3179
      TAOS_RETURN(TSDB_CODE_MND_TOPIC_MUST_BE_DELETED);
×
3180
    }
3181
    sdbRelease(pSdb, pTopic);
1,716✔
3182
  }
3183
  TAOS_RETURN(code);
484,039✔
3184
}
3185

UNCOV
3186
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
×
UNCOV
3187
  int32_t code = 0;
×
3188
  SSdb   *pSdb = pMnode->pSdb;
×
3189
  void   *pIter = NULL;
×
3190
  while (1) {
×
3191
    SStreamObj *pStream = NULL;
×
3192
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
×
3193
    if (pIter == NULL) break;
×
3194

3195
    if (pStream->pCreate->outStbUid == suid) {
×
UNCOV
3196
      sdbCancelFetch(pSdb, pIter);
×
3197
      sdbRelease(pSdb, pStream);
×
3198
      TAOS_RETURN(-1);
×
3199
    }
3200

UNCOV
3201
    sdbRelease(pSdb, pStream);
×
3202
  }
3203
  TAOS_RETURN(code);
×
3204
}
3205

UNCOV
3206
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
UNCOV
3207
static int32_t mndProcessTrimDbRsp(SRpcMsg *pRsp) { return 0; }
×
3208
static int32_t mndProcessTrimDbWalRsp(SRpcMsg *pRsp) { return 0; }
2,352✔
3209
static int32_t mndProcessS3MigrateDbRsp(SRpcMsg *pRsp) { return 0; }
×
3210

3211
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
928,422✔
3212
  SMnode      *pMnode = pReq->info.node;
928,422✔
3213
  int32_t      code = -1;
928,422✔
3214
  SDbObj      *pDb = NULL;
928,422✔
3215
  SStbObj     *pStb = NULL;
928,422✔
3216
  SUserObj    *pOperUser = NULL;
928,422✔
3217
  SMDropStbReq dropReq = {0};
928,422✔
3218
  int64_t      tss = taosGetTimestampMs();
928,422✔
3219

3220
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
928,422✔
3221

3222
  mInfo("stb:%s, start to drop", dropReq.name);
928,422✔
3223

3224
  pStb = mndAcquireStb(pMnode, dropReq.name);
928,422✔
3225
  if (pStb == NULL) {
928,422✔
3226
    if (dropReq.igNotExists) {
444,383✔
3227
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
443,236✔
3228
      code = 0;
443,236✔
3229
      goto _OVER;
443,236✔
3230
    } else {
3231
      code = TSDB_CODE_MND_STB_NOT_EXIST;
1,147✔
3232
      goto _OVER;
1,147✔
3233
    }
3234
  }
3235

3236
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
484,039✔
UNCOV
3237
    code = 0;
×
UNCOV
3238
    goto _OVER;
×
3239
  }
3240

3241
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
484,039✔
3242
  if (pDb == NULL) {
484,039✔
UNCOV
3243
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
UNCOV
3244
    goto _OVER;
×
3245
  }
3246

3247
  SName   name = {0};
484,039✔
3248
  int32_t ret = 0;
484,039✔
3249
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
484,039✔
UNCOV
3250
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
3251

3252
  // if ((code = mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), MND_OPER_WRITE_DB, pDb)) != 0) {
3253
  //   goto _OVER;
3254
  // }
3255
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser), NULL, _OVER);
484,039✔
3256
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB, pDb), NULL,
484,039✔
3257
                  _OVER);
3258
  TAOS_CHECK_GOTO(
484,039✔
3259
      mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_DROP, PRIV_OBJ_TBL, pStb->ownerId, pDb->name, name.tname),
3260
      NULL, _OVER);
3261
  if ((code = mndCheckDropStbForTopic(pMnode, dropReq.name, pStb->uid)) != 0) {
484,039✔
UNCOV
3262
    goto _OVER;
×
3263
  }
3264

3265
  if (pDb->cfg.isMount) {
484,039✔
3266
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
312✔
3267
    goto _OVER;
312✔
3268
  }
3269

3270
  code = mndDropStb(pMnode, pReq, pDb, pStb);
483,727✔
3271
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
483,727✔
3272

3273
  if (tsAuditLevel >= AUDIT_LEVEL_DATABASE) {
483,727✔
3274
    int64_t tse = taosGetTimestampMs();
483,727✔
3275
    double  duration = (double)(tse - tss);
483,727✔
3276
    duration = duration / 1000;
483,727✔
3277
    auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen, duration, 0);
483,727✔
3278
  }
3279
_OVER:
927,732✔
3280
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
928,422✔
3281
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
1,459✔
3282
  }
3283

3284
  mndReleaseDb(pMnode, pDb);
928,422✔
3285
  mndReleaseStb(pMnode, pStb);
928,422✔
3286
  mndReleaseUser(pMnode, pOperUser);
928,422✔
3287
  tFreeSMDropStbReq(&dropReq);
928,422✔
3288
  TAOS_RETURN(code);
928,422✔
3289
}
3290

3291
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
19,026,154✔
3292
  SMnode       *pMnode = pReq->info.node;
19,026,154✔
3293
  int32_t       code = -1;
19,026,154✔
3294
  STableInfoReq infoReq = {0};
19,026,154✔
3295
  STableMetaRsp metaRsp = {0};
19,026,154✔
3296
  SUserObj     *pUser = NULL;
19,026,105✔
3297

3298
  code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pUser);
19,026,154✔
3299
  if (pUser == NULL) return 0;
19,026,154✔
3300
  bool sysinfo = pUser->sysInfo;
19,026,154✔
3301

3302
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
19,026,154✔
3303

3304
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
19,026,154✔
3305
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
2,004,439✔
3306
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
2,004,439✔
3307
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
17,021,715✔
3308
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
148,187✔
3309
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
148,187✔
3310
  } else {
3311
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
16,873,528✔
3312
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp, true), NULL, _OVER);
16,873,528✔
3313
  }
3314

3315
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
18,082,842✔
3316
  if (rspLen < 0) {
18,082,842✔
UNCOV
3317
    code = TSDB_CODE_INVALID_MSG;
×
UNCOV
3318
    goto _OVER;
×
3319
  }
3320

3321
  void *pRsp = rpcMallocCont(rspLen);
18,082,842✔
3322
  if (pRsp == NULL) {
18,082,842✔
UNCOV
3323
    code = terrno;
×
UNCOV
3324
    goto _OVER;
×
3325
  }
3326

3327
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
18,082,842✔
UNCOV
3328
    code = rspLen;
×
UNCOV
3329
    goto _OVER;
×
3330
  }
3331
  pReq->info.rsp = pRsp;
18,082,842✔
3332
  pReq->info.rspLen = rspLen;
18,082,842✔
3333
  code = 0;
18,082,842✔
3334

3335
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
18,082,842✔
3336

3337
_OVER:
19,025,960✔
3338
  if (code != 0) {
19,026,154✔
3339
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
943,312✔
3340
  }
3341

3342
  mndReleaseUser(pMnode, pUser);
19,026,154✔
3343
  tFreeSTableMetaRsp(&metaRsp);
19,026,154✔
3344
  // TODO change to TAOS_RETURN
3345
  return code;
19,025,756✔
3346
}
3347

3348
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
34,205✔
3349
  SMnode      *pMnode = pReq->info.node;
34,205✔
3350
  int32_t      code = -1;
34,205✔
3351
  STableCfgReq cfgReq = {0};
34,205✔
3352
  STableCfgRsp cfgRsp = {0};
34,205✔
3353

3354
  TAOS_CHECK_GOTO(tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
34,205✔
3355

3356
  char dbName[TSDB_DB_NAME_LEN] = {0};
34,205✔
3357
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
34,205✔
3358
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
34,205✔
3359
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
3,740✔
3360
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
3,740✔
3361
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
30,465✔
3362
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
1,870✔
3363
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
1,870✔
3364
  } else {
3365
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
28,595✔
3366
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
28,595✔
3367
  }
3368

3369
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
34,205✔
3370
  if (rspLen < 0) {
34,205✔
UNCOV
3371
    code = TSDB_CODE_INVALID_MSG;
×
UNCOV
3372
    goto _OVER;
×
3373
  }
3374

3375
  void *pRsp = rpcMallocCont(rspLen);
34,205✔
3376
  if (pRsp == NULL) {
34,205✔
UNCOV
3377
    code = terrno;
×
UNCOV
3378
    goto _OVER;
×
3379
  }
3380

3381
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
34,205✔
UNCOV
3382
    code = rspLen;
×
UNCOV
3383
    goto _OVER;
×
3384
  }
3385
  pReq->info.rsp = pRsp;
34,205✔
3386
  pReq->info.rspLen = rspLen;
34,205✔
3387
  code = 0;
34,205✔
3388

3389
  mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
34,205✔
3390

3391
_OVER:
34,205✔
3392
  if (code != 0) {
34,205✔
UNCOV
3393
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3394
  }
3395

3396
  tFreeSTableCfgRsp(&cfgRsp);
34,205✔
3397
  TAOS_RETURN(code);
34,205✔
3398
}
3399

3400
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
6,682,540✔
3401
                           int32_t *pRspLen) {
3402
  int32_t   code = 0;
6,682,540✔
3403
  SSTbHbRsp hbRsp = {0};
6,682,540✔
3404
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
6,682,540✔
3405
  if (hbRsp.pMetaRsp == NULL) {
6,682,540✔
UNCOV
3406
    code = terrno;
×
UNCOV
3407
    TAOS_RETURN(code);
×
3408
  }
3409

3410
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
6,682,540✔
3411
  if (NULL == hbRsp.pIndexRsp) {
6,682,540✔
UNCOV
3412
    taosArrayDestroy(hbRsp.pMetaRsp);
×
UNCOV
3413
    code = terrno;
×
3414
    TAOS_RETURN(code);
×
3415
  }
3416

3417
  for (int32_t i = 0; i < numOfStbs; ++i) {
15,776,264✔
3418
    SSTableVersion *pStbVersion = &pStbVersions[i];
9,093,724✔
3419
    pStbVersion->suid = be64toh(pStbVersion->suid);
9,093,724✔
3420
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
9,093,724✔
3421
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
9,093,724✔
3422
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
9,093,724✔
3423

3424
    bool    schema = false;
9,093,724✔
3425
    bool    sma = false;
9,093,724✔
3426
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
9,093,724✔
3427
    if (TSDB_CODE_SUCCESS != code) {
9,093,724✔
3428
      STableMetaRsp metaRsp = {0};
42,446✔
3429
      metaRsp.numOfColumns = -1;
42,446✔
3430
      metaRsp.suid = pStbVersion->suid;
42,446✔
3431
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
42,446✔
3432
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
42,446✔
3433
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
42,446✔
3434
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
84,892✔
UNCOV
3435
        code = terrno;
×
UNCOV
3436
        return code;
×
3437
      }
3438
      continue;
42,446✔
3439
    }
3440

3441
    if (schema) {
9,051,278✔
3442
      STableMetaRsp metaRsp = {0};
25,456✔
3443
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
25,456✔
3444
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp, false) != 0) {
25,456✔
UNCOV
3445
        metaRsp.numOfColumns = -1;
×
UNCOV
3446
        metaRsp.suid = pStbVersion->suid;
×
3447
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3448
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3449
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3450
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3451
          code = terrno;
×
3452
          return code;
×
3453
        }
3454
        continue;
×
3455
      }
3456

3457
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
50,912✔
UNCOV
3458
        code = terrno;
×
UNCOV
3459
        return code;
×
3460
      }
3461
    }
3462

3463
    if (sma) {
9,051,278✔
UNCOV
3464
      bool           exist = false;
×
UNCOV
3465
      char           tbFName[TSDB_TABLE_FNAME_LEN];
×
3466
      STableIndexRsp indexRsp = {0};
×
3467
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3468
      if (NULL == indexRsp.pIndex) {
×
3469
        code = terrno;
×
3470
        TAOS_RETURN(code);
×
3471
      }
3472

UNCOV
3473
      (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
UNCOV
3474
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3475
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3476

3477
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
UNCOV
3478
        code = terrno;
×
3479
        return code;
×
3480
      }
3481
    }
3482
  }
3483

3484
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
6,682,540✔
3485
  if (rspLen < 0) {
6,682,540✔
UNCOV
3486
    tFreeSSTbHbRsp(&hbRsp);
×
UNCOV
3487
    code = TSDB_CODE_INVALID_MSG;
×
3488
    TAOS_RETURN(code);
×
3489
  }
3490

3491
  void *pRsp = taosMemoryMalloc(rspLen);
6,682,540✔
3492
  if (pRsp == NULL) {
6,682,540✔
UNCOV
3493
    tFreeSSTbHbRsp(&hbRsp);
×
UNCOV
3494
    code = terrno;
×
3495
    TAOS_RETURN(code);
×
3496
  }
3497

3498
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
6,682,540✔
3499
  tFreeSSTbHbRsp(&hbRsp);
6,682,006✔
3500
  if (rspLen < 0) return rspLen;
6,682,540✔
3501
  *ppRsp = pRsp;
6,682,540✔
3502
  *pRspLen = rspLen;
6,682,540✔
3503
  TAOS_RETURN(code);
6,682,540✔
3504
}
3505

3506
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
2,072,174✔
3507
  int32_t code = 0;
2,072,174✔
3508
  SSdb   *pSdb = pMnode->pSdb;
2,072,174✔
3509
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
2,072,174✔
3510
  if (pDb == NULL) {
2,072,174✔
UNCOV
3511
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
UNCOV
3512
    TAOS_RETURN(code);
×
3513
  }
3514

3515
  int32_t numOfStbs = 0;
2,072,174✔
3516
  void   *pIter = NULL;
2,072,174✔
3517
  while (1) {
33,831,184✔
3518
    SStbObj *pStb = NULL;
35,903,358✔
3519
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
35,903,358✔
3520
    if (pIter == NULL) break;
35,903,358✔
3521

3522
    if (pStb->dbUid == pDb->uid) {
33,831,184✔
3523
      numOfStbs++;
22,841,942✔
3524
    }
3525

3526
    sdbRelease(pSdb, pStb);
33,831,184✔
3527
  }
3528

3529
  *pNumOfStbs = numOfStbs;
2,072,174✔
3530
  mndReleaseDb(pMnode, pDb);
2,072,174✔
3531
  TAOS_RETURN(code);
2,072,174✔
3532
}
3533

UNCOV
3534
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
UNCOV
3535
  SName name = {0};
×
3536
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3537

3538
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3539

3540
  return 0;
×
3541
}
3542

UNCOV
3543
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
UNCOV
3544
  SName name = {0};
×
3545
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3546

3547
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
×
3548

3549
  return 0;
×
3550
}
3551

3552
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
34,205✔
3553
  SName name = {0};
34,205✔
3554
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
34,205✔
3555

3556
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
34,205✔
3557

3558
  return 0;
34,205✔
3559
}
3560

3561
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
2,970,796✔
3562
  int32_t pos = -1;
2,970,796✔
3563
  int32_t num = 0;
2,970,796✔
3564
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
25,724,630✔
3565
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
25,724,630✔
3566
    if (num == 2) break;
25,724,098✔
3567
  }
3568

3569
  if (num == 2) {
2,970,264✔
3570
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
2,970,264✔
3571
  }
3572
}
2,970,796✔
3573

3574
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
290,037✔
3575
  SMnode    *pMnode = pReq->info.node;
290,037✔
3576
  SSdb      *pSdb = pMnode->pSdb;
290,037✔
3577
  int32_t    numOfRows = 0;
290,037✔
3578
  SStbObj   *pStb = NULL;
290,037✔
3579
  SUserObj  *pOperUser = NULL;
290,037✔
3580
  SSHashObj *pUidNames = NULL;
290,037✔
3581
  int32_t    cols = 0;
290,037✔
3582
  int32_t    lino = 0;
290,037✔
3583
  int32_t    code = 0;
290,037✔
3584
  char       objFName[TSDB_OBJ_FNAME_LEN + 1] = {0};
290,037✔
3585
  bool       showAll = false;
290,037✔
3586

3587
  SDbObj *pDb = NULL;
290,037✔
3588
  if (strlen(pShow->db) > 0) {
290,037✔
3589
    pDb = mndAcquireDb(pMnode, pShow->db);
233,953✔
3590
    if (pDb == NULL) return terrno;
233,953✔
3591
  }
3592

3593
  if ((code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser)) != 0) {
288,880✔
UNCOV
3594
    goto _ERROR;
×
3595
  }
3596

3597
  (void)snprintf(objFName, sizeof(objFName), "%d.*", pOperUser->acctId);
288,880✔
3598
  showAll = (0 == mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_SHOW, PRIV_OBJ_TBL, pDb ? pDb->ownerId : 0,
288,880✔
3599
                                           pDb ? pDb->name : objFName, "*"));
3600
  showAll = showAll && (0 == mndCheckDbPrivilegeByName(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB,
288,880✔
3601
                                                       pDb ? pDb->name : objFName, false));
3602

3603
  while (numOfRows < rows) {
2,244,555✔
3604
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,243,411✔
3605
    if (pShow->pIter == NULL) break;
2,243,411✔
3606

3607
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,955,675✔
3608
      sdbRelease(pSdb, pStb);
963,455✔
3609
      continue;
963,455✔
3610
    }
3611

3612
    if (isTsmaResSTb(pStb->name)) {
992,220✔
UNCOV
3613
      sdbRelease(pSdb, pStb);
×
UNCOV
3614
      continue;
×
3615
    }
3616

3617
#if 0
3618
    if ((0 == pUser->superUser) && mndCheckStbPrivilege(pMnode, pUser, RPC_MSG_TOKEN(pReq), MND_OPER_SHOW_STB, pStb) != 0) {
3619
      sdbRelease(pSdb, pStb);
3620
      terrno = 0;
3621
      continue;
3622
    }
3623
#endif
3624
    cols = 0;
992,220✔
3625

3626
    SName name = {0};
992,220✔
3627

3628
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
992,220✔
3629
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
992,220✔
3630

3631
    if (!showAll && (mndCheckObjPrivilegeRecF(pMnode, pOperUser, PRIV_CM_SHOW, PRIV_OBJ_TBL, pStb->ownerId, pStb->db,
992,220✔
3632
                                              &stbName[VARSTR_HEADER_SIZE]) ||
3,498✔
3633
                     mndCheckDbPrivilegeByName(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_USE_DB,
3,498✔
3634
                                               pStb->db, false))) {
3,498✔
3635
      sdbRelease(pSdb, pStb);
2,210✔
3636
      terrno = 0;
2,210✔
3637
      continue;
2,210✔
3638
    }
3639

3640
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
990,010✔
3641
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3642
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
990,010✔
3643

3644
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
990,010✔
3645
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
990,010✔
3646
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
990,010✔
3647
    varDataSetLen(db, strlen(varDataVal(db)));
990,010✔
3648
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3649
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
990,010✔
3650

3651
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3652
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
990,010✔
3653
                        _ERROR);
3654

3655
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3656
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
990,010✔
3657
                        _ERROR);
3658

3659
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3660
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
990,010✔
3661

3662
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3663
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
990,010✔
3664
                        _ERROR);  // number of tables
3665

3666
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3667
    if (pStb->commentLen > 0) {
990,010✔
3668
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
19,498✔
3669
      STR_TO_VARSTR(comment, pStb->comment);
19,498✔
3670
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
19,498✔
3671
    } else if (pStb->commentLen == 0) {
970,512✔
3672
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
135,836✔
3673
      STR_TO_VARSTR(comment, "");
135,836✔
3674
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
135,836✔
3675
    } else {
3676
      colDataSetNULL(pColInfo, numOfRows);
834,676✔
3677
    }
3678

3679
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
990,010✔
3680
    (void)snprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,977,886✔
3681
                   pStb->watermark[0], pStb->watermark[1]);
1,977,886✔
3682
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
990,010✔
3683

3684
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3685
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
990,010✔
3686

3687
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
990,010✔
3688
    (void)snprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
1,977,886✔
3689
                   pStb->maxdelay[0], pStb->maxdelay[1]);
1,977,886✔
3690
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
990,010✔
3691

3692
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3693
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
990,010✔
3694

3695
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
990,010✔
3696
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
990,010✔
3697
    char   *sep = ", ";
990,010✔
3698
    int32_t sepLen = strlen(sep);
990,010✔
3699
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
990,010✔
3700
    for (int32_t i = 0; i < rollupNum; ++i) {
990,010✔
UNCOV
3701
      char *funcName = taosArrayGet(pStb->pFuncs, i);
×
UNCOV
3702
      if (i) {
×
3703
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3704
        rollupLen -= sepLen;
×
3705
      }
3706
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
×
UNCOV
3707
      rollupLen -= strlen(funcName);
×
3708
    }
3709
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
990,010✔
3710

3711
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3712
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
990,010✔
3713

3714
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3715
    if (pColInfo) {
990,010✔
3716
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
990,010✔
3717
    }
3718

3719
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3720
    if (pColInfo) {
990,010✔
3721
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
990,010✔
3722
    }
3723

3724
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3725
    if (pColInfo) {
990,010✔
3726
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
990,010✔
3727
    }
3728

3729
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
990,010✔
3730
    if (pColInfo) {
990,010✔
3731
      if (!pUidNames) {
990,010✔
3732
        TAOS_CHECK_GOTO(mndBuildUidNamesHash(pMnode, &pUidNames), &lino, _OVER);
223,935✔
3733
      }
3734
      const char *ownerName = tSimpleHashGet(pUidNames, (const char *)&pStb->ownerId, sizeof(pStb->ownerId));
990,010✔
3735
      char        owner[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
990,010✔
3736
      STR_WITH_MAXSIZE_TO_VARSTR(owner, ownerName ? ownerName : "[unknown]", sizeof(owner));
990,010✔
3737
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)owner, false), pStb, &lino, _ERROR);
990,010✔
3738
    }
3739

3740
    numOfRows++;
990,010✔
3741
    sdbRelease(pSdb, pStb);
990,010✔
3742
  }
3743

3744
  if (pDb != NULL) {
288,880✔
3745
    mndReleaseDb(pMnode, pDb);
232,796✔
3746
  }
3747
  if (pOperUser != NULL) {
288,880✔
3748
    mndReleaseUser(pMnode, pOperUser);
288,880✔
3749
  }
3750

3751
  goto _OVER;
288,880✔
3752

UNCOV
3753
_ERROR:
×
UNCOV
3754
  if (pDb != NULL) {
×
3755
    mndReleaseDb(pMnode, pDb);
×
3756
  }
3757
  if (pOperUser != NULL) {
×
UNCOV
3758
    mndReleaseUser(pMnode, pOperUser);
×
3759
  }
3760
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3761
         tstrerror(code));
3762

3763
_OVER:
286,358✔
3764
  pShow->numOfRows += numOfRows;
288,880✔
3765
  tSimpleHashCleanup(pUidNames);
288,880✔
3766
  return numOfRows;
288,880✔
3767
}
3768

3769
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
1,867,592✔
3770
                                    const char *dbName, const char *tbName) {
3771
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,867,592✔
3772
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,867,592✔
3773
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,867,592✔
3774
  int32_t numOfRows = p->info.rows;
1,867,592✔
3775
  int32_t lino = 0;
1,867,592✔
3776
  int32_t code = 0;
1,867,592✔
3777

3778
  STR_TO_VARSTR(dName, dbName);
1,867,592✔
3779
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
1,867,592✔
3780

3781
  for (int32_t i = 0; i < size; ++i) {
62,562,204✔
3782
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
60,695,144✔
3783
    //    if (pm->sysInfo) {
3784
    //      continue;
3785
    //    }
3786
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
60,674,396✔
UNCOV
3787
      continue;
×
3788
    }
3789

3790
    STR_TO_VARSTR(tName, pm->name);
60,695,144✔
3791

3792
    for (int32_t j = 0; j < pm->colNum; j++) {
591,928,244✔
3793
      // table name
3794
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
531,211,288✔
3795
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
531,041,580✔
3796

3797
      // database name
3798
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
531,095,312✔
3799
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
531,095,312✔
3800

3801
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
531,089,460✔
3802
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
531,091,056✔
3803

3804
      // col name
3805
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
531,110,740✔
3806
      STR_TO_VARSTR(colName, pm->schema[j].name);
531,078,820✔
3807
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
531,190,008✔
3808
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
531,170,324✔
3809

3810
      // col type
3811
      int8_t colType = pm->schema[j].type;
531,125,636✔
3812
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
531,160,216✔
3813
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
531,127,764✔
3814
      int  colTypeLen =
3815
          snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
531,135,212✔
3816
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
531,253,316✔
3817
        colTypeLen +=
278,218,540✔
3818
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
278,218,540✔
3819
                     (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
278,237,692✔
3820
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
253,015,624✔
UNCOV
3821
        colTypeLen +=
×
UNCOV
3822
            snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3823
                     (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3824
      }
3825
      varDataSetLen(colTypeStr, colTypeLen);
531,234,164✔
3826
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
531,108,080✔
3827

3828
      // col length
3829
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
531,147,980✔
3830
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
531,117,124✔
3831

3832
      // col precision, col scale, col nullable, col source
3833
      for (int32_t k = 6; k <= 10; ++k) {
2,147,483,647✔
3834
        pColInfoData = taosArrayGet(p->pDataBlock, k);
2,147,483,647✔
3835
        colDataSetNULL(pColInfoData, numOfRows);
2,147,483,647✔
3836
      }
3837

3838
      numOfRows += 1;
531,965,132✔
3839
    }
3840
  }
3841
  return numOfRows;
1,867,060✔
UNCOV
3842
_OVER:
×
UNCOV
3843
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3844
  return numOfRows;
×
3845
}
3846
#define BUILD_COL_FOR_INFO_DB 1
3847
#define BUILD_COL_FOR_PERF_DB 1 << 1
3848
#define BUILD_COL_FOR_USER_DB 1 << 2
3849
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3850

3851
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
968,425✔
3852
  size_t               size = 0;
968,425✔
3853
  const SSysTableMeta *pSysDbTableMeta = NULL;
968,425✔
3854

3855
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
968,425✔
3856
    getInfosDbMeta(&pSysDbTableMeta, &size);
933,796✔
3857
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
933,796✔
3858
  }
3859

3860
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
968,425✔
3861
    getPerfDbMeta(&pSysDbTableMeta, &size);
933,796✔
3862
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
933,796✔
3863
  }
3864

3865
  return p->info.rows;
968,425✔
3866
}
3867

3868
static int8_t determineBuildColForWhichDBs(const char *db) {
972,361✔
3869
  int8_t buildWhichDBs;
3870
  if (!db[0])
972,361✔
3871
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
933,632✔
3872
  else {
3873
    char *p = strchr(db, '.');
38,729✔
3874
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
38,729✔
3875
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
164✔
3876
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
38,565✔
3877
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
164✔
3878
    } else {
3879
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
38,401✔
3880
    }
3881
  }
3882
  return buildWhichDBs;
972,361✔
3883
}
3884

3885
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
972,361✔
3886
  uint8_t  buildWhichDBs;
3887
  SMnode  *pMnode = pReq->info.node;
972,361✔
3888
  SSdb    *pSdb = pMnode->pSdb;
972,361✔
3889
  SStbObj *pStb = NULL;
972,361✔
3890
  int32_t  numOfRows = 0;
972,361✔
3891
  int32_t  lino = 0;
972,361✔
3892
  int32_t  code = 0;
972,361✔
3893

3894
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
972,361✔
3895

3896
  if (!pShow->sysDbRsp) {
972,361✔
3897
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
968,425✔
3898
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
968,425✔
3899
    pShow->sysDbRsp = true;
968,425✔
3900
  }
3901

3902
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
972,361✔
3903
    SDbObj *pDb = NULL;
972,033✔
3904
    if (strlen(pShow->db) > 0) {
972,033✔
3905
      pDb = mndAcquireDb(pMnode, pShow->db);
38,401✔
3906
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
38,401✔
3907
    }
3908

3909
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
972,033✔
3910
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
972,033✔
3911
    bool fetch = pShow->restore ? false : true;
972,033✔
3912
    pShow->restore = false;
972,033✔
3913
    while (numOfRows < rows) {
2,850,754✔
3914
      if (fetch) {
2,850,754✔
3915
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
2,846,818✔
3916
        if (pShow->pIter == NULL) break;
2,846,818✔
3917
      } else {
3918
        fetch = true;
3,936✔
3919
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
3,936✔
3920
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
3,936✔
3921
        if (!pStb) continue;
3,936✔
3922
      }
3923

3924
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
1,882,657✔
3925
        sdbRelease(pSdb, pStb);
2,724✔
3926
        continue;
2,724✔
3927
      }
3928

3929
      SName name = {0};
1,879,933✔
3930
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,879,933✔
3931
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
1,879,401✔
3932
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
1,879,933✔
UNCOV
3933
        sdbRelease(pSdb, pStb);
×
UNCOV
3934
        continue;
×
3935
      }
3936

3937
      if ((numOfRows + pStb->numOfColumns) > rows) {
1,879,933✔
3938
        pShow->restore = true;
3,936✔
3939
        if (numOfRows == 0) {
3,936✔
UNCOV
3940
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3941
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3942
        }
3943
        sdbRelease(pSdb, pStb);
3,936✔
3944
        break;
3,936✔
3945
      }
3946

3947
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
1,875,997✔
3948

3949
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
1,875,997✔
3950

3951
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,875,997✔
3952
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
1,875,997✔
3953
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
1,875,997✔
3954
      varDataSetLen(db, strlen(varDataVal(db)));
1,875,997✔
3955

3956
      for (int i = 0; i < pStb->numOfColumns; i++) {
35,063,048✔
3957
        int32_t          cols = 0;
33,187,051✔
3958
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,187,051✔
3959
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
33,187,583✔
3960

3961
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,188,115✔
3962
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
33,188,115✔
3963

3964
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,187,583✔
3965
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
33,187,583✔
3966

3967
        // col name
3968
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
33,188,115✔
3969
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
33,188,115✔
3970
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,188,115✔
3971
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
33,187,583✔
3972

3973
        // col type
3974
        int8_t colType = pStb->pColumns[i].type;
33,188,115✔
3975
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,188,115✔
3976
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
33,188,115✔
3977
        int  colTypeLen =
3978
            snprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
33,188,115✔
3979
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
33,188,115✔
3980
          colTypeLen +=
1,035,652✔
3981
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,035,652✔
3982
                       "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
1,035,652✔
3983
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
32,152,463✔
3984
          colTypeLen +=
1,035,280✔
3985
              snprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
1,035,280✔
3986
                       "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
1,035,280✔
3987
        } else if (IS_DECIMAL_TYPE(colType)) {
31,117,183✔
UNCOV
3988
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
×
UNCOV
3989
          uint8_t prec = 0, scale = 0;
×
3990
          decimalFromTypeMod(typeMod, &prec, &scale);
×
3991
          colTypeLen += snprintf(varDataVal(colTypeStr) + colTypeLen,
×
3992
                                 sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d,%d)", prec, scale);
3993
        }
3994
        varDataSetLen(colTypeStr, colTypeLen);
33,188,115✔
3995
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
33,188,115✔
3996

3997
        // col length
3998
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
33,188,115✔
3999
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
33,188,115✔
4000
                            &lino, _OVER);
4001
        
4002
        // col precision, col scale, col nullable, col source
4003
        for (int32_t j = 6; j <= 9; ++j) {
165,938,447✔
4004
          pColInfo = taosArrayGet(pBlock->pDataBlock, j);
132,749,268✔
4005
          colDataSetNULL(pColInfo, numOfRows);
132,749,268✔
4006
        }
4007

4008
        // col id
4009
        pColInfo = taosArrayGet(pBlock->pDataBlock, 10);
33,189,179✔
4010
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].colId, false), pStb,
33,188,115✔
4011
                            &lino, _OVER);
4012
        numOfRows++;
33,187,051✔
4013
      }
4014

4015
      sdbRelease(pSdb, pStb);
1,875,997✔
4016
    }
4017

4018
    if (pDb != NULL) {
972,033✔
4019
      mndReleaseDb(pMnode, pDb);
38,214✔
4020
    }
4021
  }
4022

4023
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
972,361✔
4024
  goto _OVER;
972,361✔
4025

4026
_ERROR:
4027
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
4028
         __FUNCTION__, lino, tstrerror(code));
4029

4030
_OVER:
972,361✔
4031
  pShow->numOfRows += numOfRows;
972,361✔
4032
  return numOfRows;
972,361✔
4033
}
4034

4035
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
164✔
4036
  SSdb *pSdb = pMnode->pSdb;
164✔
4037
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
164✔
4038
}
164✔
4039

UNCOV
4040
const char *mndGetStbStr(const char *src) {
×
UNCOV
4041
  char *posDb = strstr(src, TS_PATH_DELIMITER);
×
4042
  if (posDb != NULL) ++posDb;
×
4043
  if (posDb == NULL) return src;
×
4044

4045
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
×
UNCOV
4046
  if (posStb != NULL) ++posStb;
×
4047
  if (posStb == NULL) return posDb;
×
4048
  return posStb;
×
4049
}
4050

UNCOV
4051
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
4052
  // impl
4053
  return TSDB_CODE_SUCCESS;
×
4054
}
4055

4056
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
4057
                        int32_t len) {
4058
  // impl later
4059
  int32_t code = 0;
4060
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
4061
  if (pTrans == NULL) goto _OVER;
4062

4063
  mInfo("trans:%d, used to add index to stb:%s", pTrans->id, pStb->name);
4064
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
4065
  if (mndTransCheckConflict(pMnode, pTrans) != 0) goto _OVER;
4066

4067
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
4068
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
4069
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
4070
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
4071

4072
  return code;
4073

4074
_OVER:
4075
  mndTransDrop(pTrans);
4076
  return code;
4077
}
4078
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
4079
  bool    needRsp = true;
4080
  int32_t code = -1;
4081
  SField *pField0 = NULL;
4082

4083
  SStbObj  stbObj = {0};
4084
  SStbObj *pNew = &stbObj;
4085

4086
  taosRLockLatch(&pOld->lock);
4087
  memcpy(&stbObj, pOld, sizeof(SStbObj));
4088
  taosRUnLockLatch(&pOld->lock);
4089

4090
  stbObj.pColumns = NULL;
4091
  stbObj.pTags = NULL;
4092
  stbObj.updateTime = taosGetTimestampMs();
4093
  stbObj.lock = 0;
4094

4095
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
4096
  if (tag < 0) {
4097
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
4098
    return -1;
4099
  }
4100
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
4101
    return -1;
4102
  }
4103

4104
  SSchema *pTag = pNew->pTags + tag;
4105
  if (IS_IDX_ON(pTag)) {
4106
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
4107
    return -1;
4108
  } else {
4109
    pTag->flags |= COL_IDX_ON;
4110
  }
4111
  pNew->tagVer++;
4112

4113
  code = mndAddIndexImpl(pMnode, pReq, pDb, pNew, needRsp, pReq->pCont, pReq->contLen);
4114

4115
  return code;
4116
}
4117
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
4118
  SMnode            *pMnode = pReq->info.node;
4119
  int32_t            code = -1;
4120
  SDbObj            *pDb = NULL;
4121
  SStbObj           *pStb = NULL;
4122
  SCreateTagIndexReq tagIdxReq = {0};
4123

4124
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
4125
    terrno = TSDB_CODE_INVALID_MSG;
4126
    goto _OVER;
4127
  }
4128

4129
  mInfo("stb:%s, start to alter", tagIdxReq.stbName);
4130

4131
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
4132
    goto _OVER;
4133
  }
4134

4135
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
4136
  if (pDb == NULL) {
4137
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
4138
    goto _OVER;
4139
  }
4140

4141
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
4142
  if (pStb == NULL) {
4143
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
4144
    goto _OVER;
4145
  }
4146
  if (mndCheckDbPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_WRITE_DB, pDb) != 0) {
4147
    goto _OVER;
4148
  }
4149

4150
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
4151
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
4152
    return terrno;
4153
  } else {
4154
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
4155
  }
4156
_OVER:
4157
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
4158
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
4159
  }
4160
  mndReleaseStb(pMnode, pStb);
4161
  mndReleaseDb(pMnode, pDb);
4162
  return code;
4163
}
4164
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
4165
  SMnode          *pMnode = pReq->info.node;
4166
  int32_t          code = -1;
4167
  SDbObj          *pDb = NULL;
4168
  SStbObj         *pStb = NULL;
4169
  SDropTagIndexReq dropReq = {0};
4170
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
4171
    terrno = TSDB_CODE_INVALID_MSG;
4172
    goto _OVER;
4173
  }
4174
  //
4175
  return TSDB_CODE_SUCCESS;
4176
_OVER:
4177
  return code;
4178
}*/
4179

4180
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
2,524✔
4181
  int32_t code = mndProcessDropStbReq(pReq);
2,524✔
4182
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,524✔
UNCOV
4183
    pReq->info.rsp = rpcMallocCont(1);
×
UNCOV
4184
    pReq->info.rspLen = 1;
×
4185
    pReq->info.noResp = false;
×
4186
    pReq->code = code;
×
4187
  }
4188
  return code;
2,524✔
4189
}
4190

4191
typedef struct SVDropTbVgReqs {
4192
  SArray     *pBatchReqs;
4193
  SVgroupInfo info;
4194
} SVDropTbVgReqs;
4195

4196
typedef struct SMDropTbDbInfo {
4197
  SArray *dbVgInfos;
4198
  int32_t hashPrefix;
4199
  int32_t hashSuffix;
4200
  int32_t hashMethod;
4201
} SMDropTbDbInfo;
4202

4203
typedef struct SMDropTbTsmaInfo {
4204
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
4205
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
4206
  int32_t        suid;
4207
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
4208
} SMDropTbTsmaInfo;
4209

4210
typedef struct SMDropTbTsmaInfos {
4211
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
4212
} SMDropTbTsmaInfos;
4213

4214
typedef struct SMndDropTbsWithTsmaCtx {
4215
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
4216
} SMndDropTbsWithTsmaCtx;
4217

4218
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
4219

4220
static void destroySVDropTbBatchReqs(void *p);
4221
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
12,366✔
4222
  if (!p) return;
12,366✔
4223

4224
  if (p->pVgMap) {
12,366✔
4225
    void *pIter = taosHashIterate(p->pVgMap, NULL);
12,366✔
4226
    while (pIter) {
24,732✔
4227
      SVDropTbVgReqs *pReqs = pIter;
12,366✔
4228
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
12,366✔
4229
      pIter = taosHashIterate(p->pVgMap, pIter);
12,366✔
4230
    }
4231
    taosHashCleanup(p->pVgMap);
12,366✔
4232
  }
4233
  taosMemoryFree(p);
12,366✔
4234
}
4235

4236
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
12,366✔
4237
  int32_t                 code = 0;
12,366✔
4238
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
12,366✔
4239
  if (!pCtx) return terrno;
12,366✔
4240

4241
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
12,366✔
4242
  if (!pCtx->pVgMap) {
12,366✔
UNCOV
4243
    code = terrno;
×
UNCOV
4244
    goto _end;
×
4245
  }
4246

4247
  *ppCtx = pCtx;
12,366✔
4248
_end:
12,366✔
4249
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
12,366✔
4250
  return code;
12,366✔
4251
}
4252

4253
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
35,824✔
4254
                                 int32_t *len) {
4255
  int32_t   contLen = 0;
35,824✔
4256
  int32_t   ret = 0;
35,824✔
4257
  SMsgHead *pHead = NULL;
35,824✔
4258
  SEncoder  encoder = {0};
35,824✔
4259

4260
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
35,824✔
4261
  if (ret < 0) return NULL;
35,824✔
4262

4263
  contLen += sizeof(SMsgHead);
35,824✔
4264
  pHead = taosMemoryMalloc(contLen);
35,824✔
4265
  if (pHead == NULL) {
35,824✔
UNCOV
4266
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
UNCOV
4267
    return NULL;
×
4268
  }
4269

4270
  pHead->contLen = htonl(contLen);
35,824✔
4271
  pHead->vgId = htonl(pVgInfo->vgId);
35,824✔
4272

4273
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
35,824✔
4274

4275
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
35,824✔
4276
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
35,824✔
4277
  tEncoderClear(&encoder);
35,824✔
4278
  if (code != 0) return NULL;
35,824✔
4279

4280
  *len = contLen;
35,824✔
4281
  return pHead;
35,824✔
4282
}
4283

4284
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
35,824✔
4285
                                        int32_t contLen, tmsg_t msgType) {
4286
  STransAction action = {0};
35,824✔
4287
  action.epSet = pVgReqs->info.epSet;
35,824✔
4288
  action.pCont = pCont;
35,824✔
4289
  action.contLen = contLen;
35,824✔
4290
  action.msgType = msgType;
35,824✔
4291
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
35,824✔
4292
  return mndTransAppendRedoAction(pTrans, &action);
35,824✔
4293
}
4294

4295
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
8,956✔
4296
  int32_t code = 0;
8,956✔
4297
  void   *pIter = taosHashIterate(pVgMap, NULL);
8,956✔
4298
  while (pIter) {
17,912✔
4299
    const SVDropTbVgReqs *pVgReqs = pIter;
8,956✔
4300
    int32_t               len = 0;
8,956✔
4301
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
44,780✔
4302
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
35,824✔
4303
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
35,824✔
4304
      if (!p) {
35,824✔
UNCOV
4305
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
4306
        if (terrno != 0) code = terrno;
×
4307
        break;
×
4308
      }
4309
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
35,824✔
UNCOV
4310
        break;
×
4311
      }
4312
    }
4313
    if (TSDB_CODE_SUCCESS != code) {
8,956✔
UNCOV
4314
      taosHashCancelIterate(pVgMap, pIter);
×
UNCOV
4315
      break;
×
4316
    }
4317
    pIter = taosHashIterate(pVgMap, pIter);
8,956✔
4318
  }
4319
  return code;
8,956✔
4320
}
4321

4322
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
12,366✔
4323
  int32_t code = 0;
12,366✔
4324
  SMnode *pMnode = pRsp->info.node;
12,366✔
4325
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
12,366✔
4326
  mndTransSetChangeless(pTrans);
12,366✔
4327
  mndTransSetSerial(pTrans);
12,366✔
4328
  if (pTrans == NULL) {
12,366✔
UNCOV
4329
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
UNCOV
4330
    if (terrno != 0) code = terrno;
×
4331
    goto _OVER;
×
4332
  }
4333

4334
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
12,366✔
4335

4336
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
8,956✔
4337
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
8,956✔
4338

4339
_OVER:
8,956✔
4340
  mndTransDrop(pTrans);
12,366✔
4341
  TAOS_RETURN(code);
12,366✔
4342
}
4343

UNCOV
4344
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
UNCOV
4345
  int32_t      code = -1;
×
4346
  SMnode      *pMnode = pReq->info.node;
×
4347
  SDbObj      *pDb = NULL;
×
4348
  SStbObj     *pStb = NULL;
×
4349
  SMDropTbsReq dropReq = {0};
×
4350
  bool         locked = false;
×
4351
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4352
    code = TSDB_CODE_INVALID_MSG;
×
4353
    goto _OVER;
×
4354
  }
4355

UNCOV
4356
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
UNCOV
4357
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4358
  if (code) goto _OVER;
×
4359
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4360
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4361
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4362
    if (code) goto _OVER;
×
4363
  }
4364
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
UNCOV
4365
  if (code == 0) {
×
4366
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4367
  }
4368
_OVER:
×
UNCOV
4369
  tFreeSMDropTbsReq(&dropReq);
×
4370
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4371
  TAOS_RETURN(code);
×
4372
}
4373

4374
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
50,828✔
4375
  pBatchReq->nReqs = 1;
50,828✔
4376
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
50,828✔
4377
  if (!pBatchReq->pArray) return terrno;
50,828✔
4378
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
101,656✔
UNCOV
4379
    taosArrayDestroy(pBatchReq->pArray);
×
UNCOV
4380
    pBatchReq->pArray = NULL;
×
4381
    return terrno;
×
4382
  }
4383
  return TSDB_CODE_SUCCESS;
50,828✔
4384
}
4385

4386
static void destroySVDropTbBatchReqs(void *p) {
50,828✔
4387
  SVDropTbBatchReq *pReq = p;
50,828✔
4388
  taosArrayDestroy(pReq->pArray);
50,828✔
4389
  pReq->pArray = NULL;
50,828✔
4390
}
50,828✔
4391

4392
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
50,828✔
4393
                            bool ignoreNotExists) {
4394
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
50,828✔
4395

4396
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
50,828✔
4397
  SVDropTbVgReqs  vgReqs = {0};
50,828✔
4398
  if (pVgReqs == NULL) {
50,828✔
4399
    vgReqs.info = *pVgInfo;
12,366✔
4400
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
12,366✔
4401
    if (!vgReqs.pBatchReqs) return terrno;
12,366✔
4402
    SVDropTbBatchReq batchReq = {0};
12,366✔
4403
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
12,366✔
4404
    if (TSDB_CODE_SUCCESS != code) return code;
12,366✔
4405
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
24,732✔
UNCOV
4406
      taosArrayDestroy(batchReq.pArray);
×
UNCOV
4407
      return terrno;
×
4408
    }
4409
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
12,366✔
UNCOV
4410
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
UNCOV
4411
      return terrno;
×
4412
    }
4413
  } else {
4414
    SVDropTbBatchReq batchReq = {0};
38,462✔
4415
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
38,462✔
4416
    if (TSDB_CODE_SUCCESS != code) return code;
38,462✔
4417
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
76,924✔
UNCOV
4418
      taosArrayDestroy(batchReq.pArray);
×
UNCOV
4419
      return terrno;
×
4420
    }
4421
  }
4422
  return 0;
50,828✔
4423
}
4424

4425
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
12,366✔
4426
  int32_t code = 0;
12,366✔
4427

4428
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
12,366✔
4429
  if (!pVgObj) {
12,366✔
UNCOV
4430
    code = 0;
×
UNCOV
4431
    goto _end;
×
4432
  }
4433
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
24,732✔
4434
                        .hashEnd = pVgObj->hashEnd,
12,366✔
4435
                        .numOfTable = pVgObj->numOfTables,
12,366✔
4436
                        .vgId = pVgObj->vgId};
12,366✔
4437
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
12,366✔
4438
  mndReleaseVgroup(pMnode, pVgObj);
12,366✔
4439

4440
  for (int32_t i = 0; i < pTbs->size; ++i) {
63,194✔
4441
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
50,828✔
4442
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
50,828✔
4443
  }
4444
_end:
12,366✔
4445
  return code;
12,366✔
4446
}
4447

4448
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
13,652,997✔
4449
  int32_t                 code = -1;
13,652,997✔
4450
  SDecoder                decoder = {0};
13,652,997✔
4451
  SMnode                 *pMnode = pRsp->info.node;
13,652,997✔
4452
  SVFetchTtlExpiredTbsRsp rsp = {0};
13,652,997✔
4453
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
13,652,997✔
4454
  if (pRsp->code != TSDB_CODE_SUCCESS) {
13,652,997✔
4455
    code = pRsp->code;
122,361✔
4456
    goto _end;
122,361✔
4457
  }
4458
  if (pRsp->contLen == 0) {
13,530,636✔
4459
    code = 0;
13,518,270✔
4460
    goto _end;
13,518,270✔
4461
  }
4462

4463
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
12,366✔
4464
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
12,366✔
4465
  if (code) goto _end;
12,366✔
4466

4467
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
12,366✔
4468
  if (code) goto _end;
12,366✔
4469

4470
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
12,366✔
4471
  if (code) goto _end;
12,366✔
4472
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
12,366✔
4473
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
12,366✔
4474
_end:
13,651,562✔
4475
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
13,652,997✔
4476
  tDecoderClear(&decoder);
13,652,997✔
4477
  tFreeFetchTtlExpiredTbsRsp(&rsp);
13,652,997✔
4478
  TAOS_RETURN(code);
13,652,997✔
4479
}
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