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

taosdata / TDengine / #4488

12 Jul 2025 07:47AM UTC coverage: 62.207% (-0.7%) from 62.948%
#4488

push

travis-ci

web-flow
docs: update stream docs (#31822)

157961 of 324087 branches covered (48.74%)

Branch coverage included in aggregate %.

244465 of 322830 relevant lines covered (75.73%)

6561668.76 hits per line

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

65.8
/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 "mndScheduler.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 "tname.h"
35

36
#define STB_VER_NUMBER   3
37
#define STB_RESERVE_SIZE 56
38

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

61
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq);
62
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq);
63

64
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq);
65
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq);
66
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pReq);
67

68
int32_t mndInitStb(SMnode *pMnode) {
2,467✔
69
  SSdbTable table = {
2,467✔
70
      .sdbType = SDB_STB,
71
      .keyType = SDB_KEY_BINARY,
72
      .encodeFp = (SdbEncodeFp)mndStbActionEncode,
73
      .decodeFp = (SdbDecodeFp)mndStbActionDecode,
74
      .insertFp = (SdbInsertFp)mndStbActionInsert,
75
      .updateFp = (SdbUpdateFp)mndStbActionUpdate,
76
      .deleteFp = (SdbDeleteFp)mndStbActionDelete,
77
  };
78

79
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_STB, mndProcessCreateStbReq);
2,467✔
80
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_STB, mndProcessAlterStbReq);
2,467✔
81
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_STB, mndProcessDropStbReq);
2,467✔
82
  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndTransProcessRsp);
2,467✔
83
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TTL_TABLE_RSP, mndProcessDropTtltbRsp);
2,467✔
84
  mndSetMsgHandle(pMnode, TDMT_VND_TRIM_RSP, mndProcessTrimDbRsp);
2,467✔
85
  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
2,467✔
86
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
2,467✔
87
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
2,467✔
88
  mndSetMsgHandle(pMnode, TDMT_MND_TTL_TIMER, mndProcessTtlTimer);
2,467✔
89
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB_TIMER, mndProcessTrimDbTimer);
2,467✔
90
  mndSetMsgHandle(pMnode, TDMT_VND_S3MIGRATE_RSP, mndProcessS3MigrateDbRsp);
2,467✔
91
  mndSetMsgHandle(pMnode, TDMT_MND_S3MIGRATE_DB_TIMER, mndProcessS3MigrateDbTimer);
2,467✔
92
  mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
2,467✔
93
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP, mndProcessDropStbReqFromMNode);
2,467✔
94
  mndSetMsgHandle(pMnode, TDMT_MND_STB_DROP_RSP, mndTransProcessRsp);
2,467✔
95
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_TB_WITH_TSMA, mndProcessDropTbWithTsma);
2,467✔
96
  mndSetMsgHandle(pMnode, TDMT_VND_FETCH_TTL_EXPIRED_TBS_RSP, mndProcessFetchTtlExpiredTbs);
2,467✔
97
  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TABLE_RSP, mndTransProcessRsp);
2,467✔
98
  //  mndSetMsgHandle(pMnode, TDMT_MND_SYSTABLE_RETRIEVE, mndProcessRetrieveStbReq);
99

100
  // mndSetMsgHandle(pMnode, TDMT_MND_CREATE_INDEX, mndProcessCreateIndexReq);
101
  // mndSetMsgHandle(pMnode, TDMT_MND_DROP_INDEX, mndProcessDropIndexReq);
102
  // mndSetMsgHandle(pMnode, TDMT_VND_CREATE_INDEX_RSP, mndTransProcessRsp);
103
  // mndSetMsgHandle(pMnode, TDMT_VND_DROP_INDEX_RSP, mndTransProcessRsp);
104

105
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
2,467✔
106
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
2,467✔
107

108
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COL, mndRetrieveStbCol);
2,467✔
109
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_COL, mndCancelGetNextStb);
2,467✔
110

111
  return sdbSetTable(pMnode->pSdb, table);
2,467✔
112
}
113

114
void mndCleanupStb(SMnode *pMnode) {}
2,466✔
115

116
SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
35,425✔
117
  int32_t code = 0;
35,425✔
118
  int32_t lino = 0;
35,425✔
119
  bool    hasTypeMod = false;
35,425✔
120
  terrno = TSDB_CODE_OUT_OF_MEMORY;
35,425✔
121

122
  int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + pStb->commentLen +
70,850✔
123
                 pStb->ast1Len + pStb->ast2Len + pStb->numOfColumns * sizeof(SColCmpr) + STB_RESERVE_SIZE +
70,850✔
124
                 taosArrayGetSize(pStb->pFuncs) * TSDB_FUNC_NAME_LEN + sizeof(int32_t) * pStb->numOfColumns;
35,425✔
125
  SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
35,425✔
126
  if (pRaw == NULL) goto _OVER;
35,425!
127

128
  int32_t dataPos = 0;
35,425✔
129
  SDB_SET_BINARY(pRaw, dataPos, pStb->name, TSDB_TABLE_FNAME_LEN, _OVER)
35,425!
130
  SDB_SET_BINARY(pRaw, dataPos, pStb->db, TSDB_DB_FNAME_LEN, _OVER)
35,425!
131
  SDB_SET_INT64(pRaw, dataPos, pStb->createdTime, _OVER)
35,425!
132
  SDB_SET_INT64(pRaw, dataPos, pStb->updateTime, _OVER)
35,425!
133
  SDB_SET_INT64(pRaw, dataPos, pStb->uid, _OVER)
35,425!
134
  SDB_SET_INT64(pRaw, dataPos, pStb->dbUid, _OVER)
35,425!
135
  SDB_SET_INT32(pRaw, dataPos, pStb->tagVer, _OVER)
35,425!
136
  SDB_SET_INT32(pRaw, dataPos, pStb->colVer, _OVER)
35,425!
137
  SDB_SET_INT32(pRaw, dataPos, pStb->smaVer, _OVER)
35,425!
138
  SDB_SET_INT32(pRaw, dataPos, pStb->nextColId, _OVER)
35,425!
139
  SDB_SET_INT64(pRaw, dataPos, pStb->maxdelay[0], _OVER)
35,425!
140
  SDB_SET_INT64(pRaw, dataPos, pStb->maxdelay[1], _OVER)
35,425!
141
  SDB_SET_INT64(pRaw, dataPos, pStb->watermark[0], _OVER)
35,425!
142
  SDB_SET_INT64(pRaw, dataPos, pStb->watermark[1], _OVER)
35,425!
143
  SDB_SET_INT32(pRaw, dataPos, pStb->ttl, _OVER)
35,425!
144
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfColumns, _OVER)
35,425!
145
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfTags, _OVER)
35,425!
146
  SDB_SET_INT32(pRaw, dataPos, pStb->numOfFuncs, _OVER)
35,425!
147
  SDB_SET_INT32(pRaw, dataPos, pStb->commentLen, _OVER)
35,425!
148
  SDB_SET_INT32(pRaw, dataPos, pStb->ast1Len, _OVER)
35,425!
149
  SDB_SET_INT32(pRaw, dataPos, pStb->ast2Len, _OVER)
35,425!
150

151
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
2,778,454✔
152
    SSchema *pSchema = &pStb->pColumns[i];
2,743,029✔
153
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
2,743,029!
154
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
2,743,029!
155
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
2,743,029!
156
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
2,743,029!
157
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
2,743,029!
158
    hasTypeMod = hasTypeMod || HAS_TYPE_MOD(pSchema);
2,743,029✔
159
  }
160

161
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
440,485✔
162
    SSchema *pSchema = &pStb->pTags[i];
405,060✔
163
    SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
405,060!
164
    SDB_SET_INT8(pRaw, dataPos, pSchema->flags, _OVER)
405,060!
165
    SDB_SET_INT16(pRaw, dataPos, pSchema->colId, _OVER)
405,060!
166
    SDB_SET_INT32(pRaw, dataPos, pSchema->bytes, _OVER)
405,060!
167
    SDB_SET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
405,060!
168
  }
169

170
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
35,441✔
171
    char *func = taosArrayGet(pStb->pFuncs, i);
16✔
172
    SDB_SET_BINARY(pRaw, dataPos, func, TSDB_FUNC_NAME_LEN, _OVER)
16!
173
  }
174

175
  if (pStb->commentLen > 0) {
35,425✔
176
    SDB_SET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
232!
177
  }
178

179
  if (pStb->ast1Len > 0) {
35,425✔
180
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
16!
181
  }
182

183
  if (pStb->ast2Len > 0) {
35,425✔
184
    SDB_SET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
16!
185
  }
186

187
  if (pStb->pCmpr != NULL) {
35,425!
188
    for (int i = 0; i < pStb->numOfColumns; i++) {
2,778,454✔
189
      SColCmpr *p = &pStb->pCmpr[i];
2,743,029✔
190
      SDB_SET_INT16(pRaw, dataPos, p->id, _OVER)
2,743,029!
191
      SDB_SET_INT32(pRaw, dataPos, p->alg, _OVER)
2,743,029!
192
    }
193
  }
194
  SDB_SET_INT64(pRaw, dataPos, pStb->keep, _OVER)
35,425!
195

196
  if (hasTypeMod) {
35,425✔
197
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
2,063,850✔
198
      SDB_SET_INT32(pRaw, dataPos, pStb->pExtSchemas[i].typeMod, _OVER);
2,055,519!
199
    }
200
  }
201

202
  SDB_SET_INT8(pRaw, dataPos, pStb->virtualStb, _OVER)
35,425!
203
  SDB_SET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
35,425!
204
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
35,425!
205

206
  terrno = 0;
35,425✔
207

208
_OVER:
35,425✔
209
  if (terrno != 0) {
35,425!
210
    mError("stb:%s, failed to encode to raw:%p since %s", pStb->name, pRaw, terrstr());
×
211
    sdbFreeRaw(pRaw);
×
212
    return NULL;
×
213
  }
214

215
  mTrace("stb:%s, encode to raw:%p, row:%p", pStb->name, pRaw, pStb);
35,425✔
216
  return pRaw;
35,425✔
217
}
218

219
SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
38,573✔
220
  int32_t code = 0;
38,573✔
221
  int32_t lino = 0;
38,573✔
222
  terrno = TSDB_CODE_OUT_OF_MEMORY;
38,573✔
223
  SSdbRow *pRow = NULL;
38,573✔
224
  SStbObj *pStb = NULL;
38,573✔
225
  bool     hasExtSchemas = false;
38,573✔
226

227
  int8_t sver = 0;
38,573✔
228
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
38,573!
229

230
  if (sver > STB_VER_NUMBER) {
38,573!
231
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
232
    goto _OVER;
×
233
  }
234

235
  pRow = sdbAllocRow(sizeof(SStbObj));
38,573✔
236
  if (pRow == NULL) goto _OVER;
38,573!
237

238
  pStb = sdbGetRowObj(pRow);
38,573✔
239
  if (pStb == NULL) goto _OVER;
38,573!
240

241
  int32_t dataPos = 0;
38,573✔
242
  SDB_GET_BINARY(pRaw, dataPos, pStb->name, TSDB_TABLE_FNAME_LEN, _OVER)
38,573!
243
  SDB_GET_BINARY(pRaw, dataPos, pStb->db, TSDB_DB_FNAME_LEN, _OVER)
38,573!
244
  SDB_GET_INT64(pRaw, dataPos, &pStb->createdTime, _OVER)
38,573!
245
  SDB_GET_INT64(pRaw, dataPos, &pStb->updateTime, _OVER)
38,573!
246
  SDB_GET_INT64(pRaw, dataPos, &pStb->uid, _OVER)
38,573!
247
  SDB_GET_INT64(pRaw, dataPos, &pStb->dbUid, _OVER)
38,573!
248
  SDB_GET_INT32(pRaw, dataPos, &pStb->tagVer, _OVER)
38,573!
249
  SDB_GET_INT32(pRaw, dataPos, &pStb->colVer, _OVER)
38,573!
250
  SDB_GET_INT32(pRaw, dataPos, &pStb->smaVer, _OVER)
38,573!
251
  SDB_GET_INT32(pRaw, dataPos, &pStb->nextColId, _OVER)
38,573!
252
  SDB_GET_INT64(pRaw, dataPos, &pStb->maxdelay[0], _OVER)
38,573!
253
  SDB_GET_INT64(pRaw, dataPos, &pStb->maxdelay[1], _OVER)
38,573!
254
  SDB_GET_INT64(pRaw, dataPos, &pStb->watermark[0], _OVER)
38,573!
255
  SDB_GET_INT64(pRaw, dataPos, &pStb->watermark[1], _OVER)
38,573!
256
  SDB_GET_INT32(pRaw, dataPos, &pStb->ttl, _OVER)
38,573!
257
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfColumns, _OVER)
38,573!
258
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfTags, _OVER)
38,573!
259
  SDB_GET_INT32(pRaw, dataPos, &pStb->numOfFuncs, _OVER)
38,573!
260
  SDB_GET_INT32(pRaw, dataPos, &pStb->commentLen, _OVER)
38,573!
261
  SDB_GET_INT32(pRaw, dataPos, &pStb->ast1Len, _OVER)
38,573!
262
  SDB_GET_INT32(pRaw, dataPos, &pStb->ast2Len, _OVER)
38,573!
263

264
  pStb->pColumns = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchema));
38,573!
265
  pStb->pTags = taosMemoryCalloc(pStb->numOfTags, sizeof(SSchema));
38,573!
266
  pStb->pFuncs = taosArrayInit(pStb->numOfFuncs, TSDB_FUNC_NAME_LEN);
38,573✔
267
  if (pStb->pColumns == NULL || pStb->pTags == NULL || pStb->pFuncs == NULL) {
38,573!
268
    goto _OVER;
×
269
  }
270

271
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
5,674,478✔
272
    SSchema *pSchema = &pStb->pColumns[i];
5,635,905✔
273
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
5,635,905!
274
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
5,635,905!
275
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
5,635,905!
276
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
5,635,905!
277
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
5,635,905!
278
    hasExtSchemas = hasExtSchemas || HAS_TYPE_MOD(pSchema);
5,635,905✔
279
  }
280

281
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
843,239✔
282
    SSchema *pSchema = &pStb->pTags[i];
804,666✔
283
    SDB_GET_INT8(pRaw, dataPos, &pSchema->type, _OVER)
804,666!
284
    SDB_GET_INT8(pRaw, dataPos, &pSchema->flags, _OVER)
804,666!
285
    SDB_GET_INT16(pRaw, dataPos, &pSchema->colId, _OVER)
804,666!
286
    SDB_GET_INT32(pRaw, dataPos, &pSchema->bytes, _OVER)
804,666!
287
    SDB_GET_BINARY(pRaw, dataPos, pSchema->name, TSDB_COL_NAME_LEN, _OVER)
804,666!
288
  }
289

290
  for (int32_t i = 0; i < pStb->numOfFuncs; ++i) {
38,585✔
291
    char funcName[TSDB_FUNC_NAME_LEN] = {0};
12✔
292
    SDB_GET_BINARY(pRaw, dataPos, funcName, TSDB_FUNC_NAME_LEN, _OVER)
12!
293
    if (taosArrayPush(pStb->pFuncs, funcName) == NULL) goto _OVER;
24!
294
  }
295

296
  if (pStb->commentLen > 0) {
38,573✔
297
    pStb->comment = taosMemoryCalloc(pStb->commentLen + 1, 1);
203!
298
    if (pStb->comment == NULL) goto _OVER;
203!
299
    SDB_GET_BINARY(pRaw, dataPos, pStb->comment, pStb->commentLen + 1, _OVER)
203!
300
  }
301

302
  if (pStb->ast1Len > 0) {
38,573✔
303
    pStb->pAst1 = taosMemoryCalloc(pStb->ast1Len, 1);
12!
304
    if (pStb->pAst1 == NULL) goto _OVER;
12!
305
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst1, pStb->ast1Len, _OVER)
12!
306
  }
307

308
  if (pStb->ast2Len > 0) {
38,573✔
309
    pStb->pAst2 = taosMemoryCalloc(pStb->ast2Len, 1);
12!
310
    if (pStb->pAst2 == NULL) goto _OVER;
12!
311
    SDB_GET_BINARY(pRaw, dataPos, pStb->pAst2, pStb->ast2Len, _OVER)
12!
312
  }
313

314
  pStb->pCmpr = taosMemoryCalloc(pStb->numOfColumns, sizeof(SColCmpr));
38,573!
315
  if (sver < STB_VER_NUMBER - 1) {
38,573!
316
    // compatible with old data, setup default compress value
317
    // impl later
318
    for (int i = 0; i < pStb->numOfColumns; i++) {
×
319
      SSchema  *pSchema = &pStb->pColumns[i];
×
320
      SColCmpr *pCmpr = &pStb->pCmpr[i];
×
321
      pCmpr->id = pSchema->colId;
×
322
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
×
323
    }
324
  } else {
325
    for (int i = 0; i < pStb->numOfColumns; i++) {
5,674,478✔
326
      SColCmpr *pCmpr = &pStb->pCmpr[i];
5,635,905✔
327
      SDB_GET_INT16(pRaw, dataPos, &pCmpr->id, _OVER)
5,635,905!
328
      SDB_GET_INT32(pRaw, dataPos, (int32_t *)&pCmpr->alg, _OVER)  // compatiable
5,635,905!
329
    }
330
  }
331
  SDB_GET_INT64(pRaw, dataPos, &pStb->keep, _OVER)
38,573!
332

333
  // type mod
334
  if (hasExtSchemas) {
38,573✔
335
    pStb->pExtSchemas = taosMemoryCalloc(pStb->numOfColumns, sizeof(SExtSchema));
18,977!
336
    if (!pStb->pExtSchemas) goto _OVER;
18,977!
337
    for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
5,151,026✔
338
      SSchema *pSchema = &pStb->pColumns[i];
5,132,049✔
339
      SDB_GET_INT32(pRaw, dataPos, &pStb->pExtSchemas[i].typeMod, _OVER)
5,132,049!
340
    }
341
  }
342

343
  if (sver < STB_VER_NUMBER) {
38,573!
344
    pStb->virtualStb = 0;
×
345
  } else {
346
    SDB_GET_INT8(pRaw, dataPos, &pStb->virtualStb, _OVER)
38,573!
347
  }
348

349
  SDB_GET_RESERVE(pRaw, dataPos, STB_RESERVE_SIZE, _OVER)
38,573!
350

351
  terrno = 0;
38,573✔
352

353
_OVER:
38,573✔
354
  if (terrno != 0) {
38,573!
355
    mError("stb:%s, failed to decode from raw:%p since %s", pStb == NULL ? "null" : pStb->name, pRaw, terrstr());
×
356
    if (pStb != NULL) {
×
357
      taosMemoryFreeClear(pStb->pColumns);
×
358
      taosMemoryFreeClear(pStb->pTags);
×
359
      taosMemoryFreeClear(pStb->comment);
×
360
      taosMemoryFree(pStb->pCmpr);
×
361
      taosMemoryFreeClear(pStb->pExtSchemas);
×
362
    }
363
    taosMemoryFreeClear(pRow);
×
364
    return NULL;
×
365
  }
366

367
  mTrace("stb:%s, decode from raw:%p, row:%p", pStb->name, pRaw, pStb);
38,573✔
368
  return pRow;
38,573✔
369
}
370

371
void mndFreeStb(SStbObj *pStb) {
46,920✔
372
  taosArrayDestroy(pStb->pFuncs);
46,920✔
373
  taosMemoryFreeClear(pStb->pColumns);
46,920!
374
  taosMemoryFreeClear(pStb->pTags);
46,920!
375
  taosMemoryFreeClear(pStb->comment);
46,920!
376
  taosMemoryFreeClear(pStb->pAst1);
46,920!
377
  taosMemoryFreeClear(pStb->pAst2);
46,920!
378
  taosMemoryFreeClear(pStb->pCmpr);
46,920!
379
  taosMemoryFreeClear(pStb->pExtSchemas);
46,920!
380
}
46,920✔
381

382
static int32_t mndStbActionInsert(SSdb *pSdb, SStbObj *pStb) {
11,989✔
383
  mTrace("stb:%s, perform insert action, row:%p", pStb->name, pStb);
11,989✔
384
  return 0;
11,989✔
385
}
386

387
static int32_t mndStbActionDelete(SSdb *pSdb, SStbObj *pStb) {
45,946✔
388
  mTrace("stb:%s, perform delete action, row:%p", pStb->name, pStb);
45,946✔
389
  mndFreeStb(pStb);
45,946✔
390
  return 0;
45,946✔
391
}
392

393
static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
23,063✔
394
  terrno = 0;
23,063✔
395
  mTrace("stb:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
23,063✔
396

397
  taosWLockLatch(&pOld->lock);
23,063✔
398
  int32_t numOfColumns = pOld->numOfColumns;
23,063✔
399
  if (pOld->numOfColumns < pNew->numOfColumns) {
23,063✔
400
    void *pColumns = taosMemoryMalloc(pNew->numOfColumns * sizeof(SSchema));
4,041!
401
    if (pColumns == NULL) {
4,041!
402
      goto END;
×
403
    }
404
    taosMemoryFree(pOld->pColumns);
4,041!
405
    pOld->pColumns = pColumns;
4,041✔
406
  }
407

408
  if (pOld->numOfTags < pNew->numOfTags) {
23,063✔
409
    void *pTags = taosMemoryMalloc(pNew->numOfTags * sizeof(SSchema));
1,267!
410
    if (pTags == NULL) {
1,267!
411
      goto END;
×
412
    }
413
    taosMemoryFree(pOld->pTags);
1,267!
414
    pOld->pTags = pTags;
1,267✔
415
  }
416

417
  if (pOld->commentLen < pNew->commentLen && pNew->commentLen > 0) {
23,063✔
418
    void *comment = taosMemoryMalloc(pNew->commentLen + 1);
23!
419
    if (comment == NULL) {
23!
420
      goto END;
×
421
    }
422
    taosMemoryFree(pOld->comment);
23!
423
    pOld->comment = comment;
23✔
424
  }
425
  pOld->commentLen = pNew->commentLen;
23,063✔
426

427
  if (pOld->ast1Len < pNew->ast1Len) {
23,063!
428
    void *pAst1 = taosMemoryMalloc(pNew->ast1Len + 1);
×
429
    if (pAst1 == NULL) {
×
430
      goto END;
×
431
    }
432
    taosMemoryFree(pOld->pAst1);
×
433
    pOld->pAst1 = pAst1;
×
434
  }
435

436
  if (pOld->ast2Len < pNew->ast2Len) {
23,063!
437
    void *pAst2 = taosMemoryMalloc(pNew->ast2Len + 1);
×
438
    if (pAst2 == NULL) {
×
439
      goto END;
×
440
    }
441
    taosMemoryFree(pOld->pAst2);
×
442
    pOld->pAst2 = pAst2;
×
443
  }
444

445
  pOld->updateTime = pNew->updateTime;
23,063✔
446
  pOld->tagVer = pNew->tagVer;
23,063✔
447
  pOld->colVer = pNew->colVer;
23,063✔
448
  pOld->smaVer = pNew->smaVer;
23,063✔
449
  pOld->nextColId = pNew->nextColId;
23,063✔
450
  pOld->ttl = pNew->ttl;
23,063✔
451
  pOld->keep = pNew->keep;
23,063✔
452
  
453
  if (pNew->numOfColumns > 0) {
23,063!
454
    pOld->numOfColumns = pNew->numOfColumns;
23,063✔
455
    memcpy(pOld->pColumns, pNew->pColumns, pOld->numOfColumns * sizeof(SSchema));
23,063✔
456
  }
457
  if (pNew->numOfTags > 0) {
23,063!
458
    pOld->numOfTags = pNew->numOfTags;
23,063✔
459
    memcpy(pOld->pTags, pNew->pTags, pOld->numOfTags * sizeof(SSchema));
23,063✔
460
  }
461
  if (pNew->commentLen > 0) {
23,063✔
462
    memcpy(pOld->comment, pNew->comment, pNew->commentLen + 1);
165✔
463
    pOld->commentLen = pNew->commentLen;
165✔
464
  }
465
  if (pNew->ast1Len != 0) {
23,063!
466
    memcpy(pOld->pAst1, pNew->pAst1, pNew->ast1Len);
×
467
    pOld->ast1Len = pNew->ast1Len;
×
468
  }
469
  if (pNew->ast2Len != 0) {
23,063!
470
    memcpy(pOld->pAst2, pNew->pAst2, pNew->ast2Len);
×
471
    pOld->ast2Len = pNew->ast2Len;
×
472
  }
473
  if (numOfColumns < pNew->numOfColumns) {
23,063✔
474
    taosMemoryFree(pOld->pCmpr);
4,041!
475
    pOld->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
4,041!
476
    if (pOld->pCmpr == NULL){
4,041!
477
      goto END;
×
478
    }
479
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
4,041✔
480
  } else {
481
    memcpy(pOld->pCmpr, pNew->pCmpr, pNew->numOfColumns * sizeof(SColCmpr));
19,022✔
482
  }
483

484
  if (pNew->pExtSchemas) {
23,063✔
485
    taosMemoryFreeClear(pOld->pExtSchemas);
18,864!
486
    pOld->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
18,864!
487
    if (pOld->pExtSchemas == NULL){
18,864!
488
      goto END;
×
489
    }
490
    memcpy(pOld->pExtSchemas, pNew->pExtSchemas, pNew->numOfColumns * sizeof(SExtSchema));
18,864✔
491
  }
492

493
END:
4,199✔
494
  taosWUnLockLatch(&pOld->lock);
23,063✔
495
  return terrno;
23,063✔
496
}
497

498
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
73,304✔
499
  SSdb    *pSdb = pMnode->pSdb;
73,304✔
500
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
73,304✔
501
  if (pStb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
73,303!
502
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
11,035✔
503
  }
504
  return pStb;
73,303✔
505
}
506

507
void mndReleaseStb(SMnode *pMnode, SStbObj *pStb) {
71,291✔
508
  SSdb *pSdb = pMnode->pSdb;
71,291✔
509
  sdbRelease(pSdb, pStb);
71,291✔
510
}
71,291✔
511

512
SDbObj *mndAcquireDbByStb(SMnode *pMnode, const char *stbName) {
17,441✔
513
  SName name = {0};
17,441✔
514
  if ((terrno = tNameFromString(&name, stbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) return NULL;
17,441!
515

516
  char db[TSDB_TABLE_FNAME_LEN] = {0};
17,441✔
517
  if ((terrno = tNameGetFullDbName(&name, db)) != 0) return NULL;
17,441!
518

519
  return mndAcquireDb(pMnode, db);
17,441✔
520
}
521

522
static FORCE_INLINE int32_t schemaExColIdCompare(const void *colId, const void *pSchema) {
523
  if (*(col_id_t *)colId < ((SSchema *)pSchema)->colId) {
524
    return -1;
525
  } else if (*(col_id_t *)colId > ((SSchema *)pSchema)->colId) {
526
    return 1;
527
  }
528
  return 0;
529
}
530

531
void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen, void *alterOriData,
31,981✔
532
                            int32_t alterOriDataLen) {
533
  SEncoder       encoder = {0};
31,981✔
534
  int32_t        contLen;
535
  SName          name = {0};
31,981✔
536
  SVCreateStbReq req = {0};
31,981✔
537

538
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
31,981!
539
    goto _err;
×
540
  }
541
  char dbFName[TSDB_DB_FNAME_LEN] = {0};
31,981✔
542
  if ((terrno = tNameGetFullDbName(&name, dbFName)) != 0) {
31,981!
543
    goto _err;
×
544
  };
545

546
  req.name = (char *)tNameGetTableName(&name);
31,981✔
547
  req.suid = pStb->uid;
31,981✔
548
  req.rollup = pStb->ast1Len > 0 ? 1 : 0;
31,981✔
549
  req.alterOriData = alterOriData;
31,981✔
550
  req.alterOriDataLen = alterOriDataLen;
31,981✔
551
  req.source = pStb->source;
31,981✔
552
  req.virtualStb = pStb->virtualStb;
31,981✔
553
  // todo
554
  req.schemaRow.nCols = pStb->numOfColumns;
31,981✔
555
  req.schemaRow.version = pStb->colVer;
31,981✔
556
  req.schemaRow.pSchema = pStb->pColumns;
31,981✔
557
  req.schemaTag.nCols = pStb->numOfTags;
31,981✔
558
  req.schemaTag.version = pStb->tagVer;
31,981✔
559
  req.schemaTag.pSchema = pStb->pTags;
31,981✔
560

561
  req.colCmpred = 1;
31,981✔
562
  SColCmprWrapper *pCmpr = &req.colCmpr;
31,981✔
563
  req.keep = pStb->keep;
31,981✔
564
  pCmpr->version = pStb->colVer;
31,981✔
565
  pCmpr->nCols = pStb->numOfColumns;
31,981✔
566

567
  req.colCmpr.pColCmpr = taosMemoryCalloc(pCmpr->nCols, sizeof(SColCmpr));
31,981!
568
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
2,674,612✔
569
    SColCmpr *p = &pCmpr->pColCmpr[i];
2,642,631✔
570
    p->alg = pStb->pCmpr[i].alg;
2,642,631✔
571
    p->id = pStb->pCmpr[i].id;
2,642,631✔
572
  }
573

574
  if (req.rollup) {
31,981✔
575
    req.rsmaParam.maxdelay[0] = pStb->maxdelay[0];
5✔
576
    req.rsmaParam.maxdelay[1] = pStb->maxdelay[1];
5✔
577
    req.rsmaParam.watermark[0] = pStb->watermark[0];
5✔
578
    req.rsmaParam.watermark[1] = pStb->watermark[1];
5✔
579
    if (pStb->ast1Len > 0) {
5!
580
      if (mndConvertRsmaTask(&req.rsmaParam.qmsg[0], &req.rsmaParam.qmsgLen[0], pStb->pAst1, pStb->uid,
5!
581
                             STREAM_TRIGGER_WINDOW_CLOSE, req.rsmaParam.watermark[0],
582
                             req.rsmaParam.deleteMark[0]) < 0) {
583
        goto _err;
×
584
      }
585
    }
586
    if (pStb->ast2Len > 0) {
5!
587
      if (mndConvertRsmaTask(&req.rsmaParam.qmsg[1], &req.rsmaParam.qmsgLen[1], pStb->pAst2, pStb->uid,
5!
588
                             STREAM_TRIGGER_WINDOW_CLOSE, req.rsmaParam.watermark[1],
589
                             req.rsmaParam.deleteMark[1]) < 0) {
590
        goto _err;
×
591
      }
592
    }
593
  }
594
  req.pExtSchemas = pStb->pExtSchemas; // only reference to it.
31,981✔
595
  // get length
596
  int32_t ret = 0;
31,981✔
597
  tEncodeSize(tEncodeSVCreateStbReq, &req, contLen, ret);
31,981!
598
  if (ret < 0) {
31,981!
599
    goto _err;
×
600
  }
601

602
  contLen += sizeof(SMsgHead);
31,981✔
603

604
  SMsgHead *pHead = taosMemoryCalloc(1, contLen);
31,981!
605
  if (pHead == NULL) {
31,981!
606
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
607
    goto _err;
×
608
  }
609

610
  pHead->contLen = htonl(contLen);
31,981✔
611
  pHead->vgId = htonl(pVgroup->vgId);
31,981✔
612

613
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
31,981✔
614
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
31,981✔
615
  if (tEncodeSVCreateStbReq(&encoder, &req) < 0) {
31,981!
616
    taosMemoryFreeClear(pHead);
×
617
    tEncoderClear(&encoder);
×
618
    goto _err;
×
619
  }
620
  tEncoderClear(&encoder);
31,981✔
621

622
  *pContLen = contLen;
31,981✔
623
  taosMemoryFreeClear(req.rsmaParam.qmsg[0]);
31,981!
624
  taosMemoryFreeClear(req.rsmaParam.qmsg[1]);
31,981!
625
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
31,981!
626
  return pHead;
31,981✔
627
_err:
×
628
  taosMemoryFreeClear(req.rsmaParam.qmsg[0]);
×
629
  taosMemoryFreeClear(req.rsmaParam.qmsg[1]);
×
630
  taosMemoryFreeClear(req.colCmpr.pColCmpr);
×
631
  return NULL;
×
632
}
633

634
static void *mndBuildVDropStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int32_t *pContLen) {
22,358✔
635
  SName        name = {0};
22,358✔
636
  SVDropStbReq req = {0};
22,358✔
637
  int32_t      contLen = 0;
22,358✔
638
  int32_t      ret = 0;
22,358✔
639
  SMsgHead    *pHead = NULL;
22,358✔
640
  SEncoder     encoder = {0};
22,358✔
641

642
  if ((terrno = tNameFromString(&name, pStb->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
22,358!
643
    return NULL;
×
644
  }
645

646
  req.name = (char *)tNameGetTableName(&name);
22,358✔
647
  req.suid = pStb->uid;
22,358✔
648

649
  tEncodeSize(tEncodeSVDropStbReq, &req, contLen, ret);
22,358!
650
  if (ret < 0) return NULL;
22,358!
651

652
  contLen += sizeof(SMsgHead);
22,358✔
653
  pHead = taosMemoryMalloc(contLen);
22,358!
654
  if (pHead == NULL) {
22,358!
655
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
656
    return NULL;
×
657
  }
658

659
  pHead->contLen = htonl(contLen);
22,358✔
660
  pHead->vgId = htonl(pVgroup->vgId);
22,358✔
661

662
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
22,358✔
663

664
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
22,358✔
665
  int32_t code = tEncodeSVDropStbReq(&encoder, &req);
22,358✔
666
  tEncoderClear(&encoder);
22,358✔
667
  if (code != 0) {
22,358!
668
    terrno = code;
×
669
    return NULL;
×
670
  }
671

672
  *pContLen = contLen;
22,358✔
673
  return pHead;
22,358✔
674
}
675

676
int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) {
8,486✔
677
  int32_t code = 0;
8,486✔
678
  if (pCreate->igExists < 0 || pCreate->igExists > 1) {
8,486!
679
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
680
    TAOS_RETURN(code);
×
681
  }
682

683
  if (pCreate->virtualStb != 0 && pCreate->virtualStb != 1) {
8,486!
684
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
685
    TAOS_RETURN(code);
×
686
  }
687

688
  if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > TSDB_MAX_COLUMNS) {
8,486!
689
    code = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
×
690
    TAOS_RETURN(code);
×
691
  }
692

693
  if (pCreate->numOfTags <= 0 || pCreate->numOfTags > TSDB_MAX_TAGS) {
8,486!
694
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
695
    TAOS_RETURN(code);
×
696
  }
697

698
  SField *pField = taosArrayGet(pCreate->pColumns, 0);
8,486✔
699
  if (pField->type != TSDB_DATA_TYPE_TIMESTAMP) {
8,486!
700
    code = TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
701
    TAOS_RETURN(code);
×
702
  }
703

704
  for (int32_t i = 0; i < pCreate->numOfColumns; ++i) {
259,239✔
705
    SFieldWithOptions *pField1 = taosArrayGet(pCreate->pColumns, i);
250,753✔
706
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
250,753!
707
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
708
      TAOS_RETURN(code);
×
709
    }
710
    if (pField1->bytes <= 0) {
250,753!
711
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
712
      TAOS_RETURN(code);
×
713
    }
714
    if (pField1->name[0] == 0) {
250,753!
715
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
716
      TAOS_RETURN(code);
×
717
    }
718
  }
719

720
  for (int32_t i = 0; i < pCreate->numOfTags; ++i) {
50,851✔
721
    SField *pField1 = taosArrayGet(pCreate->pTags, i);
42,365✔
722
    if (pField1->type >= TSDB_DATA_TYPE_MAX) {
42,365!
723
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
724
      TAOS_RETURN(code);
×
725
    }
726
    if (pField1->bytes <= 0) {
42,365!
727
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
728
      TAOS_RETURN(code);
×
729
    }
730
    if (pField1->name[0] == 0) {
42,365!
731
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
732
      TAOS_RETURN(code);
×
733
    }
734
  }
735

736
  TAOS_RETURN(code);
8,486✔
737
}
738

739
static int32_t mndSetCreateStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
×
740
  int32_t  code = 0;
×
741
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
×
742
  if (pRedoRaw == NULL) {
×
743
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
744
    if (terrno != 0) code = terrno;
×
745
    TAOS_RETURN(code);
×
746
  }
747
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
×
748
    sdbFreeRaw(pRedoRaw);
×
749
    TAOS_RETURN(code);
×
750
  }
751
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING));
×
752

753
  TAOS_RETURN(code);
×
754
}
755

756
int32_t mndSetCreateStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
8,325✔
757
  int32_t  code = 0;
8,325✔
758
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
8,325✔
759
  if (pCommitRaw == NULL) {
8,325!
760
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
761
    if (terrno != 0) code = terrno;
×
762
    TAOS_RETURN(code);
×
763
  }
764
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
8,325!
765
    sdbFreeRaw(pCommitRaw);
×
766
    TAOS_RETURN(code);
×
767
  }
768
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
8,325!
769

770
  TAOS_RETURN(code);
8,325✔
771
}
772

773
static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
8,325✔
774
  int32_t code = 0;
8,325✔
775
  SSdb   *pSdb = pMnode->pSdb;
8,325✔
776
  SVgObj *pVgroup = NULL;
8,325✔
777
  void   *pIter = NULL;
8,325✔
778
  int32_t contLen;
779

780
  while (1) {
43,855✔
781
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
52,180✔
782
    if (pIter == NULL) break;
52,180✔
783
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
43,855✔
784
      sdbRelease(pSdb, pVgroup);
23,349✔
785
      continue;
23,349✔
786
    }
787

788
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
20,506✔
789
    if (pReq == NULL) {
20,506!
790
      sdbCancelFetch(pSdb, pIter);
×
791
      sdbRelease(pSdb, pVgroup);
×
792
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
793
      if (terrno != 0) code = terrno;
×
794
      TAOS_RETURN(code);
×
795
    }
796

797
    STransAction action = {0};
20,506✔
798
    action.mTraceId = pTrans->mTraceId;
20,506✔
799
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
20,506✔
800
    action.pCont = pReq;
20,506✔
801
    action.contLen = contLen;
20,506✔
802
    action.msgType = TDMT_VND_CREATE_STB;
20,506✔
803
    action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
20,506✔
804
    action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
20,506✔
805
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
20,506!
806
      taosMemoryFree(pReq);
×
807
      sdbCancelFetch(pSdb, pIter);
×
808
      sdbRelease(pSdb, pVgroup);
×
809
      TAOS_RETURN(code);
×
810
    }
811
    sdbRelease(pSdb, pVgroup);
20,506✔
812
  }
813

814
  TAOS_RETURN(code);
8,325✔
815
}
816

817
int32_t mndSetForceDropCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SStbObj *pStb) {
4✔
818
  int32_t code = 0;
4✔
819
  SSdb   *pSdb = pMnode->pSdb;
4✔
820
  int32_t contLen;
821

822
  void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, NULL, 0);
4✔
823
  if (pReq == NULL) {
4!
824
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
825
    if (terrno != 0) code = terrno;
×
826
    TAOS_RETURN(code);
×
827
  }
828

829
  STransAction action = {0};
4✔
830
  action.mTraceId = pTrans->mTraceId;
4✔
831
  action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
4✔
832
  action.pCont = pReq;
4✔
833
  action.contLen = contLen;
4✔
834
  action.msgType = TDMT_VND_CREATE_STB;
4✔
835
  action.acceptableCode = TSDB_CODE_TDB_STB_ALREADY_EXIST;
4✔
836
  action.retryCode = TSDB_CODE_TDB_STB_NOT_EXIST;
4✔
837
  action.groupId = pVgroup->vgId;
4✔
838
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
4!
839
    taosMemoryFree(pReq);
×
840
    TAOS_RETURN(code);
×
841
  }
842

843
  TAOS_RETURN(code);
4✔
844
}
845

846
static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
8,325✔
847
  int32_t code = 0;
8,325✔
848
  SSdb   *pSdb = pMnode->pSdb;
8,325✔
849
  SVgObj *pVgroup = NULL;
8,325✔
850
  void   *pIter = NULL;
8,325✔
851

852
  while (1) {
43,855✔
853
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
52,180✔
854
    if (pIter == NULL) break;
52,180✔
855
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
43,855✔
856
      sdbRelease(pSdb, pVgroup);
23,349✔
857
      continue;
23,349✔
858
    }
859

860
    int32_t contLen = 0;
20,506✔
861
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
20,506✔
862
    if (pReq == NULL) {
20,506!
863
      sdbCancelFetch(pSdb, pIter);
×
864
      sdbRelease(pSdb, pVgroup);
×
865
      code = TSDB_CODE_OUT_OF_MEMORY;
×
866
      TAOS_RETURN(code);
×
867
    }
868

869
    STransAction action = {0};
20,506✔
870
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
20,506✔
871
    action.pCont = pReq;
20,506✔
872
    action.contLen = contLen;
20,506✔
873
    action.msgType = TDMT_VND_DROP_STB;
20,506✔
874
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
20,506✔
875
    if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
20,506!
876
      taosMemoryFree(pReq);
×
877
      sdbCancelFetch(pSdb, pIter);
×
878
      sdbRelease(pSdb, pVgroup);
×
879
      TAOS_RETURN(code);
×
880
    }
881
    sdbRelease(pSdb, pVgroup);
20,506✔
882
  }
883

884
  TAOS_RETURN(code);
8,325✔
885
}
886

887
static SSchema *mndFindStbColumns(const SStbObj *pStb, const char *colName) {
×
888
  for (int32_t col = 0; col < pStb->numOfColumns; ++col) {
×
889
    SSchema *pSchema = &pStb->pColumns[col];
×
890
    if (taosStrncasecmp(pSchema->name, colName, TSDB_COL_NAME_LEN) == 0) {
×
891
      return pSchema;
×
892
    }
893
  }
894
  return NULL;
×
895
}
896

897
int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreate, SDbObj *pDb) {
8,347✔
898
  int32_t code = 0;
8,347✔
899
  bool    hasTypeMods = false;
8,347✔
900
  memcpy(pDst->name, pCreate->name, TSDB_TABLE_FNAME_LEN);
8,347✔
901
  memcpy(pDst->db, pDb->name, TSDB_DB_FNAME_LEN);
8,347✔
902
  pDst->createdTime = taosGetTimestampMs();
8,347✔
903
  pDst->updateTime = pDst->createdTime;
8,347✔
904
  pDst->uid = (pCreate->source == TD_REQ_FROM_TAOX_OLD || pCreate->source == TD_REQ_FROM_TAOX || pCreate->source == TD_REQ_FROM_SML)
8,347!
905
                  ? pCreate->suid
906
                  : mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
16,694!
907
  pDst->dbUid = pDb->uid;
8,347✔
908
  pDst->tagVer = 1;
8,347✔
909
  pDst->colVer = 1;
8,347✔
910
  pDst->smaVer = 1;
8,347✔
911
  pDst->nextColId = 1;
8,347✔
912
  pDst->maxdelay[0] = pCreate->delay1;
8,347✔
913
  pDst->maxdelay[1] = pCreate->delay2;
8,347✔
914
  pDst->watermark[0] = pCreate->watermark1;
8,347✔
915
  pDst->watermark[1] = pCreate->watermark2;
8,347✔
916
  pDst->ttl = pCreate->ttl;
8,347✔
917
  pDst->numOfColumns = pCreate->numOfColumns;
8,347✔
918
  pDst->numOfTags = pCreate->numOfTags;
8,347✔
919
  pDst->numOfFuncs = pCreate->numOfFuncs;
8,347✔
920
  pDst->commentLen = pCreate->commentLen;
8,347✔
921
  pDst->pFuncs = pCreate->pFuncs;
8,347✔
922
  pDst->source = pCreate->source;
8,347✔
923
  pDst->keep = pCreate->keep;
8,347✔
924
  pDst->virtualStb = pCreate->virtualStb;
8,347✔
925
  pCreate->pFuncs = NULL;
8,347✔
926

927
  if (pDst->commentLen > 0) {
8,347✔
928
    pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
27!
929
    if (pDst->comment == NULL) {
27!
930
      code = terrno;
×
931
      TAOS_RETURN(code);
×
932
    }
933
    memcpy(pDst->comment, pCreate->pComment, pDst->commentLen + 1);
27✔
934
  }
935

936
  pDst->ast1Len = pCreate->ast1Len;
8,347✔
937
  if (pDst->ast1Len > 0) {
8,347✔
938
    pDst->pAst1 = taosMemoryCalloc(pDst->ast1Len, 1);
4!
939
    if (pDst->pAst1 == NULL) {
4!
940
      code = terrno;
×
941
      TAOS_RETURN(code);
×
942
    }
943
    memcpy(pDst->pAst1, pCreate->pAst1, pDst->ast1Len);
4✔
944
  }
945

946
  pDst->ast2Len = pCreate->ast2Len;
8,347✔
947
  if (pDst->ast2Len > 0) {
8,347✔
948
    pDst->pAst2 = taosMemoryCalloc(pDst->ast2Len, 1);
4!
949
    if (pDst->pAst2 == NULL) {
4!
950
      code = terrno;
×
951
      TAOS_RETURN(code);
×
952
    }
953
    memcpy(pDst->pAst2, pCreate->pAst2, pDst->ast2Len);
4✔
954
  }
955

956
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
8,347!
957
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
8,347!
958
  if (pDst->pColumns == NULL || pDst->pTags == NULL) {
8,347!
959
    code = terrno;
×
960
    TAOS_RETURN(code);
×
961
  }
962

963
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
8,347!
964
    code = TSDB_CODE_OUT_OF_RANGE;
×
965
    TAOS_RETURN(code);
×
966
  }
967

968
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
258,288✔
969
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
249,941✔
970
    SSchema           *pSchema = &pDst->pColumns[i];
249,941✔
971
    pSchema->type = pField->type;
249,941✔
972
    pSchema->bytes = pField->bytes;
249,941✔
973
    pSchema->flags = pField->flags;
249,941✔
974
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
249,941✔
975
    pSchema->colId = pDst->nextColId;
249,941✔
976
    pDst->nextColId++;
249,941✔
977
    hasTypeMods = hasTypeMods || HAS_TYPE_MOD(pSchema);
249,941✔
978
  }
979

980
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
50,167✔
981
    SField  *pField = taosArrayGet(pCreate->pTags, i);
41,820✔
982
    SSchema *pSchema = &pDst->pTags[i];
41,820✔
983
    pSchema->type = pField->type;
41,820✔
984
    pSchema->bytes = pField->bytes;
41,820✔
985
    if (i == 0) {
41,820✔
986
      SSCHMEA_SET_IDX_ON(pSchema);
8,347✔
987
    }
988
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
41,820✔
989
    pSchema->colId = pDst->nextColId;
41,820✔
990
    pDst->nextColId++;
41,820✔
991
  }
992
  // set col compress
993
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SCmprObj));
8,347!
994
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
258,288✔
995
    SFieldWithOptions *pField = taosArrayGet(pCreate->pColumns, i);
249,941✔
996
    SSchema           *pSchema = &pDst->pColumns[i];
249,941✔
997

998
    SColCmpr *pColCmpr = &pDst->pCmpr[i];
249,941✔
999
    pColCmpr->id = pSchema->colId;
249,941✔
1000
    pColCmpr->alg = pField->compress;
249,941✔
1001
  }
1002

1003
  if (hasTypeMods) {
8,347✔
1004
    pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
57!
1005
    if (!pDst->pExtSchemas) {
57!
1006
      code = terrno;
×
1007
      TAOS_RETURN(code);
×
1008
    }
1009
    for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
791✔
1010
      SFieldWithOptions * pField = taosArrayGet(pCreate->pColumns, i);
734✔
1011
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
734✔
1012
    }
1013
  }
1014
  TAOS_RETURN(code);
8,347✔
1015
}
1016
int32_t mndGenIdxNameForFirstTag(char *fullname, char *dbname, char *stbname, char *tagname) {
7,373✔
1017
  SName name = {0};
7,373✔
1018
  if ((terrno = tNameFromString(&name, stbname, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0) {
7,373!
1019
    return -1;
×
1020
  }
1021
  return snprintf(fullname, TSDB_INDEX_FNAME_LEN, "%s.%s_%s", dbname, tagname, tNameGetTableName(&name));
7,373✔
1022
}
1023

1024
static int32_t mndCreateStb(SMnode *pMnode, SRpcMsg *pReq, SMCreateStbReq *pCreate, SDbObj *pDb) {
7,373✔
1025
  SStbObj stbObj = {0};
7,373✔
1026
  int32_t code = -1;
7,373✔
1027

1028
  char fullIdxName[TSDB_INDEX_FNAME_LEN * 2] = {0};
7,373✔
1029

1030
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb");
7,373✔
1031
  if (pTrans == NULL) {
7,373!
1032
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1033
    if (terrno != 0) code = terrno;
×
1034
    goto _OVER;
×
1035
  }
1036

1037
  mInfo("trans:%d, used to create stb:%s", pTrans->id, pCreate->name);
7,373!
1038
  TAOS_CHECK_GOTO(mndBuildStbFromReq(pMnode, &stbObj, pCreate, pDb), NULL, _OVER);
7,373!
1039

1040
  SSchema *pSchema = &(stbObj.pTags[0]);
7,373✔
1041
  if (mndGenIdxNameForFirstTag(fullIdxName, pDb->name, stbObj.name, pSchema->name) < 0) {
7,373!
1042
    goto _OVER;
×
1043
  }
1044
  SSIdx idx = {0};
7,373✔
1045
  if (mndAcquireGlobalIdx(pMnode, fullIdxName, SDB_IDX, &idx) == 0 && idx.pIdx != NULL) {
7,373!
1046
    code = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
×
1047
    mndReleaseIdx(pMnode, idx.pIdx);
×
1048
    goto _OVER;
×
1049
  }
1050

1051
  SIdxObj idxObj = {0};
7,373✔
1052
  memcpy(idxObj.name, fullIdxName, TSDB_INDEX_FNAME_LEN);
7,373✔
1053
  memcpy(idxObj.stb, stbObj.name, TSDB_TABLE_FNAME_LEN);
7,373✔
1054
  memcpy(idxObj.db, stbObj.db, TSDB_DB_FNAME_LEN);
7,373✔
1055
  memcpy(idxObj.colName, pSchema->name, TSDB_COL_NAME_LEN);
7,373✔
1056
  idxObj.createdTime = taosGetTimestampMs();
7,373✔
1057
  idxObj.uid = mndGenerateUid(fullIdxName, strlen(fullIdxName));
7,373✔
1058
  idxObj.stbUid = stbObj.uid;
7,373✔
1059
  idxObj.dbUid = stbObj.dbUid;
7,373✔
1060

1061
  TAOS_CHECK_GOTO(mndSetCreateIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
7,373!
1062

1063
  TAOS_CHECK_GOTO(mndAddStbToTrans(pMnode, pTrans, pDb, &stbObj), NULL, _OVER);
7,373✔
1064
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
7,351✔
1065
  code = 0;
7,348✔
1066

1067
_OVER:
7,373✔
1068
  mndTransDrop(pTrans);
7,373✔
1069
  if (mndStbActionDelete(pMnode->pSdb, &stbObj) != 0) mError("failed to mndStbActionDelete");
7,373!
1070
  TAOS_RETURN(code);
7,373✔
1071
}
1072

1073
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
8,347✔
1074
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
8,347✔
1075
  TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
8,347✔
1076
  TAOS_CHECK_RETURN(mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb));
8,325!
1077
  TAOS_CHECK_RETURN(mndSetCreateStbRedoActions(pMnode, pTrans, pDb, pStb));
8,325!
1078
  TAOS_CHECK_RETURN(mndSetCreateStbUndoActions(pMnode, pTrans, pDb, pStb));
8,325!
1079
  return 0;
8,325✔
1080
}
1081

1082
static int32_t mndProcessTtlTimer(SRpcMsg *pReq) {
5,672✔
1083
  SMnode           *pMnode = pReq->info.node;
5,672✔
1084
  SSdb             *pSdb = pMnode->pSdb;
5,672✔
1085
  SVgObj           *pVgroup = NULL;
5,672✔
1086
  void             *pIter = NULL;
5,672✔
1087
  SVDropTtlTableReq ttlReq = {
5,672✔
1088
      .timestampSec = taosGetTimestampSec(), .ttlDropMaxCount = tsTtlBatchDropNum, .nUids = 0, .pTbUids = NULL};
5,672✔
1089
  int32_t reqLen = tSerializeSVDropTtlTableReq(NULL, 0, &ttlReq);
5,672✔
1090
  int32_t contLen = reqLen + sizeof(SMsgHead);
5,672✔
1091

1092
  mDebug("start to process ttl timer");
5,672✔
1093

1094
  while (1) {
20,649✔
1095
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
26,321✔
1096
    if (pIter == NULL) break;
26,321✔
1097

1098
    if (pVgroup->mountVgId) {
20,649!
1099
      sdbRelease(pSdb, pVgroup);
×
1100
      continue;
×
1101
    }
1102

1103
    int32_t   code = 0;
20,649✔
1104
    SMsgHead *pHead = rpcMallocCont(contLen);
20,649✔
1105
    if (pHead == NULL) {
20,649!
1106
      sdbRelease(pSdb, pVgroup);
×
1107
      continue;
×
1108
    }
1109
    pHead->contLen = htonl(contLen);
20,649✔
1110
    pHead->vgId = htonl(pVgroup->vgId);
20,649✔
1111
    if ((code = tSerializeSVDropTtlTableReq((char *)pHead + sizeof(SMsgHead), reqLen, &ttlReq)) < 0) {
20,649!
1112
      mError("vgId:%d, failed to serialize drop ttl table request since %s", pVgroup->vgId, tstrerror(code));
×
1113
      sdbRelease(pSdb, pVgroup);
×
1114
      continue;
×
1115
    }
1116

1117
    SRpcMsg rpcMsg = {
20,649✔
1118
        .msgType = TDMT_VND_FETCH_TTL_EXPIRED_TBS, .pCont = pHead, .contLen = contLen, .info = pReq->info};
1119
    SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
20,649✔
1120
    code = tmsgSendReq(&epSet, &rpcMsg);
20,649✔
1121
    if (code != 0) {
20,649✔
1122
      mError("vgId:%d, failed to send drop ttl table request to vnode since 0x%x", pVgroup->vgId, code);
33!
1123
    } else {
1124
      mDebug("vgId:%d, send drop ttl table request to vnode, time:%" PRId32, pVgroup->vgId, ttlReq.timestampSec);
20,616✔
1125
    }
1126
    sdbRelease(pSdb, pVgroup);
20,649✔
1127
  }
1128

1129
  return 0;
5,672✔
1130
}
1131

1132
static int32_t mndProcessTrimDbTimer(SRpcMsg *pReq) {
×
1133
  SMnode     *pMnode = pReq->info.node;
×
1134
  SSdb       *pSdb = pMnode->pSdb;
×
1135
  SVgObj     *pVgroup = NULL;
×
1136
  void       *pIter = NULL;
×
1137
  SVTrimDbReq trimReq = {.timestamp = taosGetTimestampSec()};
×
1138
  int32_t     reqLen = tSerializeSVTrimDbReq(NULL, 0, &trimReq);
×
1139
  int32_t     contLen = reqLen + sizeof(SMsgHead);
×
1140

1141
  while (1) {
×
1142
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
1143
    if (pIter == NULL) break;
×
1144
    if (pVgroup->mountVgId) {
×
1145
      sdbRelease(pSdb, pVgroup);
×
1146
      continue;
×
1147
    }
1148

1149
    int32_t code = 0;
×
1150

1151
    SMsgHead *pHead = rpcMallocCont(contLen);
×
1152
    if (pHead == NULL) {
×
1153
      sdbCancelFetch(pSdb, pVgroup);
×
1154
      sdbRelease(pSdb, pVgroup);
×
1155
      continue;
×
1156
    }
1157
    pHead->contLen = htonl(contLen);
×
1158
    pHead->vgId = htonl(pVgroup->vgId);
×
1159
    if ((code = tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &trimReq)) < 0) {
×
1160
      mError("vgId:%d, failed to serialize trim db request since %s", pVgroup->vgId, tstrerror(code));
×
1161
    }
1162

1163
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen};
×
1164
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
1165
    code = tmsgSendReq(&epSet, &rpcMsg);
×
1166
    if (code != 0) {
×
1167
      mError("vgId:%d, timer failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code);
×
1168
    } else {
1169
      mInfo("vgId:%d, timer send vnode-trim request to vnode, time:%d", pVgroup->vgId, trimReq.timestamp);
×
1170
    }
1171
    sdbRelease(pSdb, pVgroup);
×
1172
  }
1173

1174
  return 0;
×
1175
}
1176

1177
static int32_t mndProcessS3MigrateDbTimer(SRpcMsg *pReq) {
×
1178
  SMnode          *pMnode = pReq->info.node;
×
1179
  SSdb            *pSdb = pMnode->pSdb;
×
1180
  SVgObj          *pVgroup = NULL;
×
1181
  void            *pIter = NULL;
×
1182
  SVS3MigrateDbReq s3migrateReq = {.timestamp = taosGetTimestampSec()};
×
1183
  int32_t          reqLen = tSerializeSVS3MigrateDbReq(NULL, 0, &s3migrateReq);
×
1184
  int32_t          contLen = reqLen + sizeof(SMsgHead);
×
1185

1186
  while (1) {
×
1187
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
1188
    if (pIter == NULL) break;
×
1189
    if (pVgroup->mountVgId) {
×
1190
      sdbRelease(pSdb, pVgroup);
×
1191
      continue;
×
1192
    }
1193

1194
    int32_t code = 0;
×
1195

1196
    SMsgHead *pHead = rpcMallocCont(contLen);
×
1197
    if (pHead == NULL) {
×
1198
      sdbRelease(pSdb, pVgroup);
×
1199
      continue;
×
1200
    }
1201
    pHead->contLen = htonl(contLen);
×
1202
    pHead->vgId = htonl(pVgroup->vgId);
×
1203
    if ((code = tSerializeSVS3MigrateDbReq((char *)pHead + sizeof(SMsgHead), reqLen, &s3migrateReq)) < 0) {
×
1204
      mError("vgId:%d, failed to serialize s3migrate db request since %s", pVgroup->vgId, tstrerror(code));
×
1205
      sdbRelease(pSdb, pVgroup);
×
1206
      continue;
×
1207
    }
1208

1209
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_S3MIGRATE, .pCont = pHead, .contLen = contLen};
×
1210
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
1211
    code = tmsgSendReq(&epSet, &rpcMsg);
×
1212
    if (code != 0) {
×
1213
      mError("vgId:%d, timer failed to send vnode-s3migrate request to vnode since 0x%x", pVgroup->vgId, code);
×
1214
    } else {
1215
      mInfo("vgId:%d, timer send vnode-s3migrate request to vnode, time:%d", pVgroup->vgId, s3migrateReq.timestamp);
×
1216
    }
1217
    sdbRelease(pSdb, pVgroup);
×
1218
  }
1219

1220
  return 0;
×
1221
}
1222

1223
static int32_t mndFindSuperTableTagIndex(const SStbObj *pStb, const char *tagName) {
5,491✔
1224
  for (int32_t tag = 0; tag < pStb->numOfTags; tag++) {
107,802✔
1225
    if (strcmp(pStb->pTags[tag].name, tagName) == 0) {
104,418✔
1226
      return tag;
2,107✔
1227
    }
1228
  }
1229

1230
  return -1;
3,384✔
1231
}
1232

1233
static int32_t mndFindSuperTableColumnIndex(const SStbObj *pStb, const char *colName) {
6,344✔
1234
  for (int32_t col = 0; col < pStb->numOfColumns; col++) {
839,699✔
1235
    if (strcmp(pStb->pColumns[col].name, colName) == 0) {
836,188✔
1236
      return col;
2,833✔
1237
    }
1238
  }
1239

1240
  return -1;
3,511✔
1241
}
1242

1243
static bool mndValidateSchema(SSchema *pSchemas, int32_t nSchema, SArray *pFields, int32_t maxLen) {
3,394✔
1244
  int32_t rowLen = 0;
3,394✔
1245
  for (int32_t i = 0; i < nSchema; ++i) {
390,426✔
1246
    rowLen += (pSchemas + i)->bytes;
387,032✔
1247
  }
1248

1249
  int32_t nField = taosArrayGetSize(pFields);
3,394✔
1250
  for (int32_t i = 0; i < nField; ++i) {
6,788✔
1251
    rowLen += ((SField *)TARRAY_GET_ELEM(pFields, i))->bytes;
3,394✔
1252
  }
1253

1254
  return rowLen <= maxLen;
3,394✔
1255
}
1256

1257
static int32_t mndBuildStbFromAlter(SStbObj *pStb, SStbObj *pDst, SMCreateStbReq *createReq) {
73✔
1258
  int32_t code = 0;
73✔
1259
  taosRLockLatch(&pStb->lock);
73✔
1260
  memcpy(pDst, pStb, sizeof(SStbObj));
73✔
1261
  taosRUnLockLatch(&pStb->lock);
73✔
1262

1263
  pDst->source = createReq->source;
73✔
1264
  pDst->updateTime = taosGetTimestampMs();
73✔
1265
  pDst->numOfColumns = createReq->numOfColumns;
73✔
1266
  pDst->numOfTags = createReq->numOfTags;
73✔
1267
  pDst->pColumns = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SSchema));
73!
1268
  pDst->pTags = taosMemoryCalloc(1, pDst->numOfTags * sizeof(SSchema));
73!
1269
  pDst->pCmpr = taosMemoryCalloc(1, pDst->numOfColumns * sizeof(SColCmpr));
73!
1270
  pDst->pExtSchemas = taosMemoryCalloc(pDst->numOfColumns, sizeof(SExtSchema));
73!
1271

1272
  if (pDst->pColumns == NULL || pDst->pTags == NULL || pDst->pCmpr == NULL || pDst->pExtSchemas == NULL) {
73!
1273
    code = terrno;
×
1274
    TAOS_RETURN(code);
×
1275
  }
1276

1277
  if (pDst->nextColId < 0 || pDst->nextColId >= 0x7fff - pDst->numOfColumns - pDst->numOfTags) {
73!
1278
    code = TSDB_CODE_OUT_OF_RANGE;
×
1279
    TAOS_RETURN(code);
×
1280
  }
1281

1282
  for (int32_t i = 0; i < pDst->numOfColumns; ++i) {
558✔
1283
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
485✔
1284
    SSchema           *pSchema = &pDst->pColumns[i];
485✔
1285
    pSchema->type = pField->type;
485✔
1286
    pSchema->bytes = pField->bytes;
485✔
1287
    pSchema->flags = pField->flags;
485✔
1288
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
485✔
1289
    int32_t cIndex = mndFindSuperTableColumnIndex(pStb, pField->name);
485✔
1290
    if (cIndex >= 0) {
485✔
1291
      pSchema->colId = pStb->pColumns[cIndex].colId;
423✔
1292
    } else {
1293
      pSchema->colId = pDst->nextColId++;
62✔
1294
    }
1295
  }
1296

1297
  for (int32_t i = 0; i < pDst->numOfTags; ++i) {
452✔
1298
    SField  *pField = taosArrayGet(createReq->pTags, i);
379✔
1299
    SSchema *pSchema = &pDst->pTags[i];
379✔
1300
    pSchema->type = pField->type;
379✔
1301
    pSchema->bytes = pField->bytes;
379✔
1302
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
379✔
1303
    int32_t cIndex = mndFindSuperTableTagIndex(pStb, pField->name);
379✔
1304
    if (cIndex >= 0) {
379✔
1305
      pSchema->colId = pStb->pTags[cIndex].colId;
339✔
1306
    } else {
1307
      pSchema->colId = pDst->nextColId++;
40✔
1308
    }
1309
  }
1310
  for (int32_t i = 0; i < pDst->numOfColumns; i++) {
558✔
1311
    SColCmpr          *p = pDst->pCmpr + i;
485✔
1312
    SFieldWithOptions *pField = taosArrayGet(createReq->pColumns, i);
485✔
1313
    SSchema           *pSchema = &pDst->pColumns[i];
485✔
1314
    p->id = pSchema->colId;
485✔
1315
    if (pField->compress == 0) {
485!
1316
      p->alg = createDefaultColCmprByType(pSchema->type);
×
1317
    } else {
1318
      p->alg = pField->compress;
485✔
1319
    }
1320
    if (pField->flags & COL_HAS_TYPE_MOD) {
485✔
1321
      pDst->pExtSchemas[i].typeMod = pField->typeMod;
16✔
1322
    }
1323
  }
1324
  pDst->tagVer = createReq->tagVer;
73✔
1325
  pDst->colVer = createReq->colVer;
73✔
1326
  return TSDB_CODE_SUCCESS;
73✔
1327
}
1328

1329
static int32_t mndProcessCreateStbReq(SRpcMsg *pReq) {
7,512✔
1330
  SMnode        *pMnode = pReq->info.node;
7,512✔
1331
  int32_t        code = -1;
7,512✔
1332
  SStbObj       *pStb = NULL;
7,512✔
1333
  SDbObj        *pDb = NULL;
7,512✔
1334
  SMCreateStbReq createReq = {0};
7,512✔
1335
  bool           isAlter = false;
7,512✔
1336
  SHashObj      *pHash = NULL;
7,512✔
1337

1338
  if (tDeserializeSMCreateStbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
7,512!
1339
    code = TSDB_CODE_INVALID_MSG;
×
1340
    goto _OVER;
×
1341
  }
1342

1343
  mInfo("stb:%s, start to create", createReq.name);
7,512!
1344
  if (mndCheckCreateStbReq(&createReq) != 0) {
7,512!
1345
    code = TSDB_CODE_INVALID_MSG;
×
1346
    goto _OVER;
×
1347
  }
1348

1349
  pStb = mndAcquireStb(pMnode, createReq.name);
7,512✔
1350
  if (pStb != NULL) {
7,512✔
1351
    if (createReq.igExists) {
136✔
1352
      if (createReq.source == TD_REQ_FROM_APP) {
133✔
1353
        mInfo("stb:%s, already exist, ignore exist is set", createReq.name);
11!
1354
        code = 0;
11✔
1355
        goto _OVER;
11✔
1356
      } else if (pStb->uid != createReq.suid) {
122!
1357
        mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
×
1358
        code = 0;
×
1359
        goto _OVER;
×
1360
      } else if (createReq.tagVer > 0 || createReq.colVer > 0) {
195!
1361
        int32_t tagDelta = createReq.tagVer - pStb->tagVer;
122✔
1362
        int32_t colDelta = createReq.colVer - pStb->colVer;
122✔
1363
        mInfo("stb:%s, already exist while create, input tagVer:%d colVer:%d, exist tagVer:%d colVer:%d",
122!
1364
              createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1365
        if (tagDelta <= 0 && colDelta <= 0) {
122✔
1366
          mInfo("stb:%s, schema version is not incremented and nothing needs to be done", createReq.name);
49!
1367
          code = 0;
49✔
1368
          goto _OVER;
49✔
1369
        } else if ((tagDelta == 1 && colDelta == 0) || (tagDelta == 0 && colDelta == 1) ||
73!
1370
                   (pStb->colVer == 1 && createReq.colVer > 1) || (pStb->tagVer == 1 && createReq.tagVer > 1)) {
×
1371
          isAlter = true;
73✔
1372
          mInfo("stb:%s, schema version is only increased by 1 number, do alter operation", createReq.name);
73!
1373
        } else {
1374
          mError("stb:%s, schema version increase more than 1 number, error is returned", createReq.name);
×
1375
          code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1376
          goto _OVER;
×
1377
        }
1378
      } else {
1379
        mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid, origin tagVer:%d colVer:%d",
×
1380
               createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer);
1381
        code = TSDB_CODE_MND_INVALID_SCHEMA_VER;
×
1382
        goto _OVER;
×
1383
      }
1384
    } else {
1385
      code = TSDB_CODE_MND_STB_ALREADY_EXIST;
3✔
1386
      goto _OVER;
3✔
1387
    }
1388
  } else if (terrno != TSDB_CODE_MND_STB_NOT_EXIST) {
7,376!
1389
    goto _OVER;
×
1390
  } else if ((createReq.source == TD_REQ_FROM_TAOX_OLD || createReq.source == TD_REQ_FROM_TAOX || createReq.source == TD_REQ_FROM_SML) &&
7,376!
1391
             (createReq.tagVer != 1 || createReq.colVer != 1)) {
48✔
1392
    mInfo("stb:%s, alter table does not need to be done, because table is deleted", createReq.name);
2!
1393
    code = 0;
2✔
1394
    goto _OVER;
2✔
1395
  }
1396

1397
  pHash = taosHashInit(createReq.numOfColumns + createReq.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
7,447✔
1398
                       false, HASH_NO_LOCK);
1399
  if (pHash == NULL) {
7,447!
1400
    code = TSDB_CODE_OUT_OF_MEMORY;
×
1401
    goto _OVER;
×
1402
  }
1403

1404
  for (int32_t i = 0; i < createReq.numOfColumns; ++i) {
249,478✔
1405
    SFieldWithOptions *pField = taosArrayGet(createReq.pColumns, i);
242,031✔
1406
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
242,031!
1407
      if (code == TSDB_CODE_DUP_KEY) {
×
1408
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
×
1409
      }
1410
      goto _OVER;
×
1411
    }
1412
  }
1413

1414
  for (int32_t i = 0; i < createReq.numOfTags; ++i) {
48,059✔
1415
    SField *pField = taosArrayGet(createReq.pTags, i);
40,613✔
1416
    if ((code = taosHashPut(pHash, pField->name, strlen(pField->name), NULL, 0)) != 0) {
40,613✔
1417
      if (code == TSDB_CODE_DUP_KEY) {
1!
1418
        code = TSDB_CODE_TSC_DUP_COL_NAMES;
1✔
1419
      }
1420
      goto _OVER;
1✔
1421
    }
1422
  }
1423

1424
  pDb = mndAcquireDbByStb(pMnode, createReq.name);
7,446✔
1425
  if (pDb == NULL) {
7,446!
1426
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
1427
    goto _OVER;
×
1428
  }
1429

1430
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
7,446!
1431
    goto _OVER;
×
1432
  }
1433
  if (pDb->cfg.isMount) {
7,446!
1434
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
1435
    goto _OVER;
×
1436
  }
1437

1438
  int32_t numOfStbs = -1;
7,446✔
1439
  if ((code = mndGetNumOfStbs(pMnode, pDb->name, &numOfStbs)) != 0) {
7,446!
1440
    goto _OVER;
×
1441
  }
1442

1443
  if (pDb->cfg.numOfStables == 1 && numOfStbs != 0) {
7,446!
1444
    code = TSDB_CODE_MND_SINGLE_STB_MODE_DB;
×
1445
    goto _OVER;
×
1446
  }
1447

1448
  if ((code = grantCheck(TSDB_GRANT_STABLE)) < 0) {
7,446!
1449
    goto _OVER;
×
1450
  }
1451

1452
  if (isAlter) {
7,446✔
1453
    bool    needRsp = false;
73✔
1454
    SStbObj pDst = {0};
73✔
1455
    if ((code = mndBuildStbFromAlter(pStb, &pDst, &createReq)) != 0) {
73!
1456
      taosMemoryFreeClear(pDst.pTags);
×
1457
      taosMemoryFreeClear(pDst.pColumns);
×
1458
      taosMemoryFreeClear(pDst.pCmpr);
×
1459
      taosMemoryFreeClear(pDst.pExtSchemas);
×
1460
      goto _OVER;
×
1461
    }
1462

1463
    code = mndAlterStbImp(pMnode, pReq, pDb, &pDst, needRsp, NULL, 0);
73✔
1464
    taosMemoryFreeClear(pDst.pTags);
73!
1465
    taosMemoryFreeClear(pDst.pColumns);
73!
1466
    taosMemoryFreeClear(pDst.pCmpr);
73!
1467
    taosMemoryFreeClear(pDst.pExtSchemas);
73!
1468
  } else {
1469
    code = mndCreateStb(pMnode, pReq, &createReq, pDb);
7,373✔
1470
  }
1471
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
7,446✔
1472

1473
  SName name = {0};
7,446✔
1474
  TAOS_CHECK_RETURN(tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
7,446!
1475

1476
  if (createReq.sql == NULL && createReq.sqlLen == 0) {
8,314!
1477
    char detail[1000] = {0};
868✔
1478

1479
    (void)tsnprintf(detail, sizeof(detail), "dbname:%s, stable name:%s", name.dbname, name.tname);
868✔
1480

1481
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, detail, strlen(detail));
868✔
1482
  } else {
1483
    auditRecord(pReq, pMnode->clusterId, "createStb", name.dbname, name.tname, createReq.sql, createReq.sqlLen);
6,578✔
1484
  }
1485
_OVER:
7,512✔
1486
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
7,512✔
1487
    mError("stb:%s, failed to create since %s", createReq.name, tstrerror(code));
29!
1488
  }
1489

1490
  mndReleaseStb(pMnode, pStb);
7,512✔
1491
  mndReleaseDb(pMnode, pDb);
7,512✔
1492
  tFreeSMCreateStbReq(&createReq);
7,512✔
1493

1494
  if (pHash != NULL) {
7,512✔
1495
    taosHashCleanup(pHash);
7,447✔
1496
  }
1497

1498
  TAOS_RETURN(code);
7,512✔
1499
}
1500

1501
static int32_t mndCheckAlterStbReq(SMAlterStbReq *pAlter) {
7,019✔
1502
  int32_t code = 0;
7,019✔
1503
  if (pAlter->commentLen >= 0) return 0;
7,019!
1504
  if (pAlter->ttl != 0) return 0;
×
1505
  if (pAlter->keep != -1) return 0;
×
1506

1507
  if (pAlter->numOfFields < 1 || pAlter->numOfFields != (int32_t)taosArrayGetSize(pAlter->pFields)) {
×
1508
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1509
    TAOS_RETURN(code);
×
1510
  }
1511

1512
  for (int32_t i = 0; i < pAlter->numOfFields; ++i) {
×
1513
    SField *pField = taosArrayGet(pAlter->pFields, i);
×
1514
    if (pField->name[0] == 0) {
×
1515
      code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1516
      TAOS_RETURN(code);
×
1517
    }
1518
  }
1519

1520
  TAOS_RETURN(code);
×
1521
}
1522

1523
int32_t mndAllocStbSchemas(const SStbObj *pOld, SStbObj *pNew) {
6,810✔
1524
  pNew->pTags = taosMemoryCalloc(pNew->numOfTags, sizeof(SSchema));
6,810!
1525
  pNew->pColumns = taosMemoryCalloc(pNew->numOfColumns, sizeof(SSchema));
6,810!
1526
  pNew->pCmpr = taosMemoryCalloc(pNew->numOfColumns, sizeof(SColCmpr));
6,810!
1527
  if (pNew->pTags == NULL || pNew->pColumns == NULL || pNew->pCmpr == NULL) {
6,810!
1528
    TAOS_RETURN(terrno);
×
1529
  }
1530

1531
  memcpy(pNew->pColumns, pOld->pColumns, sizeof(SSchema) * pOld->numOfColumns);
6,810✔
1532
  memcpy(pNew->pTags, pOld->pTags, sizeof(SSchema) * pOld->numOfTags);
6,810✔
1533
  memcpy(pNew->pCmpr, pOld->pCmpr, sizeof(SColCmpr) * pOld->numOfColumns);
6,810✔
1534
  if (pOld->pExtSchemas) {
6,810✔
1535
    pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
4,441!
1536
    if (pNew->pExtSchemas == NULL) {
4,441!
1537
      TAOS_RETURN(terrno);
×
1538
    }
1539
    memcpy(pNew->pExtSchemas, pOld->pExtSchemas, sizeof(SExtSchema) * pOld->numOfColumns);
4,441✔
1540
  }
1541

1542
  TAOS_RETURN(0);
6,810✔
1543
}
1544

1545
static int32_t mndUpdateTableOptions(const SStbObj *pOld, SStbObj *pNew, char *pComment, int32_t commentLen,
34✔
1546
                                     int32_t ttl, int64_t keep) {
1547
  int32_t code = 0;
34✔
1548
  if (commentLen > 0) {
34✔
1549
    pNew->commentLen = commentLen;
23✔
1550
    pNew->comment = taosMemoryCalloc(1, commentLen + 1);
23!
1551
    if (pNew->comment == NULL) {
23!
1552
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1553
      return -1;
×
1554
    }
1555
    memcpy(pNew->comment, pComment, commentLen + 1);
23✔
1556
  } else if (commentLen == 0) {
11!
1557
    pNew->commentLen = 0;
11✔
1558
  } else {
1559
  }
1560

1561
  if (ttl >= 0) {
34!
1562
    pNew->ttl = ttl;
34✔
1563
  }
1564

1565
  if (keep > 0) {
34!
1566
    pNew->keep = keep;
×
1567
  }
1568

1569
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
34!
1570
    TAOS_RETURN(code);
×
1571
  }
1572
  TAOS_RETURN(code);
34✔
1573
}
1574

1575
static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *pFields, int32_t ntags) {
861✔
1576
  int32_t code = 0;
861✔
1577
  if (pOld->numOfTags + ntags > TSDB_MAX_TAGS) {
861!
1578
    code = TSDB_CODE_MND_TOO_MANY_TAGS;
×
1579
    TAOS_RETURN(code);
×
1580
  }
1581

1582
  if (pOld->numOfColumns + ntags + pOld->numOfTags > TSDB_MAX_COLUMNS) {
861!
1583
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1584
    TAOS_RETURN(code);
×
1585
  }
1586

1587
  if (!mndValidateSchema(pOld->pTags, pOld->numOfTags, pFields, TSDB_MAX_TAGS_LEN)) {
861✔
1588
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
40✔
1589
    TAOS_RETURN(code);
40✔
1590
  }
1591

1592
  pNew->numOfTags = pNew->numOfTags + ntags;
821✔
1593
  if ((code = mndAllocStbSchemas(pOld, pNew)) != 0) {
821!
1594
    TAOS_RETURN(code);
×
1595
  }
1596

1597
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ntags) {
821!
1598
    code = TSDB_CODE_OUT_OF_RANGE;
×
1599
    TAOS_RETURN(code);
×
1600
  }
1601

1602
  for (int32_t i = 0; i < ntags; i++) {
1,528✔
1603
    SField *pField = taosArrayGet(pFields, i);
821✔
1604
    if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
821✔
1605
      code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
6✔
1606
      TAOS_RETURN(code);
6✔
1607
    }
1608

1609
    if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
815✔
1610
      code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
108✔
1611
      TAOS_RETURN(code);
108✔
1612
    }
1613

1614
    SSchema *pSchema = &pNew->pTags[pOld->numOfTags + i];
707✔
1615
    pSchema->bytes = pField->bytes;
707✔
1616
    pSchema->type = pField->type;
707✔
1617
    memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
707✔
1618
    pSchema->colId = pNew->nextColId;
707✔
1619
    pNew->nextColId++;
707✔
1620

1621
    mInfo("stb:%s, start to add tag %s", pNew->name, pSchema->name);
707!
1622
  }
1623

1624
  pNew->tagVer++;
707✔
1625
  TAOS_RETURN(code);
707✔
1626
}
1627

1628
static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
3,380✔
1629
  int32_t code = 0;
3,380✔
1630
  SSdb   *pSdb = pMnode->pSdb;
3,380✔
1631
  void   *pIter = NULL;
3,380✔
1632
  while (1) {
1,053✔
1633
    SMqTopicObj *pTopic = NULL;
4,433✔
1634
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
4,433✔
1635
    if (pIter == NULL) break;
4,433✔
1636

1637
    mInfo("topic:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, subType:%d sql:%s",
1,131!
1638
          pTopic->name, stbFullName, suid, colId, pTopic->subType, pTopic->sql);
1639
    if (pTopic->ast == NULL) {
1,131✔
1640
      sdbRelease(pSdb, pTopic);
103✔
1641
      continue;
103✔
1642
    }
1643

1644
    SNode *pAst = NULL;
1,028✔
1645
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
1,028!
1646
      code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
×
1647
      mError("topic:%s, create ast error", pTopic->name);
×
1648
      sdbRelease(pSdb, pTopic);
×
1649
      sdbCancelFetch(pSdb, pIter);
×
1650
      TAOS_RETURN(code);
78✔
1651
    }
1652

1653
    SNodeList *pNodeList = NULL;
1,028✔
1654
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
1,028!
1655
        0) {
1656
      sdbRelease(pSdb, pTopic);
×
1657
      sdbCancelFetch(pSdb, pIter);
×
1658
      TAOS_RETURN(code);
×
1659
    }
1660
    SNode *pNode = NULL;
1,028✔
1661
    FOREACH(pNode, pNodeList) {
1,669✔
1662
      SColumnNode *pCol = (SColumnNode *)pNode;
1,592✔
1663
      mInfo("topic:%s, check colId:%d tableId:%" PRId64 " ctbStbUid:%" PRId64, pTopic->name, pCol->colId, pCol->tableId,
1,592!
1664
            pTopic->ctbStbUid);
1665

1666
      if (pCol->tableId != suid && pTopic->ctbStbUid != suid) {
1,592✔
1667
        mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
873!
1668
        goto NEXT;
873✔
1669
      }
1670
      if (pCol->colId > 0 && pCol->colId == colId) {
719!
1671
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
78✔
1672
        mError("topic:%s, check colId:%d conflicted", pTopic->name, pCol->colId);
78!
1673
        nodesDestroyNode(pAst);
78✔
1674
        nodesDestroyList(pNodeList);
78✔
1675
        sdbCancelFetch(pSdb, pIter);
78✔
1676
        sdbRelease(pSdb, pTopic);
78✔
1677
        TAOS_RETURN(code);
78✔
1678
      }
1679
      mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
641!
1680
    }
1681

1682
  NEXT:
77✔
1683
    sdbRelease(pSdb, pTopic);
950✔
1684
    nodesDestroyNode(pAst);
950✔
1685
    nodesDestroyList(pNodeList);
950✔
1686
  }
1687
  TAOS_RETURN(code);
3,302✔
1688
}
1689

1690
static int32_t mndCheckAlterColForStream(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
3,302✔
1691
  int32_t code = 0;
3,302✔
1692
  SSdb   *pSdb = pMnode->pSdb;
3,302✔
1693
  void   *pIter = NULL;
3,302✔
1694
  while (1) {
12✔
1695
    SStreamObj *pStream = NULL;
3,314✔
1696
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
3,314✔
1697
    if (pIter == NULL) break;
3,314✔
1698

1699
    SNode *pAst = NULL;
12✔
1700
    if (nodesStringToNode(pStream->ast, &pAst) != 0) {
12!
1701
      code = TSDB_CODE_MND_INVALID_STREAM_OPTION;
×
1702
      mError("stream:%s, create ast error", pStream->name);
×
1703
      sdbRelease(pSdb, pStream);
×
1704
      sdbCancelFetch(pSdb, pIter);
×
1705
      TAOS_RETURN(code);
×
1706
    }
1707

1708
    SNodeList *pNodeList = NULL;
12✔
1709
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
12!
1710
        0) {
1711
      sdbRelease(pSdb, pStream);
×
1712
      sdbCancelFetch(pSdb, pIter);
×
1713
      TAOS_RETURN(code);
×
1714
    }
1715

1716
    SNode *pNode = NULL;
12✔
1717
    FOREACH(pNode, pNodeList) {
12!
1718
      SColumnNode *pCol = (SColumnNode *)pNode;
12✔
1719

1720
      if (pCol->tableId != suid) {
12!
1721
        mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
12!
1722
        goto NEXT;
12✔
1723
      }
1724
      if (pCol->colId > 0 && pCol->colId == colId) {
×
1725
        code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
×
1726
        mError("stream:%s, check colId:%d conflicted", pStream->name, pCol->colId);
×
1727
        nodesDestroyNode(pAst);
×
1728
        nodesDestroyList(pNodeList);
×
1729
        sdbRelease(pSdb, pStream);
×
1730
        sdbCancelFetch(pSdb, pIter);
×
1731
        TAOS_RETURN(code);
×
1732
      }
1733
      mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
×
1734
    }
1735

1736
  NEXT:
×
1737
    sdbRelease(pSdb, pStream);
12✔
1738
    nodesDestroyNode(pAst);
12✔
1739
    nodesDestroyList(pNodeList);
12✔
1740
  }
1741
  TAOS_RETURN(code);
3,302✔
1742
}
1743

1744
static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
3,302✔
1745
  int32_t code = 0;
3,302✔
1746
  SSdb   *pSdb = pMnode->pSdb;
3,302✔
1747
  void   *pIter = NULL;
3,302✔
1748
  while (1) {
×
1749
    SSmaObj *pSma = NULL;
3,302✔
1750
    pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
3,302✔
1751
    if (pIter == NULL) break;
3,302!
1752

1753
    mInfo("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, sql:%s", pSma->name, stbFullName,
×
1754
          suid, colId, pSma->sql);
1755

1756
    SNode *pAst = NULL;
×
1757
    if (nodesStringToNode(pSma->ast, &pAst) != 0) {
×
1758
      code = TSDB_CODE_SDB_INVALID_DATA_CONTENT;
×
1759
      mError("tsma:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d failed since parse AST err",
×
1760
             pSma->name, stbFullName, suid, colId);
1761
      sdbCancelFetch(pSdb, pIter);
×
1762
      TAOS_RETURN(code);
×
1763
    }
1764

1765
    SNodeList *pNodeList = NULL;
×
1766
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
×
1767
        0) {
1768
      sdbCancelFetch(pSdb, pIter);
×
1769
      TAOS_RETURN(code);
×
1770
    }
1771
    SNode *pNode = NULL;
×
1772
    FOREACH(pNode, pNodeList) {
×
1773
      SColumnNode *pCol = (SColumnNode *)pNode;
×
1774
      mInfo("tsma:%s, check colId:%d tableId:%" PRId64, pSma->name, pCol->colId, pCol->tableId);
×
1775

1776
      if ((pCol->tableId != suid) && (pSma->stbUid != suid)) {
×
1777
        mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1778
        goto NEXT;
×
1779
      }
1780
      if ((pCol->colId) > 0 && (pCol->colId == colId)) {
×
1781
        code = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
×
1782
        mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
×
1783
        nodesDestroyNode(pAst);
×
1784
        nodesDestroyList(pNodeList);
×
1785
        sdbRelease(pSdb, pSma);
×
1786
        sdbCancelFetch(pSdb, pIter);
×
1787
        TAOS_RETURN(code);
×
1788
      }
1789
      mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
×
1790
    }
1791

1792
  NEXT:
×
1793
    sdbRelease(pSdb, pSma);
×
1794
    nodesDestroyNode(pAst);
×
1795
    nodesDestroyList(pNodeList);
×
1796
  }
1797
  TAOS_RETURN(code);
3,302✔
1798
}
1799

1800
int32_t mndCheckColAndTagModifiable(SMnode *pMnode, const char *stbFullName, int64_t suid, col_id_t colId) {
3,380✔
1801
  TAOS_CHECK_RETURN(mndCheckAlterColForTopic(pMnode, stbFullName, suid, colId));
3,380✔
1802
  TAOS_CHECK_RETURN(mndCheckAlterColForStream(pMnode, stbFullName, suid, colId));
3,302!
1803
  TAOS_CHECK_RETURN(mndCheckAlterColForTSma(pMnode, stbFullName, suid, colId));
3,302!
1804
  TAOS_RETURN(0);
3,302✔
1805
}
1806

1807
static int32_t mndDropSuperTableTag(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *tagName) {
490✔
1808
  int32_t code = 0;
490✔
1809
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagName);
490✔
1810
  if (tag < 0) {
490✔
1811
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
4✔
1812
    TAOS_RETURN(code);
4✔
1813
  }
1814

1815
  col_id_t colId = pOld->pTags[tag].colId;
486✔
1816
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
486✔
1817

1818
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
468!
1819

1820
  memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
468✔
1821
  pNew->numOfTags--;
468✔
1822

1823
  pNew->tagVer++;
468✔
1824

1825
  // if (mndDropIndexByTag(pMnode, pOld, tagName) != 0) {
1826
  //   return -1;
1827
  // }
1828
  mInfo("stb:%s, start to drop tag %s", pNew->name, tagName);
468!
1829
  TAOS_RETURN(code);
468✔
1830
}
1831

1832
static int32_t mndAlterStbTagName(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pFields) {
660✔
1833
  int32_t code = 0;
660✔
1834
  if ((int32_t)taosArrayGetSize(pFields) != 2) {
660!
1835
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
×
1836
    TAOS_RETURN(code);
×
1837
  }
1838

1839
  SField *pField0 = taosArrayGet(pFields, 0);
660✔
1840
  SField *pField1 = taosArrayGet(pFields, 1);
660✔
1841

1842
  const char *oldTagName = pField0->name;
660✔
1843
  const char *newTagName = pField1->name;
660✔
1844

1845
  int32_t tag = mndFindSuperTableTagIndex(pOld, oldTagName);
660✔
1846
  if (tag < 0) {
660✔
1847
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
14✔
1848
    TAOS_RETURN(code);
14✔
1849
  }
1850

1851
  col_id_t colId = pOld->pTags[tag].colId;
646✔
1852
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
646✔
1853

1854
  if (mndFindSuperTableTagIndex(pOld, newTagName) >= 0) {
629✔
1855
    code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
20✔
1856
    TAOS_RETURN(code);
20✔
1857
  }
1858

1859
  if (mndFindSuperTableColumnIndex(pOld, newTagName) >= 0) {
609✔
1860
    code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
1✔
1861
    TAOS_RETURN(code);
1✔
1862
  }
1863

1864
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
608!
1865

1866
  SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
608✔
1867
  memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
608✔
1868

1869
  pNew->tagVer++;
608✔
1870
  mInfo("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
608!
1871
  TAOS_RETURN(code);
608✔
1872
}
1873

1874
static int32_t mndAlterStbTagBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
502✔
1875
  int32_t code = 0;
502✔
1876
  int32_t tag = mndFindSuperTableTagIndex(pOld, pField->name);
502✔
1877
  if (tag < 0) {
502✔
1878
    code = TSDB_CODE_MND_TAG_NOT_EXIST;
1✔
1879
    TAOS_RETURN(code);
1✔
1880
  }
1881

1882
  col_id_t colId = pOld->pTags[tag].colId;
501✔
1883
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
501✔
1884

1885
  uint32_t nLen = 0;
492✔
1886
  for (int32_t i = 0; i < pOld->numOfTags; ++i) {
18,811✔
1887
    nLen += (pOld->pTags[i].colId == colId) ? pField->bytes : pOld->pTags[i].bytes;
18,319✔
1888
  }
1889

1890
  if (nLen > TSDB_MAX_TAGS_LEN) {
492✔
1891
    code = TSDB_CODE_PAR_INVALID_TAGS_LENGTH;
290✔
1892
    TAOS_RETURN(code);
290✔
1893
  }
1894

1895
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
202!
1896

1897
  SSchema *pTag = pNew->pTags + tag;
202✔
1898

1899
  if (!(pTag->type == TSDB_DATA_TYPE_BINARY || pTag->type == TSDB_DATA_TYPE_VARBINARY ||
202!
1900
        pTag->type == TSDB_DATA_TYPE_NCHAR || pTag->type == TSDB_DATA_TYPE_GEOMETRY)) {
176!
1901
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
1✔
1902
    TAOS_RETURN(code);
1✔
1903
  }
1904

1905
  if (pField->bytes <= pTag->bytes) {
201✔
1906
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
56✔
1907
    TAOS_RETURN(code);
56✔
1908
  }
1909

1910
  pTag->bytes = pField->bytes;
145✔
1911
  pNew->tagVer++;
145✔
1912

1913
  mInfo("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
145!
1914
  TAOS_RETURN(code);
145✔
1915
}
1916

1917
static int32_t mndUpdateSuperTableColumnCompress(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, SArray *pField,
86✔
1918
                                                 int32_t nCols) {
1919
  // if (pColCmpr == NULL || colName == NULL) return -1;
1920

1921
  if (taosArrayGetSize(pField) != nCols) return TSDB_CODE_FAILED;
86!
1922
  TAOS_FIELD *p = taosArrayGet(pField, 0);
86✔
1923

1924
  int32_t code = 0;
86✔
1925
  int32_t idx = mndFindSuperTableColumnIndex(pOld, p->name);
86✔
1926
  if (idx == -1) {
86!
1927
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
×
1928
    TAOS_RETURN(code);
×
1929
  }
1930
  SSchema *pTarget = &pOld->pColumns[idx];
86✔
1931
  col_id_t colId = pTarget->colId;
86✔
1932

1933
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
86!
1934
  code = validColCmprByType(pTarget->type, p->bytes);
86✔
1935
  if (code != TSDB_CODE_SUCCESS) {
86✔
1936
    TAOS_RETURN(code);
2✔
1937
  }
1938

1939
  int8_t updated = 0;
84✔
1940
  for (int i = 0; i < pNew->numOfColumns; i++) {
699!
1941
    SColCmpr *pCmpr = &pNew->pCmpr[i];
699✔
1942
    if (pCmpr->id == colId) {
699✔
1943
      uint32_t dst = 0;
84✔
1944
      updated = tUpdateCompress(pCmpr->alg, p->bytes, TSDB_COLVAL_COMPRESS_DISABLED, TSDB_COLVAL_LEVEL_DISABLED,
84✔
1945
                                TSDB_COLVAL_LEVEL_MEDIUM, &dst);
1946
      if (updated > 0) pCmpr->alg = dst;
84✔
1947
      break;
84✔
1948
    }
1949
  }
1950

1951
  if (updated == 0) {
84✔
1952
    code = TSDB_CODE_MND_COLUMN_COMPRESS_ALREADY_EXIST;
7✔
1953
    TAOS_RETURN(code);
7✔
1954
  } else if (updated == -1) {
77!
1955
    code = TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR;
×
1956
    TAOS_RETURN(code);
×
1957
  }
1958

1959
  pNew->colVer++;
77✔
1960

1961
  TAOS_RETURN(code);
77✔
1962
}
1963
static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const SMAlterStbReq* pReq, int32_t ncols,
2,533✔
1964
                                      int8_t withCompress) {
1965
  int32_t code = 0;
2,533✔
1966
  if (pOld->numOfColumns + ncols + pOld->numOfTags > TSDB_MAX_COLUMNS) {
2,533!
1967
    code = TSDB_CODE_MND_TOO_MANY_COLUMNS;
×
1968
    TAOS_RETURN(code);
×
1969
  }
1970

1971
  if ((code = grantCheck(TSDB_GRANT_TIMESERIES)) != 0) {
2,533!
1972
    TAOS_RETURN(code);
×
1973
  }
1974

1975
  if (!mndValidateSchema(pOld->pColumns, pOld->numOfColumns, pReq->pFields, TSDB_MAX_BYTES_PER_ROW)) {
2,533✔
1976
    code = TSDB_CODE_PAR_INVALID_ROW_LENGTH;
17✔
1977
    TAOS_RETURN(code);
17✔
1978
  }
1979

1980
  pNew->numOfColumns = pNew->numOfColumns + ncols;
2,516✔
1981

1982
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
2,516!
1983

1984
  if (pNew->nextColId < 0 || pNew->nextColId >= 0x7fff - ncols) {
2,516!
1985
    code = TSDB_CODE_OUT_OF_RANGE;
×
1986
    TAOS_RETURN(code);
×
1987
  }
1988

1989
  for (int32_t i = 0; i < ncols; i++) {
4,525✔
1990
    if (withCompress) {
2,516✔
1991
      SFieldWithOptions *pField = taosArrayGet(pReq->pFields, i);
242✔
1992
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
242!
1993
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
×
1994
        TAOS_RETURN(code);
×
1995
      }
1996

1997
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
242!
1998
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
×
1999
        TAOS_RETURN(code);
×
2000
      }
2001

2002
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
242✔
2003
      pSchema->bytes = pField->bytes;
242✔
2004
      pSchema->type = pField->type;
242✔
2005
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
242✔
2006
      pSchema->colId = pNew->nextColId;
242✔
2007
      pNew->nextColId++;
242✔
2008

2009
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
242✔
2010
      pCmpr->id = pSchema->colId;
242✔
2011
      pCmpr->alg = pField->compress;
242✔
2012
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
242!
2013
    } else {
2014
      SField *pField = taosArrayGet(pReq->pFields, i);
2,274✔
2015
      if (mndFindSuperTableColumnIndex(pOld, pField->name) >= 0) {
2,274✔
2016
        code = TSDB_CODE_MND_COLUMN_ALREADY_EXIST;
500✔
2017
        TAOS_RETURN(code);
500✔
2018
      }
2019

2020
      if (mndFindSuperTableTagIndex(pOld, pField->name) >= 0) {
1,774✔
2021
        code = TSDB_CODE_MND_TAG_ALREADY_EXIST;
7✔
2022
        TAOS_RETURN(code);
7✔
2023
      }
2024

2025
      SSchema *pSchema = &pNew->pColumns[pOld->numOfColumns + i];
1,767✔
2026
      pSchema->bytes = pField->bytes;
1,767✔
2027
      pSchema->type = pField->type;
1,767✔
2028
      memcpy(pSchema->name, pField->name, TSDB_COL_NAME_LEN);
1,767✔
2029
      pSchema->colId = pNew->nextColId;
1,767✔
2030
      pNew->nextColId++;
1,767✔
2031

2032
      SColCmpr *pCmpr = &pNew->pCmpr[pOld->numOfColumns + i];
1,767✔
2033
      pCmpr->id = pSchema->colId;
1,767✔
2034
      pCmpr->alg = createDefaultColCmprByType(pSchema->type);
1,767✔
2035
      mInfo("stb:%s, start to add column %s", pNew->name, pSchema->name);
1,767!
2036
    }
2037
  }
2038
  // 1. old schema already has extschemas
2039
  // 2. new schema has extschemas
2040
  if (pReq->pTypeMods || pOld->pExtSchemas) {
2,009!
2041
    if (!pNew->pExtSchemas) {
2,007✔
2042
      // all ext schemas reset to zero
2043
      pNew->pExtSchemas = taosMemoryCalloc(pNew->numOfColumns, sizeof(SExtSchema));
93!
2044
      if (!pNew->pExtSchemas) TAOS_RETURN(terrno);
93!
2045
    }
2046
    if (pOld->pExtSchemas) {
2,007✔
2047
      memcpy(pNew->pExtSchemas, pOld->pExtSchemas, pOld->numOfColumns * sizeof(SExtSchema));
1,914✔
2048
    }
2049
    if (taosArrayGetSize(pReq->pTypeMods) > 0) {
2,007!
2050
      // copy added column ext schema
2051
      for (int32_t i = 0; i < ncols; ++i) {
4,014✔
2052
        pNew->pColumns[pOld->numOfColumns + i].flags |= COL_HAS_TYPE_MOD;
2,007✔
2053
        pNew->pExtSchemas[pOld->numOfColumns + i].typeMod = *(STypeMod *)taosArrayGet(pReq->pTypeMods, i);
2,007✔
2054
      }
2055
    }
2056
  }
2057

2058
  pNew->colVer++;
2,009✔
2059
  TAOS_RETURN(code);
2,009✔
2060
}
2061

2062
static int32_t mndDropSuperTableColumn(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const char *colName) {
1,030✔
2063
  int32_t code = 0;
1,030✔
2064
  int32_t col = mndFindSuperTableColumnIndex(pOld, colName);
1,030✔
2065
  if (col < 0) {
1,030✔
2066
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
7✔
2067
    TAOS_RETURN(code);
7✔
2068
  }
2069

2070
  if (col == 0) {
1,023✔
2071
    code = TSDB_CODE_MND_INVALID_STB_ALTER_OPTION;
5✔
2072
    TAOS_RETURN(code);
5✔
2073
  }
2074

2075
  if (pOld->numOfColumns == 2) {
1,018✔
2076
    code = TSDB_CODE_PAR_INVALID_DROP_COL;
1✔
2077
    TAOS_RETURN(code);
1✔
2078
  }
2079

2080
  col_id_t colId = pOld->pColumns[col].colId;
1,017✔
2081
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
1,017✔
2082

2083
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
995!
2084

2085
  int32_t sz = pNew->numOfColumns - col - 1;
995✔
2086
  memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * sz);
995✔
2087
  memmove(pNew->pCmpr + col, pNew->pCmpr + col + 1, sizeof(SColCmpr) * sz);
995✔
2088
  if (pOld->pExtSchemas) {
995✔
2089
    memmove(pNew->pExtSchemas + col, pNew->pExtSchemas + col + 1, sizeof(SExtSchema) * sz);
828✔
2090
  }
2091
  pNew->numOfColumns--;
995✔
2092

2093
  pNew->colVer++;
995✔
2094
  mInfo("stb:%s, start to drop col %s", pNew->name, colName);
995!
2095
  TAOS_RETURN(code);
995✔
2096
}
2097

2098
static int32_t mndAlterStbColumnBytes(SMnode *pMnode, const SStbObj *pOld, SStbObj *pNew, const SField *pField) {
797✔
2099
  int32_t code = 0;
797✔
2100
  int32_t col = mndFindSuperTableColumnIndex(pOld, pField->name);
797✔
2101
  if (col < 0) {
797✔
2102
    code = TSDB_CODE_MND_COLUMN_NOT_EXIST;
3✔
2103
    TAOS_RETURN(code);
3✔
2104
  }
2105

2106
  col_id_t colId = pOld->pColumns[col].colId;
794✔
2107

2108
  uint32_t nLen = 0;
794✔
2109
  for (int32_t i = 0; i < pOld->numOfColumns; ++i) {
31,097✔
2110
    nLen += (pOld->pColumns[i].colId == colId) ? pField->bytes : pOld->pColumns[i].bytes;
30,303✔
2111
  }
2112

2113
  if (nLen > TSDB_MAX_BYTES_PER_ROW) {
794✔
2114
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
64✔
2115
    TAOS_RETURN(code);
64✔
2116
  }
2117

2118
  TAOS_CHECK_RETURN(mndCheckColAndTagModifiable(pMnode, pOld->name, pOld->uid, colId));
730✔
2119

2120
  TAOS_CHECK_RETURN(mndAllocStbSchemas(pOld, pNew));
718!
2121

2122
  SSchema *pCol = pNew->pColumns + col;
718✔
2123
  if (!(pCol->type == TSDB_DATA_TYPE_BINARY || pCol->type == TSDB_DATA_TYPE_VARBINARY ||
718✔
2124
        pCol->type == TSDB_DATA_TYPE_NCHAR || pCol->type == TSDB_DATA_TYPE_GEOMETRY)) {
680!
2125
    code = TSDB_CODE_MND_INVALID_STB_OPTION;
1✔
2126
    TAOS_RETURN(code);
1✔
2127
  }
2128

2129
  if (pField->bytes <= pCol->bytes) {
717✔
2130
    code = TSDB_CODE_MND_INVALID_ROW_BYTES;
325✔
2131
    TAOS_RETURN(code);
325✔
2132
  }
2133

2134
  pCol->bytes = pField->bytes;
392✔
2135
  pNew->colVer++;
392✔
2136

2137
  mInfo("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
392!
2138
  TAOS_RETURN(code);
392✔
2139
}
2140

2141
static int32_t mndSetAlterStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
5,488✔
2142
  int32_t  code = 0;
5,488✔
2143
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
5,488✔
2144
  if (pRedoRaw == NULL) {
5,488!
2145
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2146
    if (terrno != 0) code = terrno;
×
2147
    TAOS_RETURN(code);
×
2148
  }
2149
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
5,488!
2150
    sdbFreeRaw(pRedoRaw);
×
2151
    TAOS_RETURN(code);
×
2152
  }
2153
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY));
5,488!
2154

2155
  TAOS_RETURN(code);
5,488✔
2156
}
2157

2158
static int32_t mndSetAlterStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
5,488✔
2159
  int32_t  code = 0;
5,488✔
2160
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
5,488✔
2161
  if (pCommitRaw == NULL) {
5,488!
2162
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2163
    if (terrno != 0) code = terrno;
×
2164
    TAOS_RETURN(code);
×
2165
  }
2166
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
5,488!
2167
    sdbFreeRaw(pCommitRaw);
×
2168
    TAOS_RETURN(code);
×
2169
  }
2170
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
5,488!
2171

2172
  TAOS_RETURN(code);
5,488✔
2173
}
2174

2175
static int32_t mndSetAlterStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb, void *alterOriData,
5,488✔
2176
                                         int32_t alterOriDataLen) {
2177
  int32_t code = 0;
5,488✔
2178
  SSdb   *pSdb = pMnode->pSdb;
5,488✔
2179
  SVgObj *pVgroup = NULL;
5,488✔
2180
  void   *pIter = NULL;
5,488✔
2181
  int32_t contLen;
2182

2183
  while (1) {
17,168✔
2184
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
22,656✔
2185
    if (pIter == NULL) break;
22,656✔
2186
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
17,168✔
2187
      sdbRelease(pSdb, pVgroup);
5,903✔
2188
      continue;
5,903✔
2189
    }
2190

2191
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
11,265✔
2192
    if (pReq == NULL) {
11,265!
2193
      sdbCancelFetch(pSdb, pIter);
×
2194
      sdbRelease(pSdb, pVgroup);
×
2195
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2196
      if (terrno != 0) code = terrno;
×
2197
      TAOS_RETURN(code);
×
2198
    }
2199
    STransAction action = {0};
11,265✔
2200
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
11,265✔
2201
    action.pCont = pReq;
11,265✔
2202
    action.contLen = contLen;
11,265✔
2203
    action.msgType = TDMT_VND_ALTER_STB;
11,265✔
2204
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
11,265!
2205
      taosMemoryFree(pReq);
×
2206
      sdbCancelFetch(pSdb, pIter);
×
2207
      sdbRelease(pSdb, pVgroup);
×
2208
      TAOS_RETURN(code);
×
2209
    }
2210
    sdbRelease(pSdb, pVgroup);
11,265✔
2211
  }
2212

2213
  TAOS_RETURN(code);
5,488✔
2214
}
2215

2216
static int32_t mndSetAlterStbRedoActions2(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb,
×
2217
                                          void *alterOriData, int32_t alterOriDataLen) {
2218
  int32_t code = 0;
×
2219
  SSdb   *pSdb = pMnode->pSdb;
×
2220
  SVgObj *pVgroup = NULL;
×
2221
  void   *pIter = NULL;
×
2222
  int32_t contLen;
2223

2224
  while (1) {
×
2225
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
2226
    if (pIter == NULL) break;
×
2227
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
×
2228
      sdbRelease(pSdb, pVgroup);
×
2229
      continue;
×
2230
    }
2231

2232
    void *pReq = mndBuildVCreateStbReq(pMnode, pVgroup, pStb, &contLen, alterOriData, alterOriDataLen);
×
2233
    if (pReq == NULL) {
×
2234
      sdbCancelFetch(pSdb, pIter);
×
2235
      sdbRelease(pSdb, pVgroup);
×
2236
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2237
      if (terrno != 0) code = terrno;
×
2238
      TAOS_RETURN(code);
×
2239
    }
2240
    STransAction action = {0};
×
2241
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2242
    action.pCont = pReq;
×
2243
    action.contLen = contLen;
×
2244
    action.msgType = TDMT_VND_CREATE_INDEX;
×
2245
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
×
2246
      taosMemoryFree(pReq);
×
2247
      sdbCancelFetch(pSdb, pIter);
×
2248
      sdbRelease(pSdb, pVgroup);
×
2249
      TAOS_RETURN(code);
×
2250
    }
2251
    sdbRelease(pSdb, pVgroup);
×
2252
  }
2253

2254
  TAOS_RETURN(code);
×
2255
}
2256

2257
static int32_t mndBuildStbSchemaImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableMetaRsp *pRsp) {
44,987✔
2258
  int32_t code = 0;
44,987✔
2259
  taosRLockLatch(&pStb->lock);
44,987✔
2260

2261
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
44,988✔
2262
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
44,988!
2263
  if (pRsp->pSchemas == NULL) {
44,988!
2264
    taosRUnLockLatch(&pStb->lock);
×
2265
    code = terrno;
×
2266
    TAOS_RETURN(code);
×
2267
  }
2268
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
44,988!
2269
  if (pRsp->pSchemaExt == NULL) {
44,988!
2270
    taosRUnLockLatch(&pStb->lock);
×
2271
    code = terrno;
×
2272
    TAOS_RETURN(code);
×
2273
  }
2274
  pRsp->numOfColRefs = 0;
44,988✔
2275
  pRsp->pColRefs = NULL;
44,988✔
2276
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
44,988✔
2277
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
44,988✔
2278
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
44,988✔
2279
  pRsp->dbId = pDb->uid;
44,988✔
2280
  pRsp->numOfTags = pStb->numOfTags;
44,988✔
2281
  pRsp->numOfColumns = pStb->numOfColumns;
44,988✔
2282
  pRsp->precision = pDb->cfg.precision;
44,988✔
2283
  pRsp->tableType = TSDB_SUPER_TABLE;
44,988✔
2284
  pRsp->sversion = pStb->colVer;
44,988✔
2285
  pRsp->tversion = pStb->tagVer;
44,988✔
2286
  pRsp->suid = pStb->uid;
44,988✔
2287
  pRsp->tuid = pStb->uid;
44,988✔
2288
  pRsp->virtualStb = pStb->virtualStb;
44,988✔
2289

2290
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
1,990,452✔
2291
    SSchema *pSchema = &pRsp->pSchemas[i];
1,945,464✔
2292
    SSchema *pSrcSchema = &pStb->pColumns[i];
1,945,464✔
2293
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
1,945,464✔
2294
    pSchema->type = pSrcSchema->type;
1,945,464✔
2295
    pSchema->flags = pSrcSchema->flags;
1,945,464✔
2296
    pSchema->colId = pSrcSchema->colId;
1,945,464✔
2297
    pSchema->bytes = pSrcSchema->bytes;
1,945,464✔
2298
  }
2299

2300
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
541,188✔
2301
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
496,200✔
2302
    SSchema *pSrcSchema = &pStb->pTags[i];
496,200✔
2303
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
496,200✔
2304
    pSchema->type = pSrcSchema->type;
496,200✔
2305
    pSchema->flags = pSrcSchema->flags;
496,200✔
2306
    pSchema->colId = pSrcSchema->colId;
496,200✔
2307
    pSchema->bytes = pSrcSchema->bytes;
496,200✔
2308
  }
2309
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
1,990,454✔
2310
    SColCmpr   *pCmpr = &pStb->pCmpr[i];
1,945,466✔
2311
    SSchemaExt *pSchEx = &pRsp->pSchemaExt[i];
1,945,466✔
2312
    pSchEx->colId = pCmpr->id;
1,945,466✔
2313
    pSchEx->compress = pCmpr->alg;
1,945,466✔
2314
    if (pStb->pExtSchemas) {
1,945,466✔
2315
      pSchEx->typeMod = pStb->pExtSchemas[i].typeMod;
1,049,911✔
2316
    }
2317
  }
2318

2319
  taosRUnLockLatch(&pStb->lock);
44,988✔
2320
  TAOS_RETURN(code);
44,988✔
2321
}
2322

2323
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
66✔
2324
  int32_t code = 0;
66✔
2325
  taosRLockLatch(&pStb->lock);
66✔
2326

2327
  int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
66✔
2328
  pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
66!
2329
  if (pRsp->pSchemas == NULL) {
66!
2330
    taosRUnLockLatch(&pStb->lock);
×
2331
    code = terrno;
×
2332
    TAOS_RETURN(code);
×
2333
  }
2334

2335
  tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName));
66✔
2336
  tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName));
66✔
2337
  tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName));
66✔
2338
  pRsp->numOfTags = pStb->numOfTags;
66✔
2339
  pRsp->numOfColumns = pStb->numOfColumns;
66✔
2340
  pRsp->tableType = TSDB_SUPER_TABLE;
66✔
2341
  pRsp->delay1 = pStb->maxdelay[0];
66✔
2342
  pRsp->delay2 = pStb->maxdelay[1];
66✔
2343
  pRsp->watermark1 = pStb->watermark[0];
66✔
2344
  pRsp->watermark2 = pStb->watermark[1];
66✔
2345
  pRsp->ttl = pStb->ttl;
66✔
2346
  pRsp->keep = pStb->keep;
66✔
2347
  pRsp->commentLen = pStb->commentLen;
66✔
2348
  if (pStb->commentLen > 0) {
66!
2349
    pRsp->pComment = taosStrdup(pStb->comment);
×
2350
  }
2351

2352
  for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
375✔
2353
    SSchema *pSchema = &pRsp->pSchemas[i];
309✔
2354
    SSchema *pSrcSchema = &pStb->pColumns[i];
309✔
2355
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
309✔
2356
    pSchema->type = pSrcSchema->type;
309✔
2357
    pSchema->flags = pSrcSchema->flags;
309✔
2358
    pSchema->colId = pSrcSchema->colId;
309✔
2359
    pSchema->bytes = pSrcSchema->bytes;
309✔
2360
  }
2361

2362
  for (int32_t i = 0; i < pStb->numOfTags; ++i) {
176✔
2363
    SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
110✔
2364
    SSchema *pSrcSchema = &pStb->pTags[i];
110✔
2365
    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
110✔
2366
    pSchema->type = pSrcSchema->type;
110✔
2367
    pSchema->flags = pSrcSchema->flags;
110✔
2368
    pSchema->colId = pSrcSchema->colId;
110✔
2369
    pSchema->bytes = pSrcSchema->bytes;
110✔
2370
  }
2371

2372
  if (pStb->numOfFuncs > 0) {
66!
2373
    pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
×
2374
  }
2375

2376
  pRsp->pSchemaExt = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchemaExt));
66!
2377
  for (int32_t i = 0; i < pStb->numOfColumns; i++) {
375✔
2378
    SColCmpr *pCmpr = &pStb->pCmpr[i];
309✔
2379

2380
    SSchemaExt *pSchExt = &pRsp->pSchemaExt[i];
309✔
2381
    pSchExt->colId = pCmpr->id;
309✔
2382
    pSchExt->compress = pCmpr->alg;
309✔
2383
    if (pStb->pExtSchemas) {
309✔
2384
      pSchExt->typeMod = pStb->pExtSchemas[i].typeMod;
165✔
2385
    }
2386
  }
2387
  pRsp->virtualStb = pStb->virtualStb;
66✔
2388
  pRsp->pColRefs = NULL;
66✔
2389

2390
  taosRUnLockLatch(&pStb->lock);
66✔
2391
  TAOS_RETURN(code);
66✔
2392
}
2393

2394
static int32_t mndValidateStbVersion(SMnode *pMnode, SSTableVersion *pStbVer, bool *schema, bool *sma) {
12,665✔
2395
  int32_t code = 0;
12,665✔
2396
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
12,665✔
2397
  snprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVer->dbFName, pStbVer->stbName);
12,665✔
2398

2399
  SDbObj *pDb = mndAcquireDb(pMnode, pStbVer->dbFName);
12,665✔
2400
  if (pDb == NULL) {
12,664✔
2401
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
325✔
2402
    TAOS_RETURN(code);
325✔
2403
  }
2404

2405
  if (pDb->uid != pStbVer->dbId) {
12,339✔
2406
    mndReleaseDb(pMnode, pDb);
196✔
2407
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
196✔
2408
    TAOS_RETURN(code);
196✔
2409
  }
2410

2411
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
12,143✔
2412
  if (pStb == NULL) {
12,143✔
2413
    mndReleaseDb(pMnode, pDb);
36✔
2414
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
36✔
2415
    TAOS_RETURN(code);
36✔
2416
  }
2417

2418
  taosRLockLatch(&pStb->lock);
12,107✔
2419

2420
  if (pStbVer->sversion != pStb->colVer || pStbVer->tversion != pStb->tagVer) {
12,108✔
2421
    *schema = true;
122✔
2422
  } else {
2423
    *schema = false;
11,986✔
2424
  }
2425

2426
  if (pStbVer->smaVer && pStbVer->smaVer != pStb->smaVer) {
12,108!
2427
    *sma = true;
×
2428
  } else {
2429
    *sma = false;
12,108✔
2430
  }
2431

2432
  taosRUnLockLatch(&pStb->lock);
12,108✔
2433

2434
  mndReleaseDb(pMnode, pDb);
12,108✔
2435
  mndReleaseStb(pMnode, pStb);
12,108✔
2436
  return TSDB_CODE_SUCCESS;
12,108✔
2437
}
2438

2439
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp) {
33,661✔
2440
  int32_t code = 0;
33,661✔
2441
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
33,661✔
2442
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
33,661✔
2443

2444
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
33,661✔
2445
  if (pDb == NULL) {
33,661!
2446
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2447
    TAOS_RETURN(code);
×
2448
  }
2449

2450
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
33,661✔
2451
  if (pStb == NULL) {
33,660✔
2452
    mndReleaseDb(pMnode, pDb);
1,573✔
2453
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
1,573✔
2454
    TAOS_RETURN(code);
1,573✔
2455
  }
2456

2457
  code = mndBuildStbSchemaImp(pDb, pStb, tbName, pRsp);
32,087✔
2458
  mndReleaseDb(pMnode, pDb);
32,088✔
2459
  mndReleaseStb(pMnode, pStb);
32,088✔
2460
  TAOS_RETURN(code);
32,088✔
2461
}
2462

2463
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
66✔
2464
  int32_t code = 0;
66✔
2465
  char    tbFName[TSDB_TABLE_FNAME_LEN] = {0};
66✔
2466
  snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
66✔
2467

2468
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
66✔
2469
  if (pDb == NULL) {
66!
2470
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
2471
    TAOS_RETURN(code);
×
2472
  }
2473

2474
  SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
66✔
2475
  if (pStb == NULL) {
66!
2476
    mndReleaseDb(pMnode, pDb);
×
2477
    code = TSDB_CODE_PAR_TABLE_NOT_EXIST;
×
2478
    TAOS_RETURN(code);
×
2479
  }
2480

2481
  code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
66✔
2482

2483
  mndReleaseDb(pMnode, pDb);
66✔
2484
  mndReleaseStb(pMnode, pStb);
66✔
2485
  TAOS_RETURN(code);
66✔
2486
}
2487

2488
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, int32_t *pLen) {
5,381✔
2489
  int32_t       code = 0;
5,381✔
2490
  SEncoder      ec = {0};
5,381✔
2491
  uint32_t      contLen = 0;
5,381✔
2492
  SMAlterStbRsp alterRsp = {0};
5,381✔
2493
  SName         name = {0};
5,381✔
2494
  TAOS_CHECK_RETURN(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
5,381!
2495

2496
  alterRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
5,381!
2497
  if (NULL == alterRsp.pMeta) {
5,381!
2498
    code = terrno;
×
2499
    TAOS_RETURN(code);
×
2500
  }
2501

2502
  code = mndBuildStbSchemaImp(pDb, pObj, name.tname, alterRsp.pMeta);
5,381✔
2503
  if (code) {
5,381!
2504
    tFreeSMAlterStbRsp(&alterRsp);
×
2505
    return code;
×
2506
  }
2507

2508
  tEncodeSize(tEncodeSMAlterStbRsp, &alterRsp, contLen, code);
5,381!
2509
  if (code) {
5,381!
2510
    tFreeSMAlterStbRsp(&alterRsp);
×
2511
    return code;
×
2512
  }
2513

2514
  void *cont = taosMemoryMalloc(contLen);
5,381!
2515
  if (NULL == cont) {
5,381!
2516
    code = terrno;
×
2517
    tFreeSMAlterStbRsp(&alterRsp);
×
2518
    TAOS_RETURN(code);
×
2519
  }
2520
  tEncoderInit(&ec, cont, contLen);
5,381✔
2521
  code = tEncodeSMAlterStbRsp(&ec, &alterRsp);
5,381✔
2522
  tEncoderClear(&ec);
5,381✔
2523

2524
  tFreeSMAlterStbRsp(&alterRsp);
5,381✔
2525

2526
  if (code < 0) TAOS_RETURN(code);
5,381!
2527

2528
  *pCont = cont;
5,381✔
2529
  *pLen = contLen;
5,381✔
2530

2531
  TAOS_RETURN(code);
5,381✔
2532
}
2533

2534
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen) {
7,523✔
2535
  int32_t code = -1;
7,523✔
2536
  SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
7,523✔
2537
  if (NULL == pDb) {
7,523!
2538
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2539
    if (terrno != 0) code = terrno;
×
2540
    TAOS_RETURN(code);
×
2541
  }
2542

2543
  SStbObj *pObj = mndAcquireStb(pMnode, stbFName);
7,523✔
2544
  if (NULL == pObj) {
7,523✔
2545
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
4✔
2546
    if (terrno != 0) code = terrno;
4!
2547
    goto _OVER;
4✔
2548
  }
2549

2550
  SEncoder       ec = {0};
7,519✔
2551
  uint32_t       contLen = 0;
7,519✔
2552
  SMCreateStbRsp stbRsp = {0};
7,519✔
2553
  SName          name = {0};
7,519✔
2554
  TAOS_CHECK_GOTO(tNameFromString(&name, pObj->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE), NULL, _OVER);
7,519!
2555

2556
  stbRsp.pMeta = taosMemoryCalloc(1, sizeof(STableMetaRsp));
7,519!
2557
  if (NULL == stbRsp.pMeta) {
7,519!
2558
    code = terrno;
×
2559
    goto _OVER;
×
2560
  }
2561

2562
  code = mndBuildStbSchemaImp(pDb, pObj, name.tname, stbRsp.pMeta);
7,519✔
2563
  if (code) {
7,519!
2564
    tFreeSMCreateStbRsp(&stbRsp);
×
2565
    goto _OVER;
×
2566
  }
2567

2568
  tEncodeSize(tEncodeSMCreateStbRsp, &stbRsp, contLen, code);
7,519!
2569
  if (code) {
7,519!
2570
    tFreeSMCreateStbRsp(&stbRsp);
×
2571
    goto _OVER;
×
2572
  }
2573

2574
  void *cont = taosMemoryMalloc(contLen);
7,519!
2575
  if (NULL == cont) {
7,519!
2576
    code = terrno;
×
2577
    tFreeSMCreateStbRsp(&stbRsp);
×
2578
    goto _OVER;
×
2579
  }
2580
  tEncoderInit(&ec, cont, contLen);
7,519✔
2581
  TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER);
7,519!
2582
  tEncoderClear(&ec);
7,519✔
2583

2584
  tFreeSMCreateStbRsp(&stbRsp);
7,519✔
2585

2586
  *pCont = cont;
7,519✔
2587
  *pLen = contLen;
7,519✔
2588

2589
  code = 0;
7,519✔
2590

2591
_OVER:
7,523✔
2592
  if (pObj) {
7,523✔
2593
    mndReleaseStb(pMnode, pObj);
7,519✔
2594
  }
2595

2596
  if (pDb) {
7,523!
2597
    mndReleaseDb(pMnode, pDb);
7,523✔
2598
  }
2599

2600
  TAOS_RETURN(code);
7,523✔
2601
}
2602

2603
static int32_t mndAlterStbImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
4,432✔
2604
                              void *alterOriData, int32_t alterOriDataLen) {
2605
  int32_t code = -1;
4,432✔
2606
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
4,432✔
2607
  if (pTrans == NULL) {
4,432!
2608
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2609
    if (terrno != 0) code = terrno;
×
2610
    goto _OVER;
×
2611
  }
2612

2613
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
4,432!
2614
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
4,432✔
2615
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
4,432✔
2616

2617
  if (needRsp) {
4,412✔
2618
    void   *pCont = NULL;
4,305✔
2619
    int32_t contLen = 0;
4,305✔
2620
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
4,305!
2621
    mndTransSetRpcRsp(pTrans, pCont, contLen);
4,305✔
2622
  }
2623

2624
  TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,412!
2625
  TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
4,412!
2626
  TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
4,412!
2627
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
4,412!
2628

2629
  code = 0;
4,412✔
2630

2631
_OVER:
4,432✔
2632
  mndTransDrop(pTrans);
4,432✔
2633
  TAOS_RETURN(code);
4,432✔
2634
}
2635

2636
static int32_t mndAlterStbAndUpdateTagIdxImp(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp,
1,076✔
2637
                                             void *alterOriData, int32_t alterOriDataLen, const SMAlterStbReq *pAlter) {
2638
  int32_t code = -1;
1,076✔
2639
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "alter-stb");
1,076✔
2640
  if (pTrans == NULL) {
1,076!
2641
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2642
    if (terrno != 0) code = terrno;
×
2643
    goto _OVER;
×
2644
  }
2645

2646
  mInfo("trans:%d, used to alter stb:%s", pTrans->id, pStb->name);
1,076!
2647
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
1,076✔
2648

2649
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,076!
2650

2651
  if (needRsp) {
1,076!
2652
    void   *pCont = NULL;
1,076✔
2653
    int32_t contLen = 0;
1,076✔
2654
    TAOS_CHECK_GOTO(mndBuildSMAlterStbRsp(pDb, pStb, &pCont, &contLen), NULL, _OVER);
1,076!
2655
    mndTransSetRpcRsp(pTrans, pCont, contLen);
1,076✔
2656
  }
2657

2658
  if (pAlter->alterType == TSDB_ALTER_TABLE_DROP_TAG) {
1,076✔
2659
    SIdxObj idxObj = {0};
468✔
2660
    SField *pField0 = taosArrayGet(pAlter->pFields, 0);
468✔
2661
    bool    exist = false;
468✔
2662
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
468✔
2663
      exist = true;
21✔
2664
    }
2665
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
468!
2666
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
468!
2667

2668
    if (exist == true) {
468✔
2669
      TAOS_CHECK_GOTO(mndSetDropIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
21!
2670
      TAOS_CHECK_GOTO(mndSetDropIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
21!
2671
    }
2672

2673
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
468!
2674
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
468!
2675

2676
  } else if (pAlter->alterType == TSDB_ALTER_TABLE_UPDATE_TAG_NAME) {
608!
2677
    SIdxObj     idxObj = {0};
608✔
2678
    SField     *pField0 = taosArrayGet(pAlter->pFields, 0);
608✔
2679
    SField     *pField1 = taosArrayGet(pAlter->pFields, 1);
608✔
2680
    const char *oTagName = pField0->name;
608✔
2681
    const char *nTagName = pField1->name;
608✔
2682
    bool        exist = false;
608✔
2683

2684
    if (mndGetIdxsByTagName(pMnode, pStb, pField0->name, &idxObj) == 0) {
608✔
2685
      exist = true;
49✔
2686
    }
2687

2688
    TAOS_CHECK_GOTO(mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
608!
2689
    TAOS_CHECK_GOTO(mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb), NULL, _OVER);
608!
2690

2691
    if (exist == true) {
608✔
2692
      memcpy(idxObj.colName, nTagName, strlen(nTagName));
49✔
2693
      idxObj.colName[strlen(nTagName)] = 0;
49✔
2694
      TAOS_CHECK_GOTO(mndSetAlterIdxPrepareLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
49!
2695
      TAOS_CHECK_GOTO(mndSetAlterIdxCommitLogs(pMnode, pTrans, &idxObj), NULL, _OVER);
49!
2696
    }
2697

2698
    TAOS_CHECK_GOTO(mndSetAlterStbRedoActions(pMnode, pTrans, pDb, pStb, alterOriData, alterOriDataLen), NULL, _OVER);
608!
2699
    TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
608!
2700
  }
2701
  code = 0;
1,076✔
2702

2703
_OVER:
1,076✔
2704
  mndTransDrop(pTrans);
1,076✔
2705
  TAOS_RETURN(code);
1,076✔
2706
}
2707

2708
static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *pAlter, SDbObj *pDb, SStbObj *pOld) {
6,993✔
2709
  bool    needRsp = true;
6,993✔
2710
  int32_t code = -1;
6,993✔
2711
  SField *pField0 = NULL;
6,993✔
2712

2713
  SStbObj stbObj = {0};
6,993✔
2714
  taosRLockLatch(&pOld->lock);
6,993✔
2715
  memcpy(&stbObj, pOld, sizeof(SStbObj));
6,993✔
2716
  taosRUnLockLatch(&pOld->lock);
6,993✔
2717
  stbObj.pColumns = NULL;
6,993✔
2718
  stbObj.pTags = NULL;
6,993✔
2719
  stbObj.pFuncs = NULL;
6,993✔
2720
  stbObj.pCmpr = NULL;
6,993✔
2721
  stbObj.pExtSchemas = NULL;
6,993✔
2722
  stbObj.updateTime = taosGetTimestampMs();
6,993✔
2723
  stbObj.lock = 0;
6,993✔
2724
  stbObj.virtualStb = pOld->virtualStb;
6,993✔
2725
  bool updateTagIndex = false;
6,993✔
2726
  switch (pAlter->alterType) {
6,993!
2727
    case TSDB_ALTER_TABLE_ADD_TAG:
861✔
2728
      code = mndAddSuperTableTag(pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
861✔
2729
      break;
861✔
2730
    case TSDB_ALTER_TABLE_DROP_TAG:
490✔
2731
      pField0 = taosArrayGet(pAlter->pFields, 0);
490✔
2732
      code = mndDropSuperTableTag(pMnode, pOld, &stbObj, pField0->name);
490✔
2733
      updateTagIndex = true;
490✔
2734
      break;
490✔
2735
    case TSDB_ALTER_TABLE_UPDATE_TAG_NAME:
660✔
2736
      code = mndAlterStbTagName(pMnode, pOld, &stbObj, pAlter->pFields);
660✔
2737
      updateTagIndex = true;
660✔
2738
      break;
660✔
2739
    case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES:
502✔
2740
      pField0 = taosArrayGet(pAlter->pFields, 0);
502✔
2741
      code = mndAlterStbTagBytes(pMnode, pOld, &stbObj, pField0);
502✔
2742
      break;
502✔
2743
    case TSDB_ALTER_TABLE_ADD_COLUMN:
2,291✔
2744
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 0);
2,291✔
2745
      break;
2,291✔
2746
    case TSDB_ALTER_TABLE_DROP_COLUMN:
1,030✔
2747
      pField0 = taosArrayGet(pAlter->pFields, 0);
1,030✔
2748
      code = mndDropSuperTableColumn(pMnode, pOld, &stbObj, pField0->name);
1,030✔
2749
      break;
1,030✔
2750
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES:
797✔
2751
      pField0 = taosArrayGet(pAlter->pFields, 0);
797✔
2752
      code = mndAlterStbColumnBytes(pMnode, pOld, &stbObj, pField0);
797✔
2753
      break;
797✔
2754
    case TSDB_ALTER_TABLE_UPDATE_OPTIONS:
34✔
2755
      needRsp = false;
34✔
2756
      code = mndUpdateTableOptions(pOld, &stbObj, pAlter->comment, pAlter->commentLen, pAlter->ttl, pAlter->keep);
34✔
2757
      break;
34✔
2758
    case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS:
86✔
2759
      code = mndUpdateSuperTableColumnCompress(pMnode, pOld, &stbObj, pAlter->pFields, pAlter->numOfFields);
86✔
2760
      break;
86✔
2761
    case TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COMPRESS_OPTION:
242✔
2762
      code = mndAddSuperTableColumn(pOld, &stbObj, pAlter, pAlter->numOfFields, 1);
242✔
2763
      break;
242✔
2764
    default:
×
2765
      needRsp = false;
×
2766
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
2767
      break;
×
2768
  }
2769

2770
  if (code != 0) goto _OVER;
6,993✔
2771
  if (updateTagIndex == false) {
5,435✔
2772
    code = mndAlterStbImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen);
4,359✔
2773
  } else {
2774
    code = mndAlterStbAndUpdateTagIdxImp(pMnode, pReq, pDb, &stbObj, needRsp, pReq->pCont, pReq->contLen, pAlter);
1,076✔
2775
  }
2776

2777
_OVER:
6,993✔
2778
  taosMemoryFreeClear(stbObj.pTags);
6,993!
2779
  taosMemoryFreeClear(stbObj.pColumns);
6,993!
2780
  taosMemoryFreeClear(stbObj.pCmpr);
6,993!
2781
  if (pAlter->commentLen > 0) {
6,993✔
2782
    taosMemoryFreeClear(stbObj.comment);
23!
2783
  }
2784
  taosMemoryFreeClear(stbObj.pExtSchemas);
6,993!
2785
  TAOS_RETURN(code);
6,993✔
2786
}
2787

2788
static int32_t mndProcessAlterStbReq(SRpcMsg *pReq) {
7,019✔
2789
  SMnode       *pMnode = pReq->info.node;
7,019✔
2790
  int32_t       code = -1;
7,019✔
2791
  SDbObj       *pDb = NULL;
7,019✔
2792
  SStbObj      *pStb = NULL;
7,019✔
2793
  SMAlterStbReq alterReq = {0};
7,019✔
2794

2795
  if (tDeserializeSMAlterStbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
7,019!
2796
    code = TSDB_CODE_INVALID_MSG;
×
2797
    goto _OVER;
×
2798
  }
2799

2800
  mInfo("stb:%s, start to alter", alterReq.name);
7,019!
2801
  if (mndCheckAlterStbReq(&alterReq) != 0) goto _OVER;
7,019!
2802

2803
  pDb = mndAcquireDbByStb(pMnode, alterReq.name);
7,019✔
2804
  if (pDb == NULL) {
7,019✔
2805
    code = TSDB_CODE_MND_DB_NOT_EXIST;
2✔
2806
    goto _OVER;
2✔
2807
  }
2808
  if (pDb->cfg.isMount) {
7,017!
2809
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
2810
    goto _OVER;
×
2811
  }
2812

2813
  pStb = mndAcquireStb(pMnode, alterReq.name);
7,017✔
2814
  if (pStb == NULL) {
7,017✔
2815
    code = TSDB_CODE_MND_STB_NOT_EXIST;
24✔
2816
    goto _OVER;
24✔
2817
  }
2818

2819
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
6,993!
2820
    goto _OVER;
×
2821
  }
2822

2823
  code = mndAlterStb(pMnode, pReq, &alterReq, pDb, pStb);
6,993✔
2824
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
6,993✔
2825

2826
  SName   name = {0};
6,993✔
2827
  int32_t ret = 0;
6,993✔
2828
  if ((ret = tNameFromString(&name, alterReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
6,993!
2829
    mError("stb:%s, failed to tNameFromString since %s", alterReq.name, tstrerror(ret));
×
2830

2831
  auditRecord(pReq, pMnode->clusterId, "alterStb", name.dbname, name.tname, alterReq.sql, alterReq.sqlLen);
6,993✔
2832

2833
_OVER:
7,019✔
2834
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
7,019!
2835
    mError("stb:%s, failed to alter since %s", alterReq.name, tstrerror(code));
1,604!
2836
  }
2837

2838
  mndReleaseStb(pMnode, pStb);
7,019✔
2839
  mndReleaseDb(pMnode, pDb);
7,019✔
2840
  tFreeSMAltertbReq(&alterReq);
7,019✔
2841

2842
  TAOS_RETURN(code);
7,019✔
2843
}
2844

2845
static int32_t mndSetDropStbPrepareLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
834✔
2846
  int32_t  code = 0;
834✔
2847
  SSdbRaw *pRedoRaw = mndStbActionEncode(pStb);
834✔
2848
  if (pRedoRaw == NULL) {
834!
2849
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2850
    if (terrno != 0) code = terrno;
×
2851
    TAOS_RETURN(code);
×
2852
  }
2853
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
834!
2854
    sdbFreeRaw(pRedoRaw);
×
2855
    TAOS_RETURN(code);
×
2856
  }
2857
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
834!
2858

2859
  TAOS_RETURN(code);
834✔
2860
}
2861

2862
static int32_t mndSetDropStbCommitLogs(SMnode *pMnode, STrans *pTrans, SStbObj *pStb) {
834✔
2863
  int32_t  code = 0;
834✔
2864
  SSdbRaw *pCommitRaw = mndStbActionEncode(pStb);
834✔
2865
  if (pCommitRaw == NULL) {
834!
2866
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2867
    if (terrno != 0) code = terrno;
×
2868
    TAOS_RETURN(code);
×
2869
  }
2870
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
834!
2871
    sdbFreeRaw(pCommitRaw);
×
2872
    TAOS_RETURN(code);
×
2873
  }
2874
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
834!
2875

2876
  TAOS_RETURN(code);
834✔
2877
}
2878

2879
static int32_t mndSetDropStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
834✔
2880
  int32_t code = 0;
834✔
2881
  SSdb   *pSdb = pMnode->pSdb;
834✔
2882
  SVgObj *pVgroup = NULL;
834✔
2883
  void   *pIter = NULL;
834✔
2884

2885
  while (1) {
2,478✔
2886
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3,312✔
2887
    if (pIter == NULL) break;
3,312✔
2888
    if (!mndVgroupInDb(pVgroup, pDb->uid)) {
2,478✔
2889
      sdbRelease(pSdb, pVgroup);
626✔
2890
      continue;
626✔
2891
    }
2892

2893
    int32_t contLen = 0;
1,852✔
2894
    void   *pReq = mndBuildVDropStbReq(pMnode, pVgroup, pStb, &contLen);
1,852✔
2895
    if (pReq == NULL) {
1,852!
2896
      sdbCancelFetch(pSdb, pIter);
×
2897
      sdbRelease(pSdb, pVgroup);
×
2898
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2899
      TAOS_RETURN(code);
×
2900
    }
2901

2902
    STransAction action = {0};
1,852✔
2903
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
1,852✔
2904
    action.pCont = pReq;
1,852✔
2905
    action.contLen = contLen;
1,852✔
2906
    action.msgType = TDMT_VND_DROP_STB;
1,852✔
2907
    action.acceptableCode = TSDB_CODE_TDB_STB_NOT_EXIST;
1,852✔
2908
    if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
1,852!
2909
      taosMemoryFree(pReq);
×
2910
      sdbCancelFetch(pSdb, pIter);
×
2911
      sdbRelease(pSdb, pVgroup);
×
2912
      TAOS_RETURN(code);
×
2913
    }
2914
    sdbRelease(pSdb, pVgroup);
1,852✔
2915
  }
2916

2917
  TAOS_RETURN(code);
834✔
2918
}
2919

2920
static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb) {
834✔
2921
  int32_t code = -1;
834✔
2922
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stb");
834✔
2923
  if (pTrans == NULL) {
834!
2924
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2925
    if (terrno != 0) code = terrno;
×
2926
    goto _OVER;
×
2927
  }
2928

2929
  mInfo("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
834!
2930
  mndTransSetDbName(pTrans, pDb->name, pStb->name);
834✔
2931
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
834!
2932

2933
  TAOS_CHECK_GOTO(mndSetDropStbPrepareLogs(pMnode, pTrans, pStb), NULL, _OVER);
834!
2934
  TAOS_CHECK_GOTO(mndSetDropStbCommitLogs(pMnode, pTrans, pStb), NULL, _OVER);
834!
2935
  TAOS_CHECK_GOTO(mndSetDropStbRedoActions(pMnode, pTrans, pDb, pStb), NULL, _OVER);
834!
2936
  TAOS_CHECK_GOTO(mndDropIdxsByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
834!
2937
  TAOS_CHECK_GOTO(mndDropSmasByStb(pMnode, pTrans, pDb, pStb), NULL, _OVER);
834!
2938
  TAOS_CHECK_GOTO(mndUserRemoveStb(pMnode, pTrans, pStb->name), NULL, _OVER);
834!
2939
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
834!
2940
  code = 0;
834✔
2941

2942
_OVER:
834✔
2943
  mndTransDrop(pTrans);
834✔
2944
  TAOS_RETURN(code);
834✔
2945
}
2946

2947
static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, int64_t suid) {
838✔
2948
  int32_t code = 0;
838✔
2949
  SSdb   *pSdb = pMnode->pSdb;
838✔
2950
  void   *pIter = NULL;
838✔
2951
  while (1) {
98✔
2952
    SMqTopicObj *pTopic = NULL;
936✔
2953
    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
936✔
2954
    if (pIter == NULL) break;
936✔
2955

2956
    if (pTopic->subType == TOPIC_SUB_TYPE__TABLE) {
98✔
2957
      if (pTopic->stbUid == suid) {
14!
2958
        sdbRelease(pSdb, pTopic);
×
2959
        sdbCancelFetch(pSdb, pIter);
×
2960
        TAOS_RETURN(-1);
×
2961
      }
2962
    }
2963

2964
    if (pTopic->ast == NULL) {
98✔
2965
      sdbRelease(pSdb, pTopic);
38✔
2966
      continue;
38✔
2967
    }
2968

2969
    SNode *pAst = NULL;
60✔
2970
    if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
60!
2971
      code = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
×
2972
      mError("topic:%s, create ast error", pTopic->name);
×
2973
      sdbRelease(pSdb, pTopic);
×
2974
      sdbCancelFetch(pSdb, pIter);
×
2975
      TAOS_RETURN(code);
×
2976
    }
2977

2978
    SNodeList *pNodeList = NULL;
60✔
2979
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
60!
2980
        0) {
2981
      sdbRelease(pSdb, pTopic);
×
2982
      sdbCancelFetch(pSdb, pIter);
×
2983
      TAOS_RETURN(code);
×
2984
    }
2985
    SNode *pNode = NULL;
60✔
2986
    FOREACH(pNode, pNodeList) {
60✔
2987
      SColumnNode *pCol = (SColumnNode *)pNode;
46✔
2988

2989
      if (pCol->tableId == suid) {
46!
2990
        sdbRelease(pSdb, pTopic);
×
2991
        nodesDestroyNode(pAst);
×
2992
        nodesDestroyList(pNodeList);
×
2993
        sdbCancelFetch(pSdb, pIter);
×
2994
        TAOS_RETURN(-1);
×
2995
      } else {
2996
        goto NEXT;
46✔
2997
      }
2998
    }
2999
  NEXT:
14✔
3000
    sdbRelease(pSdb, pTopic);
60✔
3001
    nodesDestroyNode(pAst);
60✔
3002
    nodesDestroyList(pNodeList);
60✔
3003
  }
3004
  TAOS_RETURN(code);
838✔
3005
}
3006

3007
static int32_t mndCheckDropStbForStream(SMnode *pMnode, const char *stbFullName, int64_t suid) {
838✔
3008
  int32_t code = 0;
838✔
3009
  SSdb   *pSdb = pMnode->pSdb;
838✔
3010
  void   *pIter = NULL;
838✔
3011
  while (1) {
43✔
3012
    SStreamObj *pStream = NULL;
881✔
3013
    pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
881✔
3014
    if (pIter == NULL) break;
881✔
3015

3016
    if (pStream->targetStbUid == suid) {
47!
3017
      sdbCancelFetch(pSdb, pIter);
×
3018
      sdbRelease(pSdb, pStream);
×
3019
      TAOS_RETURN(-1);
4✔
3020
    }
3021

3022
    SNode *pAst = NULL;
47✔
3023
    if (nodesStringToNode(pStream->ast, &pAst) != 0) {
47!
3024
      code = TSDB_CODE_MND_INVALID_STREAM_OPTION;
×
3025
      mError("stream:%s, create ast error", pStream->name);
×
3026
      sdbCancelFetch(pSdb, pIter);
×
3027
      sdbRelease(pSdb, pStream);
×
3028
      TAOS_RETURN(code);
×
3029
    }
3030

3031
    SNodeList *pNodeList = NULL;
47✔
3032
    if ((code = nodesCollectColumns((SSelectStmt *)pAst, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pNodeList)) !=
47!
3033
        0) {
3034
      sdbCancelFetch(pSdb, pIter);
×
3035
      sdbRelease(pSdb, pStream);
×
3036
      TAOS_RETURN(code);
×
3037
    }
3038
    SNode *pNode = NULL;
47✔
3039
    FOREACH(pNode, pNodeList) {
47!
3040
      SColumnNode *pCol = (SColumnNode *)pNode;
47✔
3041

3042
      if (pCol->tableId == suid) {
47✔
3043
        sdbCancelFetch(pSdb, pIter);
4✔
3044
        sdbRelease(pSdb, pStream);
4✔
3045
        nodesDestroyNode(pAst);
4✔
3046
        nodesDestroyList(pNodeList);
4✔
3047
        TAOS_RETURN(-1);
4✔
3048
      } else {
3049
        goto NEXT;
43✔
3050
      }
3051
    }
3052
  NEXT:
×
3053
    sdbRelease(pSdb, pStream);
43✔
3054
    nodesDestroyNode(pAst);
43✔
3055
    nodesDestroyList(pNodeList);
43✔
3056
  }
3057
  TAOS_RETURN(code);
834✔
3058
}
3059

3060
static int32_t mndProcessDropTtltbRsp(SRpcMsg *pRsp) { return 0; }
×
3061
static int32_t mndProcessTrimDbRsp(SRpcMsg *pRsp) { return 0; }
4✔
3062
static int32_t mndProcessS3MigrateDbRsp(SRpcMsg *pRsp) { return 0; }
×
3063

3064
static int32_t mndProcessDropStbReq(SRpcMsg *pReq) {
1,487✔
3065
  SMnode      *pMnode = pReq->info.node;
1,487✔
3066
  int32_t      code = -1;
1,487✔
3067
  SDbObj      *pDb = NULL;
1,487✔
3068
  SStbObj     *pStb = NULL;
1,487✔
3069
  SMDropStbReq dropReq = {0};
1,487✔
3070

3071
  TAOS_CHECK_GOTO(tDeserializeSMDropStbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
1,487!
3072

3073
  mInfo("stb:%s, start to drop", dropReq.name);
1,487!
3074

3075
  pStb = mndAcquireStb(pMnode, dropReq.name);
1,487✔
3076
  if (pStb == NULL) {
1,487✔
3077
    if (dropReq.igNotExists) {
649✔
3078
      mInfo("stb:%s, not exist, ignore not exist is set", dropReq.name);
646!
3079
      code = 0;
646✔
3080
      goto _OVER;
646✔
3081
    } else {
3082
      code = TSDB_CODE_MND_STB_NOT_EXIST;
3✔
3083
      goto _OVER;
3✔
3084
    }
3085
  }
3086

3087
  if ((dropReq.source == TD_REQ_FROM_TAOX_OLD || dropReq.source == TD_REQ_FROM_TAOX) && pStb->uid != dropReq.suid) {
838!
3088
    code = 0;
×
3089
    goto _OVER;
×
3090
  }
3091

3092
  pDb = mndAcquireDbByStb(pMnode, dropReq.name);
838✔
3093
  if (pDb == NULL) {
838!
3094
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3095
    goto _OVER;
×
3096
  }
3097

3098
  if ((code = mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb)) != 0) {
838!
3099
    goto _OVER;
×
3100
  }
3101

3102
  if (mndCheckDropStbForTopic(pMnode, dropReq.name, pStb->uid) < 0) {
838!
3103
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
×
3104
    goto _OVER;
×
3105
  }
3106

3107
  if (mndCheckDropStbForStream(pMnode, dropReq.name, pStb->uid) < 0) {
838✔
3108
    code = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
4✔
3109
    goto _OVER;
4✔
3110
  }
3111

3112
  if (pDb->cfg.isMount) {
834!
3113
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
3114
    goto _OVER;
×
3115
  }
3116

3117
  code = mndDropStb(pMnode, pReq, pDb, pStb);
834✔
3118
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
834!
3119

3120
  SName   name = {0};
834✔
3121
  int32_t ret = 0;
834✔
3122
  if ((ret = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) != 0)
834!
3123
    mError("stb:%s, failed to tNameFromString since %s", dropReq.name, tstrerror(ret));
×
3124

3125
  auditRecord(pReq, pMnode->clusterId, "dropStb", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen);
834✔
3126

3127
_OVER:
1,487✔
3128
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,487✔
3129
    mError("stb:%s, failed to drop since %s", dropReq.name, tstrerror(code));
7!
3130
  }
3131

3132
  mndReleaseDb(pMnode, pDb);
1,487✔
3133
  mndReleaseStb(pMnode, pStb);
1,487✔
3134
  tFreeSMDropStbReq(&dropReq);
1,487✔
3135
  TAOS_RETURN(code);
1,487✔
3136
}
3137

3138
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
38,130✔
3139
  SMnode       *pMnode = pReq->info.node;
38,130✔
3140
  int32_t       code = -1;
38,130✔
3141
  STableInfoReq infoReq = {0};
38,130✔
3142
  STableMetaRsp metaRsp = {0};
38,130✔
3143
  SUserObj     *pUser = NULL;
38,130✔
3144

3145
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
38,130✔
3146
  if (pUser == NULL) return 0;
38,130!
3147
  bool sysinfo = pUser->sysInfo;
38,130✔
3148

3149
  TAOS_CHECK_GOTO(tDeserializeSTableInfoReq(pReq->pCont, pReq->contLen, &infoReq), NULL, _OVER);
38,130!
3150

3151
  if (0 == strcmp(infoReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
38,130✔
3152
    mInfo("information_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
4,260!
3153
    TAOS_CHECK_GOTO(mndBuildInsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, sysinfo, &metaRsp), NULL, _OVER);
4,260✔
3154
  } else if (0 == strcmp(infoReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
33,870✔
3155
    mInfo("performance_schema table:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
331!
3156
    TAOS_CHECK_GOTO(mndBuildPerfsTableSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
331✔
3157
  } else {
3158
    mInfo("stb:%s.%s, start to retrieve meta", infoReq.dbFName, infoReq.tbName);
33,539!
3159
    TAOS_CHECK_GOTO(mndBuildStbSchema(pMnode, infoReq.dbFName, infoReq.tbName, &metaRsp), NULL, _OVER);
33,539✔
3160
  }
3161

3162
  int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
36,030✔
3163
  if (rspLen < 0) {
36,030!
3164
    code = TSDB_CODE_INVALID_MSG;
×
3165
    goto _OVER;
×
3166
  }
3167

3168
  void *pRsp = rpcMallocCont(rspLen);
36,030✔
3169
  if (pRsp == NULL) {
36,029!
3170
    code = terrno;
×
3171
    goto _OVER;
×
3172
  }
3173

3174
  if ((rspLen = tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp)) < 0) {
36,029!
3175
    code = rspLen;
×
3176
    goto _OVER;
×
3177
  }
3178
  pReq->info.rsp = pRsp;
36,030✔
3179
  pReq->info.rspLen = rspLen;
36,030✔
3180
  code = 0;
36,030✔
3181

3182
  mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
36,030✔
3183

3184
_OVER:
31,594✔
3185
  if (code != 0) {
38,130✔
3186
    mError("stb:%s.%s, failed to retrieve meta since %s", infoReq.dbFName, infoReq.tbName, tstrerror(code));
2,100!
3187
  }
3188

3189
  mndReleaseUser(pMnode, pUser);
38,130✔
3190
  tFreeSTableMetaRsp(&metaRsp);
38,130✔
3191
  // TODO change to TAOS_RETURN
3192
  return code;
38,128✔
3193
}
3194

3195
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
96✔
3196
  SMnode      *pMnode = pReq->info.node;
96✔
3197
  int32_t      code = -1;
96✔
3198
  STableCfgReq cfgReq = {0};
96✔
3199
  STableCfgRsp cfgRsp = {0};
96✔
3200

3201
  TAOS_CHECK_GOTO(tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
96!
3202

3203
  char dbName[TSDB_DB_NAME_LEN] = {0};
96✔
3204
  TAOS_CHECK_GOTO(mndExtractShortDbNameFromDbFullName(cfgReq.dbFName, dbName), NULL, _OVER);
96!
3205
  if (0 == strcmp(dbName, TSDB_INFORMATION_SCHEMA_DB)) {
96✔
3206
    mInfo("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
20!
3207
    TAOS_CHECK_GOTO(mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
20!
3208
  } else if (0 == strcmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB)) {
76✔
3209
    mInfo("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
10!
3210
    TAOS_CHECK_GOTO(mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
10!
3211
  } else {
3212
    mInfo("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
66!
3213
    TAOS_CHECK_GOTO(mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp), NULL, _OVER);
66!
3214
  }
3215

3216
  int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
96✔
3217
  if (rspLen < 0) {
96!
3218
    code = TSDB_CODE_INVALID_MSG;
×
3219
    goto _OVER;
×
3220
  }
3221

3222
  void *pRsp = rpcMallocCont(rspLen);
96✔
3223
  if (pRsp == NULL) {
96!
3224
    code = terrno;
×
3225
    goto _OVER;
×
3226
  }
3227

3228
  if ((rspLen = tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp)) < 0) {
96!
3229
    code = rspLen;
×
3230
    goto _OVER;
×
3231
  }
3232
  pReq->info.rsp = pRsp;
96✔
3233
  pReq->info.rspLen = rspLen;
96✔
3234
  code = 0;
96✔
3235

3236
  mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
96✔
3237

3238
_OVER:
81✔
3239
  if (code != 0) {
96!
3240
    mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, tstrerror(code));
×
3241
  }
3242

3243
  tFreeSTableCfgRsp(&cfgRsp);
96✔
3244
  TAOS_RETURN(code);
96✔
3245
}
3246

3247
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
8,394✔
3248
                           int32_t *pRspLen) {
3249
  int32_t   code = 0;
8,394✔
3250
  SSTbHbRsp hbRsp = {0};
8,394✔
3251
  hbRsp.pMetaRsp = taosArrayInit(numOfStbs, sizeof(STableMetaRsp));
8,394✔
3252
  if (hbRsp.pMetaRsp == NULL) {
8,394!
3253
    code = terrno;
×
3254
    TAOS_RETURN(code);
×
3255
  }
3256

3257
  hbRsp.pIndexRsp = taosArrayInit(numOfStbs, sizeof(STableIndexRsp));
8,394✔
3258
  if (NULL == hbRsp.pIndexRsp) {
8,394!
3259
    taosArrayDestroy(hbRsp.pMetaRsp);
×
3260
    code = terrno;
×
3261
    TAOS_RETURN(code);
×
3262
  }
3263

3264
  for (int32_t i = 0; i < numOfStbs; ++i) {
21,059✔
3265
    SSTableVersion *pStbVersion = &pStbVersions[i];
12,665✔
3266
    pStbVersion->suid = be64toh(pStbVersion->suid);
12,665✔
3267
    pStbVersion->sversion = ntohl(pStbVersion->sversion);
12,665✔
3268
    pStbVersion->tversion = ntohl(pStbVersion->tversion);
12,665✔
3269
    pStbVersion->smaVer = ntohl(pStbVersion->smaVer);
12,665✔
3270

3271
    bool    schema = false;
12,665✔
3272
    bool    sma = false;
12,665✔
3273
    int32_t code = mndValidateStbVersion(pMnode, pStbVersion, &schema, &sma);
12,665✔
3274
    if (TSDB_CODE_SUCCESS != code) {
12,665✔
3275
      STableMetaRsp metaRsp = {0};
557✔
3276
      metaRsp.numOfColumns = -1;
557✔
3277
      metaRsp.suid = pStbVersion->suid;
557✔
3278
      tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
557✔
3279
      tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
557✔
3280
      tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
557✔
3281
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
1,114!
3282
        code = terrno;
×
3283
        return code;
×
3284
      }
3285
      continue;
557✔
3286
    }
3287

3288
    if (schema) {
12,108✔
3289
      STableMetaRsp metaRsp = {0};
122✔
3290
      mInfo("stb:%s.%s, start to retrieve meta", pStbVersion->dbFName, pStbVersion->stbName);
122!
3291
      if (mndBuildStbSchema(pMnode, pStbVersion->dbFName, pStbVersion->stbName, &metaRsp) != 0) {
122!
3292
        metaRsp.numOfColumns = -1;
×
3293
        metaRsp.suid = pStbVersion->suid;
×
3294
        tstrncpy(metaRsp.dbFName, pStbVersion->dbFName, sizeof(metaRsp.dbFName));
×
3295
        tstrncpy(metaRsp.tbName, pStbVersion->stbName, sizeof(metaRsp.tbName));
×
3296
        tstrncpy(metaRsp.stbName, pStbVersion->stbName, sizeof(metaRsp.stbName));
×
3297
        if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
×
3298
          code = terrno;
×
3299
          return code;
×
3300
        }
3301
        continue;
×
3302
      }
3303

3304
      if (taosArrayPush(hbRsp.pMetaRsp, &metaRsp) == NULL) {
244!
3305
        code = terrno;
×
3306
        return code;
×
3307
      }
3308
    }
3309

3310
    if (sma) {
12,108!
3311
      bool           exist = false;
×
3312
      char           tbFName[TSDB_TABLE_FNAME_LEN];
3313
      STableIndexRsp indexRsp = {0};
×
3314
      indexRsp.pIndex = taosArrayInit(10, sizeof(STableIndexInfo));
×
3315
      if (NULL == indexRsp.pIndex) {
×
3316
        code = terrno;
×
3317
        TAOS_RETURN(code);
×
3318
      }
3319

3320
      (void)tsnprintf(tbFName, sizeof(tbFName), "%s.%s", pStbVersion->dbFName, pStbVersion->stbName);
×
3321
      int32_t code = mndGetTableSma(pMnode, tbFName, &indexRsp, &exist);
×
3322
      if (code || !exist) {
×
3323
        indexRsp.suid = pStbVersion->suid;
×
3324
        indexRsp.version = -1;
×
3325
        indexRsp.pIndex = NULL;
×
3326
      }
3327

3328
      tstrncpy(indexRsp.dbFName, pStbVersion->dbFName, sizeof(indexRsp.dbFName));
×
3329
      tstrncpy(indexRsp.tbName, pStbVersion->stbName, sizeof(indexRsp.tbName));
×
3330

3331
      if (taosArrayPush(hbRsp.pIndexRsp, &indexRsp) == NULL) {
×
3332
        code = terrno;
×
3333
        return code;
×
3334
      }
3335
    }
3336
  }
3337

3338
  int32_t rspLen = tSerializeSSTbHbRsp(NULL, 0, &hbRsp);
8,394✔
3339
  if (rspLen < 0) {
8,394!
3340
    tFreeSSTbHbRsp(&hbRsp);
×
3341
    code = TSDB_CODE_INVALID_MSG;
×
3342
    TAOS_RETURN(code);
×
3343
  }
3344

3345
  void *pRsp = taosMemoryMalloc(rspLen);
8,394!
3346
  if (pRsp == NULL) {
8,394!
3347
    tFreeSSTbHbRsp(&hbRsp);
×
3348
    code = terrno;
×
3349
    TAOS_RETURN(code);
×
3350
  }
3351

3352
  rspLen = tSerializeSSTbHbRsp(pRsp, rspLen, &hbRsp);
8,394✔
3353
  tFreeSSTbHbRsp(&hbRsp);
8,394✔
3354
  if (rspLen < 0) return rspLen;
8,394!
3355
  *ppRsp = pRsp;
8,394✔
3356
  *pRspLen = rspLen;
8,394✔
3357
  TAOS_RETURN(code);
8,394✔
3358
}
3359

3360
int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs) {
8,420✔
3361
  int32_t code = 0;
8,420✔
3362
  SSdb   *pSdb = pMnode->pSdb;
8,420✔
3363
  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
8,420✔
3364
  if (pDb == NULL) {
8,420!
3365
    code = TSDB_CODE_MND_DB_NOT_SELECTED;
×
3366
    TAOS_RETURN(code);
×
3367
  }
3368

3369
  int32_t numOfStbs = 0;
8,420✔
3370
  void   *pIter = NULL;
8,420✔
3371
  while (1) {
123,922✔
3372
    SStbObj *pStb = NULL;
132,342✔
3373
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
132,342✔
3374
    if (pIter == NULL) break;
132,342✔
3375

3376
    if (pStb->dbUid == pDb->uid) {
123,922✔
3377
      numOfStbs++;
88,448✔
3378
    }
3379

3380
    sdbRelease(pSdb, pStb);
123,922✔
3381
  }
3382

3383
  *pNumOfStbs = numOfStbs;
8,420✔
3384
  mndReleaseDb(pMnode, pDb);
8,420✔
3385
  TAOS_RETURN(code);
8,420✔
3386
}
3387

3388
int32_t mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
×
3389
  SName name = {0};
×
3390
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
3391

3392
  TAOS_CHECK_RETURN(tNameGetFullDbName(&name, dst));
×
3393

3394
  return 0;
×
3395
}
3396

3397
int32_t mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
4✔
3398
  SName name = {0};
4✔
3399
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
4!
3400

3401
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
4!
3402

3403
  return 0;
4✔
3404
}
3405

3406
int32_t mndExtractShortDbNameFromDbFullName(const char *stbFullName, char *dst) {
96✔
3407
  SName name = {0};
96✔
3408
  TAOS_CHECK_RETURN(tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB));
96!
3409

3410
  TAOS_CHECK_RETURN(tNameGetDbName(&name, dst));
96!
3411

3412
  return 0;
96✔
3413
}
3414

3415
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
4,156✔
3416
  int32_t pos = -1;
4,156✔
3417
  int32_t num = 0;
4,156✔
3418
  for (pos = 0; stbFullName[pos] != 0; ++pos) {
26,546!
3419
    if (stbFullName[pos] == TS_PATH_DELIMITER[0]) num++;
26,546✔
3420
    if (num == 2) break;
26,546✔
3421
  }
3422

3423
  if (num == 2) {
4,156!
3424
    tstrncpy(dst, stbFullName + pos + 1, dstSize);
4,156✔
3425
  }
3426
}
4,156✔
3427

3428
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
1,040✔
3429
  SMnode  *pMnode = pReq->info.node;
1,040✔
3430
  SSdb    *pSdb = pMnode->pSdb;
1,040✔
3431
  int32_t  numOfRows = 0;
1,040✔
3432
  SStbObj *pStb = NULL;
1,040✔
3433
  int32_t  cols = 0;
1,040✔
3434
  int32_t  lino = 0;
1,040✔
3435
  int32_t  code = 0;
1,040✔
3436

3437
  SDbObj *pDb = NULL;
1,040✔
3438
  if (strlen(pShow->db) > 0) {
1,040✔
3439
    pDb = mndAcquireDb(pMnode, pShow->db);
903✔
3440
    if (pDb == NULL) return terrno;
903✔
3441
  }
3442

3443
  while (numOfRows < rows) {
6,023✔
3444
    pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
6,014✔
3445
    if (pShow->pIter == NULL) break;
6,014✔
3446

3447
    if (pDb != NULL && pStb->dbUid != pDb->uid) {
4,990✔
3448
      sdbRelease(pSdb, pStb);
1,386✔
3449
      continue;
1,398✔
3450
    }
3451

3452
    if (isTsmaResSTb(pStb->name)) {
3,604✔
3453
      sdbRelease(pSdb, pStb);
12✔
3454
      continue;
12✔
3455
    }
3456

3457
    cols = 0;
3,592✔
3458

3459
    SName name = {0};
3,592✔
3460

3461
    char stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
3,592✔
3462
    mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
3,592✔
3463
    varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
3,592✔
3464
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3465
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _ERROR);
3,592!
3466

3467
    char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
3,592✔
3468
    RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _ERROR);
3,592!
3469
    RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _ERROR);
3,592!
3470
    varDataSetLen(db, strlen(varDataVal(db)));
3,592✔
3471
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3472
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _ERROR);
3,592!
3473

3474
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3475
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false), pStb, &lino,
3,592!
3476
                        _ERROR);
3477

3478
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3479
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false), pStb, &lino,
3,592!
3480
                        _ERROR);
3481

3482
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3483
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false), pStb, &lino, _ERROR);
3,592!
3484

3485
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3486
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false), pStb, &lino,
3,592!
3487
                        _ERROR);  // number of tables
3488

3489
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3490
    if (pStb->commentLen > 0) {
3,592✔
3491
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
81✔
3492
      STR_TO_VARSTR(comment, pStb->comment);
81✔
3493
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
81!
3494
    } else if (pStb->commentLen == 0) {
3,511✔
3495
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
61✔
3496
      STR_TO_VARSTR(comment, "");
61✔
3497
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, comment, false), pStb, &lino, _ERROR);
61!
3498
    } else {
3499
      colDataSetNULL(pColInfo, numOfRows);
3,450!
3500
    }
3501

3502
    char watermark[64 + VARSTR_HEADER_SIZE] = {0};
3,592✔
3503
    (void)tsnprintf(varDataVal(watermark), sizeof(watermark) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
3,592✔
3504
              pStb->watermark[0], pStb->watermark[1]);
3,592✔
3505
    varDataSetLen(watermark, strlen(varDataVal(watermark)));
3,592✔
3506

3507
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3508
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false), pStb, &lino, _ERROR);
3,592!
3509

3510
    char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
3,592✔
3511
    (void)tsnprintf(varDataVal(maxDelay), sizeof(maxDelay) - VARSTR_HEADER_SIZE, "%" PRId64 "a,%" PRId64 "a",
3,592✔
3512
              pStb->maxdelay[0], pStb->maxdelay[1]);
3,592✔
3513
    varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
3,592✔
3514

3515
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3516
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false), pStb, &lino, _ERROR);
3,592!
3517

3518
    char    rollup[160 + VARSTR_HEADER_SIZE] = {0};
3,592✔
3519
    int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
3,592✔
3520
    char   *sep = ", ";
3,592✔
3521
    int32_t sepLen = strlen(sep);
3,592✔
3522
    int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
3,592✔
3523
    for (int32_t i = 0; i < rollupNum; ++i) {
3,596✔
3524
      char *funcName = taosArrayGet(pStb->pFuncs, i);
4✔
3525
      if (i) {
4!
3526
        (void)strncat(varDataVal(rollup), sep, rollupLen);
×
3527
        rollupLen -= sepLen;
×
3528
      }
3529
      (void)strncat(varDataVal(rollup), funcName, rollupLen);
4✔
3530
      rollupLen -= strlen(funcName);
4✔
3531
    }
3532
    varDataSetLen(rollup, strlen(varDataVal(rollup)));
3,592✔
3533

3534
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3535
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false), pStb, &lino, _ERROR);
3,592!
3536

3537
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3538
    if (pColInfo) {
3,592!
3539
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->uid), false), pStb, &lino, _ERROR);
3,592!
3540
    }
3541

3542
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3543
    if (pColInfo) {
3,592!
3544
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->virtualStb), false), pStb, &lino, _ERROR);
3,592!
3545
    }
3546

3547
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
3,592✔
3548
    if (pColInfo) {
3,592!
3549
      RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)(&pStb->keep), false), pStb, &lino, _ERROR);
3,592!
3550
    }
3551

3552
    numOfRows++;
3,592✔
3553
    sdbRelease(pSdb, pStb);
3,592✔
3554
  }
3555

3556
  if (pDb != NULL) {
1,033✔
3557
    mndReleaseDb(pMnode, pDb);
896✔
3558
  }
3559

3560
  goto _OVER;
1,033✔
3561

3562
_ERROR:
×
3563
  mError("show:0x%" PRIx64 ", failed to retrieve data at %s:%d since %s", pShow->id, __FUNCTION__, lino,
×
3564
         tstrerror(code));
3565

3566
_OVER:
×
3567
  pShow->numOfRows += numOfRows;
1,033✔
3568
  return numOfRows;
1,033✔
3569
}
3570

3571
static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *pSysDbTableMeta, size_t size,
13,652✔
3572
                                    const char *dbName, const char *tbName) {
3573
  char    tName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
13,652✔
3574
  char    dName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
13,652✔
3575
  char    typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
13,652✔
3576
  int32_t numOfRows = p->info.rows;
13,652✔
3577
  int32_t lino = 0;
13,652✔
3578
  int32_t code = 0;
13,652✔
3579

3580
  STR_TO_VARSTR(dName, dbName);
13,652✔
3581
  STR_TO_VARSTR(typeName, "SYSTEM_TABLE");
13,652✔
3582

3583
  for (int32_t i = 0; i < size; ++i) {
327,492✔
3584
    const SSysTableMeta *pm = &pSysDbTableMeta[i];
306,992✔
3585
    //    if (pm->sysInfo) {
3586
    //      continue;
3587
    //    }
3588
    if (tbName[0] && strncmp(tbName, pm->name, TSDB_TABLE_NAME_LEN) != 0) {
306,992!
3589
      continue;
×
3590
    }
3591

3592
    STR_TO_VARSTR(tName, pm->name);
306,992✔
3593

3594
    for (int32_t j = 0; j < pm->colNum; j++) {
3,026,850✔
3595
      // table name
3596
      SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
2,713,010✔
3597
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, tName, false), &lino, _OVER);
2,711,721!
3598

3599
      // database name
3600
      pColInfoData = taosArrayGet(p->pDataBlock, 1);
2,713,302✔
3601
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, dName, false), &lino, _OVER);
2,712,963!
3602

3603
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
2,713,263✔
3604
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, typeName, false), &lino, _OVER);
2,712,693!
3605

3606
      // col name
3607
      char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
2,712,196✔
3608
      STR_TO_VARSTR(colName, pm->schema[j].name);
2,712,196✔
3609
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
2,712,196✔
3610
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, colName, false), &lino, _OVER);
2,719,464!
3611

3612
      // col type
3613
      int8_t colType = pm->schema[j].type;
2,718,017✔
3614
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
2,718,017✔
3615
      char colTypeStr[VARSTR_HEADER_SIZE + 32];
3616
      int  colTypeLen =
2,729,532✔
3617
          tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
2,717,096✔
3618
      if (colType == TSDB_DATA_TYPE_VARCHAR) {
2,729,532✔
3619
        colTypeLen +=
1,487,670✔
3620
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
1,487,572✔
3621
                      (int32_t)(pm->schema[j].bytes - VARSTR_HEADER_SIZE));
1,487,572✔
3622
      } else if (colType == TSDB_DATA_TYPE_NCHAR) {
1,241,960!
3623
        colTypeLen +=
×
3624
            tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE, "(%d)",
×
3625
                      (int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
3626
      }
3627
      varDataSetLen(colTypeStr, colTypeLen);
2,729,630✔
3628
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false), &lino, _OVER);
2,729,630!
3629

3630
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
2,725,058✔
3631
      TAOS_CHECK_GOTO(colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false), &lino, _OVER);
2,724,653!
3632
      for (int32_t k = 6; k <= 9; ++k) {
13,540,940✔
3633
        pColInfoData = taosArrayGet(p->pDataBlock, k);
10,821,082✔
3634
        colDataSetNULL(pColInfoData, numOfRows);
10,818,486✔
3635
      }
3636

3637
      numOfRows += 1;
2,719,858✔
3638
    }
3639
  }
3640
  return numOfRows;
20,500✔
3641
_OVER:
×
3642
  mError("failed at %s:%d since %s", __FUNCTION__, lino, tstrerror(code));
×
3643
  return numOfRows;
×
3644
}
3645
#define BUILD_COL_FOR_INFO_DB 1
3646
#define BUILD_COL_FOR_PERF_DB 1 << 1
3647
#define BUILD_COL_FOR_USER_DB 1 << 2
3648
#define BUILD_COL_FOR_ALL_DB  (BUILD_COL_FOR_INFO_DB | BUILD_COL_FOR_PERF_DB | BUILD_COL_FOR_USER_DB)
3649

3650
static int32_t buildSysDbColsInfo(SSDataBlock *p, int8_t buildWhichDBs, char *tb) {
6,833✔
3651
  size_t               size = 0;
6,833✔
3652
  const SSysTableMeta *pSysDbTableMeta = NULL;
6,833✔
3653

3654
  if (buildWhichDBs & BUILD_COL_FOR_INFO_DB) {
6,833✔
3655
    getInfosDbMeta(&pSysDbTableMeta, &size);
6,826✔
3656
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, tb);
6,826✔
3657
  }
3658

3659
  if (buildWhichDBs & BUILD_COL_FOR_PERF_DB) {
6,833✔
3660
    getPerfDbMeta(&pSysDbTableMeta, &size);
6,826✔
3661
    p->info.rows = buildDbColsInfoBlock(p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, tb);
6,826✔
3662
  }
3663

3664
  return p->info.rows;
6,831✔
3665
}
3666

3667
static int8_t determineBuildColForWhichDBs(const char *db) {
6,857✔
3668
  int8_t buildWhichDBs;
3669
  if (!db[0])
6,857✔
3670
    buildWhichDBs = BUILD_COL_FOR_ALL_DB;
6,825✔
3671
  else {
3672
    char *p = strchr(db, '.');
32✔
3673
    if (p && strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) == 0) {
32!
3674
      buildWhichDBs = BUILD_COL_FOR_INFO_DB;
1✔
3675
    } else if (p && strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
31!
3676
      buildWhichDBs = BUILD_COL_FOR_PERF_DB;
1✔
3677
    } else {
3678
      buildWhichDBs = BUILD_COL_FOR_USER_DB;
30✔
3679
    }
3680
  }
3681
  return buildWhichDBs;
6,857✔
3682
}
3683

3684
static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
6,857✔
3685
  uint8_t  buildWhichDBs;
3686
  SMnode  *pMnode = pReq->info.node;
6,857✔
3687
  SSdb    *pSdb = pMnode->pSdb;
6,857✔
3688
  SStbObj *pStb = NULL;
6,857✔
3689
  int32_t  numOfRows = 0;
6,857✔
3690
  int32_t  lino = 0;
6,857✔
3691
  int32_t  code = 0;
6,857✔
3692

3693
  buildWhichDBs = determineBuildColForWhichDBs(pShow->db);
6,857✔
3694

3695
  if (!pShow->sysDbRsp) {
6,857✔
3696
    numOfRows = buildSysDbColsInfo(pBlock, buildWhichDBs, pShow->filterTb);
6,833✔
3697
    mDebug("mndRetrieveStbCol get system table cols, rows:%d, db:%s", numOfRows, pShow->db);
6,831!
3698
    pShow->sysDbRsp = true;
6,833✔
3699
  }
3700

3701
  if (buildWhichDBs & BUILD_COL_FOR_USER_DB) {
6,857✔
3702
    SDbObj *pDb = NULL;
6,855✔
3703
    if (strlen(pShow->db) > 0) {
6,855✔
3704
      pDb = mndAcquireDb(pMnode, pShow->db);
30✔
3705
      if (pDb == NULL && TSDB_CODE_MND_DB_NOT_EXIST != terrno && pBlock->info.rows == 0) return terrno;
30!
3706
    }
3707

3708
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
6,855✔
3709
    STR_TO_VARSTR(typeName, "SUPER_TABLE");
6,855✔
3710
    bool fetch = pShow->restore ? false : true;
6,855✔
3711
    pShow->restore = false;
6,855✔
3712
    while (numOfRows < rows) {
7,403!
3713
      if (fetch) {
7,403✔
3714
        pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
7,379✔
3715
        if (pShow->pIter == NULL) break;
7,403✔
3716
      } else {
3717
        fetch = true;
24✔
3718
        void *pKey = taosHashGetKey(pShow->pIter, NULL);
24✔
3719
        pStb = sdbAcquire(pSdb, SDB_STB, pKey);
24✔
3720
        if (!pStb) continue;
36!
3721
      }
3722

3723
      if (pDb != NULL && pStb->dbUid != pDb->uid) {
572✔
3724
        sdbRelease(pSdb, pStb);
12✔
3725
        continue;
12✔
3726
      }
3727

3728
      SName name = {0};
560✔
3729
      char  stbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
560✔
3730
      mndExtractTbNameFromStbFullName(pStb->name, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN);
560✔
3731
      if (pShow->filterTb[0] && strncmp(pShow->filterTb, &stbName[VARSTR_HEADER_SIZE], TSDB_TABLE_NAME_LEN) != 0) {
560!
3732
        sdbRelease(pSdb, pStb);
×
3733
        continue;
×
3734
      }
3735

3736
      if ((numOfRows + pStb->numOfColumns) > rows) {
560✔
3737
        pShow->restore = true;
24✔
3738
        if (numOfRows == 0) {
24!
3739
          mError("mndRetrieveStbCol failed to get stable cols since buf:%d less than result:%d, stable name:%s, db:%s",
×
3740
                 rows, pStb->numOfColumns, pStb->name, pStb->db);
3741
        }
3742
        sdbRelease(pSdb, pStb);
24✔
3743
        break;
24✔
3744
      }
3745

3746
      varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
536✔
3747

3748
      mDebug("mndRetrieveStbCol get stable cols, stable name:%s, db:%s", pStb->name, pStb->db);
536!
3749

3750
      char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
536✔
3751
      RETRIEVE_CHECK_GOTO(tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB), pStb, &lino, _OVER);
536!
3752
      RETRIEVE_CHECK_GOTO(tNameGetDbName(&name, varDataVal(db)), pStb, &lino, _OVER);
536!
3753
      varDataSetLen(db, strlen(varDataVal(db)));
536✔
3754

3755
      for (int i = 0; i < pStb->numOfColumns; i++) {
133,422✔
3756
        int32_t          cols = 0;
132,886✔
3757
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
132,886✔
3758
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false), pStb, &lino, _OVER);
132,886!
3759

3760
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
132,886✔
3761
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)db, false), pStb, &lino, _OVER);
132,886!
3762

3763
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
132,886✔
3764
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, typeName, false), pStb, &lino, _OVER);
132,886!
3765

3766
        // col name
3767
        char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
132,886✔
3768
        STR_TO_VARSTR(colName, pStb->pColumns[i].name);
132,886✔
3769
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
132,886✔
3770
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, colName, false), pStb, &lino, _OVER);
132,886!
3771

3772
        // col type
3773
        int8_t colType = pStb->pColumns[i].type;
132,886✔
3774
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
132,886✔
3775
        char colTypeStr[VARSTR_HEADER_SIZE + 32];
3776
        int  colTypeLen =
132,886✔
3777
            tsnprintf(varDataVal(colTypeStr), sizeof(colTypeStr) - VARSTR_HEADER_SIZE, "%s", tDataTypes[colType].name);
132,886✔
3778
        if (colType == TSDB_DATA_TYPE_VARCHAR) {
132,886✔
3779
          colTypeLen +=
8✔
3780
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
8✔
3781
                        "(%d)", (int32_t)(pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE));
8✔
3782
        } else if (colType == TSDB_DATA_TYPE_NCHAR) {
132,878✔
3783
          colTypeLen +=
8✔
3784
              tsnprintf(varDataVal(colTypeStr) + colTypeLen, sizeof(colTypeStr) - colTypeLen - VARSTR_HEADER_SIZE,
8✔
3785
                        "(%d)", (int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
8✔
3786
        } else if (IS_DECIMAL_TYPE(colType)) {
132,870!
3787
          STypeMod typeMod = pStb->pExtSchemas[i].typeMod;
×
3788
          uint8_t prec = 0, scale = 0;
×
3789
          decimalFromTypeMod(typeMod, &prec, &scale);
×
3790
          colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
3791
        }
3792
        varDataSetLen(colTypeStr, colTypeLen);
132,886✔
3793
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false), pStb, &lino, _OVER);
132,886!
3794

3795
        pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
132,886✔
3796
        RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false), pStb,
132,886!
3797
                            &lino, _OVER);
3798
        while (cols < pShow->numOfColumns) {
664,430✔
3799
          pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
531,544✔
3800
          colDataSetNULL(pColInfo, numOfRows);
531,544✔
3801
        }
3802
        numOfRows++;
132,886✔
3803
      }
3804

3805
      sdbRelease(pSdb, pStb);
536✔
3806
    }
3807

3808
    if (pDb != NULL) {
6,855✔
3809
      mndReleaseDb(pMnode, pDb);
30✔
3810
    }
3811
  }
3812

3813
  mDebug("mndRetrieveStbCol success, rows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows);
6,857!
3814
  goto _OVER;
6,857✔
3815

3816
_ERROR:
3817
  mError("failed to mndRetrieveStbCol, rows:%d, pShow->numOfRows:%d, at %s:%d since %s", numOfRows, pShow->numOfRows,
3818
         __FUNCTION__, lino, tstrerror(code));
3819

3820
_OVER:
6,857✔
3821
  pShow->numOfRows += numOfRows;
6,857✔
3822
  return numOfRows;
6,857✔
3823
}
3824

3825
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter) {
1✔
3826
  SSdb *pSdb = pMnode->pSdb;
1✔
3827
  sdbCancelFetchByType(pSdb, pIter, SDB_STB);
1✔
3828
}
1✔
3829

3830
const char *mndGetStbStr(const char *src) {
374✔
3831
  char *posDb = strstr(src, TS_PATH_DELIMITER);
374✔
3832
  if (posDb != NULL) ++posDb;
374!
3833
  if (posDb == NULL) return src;
374!
3834

3835
  char *posStb = strstr(posDb, TS_PATH_DELIMITER);
374✔
3836
  if (posStb != NULL) ++posStb;
374!
3837
  if (posStb == NULL) return posDb;
374!
3838
  return posStb;
374✔
3839
}
3840

3841
static int32_t mndCheckIndexReq(SCreateTagIndexReq *pReq) {
×
3842
  // impl
3843
  return TSDB_CODE_SUCCESS;
×
3844
}
3845

3846
/*int32_t mndAddIndexImpl(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *pStb, bool needRsp, void *sql,
3847
                        int32_t len) {
3848
  // impl later
3849
  int32_t code = 0;
3850
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "create-stb-index");
3851
  if (pTrans == NULL) goto _OVER;
3852

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

3857
  if (mndSetAlterStbPrepareLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3858
  if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) goto _OVER;
3859
  if (mndSetAlterStbRedoActions2(pMnode, pTrans, pDb, pStb, sql, len) != 0) goto _OVER;
3860
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
3861

3862
  return code;
3863

3864
_OVER:
3865
  mndTransDrop(pTrans);
3866
  return code;
3867
}
3868
static int32_t mndAddIndex(SMnode *pMnode, SRpcMsg *pReq, SCreateTagIndexReq *tagIdxReq, SDbObj *pDb, SStbObj *pOld) {
3869
  bool    needRsp = true;
3870
  int32_t code = -1;
3871
  SField *pField0 = NULL;
3872

3873
  SStbObj  stbObj = {0};
3874
  SStbObj *pNew = &stbObj;
3875

3876
  taosRLockLatch(&pOld->lock);
3877
  memcpy(&stbObj, pOld, sizeof(SStbObj));
3878
  taosRUnLockLatch(&pOld->lock);
3879

3880
  stbObj.pColumns = NULL;
3881
  stbObj.pTags = NULL;
3882
  stbObj.updateTime = taosGetTimestampMs();
3883
  stbObj.lock = 0;
3884

3885
  int32_t tag = mndFindSuperTableTagIndex(pOld, tagIdxReq->colName);
3886
  if (tag < 0) {
3887
    terrno = TSDB_CODE_MND_TAG_NOT_EXIST;
3888
    return -1;
3889
  }
3890
  if (mndAllocStbSchemas(pOld, pNew) != 0) {
3891
    return -1;
3892
  }
3893

3894
  SSchema *pTag = pNew->pTags + tag;
3895
  if (IS_IDX_ON(pTag)) {
3896
    terrno = TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST;
3897
    return -1;
3898
  } else {
3899
    pTag->flags |= COL_IDX_ON;
3900
  }
3901
  pNew->tagVer++;
3902

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

3905
  return code;
3906
}
3907
static int32_t mndProcessCreateIndexReq(SRpcMsg *pReq) {
3908
  SMnode            *pMnode = pReq->info.node;
3909
  int32_t            code = -1;
3910
  SDbObj            *pDb = NULL;
3911
  SStbObj           *pStb = NULL;
3912
  SCreateTagIndexReq tagIdxReq = {0};
3913

3914
  if (tDeserializeSCreateTagIdxReq(pReq->pCont, pReq->contLen, &tagIdxReq) != 0) {
3915
    terrno = TSDB_CODE_INVALID_MSG;
3916
    goto _OVER;
3917
  }
3918

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

3921
  if (mndCheckIndexReq(&tagIdxReq) != TSDB_CODE_SUCCESS) {
3922
    goto _OVER;
3923
  }
3924

3925
  pDb = mndAcquireDbByStb(pMnode, tagIdxReq.dbFName);
3926
  if (pDb == NULL) {
3927
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
3928
    goto _OVER;
3929
  }
3930

3931
  pStb = mndAcquireStb(pMnode, tagIdxReq.stbName);
3932
  if (pStb == NULL) {
3933
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
3934
    goto _OVER;
3935
  }
3936
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pDb) != 0) {
3937
    goto _OVER;
3938
  }
3939

3940
  code = mndAddIndex(pMnode, pReq, &tagIdxReq, pDb, pStb);
3941
  if (terrno == TSDB_CODE_MND_TAG_INDEX_ALREADY_EXIST || terrno == TSDB_CODE_MND_TAG_NOT_EXIST) {
3942
    return terrno;
3943
  } else {
3944
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
3945
  }
3946
_OVER:
3947
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3948
    mError("stb:%s, failed to create index since %s", tagIdxReq.stbName, terrstr());
3949
  }
3950
  mndReleaseStb(pMnode, pStb);
3951
  mndReleaseDb(pMnode, pDb);
3952
  return code;
3953
}
3954
static int32_t mndProcessDropIndexReq(SRpcMsg *pReq) {
3955
  SMnode          *pMnode = pReq->info.node;
3956
  int32_t          code = -1;
3957
  SDbObj          *pDb = NULL;
3958
  SStbObj         *pStb = NULL;
3959
  SDropTagIndexReq dropReq = {0};
3960
  if (tDeserializeSDropTagIdxReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
3961
    terrno = TSDB_CODE_INVALID_MSG;
3962
    goto _OVER;
3963
  }
3964
  //
3965
  return TSDB_CODE_SUCCESS;
3966
_OVER:
3967
  return code;
3968
}*/
3969

3970
static int32_t mndProcessDropStbReqFromMNode(SRpcMsg *pReq) {
89✔
3971
  int32_t code = mndProcessDropStbReq(pReq);
89✔
3972
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
89!
3973
    pReq->info.rsp = rpcMallocCont(1);
×
3974
    pReq->info.rspLen = 1;
×
3975
    pReq->info.noResp = false;
×
3976
    pReq->code = code;
×
3977
  }
3978
  return code;
89✔
3979
}
3980

3981
typedef struct SVDropTbVgReqs {
3982
  SArray     *pBatchReqs;
3983
  SVgroupInfo info;
3984
} SVDropTbVgReqs;
3985

3986
typedef struct SMDropTbDbInfo {
3987
  SArray *dbVgInfos;
3988
  int32_t hashPrefix;
3989
  int32_t hashSuffix;
3990
  int32_t hashMethod;
3991
} SMDropTbDbInfo;
3992

3993
typedef struct SMDropTbTsmaInfo {
3994
  char           tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
3995
  char           tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
3996
  int32_t        suid;
3997
  SMDropTbDbInfo dbInfo;  // reference to DbInfo in pDbMap
3998
} SMDropTbTsmaInfo;
3999

4000
typedef struct SMDropTbTsmaInfos {
4001
  SArray *pTsmaInfos;  // SMDropTbTsmaInfo
4002
} SMDropTbTsmaInfos;
4003

4004
typedef struct SMndDropTbsWithTsmaCtx {
4005
  SHashObj *pVgMap;  // <vgId, SVDropTbVgReqs>
4006
} SMndDropTbsWithTsmaCtx;
4007

4008
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId);
4009

4010
static void destroySVDropTbBatchReqs(void *p);
4011
static void mndDestroyDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx *p) {
30✔
4012
  if (!p) return;
30!
4013

4014
  if (p->pVgMap) {
30!
4015
    void *pIter = taosHashIterate(p->pVgMap, NULL);
30✔
4016
    while (pIter) {
60✔
4017
      SVDropTbVgReqs *pReqs = pIter;
30✔
4018
      taosArrayDestroyEx(pReqs->pBatchReqs, destroySVDropTbBatchReqs);
30✔
4019
      pIter = taosHashIterate(p->pVgMap, pIter);
30✔
4020
    }
4021
    taosHashCleanup(p->pVgMap);
30✔
4022
  }
4023
  taosMemoryFree(p);
30!
4024
}
4025

4026
static int32_t mndInitDropTbsWithTsmaCtx(SMndDropTbsWithTsmaCtx **ppCtx) {
30✔
4027
  int32_t                 code = 0;
30✔
4028
  SMndDropTbsWithTsmaCtx *pCtx = taosMemoryCalloc(1, sizeof(SMndDropTbsWithTsmaCtx));
30!
4029
  if (!pCtx) return terrno;
30!
4030

4031
  pCtx->pVgMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
30✔
4032
  if (!pCtx->pVgMap) {
30!
4033
    code = terrno;
×
4034
    goto _end;
×
4035
  }
4036

4037
  *ppCtx = pCtx;
30✔
4038
_end:
30✔
4039
  if (code) mndDestroyDropTbsWithTsmaCtx(pCtx);
30!
4040
  return code;
30✔
4041
}
4042

4043
static void *mndBuildVDropTbsReq(SMnode *pMnode, const SVgroupInfo *pVgInfo, const SVDropTbBatchReq *pReq,
80✔
4044
                                 int32_t *len) {
4045
  int32_t   contLen = 0;
80✔
4046
  int32_t   ret = 0;
80✔
4047
  SMsgHead *pHead = NULL;
80✔
4048
  SEncoder  encoder = {0};
80✔
4049

4050
  tEncodeSize(tEncodeSVDropTbBatchReq, pReq, contLen, ret);
80!
4051
  if (ret < 0) return NULL;
80!
4052

4053
  contLen += sizeof(SMsgHead);
80✔
4054
  pHead = taosMemoryMalloc(contLen);
80!
4055
  if (pHead == NULL) {
80!
4056
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
4057
    return NULL;
×
4058
  }
4059

4060
  pHead->contLen = htonl(contLen);
80✔
4061
  pHead->vgId = htonl(pVgInfo->vgId);
80✔
4062

4063
  void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
80✔
4064

4065
  tEncoderInit(&encoder, pBuf, contLen - sizeof(SMsgHead));
80✔
4066
  int32_t code = tEncodeSVDropTbBatchReq(&encoder, pReq);
80✔
4067
  tEncoderClear(&encoder);
80✔
4068
  if (code != 0) return NULL;
80!
4069

4070
  *len = contLen;
80✔
4071
  return pHead;
80✔
4072
}
4073

4074
static int32_t mndSetDropTbsRedoActions(SMnode *pMnode, STrans *pTrans, const SVDropTbVgReqs *pVgReqs, void *pCont,
80✔
4075
                                        int32_t contLen, tmsg_t msgType) {
4076
  STransAction action = {0};
80✔
4077
  action.epSet = pVgReqs->info.epSet;
80✔
4078
  action.pCont = pCont;
80✔
4079
  action.contLen = contLen;
80✔
4080
  action.msgType = msgType;
80✔
4081
  action.acceptableCode = TSDB_CODE_TDB_TABLE_NOT_EXIST;
80✔
4082
  return mndTransAppendRedoAction(pTrans, &action);
80✔
4083
}
4084

4085
static int32_t mndBuildDropTbRedoActions(SMnode *pMnode, STrans *pTrans, SHashObj *pVgMap, tmsg_t msgType) {
20✔
4086
  int32_t code = 0;
20✔
4087
  void   *pIter = taosHashIterate(pVgMap, NULL);
20✔
4088
  while (pIter) {
40✔
4089
    const SVDropTbVgReqs *pVgReqs = pIter;
20✔
4090
    int32_t               len = 0;
20✔
4091
    for (int32_t i = 0; i < taosArrayGetSize(pVgReqs->pBatchReqs) && code == TSDB_CODE_SUCCESS; ++i) {
100!
4092
      SVDropTbBatchReq *pBatchReq = taosArrayGet(pVgReqs->pBatchReqs, i);
80✔
4093
      void             *p = mndBuildVDropTbsReq(pMnode, &pVgReqs->info, pBatchReq, &len);
80✔
4094
      if (!p) {
80!
4095
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4096
        if (terrno != 0) code = terrno;
×
4097
        break;
×
4098
      }
4099
      if ((code = mndSetDropTbsRedoActions(pMnode, pTrans, pVgReqs, p, len, msgType)) != 0) {
80!
4100
        break;
×
4101
      }
4102
    }
4103
    if (TSDB_CODE_SUCCESS != code) {
20!
4104
      taosHashCancelIterate(pVgMap, pIter);
×
4105
      break;
×
4106
    }
4107
    pIter = taosHashIterate(pVgMap, pIter);
20✔
4108
  }
4109
  return code;
20✔
4110
}
4111

4112
static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx *pCtx) {
30✔
4113
  int32_t code = 0;
30✔
4114
  SMnode *pMnode = pRsp->info.node;
30✔
4115
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
30✔
4116
  mndTransSetChangeless(pTrans);
30✔
4117
  mndTransSetSerial(pTrans);
30✔
4118
  if (pTrans == NULL) {
30!
4119
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
4120
    if (terrno != 0) code = terrno;
×
4121
    goto _OVER;
×
4122
  }
4123

4124
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
30✔
4125

4126
  if ((code = mndBuildDropTbRedoActions(pMnode, pTrans, pCtx->pVgMap, TDMT_VND_DROP_TABLE)) != 0) goto _OVER;
20!
4127
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) goto _OVER;
20!
4128

4129
_OVER:
20✔
4130
  mndTransDrop(pTrans);
30✔
4131
  TAOS_RETURN(code);
30✔
4132
}
4133

4134
static int32_t mndProcessDropTbWithTsma(SRpcMsg *pReq) {
×
4135
  int32_t      code = -1;
×
4136
  SMnode      *pMnode = pReq->info.node;
×
4137
  SDbObj      *pDb = NULL;
×
4138
  SStbObj     *pStb = NULL;
×
4139
  SMDropTbsReq dropReq = {0};
×
4140
  bool         locked = false;
×
4141
  if (tDeserializeSMDropTbsReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
×
4142
    code = TSDB_CODE_INVALID_MSG;
×
4143
    goto _OVER;
×
4144
  }
4145

4146
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
×
4147
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
×
4148
  if (code) goto _OVER;
×
4149
  for (int32_t i = 0; i < dropReq.pVgReqs->size; ++i) {
×
4150
    SMDropTbReqsOnSingleVg *pReq = taosArrayGet(dropReq.pVgReqs, i);
×
4151
    code = mndDropTbForSingleVg(pMnode, pCtx, pReq->pTbs, pReq->vgInfo.vgId);
×
4152
    if (code) goto _OVER;
×
4153
  }
4154
  code = mndCreateDropTbsTxnPrepare(pReq, pCtx);
×
4155
  if (code == 0) {
×
4156
    code = TSDB_CODE_ACTION_IN_PROGRESS;
×
4157
  }
4158
_OVER:
×
4159
  tFreeSMDropTbsReq(&dropReq);
×
4160
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
×
4161
  TAOS_RETURN(code);
×
4162
}
4163

4164
static int32_t createDropTbBatchReq(const SVDropTbReq *pReq, SVDropTbBatchReq *pBatchReq) {
124✔
4165
  pBatchReq->nReqs = 1;
124✔
4166
  pBatchReq->pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbReq));
124✔
4167
  if (!pBatchReq->pArray) return terrno;
124!
4168
  if (taosArrayPush(pBatchReq->pArray, pReq) == NULL) {
248!
4169
    taosArrayDestroy(pBatchReq->pArray);
×
4170
    pBatchReq->pArray = NULL;
×
4171
    return terrno;
×
4172
  }
4173
  return TSDB_CODE_SUCCESS;
124✔
4174
}
4175

4176
static void destroySVDropTbBatchReqs(void *p) {
124✔
4177
  SVDropTbBatchReq *pReq = p;
124✔
4178
  taosArrayDestroy(pReq->pArray);
124✔
4179
  pReq->pArray = NULL;
124✔
4180
}
124✔
4181

4182
static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupInfo *pVgInfo, char *name, tb_uid_t suid,
124✔
4183
                            bool ignoreNotExists) {
4184
  SVDropTbReq req = {.name = name, .suid = suid, .igNotExists = ignoreNotExists, .uid = 0};
124✔
4185

4186
  SVDropTbVgReqs *pVgReqs = taosHashGet(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
124✔
4187
  SVDropTbVgReqs  vgReqs = {0};
124✔
4188
  if (pVgReqs == NULL) {
124✔
4189
    vgReqs.info = *pVgInfo;
30✔
4190
    vgReqs.pBatchReqs = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVDropTbBatchReq));
30✔
4191
    if (!vgReqs.pBatchReqs) return terrno;
30!
4192
    SVDropTbBatchReq batchReq = {0};
30✔
4193
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
30✔
4194
    if (TSDB_CODE_SUCCESS != code) return code;
30!
4195
    if (taosArrayPush(vgReqs.pBatchReqs, &batchReq) == NULL) {
60!
4196
      taosArrayDestroy(batchReq.pArray);
×
4197
      return terrno;
×
4198
    }
4199
    if (taosHashPut(pVgHashMap, &pVgInfo->vgId, sizeof(pVgInfo->vgId), &vgReqs, sizeof(vgReqs)) != 0) {
30!
4200
      taosArrayDestroyEx(vgReqs.pBatchReqs, destroySVDropTbBatchReqs);
×
4201
      return terrno;
×
4202
    }
4203
  } else {
4204
    SVDropTbBatchReq batchReq = {0};
94✔
4205
    int32_t          code = createDropTbBatchReq(&req, &batchReq);
94✔
4206
    if (TSDB_CODE_SUCCESS != code) return code;
94!
4207
    if (taosArrayPush(pVgReqs->pBatchReqs, &batchReq) == NULL) {
188!
4208
      taosArrayDestroy(batchReq.pArray);
×
4209
      return terrno;
×
4210
    }
4211
  }
4212
  return 0;
124✔
4213
}
4214

4215
static int32_t mndDropTbForSingleVg(SMnode *pMnode, SMndDropTbsWithTsmaCtx *pCtx, SArray *pTbs, int32_t vgId) {
30✔
4216
  int32_t code = 0;
30✔
4217

4218
  SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
30✔
4219
  if (!pVgObj) {
30!
4220
    code = 0;
×
4221
    goto _end;
×
4222
  }
4223
  SVgroupInfo vgInfo = {.hashBegin = pVgObj->hashBegin,
30✔
4224
                        .hashEnd = pVgObj->hashEnd,
30✔
4225
                        .numOfTable = pVgObj->numOfTables,
30✔
4226
                        .vgId = pVgObj->vgId};
30✔
4227
  vgInfo.epSet = mndGetVgroupEpset(pMnode, pVgObj);
30✔
4228
  mndReleaseVgroup(pMnode, pVgObj);
30✔
4229

4230
  for (int32_t i = 0; i < pTbs->size; ++i) {
154✔
4231
    SVDropTbReq *pTb = taosArrayGet(pTbs, i);
124✔
4232
    TAOS_CHECK_GOTO(mndDropTbAdd(pMnode, pCtx->pVgMap, &vgInfo, pTb->name, pTb->suid, pTb->igNotExists), NULL, _end);
124!
4233
  }
4234
_end:
30✔
4235
  return code;
30✔
4236
}
4237

4238
static int32_t mndProcessFetchTtlExpiredTbs(SRpcMsg *pRsp) {
20,603✔
4239
  int32_t                 code = -1;
20,603✔
4240
  SDecoder                decoder = {0};
20,603✔
4241
  SMnode                 *pMnode = pRsp->info.node;
20,603✔
4242
  SVFetchTtlExpiredTbsRsp rsp = {0};
20,603✔
4243
  SMndDropTbsWithTsmaCtx *pCtx = NULL;
20,603✔
4244
  if (pRsp->code != TSDB_CODE_SUCCESS) {
20,603✔
4245
    code = pRsp->code;
518✔
4246
    goto _end;
518✔
4247
  }
4248
  if (pRsp->contLen == 0) {
20,085✔
4249
    code = 0;
20,055✔
4250
    goto _end;
20,055✔
4251
  }
4252

4253
  tDecoderInit(&decoder, pRsp->pCont, pRsp->contLen);
30✔
4254
  code = tDecodeVFetchTtlExpiredTbsRsp(&decoder, &rsp);
30✔
4255
  if (code) goto _end;
30!
4256

4257
  code = mndInitDropTbsWithTsmaCtx(&pCtx);
30✔
4258
  if (code) goto _end;
30!
4259

4260
  code = mndDropTbForSingleVg(pMnode, pCtx, rsp.pExpiredTbs, rsp.vgId);
30✔
4261
  if (code) goto _end;
30!
4262
  code = mndCreateDropTbsTxnPrepare(pRsp, pCtx);
30✔
4263
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
30✔
4264
_end:
10✔
4265
  if (pCtx) mndDestroyDropTbsWithTsmaCtx(pCtx);
20,603✔
4266
  tDecoderClear(&decoder);
20,603✔
4267
  tFreeFetchTtlExpiredTbsRsp(&rsp);
20,603✔
4268
  TAOS_RETURN(code);
20,603✔
4269
}
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